@mentra/engine 3.2.1-dev.274 → 3.2.1-dev.277

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.
@@ -1 +1 @@
1
- {"version":3,"file":"LocalMiniappRuntime.js","sourceRoot":"","sources":["../../src/services/LocalMiniappRuntime.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * LocalMiniappRuntime\n *\n * Singleton service that bridges local miniapps (running in WebViews) with\n * phone capabilities: display, audio, storage, sensors, LED, etc.\n *\n * Each miniapp communicates via the @mentra/miniapp envelope protocol.\n * This runtime handles request dispatch, stream fan-out, and lifecycle\n * management (connect/disconnect/ping).\n */\n\nimport {parsePhotoCompression} from \"@mentra/cloud-protocol/photo-compression\"\nimport {acquireGlassesHotspot} from \"./GlassesHotspotLease\"\nimport {AppState, Linking} from \"react-native\"\nimport Share from \"react-native-share\"\nimport * as Battery from \"expo-battery\"\nimport * as Clipboard from \"expo-clipboard\"\nimport {File, Paths} from \"expo-file-system\"\nimport * as Location from \"expo-location\"\nimport BluetoothSdk, {type RgbLedAction, type RgbLedColor} from \"@mentra/bluetooth-sdk\"\n\nimport {\n MiniappErrorCode,\n MiniappRequestType,\n MiniappResponseType,\n MiniappStreamType,\n CLOUD_STATUS_STREAM,\n parseEnvelope,\n serializeEnvelope,\n} from \"@mentra/miniapp\"\nimport type {MiniappEnvelope} from \"@mentra/miniapp\"\n\nimport {DeviceTypes, getModelCapabilities} from \"../types\"\nimport {storage as mmkvStorage} from \"../utils/storage/storage\"\nimport {BgTimer} from \"../utils/timers\"\nimport devServerBridge from \"./DevServerBridge\"\nimport {islandNotifications} from \"./NotificationsEmitter\"\nimport {isGlassesConnected, isGlassesReady, waitForGlassesReady} from \"./GlassesReadiness\"\nimport {toMiniappConnectionData} from \"./GlassesStatusProjection\"\nimport audioPlaybackService from \"./AudioPlaybackService\"\nimport {phoneLocationService} from \"./PhoneLocationService\"\nimport {useGlassesStore} from \"../stores/glasses\"\nimport {useSettingsStore} from \"../stores/settings\"\nimport localDisplayManager from \"./LocalDisplayManager\"\nimport type {DisplayPayload} from \"./LocalDisplayManager\"\nimport headingService from \"./HeadingService\"\nimport localSttFallbackCoordinator from \"./LocalSttFallbackCoordinator\"\nimport micStateCoordinator from \"./MicStateCoordinator\"\nimport {BlobStore} from \"./BlobStore\"\nimport {CloudAudioSubscriptionSync} from \"./CloudAudioSubscriptionSync\"\nimport {phoneCameraFovCoordinator} from \"./PhoneCameraFovCoordinator\"\nimport {phonePhotoCoordinator} from \"./PhonePhotoCoordinator\"\nimport {phoneStreamCoordinator} from \"./PhoneStreamCoordinator\"\nimport {phoneVideoCoordinator} from \"./PhoneVideoCoordinator\"\nimport {runSentenceTtsPipeline} from \"./SentenceTtsPipeline\"\nimport {summarizeTranscriptionRoutes, transcriptionDeliveryRoute} from \"./TranscriptionRouting\"\nimport {prepareTtsSentences} from \"./TtsTextSanitizer\"\nimport {handleWifiAdbRequest} from \"./WifiAdbRequest\"\nimport {cloudClientService} from \"./CloudClientService\"\nimport {miniappLauncher} from \"./MiniappLauncher\"\nimport {\n ISLAND_SETTINGS_KEYS,\n type CameraFovPreset,\n type CameraFovRequest,\n type CameraRoiPosition,\n type CloudClientStatusSnapshot,\n type InteropAuditEvent,\n type MiniappAuthToken,\n type TtsSynthesisResult,\n} from \"../runtime/config\"\nimport {getAnalytics, getMiniappConfiguration, getUiSeams, isFeatureEnabled} from \"../runtime/bootstrap\"\nimport {invokeScanQrSeam} from \"../runtime/scanQrSeam\"\nimport {\n normalizeStreamAudioConfig,\n normalizeStreamVideoConfig,\n normalizeCaptureAudio,\n resolveCaptureAudio,\n} from \"../runtime/streamConfig\"\nimport {toLanguageHint} from \"@mentra/cloud-protocol/languages\"\nimport type {AudioSubscription, LanguageSource, TranscriptionData, TranslationData} from \"@mentra/cloud-protocol\"\nimport {buildMiniappManifestSnapshot, type MiniappRuntimeDiagnosticSnapshot} from \"../utils/miniappDiagnostics\"\nimport ttsModelManager from \"./TTSModelManager\"\nimport {NavigationHandlers} from \"./NavigationHandlers\"\nimport type {ClientApp} from \"../types/applet\"\nimport {useAppStatusStore} from \"../stores/apps\"\nimport appRegistry, {getDevAppAttestation, getDevAppSourcePackage} from \"./AppRegistry\"\nimport {resolveForegroundLocationPermission} from \"./ForegroundLocationPermission\"\nimport {advanceMiniappPingLiveness, shouldHoldMiniappPingLiveness} from \"./MiniappLiveness\"\nimport {listPhoneCalendarEvents, PhoneCalendarError} from \"./PhoneCalendarService\"\nimport {LocalMiniappStorage} from \"./LocalMiniappStorage\"\nimport acsMeetingService, {\n parseAcsCallOrigin,\n parseAcsOutgoingVideo,\n parseAcsVideoSource,\n resolveAcsAudioSource,\n type AcsCallOrigin,\n type AcsOutgoingVideo,\n type AcsVideoSource,\n type MeetingState,\n} from \"./AcsMeetingService\"\nimport {\n createSoftapCallDeps,\n SoftapCallError,\n SoftapCallTransport,\n RETURN_DEADLINE_MS,\n SOFTAP_STEPS,\n type SoftapProgress,\n type SoftapTeardownMode,\n} from \"./SoftapCallTransport\"\nimport {awaitCleanupBarrier} from \"./SoftapCleanupBarrier\"\nimport {softapTrace, softapTraceFailure} from \"../utils/softapTrace\"\nimport {PermissionFeatures, permissions} from \"../facades/permissions\"\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface InstalledMiniappManifest {\n packageName?: string\n /** Human-facing app name (from miniapp.json `name`). Shown in the \"Starting\n * <name>…\" boot message; falls back to the package name when absent. */\n name?: string\n version?: string\n sdkVersion?: string\n minHostVersion?: string\n type?: string\n entry?: {background?: string; ui?: string}\n permissions?: Array<{type: string; required?: boolean; description?: string}>\n hardwareRequirements?: Array<{type: string; level: string; description?: string}>\n actions?: Array<{id?: unknown; description?: unknown; parameters?: unknown; outputSchema?: unknown}>\n}\n\ntype SpeakerStateValue = \"idle\" | \"loading\" | \"playing\" | \"stopped\" | \"error\"\n\ninterface ConnectedMiniapp {\n subscriptions: Set<string>\n /** Transcription streams this app explicitly requires to stay on-device. */\n forceLocalTranscriptionStreams: Set<string>\n /** Transcription streams with at least one listener using the default/cloud route. */\n cloudTranscriptionStreams: Set<string>\n sendMessage: (raw: string) => void\n lastPongAt: number\n unansweredPingRounds: number\n installedManifest?: InstalledMiniappManifest\n authRefreshTimerId: number | null\n /**\n * Backoff timer for re-attempting the INITIAL miniapp-token mint after it\n * failed (distinct from `authRefreshTimerId`, which renews an already-issued\n * token near expiry). Null when no retry is queued.\n */\n authRetryTimerId: number | null\n /**\n * True once this app has received a miniapp auth token (in CONNECT_ACK or a\n * follow-up AUTH_UPDATE). Gates the initial-mint retry loop and the\n * on-reconnect re-drive so we stop hammering once auth has landed.\n */\n authDelivered: boolean\n /** Last speaker state pushed to this app. Used to dedup SPEAKER_STATE pushes. */\n speakerState: SpeakerStateValue\n /** Live PCM output stream this app has open (speaker.createStream), if any. */\n activeSpeakerStreamId?: string\n /**\n * Location-tier rate this app is currently asking for via its\n * `location_stream` subscription, or null if it hasn't asked for\n * one. The aggregate tier handed to the host is the strictest\n * (highest-accuracy) rate across all currently connected apps —\n * see {@link LOCATION_RATE_PRIORITY}.\n */\n requestedLocationRate: string | null\n}\n\ninterface SpeechRun {\n id: string\n cancelled: boolean\n playbackRequestId?: string\n onCancelled?: () => void\n}\n\ntype TranscriptionEventSource = \"cloud\" | \"local\"\n\n/**\n * Strictness ordering for `location_stream` rate values. Higher index =\n * higher accuracy and higher power cost. The aggregate tier applied to\n * the OS is the max of every connected miniapp's requested rate;\n * miniapps that didn't ask for `location_stream` contribute nothing.\n *\n * If a miniapp passes a value we don't recognize, we treat it like the\n * weakest known rate (\"passive\") rather than blanket-overwriting an\n * active stronger request from another app.\n */\nconst LOCATION_RATE_PRIORITY = [\"off\", \"passive\", \"low\", \"high\", \"realtime\"] as const\ntype LocationRate = (typeof LOCATION_RATE_PRIORITY)[number]\nfunction locationRateRank(rate: string | null | undefined): number {\n if (!rate) return -1\n const i = LOCATION_RATE_PRIORITY.indexOf(rate as LocationRate)\n return i >= 0 ? i : LOCATION_RATE_PRIORITY.indexOf(\"passive\")\n}\n\nconst LOG_TAG = \"LOCAL_MINIAPP\"\nconst DIAGNOSTIC_MAX_LIST_ITEMS = 100\nconst DIAGNOSTIC_MAX_STRING_LENGTH = 512\n\nconst SYSTEM_MINIAPP_PACKAGE_SET = new Set([\n \"com.mentra.camera\",\n \"com.mentra.gallery\",\n \"com.mentra.settings\",\n \"com.mentra.simulated\",\n \"com.mentra.mirror\",\n \"com.mentra.ai\",\n \"cloud.augmentos.notify\",\n \"com.mentra.feedback\",\n \"com.mentra.miniappdev\",\n])\n\nfunction diagnosticStringList(values: Iterable<string>): string[] {\n return [...values]\n .map((value) => value.slice(0, DIAGNOSTIC_MAX_STRING_LENGTH))\n .sort()\n .slice(0, DIAGNOSTIC_MAX_LIST_ITEMS)\n}\n\nconst PING_INTERVAL_MS = 5_000\nconst MINIAPP_AUTH_REFRESH_HEADROOM_MS = 5 * 60 * 1000\nconst MINIAPP_AUTH_REFRESH_MIN_DELAY_MS = 5_000\n// Backoff bounds for re-minting the INITIAL miniapp token after a failed mint\n// (e.g. the cloud client had not finished its first-boot Core token exchange\n// when the miniapp connected). Exponential from base, capped, so a transient\n// not-yet-connected client self-heals within seconds instead of needing a full\n// manual Cloud V2 reconnect.\nconst MINIAPP_AUTH_RETRY_BASE_MS = 1_000\nconst MINIAPP_AUTH_RETRY_MAX_MS = 15_000\nconst FOREGROUND_LIVENESS_PROBE_TIMEOUT_MS = 2_500\n/**\n * How long a SoftAP call waits for the first frame to reach ACS before failing the join.\n *\n * Generous because it covers the glasses' whole publish path — WHIP POST, host-only ICE, and the\n * first decode — but bounded, since a call that connects and never paints has to fail as a join\n * rather than sit in \"connecting\" while the wearer waits.\n */\nconst SOFTAP_FIRST_FRAME_MS = 20_000\n/**\n * How long the BLE link must stay up before SoftAP recovery trusts it. Covers the gap between\n * the hotspot dying and the phone noticing the link died with it.\n */\nconst GLASSES_LINK_SETTLE_MS = 4_000\nconst REQUEST_WIFI_SETUP_TYPE = \"miniapp_request_wifi_setup\"\n// Unregister after this many missed pongs. Generous on purpose: a busy\n// context (heavy interim translation traffic) or OS scheduling while idle can\n// delay pongs well past one interval, and killing a healthy-but-busy script\n// drops its subscriptions (releasing the mic). With the liveness-timeout\n// respawn path wired (MentraJSRouter.start), a genuinely dead context still\n// comes back automatically — this threshold only bounds how long that takes.\nconst PING_TIMEOUT_THRESHOLD = 6 // ~30s\n\nconst TRANSCRIPT_TIMING_TELEMETRY = (globalThis as {__DEV__?: boolean}).__DEV__ === true\n\nconst RGB_LED_ACTIONS = new Set<RgbLedAction>([\"on\", \"off\"])\nconst RGB_LED_COLORS = new Set<RgbLedColor>([\"red\", \"green\", \"blue\", \"orange\", \"white\"])\nconst CAMERA_FOV_MIN = 62\nconst CAMERA_FOV_MAX = 118\nconst CAMERA_FOV_DEFAULT = 118\nconst CAMERA_FOV_PRESETS: Record<CameraFovPreset, number> = {narrow: 82, standard: 102, wide: 118}\nconst CAMERA_ROI_POSITION_BY_NAME: Record<string, CameraRoiPosition> = {center: \"center\", bottom: \"bottom\", top: \"top\"}\n\nconst localMiniappStorageBackend = {\n get(key: string): unknown | null {\n const result = mmkvStorage.load<unknown>(key)\n return result.is_ok() ? result.value : null\n },\n has(key: string): boolean {\n return mmkvStorage.load<unknown>(key).is_ok()\n },\n set(key: string, value: unknown): void {\n mmkvStorage.save(key, value)\n },\n remove(key: string): void {\n mmkvStorage.remove(key)\n },\n keys(): string[] {\n return mmkvStorage.getAllKeys()\n },\n}\n\n// =============================================================================\n// Declared-permission record helper (for CONNECT_ACK / PERMISSIONS_UPDATE)\n// =============================================================================\n\n/**\n * Map from manifest permission types (uppercase, snake-y) to the lowercase\n * canonical permission keys the SDK exposes via session.permissions. Mirrors\n * cloud SDK v3's PermissionType union.\n *\n * BACKGROUND_LOCATION + POST_NOTIFICATIONS aren't in v3's surface; they map\n * onto the same canonical keys (location / notifications) since the SDK's\n * `has()` is \"do I have *any* form of this permission declared\".\n */\nconst PERMISSION_TYPE_TO_CANONICAL: Record<string, string> = {\n MICROPHONE: \"microphone\",\n CAMERA: \"camera\",\n LOCATION: \"location\",\n BACKGROUND_LOCATION: \"location\",\n READ_NOTIFICATIONS: \"notifications\",\n POST_NOTIFICATIONS: \"notifications\",\n CALENDAR: \"calendar\",\n}\n\nfunction normalizeRgbLedAction(value: unknown): RgbLedAction {\n return typeof value === \"string\" && RGB_LED_ACTIONS.has(value as RgbLedAction) ? (value as RgbLedAction) : \"off\"\n}\n\nfunction normalizeRgbLedColor(value: unknown): RgbLedColor | null {\n return typeof value === \"string\" && RGB_LED_COLORS.has(value as RgbLedColor) ? (value as RgbLedColor) : null\n}\n\nfunction normalizeCameraFovPayload(payload: Record<string, unknown>): CameraFovRequest {\n if (typeof payload.preset === \"string\") {\n const preset = payload.preset in CAMERA_FOV_PRESETS ? (payload.preset as CameraFovPreset) : \"standard\"\n return {preset}\n }\n\n const rawFov = typeof payload.fov === \"number\" && Number.isFinite(payload.fov) ? payload.fov : CAMERA_FOV_DEFAULT\n\n return {\n fov: Math.min(CAMERA_FOV_MAX, Math.max(CAMERA_FOV_MIN, rawFov)),\n roiPosition: normalizeCameraRoiPosition(payload.roiPosition ?? payload.roi_position),\n }\n}\n\nfunction normalizeCameraRoiPosition(value: unknown): CameraRoiPosition {\n if (typeof value === \"number\" && Number.isInteger(value) && value >= 0 && value <= 2) {\n return value === 1 ? \"bottom\" : value === 2 ? \"top\" : \"center\"\n }\n\n if (typeof value === \"string\") {\n return CAMERA_ROI_POSITION_BY_NAME[value] ?? \"center\"\n }\n\n return \"center\"\n}\n\nconst ALL_CANONICAL_PERMISSIONS = [\"location\", \"microphone\", \"camera\", \"notifications\", \"calendar\"] as const\n\n/**\n * Build the {location, microphone, camera, notifications, calendar} record the\n * SDK's session.permissions module reads from. Missing types are false.\n */\nfunction computeDeclaredPermissionRecord(manifest: InstalledMiniappManifest | undefined): Record<string, boolean> {\n const record: Record<string, boolean> = {}\n for (const k of ALL_CANONICAL_PERMISSIONS) record[k] = false\n for (const perm of manifest?.permissions ?? []) {\n const canonical = PERMISSION_TYPE_TO_CANONICAL[perm.type?.toUpperCase()]\n if (canonical) record[canonical] = true\n }\n return record\n}\n\n// =============================================================================\n// PERMISSION_NOT_DECLARED warnings — per-session dedup\n// =============================================================================\n//\n// When a miniapp tries to subscribe / call something whose required permission\n// isn't declared in miniapp.json, the runtime rejects with\n// PERMISSION_NOT_DECLARED. The error reaches the SDK but most authors don't\n// subscribe to session.on(\"error\", ...), so it's silent in practice.\n//\n// To make the failure discoverable for developers running the MentraOS app\n// from source, log a clear, copy-pasteable message in the phone console that\n// names the offending permission, the offending stream/op, and the JSON\n// snippet to add to miniapp.json. Once-per-session per (packageName, permission)\n// to avoid spam from a tight retry loop.\n//\n// Production users running the App Store build of MentraOS won't see these\n// (they don't watch Metro/adb logcat). For them, the WebView console bridge\n// (#5 of the quick-fixes round) ships the structured error to the miniapp\n// itself, and the miniapp's own console.warn flows to the dev terminal.\n\nconst warnedPermission = new Set<string>() // key: `${packageName}::${permission}`\n\nfunction logPermissionNotDeclared(\n packageName: string,\n permission: string,\n context: string,\n manifestSnippet: string,\n): void {\n const key = `${packageName}::${permission}`\n if (warnedPermission.has(key)) return\n warnedPermission.add(key)\n console.warn(\n `${LOG_TAG}: ${packageName} attempted ${context}, but permission ${permission} is not declared in miniapp.json.\\n` +\n `Add this to the \"permissions\" array:\\n ${manifestSnippet}`,\n )\n}\n\n/** Reset the per-session dedup; called when a miniapp unregisters so a fresh launch warns again. */\nfunction resetPermissionWarnings(packageName: string): void {\n for (const key of warnedPermission) {\n if (key.startsWith(`${packageName}::`)) warnedPermission.delete(key)\n }\n}\n\n/**\n * One attempt to start a SoftAP call, from the first permission check to the last release.\n *\n * The unit is the attempt rather than the transport because the transport only exists for the\n * second half of it. Everything the wearer can cancel — the Nearby-devices prompt, the wait for\n * mobile data, the ACS sign-in — happens before `transport.start()`, and each of those leaves\n * something behind (a signed-in agent, a process-wide cellular pin) that only the attempt knows\n * about.\n */\ntype SoftapAttempt = {\n id: number\n packageName: string\n startedAt: number\n /** Set by leave, end, or a superseding join. Checked after every await the join performs. */\n cancelled: boolean\n /** Set only after the preceding attempt has fully settled. */\n releaseHotspot?: () => void\n ownsResources: boolean\n transport: SoftapCallTransport | null\n /** The checklist as the miniapp last saw it; preflight rows live here until `start()` takes over. */\n progress: SoftapProgress\n scopedLostUnsub: (() => void) | null\n /**\n * Mid-call media rebuild. Single-flight while [recoveryActive] is true; the promise is\n * cleared when that run settles so a later walk-away can start another. Joined to the\n * attempt barrier so a late re-arm cannot resurrect resources after Leave/End.\n */\n recovery: Promise<void> | null\n recoveryActive: boolean\n recoveryDeadlineAt: number | null\n /**\n * The join itself, settled either way. A native call still in flight owns state the teardown\n * cannot see — a `createCallAgent` mid-sign-in — so the barrier covers this as well.\n */\n body: Promise<void> | null\n /** Single-flight teardown, so a leave and the join's own failure path cannot both unwind. */\n teardown: Promise<void> | null\n /** Opens only once the attempt *and* its cleanup are finished. The next join waits on it. */\n settled: Promise<void>\n settledDone: boolean\n markSettled: () => void\n}\n\n/** How long a stalled SoftAP cleanup goes unremarked before it is logged. It is never abandoned. */\nconst SOFTAP_CLEANUP_STALL_LOG_MS = 10_000\n\n/**\n * The WHIP listener's tombstone (3s) plus a margin for the close itself.\n *\n * Sized to the grace period rather than picked round, so an expiry here means something actually\n * went wrong instead of meaning we guessed short.\n */\nconst SOFTAP_INGEST_CLOSE_WAIT_MS = 3_500\n\n/** How long the glasses get to acknowledge their hotspot off, over BLE. */\nconst SOFTAP_HOTSPOT_OFF_ACK_MS = 5_000\n\n/** After a forced close there is nothing left to wait for, so this only catches a real failure. */\nconst SOFTAP_FORCED_VERIFY_MS = 500\n\n/**\n * Rejection codes meaning the glasses replaced their Wi-Fi protocol session, not that the\n * command failed.\n *\n * The glasses emit `wifi_protocol_session_ready` on every `glasses_ready`, which fires on BLE\n * reconnects and ASG restarts — routine during a SoftAP teardown. The SDK cancels every pending\n * Wi-Fi request when that lands, so a hotspot command in flight is lost even though nothing is\n * actually wrong. `wifi_session_disconnected` is deliberately absent: that one is raised from the\n * store update where the glasses went away, so there is nothing left to re-send to.\n */\nconst HOTSPOT_SESSION_REFRESH_CODES = new Set([\"wifi_session_restarted\", \"wifi_session_changed\"])\n\n/**\n * Let the restarted ASG command path settle before re-sending.\n *\n * `handleSetHotspotState` returns false when its network manager is not up yet, which drops the\n * command silently, so an immediate re-send would just race the same initialization. Mirrors the\n * retry spacing `disableHotspotWithRetry` uses for the sibling ASG-replacement case.\n */\nconst HOTSPOT_SESSION_RETRY_DELAY_MS = 500\n\n/** Reject with [reason] if [work] has not settled in [ms]. The work itself is not cancellable. */\nfunction withTimeout<T>(work: Promise<T>, ms: number, reason: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(reason)), ms)\n work.then(\n (value) => {\n clearTimeout(timer)\n resolve(value)\n },\n (error) => {\n clearTimeout(timer)\n reject(error)\n },\n )\n })\n}\n\n/** How long the next call waits for the previous one's cleanup before telling the wearer about it. */\nconst SOFTAP_CLEANUP_NARRATE_AFTER_MS = 250\n\n// =============================================================================\n// LocalMiniappRuntime\n// =============================================================================\n\nclass LocalMiniappRuntime {\n private static instance: LocalMiniappRuntime | null = null\n\n /**\n * The SoftAP call being started or running, if any.\n *\n * An *attempt*, not a transport, because the cancellable part of a SoftAP call begins long\n * before the transport exists: a Nearby-devices prompt and an ACS sign-in run first, and a\n * wearer who taps Cancel during either of them has to be obeyed. The attempt is registered\n * before the first `await` and is what every later stage checks itself against.\n */\n private softapAttempt: SoftapAttempt | null = null\n /**\n * The outer generation. Every async callback that can outlive an attempt checks itself against\n * it and traces `softap_stale_callback` when it loses: ACS state, SoftAP progress, glasses\n * stream status, scoped-network loss, and each checkpoint through the join.\n *\n * There are inner generations below this one — `AcsMeetingSession.joinGeneration` and\n * `LocalWhipIngestSource.generation` — and they are not redundant. They fence work inside one\n * native session against itself; this one fences whole attempts against each other, and only it\n * knows that the wearer pressed Cancel before any of that native work existed.\n */\n private softapAttemptSeq = 0\n /**\n * Why the previous SoftAP call's cleanup failed, if it did.\n *\n * Read once by the next join, which refuses rather than building on leaked state: a hotspot that\n * would not turn off is precisely what makes the next call fail somewhere far less legible.\n */\n private softapCleanupError: string | null = null\n /**\n * SoftAP teardown disables the glasses hotspot from the transport and again\n * from the host barrier. Native used to throw `request_in_flight` on the\n * second call, which was recorded as a cleanup failure and refused the next\n * join. One queue so those overlapping disables wait their turn.\n */\n private glassesHotspotCommand: Promise<unknown> = Promise.resolve()\n\n /** Connected miniapps keyed by packageName. */\n private connectedApps: Map<string, ConnectedMiniapp> = new Map()\n\n /**\n * Packages that have completed their CONNECT handshake (sent\n * `miniapp_connect`, got `CONNECT_ACK`). Distinct from `connectedApps`,\n * which is populated at spawn/registration time — handshake is later.\n * Drives {@link waitForConnect}.\n */\n private handshookApps: Set<string> = new Set()\n\n /** Pending {@link waitForConnect} resolvers, keyed by packageName. */\n private connectWaiters: Map<string, Set<(err?: Error) => void>> = new Map()\n\n /** Ref-counted stream subscriptions: stream → set of packageNames. */\n private streamSubscribers: Map<string, Set<string>> = new Map()\n\n /** Host observers for the Mentra Live button-capture policy. */\n private buttonPressSubscriberListeners = new Set<(packageNames: string[]) => void>()\n\n /** Guards one-time wiring of the cloud transcript/translation fan-out. */\n private cloudResultsWired = false\n private cloudStatusWired = false\n private cloudAudioSubscriptionSync = new CloudAudioSubscriptionSync()\n\n /**\n * Per-miniapp language hints from TRANSCRIPTION_CONFIG (issue 021 WP3).\n * Bare ISO 639-1 codes, already registry-validated by the SDK and\n * re-normalized here (defense in depth). Merged (union) into the auto-mode\n * cloud transcription subscription in buildCloudAudioSubscriptions.\n */\n private transcriptionHintsByApp = new Map<string, string[]>()\n\n /** Ping interval handle. */\n private pingIntervalId: number | null = null\n private foregroundProbeTimers: Map<string, number> = new Map()\n\n /**\n * Notified when a miniapp is unregistered for missing liveness pings.\n * MentraJSRouter wires this into its crash-respawn machinery so a\n * silently-stalled background script is restarted (with crash-loop\n * protection) instead of staying dead — a dead background drops its\n * subscriptions, which releases the mic while the webview still looks\n * alive.\n */\n public onLivenessTimeout: ((packageName: string) => void) | null = null\n\n private speechRuns = new Map<string, SpeechRun>()\n\n // Browser fallback token auth — HMAC-signed blob with a phone-local\n // secret. Both issuer and verifier are the same process, so the\n // secret never leaves the device.\n private localSecret = `miniapp_${Date.now()}_${Math.random().toString(36).slice(2, 14)}`\n private usedTokens = new Set<string>()\n\n private constructor() {}\n\n /** Snapshot of miniapps actively subscribed to hardware button events. */\n public getButtonPressSubscribers(): string[] {\n return [...(this.streamSubscribers.get(MiniappStreamType.BUTTON_PRESS) ?? [])].sort()\n }\n\n /** Observe active hardware-button subscriptions. */\n public onButtonPressSubscribersChanged(listener: (packageNames: string[]) => void): () => void {\n this.buttonPressSubscriberListeners.add(listener)\n return () => this.buttonPressSubscriberListeners.delete(listener)\n }\n\n /** Report-safe live miniapp/subscription/resource snapshot. */\n public getDiagnosticSnapshot(nowMs = Date.now()): MiniappRuntimeDiagnosticSnapshot {\n const connectedApps = [...this.connectedApps.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .slice(0, DIAGNOSTIC_MAX_LIST_ITEMS)\n .map(([packageName, app]) => ({\n packageName: packageName.slice(0, DIAGNOSTIC_MAX_STRING_LENGTH),\n handshakeComplete: this.handshookApps.has(packageName),\n subscriptions: diagnosticStringList(app.subscriptions),\n lastMessageAgeMs: Math.max(0, nowMs - app.lastPongAt),\n requestedLocationRate: app.requestedLocationRate,\n hasActiveSpeakerStream: app.activeSpeakerStreamId !== undefined,\n ...(app.installedManifest\n ? {\n manifest: buildMiniappManifestSnapshot(app.installedManifest, {\n packageName,\n name: app.installedManifest.name,\n version: app.installedManifest.version,\n type: app.installedManifest.type,\n }),\n }\n : {}),\n }))\n const subscriptionsByStream = Object.fromEntries(\n [...this.streamSubscribers.entries()]\n .filter(([, packageNames]) => packageNames.size > 0)\n .sort(([a], [b]) => a.localeCompare(b))\n .slice(0, DIAGNOSTIC_MAX_LIST_ITEMS)\n .map(([stream, packageNames]) => [\n stream.slice(0, DIAGNOSTIC_MAX_STRING_LENGTH),\n diagnosticStringList(packageNames),\n ]),\n )\n\n return {\n connectedApps,\n subscriptionsByStream,\n resources: {\n display: localDisplayManager.getDiagnosticSnapshot(),\n camera: phonePhotoCoordinator.getDiagnosticSnapshot(),\n video: phoneVideoCoordinator.getDiagnosticSnapshot(),\n stream: phoneStreamCoordinator.getDiagnosticSnapshot(),\n cameraFov: phoneCameraFovCoordinator.getDiagnosticSnapshot(),\n },\n }\n }\n\n private replaceStreamSubscribers(\n packageName: string,\n previousStreams: Iterable<string>,\n nextStreams: Iterable<string>,\n ) {\n const previousButtonSubscribers = this.getButtonPressSubscribers().join(\"\\u0000\")\n\n for (const stream of previousStreams) {\n const subscribers = this.streamSubscribers.get(stream)\n if (!subscribers) continue\n subscribers.delete(packageName)\n if (subscribers.size === 0) this.streamSubscribers.delete(stream)\n }\n\n for (const stream of nextStreams) {\n let subscribers = this.streamSubscribers.get(stream)\n if (!subscribers) {\n subscribers = new Set()\n this.streamSubscribers.set(stream, subscribers)\n }\n subscribers.add(packageName)\n }\n\n const nextButtonSubscribers = this.getButtonPressSubscribers()\n if (previousButtonSubscribers !== nextButtonSubscribers.join(\"\\u0000\")) {\n for (const listener of this.buttonPressSubscriberListeners) {\n try {\n listener(nextButtonSubscribers)\n } catch (error) {\n console.warn(`${LOG_TAG}: button press subscriber listener threw:`, error)\n }\n }\n }\n }\n\n /**\n * Generate an HMAC-signed local session token for browser fallback auth.\n * Token format: base64(JSON({userId, packageName, exp})).base64(HMAC-SHA256(payload, secret))\n * Single-use, 5-minute TTL.\n */\n public generateLocalToken(userId: string, packageName: string): string {\n const payload = JSON.stringify({\n userId,\n packageName,\n exp: Date.now() + 5 * 60 * 1000, // 5 min TTL\n nonce: Math.random().toString(36).slice(2, 10),\n })\n const payloadB64 = btoa(payload)\n const sig = this.hmacSign(payload)\n return `${payloadB64}.${sig}`\n }\n\n /**\n * Validate and consume a local session token. Single-use.\n */\n public validateLocalToken(token: string): {userId: string; packageName: string} | null {\n const parts = token.split(\".\")\n if (parts.length !== 2) return null\n const [payloadB64, sig] = parts\n\n // Check single-use\n if (this.usedTokens.has(token)) return null\n\n // Verify signature\n let payload: string\n try {\n payload = atob(payloadB64!)\n } catch {\n return null\n }\n if (this.hmacSign(payload) !== sig) return null\n\n // Parse and check expiry\n let parsed: {userId: string; packageName: string; exp: number}\n try {\n parsed = JSON.parse(payload)\n } catch {\n return null\n }\n if (Date.now() > parsed.exp) return null\n\n // Mark as used\n this.usedTokens.add(token)\n // Prune old used tokens periodically (keep set from growing unbounded)\n if (this.usedTokens.size > 1000) {\n this.usedTokens.clear()\n }\n\n return {userId: parsed.userId, packageName: parsed.packageName}\n }\n\n /**\n * Simple HMAC-SHA256 using Web Crypto API (available in React Native).\n * Returns base64url-encoded signature.\n * Falls back to a simpler hash if crypto.subtle is not available.\n */\n private hmacSign(payload: string): string {\n // Synchronous HMAC using a simple hash — Web Crypto's subtle.sign is async\n // which doesn't fit cleanly here. For phone-local single-process auth,\n // a keyed hash is sufficient.\n let hash = 0\n const key = this.localSecret\n const input = key + payload + key\n for (let i = 0; i < input.length; i++) {\n const ch = input.charCodeAt(i)\n hash = ((hash << 5) - hash + ch) | 0\n }\n // Mix in more bytes for collision resistance\n let hash2 = 0x811c9dc5 // FNV offset basis\n for (let i = 0; i < input.length; i++) {\n hash2 ^= input.charCodeAt(i)\n hash2 = Math.imul(hash2, 0x01000193) // FNV prime\n }\n return btoa(String(hash >>> 0) + \".\" + String(hash2 >>> 0))\n }\n\n public static getInstance(): LocalMiniappRuntime {\n if (!LocalMiniappRuntime.instance) {\n LocalMiniappRuntime.instance = new LocalMiniappRuntime()\n }\n return LocalMiniappRuntime.instance\n }\n\n private initialized = false\n\n /**\n * Initialize the runtime. Called from MantleManager.init().\n * Idempotent — safe to call multiple times.\n */\n public initialize(): void {\n if (this.initialized) return\n this.initialized = true\n console.log(`${LOG_TAG}: initialize()`)\n this.ensurePingLoop()\n }\n\n // ===========================================================================\n // App registration\n // ===========================================================================\n\n public registerApp(\n packageName: string,\n sendFn: (raw: string) => void,\n installedManifest?: InstalledMiniappManifest,\n ): void {\n console.log(`${LOG_TAG}: registerApp(${packageName})`)\n this.clearForegroundProbe(packageName)\n // Fresh spawn → fresh handshake. Clear any prior handshake flag so\n // waitForConnect() blocks until this context's own CONNECT arrives.\n this.handshookApps.delete(packageName)\n // If the app is already registered (e.g. QR scanned again for same package),\n // tear down its old subscriptions first so streamSubscribers doesn't keep\n // dangling references. The WebView will re-subscribe after its CONNECT.\n if (this.connectedApps.has(packageName)) {\n const existing = this.connectedApps.get(packageName)!\n this.cancelSpeech(packageName)\n // A crash respawn replaces the ConnectedMiniapp without going through\n // unregisterApp(). Abort the old incarnation's native PCM player before\n // its only stream id is lost. Target the exact stream rather than using\n // stopForApp(), whose async playback cleanup could race with audio the\n // replacement app starts after it connects.\n const existingSpeakerStreamId = existing.activeSpeakerStreamId\n if (existingSpeakerStreamId) {\n existing.activeSpeakerStreamId = undefined\n void audioPlaybackService.abortStream(existingSpeakerStreamId).catch((error) => {\n console.warn(`${LOG_TAG}: failed to abort speaker stream while replacing ${packageName}`, error)\n })\n }\n if (existing.authRefreshTimerId !== null) {\n BgTimer.clearTimeout(existing.authRefreshTimerId)\n existing.authRefreshTimerId = null\n }\n if (existing.authRetryTimerId !== null) {\n BgTimer.clearTimeout(existing.authRetryTimerId)\n existing.authRetryTimerId = null\n }\n this.replaceStreamSubscribers(packageName, existing.subscriptions, [])\n this.recomputeMicRequirements()\n this.updateCloudSubscriptions()\n // Managed streams and ACS meetings deliberately survive a respawn: the new\n // incarnation re-adopts them on restore (Mentra Call does exactly this) so a\n // WebView reload does not drop the wearer out of a live call. An unmanaged\n // stream cannot be re-adopted — startUnmanaged rejects while any stream is\n // active, even for the same owner — so release it or the respawned miniapp\n // is stuck behind STREAM_ALREADY_ACTIVE until the process restarts.\n const streamSnapshot = phoneStreamCoordinator.getDiagnosticSnapshot()\n if (\n streamSnapshot.active === true &&\n streamSnapshot.kind === \"unmanaged\" &&\n streamSnapshot.ownerPackageName === packageName\n ) {\n void phoneStreamCoordinator.stop(packageName).catch((error) => {\n console.warn(`${LOG_TAG}: failed to stop unmanaged stream while replacing ${packageName}`, error)\n })\n }\n }\n this.connectedApps.set(packageName, {\n subscriptions: new Set(),\n forceLocalTranscriptionStreams: new Set(),\n cloudTranscriptionStreams: new Set(),\n sendMessage: sendFn,\n lastPongAt: Date.now(),\n unansweredPingRounds: 0,\n installedManifest,\n authRefreshTimerId: null,\n authRetryTimerId: null,\n authDelivered: false,\n speakerState: \"idle\",\n requestedLocationRate: null,\n })\n // If we just clobbered an existing entry, its requestedLocationRate is\n // now gone — recompute so the aggregate doesn't include a stale rate.\n // The WebView will re-SUBSCRIBE shortly and the rate will reappear.\n this.recomputeLocationTier()\n this.ensureCloudStatusWired()\n this.ensurePingLoop()\n\n // Show the system boot message (\"Starting <name>…\") on the glasses for the\n // bounded boot window, mirroring the cloud DisplayManager boot screen. The\n // window ends early once this app pushes its first display (see\n // LocalDisplayManager.request), or after ~1.5s. Fires once per spawn —\n // including a crash-respawn, since each spawn is a fresh \"app is starting\".\n localDisplayManager.onMount(packageName, installedManifest?.name ?? packageName)\n }\n\n /**\n * Resolve once `packageName` has completed its CONNECT handshake. If it has\n * already connected, resolves immediately. Rejects if the timeout elapses\n * first, or if the app is unregistered while waiting.\n *\n * Used by the launcher's `ensureConnected` (and thus the action broker) so a\n * just-spawned target is known to be live before anything is delivered to it.\n */\n public waitForConnect(packageName: string, timeoutMs: number): Promise<void> {\n if (this.handshookApps.has(packageName)) return Promise.resolve()\n return new Promise<void>((resolve, reject) => {\n let settled = false\n const waiter = (err?: Error) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n this.connectWaiters.get(packageName)?.delete(waiter)\n if (err) reject(err)\n else resolve()\n }\n const timer = setTimeout(() => {\n waiter(new Error(`waitForConnect: ${packageName} did not connect within ${timeoutMs}ms`))\n }, timeoutMs)\n let set = this.connectWaiters.get(packageName)\n if (!set) {\n set = new Set()\n this.connectWaiters.set(packageName, set)\n }\n set.add(waiter)\n })\n }\n\n /** Resolve/reject all pending {@link waitForConnect} waiters for a package. */\n private flushConnectWaiters(packageName: string, err?: Error): void {\n const waiters = this.connectWaiters.get(packageName)\n if (!waiters) return\n this.connectWaiters.delete(packageName)\n for (const w of waiters) w(err)\n }\n\n /**\n * Invalidate the CONNECT handshake for a package whose native context is\n * being replaced WITHOUT going through register/unregister — i.e. a crash\n * respawn. Without this, {@link waitForConnect} would treat the dead/\n * not-yet-initialized context as connected and deliver to it. Pending waiters\n * are failed so a wake mid-respawn retries rather than hanging.\n */\n public resetHandshake(packageName: string): void {\n this.handshookApps.delete(packageName)\n this.flushConnectWaiters(packageName, new Error(`${packageName} respawning`))\n }\n\n /**\n * Attach (or update) the installedManifest for an already-registered app.\n * Used when the manifest is fetched asynchronously (dev miniapps) after the\n * miniapp has already CONNECTed — preserves existing subscriptions.\n */\n public setInstalledManifest(packageName: string, installedManifest: InstalledMiniappManifest): void {\n const app = this.connectedApps.get(packageName)\n if (!app) return\n app.installedManifest = installedManifest\n\n // Push declared-permission record to the SDK so session.permissions stays\n // in sync. Sent regardless of CONNECT_ACK timing — covers the dev-miniapp\n // case where the manifest is fetched async after the miniapp CONNECTs.\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.PERMISSIONS_UPDATE,\n permissions: computeDeclaredPermissionRecord(installedManifest),\n })\n }\n\n /**\n * Graceful version of {@link unregisterApp}: notify the miniapp via\n * `WILL_DISCONNECT`, wait ~50ms so its `beforeDisconnect` handlers can\n * fire one last `sendOneShot` (e.g. `display.clear()`), then run the\n * normal teardown. Use this for any disconnect path where the socket\n * is still open. For ungraceful paths (transport already closed),\n * call {@link unregisterApp} directly — the heads-up would be\n * undeliverable anyway.\n */\n public async gracefullyUnregisterApp(packageName: string, reason = \"unregistering\"): Promise<void> {\n const app = this.connectedApps.get(packageName)\n if (!app) return\n\n console.log(`${LOG_TAG}: gracefullyUnregisterApp(${packageName}) — sending WILL_DISCONNECT`)\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.WILL_DISCONNECT,\n reason,\n })\n // 50 ms: imperceptible to the user, plenty of time for the SDK's\n // synchronous `beforeDisconnect` handlers to flush a final\n // sendOneShot through the still-open transport.\n await new Promise<void>((resolve) => setTimeout(resolve, 50))\n this.unregisterApp(packageName)\n }\n\n public unregisterApp(packageName: string): void {\n console.log(`${LOG_TAG}: unregisterApp(${packageName})`)\n const releasedMicGateOverride = micStateCoordinator.clearMiniappGateOverrides(packageName)\n this.clearForegroundProbe(packageName)\n this.clearMiniappAuthRefresh(packageName)\n this.clearMiniappAuthDeliveryRetry(packageName)\n // Drop the handshake flag and fail any in-flight waitForConnect() callers\n // (e.g. a wake that's mid-handshake when the app is torn down). Done before\n // the early-return so it runs even if the connectedApps entry is already gone.\n this.handshookApps.delete(packageName)\n this.flushConnectWaiters(packageName, new Error(`${packageName} unregistered before connect`))\n // Drop this app's transcription hints; the cloud subscription rebuild\n // below (via replaceStreamSubscribers) re-derives the hint union without it.\n this.transcriptionHintsByApp.delete(packageName)\n\n // Warm-up is a request-owned camera lease. Cancel it even if the app record was already\n // removed so a close racing the camera-open promise cannot leave the sensor running.\n // Close all camera consumers before restoring FOV. A shared publisher may\n // remain active for another subscriber; a rejected FOV release then stops\n // renewing the departed owner's lease and ASG restores it once idle.\n const cameraCleanup = Promise.allSettled([\n this.leaveMeetingForApp(packageName),\n phonePhotoCoordinator.stopWarmUpForApp(packageName),\n phoneStreamCoordinator.stop(packageName),\n phoneVideoCoordinator.stopForApp(packageName),\n ]).then((results) => {\n for (const result of results) {\n if (result.status === \"rejected\") {\n console.warn(`${LOG_TAG}: failed to stop miniapp resource for ${packageName} on unregister`, result.reason)\n }\n }\n })\n void phoneCameraFovCoordinator.releaseForApp(packageName, cameraCleanup).catch((error) => {\n console.warn(`${LOG_TAG}: failed to release camera FOV override for ${packageName} on unregister`, error)\n })\n const app = this.connectedApps.get(packageName)\n if (!app) {\n if (releasedMicGateOverride) {\n void micStateCoordinator.syncEffectiveGatePolicy(this.getConfiguredMicGates()).catch((error) => {\n console.warn(`${LOG_TAG}: failed to restore mic gate policy for ${packageName}`, error)\n })\n }\n return\n }\n\n // Remove from all stream subscriber sets\n this.replaceStreamSubscribers(packageName, app.subscriptions, [])\n\n // Reset per-session warning dedup so a relaunch surfaces issues again.\n resetPermissionWarnings(packageName)\n\n // Cancel lookahead/in-flight synthesis before stopping the current file so\n // an interrupted sentence cannot advance and reclaim playback.\n this.cancelSpeech(packageName)\n\n // Stop audio for this app\n audioPlaybackService.stopForApp(packageName)\n\n // Tear down this app's blob state: abort in-flight uploads + close readers\n // so a crashed/closed miniapp doesn't leak partial files or file handles.\n this.blobStore.onAppGone(packageName)\n\n // Detach the per-app nav event forwarder but leave the native nav session\n // running. The user may have just closed the mini-app UI and will reopen\n // it; stopping the session here would kill an active trip mid-route.\n // Navigation is only stopped when the mini-app explicitly calls\n // navigation.stop() or when the trip arrives/errors naturally.\n // (See NavigationHandlers — activeNavApps stays populated so a reconnect\n // can reattach listeners and resume.)\n this.navigationHandlers.onDisconnect(packageName)\n\n // Recompute heading subscription — if this app was the last subscriber,\n // the sensor will stop.\n this.recomputeHeadingSubscription()\n // Same for the IMU/accelerometer stream.\n this.recomputeImuSubscription()\n\n // Drop this app's location-tier request before recomputing so the\n // aggregate falls back down if it was the strictest. Done before\n // `connectedApps.delete` below so it doesn't matter that the iter\n // in `recomputeLocationTier` is over connectedApps — clearing the\n // field is enough.\n app.requestedLocationRate = null\n this.recomputeLocationTier()\n\n // Release any display real estate this app held — if it owned the\n // current on-glasses frame, this clears the glasses (or restores the\n // core app's saved frame).\n localDisplayManager.onUnmount(packageName)\n\n this.connectedApps.delete(packageName)\n this.recomputeMicRequirements()\n if (releasedMicGateOverride) {\n void micStateCoordinator.syncEffectiveGatePolicy(this.getConfiguredMicGates()).catch((error) => {\n console.warn(`${LOG_TAG}: failed to restore mic gate policy for ${packageName}`, error)\n })\n }\n this.updateCloudSubscriptions()\n\n if (this.connectedApps.size === 0) {\n this.stopPingLoop()\n }\n }\n\n // ===========================================================================\n // Inbound message handling\n // ===========================================================================\n\n public handleRawMessage(packageName: string, raw: string): void {\n const envelope = parseEnvelope(raw)\n if (!envelope) {\n // Not a miniapp envelope — ignore (could be legacy bridge message)\n return\n }\n\n const payload = envelope.payload as Record<string, unknown>\n const requestType = payload.type as string | undefined\n const requestId = envelope.requestId\n\n if (!requestType) {\n console.warn(`${LOG_TAG}: Envelope from ${packageName} missing payload.type`)\n return\n }\n\n // ANY inbound message proves the context is alive — a busy background\n // script streaming DISPLAY/storage traffic shouldn't be killed by the\n // liveness watchdog just because its PONG replies queue behind real work.\n this.handlePong(packageName)\n\n // Console-tap forwarding. The miniapp's console.log/warn/etc is wrapped\n // (via injected shim from miniappGlobals.ts) to post a `dev_log`\n // envelope. We fan out to two destinations:\n // 1. DevServerBridge — forwards to the laptop's `mentra-miniapp dev`\n // terminal. No-op when there's no sidecar (installed miniapps).\n // 2. React Native console — surfaces the log in Metro / Xcode console\n // / adb logcat so installed-miniapp errors are still inspectable\n // when there's no laptop to forward to.\n if (requestType === \"dev_log\") {\n const level = (payload.level as string | undefined) ?? \"log\"\n const args = Array.isArray(payload.args) ? (payload.args as unknown[]) : []\n const timestamp = (payload.timestamp as number | undefined) ?? Date.now()\n // Source is \"ui\" because the single-bundle WebView console-tap\n // shim in miniappGlobals.ts is the only thing that posts\n // `dev_log`; the two-layer path uses a separate envelope\n // (`{type:\"log\", source}`) routed by MentraUIRouter.\n devServerBridge.forwardLog(packageName, level, args, timestamp, \"ui\")\n\n const tag = `[MINIAPP ${packageName}]`\n const fn = (console as unknown as Record<string, (...a: unknown[]) => void>)[level] ?? console.log\n try {\n fn(tag, ...args)\n } catch {\n console.log(tag, ...args)\n }\n return\n }\n\n // Dispatch\n switch (requestType) {\n case MiniappRequestType.CONNECT:\n void this.handleConnect(packageName, payload, requestId)\n break\n case MiniappRequestType.AUTH_REFRESH:\n void this.handleAuthRefresh(packageName, payload, requestId)\n break\n case MiniappRequestType.SUBSCRIBE:\n this.handleSubscribe(packageName, payload, requestId)\n break\n case MiniappRequestType.DISPLAY:\n this.handleDisplay(packageName, payload, requestId)\n break\n case MiniappRequestType.RENDER:\n this.handleRender(packageName, payload, requestId)\n break\n case MiniappRequestType.PLAY_AUDIO:\n this.handlePlayAudio(packageName, payload, requestId)\n break\n case MiniappRequestType.STOP_AUDIO:\n this.handleStopAudio(packageName, payload, requestId)\n break\n case MiniappRequestType.SPEAK:\n this.handleSpeak(packageName, payload, requestId)\n break\n case MiniappRequestType.SPEAKER_STREAM_OPEN:\n void this.handleSpeakerStreamOpen(packageName, payload, requestId)\n break\n case MiniappRequestType.SPEAKER_STREAM_WRITE:\n void this.handleSpeakerStreamWrite(packageName, payload, requestId)\n break\n case MiniappRequestType.SPEAKER_STREAM_CLOSE:\n void this.handleSpeakerStreamClose(packageName, payload, requestId)\n break\n case MiniappRequestType.SPEAKER_STREAM_ABORT:\n void this.handleSpeakerStreamAbort(packageName, payload, requestId)\n break\n case MiniappRequestType.RGB_LED:\n void this.handleRgbLed(packageName, payload, requestId)\n break\n case MiniappRequestType.LOCATION_POLL:\n this.handleLocationPoll(packageName, requestId)\n break\n case MiniappRequestType.CALENDAR_LIST_EVENTS:\n void this.handleCalendarListEvents(packageName, payload, requestId)\n break\n case MiniappRequestType.NAVIGATION_START:\n this.navigationHandlers.handleStart(packageName, payload, requestId)\n break\n case MiniappRequestType.NAVIGATION_STOP:\n this.navigationHandlers.handleStop(packageName, requestId)\n break\n case MiniappRequestType.NAVIGATION_DEVIATE:\n this.navigationHandlers.handleDeviate(packageName, payload, requestId)\n break\n case MiniappRequestType.NAVIGATION_SET_WRONG_SIDEWALK:\n this.navigationHandlers.handleSetWrongSidewalk(packageName, payload, requestId)\n break\n case MiniappRequestType.NAVIGATION_SET_SKIP_CROSSINGS:\n this.navigationHandlers.handleSetSkipCrossings(packageName, payload, requestId)\n break\n case MiniappRequestType.NAVIGATION_GET_STATE:\n this.navigationHandlers.handleGetState(packageName, requestId)\n break\n case MiniappRequestType.NAVIGATION_COMPUTE_ROUTE:\n this.navigationHandlers.handleComputeRoute(packageName, payload, requestId)\n break\n case MiniappRequestType.NAVIGATION_REVERSE_GEOCODE:\n this.navigationHandlers.handleReverseGeocode(packageName, payload, requestId)\n break\n case MiniappRequestType.NAVIGATION_PLACE_AUTOCOMPLETE:\n this.navigationHandlers.handlePlaceAutocomplete(packageName, payload, requestId)\n break\n case MiniappRequestType.NAVIGATION_PLACE_DETAILS:\n this.navigationHandlers.handlePlaceDetails(packageName, payload, requestId)\n break\n case MiniappRequestType.NAVIGATION_REQUEST_PERMISSION:\n this.navigationHandlers.handleRequestPermission(packageName, requestId)\n break\n case MiniappRequestType.STORAGE_GET:\n this.handleStorageGet(packageName, payload, requestId)\n break\n case MiniappRequestType.STORAGE_SET:\n this.handleStorageSet(packageName, payload, requestId)\n break\n case MiniappRequestType.STORAGE_DELETE:\n this.handleStorageDelete(packageName, payload, requestId)\n break\n case MiniappRequestType.STORAGE_LIST:\n this.handleStorageList(packageName, payload, requestId)\n break\n case MiniappRequestType.STORAGE_CLEAR:\n this.handleStorageClear(packageName, requestId)\n break\n case MiniappRequestType.STORAGE_HAS:\n this.handleStorageHas(packageName, payload, requestId)\n break\n case MiniappRequestType.STORAGE_GET_ALL:\n this.handleStorageGetAll(packageName, requestId)\n break\n case MiniappRequestType.STORAGE_SET_MULTIPLE:\n this.handleStorageSetMultiple(packageName, payload, requestId)\n break\n case MiniappRequestType.STORAGE_FLUSH:\n // No-op today — MMKV writes through synchronously. Reserved so\n // a future debounced backend can honor \"flush before I quit\"\n // calls without breaking the API.\n this.sendResult(packageName, requestId, true)\n break\n case MiniappRequestType.CAMERA_FOV:\n void this.handleCameraFov(packageName, payload, requestId)\n break\n case MiniappRequestType.SET_WIFI_ADB_STATE:\n void this.handleSetWifiAdbState(packageName, payload, requestId)\n break\n case MiniappRequestType.IMU_SET_ENABLED:\n this.handleImuSetEnabled(packageName, payload, requestId)\n break\n case MiniappRequestType.MIC_SET_VAD_ENABLED:\n void this.handleMicSetVadEnabled(packageName, payload, requestId)\n break\n case MiniappRequestType.MIC_SET_LOUDNESS_GATE_ENABLED:\n void this.handleMicSetLoudnessGateEnabled(packageName, payload, requestId)\n break\n case MiniappRequestType.PING:\n // SDK should handle this itself; reply PONG just in case\n this.sendToMiniapp(packageName, {type: MiniappResponseType.PONG}, requestId)\n break\n case MiniappResponseType.PONG: {\n // Liveness already touched above for every inbound message; the\n // PONG carries no other action.\n break\n }\n\n case MiniappRequestType.SHARE:\n this.handleShare(packageName, payload, requestId)\n break\n case MiniappRequestType.OPEN_URL:\n this.handleOpenUrl(packageName, payload)\n break\n case MiniappRequestType.COPY_CLIPBOARD:\n this.handleCopyClipboard(packageName, payload, requestId)\n break\n case MiniappRequestType.DOWNLOAD:\n this.handleDownload(packageName, payload, requestId)\n break\n case MiniappRequestType.SCAN_QR:\n void this.handleScanQr(packageName, payload, requestId)\n break\n\n // Persistent binary blob storage (session.blob)\n case MiniappRequestType.BLOB_CREATE:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleCreate(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_WRITE:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleWrite(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_COMMIT:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleCommit(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_ABORT:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleAbort(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_SET_FROM_URL:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleSetFromUrl(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_IMPORT:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleImport(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_GET:\n this.enqueueBlobRequest(packageName, requestId, () => this.blobStore.handleGet(packageName, payload, requestId))\n break\n case MiniappRequestType.BLOB_LIST:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleList(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_USAGE:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleUsage(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_DELETE:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleDelete(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_CLEAR:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleClear(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_OPEN_READ:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleOpenRead(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_READ:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleRead(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_CLOSE_READ:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleCloseRead(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_SHARE:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleShare(packageName, payload, requestId),\n )\n break\n\n // Cloud-coordinated features\n case MiniappRequestType.PHOTO:\n void this.handlePhoto(packageName, payload, requestId)\n break\n case MiniappRequestType.CAMERA_WARM_UP:\n void this.handleCameraWarmUp(packageName, payload, requestId)\n break\n case MiniappRequestType.VIDEO_RECORDING_START:\n void this.handleVideoRecordingStart(packageName, payload, requestId)\n break\n case MiniappRequestType.VIDEO_RECORDING_STOP:\n void this.handleVideoRecordingStop(packageName, payload, requestId)\n break\n case MiniappRequestType.STREAM_START:\n void this.handleStreamStart(packageName, payload, requestId)\n break\n case MiniappRequestType.STREAM_STOP:\n void this.handleStreamStop(packageName, payload, requestId)\n break\n case MiniappRequestType.MANAGED_STREAM_START:\n void this.handleManagedStreamStart(packageName, payload, requestId)\n break\n case MiniappRequestType.MANAGED_STREAM_STOP:\n void this.handleManagedStreamStop(packageName, payload, requestId)\n break\n case MiniappRequestType.MEETING_JOIN:\n void this.handleMeetingJoin(packageName, payload, requestId)\n break\n case MiniappRequestType.MEETING_LEAVE:\n void this.handleMeetingLeave(packageName, requestId)\n break\n case MiniappRequestType.MEETING_END:\n void this.handleMeetingEnd(packageName, requestId)\n break\n case MiniappRequestType.MEETING_SET_MUTED:\n void this.handleMeetingSetMuted(packageName, payload, requestId)\n break\n case MiniappRequestType.MEETING_UPDATE_VIDEO_SOURCE:\n void this.handleMeetingUpdateVideoSource(packageName, payload, requestId)\n break\n case MiniappRequestType.MEETING_GET_STATE:\n void this.handleMeetingGetState(packageName, requestId)\n break\n case REQUEST_WIFI_SETUP_TYPE:\n void this.handleRequestWifiSetup(packageName, payload, requestId)\n break\n\n // Inter-miniapp interop (SYSTEM apps only)\n case MiniappRequestType.MINIAPPS_LIST:\n this.handleMiniappsList(packageName, payload, requestId)\n break\n case MiniappRequestType.MINIAPPS_START:\n void this.handleMiniappsStart(packageName, payload, requestId)\n break\n case MiniappRequestType.MINIAPPS_STOP:\n void this.handleMiniappsStop(packageName, payload, requestId)\n break\n case MiniappRequestType.ACTION_INVOKE:\n void this.handleActionInvoke(packageName, payload, requestId)\n break\n case MiniappRequestType.ACTION_RESULT:\n this.handleActionResult(packageName, payload)\n break\n\n // Deferred in v1\n case MiniappRequestType.DASHBOARD_CONTENT_UPDATE:\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_IMPLEMENTED,\n message: \"Dashboard API is deferred in v1\",\n })\n break\n\n case MiniappRequestType.TRANSCRIPTION_CONFIG:\n this.handleTranscriptionConfig(packageName, payload, requestId)\n break\n\n default:\n // NACK instead of silent drop (issue 021 S3): an SDK that sends a\n // request this runtime doesn't implement must get a rejected promise,\n // not a permanently-pending silent gap. One-shots (no requestId) can\n // only be logged.\n console.warn(`${LOG_TAG}: Unknown request type from ${packageName}: ${requestType}`)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_IMPLEMENTED,\n message: `Unknown or unimplemented request type: ${requestType}`,\n })\n break\n }\n }\n\n // ===========================================================================\n // Request handlers\n // ===========================================================================\n\n private async handleConnect(\n packageName: string,\n _payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n console.log(`${LOG_TAG}: CONNECT from ${packageName}`)\n\n // Register if not already\n const existing = this.connectedApps.get(packageName)\n if (!existing) {\n console.warn(`${LOG_TAG}: CONNECT from unregistered app ${packageName}, dropping — isolate already torn down`)\n return\n }\n\n // Update lastPongAt so it doesn't time out right away\n existing.lastPongAt = Date.now()\n existing.unansweredPingRounds = 0\n\n // Read current glasses capabilities from the settings store\n const defaultWearable = useSettingsStore.getState().getSetting(ISLAND_SETTINGS_KEYS.defaultWearable) as\n | DeviceTypes\n | undefined\n const capabilities = getModelCapabilities(defaultWearable || DeviceTypes.NONE)\n\n // Build the declared-permission record for the SDK's session.permissions\n // module. Lower-cased to match v3's PermissionType union (microphone,\n // camera, location, notifications, calendar). Missing permissions default\n // to false; this is manifest-declaration tracking only — OS-grant state\n // is intentionally not modeled here.\n const declaredPermissions = computeDeclaredPermissionRecord(existing.installedManifest)\n // Fresh handshake → clear any auth state from a prior context so a stale\n // retry timer can't fire against this new connection and so the retry loop\n // below re-arms from scratch.\n existing.authDelivered = false\n this.clearMiniappAuthDeliveryRetry(packageName)\n const authPromise = this.requestMiniappAuth(packageName)\n\n // Send CONNECT_ACK in this turn, before any await. A 1.5s auth wait let a\n // concurrent unregister (dev respawn, tray stop, glasses-not-ready teardown)\n // drop the ACK; Mentra Call then dies with CONNECT_ACK timeout even though\n // CONNECT landed. Auth still arrives on AUTH_UPDATE.\n this.sendToMiniapp(\n packageName,\n {\n type: MiniappResponseType.CONNECT_ACK,\n userId: \"\",\n packageName,\n capabilities,\n permissions: declaredPermissions,\n configuration: getMiniappConfiguration(packageName),\n hostFeatures: {captureAudio: true},\n },\n requestId,\n )\n this.deliverInitialMiniappAuth(packageName, authPromise, 0)\n this.sendCloudStatusToMiniapp(packageName)\n\n // Handshake complete — unblock any launcher.waitForConnect() callers.\n this.handshookApps.add(packageName)\n this.flushConnectWaiters(packageName)\n }\n\n private async requestMiniappAuth(packageName: string, opts?: {minTtlMs?: number}): Promise<MiniappAuthToken | null> {\n // Core owns miniapp-backend token minting. A Runtime-only deployment has\n // no such capability, so fail once instead of entering the retry loop.\n if (!cloudClientService.hasCore()) return null\n const authPackageName = getDevAppSourcePackage(packageName) ?? packageName\n const devAttestation = getDevAppAttestation(packageName) ?? undefined\n return cloudClientService.getMiniappAuthToken(authPackageName, {\n ...opts,\n ...(devAttestation ? {devAttestation} : {}),\n })\n }\n\n private async handleAuthRefresh(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const auth = await this.refreshMiniappAuth(packageName, this.authRefreshOptions(payload))\n if (!auth) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_CONNECTED,\n message: \"Miniapp auth is not configured\",\n })\n return\n }\n this.sendResult(packageName, requestId, true, {auth})\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: (err as Error)?.message ?? \"Miniapp auth refresh failed\",\n })\n }\n }\n\n private async refreshMiniappAuth(packageName: string, opts?: {minTtlMs?: number}): Promise<MiniappAuthToken | null> {\n const auth = await this.requestMiniappAuth(packageName, opts)\n if (!auth) return null\n this.scheduleMiniappAuthRefresh(packageName, auth)\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.AUTH_UPDATE,\n auth,\n })\n return auth\n }\n\n private authRefreshOptions(payload: Record<string, unknown>): {minTtlMs?: number} | undefined {\n const minTtlMs = Number(payload.minTtlMs)\n if (!Number.isFinite(minTtlMs) || minTtlMs <= 0) return undefined\n return {minTtlMs}\n }\n\n private scheduleMiniappAuthRefresh(packageName: string, auth: MiniappAuthToken): void {\n const app = this.connectedApps.get(packageName)\n if (!app) return\n this.clearMiniappAuthRefresh(packageName)\n\n const refreshAt = auth.expiresAt - MINIAPP_AUTH_REFRESH_HEADROOM_MS\n const delay = Math.max(MINIAPP_AUTH_REFRESH_MIN_DELAY_MS, refreshAt - Date.now())\n app.authRefreshTimerId = BgTimer.setTimeout(() => {\n const current = this.connectedApps.get(packageName)\n if (!current) return\n current.authRefreshTimerId = null\n void this.refreshMiniappAuth(packageName).catch((err) => {\n console.warn(`${LOG_TAG}: miniapp auth refresh failed for ${packageName}: ${(err as Error)?.message ?? err}`)\n })\n }, delay)\n }\n\n private clearMiniappAuthRefresh(packageName: string): void {\n const app = this.connectedApps.get(packageName)\n if (!app || app.authRefreshTimerId === null) return\n const timerId = app.authRefreshTimerId\n BgTimer.clearTimeout(timerId)\n app.authRefreshTimerId = null\n }\n\n /**\n * Deliver the miniapp's FIRST auth token, retrying until it lands. Called from\n * {@link handleConnect} when the initial mint didn't resolve in the CONNECT_ACK\n * window. `inFlight` lets attempt 0 reuse the mint the handshake already\n * started (avoids a redundant duplicate request); later attempts mint fresh.\n *\n * A `null` result means auth is fundamentally unavailable (no miniappAuth hook)\n * — permanent, so we do NOT retry. A REJECTION means a transient failure\n * (typically the cloud client isn't connection-ready yet) — retry with backoff.\n * Either way we bail if the app has since disconnected or already got a token\n * (e.g. via {@link redriveMiniappAuthDelivery} on cloud-connect).\n */\n private deliverInitialMiniappAuth(\n packageName: string,\n inFlight: Promise<MiniappAuthToken | null> | undefined,\n attempt: number,\n ): void {\n const app = this.connectedApps.get(packageName)\n if (!app || app.authDelivered) return\n const mint = inFlight ?? this.requestMiniappAuth(packageName)\n void mint\n .then((auth) => {\n const current = this.connectedApps.get(packageName)\n if (!current || current.authDelivered) return\n if (!auth) return // no auth hook — permanent, don't spin\n current.authDelivered = true\n this.clearMiniappAuthDeliveryRetry(packageName)\n this.scheduleMiniappAuthRefresh(packageName, auth)\n this.sendToMiniapp(packageName, {type: MiniappResponseType.AUTH_UPDATE, auth})\n })\n .catch((err) => {\n console.warn(\n `${LOG_TAG}: miniapp auth mint failed for ${packageName} (attempt ${attempt}): ${\n (err as Error)?.message ?? err\n }`,\n )\n this.scheduleInitialMiniappAuthRetry(packageName, attempt)\n })\n }\n\n private scheduleInitialMiniappAuthRetry(packageName: string, attempt: number): void {\n const app = this.connectedApps.get(packageName)\n if (!app || app.authDelivered) return\n this.clearMiniappAuthDeliveryRetry(packageName)\n const delay = Math.min(MINIAPP_AUTH_RETRY_MAX_MS, MINIAPP_AUTH_RETRY_BASE_MS * 2 ** attempt)\n app.authRetryTimerId = BgTimer.setTimeout(() => {\n const current = this.connectedApps.get(packageName)\n if (!current) return\n current.authRetryTimerId = null\n this.deliverInitialMiniappAuth(packageName, undefined, attempt + 1)\n }, delay)\n }\n\n private clearMiniappAuthDeliveryRetry(packageName: string): void {\n const app = this.connectedApps.get(packageName)\n if (!app || app.authRetryTimerId === null) return\n BgTimer.clearTimeout(app.authRetryTimerId)\n app.authRetryTimerId = null\n }\n\n /**\n * When the cloud client (re)connects, immediately re-attempt the initial mint\n * for any handshook app still missing its token, instead of waiting out the\n * backoff. This is what turns \"scan a dev app before the cloud is ready\" from\n * \"dead until you manually reconnect Cloud V2\" into \"authenticates on its own\n * the instant the connection comes up\".\n */\n private redriveMiniappAuthDelivery(): void {\n for (const [packageName, app] of this.connectedApps) {\n if (app.authDelivered) continue\n // Only apps that finished their CONNECT handshake are in the mint-retry\n // state; skip anything still mid-handshake (handleConnect owns that).\n if (!this.handshookApps.has(packageName)) continue\n this.clearMiniappAuthDeliveryRetry(packageName)\n this.deliverInitialMiniappAuth(packageName, undefined, 0)\n }\n }\n\n /**\n * TRANSCRIPTION_CONFIG (issue 021 WP3): store the miniapp's language hints\n * and rebuild the cloud subscription set so the auto-mode subscription\n * carries them. Replies with a REQUEST_RESULT so the SDK's configure()\n * promise settles: unknown hint values are an error, not a silent drop.\n */\n private handleTranscriptionConfig(packageName: string, payload: Record<string, unknown>, requestId?: string): void {\n const app = this.connectedApps.get(packageName)\n if (!app) return\n\n const config = (payload.config ?? {}) as Record<string, unknown>\n const rawHints = config.languageHints\n if (rawHints !== undefined && !Array.isArray(rawHints)) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"languageHints must be an array of language codes\",\n })\n return\n }\n\n if (rawHints === undefined || rawHints.length === 0) {\n this.transcriptionHintsByApp.delete(packageName)\n } else {\n // Defense in depth: the SDK already validated, but the wire is untyped.\n const hints: string[] = []\n const invalid: string[] = []\n for (const raw of rawHints as unknown[]) {\n const hint = typeof raw === \"string\" ? toLanguageHint(raw) : null\n if (hint) hints.push(hint)\n else invalid.push(String(raw))\n }\n if (invalid.length > 0) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: `Unknown language hint(s): ${invalid.join(\", \")}`,\n })\n return\n }\n this.transcriptionHintsByApp.set(packageName, [...new Set(hints)].sort())\n }\n\n this.updateCloudSubscriptions()\n this.sendResult(packageName, requestId, true, {applied: true})\n }\n\n private handleSubscribe(packageName: string, payload: Record<string, unknown>, requestId?: string): void {\n const app = this.connectedApps.get(packageName)\n if (!app) return\n\n const rawStreams = (payload.subscriptions ?? payload.streams) as\n | (string | {stream: string; rate?: string; forceLocal?: boolean; includeCloud?: boolean})[]\n | undefined\n // Normalize: objects like {stream: \"location_stream\", rate: \"realtime\"} → extract stream name\n // \"location_stream\" is the rate-bearing alias for \"location_update\".\n // The strictest rate wins when multiple `location_stream` entries appear\n // in one SUBSCRIBE — the same rule we apply across apps.\n let requestedLocationRate: string | null = null\n const forceLocalTranscriptionStreams = new Set<string>()\n const cloudTranscriptionStreams = new Set<string>()\n const streams = rawStreams?.map((s) => {\n if (typeof s === \"object\" && s !== null) {\n if (s.stream === \"location_stream\") {\n if (s.rate && locationRateRank(s.rate) > locationRateRank(requestedLocationRate)) {\n requestedLocationRate = s.rate\n }\n return \"location_update\"\n }\n if (s.forceLocal === true && s.stream.startsWith(\"transcription:\")) {\n forceLocalTranscriptionStreams.add(s.stream)\n }\n if (s.stream.startsWith(\"transcription:\") && (s.forceLocal !== true || s.includeCloud === true)) {\n cloudTranscriptionStreams.add(s.stream)\n }\n return s.stream\n }\n if (s.startsWith(\"transcription:\")) cloudTranscriptionStreams.add(s)\n return s\n }) as string[] | undefined\n if (!Array.isArray(streams)) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"subscribe requires a subscriptions array\",\n })\n return\n }\n\n for (const subscription of rawStreams ?? []) {\n const stream = typeof subscription === \"string\" ? subscription : subscription.stream\n if (stream.startsWith(\"translation:\") && !isFeatureEnabled(\"cloudSpeech\")) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_IMPLEMENTED,\n message: \"Cloud speech is disabled by this deployment\",\n })\n return\n }\n if (!stream.startsWith(\"transcription:\")) continue\n const forceLocal = typeof subscription === \"object\" && subscription.forceLocal === true\n const includeCloud = typeof subscription === \"object\" && subscription.includeCloud === true\n if (forceLocal && !isFeatureEnabled(\"onDeviceSpeech\")) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_IMPLEMENTED,\n message: \"On-device speech is disabled by this deployment\",\n })\n return\n }\n if ((!forceLocal || includeCloud) && !isFeatureEnabled(\"cloudSpeech\")) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_IMPLEMENTED,\n message: \"Cloud speech is disabled by this deployment\",\n })\n return\n }\n }\n\n console.log(`${LOG_TAG}: SUBSCRIBE from ${packageName}: [${streams.join(\", \")}]`)\n\n // Gate each stream on the permission type its data requires. The manifest\n // must declare the permission (miniapp.json -> permissions) or we reject\n // the whole subscribe with PERMISSION_NOT_DECLARED.\n const declaredTypes = new Set((app.installedManifest?.permissions ?? []).map((p) => p.type?.toUpperCase()))\n\n const permissionForStream = (s: string): string | null => {\n if (s === \"audio_chunk\" || s === \"vad\") return \"MICROPHONE\"\n if (s.startsWith(\"transcription\") || s.startsWith(\"translation\")) return \"MICROPHONE\"\n if (s === \"location_update\") return \"LOCATION\"\n if (s === \"phone_notification\") return \"READ_NOTIFICATIONS\"\n if (s === \"phone_notification_dismissed\") return \"READ_NOTIFICATIONS\"\n return null\n }\n\n for (const stream of streams) {\n const required = permissionForStream(stream)\n if (required && !declaredTypes.has(required)) {\n logPermissionNotDeclared(packageName, required, `to subscribe to \"${stream}\"`, `{\"type\": \"${required}\"}`)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: `${required} permission not declared in miniapp.json (required for \"${stream}\"). Add {\"type\": \"${required}\"} to the \"permissions\" array.`,\n // Extra context fields read by the SDK so authors that subscribe\n // to session.on(\"error\") can format their own messages.\n permission: required,\n subscription: stream,\n })\n return\n }\n }\n\n // Add new subscriptions\n const previousSubscriptions = app.subscriptions\n app.subscriptions = new Set(streams)\n app.forceLocalTranscriptionStreams = new Set(\n [...forceLocalTranscriptionStreams].filter((stream) => app.subscriptions.has(stream)),\n )\n app.cloudTranscriptionStreams = new Set(\n [...cloudTranscriptionStreams].filter((stream) => app.subscriptions.has(stream)),\n )\n this.replaceStreamSubscribers(packageName, previousSubscriptions, app.subscriptions)\n\n this.recomputeMicRequirements()\n this.updateCloudSubscriptions()\n this.recomputeHeadingSubscription()\n this.recomputeImuSubscription()\n // Persist this app's requested rate (or clear it if SUBSCRIBE didn't\n // include `location_stream` this time), then ask the host for the\n // strictest rate across all connected apps.\n app.requestedLocationRate = requestedLocationRate\n this.recomputeLocationTier()\n this.sendResult(packageName, requestId, true)\n\n // Fire initial snapshot values for stateful streams so miniapps don't have\n // to wait for the first change event.\n this.emitInitialSnapshots(packageName, streams)\n }\n\n private async handleCalendarListEvents(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const app = this.connectedApps.get(packageName)\n const declared = app?.installedManifest?.permissions?.some(\n (permission) => permission.type?.toUpperCase() === \"CALENDAR\",\n )\n if (!declared) {\n logPermissionNotDeclared(packageName, \"CALENDAR\", \"to list calendar events\", '{\"type\": \"CALENDAR\"}')\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: 'CALENDAR permission not declared in miniapp.json. Add {\"type\": \"CALENDAR\"} to the permissions array.',\n permission: \"CALENDAR\",\n })\n return\n }\n\n try {\n const result = await listPhoneCalendarEvents(payload)\n this.sendResult(packageName, requestId, true, result)\n } catch (error) {\n const known = error instanceof PhoneCalendarError\n this.sendResult(packageName, requestId, false, undefined, {\n code: known ? error.code : MiniappErrorCode.INTERNAL,\n message: error instanceof Error ? error.message : \"Failed to read phone calendar events\",\n })\n }\n }\n\n /**\n * For state-bearing streams (battery, connection), deliver the current value\n * immediately on subscribe. Other streams (button press, transcription, etc.)\n * are pure event streams with no \"current value\" to snapshot.\n */\n private emitInitialSnapshots(packageName: string, streams: string[]): void {\n // Read the engine glasses store directly (was a host glassesStatus hook).\n const gs = useGlassesStore.getState()\n const glassesState = {\n connected: isGlassesConnected(gs.connection),\n deviceModel: gs.deviceModel,\n batteryLevel: gs.batteryLevel,\n charging: gs.charging,\n }\n const isSimulated = (glassesState.deviceModel || \"\").toLowerCase().includes(\"simulated\")\n\n for (const stream of streams) {\n if (stream === \"glasses_battery\") {\n // Simulated glasses have no real battery; mirror the phone's battery\n // so miniapps see a sensible value during development.\n if (isSimulated) {\n void this.emitPhoneBatteryAs(packageName, \"glasses_battery\")\n } else if (typeof glassesState.batteryLevel === \"number\" && glassesState.batteryLevel >= 0) {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: \"glasses_battery\",\n data: {\n level: glassesState.batteryLevel,\n charging: !!glassesState.charging,\n timestamp: Date.now(),\n },\n })\n }\n } else if (stream === \"phone_battery\") {\n void this.emitPhoneBatteryAs(packageName, \"phone_battery\")\n } else if (stream === \"glasses_connection\") {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: \"glasses_connection\",\n data: {\n connected: glassesState.connected,\n modelName: glassesState.deviceModel || undefined,\n },\n })\n } else if (stream === \"glasses_wifi\") {\n // Snapshot the current glasses Wi-Fi state on subscribe (like battery).\n // Read the canonical nested `wifi: {state, ssid}` from the STORE state\n // (`glassesState` is the narrowed 4-field projection and has no `wifi`;\n // the pre-engine host hook spread the full store, so read gs directly —\n // NOT the legacy flat wifiConnected). Effective connectivity requires the\n // glasses connected AND on Wi-Fi — mirrors the host's store-derived\n // forward, so an already-disconnected device reports `connected: false`\n // rather than silently emitting nothing. Always emits so onWifi gets an\n // initial value.\n const wifi = gs.wifi.state === \"connected\" ? gs.wifi : null\n const connected = glassesState.connected === true && wifi !== null\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: \"glasses_wifi\",\n data: {\n connected,\n linkConnected: glassesState.connected === true,\n ssid: connected ? wifi?.ssid : undefined,\n localIp: connected ? wifi?.localIp : undefined,\n timestamp: Date.now(),\n },\n })\n } else if (stream === \"head_position\") {\n // The glasses store has no headUp field (same on the pre-engine host\n // hook), so this stays a no-emit until head state lands in the store.\n const headUp = (gs as {headUp?: boolean}).headUp\n if (typeof headUp === \"boolean\") {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: \"head_position\",\n data: {\n position: headUp ? \"up\" : \"down\",\n timestamp: Date.now(),\n },\n })\n }\n }\n }\n }\n\n /**\n * Read the phone's battery state right now and emit it as the given stream.\n * Used for both phone_battery snapshot on subscribe, and as a stand-in for\n * glasses_battery when connected to Simulated Glasses.\n */\n private async emitPhoneBatteryAs(\n packageName: string,\n streamType: \"phone_battery\" | \"glasses_battery\",\n ): Promise<void> {\n try {\n const level = await Battery.getBatteryLevelAsync()\n const state = await Battery.getBatteryStateAsync()\n const charging = state === Battery.BatteryState.CHARGING || state === Battery.BatteryState.FULL\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType,\n data: {\n level: Math.round(level * 100),\n charging,\n timestamp: Date.now(),\n },\n })\n } catch (err) {\n console.log(`${LOG_TAG}: phone battery snapshot failed`, err)\n }\n }\n\n private handleDisplay(packageName: string, payload: Record<string, unknown>, requestId?: string): void {\n try {\n // Zombie-frame gate: a dying miniapp's last in-flight frame can arrive\n // AFTER onUnmount cleared its display — repainting a dead app's UI (and\n // poisoning the next boot's pre-boot restore snapshot). Killed mid-route\n // nav reproduced this reliably; its 3s re-push raced the teardown.\n if (!this.connectedApps.has(packageName)) {\n console.log(`${LOG_TAG}: dropping display from unmounted app ${packageName}`)\n return\n }\n if (!payload.layout || typeof payload.layout !== \"object\") {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"display request missing layout object\",\n })\n return\n }\n\n // Hand off to LocalDisplayManager — it owns boot/throttle/arbitration/\n // expiry + the native BluetoothSdk.displayEvent call + useDisplayStore.\n localDisplayManager.request(packageName, {\n view: (payload.view as DisplayPayload[\"view\"]) ?? \"main\",\n layout: payload.layout as DisplayPayload[\"layout\"],\n durationMs: payload.durationMs as number | undefined,\n })\n\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n console.error(`${LOG_TAG}: display error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Display error\",\n })\n }\n }\n\n /**\n * Scene render (session.display.render()). Same arbitration as DISPLAY, but\n * the payload is a whole frame of positioned elements and the caller may be\n * awaiting the outcome: LocalDisplayManager guarantees the resolver fires\n * exactly once (displayed/blocked, with degraded/dropped reporting), and that\n * becomes the REQUEST_RESULT data.\n */\n private handleRender(packageName: string, payload: Record<string, unknown>, requestId?: string): void {\n try {\n // Zombie-frame gate — see handleDisplay.\n if (!this.connectedApps.has(packageName)) {\n this.sendResult(packageName, requestId, true, {status: \"blocked\", reason: \"app stopped\"})\n return\n }\n if (!Array.isArray(payload.elements)) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"render request missing elements array\",\n })\n return\n }\n\n localDisplayManager.request(\n packageName,\n {\n view: (payload.view as DisplayPayload[\"view\"]) ?? \"main\",\n scene: payload.elements as DisplayPayload[\"scene\"],\n durationMs: payload.durationMs as number | undefined,\n },\n (result) => this.sendResult(packageName, requestId, true, result),\n )\n } catch (err) {\n console.error(`${LOG_TAG}: render error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Render error\",\n })\n }\n }\n\n private handlePlayAudio(packageName: string, payload: Record<string, unknown>, requestId?: string): void {\n const audioUrl = (payload.audioUrl ?? payload.url) as string | undefined\n if (!audioUrl) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"play_audio requires an audioUrl\",\n })\n return\n }\n\n const audioRequestId = requestId || `local_${Date.now()}`\n const volume = typeof payload.volume === \"number\" ? payload.volume : 1.0\n const stopOtherAudio = payload.stopOtherAudio !== false\n\n this.cancelSpeech(packageName)\n this.setSpeakerState(packageName, \"loading\")\n audioPlaybackService.play(\n {requestId: audioRequestId, audioUrl, appId: packageName, volume, stopOtherAudio},\n (_respId, success, error, duration) => {\n if (success) {\n this.setSpeakerState(packageName, \"stopped\", {durationMs: duration ?? undefined})\n } else {\n this.setSpeakerState(packageName, \"error\", {\n errorCode: MiniappErrorCode.INTERNAL,\n errorMessage: error ?? \"play failed\",\n durationMs: duration ?? undefined,\n })\n }\n this.sendResult(\n packageName,\n requestId,\n success,\n {duration},\n error\n ? {\n code: MiniappErrorCode.INTERNAL,\n message: error,\n }\n : undefined,\n )\n },\n )\n // Optimistic \"started playing\" transition. The audio service doesn't\n // have a \"playback actually started\" callback today; cloud SDK v3 has\n // the same constraint and uses optimistic timing. Microtask so the\n // initial \"loading\" envelope flushes first.\n queueMicrotask(() => this.setSpeakerState(packageName, \"playing\"))\n }\n\n private handleStopAudio(packageName: string, _payload: Record<string, unknown>, requestId?: string): void {\n this.cancelSpeech(packageName)\n audioPlaybackService.stopForApp(packageName)\n this.setSpeakerState(packageName, \"stopped\")\n this.sendResult(packageName, requestId, true)\n }\n\n // ── speaker.createStream (live PCM output) ────────────────────────────────\n\n /** Valid PCM sample rates for speaker streams. Mirrors the SDK contract. */\n private static readonly SPEAKER_STREAM_SAMPLE_RATES = new Set([16000, 24000, 48000])\n private static readonly SPEAKER_STREAM_MAX_BASE64_CHARS = Math.ceil((256 * 1024) / 3) * 4\n private speakerStreamCounter = 0\n\n private async handleSpeakerStreamOpen(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const app = this.connectedApps.get(packageName)\n if (!app) return\n\n // One stream per miniapp: opening a second closes the first.\n const previous = app.activeSpeakerStreamId\n if (previous) {\n app.activeSpeakerStreamId = undefined\n await audioPlaybackService.abortStream(previous).catch((error) => {\n console.warn(`${LOG_TAG}: failed to abort previous speaker stream for ${packageName}`, error)\n })\n }\n\n const sampleRate = typeof payload.sampleRate === \"number\" ? payload.sampleRate : 16000\n if (!LocalMiniappRuntime.SPEAKER_STREAM_SAMPLE_RATES.has(sampleRate)) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: `unsupported sampleRate ${sampleRate} (use 16000, 24000, or 48000)`,\n })\n return\n }\n const channels = typeof payload.channels === \"number\" ? payload.channels : 1\n if (channels !== 1) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: \"speaker streams currently support mono PCM only\",\n })\n return\n }\n const volume = typeof payload.volume === \"number\" ? payload.volume : 1\n if (!Number.isFinite(volume) || volume < 0 || volume > 1) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: \"speaker stream volume must be between 0 and 1\",\n })\n return\n }\n\n const streamId = `spkstream_${Date.now()}_${++this.speakerStreamCounter}`\n this.setSpeakerState(packageName, \"loading\")\n try {\n await audioPlaybackService.openStream({\n streamId,\n appId: packageName,\n sampleRate,\n channels,\n volume,\n stopOtherAudio: payload.stopOtherAudio !== false,\n onEnded: (endedId, success, error, durationMs) => {\n const current = this.connectedApps.get(packageName)\n // Ignore completion from an app incarnation replaced by a crash\n // respawn. Its abort may finish after the new app has registered and\n // must not overwrite that app's speaker state.\n if (current !== app) return\n if (current.activeSpeakerStreamId === endedId) current.activeSpeakerStreamId = undefined\n if (success) {\n this.setSpeakerState(packageName, \"stopped\", {durationMs: durationMs ?? undefined})\n } else {\n this.setSpeakerState(packageName, \"error\", {\n errorCode: MiniappErrorCode.INTERNAL,\n errorMessage: error ?? \"speaker stream failed\",\n durationMs: durationMs ?? undefined,\n })\n }\n },\n })\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n this.setSpeakerState(packageName, \"error\", {\n errorCode: MiniappErrorCode.INTERNAL,\n errorMessage: message,\n })\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message,\n })\n return\n }\n\n // The native open can outlive a miniapp disconnect. Its ordinary teardown\n // ran while no StreamState existed yet, so close this late result here\n // instead of leaving an orphan AudioTrack/AVAudioEngine session.\n if (this.connectedApps.get(packageName) !== app) {\n await audioPlaybackService.abortStream(streamId)\n return\n }\n app.activeSpeakerStreamId = streamId\n // Optimistic \"playing\", same as play(): the chunk player starts as soon\n // as the first write lands. Microtask so \"loading\" flushes first.\n queueMicrotask(() => this.setSpeakerState(packageName, \"playing\"))\n this.sendResult(packageName, requestId, true, {streamId})\n }\n\n /** Resolve + validate a stream id from a payload against the app's active stream. */\n private activeSpeakerStream(packageName: string, payload: Record<string, unknown>): string | null {\n const streamId = typeof payload.streamId === \"string\" ? payload.streamId : undefined\n const app = this.connectedApps.get(packageName)\n if (!streamId || !app || app.activeSpeakerStreamId !== streamId) return null\n return streamId\n }\n\n private async handleSpeakerStreamWrite(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const streamId = this.activeSpeakerStream(packageName, payload)\n if (!streamId) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"speaker stream is not open\",\n })\n return\n }\n const base64 = typeof payload.base64 === \"string\" ? payload.base64 : \"\"\n if (!base64 || base64.length % 4 !== 0) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: \"speaker stream write requires padded base64 PCM data\",\n })\n return\n }\n if (base64.length > LocalMiniappRuntime.SPEAKER_STREAM_MAX_BASE64_CHARS) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PAYLOAD_TOO_LARGE,\n message: \"speaker stream chunk exceeds the 256 KB raw PCM limit\",\n })\n return\n }\n try {\n const result = await audioPlaybackService.writeStreamChunk(streamId, base64)\n this.sendResult(packageName, requestId, true, result)\n } catch (error) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n private async handleSpeakerStreamClose(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const streamId = this.activeSpeakerStream(packageName, payload)\n if (!streamId) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"speaker stream is not open\",\n })\n return\n }\n try {\n // Resolves once the buffered audio has drained; onEnded delivers the\n // terminal SPEAKER_STATE (\"stopped\").\n const result = await audioPlaybackService.closeStream(streamId)\n this.sendResult(packageName, requestId, true, result)\n } catch (error) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n private async handleSpeakerStreamAbort(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const streamId = this.activeSpeakerStream(packageName, payload)\n if (!streamId) {\n // Aborting an already-gone stream is fine — abort() is idempotent.\n this.sendResult(packageName, requestId, true)\n return\n }\n try {\n await audioPlaybackService.abortStream(streamId)\n this.sendResult(packageName, requestId, true)\n } catch (error) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n private async handleSpeak(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n const rawText = payload.text\n const rawSentences =\n typeof rawText === \"string\"\n ? [rawText.trim()].filter(Boolean)\n : Array.isArray(rawText)\n ? rawText\n .filter((sentence): sentence is string => typeof sentence === \"string\")\n .map((sentence) => sentence.trim())\n .filter(Boolean)\n : []\n const enableSanitization = payload.enableSanitization !== false\n const sentences = prepareTtsSentences(rawSentences, enableSanitization)\n if (sentences.length === 0) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"speak requires text or a non-empty sentence list with speakable content\",\n })\n return\n }\n const cloudText = sentences.join(\" \")\n\n const voice = ((payload.voice_id ?? payload.voice) as string) || \"default\"\n const audioRequestId = requestId || `tts_${Date.now()}`\n const volume = typeof payload.volume === \"number\" ? payload.volume : 1.0\n const stopOtherAudio = payload.stopOtherAudio !== false\n const voiceSettings =\n payload.voice_settings && typeof payload.voice_settings === \"object\"\n ? (payload.voice_settings as Record<string, unknown>)\n : undefined\n const speed = typeof voiceSettings?.speed === \"number\" ? voiceSettings.speed : undefined\n const run: SpeechRun = {id: audioRequestId, cancelled: false}\n\n this.cancelSpeech(packageName)\n this.speechRuns.set(packageName, run)\n this.setSpeakerState(packageName, \"loading\")\n\n let terminalSent = false\n const sendPlaybackResult = (\n success: boolean,\n error: string | null,\n duration: number | null,\n fallbackErrorMessage: string,\n completed = success,\n errorCode: MiniappErrorCode = MiniappErrorCode.TTS_UPSTREAM_ERROR,\n ) => {\n if (terminalSent) return\n terminalSent = true\n\n // A superseded run still owns its bridge request, but it no longer owns\n // the package's shared speaker state.\n const ownsSpeakerState = this.speechRuns.get(packageName) === run\n if (ownsSpeakerState) this.speechRuns.delete(packageName)\n\n if (ownsSpeakerState) {\n if (success) {\n this.setSpeakerState(packageName, \"stopped\", {durationMs: duration ?? undefined})\n } else {\n this.setSpeakerState(packageName, \"error\", {\n errorCode,\n errorMessage: error ?? fallbackErrorMessage,\n durationMs: duration ?? undefined,\n })\n }\n }\n\n this.sendResult(\n packageName,\n requestId,\n success,\n {completed, duration},\n error\n ? {\n code: errorCode,\n message: error,\n }\n : undefined,\n )\n }\n run.onCancelled = () => sendPlaybackResult(true, null, null, \"tts playback stopped\", false)\n\n try {\n const voiceExplicit = payload.voice_id !== undefined || payload.voice !== undefined\n const offlineSupportsVoice =\n !voiceExplicit || voice === \"default\" || ttsModelManager.getAvailableLanguages().some((l) => l.code === voice)\n\n const modelId = typeof payload.model_id === \"string\" ? payload.model_id : undefined\n const forceLocal = payload.forceLocal === true\n const cloudConnected = cloudClientService.isConnected()\n console.log(\n `${LOG_TAG}: TTS decision for ${packageName}: cloudConnected=${cloudConnected}, runtimeTts=yes, offlineVoice=${offlineSupportsVoice}, forceLocal=${forceLocal}`,\n )\n\n const playOfflineTts = async (reason?: string): Promise<boolean> => {\n if (run.cancelled) return true\n if (!isFeatureEnabled(\"onDeviceSpeech\")) return false\n if (!offlineSupportsVoice || !(await ttsModelManager.isModelAvailable())) {\n return false\n }\n if (run.cancelled) return true\n\n const languageCode = ttsModelManager.getAvailableLanguages().some((l) => l.code === voice) ? voice : undefined\n const offlineSentences = sentences\n\n if (offlineSentences.length > 1) {\n let firstSentence: TtsSynthesisResult\n try {\n firstSentence = await ttsModelManager.synthesizeToFile(offlineSentences[0], {languageCode, speed})\n } catch (offlineErr) {\n if (run.cancelled) return true\n console.warn(\n `${LOG_TAG}: offline sentence TTS synthesize failed${reason ? ` after ${reason}` : \"\"}:`,\n offlineErr,\n )\n return false\n }\n\n if (run.cancelled) {\n await Promise.resolve(firstSentence.cleanup?.())\n return true\n }\n void runSentenceTtsPipeline({\n sentences: offlineSentences,\n firstAudio: firstSentence,\n run,\n synthesize: (sentence) => ttsModelManager.synthesizeToFile(sentence, {languageCode, speed}),\n play: (audio, index) =>\n new Promise((resolve) => {\n const sentenceRequestId = `${audioRequestId}_sentence_${index}`\n run.playbackRequestId = sentenceRequestId\n audioPlaybackService.play(\n {\n requestId: sentenceRequestId,\n audioUrl: audio.audioUrl,\n appId: packageName,\n volume,\n stopOtherAudio,\n },\n (_responseId, success, error, duration, completionReason) => {\n if (run.playbackRequestId === sentenceRequestId) run.playbackRequestId = undefined\n resolve({success, completed: completionReason === \"completed\", error, duration})\n },\n )\n }),\n onCleanupError: (cleanupError) => {\n console.warn(`${LOG_TAG}: sentence TTS cleanup failed`, cleanupError)\n },\n }).then(\n ({success, completed, error, duration}) => {\n sendPlaybackResult(success, error, duration, \"offline sentence tts playback failed\", completed)\n },\n (pipelineError: unknown) => {\n const message = pipelineError instanceof Error ? pipelineError.message : String(pipelineError)\n sendPlaybackResult(false, message, null, \"offline sentence tts playback failed\", false)\n },\n )\n queueMicrotask(() => {\n if (this.speechRuns.get(packageName) === run) this.setSpeakerState(packageName, \"playing\")\n })\n return true\n }\n\n let offlineGenerated: TtsSynthesisResult | undefined\n\n try {\n offlineGenerated = await ttsModelManager.synthesizeToFile(offlineSentences[0], {languageCode, speed})\n } catch (offlineErr) {\n if (run.cancelled) return true\n console.warn(`${LOG_TAG}: offline TTS synthesize failed${reason ? ` after ${reason}` : \"\"}:`, offlineErr)\n return false\n }\n\n const generated = offlineGenerated\n if (run.cancelled) {\n await Promise.resolve(generated.cleanup?.())\n return true\n }\n run.playbackRequestId = audioRequestId\n audioPlaybackService.play(\n {\n requestId: audioRequestId,\n audioUrl: generated.audioUrl,\n appId: packageName,\n volume,\n stopOtherAudio,\n },\n (_respId, success, error, duration, completionReason) => {\n if (run.playbackRequestId === audioRequestId) run.playbackRequestId = undefined\n void Promise.resolve(generated.cleanup?.()).catch((cleanupError) => {\n console.warn(`${LOG_TAG}: offline TTS cleanup failed`, cleanupError)\n })\n sendPlaybackResult(\n success,\n error,\n duration,\n \"offline tts playback failed\",\n completionReason === \"completed\",\n )\n },\n )\n queueMicrotask(() => {\n if (this.speechRuns.get(packageName) === run) this.setSpeakerState(packageName, \"playing\")\n })\n return true\n }\n\n const playCloudTts = async (fallbackToOffline: boolean): Promise<boolean> => {\n if (run.cancelled) return true\n let source: Awaited<ReturnType<typeof cloudClientService.tts.speak>>\n try {\n source = await cloudClientService.tts.speak(cloudText, {\n ...(voiceExplicit && voice !== \"default\" ? {voice_id: voice} : {}),\n ...(modelId ? {model_id: modelId} : {}),\n ...(voiceSettings ? {voice_settings: voiceSettings} : {}),\n })\n } catch (cloudErr) {\n if (run.cancelled) return true\n const error = cloudErr instanceof Error ? cloudErr.message : String(cloudErr)\n console.warn(`${LOG_TAG}: cloud TTS source failed: ${error}`)\n if (fallbackToOffline && (await playOfflineTts(\"cloud tts source failed\"))) {\n return true\n }\n sendPlaybackResult(false, error, null, \"tts failed\")\n return true\n }\n\n if (run.cancelled) return true\n\n run.playbackRequestId = audioRequestId\n await Promise.resolve(\n audioPlaybackService.play(\n {\n requestId: audioRequestId,\n audioUrl: source.audioUrl,\n appId: packageName,\n volume,\n stopOtherAudio,\n },\n (_respId, success, error, duration, completionReason) => {\n if (run.playbackRequestId === audioRequestId) run.playbackRequestId = undefined\n if (!success && fallbackToOffline) {\n void playOfflineTts(\"cloud tts playback failed\").then((started) => {\n if (!started) {\n sendPlaybackResult(false, error, duration, \"tts failed\")\n }\n })\n return\n }\n sendPlaybackResult(success, error, duration, \"tts failed\", completionReason === \"completed\")\n },\n ),\n )\n queueMicrotask(() => {\n if (this.speechRuns.get(packageName) === run) this.setSpeakerState(packageName, \"playing\")\n })\n return true\n }\n\n if (forceLocal) {\n if (await playOfflineTts()) {\n return\n }\n if (run.cancelled) return\n const message = \"tts unavailable: forceLocal requested but offline TTS model is not available\"\n sendPlaybackResult(false, message, null, message, false, MiniappErrorCode.TTS_LOCAL_UNAVAILABLE)\n return\n }\n\n if (cloudConnected && (await playCloudTts(true))) {\n return\n }\n\n // Offline is the disconnected-cloud fallback. If the model is not\n // available, preserve the old behavior by trying cloud as a last resort.\n if (await playOfflineTts(cloudConnected ? undefined : \"cloud disconnected\")) {\n return\n }\n\n if (await playCloudTts(false)) {\n return\n }\n\n const message = \"tts unavailable: no cloud TTS URL or offline TTS model\"\n sendPlaybackResult(false, message, null, message, false)\n } catch (err) {\n console.error(`${LOG_TAG}: speak error:`, err)\n const message = err instanceof Error ? err.message : \"TTS error\"\n sendPlaybackResult(false, message, null, \"TTS error\", false)\n }\n }\n\n private cancelSpeech(packageName: string): void {\n const run = this.speechRuns.get(packageName)\n if (!run) return\n run.cancelled = true\n this.speechRuns.delete(packageName)\n if (run.playbackRequestId) audioPlaybackService.cancelPlayback(run.playbackRequestId)\n run.onCancelled?.()\n }\n\n private async handleRgbLed(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n const coerceNumber = (value: unknown, fallback: number): number => {\n const coerced = Number(value)\n return Number.isFinite(coerced) ? coerced : fallback\n }\n\n const ledRequestId = requestId || `led_${Date.now()}`\n const action = normalizeRgbLedAction(payload.action)\n const color = normalizeRgbLedColor(payload.color)\n\n try {\n const result = await BluetoothSdk.rgbLedControl(\n ledRequestId,\n packageName,\n action,\n color,\n coerceNumber(payload.ontime, 1000),\n coerceNumber(payload.offtime, 0),\n coerceNumber(payload.count, 1),\n )\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"RGB LED command failed\",\n })\n }\n }\n\n private async handleLocationPoll(packageName: string, requestId?: string): Promise<void> {\n try {\n // Expo's Android requestForegroundPermissionsAsync always delegates to\n // Activity.requestPermissions(), even when permission is already granted.\n // Calling it after the user presses Home therefore waits until the Activity\n // resumes. Read the current grant first, and only enter the prompt flow\n // while the Activity is actually foregrounded.\n const permissionStartedAt = Date.now()\n const permission = await resolveForegroundLocationPermission(Location, () => AppState.currentState)\n const {status} = permission\n console.log(\n `${LOG_TAG}: location poll permission status=${status} appState=${AppState.currentState} elapsed=${\n Date.now() - permissionStartedAt\n }ms`,\n )\n if (status !== \"granted\") {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: \"Location permission not granted\",\n })\n return\n }\n\n // Try the OS cache first — usually instant — and only fall back to\n // a fresh fix if the cache is empty. Use Low accuracy on the fresh\n // path so we get a cell/wifi-tower fix in ~1s instead of waiting\n // for full GPS warm-up.\n const locationStartedAt = Date.now()\n const cached = await Location.getLastKnownPositionAsync({maxAge: 60_000})\n console.log(`${LOG_TAG}: location poll cache hit=${cached !== null} elapsed=${Date.now() - locationStartedAt}ms`)\n const location = cached ?? (await Location.getCurrentPositionAsync({accuracy: Location.Accuracy.Low}))\n console.log(`${LOG_TAG}: location poll resolved elapsed=${Date.now() - locationStartedAt}ms`)\n\n this.sendResult(packageName, requestId, true, {\n lat: location.coords.latitude,\n lng: location.coords.longitude,\n accuracy: location.coords.accuracy ?? undefined,\n timestamp: location.timestamp,\n })\n } catch (err) {\n console.error(`${LOG_TAG}: location poll error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Location error\",\n })\n }\n }\n\n // ---------------------------------------------------------------------------\n // Navigation\n // ---------------------------------------------------------------------------\n\n /**\n * All navigation handlers + their state live in NavigationHandlers. The\n * dispatcher's NAVIGATION_* cases delegate here; the rest of the runtime\n * cross-cuts navigation through {@link NavigationHandlers.onDisconnect}\n * (mini-app disconnect) and {@link NavigationHandlers.isTripActive}\n * (location-stream gating during a trip).\n */\n private readonly navigationHandlers = new NavigationHandlers(\n (packageName, envelope) => this.sendToMiniapp(packageName, envelope),\n (packageName, requestId, ok, result, error) => this.sendResult(packageName, requestId, ok, result, error),\n )\n\n /**\n * `session.blob` — persistent, per-app binary storage. Like NavigationHandlers,\n * the BLOB_* dispatcher cases delegate here. It's a generic byte store; audio\n * recording lives entirely in the miniapp (mic.onAudioChunk → chunked\n * BLOB_WRITE), so nothing audio-specific runs in the host.\n */\n private readonly blobStore = new BlobStore({\n sendResult: (packageName, requestId, ok, result, error) =>\n this.sendResult(packageName, requestId, ok, result, error),\n getUserId: () => cloudClientService.getMentraUserId(),\n })\n private readonly blobRequestQueues = new Map<string, Promise<void>>()\n\n private readonly simpleStorage = new LocalMiniappStorage({\n backend: localMiniappStorageBackend,\n getUserId: () => cloudClientService.resolveMentraUserId(),\n })\n\n /**\n * BlobStore's file helpers are synchronous once a user namespace is selected,\n * but first-boot Core auth is not. Queue requests per app behind stable\n * identity resolution so CREATE/WRITE/COMMIT ordering survives that wait.\n */\n private enqueueBlobRequest(\n packageName: string,\n requestId: string | undefined,\n operation: () => Promise<void> | void,\n ): void {\n const app = this.connectedApps.get(packageName)\n const previous = this.blobRequestQueues.get(packageName) ?? Promise.resolve()\n const queued = previous.then(async () => {\n try {\n await cloudClientService.resolveMentraUserId()\n } catch (err) {\n console.error(`${LOG_TAG}: blob identity error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_CONNECTED,\n message: \"Blob storage is unavailable before sign-in completes\",\n })\n return\n }\n\n // unregisterApp() or a crash-respawn may have replaced this app while\n // identity resolution was pending. Never replay an old context's request\n // against its replacement.\n if (!app || this.connectedApps.get(packageName) !== app) return\n\n // Invoke in request order, but do not keep the queue occupied for the\n // lifetime of an async picker, download, or share sheet. CREATE/WRITE/\n // COMMIT are synchronous and therefore still dispatch strictly in order.\n try {\n const pending = operation()\n if (pending) {\n void pending.catch((err) => this.handleBlobRequestError(packageName, requestId, err))\n }\n } catch (err) {\n this.handleBlobRequestError(packageName, requestId, err)\n }\n })\n this.blobRequestQueues.set(packageName, queued)\n void queued.finally(() => {\n if (this.blobRequestQueues.get(packageName) === queued) this.blobRequestQueues.delete(packageName)\n })\n }\n\n private handleBlobRequestError(packageName: string, requestId: string | undefined, err: unknown): void {\n console.error(`${LOG_TAG}: blob request error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Blob storage error\",\n })\n }\n\n /**\n * Heading is a sensor stream — start the native compass when any mini\n * app is subscribed to \"heading_update\", stop it when none are.\n */\n private headingUnsub: (() => void) | null = null\n private recomputeHeadingSubscription(): void {\n const wantsHeading = this.streamSubscribers.has(MiniappStreamType.HEADING_UPDATE)\n if (wantsHeading && !this.headingUnsub) {\n // Heading sensor lives in engine (HeadingService) — subscribe directly.\n this.headingUnsub = headingService.addListener((degrees: number) => {\n this.forwardEvent(MiniappStreamType.HEADING_UPDATE, {degrees})\n })\n } else if (!wantsHeading && this.headingUnsub) {\n this.headingUnsub()\n this.headingUnsub = null\n }\n }\n\n /**\n * Accelerometer is a sensor stream — enable the glasses IMU when any mini\n * app is subscribed to \"accel_data\", disable it when none are. Mirrors the\n * heading pattern. Only G2 streams IMU today; on other devices the native\n * call is a no-op so this is harmless.\n */\n private imuEnabled = false\n private recomputeImuSubscription(): void {\n const wantsImu = this.streamSubscribers.has(MiniappStreamType.ACCEL_DATA)\n if (wantsImu === this.imuEnabled) return\n this.imuEnabled = wantsImu\n void BluetoothSdk.setImuEnabled(wantsImu)\n }\n\n /**\n * Last rate we asked the host for. Lets us skip the cross-process call\n * when nothing actually changed (most SUBSCRIBE / unregister churn\n * leaves the aggregate unchanged) and tracks state for the no-active-\n * subscribers → tell host to back off case.\n */\n private lastAppliedLocationRate: LocationRate | null = null\n\n /**\n * Recompute the aggregate location tier across every connected\n * miniapp and push the result to the host. The aggregate is the\n * STRICTEST rate any single app has requested — see\n * {@link LOCATION_RATE_PRIORITY} — because the GPS sample rate is a\n * shared OS-level setting that we can't bias per-app.\n *\n * Called after every SUBSCRIBE and every unregister so that when a\n * realtime-requesting app goes away the tier falls back down. If no\n * connected app is asking for a location rate, we tell the host\n * \"off\" so it can drop GPS power.\n */\n private recomputeLocationTier(): void {\n let bestRank = -1\n for (const app of this.connectedApps.values()) {\n const r = app.requestedLocationRate\n if (!r) continue\n const rank = locationRateRank(r)\n if (rank > bestRank) {\n bestRank = rank\n }\n }\n // When no app is asking, downgrade to \"off\". Without this we'd\n // leak the last-known-strictest rate forever (the original bug).\n const next: LocationRate = bestRank >= 0 ? LOCATION_RATE_PRIORITY[bestRank] : \"off\"\n if (next === this.lastAppliedLocationRate) return\n this.lastAppliedLocationRate = next\n console.log(`[LOCATION] aggregate tier → ${next}`)\n void phoneLocationService.setLocationTier(next)\n }\n\n // ---------------------------------------------------------------------------\n // Storage helpers\n // ---------------------------------------------------------------------------\n\n private async handleStorageGet(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const key = payload.key as string\n if (!key) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"storage_get requires a key\",\n })\n return\n }\n const value = await this.simpleStorage.get(packageName, key)\n this.sendResult(packageName, requestId, true, {key, value})\n } catch (err) {\n console.error(`${LOG_TAG}: storage_get error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Storage error\",\n })\n }\n }\n\n private async handleStorageSet(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const key = payload.key as string\n if (!key) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"storage_set requires a key\",\n })\n return\n }\n await this.simpleStorage.set(packageName, key, payload.value ?? null)\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n console.error(`${LOG_TAG}: storage_set error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Storage error\",\n })\n }\n }\n\n private async handleStorageDelete(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const key = payload.key as string\n if (!key) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"storage_delete requires a key\",\n })\n return\n }\n await this.simpleStorage.delete(packageName, key)\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n console.error(`${LOG_TAG}: storage_delete error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Storage error\",\n })\n }\n }\n\n private async handleStorageList(\n packageName: string,\n _payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const keys = await this.simpleStorage.keys(packageName)\n this.sendResult(packageName, requestId, true, {keys})\n } catch (err) {\n console.error(`${LOG_TAG}: storage_list error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Storage error\",\n })\n }\n }\n\n private async handleStorageClear(packageName: string, requestId?: string): Promise<void> {\n try {\n await this.simpleStorage.clear(packageName)\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n console.error(`${LOG_TAG}: storage_clear error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Storage error\",\n })\n }\n }\n\n private async handleStorageHas(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const key = payload.key as string\n if (!key) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"storage_has requires a key\",\n })\n return\n }\n const has = await this.simpleStorage.has(packageName, key)\n this.sendResult(packageName, requestId, true, {has})\n } catch (err) {\n console.error(`${LOG_TAG}: storage_has error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Storage error\",\n })\n }\n }\n\n private async handleStorageGetAll(packageName: string, requestId?: string): Promise<void> {\n try {\n const values = await this.simpleStorage.getAll(packageName)\n this.sendResult(packageName, requestId, true, {values})\n } catch (err) {\n console.error(`${LOG_TAG}: storage_get_all error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Storage error\",\n })\n }\n }\n\n private async handleStorageSetMultiple(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const values = payload.values as Record<string, unknown> | undefined\n if (!values || typeof values !== \"object\") {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"storage_set_multiple requires a values object\",\n })\n return\n }\n await this.simpleStorage.setMultiple(packageName, values)\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n console.error(`${LOG_TAG}: storage_set_multiple error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Storage error\",\n })\n }\n }\n\n // ---------------------------------------------------------------------------\n // Wi-Fi ADB\n // ---------------------------------------------------------------------------\n\n private async handleSetWifiAdbState(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const result = await handleWifiAdbRequest(packageName, payload, {\n isSystemPackage: (candidate) => this.isSystemPackage(candidate),\n setWifiAdbState: async (enabled) => {\n console.log(`${LOG_TAG}: set_wifi_adb_state enabled=${enabled} from ${packageName}`)\n try {\n await BluetoothSdk.setWifiAdbState(enabled)\n } catch (error) {\n console.error(`${LOG_TAG}: set_wifi_adb_state error:`, error)\n throw error\n }\n },\n })\n\n if (result.ok) {\n this.sendResult(packageName, requestId, true)\n return\n }\n\n this.sendResult(packageName, requestId, false, undefined, result.error)\n }\n\n // ---------------------------------------------------------------------------\n // Camera FOV\n // ---------------------------------------------------------------------------\n\n private async handleCameraFov(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const app = this.connectedApps.get(packageName)\n const hasCameraPermission = app?.installedManifest?.permissions?.some((p) => p.type === \"CAMERA\")\n if (!hasCameraPermission) {\n logPermissionNotDeclared(packageName, \"CAMERA\", \"to set camera FOV\", `{\"type\": \"CAMERA\"}`)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: `CAMERA permission not declared in miniapp.json. Add {\"type\": \"CAMERA\"} to the \"permissions\" array.`,\n permission: \"CAMERA\",\n operation: MiniappRequestType.CAMERA_FOV,\n })\n return\n }\n\n try {\n const request = normalizeCameraFovPayload(payload)\n const description =\n \"preset\" in request ? `preset=${request.preset}` : `fov=${request.fov} roi=${request.roiPosition ?? \"center\"}`\n console.log(`${LOG_TAG}: camera_fov_set ${description}`)\n\n const result = await phoneCameraFovCoordinator.setOverride(packageName, request)\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n console.error(`${LOG_TAG}: camera_fov error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Camera FOV error\",\n })\n }\n }\n\n /**\n * Explicit IMU enable/disable from a miniapp (session.imu.setEnabled).\n *\n * The accel stream already auto-toggles the native IMU on subscribe (see\n * {@link recomputeImuSubscription}); this is a direct override. We sync\n * `this.imuEnabled` to the requested state so a subsequent subscription\n * recompute with the same aggregate doesn't issue a redundant native call.\n * Note that a later subscribe/unsubscribe that changes the aggregate will\n * still re-derive the sensor state from subscriptions.\n */\n private handleImuSetEnabled(packageName: string, payload: Record<string, unknown>, requestId?: string): void {\n try {\n const enabled = !!payload.enabled\n console.log(`${LOG_TAG}: imu_set_enabled ${enabled} (by ${packageName})`)\n this.imuEnabled = enabled\n void BluetoothSdk.setImuEnabled(enabled)\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n console.error(`${LOG_TAG}: imu_set_enabled error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"IMU set-enabled error\",\n })\n }\n }\n\n /**\n * Lifecycle-scoped glasses-side VAD override from a miniapp\n * (session.mic.setVoiceActivityDetectionEnabled). Requires MICROPHONE in the\n * miniapp manifest. Mentra Live only today — other models no-op via DeviceStore.\n */\n private async handleMicSetVadEnabled(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const app = this.connectedApps.get(packageName)\n const hasMicPermission = app?.installedManifest?.permissions?.some((p) => p.type === \"MICROPHONE\")\n if (!hasMicPermission) {\n logPermissionNotDeclared(packageName, \"MICROPHONE\", \"to set VAD enabled\", `{\"type\": \"MICROPHONE\"}`)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: `MICROPHONE permission not declared in miniapp.json. Add {\"type\": \"MICROPHONE\"} to the \"permissions\" array.`,\n permission: \"MICROPHONE\",\n operation: MiniappRequestType.MIC_SET_VAD_ENABLED,\n })\n return\n }\n\n if (typeof payload.enabled !== \"boolean\") {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: \"enabled must be a boolean\",\n })\n return\n }\n\n try {\n const enabled = payload.enabled\n console.log(`${LOG_TAG}: mic_set_vad_enabled ${enabled} (by ${packageName})`)\n await micStateCoordinator.setMiniappGateOverride(packageName, \"vad\", enabled, this.getConfiguredMicGates())\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n console.error(`${LOG_TAG}: mic_set_vad_enabled error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"VAD set-enabled error\",\n })\n }\n }\n\n /**\n * Lifecycle-scoped center-mic loudness gate (\"Barrier\") override from a miniapp\n * (session.mic.setLoudnessGateEnabled). Requires MICROPHONE in the miniapp\n * manifest. Mentra Live only today — other models no-op via DeviceStore.\n */\n private async handleMicSetLoudnessGateEnabled(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const app = this.connectedApps.get(packageName)\n const hasMicPermission = app?.installedManifest?.permissions?.some((p) => p.type === \"MICROPHONE\")\n if (!hasMicPermission) {\n logPermissionNotDeclared(packageName, \"MICROPHONE\", \"to set loudness gate enabled\", `{\"type\": \"MICROPHONE\"}`)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: `MICROPHONE permission not declared in miniapp.json. Add {\"type\": \"MICROPHONE\"} to the \"permissions\" array.`,\n permission: \"MICROPHONE\",\n operation: MiniappRequestType.MIC_SET_LOUDNESS_GATE_ENABLED,\n })\n return\n }\n\n if (typeof payload.enabled !== \"boolean\") {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: \"enabled must be a boolean\",\n })\n return\n }\n\n try {\n const enabled = payload.enabled\n console.log(`${LOG_TAG}: mic_set_loudness_gate_enabled ${enabled} (by ${packageName})`)\n await micStateCoordinator.setMiniappGateOverride(\n packageName,\n \"loudnessGate\",\n enabled,\n this.getConfiguredMicGates(),\n )\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n console.error(`${LOG_TAG}: mic_set_loudness_gate_enabled error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Loudness gate set-enabled error\",\n })\n }\n }\n\n /**\n * session.system.scanQr — host camera overlay. Must not clear miniapp\n * foreground; the host seam is responsible for presenting a Modal on top.\n */\n private async handleScanQr(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n try {\n const result = await invokeScanQrSeam(getUiSeams().scanQr, payload)\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n if (!getUiSeams().scanQr) {\n console.warn(`${LOG_TAG}: scanQr seam missing — QR overlay is not registered`)\n }\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string} | null | undefined)?.code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"QR scan failed\",\n })\n }\n }\n\n // ---------------------------------------------------------------------------\n // System utilities (share, open URL, clipboard, download)\n // ---------------------------------------------------------------------------\n\n private async handleShare(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n const {text, title, base64, mimeType, filename, url} = payload as {\n text?: string\n title?: string\n base64?: string\n mimeType?: string\n filename?: string\n url?: string\n }\n try {\n if (base64) {\n // File share via base64 — write to temp file then share\n const tempFile = new File(Paths.cache, filename || \"shared_file\")\n tempFile.write(base64, {encoding: \"base64\"})\n await Share.open({\n url: tempFile.uri,\n type: mimeType || \"application/octet-stream\",\n filename: filename,\n title: title,\n })\n } else if (url) {\n await Share.open({url, title, message: text})\n } else {\n await Share.open({message: text || \"\", title})\n }\n this.sendResult(packageName, requestId, true, {success: true})\n } catch (error: any) {\n // react-native-share throws when user dismisses the share sheet\n if (error?.message?.includes(\"User did not share\")) {\n this.sendResult(packageName, requestId, true, {success: false, cancelled: true})\n } else {\n console.error(`${LOG_TAG}: share error:`, error)\n this.sendResult(packageName, requestId, true, {success: false})\n }\n }\n }\n\n private async handleOpenUrl(packageName: string, payload: Record<string, unknown>): Promise<void> {\n const url = payload.url as string | undefined\n if (!url || typeof url !== \"string\") {\n console.warn(`${LOG_TAG}: open_url missing url`)\n return\n }\n // Block dangerous schemes\n if (url.startsWith(\"javascript:\") || url.startsWith(\"file:\")) {\n console.warn(`${LOG_TAG}: open_url blocked dangerous scheme: ${url}`)\n return\n }\n try {\n await Linking.openURL(url)\n } catch (error) {\n console.error(`${LOG_TAG}: open_url error:`, error)\n }\n }\n\n private async handleCopyClipboard(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const text = payload.text as string | undefined\n if (typeof text !== \"string\") {\n console.warn(`${LOG_TAG}: copy_clipboard missing text`)\n return\n }\n try {\n await Clipboard.setStringAsync(text)\n this.sendResult(packageName, requestId, true)\n } catch (error: any) {\n console.error(`${LOG_TAG}: clipboard error:`, error)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: error?.message || \"Clipboard error\",\n })\n }\n }\n\n private async handleDownload(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const {base64, url, mimeType, filename} = payload as {\n base64?: string\n url?: string\n mimeType?: string\n filename?: string\n }\n const name = filename || \"download\"\n try {\n let file: File\n if (base64) {\n file = new File(Paths.cache, name)\n file.write(base64, {encoding: \"base64\"})\n } else if (url) {\n file = await File.downloadFileAsync(url, new File(Paths.cache, name), {idempotent: true})\n } else {\n console.warn(`${LOG_TAG}: download missing base64 or url`)\n return\n }\n // Open share sheet so user can choose where to save\n await Share.open({\n url: file.uri,\n type: mimeType || \"application/octet-stream\",\n filename: name,\n })\n this.sendResult(packageName, requestId, true, {success: true})\n } catch (error: any) {\n if (error?.message?.includes(\"User did not share\")) {\n this.sendResult(packageName, requestId, true, {success: true, cancelled: true})\n } else {\n console.error(`${LOG_TAG}: download error:`, error)\n this.sendResult(packageName, requestId, true, {success: false})\n }\n }\n }\n\n // ===========================================================================\n // Photo + streaming handlers (cloud-coordinated)\n // ===========================================================================\n\n /**\n * Manifest permission gate shared by the camera-and-mic RPCs (streams, meetings).\n * Sends PERMISSION_NOT_DECLARED and returns false when the miniapp did not declare\n * `permission`; the caller must return without doing the work.\n */\n private requireManifestPermission(\n packageName: string,\n requestId: string | undefined,\n permission: \"CAMERA\" | \"PHONE_CAMERA\" | \"MICROPHONE\",\n purpose: string,\n operation: MiniappRequestType,\n ): boolean {\n const app = this.connectedApps.get(packageName)\n if (app?.installedManifest?.permissions?.some((p) => p.type === permission)) return true\n logPermissionNotDeclared(packageName, permission, purpose, `{\"type\": \"${permission}\"}`)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: `${permission} permission not declared in miniapp.json. Add {\"type\": \"${permission}\"} to the \"permissions\" array.`,\n permission,\n operation,\n })\n return false\n }\n\n /**\n * OS-permission gate: checked, never requested.\n *\n * The prompt belongs at miniapp-open time, where it can be explained. Requesting here would put\n * a system dialog on top of a join that has already started building a hotspot, and a wearer who\n * denies it gets a call that half-exists. Missing means the join is refused with the permission\n * named, so the miniapp can send them to Settings.\n */\n private async requireOsPermission(\n packageName: string,\n requestId: string | undefined,\n feature: string,\n label: string,\n ): Promise<boolean> {\n if (await permissions.check(feature)) return true\n softapTraceFailure(\"softap_permission_missing\", {packageName, feature})\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_DENIED,\n message: `This phone's ${label} permission is not granted. Grant it in Settings, then try again.`,\n permission: feature,\n operation: MiniappRequestType.MEETING_JOIN,\n })\n return false\n }\n\n private async handlePhoto(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n // Manifest CAMERA permission gate.\n const app = this.connectedApps.get(packageName)\n const hasCameraPermission = app?.installedManifest?.permissions?.some((p) => p.type === \"CAMERA\")\n if (!hasCameraPermission) {\n logPermissionNotDeclared(packageName, \"CAMERA\", \"to take a photo\", `{\"type\": \"CAMERA\"}`)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: `CAMERA permission not declared in miniapp.json. Add {\"type\": \"CAMERA\"} to the \"permissions\" array.`,\n permission: \"CAMERA\",\n operation: MiniappRequestType.PHOTO,\n })\n return\n }\n\n try {\n const result = await phonePhotoCoordinator.takePhoto(packageName, {\n size: payload.size as \"low\" | \"medium\" | \"high\" | \"max\" | \"small\" | \"large\" | \"full\" | undefined,\n mode: payload.mode as \"photo\" | \"text\" | undefined,\n transferMethod: payload.transferMethod as \"auto\" | \"direct\" | \"ble\" | undefined,\n compress: parsePhotoCompression(payload.compress),\n sound: payload.sound as boolean | undefined,\n saveToGallery: payload.saveToGallery as boolean | undefined,\n exposureTimeNs: payload.exposureTimeNs as number | undefined,\n iso: payload.iso as number | null | undefined,\n aeExposureDivisor: payload.aeExposureDivisor as number | undefined,\n isoCap: payload.isoCap as number | undefined,\n noiseReduction: payload.noiseReduction as boolean | undefined,\n edgeEnhancement: payload.edgeEnhancement as boolean | undefined,\n zsl: payload.zsl as boolean | undefined,\n mfnr: payload.mfnr as boolean | undefined,\n ispDigitalGain: payload.ispDigitalGain as number | undefined,\n ispAnalogGain: payload.ispAnalogGain as string | undefined,\n })\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Photo request failed\",\n stage: (err as {stage?: string}).stage,\n transport: (err as {transport?: string}).transport,\n })\n }\n }\n\n private async handleCameraWarmUp(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n // Manifest CAMERA permission gate (same as photo).\n const app = this.connectedApps.get(packageName)\n const hasCameraPermission = app?.installedManifest?.permissions?.some((p) => p.type === \"CAMERA\")\n if (!hasCameraPermission) {\n logPermissionNotDeclared(packageName, \"CAMERA\", \"to warm up the camera\", `{\"type\": \"CAMERA\"}`)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: `CAMERA permission not declared in miniapp.json. Add {\"type\": \"CAMERA\"} to the \"permissions\" array.`,\n permission: \"CAMERA\",\n operation: MiniappRequestType.CAMERA_WARM_UP,\n })\n return\n }\n\n try {\n await phonePhotoCoordinator.warmUpCamera(packageName, {\n size: payload.size as \"low\" | \"medium\" | \"high\" | \"max\" | undefined,\n mode: payload.mode as \"photo\" | \"text\" | undefined,\n exposureTimeNs: payload.exposureTimeNs as number | undefined,\n durationMs: payload.durationMs as number | undefined,\n zsl: payload.zsl as boolean | undefined,\n mfnr: payload.mfnr as boolean | undefined,\n })\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Camera warm-up failed\",\n stage: (err as {stage?: string}).stage,\n transport: (err as {transport?: string}).transport,\n })\n }\n }\n\n private async handleVideoRecordingStart(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n // Manifest CAMERA permission gate (same as photo).\n const app = this.connectedApps.get(packageName)\n const hasCameraPermission = app?.installedManifest?.permissions?.some((p) => p.type === \"CAMERA\")\n if (!hasCameraPermission) {\n logPermissionNotDeclared(packageName, \"CAMERA\", \"to record video\", `{\"type\": \"CAMERA\"}`)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: `CAMERA permission not declared in miniapp.json. Add {\"type\": \"CAMERA\"} to the \"permissions\" array.`,\n permission: \"CAMERA\",\n operation: MiniappRequestType.VIDEO_RECORDING_START,\n })\n return\n }\n\n try {\n const result = await phoneVideoCoordinator.startRecording(packageName, {\n width: payload.width as number | undefined,\n height: payload.height as number | undefined,\n fps: payload.fps as number | undefined,\n sound: payload.sound as boolean | undefined,\n save: payload.save as boolean | undefined,\n })\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Video recording start failed\",\n })\n }\n }\n\n private async handleVideoRecordingStop(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n await phoneVideoCoordinator.stopRecording(packageName, payload.recordingId as string | undefined, {\n uploadUrl: payload.uploadUrl as string | undefined,\n uploadAuthToken: payload.uploadAuthToken as string | undefined,\n })\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Video recording stop failed\",\n })\n }\n }\n\n /**\n * Stream handlers — dispatched to PhoneStreamCoordinator on the phone.\n * Managed streams also use Cloud V2 REST calls to provision resources,\n * poll ingest status, and tear down the managed stream. Miniapp JavaScript\n * runs locally in the Mentra App.\n */\n private async handleStreamStart(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const streaming = phoneStreamCoordinator\n if (!streaming) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_IMPLEMENTED,\n message: \"Streaming is not configured on this host\",\n })\n return\n }\n // A stream is the glasses camera (and mic) leaving the device; gate it like a photo.\n if (\n !this.requireManifestPermission(\n packageName,\n requestId,\n \"CAMERA\",\n \"to stream the camera\",\n MiniappRequestType.STREAM_START,\n )\n ) {\n return\n }\n try {\n const result = await streaming.startUnmanaged(packageName, {\n streamUrl: payload.streamUrl as string,\n video: normalizeStreamVideoConfig(payload.video),\n audio: normalizeStreamAudioConfig(payload.audio),\n sound: payload.sound as boolean | undefined,\n authToken: typeof payload.authToken === \"string\" ? payload.authToken : undefined,\n captureAudio: resolveCaptureAudio(payload.captureAudio, resolveAcsAudioSource().source),\n })\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Stream start failed\",\n stage: (err as {stage?: string}).stage,\n transport: (err as {transport?: string}).transport,\n })\n }\n }\n\n private async handleStreamStop(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const streaming = phoneStreamCoordinator\n if (!streaming) {\n // No adapter wired — treat as already-stopped.\n this.sendResult(packageName, requestId, true)\n return\n }\n try {\n await streaming.stop(packageName, payload.streamId as string | undefined)\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Stream stop failed\",\n stage: (err as {stage?: string}).stage,\n transport: (err as {transport?: string}).transport,\n })\n }\n }\n\n private async handleManagedStreamStart(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const streaming = phoneStreamCoordinator\n if (!streaming) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_IMPLEMENTED,\n message: \"Streaming is not configured on this host\",\n })\n return\n }\n if (\n !this.requireManifestPermission(\n packageName,\n requestId,\n \"CAMERA\",\n \"to stream the camera\",\n MiniappRequestType.MANAGED_STREAM_START,\n )\n ) {\n return\n }\n try {\n if (payload.ingest === \"whip\" && !(await permissions.check(PermissionFeatures.LOCAL_WIFI))) {\n if (!(await permissions.request(PermissionFeatures.LOCAL_WIFI))) {\n throw new Error(\"Nearby devices permission is required to join the glasses hotspot\")\n }\n }\n const result = await streaming.startManaged(packageName, {\n restreamDestinations: payload.restreamDestinations as Array<string | {url: string; name?: string}> | undefined,\n video: normalizeStreamVideoConfig(payload.video),\n audio: normalizeStreamAudioConfig(payload.audio),\n sound: payload.sound as boolean | undefined,\n ingest: payload.ingest as \"srt\" | \"whip\" | \"rtmp\" | undefined,\n captureAudio: normalizeCaptureAudio(payload.captureAudio),\n })\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Managed stream start failed\",\n stage: (err as {stage?: string}).stage,\n transport: (err as {transport?: string}).transport,\n })\n }\n }\n\n private async handleManagedStreamStop(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n return this.handleStreamStop(packageName, payload, requestId)\n }\n\n private ensureMeetingStateBridge(): void {\n acsMeetingService.setStateHandler((owner, state) => {\n const attempt = this.softapAttempt\n // While a replacement waits for cleanup, native events still describe its predecessor.\n if (attempt?.packageName === owner && !attempt.ownsResources) return\n this.sendToMiniapp(owner, {\n type: MiniappResponseType.MEETING_STATE,\n ...state,\n ...this.softapRecoveryFields(attempt?.packageName === owner ? attempt : null),\n })\n if (attempt?.ownsResources && attempt.transport?.shouldRepublish(state.mediaSource)) {\n void attempt.transport.republish(state.mediaSourceReason ?? \"mediaSource failed\")\n }\n })\n }\n\n /** Startup owns the hotspot before ACS has an owner. Closing the app must retire both. */\n private async leaveMeetingForApp(packageName: string): Promise<void> {\n const attempt = this.softapAttempt\n if (attempt?.packageName === packageName) {\n await this.retireSoftapAttempt({attempt})\n } else {\n await acsMeetingService.leaveIfOwner(packageName)\n }\n }\n\n private async handleMeetingJoin(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n this.ensureMeetingStateBridge()\n // A meeting puts the glasses camera and mic in front of remote strangers; it\n // needs both declared, same as photo/stream and mic capture do individually.\n if (\n !this.requireManifestPermission(\n packageName,\n requestId,\n \"CAMERA\",\n \"to join a meeting\",\n MiniappRequestType.MEETING_JOIN,\n ) ||\n !this.requireManifestPermission(\n packageName,\n requestId,\n \"MICROPHONE\",\n \"to join a meeting\",\n MiniappRequestType.MEETING_JOIN,\n ) ||\n !this.requireManifestPermission(\n packageName,\n requestId,\n \"PHONE_CAMERA\",\n \"to join a meeting\",\n MiniappRequestType.MEETING_JOIN,\n )\n ) {\n return\n }\n // Defensive only: these are prompted for when the wearer opens the miniapp, so by the time a\n // join runs they are either granted or were refused minutes ago on a screen that explained\n // them. Checked and never requested — a permission dialog on top of a half-built call is\n // asked too late to explain itself, and ACS fails the join outright without the camera.\n if (!(await this.requireOsPermission(packageName, requestId, PermissionFeatures.CAMERA, \"camera\"))) return\n if (!(await this.requireOsPermission(packageName, requestId, PermissionFeatures.MICROPHONE, \"microphone\"))) return\n const meetingUrl = typeof payload.meetingUrl === \"string\" ? payload.meetingUrl : \"\"\n const token = typeof payload.token === \"string\" ? payload.token : \"\"\n const displayName = typeof payload.displayName === \"string\" ? payload.displayName : undefined\n // Diagnostic only. A miniapp that does not send it gets `unknown`, which is a third answer in\n // the comparison rather than a default that would quietly file every old build under \"created\".\n const origin = parseAcsCallOrigin(payload.origin)\n if (!meetingUrl || !token) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: \"meetingUrl and token are required\",\n })\n return\n }\n let videoSource: AcsVideoSource\n try {\n videoSource = parseAcsVideoSource(payload.videoSource)\n } catch (error) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: error instanceof Error ? error.message : \"Invalid meeting video source\",\n })\n return\n }\n try {\n let video: ReturnType<typeof parseAcsOutgoingVideo>\n try {\n video = parseAcsOutgoingVideo(payload.video)\n } catch (error) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: error instanceof Error ? error.message : \"Invalid meeting video\",\n })\n return\n }\n // SoftAP is a sequence, not a single call: the hotspot and the scoped network have to exist\n // before the ACS join binds a listener, and the glasses can only be told where to publish\n // after that. The miniapp asks for the transport and the host owns the ordering.\n if (videoSource.type === \"softap\") {\n // The miniapp's `requestId` is the only identifier the two logs share until the attempt\n // exists, so it is what joins the miniapp's own join line to the host's.\n softapTrace(\"meeting_join_request\", {\n packageName,\n requestId: requestId ?? \"none\",\n transport: videoSource.type,\n hasDisplayName: Boolean(displayName),\n video: video ? `${video.width}x${video.height}@${video.fps}` : \"default\",\n origin,\n })\n const startedAt = Date.now()\n try {\n const state = await this.joinSoftapMeeting(packageName, {meetingUrl, token, displayName, video, origin})\n softapTrace(\"meeting_join_result\", {\n packageName,\n requestId: requestId ?? \"none\",\n state: state.state,\n micTransport: state.micTransport ?? \"unknown\",\n durationMs: Date.now() - startedAt,\n })\n this.sendResult(packageName, requestId, true, state)\n } catch (error) {\n softapTraceFailure(\"meeting_join_result\", {\n packageName,\n requestId: requestId ?? \"none\",\n step: error instanceof SoftapCallError ? error.step : \"unknown\",\n code: error instanceof SoftapCallError ? error.code : \"INTERNAL\",\n reason: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startedAt,\n })\n throw error\n }\n return\n }\n const state = await acsMeetingService.join(packageName, {\n meetingUrl,\n token,\n videoSource,\n displayName,\n origin,\n ...(video ? {video} : {}),\n })\n this.sendResult(packageName, requestId, true, state)\n } catch (err) {\n // A SoftAP failure already knows what it was and where. Flattening every one of them to\n // INTERNAL is what left the miniapp unable to tell \"your Wi-Fi is off\" — a condition with a\n // two-tap fix — from an ACS timeout, so it showed the same shrug for both. The step comes\n // along too: the same code at `hotspot` and at `scopedJoin` are different stories.\n const softap = err instanceof SoftapCallError ? err : undefined\n this.sendResult(packageName, requestId, false, undefined, {\n code: softap?.code ?? MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"ACS meeting join failed\",\n ...(softap ? {step: softap.step} : {}),\n })\n }\n }\n\n /**\n * Runs the SoftAP call sequence and returns the meeting state it reached.\n *\n * Everything is hung off one [SoftapAttempt] registered before the first `await`, because the\n * cancellable part of this starts immediately and the transport only exists halfway through.\n * The attempt is also what `meeting.leave` unwinds: leaving only the ACS call would strand the\n * glasses publishing into a listener nobody reads, the phone on a hotspot it no longer needs,\n * and this process pinned to cellular.\n */\n private async joinSoftapMeeting(\n packageName: string,\n args: {meetingUrl: string; token: string; displayName?: string; video?: AcsOutgoingVideo; origin?: AcsCallOrigin},\n ): Promise<MeetingState> {\n // Reserve before awaiting retirement: a second Start or Cancel must see this request,\n // including while it is waiting for its predecessor's native cleanup.\n const previous = this.softapAttempt\n const attempt = this.createSoftapAttempt(packageName)\n this.softapAttempt = attempt\n const body = this.runSoftapAttempt(attempt, previous, args)\n // Settled, never rejected: this exists so the *next* attempt can tell when this one's native\n // work has actually stopped, and a rejection here is already handled below.\n attempt.body = body.then(\n () => undefined,\n () => undefined,\n )\n try {\n return await body\n } catch (error) {\n softapTraceFailure(\"softap_attempt_failed\", {\n attempt: attempt.id,\n step: error instanceof SoftapCallError ? error.step : \"unknown\",\n code: error instanceof SoftapCallError ? error.code : \"INTERNAL\",\n reason: error instanceof Error ? error.message : String(error),\n attemptAgeMs: Date.now() - attempt.startedAt,\n })\n // Unwind whatever the attempt reached — including the preflight-owned agent and cellular\n // pin, which the transport never sees — before the failure surfaces.\n await this.retireSoftapAttempt({attempt}).catch(() => undefined)\n throw error\n }\n }\n\n private createSoftapAttempt(packageName: string): SoftapAttempt {\n const id = ++this.softapAttemptSeq\n let resolveSettled!: () => void\n const settled = new Promise<void>((resolve) => {\n resolveSettled = resolve\n })\n const attempt: SoftapAttempt = {\n id,\n packageName,\n startedAt: Date.now(),\n cancelled: false,\n ownsResources: false,\n transport: null,\n progress: {\n traceId: `preflight-${id}`,\n phase: \"starting\",\n steps: SOFTAP_STEPS.map((step) => ({step, status: \"pending\" as const})),\n elapsedMs: 0,\n mediaGeneration: 0,\n },\n scopedLostUnsub: null,\n recovery: null,\n recoveryActive: false,\n recoveryDeadlineAt: null,\n body: null,\n teardown: null,\n settled,\n settledDone: false,\n markSettled: () => {\n if (attempt.settledDone) return\n attempt.settledDone = true\n softapTrace(\"softap_attempt_settled\", {attempt: id, attemptAgeMs: Date.now() - attempt.startedAt})\n resolveSettled()\n },\n }\n softapTrace(\"softap_attempt_created\", {attempt: id, packageName})\n return attempt\n }\n\n /**\n * Throws if this attempt has been cancelled or superseded.\n *\n * Called after every `await` in the join. The wearer's Cancel cannot interrupt a native call\n * that is already in flight, so the next best thing — and the thing that actually makes Cancel\n * work — is to refuse to take another step once they have asked.\n *\n * @param after the await this checkpoint follows. The whole join surfaces as one CANCELLED\n * error, so without a name in the log there is no way to tell a Cancel during the permission\n * prompt from one during a 35-second Teams sign-in.\n */\n private checkpointSoftapAttempt(attempt: SoftapAttempt, after: string): void {\n if (attempt.cancelled || this.softapAttempt !== attempt) {\n softapTraceFailure(\"softap_attempt_cancelled\", {\n attempt: attempt.id,\n after,\n attemptAgeMs: Date.now() - attempt.startedAt,\n // Two different causes with one outcome: the wearer asked to leave, or a second join\n // took the slot. They need different fixes, so they are not collapsed here.\n cause: attempt.cancelled ? \"retired\" : \"superseded\",\n current: this.softapAttempt?.id ?? \"none\",\n })\n throw new SoftapCallError(\"hotspot\", \"CANCELLED\", \"The call was cancelled while it was starting\")\n }\n }\n\n /** Publishes a checklist snapshot, unless this attempt has already been superseded. */\n private emitSoftapProgress(attempt: SoftapAttempt, progress: SoftapProgress): void {\n if (this.softapAttempt !== attempt || attempt.cancelled) {\n // A dropped checklist is why a stalled join used to look like a stuck UI: the wearer's last\n // row was written by an attempt that no longer owned the call, and nothing said so.\n softapTrace(\"softap_progress_dropped\", {\n attempt: attempt.id,\n phase: progress.phase,\n traceId: progress.traceId,\n cause: attempt.cancelled ? \"retired\" : \"superseded\",\n current: this.softapAttempt?.id ?? \"none\",\n })\n return\n }\n attempt.progress = progress\n // A reservation waiting behind another call must not inherit that call's connected state.\n const current = attempt.transport ? acsMeetingService.getState() : {state: \"connecting\", muted: false}\n this.sendToMiniapp(attempt.packageName, {\n type: MiniappResponseType.MEETING_STATE,\n ...current,\n // Before the ACS join there is no native state yet, so the phase reads `connecting`: the\n // join *is* in progress, and `idle` would make the miniapp think the call ended.\n state: current.state === \"idle\" ? \"connecting\" : current.state,\n softap: progress,\n ...this.softapRecoveryFields(attempt),\n })\n }\n\n private softapRecoveryFields(attempt: SoftapAttempt | null | undefined): {recovery?: {\n active: boolean\n generation?: number\n deadlineAt?: number\n phase?: string\n }} {\n if (!attempt?.recoveryDeadlineAt) return {}\n return {\n recovery: {\n active: attempt.recoveryActive,\n generation: attempt.transport?.currentMediaGeneration(),\n deadlineAt: attempt.recoveryDeadlineAt,\n phase: attempt.transport?.currentPhase(),\n },\n }\n }\n\n /**\n * Narrates preflight work on the first row while it is still pending.\n *\n * Permissions, mobile data, and the ACS sign-in take most of a minute between them and happen\n * before the transport exists, so without this the wearer watches five pending rows and\n * concludes the app has hung. No new step and no protocol change: it is the `hotspot` row's\n * detail, which the connecting screen renders as its one sub-line until step 1 starts.\n */\n private narrateSoftapPreflight(attempt: SoftapAttempt, detail: string): void {\n this.emitSoftapProgress(attempt, {\n ...attempt.progress,\n elapsedMs: Date.now() - attempt.startedAt,\n steps: attempt.progress.steps.map((step) => (step.step === \"hotspot\" ? {...step, detail} : step)),\n })\n }\n\n private async runSoftapAttempt(\n attempt: SoftapAttempt,\n previous: SoftapAttempt | null,\n args: {meetingUrl: string; token: string; displayName?: string; video?: AcsOutgoingVideo; origin?: AcsCallOrigin},\n ): Promise<MeetingState> {\n const packageName = attempt.packageName\n if (previous) {\n this.narrateSoftapPreflight(attempt, \"Finishing the previous call’s cleanup…\")\n softapTrace(\"softap_join_superseding\", {\n previousAttempt: previous.id,\n previousAgeMs: Date.now() - previous.startedAt,\n previousPhase: previous.progress.phase,\n packageName,\n })\n await this.retireSoftapAttempt({attempt: previous}).catch(() => undefined)\n await awaitCleanupBarrier({\n settled: previous.settled,\n settledDone: previous.settledDone,\n narrate: (detail) => this.narrateSoftapPreflight(attempt, detail),\n narrateAfterMs: SOFTAP_CLEANUP_NARRATE_AFTER_MS,\n attempt: attempt.id,\n waitingFor: `attempt ${previous.id} teardown`,\n })\n }\n this.checkpointSoftapAttempt(attempt, \"cleanup barrier\")\n const cleanupError = this.softapCleanupError\n if (cleanupError) {\n // Cleared on read, so this refuses at most once and the next attempt always gets through —\n // which is why the wearer is told to retry rather than to go power-cycle anything. The\n // native reason stays in the trace: it names a leaked port, not something they can act on.\n this.softapCleanupError = null\n softapTraceFailure(\"softap_join_refused\", {packageName, reason: cleanupError})\n throw new Error(\"Previous call cleanup has not finished yet. Please try joining again.\")\n }\n attempt.releaseHotspot = acquireGlassesHotspot()\n attempt.ownsResources = true\n this.narrateSoftapPreflight(attempt, \"Checking the Nearby devices permission…\")\n const permissionStartedAt = Date.now()\n if (!(await permissions.check(PermissionFeatures.LOCAL_WIFI))) {\n this.checkpointSoftapAttempt(attempt, \"permission check\")\n softapTrace(\"softap_permission_prompt\", {attempt: attempt.id, permission: \"LOCAL_WIFI\"})\n const granted = await permissions.request(PermissionFeatures.LOCAL_WIFI)\n this.checkpointSoftapAttempt(attempt, \"permission prompt\")\n softapTrace(\"softap_permission_result\", {\n attempt: attempt.id,\n granted,\n // The prompt is modal, so this is the wearer's own reaction time and the single largest\n // unexplained gap in a first-run join.\n durationMs: Date.now() - permissionStartedAt,\n })\n if (!granted) {\n throw new Error(\"Nearby devices permission is required to join the glasses hotspot\")\n }\n }\n this.checkpointSoftapAttempt(attempt, \"permissions\")\n const transport = new SoftapCallTransport(\n createSoftapCallDeps({\n packageName,\n meetingUrl: args.meetingUrl,\n token: args.token,\n displayName: args.displayName,\n video: args.video,\n awaitFirstFrame: (_report, options) =>\n acsMeetingService.waitForFirstFrame(SOFTAP_FIRST_FRAME_MS, options),\n waitUntilLive: (timeoutMs) => acsMeetingService.waitUntilMediaLive(timeoutMs),\n subsystems: {\n setHotspotState: async (enabled) => {\n const status = await this.setGlassesHotspotState(enabled)\n if (status.state === \"enabled\") {\n return {state: status.state, ssid: status.ssid, password: status.password, localIp: status.localIp}\n }\n return {state: status.state}\n },\n isWifiEnabled: async () => {\n // A host that cannot answer reports \"on\" so the preflight stands aside; the native\n // throw at scopedJoin is what covers those platforms.\n const enabled = await acsMeetingService.isWifiEnabled()\n return enabled ?? true\n },\n joinScopedNetwork: (ssid, passphrase, gateway) =>\n acsMeetingService.joinScopedNetwork(ssid, passphrase, gateway),\n leaveScopedNetwork: () => acsMeetingService.leaveScopedNetwork(),\n cancelScopedNetworkJoin: () => acsMeetingService.cancelScopedNetworkJoin(),\n probeGateway: async () => {\n const verdict = await acsMeetingService.probeScopedGateway()\n // No native probe means no verdict, and the orchestrator must not read that as \"down\".\n return verdict ?? {reachable: true, detail: \"probe unsupported on this host\"}\n },\n awaitValidatedDefaultNetwork: () => acsMeetingService.awaitValidatedDefaultNetwork(),\n onGlassesStreamStatus: (listener) => {\n const sub = BluetoothSdk.addListener(\"stream_status\", (event) => {\n // The glasses narrate over BLE, which is slow enough that a status from the previous\n // publish can land after this attempt was retired — and it is narration, so it would\n // be written straight onto the new call's checklist as if it were happening now.\n if (this.softapAttempt !== attempt || attempt.cancelled) {\n softapTrace(\"softap_stale_callback\", {\n source: \"glasses_stream_status\",\n attempt: attempt.id,\n status: event.status,\n current: this.softapAttempt?.id ?? \"none\",\n })\n return\n }\n listener({\n status: event.status,\n streamId: event.streamId,\n reason: \"reason\" in event && typeof event.reason === \"string\" ? event.reason : undefined,\n error: \"error\" in event && typeof event.error === \"string\" ? event.error : undefined,\n })\n })\n return () => sub.remove()\n },\n joinMeeting: (pkg, options) =>\n acsMeetingService.join(pkg, {\n meetingUrl: options.meetingUrl,\n token: options.token,\n videoSource: options.videoSource,\n displayName: options.displayName,\n origin: args.origin,\n ...(args.video ? {video: args.video} : {}),\n }),\n leaveMeeting: (pkg) => acsMeetingService.leave(pkg),\n endMeeting: async (pkg) => {\n await acsMeetingService.endForEveryone(pkg)\n },\n ingestUrl: () => acsMeetingService.softApIngestUrl(),\n glassesLc3Uplink: () => acsMeetingService.glassesLc3UplinkActive(),\n startPublishing: (pkg, options) => phoneStreamCoordinator.startUnmanaged(pkg, options),\n stopPublishing: (pkg) => phoneStreamCoordinator.stop(pkg),\n discardPendingBleStop: () => phoneStreamCoordinator.discardPendingBleStop(),\n rebindIngest: async (report) => {\n report?.(\"Rebinding the glasses video receiver on the hotspot\")\n const ingestUrl = await acsMeetingService.rebindSoftApIngest()\n if (!ingestUrl) throw new Error(\"the rebound meeting reported no ingest URL\")\n report?.(`Receiver rebound at ${ingestUrl}`)\n return {ingestUrl}\n },\n },\n }),\n )\n attempt.transport = transport\n // A hotspot that vanishes mid-call is a real failure and a normal teardown is not, so both\n // guards are checked: the attempt must still be the current one (a stale event from a finished\n // call must never touch the next one) and it must not already be terminating. The unsubscribe\n // lives on the attempt, so retiring attempt N cannot clear attempt N+1's listener. Teardown\n // itself is left to the miniapp's terminal path, which calls `meeting.leave` — one owner.\n attempt.scopedLostUnsub = acsMeetingService.onScopedNetworkLost((error) => {\n if (this.softapAttempt !== attempt || attempt.cancelled) {\n console.log(\"[LocalMiniappRuntime] scoped loss for a superseded SoftAP call; ignoring\", error)\n softapTrace(\"softap_scoped_loss_dropped\", {\n attempt: attempt.id,\n code: error.code,\n cause: attempt.cancelled ? \"retired\" : \"superseded\",\n current: this.softapAttempt?.id ?? \"none\",\n })\n return\n }\n if (transport.isTerminating()) {\n console.log(\"[LocalMiniappRuntime] scoped loss during teardown; expected\", error)\n softapTrace(\"softap_scoped_loss_dropped\", {attempt: attempt.id, code: error.code, cause: \"terminating\"})\n return\n }\n console.warn(\"[LocalMiniappRuntime] SoftAP hotspot lost mid-call\", error)\n softapTraceFailure(\"softap_scoped_loss_reported\", {\n attempt: attempt.id,\n code: error.code,\n reason: error.message,\n attemptAgeMs: Date.now() - attempt.startedAt,\n })\n this.beginSoftapRecovery(attempt, transport, error)\n })\n\n // Sign in on the phone's current internet *before* the glasses hotspot takes DNS. On device,\n // createCallAgent after the scoped join timed out at 20s and only finished once SoftAP was\n // released. It also waits for validated mobile data, which is why the wearer is told one\n // honest thing about the whole window rather than nothing at all.\n this.narrateSoftapPreflight(attempt, \"Signing in to Teams…\")\n const prepareStartedAt = Date.now()\n softapTrace(\"softap_prepare_agent_begin\", {attempt: attempt.id})\n try {\n await acsMeetingService.prepareAgent({token: args.token, displayName: args.displayName})\n } catch (error) {\n softapTraceFailure(\"softap_prepare_agent_failed\", {\n attempt: attempt.id,\n reason: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - prepareStartedAt,\n })\n throw error\n }\n softapTrace(\"softap_prepare_agent_done\", {attempt: attempt.id, durationMs: Date.now() - prepareStartedAt})\n this.checkpointSoftapAttempt(attempt, \"prepareAgent\")\n await transport.start({\n // What the wearer has been reading for the last minute, so the first snapshot does not\n // blank it.\n initialSteps: attempt.progress.steps,\n // Every transition reaches the miniapp as a meeting-state event carrying the checklist.\n onProgress: (progress) => this.emitSoftapProgress(attempt, progress),\n })\n this.checkpointSoftapAttempt(attempt, \"transport.start\")\n const state = acsMeetingService.getState()\n softapTrace(\"softap_attempt_live\", {\n attempt: attempt.id,\n state: state.state,\n micTransport: state.micTransport ?? \"unknown\",\n attemptAgeMs: Date.now() - attempt.startedAt,\n })\n return state\n }\n\n /**\n * SoftAP loss is a media outage. Keep ACS, destroy generation N, wait for the glasses,\n * then build generation N+1. Duplicate losses do not renew the deadline.\n */\n private beginSoftapRecovery(\n attempt: SoftapAttempt,\n transport: SoftapCallTransport,\n error: {code: string; message: string},\n ): void {\n // Gate on the live flag, not the promise: a settled Promise is still truthy, so a second\n // walk-away after a successful re-arm was dropped as \"in-flight\" and the glasses kept\n // POSTing WHIP at a hotspot the phone had already left.\n if (attempt.recoveryActive) {\n softapTrace(\"softap_recovery_dropped\", {attempt: attempt.id, cause: \"in-flight\"})\n return\n }\n if (attempt.cancelled || this.softapAttempt !== attempt) {\n softapTrace(\"softap_recovery_dropped\", {\n attempt: attempt.id,\n cause: attempt.cancelled ? \"retired\" : \"superseded\",\n })\n return\n }\n const lostAt = Date.now()\n attempt.recoveryDeadlineAt = lostAt + RETURN_DEADLINE_MS\n attempt.recoveryActive = true\n this.emitSoftapProgress(attempt, transport.progress())\n softapTrace(\"softap_recovery_begin\", {\n attempt: attempt.id,\n deadlineAt: attempt.recoveryDeadlineAt,\n mediaGeneration: transport.currentMediaGeneration(),\n reason: error.message,\n })\n\n let run!: Promise<void>\n run = (async () => {\n try {\n await transport.recover(`${error.code}: ${error.message}`, {\n wait: async () => {\n const remaining = (attempt.recoveryDeadlineAt ?? 0) - Date.now()\n if (remaining <= 0) {\n throw new SoftapCallError(\"hotspot\", \"RETURN_DEADLINE\", \"The glasses did not return in time\")\n }\n const ready = await this.waitForGlassesReturn(remaining, () => attempt.cancelled)\n if (attempt.cancelled || this.softapAttempt !== attempt) {\n throw new SoftapCallError(\"hotspot\", \"CANCELLED\", \"SoftAP recovery was cancelled\")\n }\n if (!ready) {\n throw new SoftapCallError(\"hotspot\", \"RETURN_DEADLINE\", \"The glasses did not return in time\")\n }\n },\n })\n if (attempt.cancelled || this.softapAttempt !== attempt) return\n this.emitSoftapProgress(attempt, transport.progress())\n const current = acsMeetingService.getState()\n this.sendToMiniapp(attempt.packageName, {\n type: MiniappResponseType.MEETING_STATE,\n ...current,\n softap: transport.progress(),\n ...this.softapRecoveryFields(attempt),\n })\n softapTrace(\"softap_recovery_live\", {\n attempt: attempt.id,\n mediaGeneration: transport.currentMediaGeneration(),\n elapsedMs: Date.now() - lostAt,\n })\n } catch (recoveryError) {\n if (attempt.cancelled || this.softapAttempt !== attempt) return\n const message = recoveryError instanceof Error ? recoveryError.message : String(recoveryError)\n softapTraceFailure(\"softap_recovery_failed\", {\n attempt: attempt.id,\n reason: message,\n elapsedMs: Date.now() - lostAt,\n })\n const current = acsMeetingService.getState()\n this.sendToMiniapp(attempt.packageName, {\n type: MiniappResponseType.MEETING_STATE,\n ...current,\n state: \"error\",\n error: `SOFTAP_NETWORK_LOST: ${error.message}`,\n softap: transport.progress(),\n recovery: {\n active: false,\n generation: transport.currentMediaGeneration(),\n deadlineAt: attempt.recoveryDeadlineAt ?? undefined,\n phase: transport.currentPhase(),\n },\n })\n } finally {\n attempt.recoveryActive = false\n if (attempt.recovery === run) attempt.recovery = null\n }\n })()\n attempt.recovery = run\n }\n\n /**\n * Wait for a link the hotspot commands can actually use.\n *\n * The hotspot goes away a couple of seconds before the phone declares the BLE link dead, so the\n * snapshot at loss time still reads \"ready\". Taking that at face value sent `set_hotspot_state`\n * into a dying link twice, and each one burned its full timeout before the wearer was even back.\n * Requiring the link to hold steady turns that into waiting, which is what the budget is for.\n */\n private async waitForGlassesReturn(timeoutMs: number, cancelled: () => boolean): Promise<boolean> {\n const deadlineAt = Date.now() + timeoutMs\n while (!cancelled()) {\n const remaining = deadlineAt - Date.now()\n if (remaining <= 0) return false\n if (!isGlassesReady(useGlassesStore.getState().connection) && !(await this.awaitGlassesReady(remaining, cancelled))) {\n return false\n }\n const settleMs = Math.min(GLASSES_LINK_SETTLE_MS, Math.max(0, deadlineAt - Date.now()))\n if (await this.glassesLinkHoldsSteady(settleMs, cancelled)) return true\n }\n return false\n }\n\n private awaitGlassesReady(timeoutMs: number, cancelled: () => boolean): Promise<boolean> {\n const controller = new AbortController()\n const poll = setInterval(() => {\n if (cancelled()) controller.abort()\n }, 250)\n return waitForGlassesReady({\n getConnection: () => useGlassesStore.getState().connection,\n subscribe: (listener) => useGlassesStore.subscribe((state) => state.connection, listener),\n timeoutMs,\n signal: controller.signal,\n }).finally(() => clearInterval(poll))\n }\n\n /** True when the link stays ready for [ms]; false the moment it drops again. */\n private glassesLinkHoldsSteady(ms: number, cancelled: () => boolean): Promise<boolean> {\n if (ms <= 0) return Promise.resolve(isGlassesReady(useGlassesStore.getState().connection))\n return new Promise<boolean>((resolve) => {\n let done = false\n const settle = (steady: boolean) => {\n if (done) return\n done = true\n clearTimeout(timer)\n clearInterval(poll)\n unsubscribe()\n resolve(steady)\n }\n const unsubscribe = useGlassesStore.subscribe(\n (state) => state.connection,\n (connection) => {\n if (!isGlassesReady(connection)) settle(false)\n },\n )\n const poll = setInterval(() => {\n if (cancelled()) settle(false)\n }, 250)\n const timer = setTimeout(() => settle(true), ms)\n })\n }\n\n /**\n * Cancels a SoftAP attempt and does not return until everything it owns has been released.\n *\n * This is the barrier the whole design rests on: \"leave returned\" has to mean \"nothing from that\n * call is still in flight\", or the next Start races the previous call's cleanup through the same\n * hotspot. There is deliberately no deadline — a native call that never returns holds the next\n * call back rather than letting it race — and a watchdog only says so in the log.\n *\n * Safe to call when there is no attempt, and safe to call twice: the teardown is single-flight\n * per attempt, so a leave and the join's own failure path share one unwind.\n */\n private async retireSoftapAttempt(options: {attempt?: SoftapAttempt; mode?: SoftapTeardownMode} = {}): Promise<void> {\n const attempt = options.attempt ?? this.softapAttempt\n if (!attempt) {\n // Not an error — every terminal path calls this without checking — but a Leave that found\n // nothing to retire and a Leave that tore a call down are very different log entries.\n softapTrace(\"softap_retire_noop\", {mode: options.mode ?? \"leave\"})\n return\n }\n attempt.cancelled = true\n // Keep the retiring attempt discoverable until both its join and cleanup settle.\n // A newer reservation replaces it immediately, but must still wait on its barrier.\n softapTrace(\"softap_retire_begin\", {\n attempt: attempt.id,\n mode: options.mode ?? \"leave\",\n attemptAgeMs: Date.now() - attempt.startedAt,\n phase: attempt.progress.phase,\n // Second and later callers join the first one's teardown rather than running their own, and\n // that sharing is what makes a leave racing a failed join safe.\n teardownAlreadyRunning: Boolean(attempt.teardown),\n })\n if (!attempt.teardown) {\n attempt.teardown = this.teardownSoftapAttempt(attempt, options.mode)\n // The barrier closes over the join body as well as the teardown, and opens only when both\n // have stopped. A watchdog reports a cleanup that is taking too long; it never declares one\n // finished, because \"probably done by now\" is exactly the assumption that broke restarts.\n const stallWatchdog = setTimeout(() => {\n console.warn(\"[LocalMiniappRuntime] softap_cleanup_stalled\", {\n attempt: attempt.id,\n afterMs: SOFTAP_CLEANUP_STALL_LOG_MS,\n })\n }, SOFTAP_CLEANUP_STALL_LOG_MS)\n void Promise.allSettled([\n attempt.teardown,\n attempt.body ?? Promise.resolve(),\n attempt.recovery ?? Promise.resolve(),\n ]).then(() => {\n clearTimeout(stallWatchdog)\n attempt.markSettled()\n if (this.softapAttempt === attempt) this.softapAttempt = null\n })\n }\n const awaitedFrom = Date.now()\n try {\n await attempt.teardown\n } catch (error) {\n // Only a refused End reaches here; the local unwind has completed either way, which is the\n // distinction the wearer's copy depends on.\n softapTraceFailure(\"softap_retire_done\", {\n attempt: attempt.id,\n waitedMs: Date.now() - awaitedFrom,\n reason: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n softapTrace(\"softap_retire_done\", {attempt: attempt.id, waitedMs: Date.now() - awaitedFrom})\n }\n\n /**\n * Releases everything one attempt could own, in the reverse of the order it was taken.\n *\n * The scoped network and the ACS agent are released unconditionally, not only when the transport\n * built them: `prepareAgent` signs in and pins this whole process to cellular *before* the\n * transport exists, so a Cancel during sign-in would otherwise leave both behind. Both releases\n * are idempotent.\n *\n * Failures are collected rather than swallowed. Reporting a clean teardown that did not happen\n * is what lets the next call start on leaked state.\n */\n private async teardownSoftapAttempt(attempt: SoftapAttempt, mode?: SoftapTeardownMode): Promise<void> {\n // A cancelled reservation waiting behind another call never acquired any shared resources.\n // Its cleanup must not release the preceding call's native agent or network.\n if (!attempt.ownsResources) return\n // Terminal intent before the first release, so the scoped network we are about to drop cannot\n // be reported as a hotspot that walked away.\n acsMeetingService.beginScopedTeardown()\n const failures: string[] = []\n let endFailure: unknown = null\n const teardownStartedAt = Date.now()\n softapTrace(\"softap_teardown_begin\", {\n attempt: attempt.id,\n mode: mode ?? \"leave\",\n hasTransport: Boolean(attempt.transport),\n steps: attempt.transport?.activeSteps().join(\",\") ?? \"\",\n })\n /**\n * One line per resource, whether it released or not.\n *\n * The releases below are sequential and every one of them can block on a native call, so a\n * teardown that takes half a minute is only readable if each step says how long it took. A\n * step that never reports is the one that hung.\n */\n const releaseStep = async (step: string, release: () => Promise<void>): Promise<unknown> => {\n const startedAt = Date.now()\n try {\n await release()\n softapTrace(\"softap_teardown_step\", {\n attempt: attempt.id,\n step,\n outcome: \"ok\",\n durationMs: Date.now() - startedAt,\n })\n return null\n } catch (error) {\n softapTraceFailure(\"softap_teardown_step\", {\n attempt: attempt.id,\n step,\n outcome: \"failed\",\n durationMs: Date.now() - startedAt,\n reason: error instanceof Error ? error.message : String(error),\n })\n return error\n }\n }\n const transport = attempt.transport\n if (transport) {\n // The only thing `stop()` throws is a refused End — the local teardown still completed,\n // so this is the caller's business, not a reason to block the next call.\n endFailure = await releaseStep(\"transport.stop\", () => transport.stop(mode ? {mode} : {}))\n const undoFailures = transport.lastTeardownFailures()\n // A hotspot that did not ACK off is leftover ON — the next join wants it on and will\n // call setHotspotState(true). Refusing that join is how we got hotspot_off_ack_timeout\n // as a wearer-facing \"power-cycle the glasses\" dead end.\n const blockingUndos = undoFailures.filter((step) => step !== \"hotspot\")\n if (blockingUndos.length > 0) failures.push(`could not release ${blockingUndos.join(\", \")}`)\n if (undoFailures.includes(\"hotspot\")) {\n console.warn(\"[LocalMiniappRuntime] glasses hotspot undo timed out; next join will raise it again\", {\n attempt: attempt.id,\n })\n }\n }\n const scopedFailure = await releaseStep(\"leaveScopedNetwork\", () => acsMeetingService.leaveScopedNetwork())\n if (scopedFailure) {\n failures.push(\n `leaveScopedNetwork: ${scopedFailure instanceof Error ? scopedFailure.message : String(scopedFailure)}`,\n )\n }\n // Stay pinned across this wait. Unpinning onto a leftover glasses AP is what made the next\n // Start Call's `teams:create` return `Request failed (503)` — Cloudflare, no internet, not a\n // Teams configuration problem.\n const defaultNetworkStartedAt = Date.now()\n let defaultNetworkOk = false\n try {\n const network = await acsMeetingService.awaitDefaultNetworkAfterHotspot()\n defaultNetworkOk = true\n softapTrace(\"softap_teardown_step\", {\n attempt: attempt.id,\n step: \"awaitValidatedDefaultNetwork\",\n outcome: \"ok\",\n durationMs: Date.now() - defaultNetworkStartedAt,\n // Null is \"this host cannot tell\", which is a different fact from an unusable route, and\n // the cellular pin is dropped on the strength of this answer.\n network: network?.detail ?? \"unknown\",\n usable: network?.usable ?? \"unknown\",\n })\n } catch (error) {\n console.warn(\"[LocalMiniappRuntime] default network after SoftAP teardown is unverified\", {\n attempt: attempt.id,\n error: error instanceof Error ? error.message : String(error),\n })\n softapTraceFailure(\"softap_teardown_step\", {\n attempt: attempt.id,\n step: \"awaitValidatedDefaultNetwork\",\n outcome: \"failed\",\n durationMs: Date.now() - defaultNetworkStartedAt,\n reason: error instanceof Error ? error.message : String(error),\n })\n }\n const defaultNetworkMs = Date.now() - defaultNetworkStartedAt\n const acsLeaveStartedAt = Date.now()\n let acsLeaveOk = false\n try {\n const outcome = await acsMeetingService.leaveAndAwait(attempt.packageName)\n acsLeaveOk = outcome.completed\n softapTrace(\"softap_teardown_step\", {\n attempt: attempt.id,\n step: \"acsLeaveAndAwait\",\n // `completed=false` is not a failure and is not recorded as one: the build simply cannot\n // confirm its own cleanup, so the next call's barrier is the only guarantee left.\n outcome: outcome.completed ? \"ok\" : \"unconfirmed\",\n reason: outcome.reason ?? \"\",\n durationMs: Date.now() - acsLeaveStartedAt,\n })\n if (!outcome.completed) {\n console.warn(\"[LocalMiniappRuntime] ACS cleanup completion is unverified on this build\", {\n attempt: attempt.id,\n reason: outcome.reason,\n })\n }\n } catch (error) {\n softapTraceFailure(\"softap_teardown_step\", {\n attempt: attempt.id,\n step: \"acsLeaveAndAwait\",\n outcome: \"failed\",\n durationMs: Date.now() - acsLeaveStartedAt,\n reason: error instanceof Error ? error.message : String(error),\n })\n failures.push(`ACS leave: ${error instanceof Error ? error.message : String(error)}`)\n }\n const hadScopedLostListener = Boolean(attempt.scopedLostUnsub)\n attempt.scopedLostUnsub?.()\n attempt.scopedLostUnsub = null\n softapTrace(\"softap_teardown_step\", {\n attempt: attempt.id,\n step: \"scopedLostListener\",\n outcome: hadScopedLostListener ? \"ok\" : \"not taken\",\n })\n failures.push(\n ...(await this.settleSoftapTeardown(attempt, {\n acsLeave: {ok: acsLeaveOk, durationMs: Date.now() - acsLeaveStartedAt},\n defaultNetwork: {ok: defaultNetworkOk, durationMs: defaultNetworkMs},\n })),\n )\n if (failures.length > 0) {\n this.softapCleanupError = failures.join(\"; \")\n console.warn(\"[LocalMiniappRuntime] softap_cleanup_failed\", {attempt: attempt.id, failures})\n }\n // The recorded failures are what the *next* join refuses on, so they are logged as the list\n // that will be quoted back to the wearer rather than only as the individual step failures.\n softapTrace(\"softap_teardown_done\", {\n attempt: attempt.id,\n durationMs: Date.now() - teardownStartedAt,\n refusesNextCall: failures.length > 0,\n failures: failures.join(\"; \"),\n endRefused: Boolean(endFailure),\n })\n attempt.releaseHotspot?.()\n attempt.releaseHotspot = undefined\n if (endFailure) throw endFailure\n }\n\n /**\n * Send one hotspot command, re-sending it once if a session refresh cancelled it.\n *\n * The retry lives inside the unit chained onto [glassesHotspotCommand] rather than around it,\n * which is what holds the invariant: one logical hotspot operation issues at most two native\n * commands, and no later operation runs between them. A retry outside the queue would let an\n * `on` land between the two halves of an `off` and leave the glasses in the opposite state.\n *\n * Re-sending is free because ASG compares against current state first and answers a same-state\n * command with its current status instead of cycling the AP.\n */\n private setGlassesHotspotState(enabled: boolean) {\n const send = async () => {\n try {\n return await BluetoothSdk.setHotspotState(enabled)\n } catch (error) {\n const code = (error as {code?: string} | null | undefined)?.code\n if (!code || !HOTSPOT_SESSION_REFRESH_CODES.has(code)) throw error\n softapTrace(\"softap_hotspot_session_retry\", {enabled, code})\n await new Promise<void>((resolve) => setTimeout(resolve, HOTSPOT_SESSION_RETRY_DELAY_MS))\n return await BluetoothSdk.setHotspotState(enabled)\n }\n }\n const run = this.glassesHotspotCommand.then(send, send)\n this.glassesHotspotCommand = run.then(\n () => undefined,\n () => undefined,\n )\n return run\n }\n\n /**\n * The last two gates, and the point where a timeout stops being treated as consent.\n *\n * Four things have to be true before the next call may start: this device is out of the ACS\n * call, the WHIP listener's port is released, the glasses have acknowledged their hotspot off,\n * and the phone has a validated default route again. The first and last already ran; this adds\n * the two that were never waited for at all, and the ones that produced the stop-then-start\n * failure — the listener was still inside its 3s tombstone and the glasses AP was still up.\n *\n * A bound that expires is not success. It means the resource is still held by a call nobody is\n * in any more, so it is taken by force and re-verified. An ingest port that is still held\n * refuses the next join. A glasses hotspot that missed its off-ack does not — the next join\n * wants the AP up and will raise it again.\n *\n * @returns failures to record; a non-empty list refuses the next join.\n */\n private async settleSoftapTeardown(\n attempt: SoftapAttempt,\n earlier: {acsLeave: {ok: boolean; durationMs: number}; defaultNetwork: {ok: boolean; durationMs: number}},\n ): Promise<string[]> {\n const ingestStartedAt = Date.now()\n let ingestClosed = false\n try {\n ingestClosed = await acsMeetingService.awaitIngestClosed(SOFTAP_INGEST_CLOSE_WAIT_MS)\n } catch (error) {\n softapTraceFailure(\"softap_teardown_step\", {\n attempt: attempt.id,\n step: \"awaitIngestClosed\",\n outcome: \"failed\",\n reason: error instanceof Error ? error.message : String(error),\n })\n }\n const ingestMs = Date.now() - ingestStartedAt\n\n const hotspotStartedAt = Date.now()\n let hotspotOff = false\n let hotspotReason = \"\"\n try {\n // Idempotent by design — the command asks for \"disabled\" rather than toggling — so sending\n // it again after the transport's own stop costs nothing and is the only way to get an ack\n // that is bound to a deadline we chose.\n const status = await withTimeout(\n this.setGlassesHotspotState(false),\n SOFTAP_HOTSPOT_OFF_ACK_MS,\n \"hotspot_off_ack_timeout\",\n )\n hotspotOff = status.state === \"disabled\"\n hotspotReason = status.state\n } catch (error) {\n hotspotReason = error instanceof Error ? error.message : String(error)\n }\n const hotspotMs = Date.now() - hotspotStartedAt\n\n softapTrace(\"softap_teardown_settled\", {\n attempt: attempt.id,\n acsLeaveMs: earlier.acsLeave.durationMs,\n acsLeaveOk: earlier.acsLeave.ok,\n ingestClosedMs: ingestMs,\n ingestClosed,\n hotspotOffMs: hotspotMs,\n hotspotOff,\n hotspotDetail: hotspotReason,\n defaultNetworkMs: earlier.defaultNetwork.durationMs,\n defaultNetworkOk: earlier.defaultNetwork.ok,\n })\n\n if (ingestClosed && hotspotOff) return []\n return this.forceSoftapCleanup(attempt, {ingestClosed, hotspotOff, hotspotReason})\n }\n\n /**\n * Take back what the bounded waits could not confirm was released.\n *\n * Runs only after a gate timed out, and re-verifies rather than assuming: the whole reason the\n * barrier exists is that \"it has probably finished by now\" is what broke restarts.\n */\n private async forceSoftapCleanup(\n attempt: SoftapAttempt,\n gates: {ingestClosed: boolean; hotspotOff: boolean; hotspotReason: string},\n ): Promise<string[]> {\n const failures: string[] = []\n softapTraceFailure(\"softap_teardown_forced\", {\n attempt: attempt.id,\n ingestClosed: gates.ingestClosed,\n hotspotOff: gates.hotspotOff,\n hotspotDetail: gates.hotspotReason,\n })\n if (!gates.ingestClosed) {\n try {\n await acsMeetingService.forceCloseIngest()\n // Re-asked, not assumed: `forceCloseIngest` skips the tombstone, so the latch should be\n // open immediately. A short bound here is enough and a failure is real.\n const closed = await acsMeetingService.awaitIngestClosed(SOFTAP_FORCED_VERIFY_MS)\n if (!closed) failures.push(\"the video receiver did not release its port\")\n } catch (error) {\n failures.push(`forced ingest close: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n if (!gates.hotspotOff) {\n try {\n const status = await withTimeout(\n this.setGlassesHotspotState(false),\n SOFTAP_HOTSPOT_OFF_ACK_MS,\n \"hotspot_off_ack_timeout\",\n )\n if (status.state !== \"disabled\") {\n console.warn(\"[LocalMiniappRuntime] glasses hotspot still reported after disable; next join will raise it\", {\n attempt: attempt.id,\n state: status.state,\n })\n }\n } catch (error) {\n console.warn(\"[LocalMiniappRuntime] glasses hotspot off ack missed; next join will raise it\", {\n attempt: attempt.id,\n reason: error instanceof Error ? error.message : String(error),\n })\n }\n }\n softapTrace(\"softap_teardown_forced_done\", {\n attempt: attempt.id,\n recovered: failures.length === 0,\n failures: failures.join(\"; \"),\n })\n return failures\n }\n\n private async handleMeetingLeave(packageName: string, requestId?: string): Promise<void> {\n const startedAt = Date.now()\n softapTrace(\"meeting_leave_request\", {\n packageName,\n requestId: requestId ?? \"none\",\n attempt: this.softapAttempt?.id ?? \"none\",\n })\n try {\n // A SoftAP call owns the hotspot, the scoped network, and the cellular pin as well as the\n // ACS call, and retiring the attempt releases all of them. Returning before that finishes is\n // what let the next Start race this teardown.\n if (this.softapAttempt) {\n await this.retireSoftapAttempt()\n softapTrace(\"meeting_leave_result\", {\n packageName,\n requestId: requestId ?? \"none\",\n path: \"softap\",\n durationMs: Date.now() - startedAt,\n })\n this.sendResult(packageName, requestId, true)\n return\n }\n await acsMeetingService.leave(packageName)\n softapTrace(\"meeting_leave_result\", {\n packageName,\n requestId: requestId ?? \"none\",\n path: \"acs\",\n durationMs: Date.now() - startedAt,\n })\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n softapTraceFailure(\"meeting_leave_result\", {\n packageName,\n requestId: requestId ?? \"none\",\n reason: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - startedAt,\n })\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"ACS meeting leave failed\",\n })\n }\n }\n\n /**\n * End the meeting for everyone, then tear this device down.\n *\n * A rejection here always means \"the others may still be in the meeting\", never \"you are still in\n * it\": both paths below complete local teardown before the error surfaces.\n */\n private async handleMeetingEnd(packageName: string, requestId?: string): Promise<void> {\n const startedAt = Date.now()\n const softap = Boolean(this.softapAttempt)\n softapTrace(\"meeting_end_request\", {\n packageName,\n requestId: requestId ?? \"none\",\n attempt: this.softapAttempt?.id ?? \"none\",\n })\n try {\n if (this.softapAttempt) {\n await this.retireSoftapAttempt({mode: \"end\"})\n } else {\n await acsMeetingService.endForEveryone(packageName)\n }\n softapTrace(\"meeting_end_result\", {\n packageName,\n requestId: requestId ?? \"none\",\n path: softap ? \"softap\" : \"acs\",\n durationMs: Date.now() - startedAt,\n })\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n // A rejection here always means the others may still be in the meeting, never that this\n // device is — the log has to be readable that way round or it accuses the wrong side.\n softapTraceFailure(\"meeting_end_result\", {\n packageName,\n requestId: requestId ?? \"none\",\n reason: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - startedAt,\n })\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Could not end the meeting for everyone\",\n })\n }\n }\n\n private async handleMeetingSetMuted(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const startedAt = Date.now()\n try {\n const state = await acsMeetingService.setMuted(packageName, Boolean(payload.muted))\n softapTrace(\"meeting_set_muted\", {\n packageName,\n requestId: requestId ?? \"none\",\n requested: Boolean(payload.muted),\n muted: state.muted,\n durationMs: Date.now() - startedAt,\n })\n this.sendResult(packageName, requestId, true, state)\n } catch (err) {\n softapTraceFailure(\"meeting_set_muted\", {\n packageName,\n requestId: requestId ?? \"none\",\n requested: Boolean(payload.muted),\n reason: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - startedAt,\n })\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"ACS mute failed\",\n })\n }\n }\n\n private async handleMeetingUpdateVideoSource(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const videoSource = payload.videoSource as {type?: string; url?: string} | undefined\n const whepUrl = videoSource?.type === \"whep\" ? (videoSource.url ?? \"\") : \"\"\n if (!whepUrl) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: \"videoSource must be a WHEP URL\",\n })\n return\n }\n try {\n await acsMeetingService.updateVideoSource(packageName, whepUrl)\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"ACS video source update failed\",\n })\n }\n }\n\n private async handleMeetingGetState(packageName: string, requestId?: string): Promise<void> {\n try {\n const state = await acsMeetingService.readState(packageName)\n this.sendResult(packageName, requestId, true, state)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"ACS getState failed\",\n })\n }\n }\n\n /**\n * session.glasses.requestWifiSetup — open the phone's glasses Wi-Fi setup\n * flow. The host owns the actual UI via the `engine.configure({ui})` seam;\n * this just forwards the request and reports success/failure.\n */\n private async handleRequestWifiSetup(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const requestWifiSetup = getUiSeams().requestWifiSetup\n if (!requestWifiSetup) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_IMPLEMENTED,\n message: \"Wi-Fi setup is not configured on this host\",\n })\n return\n }\n try {\n await requestWifiSetup(payload.reason as string | undefined, packageName)\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Wi-Fi setup failed\",\n })\n }\n }\n\n /**\n * Wire the PhoneStreamCoordinator's status callback so coordinator-emitted\n * updates become `EVENT { streamType: \"stream_status\" }` envelopes on the\n * subscribing miniapp(s).\n */\n public wireStreamingStatusFanout(): void {\n const streaming = phoneStreamCoordinator\n if (!streaming) return\n streaming.setStatusSubscriber((packageName, update) => {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: \"stream_status\",\n data: {\n streamId: update.streamId,\n status: update.status,\n source: update.source,\n ...(update.data || {}),\n },\n })\n })\n }\n\n // ===========================================================================\n // Public subscribe helper\n // ===========================================================================\n\n /**\n * Standalone subscribe — lets external code subscribe a registered miniapp to\n * streams without going through the envelope protocol.\n *\n * Returns `{ok: true}` on success, or `{ok: false, error}` on failure.\n */\n public subscribe(packageName: string, streams: string[]): {ok: boolean; error?: string} {\n const app = this.connectedApps.get(packageName)\n if (!app) {\n return {ok: false, error: `App ${packageName} is not registered`}\n }\n\n if (!Array.isArray(streams)) {\n return {ok: false, error: \"streams must be an array\"}\n }\n\n console.log(`${LOG_TAG}: subscribe(${packageName}, [${streams.join(\", \")}])`)\n\n // Check microphone permission for mic-requiring streams\n const micStreams = [\"transcription\", \"translation\", \"audio_chunk\", \"vad\"]\n const needsMic = streams.some((s: string) => micStreams.some((m) => s.startsWith(m) || s === m))\n if (needsMic) {\n const hasMicPermission = app.installedManifest?.permissions?.some((p) => p.type === \"MICROPHONE\")\n if (!hasMicPermission) {\n return {ok: false, error: \"MICROPHONE permission not declared in miniapp.json\"}\n }\n }\n\n // Add new subscriptions\n const previousSubscriptions = app.subscriptions\n app.subscriptions = new Set(streams)\n app.forceLocalTranscriptionStreams.clear()\n app.cloudTranscriptionStreams = new Set(streams.filter((stream) => stream.startsWith(\"transcription:\")))\n this.replaceStreamSubscribers(packageName, previousSubscriptions, app.subscriptions)\n\n this.recomputeMicRequirements()\n this.updateCloudSubscriptions()\n return {ok: true}\n }\n\n // ===========================================================================\n // Mic requirements\n // ===========================================================================\n\n private getConfiguredMicGates(): {vadEnabled: boolean | null; loudnessGateEnabled: boolean | null} {\n const bluetoothSettings = useSettingsStore.getState().getBluetoothSettings()\n const configuredVad = bluetoothSettings.voice_activity_detection_enabled\n const configuredLoudnessGate = bluetoothSettings.loudness_gate_enabled\n return {\n vadEnabled: typeof configuredVad === \"boolean\" ? configuredVad : null,\n loudnessGateEnabled: typeof configuredLoudnessGate === \"boolean\" ? configuredLoudnessGate : null,\n }\n }\n\n private recomputeMicRequirements(): void {\n let anyPcm = false\n let anyLc3 = false\n for (const [stream, subscribers] of this.streamSubscribers) {\n if (subscribers.size === 0) continue\n if (stream === \"audio_chunk\") anyPcm = true\n if (stream.startsWith(\"transcription:\") || stream.startsWith(\"translation:\") || stream === \"vad\") anyLc3 = true\n }\n micStateCoordinator.setLocalRequirements({\n pcm: anyPcm,\n lc3: anyLc3,\n ...this.getConfiguredMicGates(),\n })\n }\n\n /**\n * Recompute the aggregated v2 cloud subscription list across all local miniapps.\n *\n * Cloud-dependent streams (transcription:*, translation:*) only flow if the\n * v2 runtime knows the phone wants them. Local-only streams (button_press, etc.)\n * are NOT sent — they come from the Bluetooth SDK, not from cloud.\n */\n private updateCloudSubscriptions(): void {\n const cloudStreams = new Set<string>()\n let transcriptionLang: string | null = null\n let forceLocalTranscriptionLang: string | null = null\n let hasForceLocalTranscription = false\n for (const [stream, subscribers] of this.streamSubscribers) {\n if (subscribers.size === 0) continue\n // Only transcription / translation need cloud delivery. Location and\n // notifications are sourced natively on the phone — no cloud hop.\n if (stream.startsWith(\"translation:\")) {\n cloudStreams.add(stream)\n }\n if (stream.startsWith(\"transcription:\")) {\n const language = stream.substring(\"transcription:\".length)\n if (transcriptionLang === null) transcriptionLang = language\n\n const routes = summarizeTranscriptionRoutes(subscribers, (packageName) =>\n this.appTranscriptionRoutesForSubscription(packageName, stream),\n )\n if (routes.hasForceLocalSubscriber) {\n hasForceLocalTranscription = true\n if (forceLocalTranscriptionLang === null) forceLocalTranscriptionLang = language\n }\n if (routes.hasCloudSubscriber) cloudStreams.add(stream)\n }\n }\n localSttFallbackCoordinator.onSubscriptionChange(\n transcriptionLang !== null,\n forceLocalTranscriptionLang ?? transcriptionLang,\n hasForceLocalTranscription,\n )\n\n // Mirror the same set as typed AudioSubscription[] and push it to the cloud\n // runtime.\n this.ensureCloudResultsWired()\n const subs = this.buildCloudAudioSubscriptions(cloudStreams)\n const nextKey = this.audioSubscriptionKey(subs)\n if (!this.cloudAudioSubscriptionSync.begin(nextKey)) return\n console.log(\n `${LOG_TAG}: updateCloudSubscriptions streams=[${Array.from(cloudStreams).join(\", \")}] cloudSubs=${subs.length}`,\n )\n cloudClientService\n .setSubscriptions(subs)\n .then(() => {\n this.cloudAudioSubscriptionSync.succeeded(nextKey)\n })\n .catch((err) => {\n // Best-effort: the cloud may not be connected yet. Keep failed writes\n // retryable; otherwise a reconnect that recomputes the same desired\n // transcription set gets deduped and local captions never recover.\n this.cloudAudioSubscriptionSync.failed(nextKey)\n console.warn(`${LOG_TAG}: cloud setSubscriptions failed: ${(err as Error)?.message ?? err}`)\n })\n }\n\n /**\n * Build the cloud `AudioSubscription[]` from the miniapp cloud-stream key set.\n *\n * Stream keys: `transcription:<lang>` (lang may be `auto`, `en-US`, …) and\n * `translation:<source>:<target>` (3 colon-parts; source/target may be `*`\n * or `auto` wildcards, target may also be `*`). The cloud protocol requires a\n * concrete `target: string` for translation, so wildcard-target translation\n * keys (`translation:<source>:*`, `translation:*:*`, `translation:auto`) have\n * no cloud equivalent and are skipped. Wildcard/`auto` SOURCE maps to\n * `{mode: \"auto\"}`.\n */\n private buildCloudAudioSubscriptions(cloudStreams: Set<string>): AudioSubscription[] {\n const subs: AudioSubscription[] = []\n // Union of every connected app's TRANSCRIPTION_CONFIG hints. Hints only\n // apply to the auto-mode TRANSCRIPTION subscription (the wire schema has\n // no hints field on specific-language sources — the language IS the hint\n // there), and are deliberately NOT attached to translation sources.\n const hintUnion = [...new Set([...this.transcriptionHintsByApp.values()].flat())].sort()\n const langSource = (code: string): LanguageSource =>\n code === \"auto\" || code === \"*\" ? {mode: \"auto\"} : {mode: \"specific\", code}\n for (const stream of cloudStreams) {\n if (stream.startsWith(\"transcription:\")) {\n const lang = stream.substring(\"transcription:\".length)\n const source = langSource(lang)\n subs.push({\n kind: \"transcription\",\n language: source.mode === \"auto\" && hintUnion.length > 0 ? {mode: \"auto\", hints: hintUnion} : source,\n })\n } else if (stream.startsWith(\"translation:\")) {\n const parts = stream.split(\":\")\n // Only `translation:<source>:<target>` maps cleanly; a concrete target\n // is required by the cloud schema.\n if (parts.length === 3) {\n const [, source, target] = parts\n if (target === \"*\") continue\n subs.push({kind: \"translation\", source: langSource(source), target})\n }\n }\n }\n return subs\n }\n\n private audioSubscriptionKey(subs: AudioSubscription[]): string {\n return JSON.stringify(\n subs\n .map((sub) => {\n if (sub.kind === \"transcription\") {\n return {\n kind: sub.kind,\n language: sub.language,\n }\n }\n return {\n kind: sub.kind,\n source: sub.source,\n target: sub.target,\n }\n })\n .sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b))),\n )\n }\n\n /**\n * Wire the cloud's transcription/translation results into the existing\n * miniapp fan-out exactly once. Maps each cloud result back to the\n * cloud-to-app data shape `forwardEvent` already forwards, keyed on the\n * `transcription:<lang>` / `translation:<source>:<target>` stream strings, so\n * subscribed miniapps receive identical envelopes.\n */\n private ensureCloudResultsWired(): void {\n if (this.cloudResultsWired) return\n this.cloudResultsWired = true\n\n cloudClientService.onTranscript((d: TranscriptionData) => {\n const receivedAt = Date.now()\n if (TRANSCRIPT_TIMING_TELEMETRY) {\n console.log(\n `${LOG_TAG}: transcript cloud_recv t=${receivedAt} final=${d.isFinal} lang=${\n d.resolvedLanguage\n } text=\"${d.text.slice(0, 48)}\"`,\n )\n }\n this.forwardEvent(\n `transcription:${d.resolvedLanguage}`,\n {\n type: \"transcription\",\n text: d.text,\n isFinal: d.isFinal,\n utteranceId: d.utteranceId,\n transcribeLanguage: d.resolvedLanguage,\n detectedLanguage: d.languageDetected ? d.resolvedLanguage : undefined,\n startTime: d.startMs,\n endTime: d.endMs,\n speakerId: d.speakerId,\n duration: d.durationMs,\n provider: d.provider,\n confidence: d.confidence,\n __hostReceivedAt: receivedAt,\n },\n \"cloud\",\n )\n })\n\n cloudClientService.onTranslation((d: TranslationData) => {\n this.forwardEvent(`translation:${d.source.language}:${d.target.language}`, {\n type: \"translation\",\n text: d.text,\n originalText: d.originalText,\n isFinal: d.isFinal,\n utteranceId: d.utteranceId,\n startTime: d.startMs,\n endTime: d.endMs,\n speakerId: d.speakerId,\n duration: d.durationMs,\n transcribeLanguage: d.source.language,\n translateLanguage: d.target.language,\n didTranslate: true,\n provider: d.provider,\n confidence: d.confidence,\n })\n })\n }\n\n private ensureCloudStatusWired(): void {\n if (this.cloudStatusWired) return\n this.cloudStatusWired = true\n\n cloudClientService.onStatusChanged((status) => {\n if (status.status === \"connected\") {\n this.updateCloudSubscriptions()\n // A miniapp that connected before the cloud client was ready never got\n // its auth token; now that we're connected, mint it without waiting for\n // the retry backoff (or a full manual reconnect).\n this.redriveMiniappAuthDelivery()\n }\n this.broadcastCloudStatus()\n })\n\n useSettingsStore.subscribe(\n (s) => s.getSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive),\n () => {\n this.broadcastCloudStatus()\n },\n )\n }\n\n private currentCloudStatus(): CloudClientStatusSnapshot {\n const base = cloudClientService.getStatus()\n const fallbackActive =\n (useSettingsStore.getState().getSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive) as boolean | undefined) ===\n true\n return {\n status: base.status,\n audioTransport: fallbackActive ? \"offline\" : base.audioTransport,\n }\n }\n\n private broadcastCloudStatus(): void {\n const status = this.currentCloudStatus()\n for (const packageName of this.connectedApps.keys()) {\n this.sendCloudStatusToMiniapp(packageName, status)\n }\n }\n\n private sendCloudStatusToMiniapp(packageName: string, status = this.currentCloudStatus()): void {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: CLOUD_STATUS_STREAM,\n data: status,\n })\n }\n\n // ===========================================================================\n // Stream fan-out\n // ===========================================================================\n\n /**\n * Forward a streamed event to all miniapps subscribed to the given stream.\n *\n * Event name translation:\n * - Incoming \"head_up\" → miniapp protocol uses \"head_position\" (HEAD_POSITION)\n * - Incoming \"VAD\" (uppercase) → miniapp protocol uses \"vad\" (lowercase)\n */\n public forwardEvent(streamType: string, data: unknown, transcriptionSource?: TranscriptionEventSource): void {\n // Normalize incoming event names to miniapp protocol stream types\n const normalizedStream = this.normalizeStreamType(streamType)\n\n // Collect all subscribers: exact match, plus wildcard matches for streams\n // that carry a language tag. A miniapp subscribed to \"transcription:auto\"\n // should receive any \"transcription:<lang>\" event (the detected language\n // is conveyed in the event data, not the stream key).\n //\n // Translation streams support cloud v3's wildcard patterns. Incoming\n // events are keyed `translation:<source>:<target>` and we match against\n // any of:\n // translation:*:* — all-pairs (TranslationModule.on)\n // translation:*:<target> — any-source → target (TranslationModule.to)\n // translation:<source>:* — source → any-target (rare)\n // translation:<source>:<target> — exact (TranslationModule.fromTo)\n // translation:auto — back-compat alias for *:*\n const matchedSubs = new Set<string>()\n const exact = this.streamSubscribers.get(normalizedStream)\n if (exact) for (const p of exact) matchedSubs.add(p)\n\n if (normalizedStream.startsWith(\"transcription:\")) {\n const autoSubs = this.streamSubscribers.get(\"transcription:auto\")\n if (autoSubs) for (const p of autoSubs) matchedSubs.add(p)\n } else if (normalizedStream.startsWith(\"translation:\")) {\n // translation:<source>:<target> — match each wildcard variant.\n const parts = normalizedStream.split(\":\")\n // parts[0] = \"translation\", parts[1] = source, parts[2] = target\n if (parts.length === 3) {\n const [, source, target] = parts\n const patterns = [\n \"translation:auto\", // legacy alias for *:*\n \"translation:*:*\", // cloud v3 \"all pairs\"\n `translation:*:${target}`, // cloud v3 \"to <target>\"\n `translation:${source}:*`, // cloud v3 \"from <source>\"\n ]\n for (const pat of patterns) {\n const subs = this.streamSubscribers.get(pat)\n if (subs) for (const p of subs) matchedSubs.add(p)\n }\n } else {\n // Malformed stream key — still honor the legacy auto alias.\n const autoSubs = this.streamSubscribers.get(\"translation:auto\")\n if (autoSubs) for (const p of autoSubs) matchedSubs.add(p)\n }\n }\n\n // Touch event per-gesture fan-out. SDK-side dispatch is keyed on the\n // exact streamType, so per-gesture subscribers (`touch_event:single_tap`,\n // etc.) need their own EVENT envelope with the gesture-tagged streamType.\n // The bare `touch_event` stream above still catches `onTouch(handler)`.\n let perGestureStream: string | null = null\n let outboundData = data\n if (normalizedStream === MiniappStreamType.GLASSES_CONNECTION) {\n outboundData = toMiniappConnectionData(data) ?? data\n }\n if (normalizedStream === MiniappStreamType.TOUCH_EVENT) {\n // The Bluetooth SDK delivers the gesture under `gestureName` (single_tap /\n // double_tap / triple_tap / long_press / swipe_up / swipe_down). Surface it\n // to miniapps as `TouchData.kind` and tag a per-gesture stream so\n // onTouch(\"single_tap\", ...) routes correctly.\n const touch = data as {gestureName?: string; kind?: string} | null\n const gesture = touch?.gestureName ?? touch?.kind\n if (typeof gesture === \"string\" && gesture.length > 0) {\n outboundData = {...(touch as object), kind: gesture}\n perGestureStream = `${MiniappStreamType.TOUCH_EVENT}:${gesture}`\n }\n }\n\n if (normalizedStream.startsWith(\"transcription:\")) {\n // const known = Array.from(this.streamSubscribers.keys())\n // console.log(\n // `${LOG_TAG}: forwardEvent(${streamType} → ${normalizedStream}) matched=${matchedSubs.size} known=[${known.join(\", \")}]`,\n // )\n }\n\n if (matchedSubs.size === 0 && !perGestureStream) return\n\n for (const packageName of matchedSubs) {\n let transcriptionRoute: \"default\" | \"forceLocal\" | \"all\" | undefined\n if (normalizedStream.startsWith(\"transcription:\") && transcriptionSource) {\n const routes = this.appTranscriptionRoutesForEvent(packageName, normalizedStream)\n transcriptionRoute =\n transcriptionDeliveryRoute(transcriptionSource, routes, cloudClientService.isConnected()) ?? undefined\n if (!transcriptionRoute) continue\n }\n if (TRANSCRIPT_TIMING_TELEMETRY && normalizedStream.startsWith(\"transcription:\")) {\n const transcript = data as {text?: string; isFinal?: boolean; __hostReceivedAt?: number} | null\n const now = Date.now()\n console.log(\n `${LOG_TAG}: transcript fanout t=${now} app=${packageName} final=${!!transcript?.isFinal} hostDelta=${\n transcript?.__hostReceivedAt ? now - transcript.__hostReceivedAt : -1\n }ms text=\"${(transcript?.text ?? \"\").slice(0, 48)}\"`,\n )\n }\n // While a nav trip is active the Nav SDK's road-snapped fixes are\n // already being forwarded via addLocationListener (see NAV_START handler).\n // Suppress the raw background-GPS forward for that miniapp so the two\n // streams don't interleave and cause the position to jump back to the\n // real-phone location during simulation.\n if (normalizedStream === MiniappStreamType.LOCATION_UPDATE && this.navigationHandlers.isTripActive(packageName)) {\n continue\n }\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: normalizedStream,\n data: outboundData,\n ...(transcriptionRoute ? {transcriptionRoute} : {}),\n })\n }\n\n // Send a separate envelope to per-gesture subscribers tagged with the\n // gesture-specific streamType so SDK-side dispatch routes correctly.\n if (perGestureStream) {\n const gestureSubs = this.streamSubscribers.get(perGestureStream)\n if (gestureSubs) {\n for (const packageName of gestureSubs) {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: perGestureStream,\n data: outboundData,\n })\n }\n }\n }\n }\n\n private appTranscriptionRoutesForSubscription(\n packageName: string,\n stream: string,\n ): {\n cloud: boolean\n forceLocal: boolean\n } {\n const app = this.connectedApps.get(packageName)\n return {\n cloud: app?.cloudTranscriptionStreams.has(stream) === true,\n forceLocal: app?.forceLocalTranscriptionStreams.has(stream) === true,\n }\n }\n\n private appTranscriptionRoutesForEvent(\n packageName: string,\n stream: string,\n ): {\n cloud: boolean\n forceLocal: boolean\n } {\n const app = this.connectedApps.get(packageName)\n const autoStream = `${MiniappStreamType.TRANSCRIPTION}:auto`\n return {\n cloud:\n app?.cloudTranscriptionStreams.has(stream) === true || app?.cloudTranscriptionStreams.has(autoStream) === true,\n forceLocal:\n app?.forceLocalTranscriptionStreams.has(stream) === true ||\n app?.forceLocalTranscriptionStreams.has(autoStream) === true,\n }\n }\n\n /**\n * Normalize incoming event names to miniapp stream type values.\n */\n private normalizeStreamType(cloudEventName: string): string {\n // Incoming event names → miniapp protocol translations.\n // Bluetooth SDK event names don't always match the miniapp wire values.\n switch (cloudEventName) {\n case \"head_up\":\n return MiniappStreamType.HEAD_POSITION // head_up → head_position\n case \"accel_event\":\n return MiniappStreamType.ACCEL_DATA // accel_event (native) → accel_data\n case \"VAD\":\n return MiniappStreamType.VAD // VAD (uppercase) → vad (lowercase)\n case \"glasses_battery_update\":\n return MiniappStreamType.GLASSES_BATTERY // glasses_battery_update → glasses_battery\n case \"glasses_connection_state\":\n return MiniappStreamType.GLASSES_CONNECTION // glasses_connection_state → glasses_connection\n default:\n // Preserve case for typed streams like \"transcription:en-US\" / \"translation:en-US:fr-FR\"\n // whose language tags are case-sensitive (BCP-47). Lowercase only plain names.\n if (cloudEventName.includes(\":\")) return cloudEventName\n return cloudEventName.toLowerCase()\n }\n }\n\n // ===========================================================================\n // Outbound helpers\n // ===========================================================================\n\n /**\n * Send a payload to a connected miniapp, wrapped in an envelope.\n */\n /**\n * Push a speaker-state transition to the owning miniapp. Idempotent: if\n * the new state matches the cached one (and isn't an error), no envelope\n * is sent. Error events are always sent — they're transient and the SDK\n * settles back to a non-error state immediately after.\n */\n private setSpeakerState(\n packageName: string,\n next: SpeakerStateValue,\n extra?: {errorCode?: string; errorMessage?: string; durationMs?: number},\n ): void {\n const app = this.connectedApps.get(packageName)\n if (!app) return\n if (app.speakerState === next && next !== \"error\") return\n app.speakerState = next === \"error\" ? \"error\" : next\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.SPEAKER_STATE,\n state: next,\n ...(extra?.errorCode !== undefined ? {errorCode: extra.errorCode} : {}),\n ...(extra?.errorMessage !== undefined ? {errorMessage: extra.errorMessage} : {}),\n ...(extra?.durationMs !== undefined ? {durationMs: extra.durationMs} : {}),\n })\n // After an error event, immediately transition to \"stopped\" so the\n // SDK's isPlaying getter reads false and a new play()/speak() call\n // starts cleanly from idle/stopped.\n if (next === \"error\") {\n app.speakerState = \"stopped\"\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.SPEAKER_STATE,\n state: \"stopped\",\n })\n }\n }\n\n private sendToMiniapp(packageName: string, payload: Record<string, unknown>, requestId?: string): void {\n const app = this.connectedApps.get(packageName)\n if (!app) {\n console.warn(`${LOG_TAG}: sendToMiniapp — ${packageName} not connected`)\n return\n }\n\n const envelope: MiniappEnvelope = {\n payload,\n requestId,\n }\n\n const serialized = serializeEnvelope(envelope)\n if ((payload as Record<string, unknown>)?.streamType?.toString().startsWith(\"transcription\")) {\n // console.log(\n // `${LOG_TAG}: sendToMiniapp → ${packageName} streamType=${(payload as Record<string, unknown>).streamType}`,\n // )\n }\n\n try {\n app.sendMessage(serialized)\n } catch (err) {\n console.error(`${LOG_TAG}: sendToMiniapp error for ${packageName}:`, err)\n }\n }\n\n /**\n * Send a REQUEST_RESULT response.\n */\n // ===========================================================================\n // Inter-miniapp interop (session.miniapps + session.actions.invoke)\n // ===========================================================================\n\n /** Max serialized size of an action call's params / result (256 KB). */\n private static readonly ACTION_PAYLOAD_CAP = 256 * 1024\n\n /** Outstanding action invocations, keyed by host-generated callId. */\n private actionCalls = new Map<\n string,\n {callerPackageName: string; targetPackageName: string; callerRequestId?: string; timer: number}\n >()\n private actionCallSeq = 0\n\n private interopApps(): ClientApp[] {\n return useAppStatusStore.getState().apps\n }\n\n private isSystemPackage(packageName: string): boolean {\n const app = this.interopApps().find((candidate) => candidate.packageName === packageName)\n if (SYSTEM_MINIAPP_PACKAGE_SET.has(packageName)) {\n if (app?.offline) return true\n if (app?.local && app.version) {\n return appRegistry.getReleaseIdentity(packageName, app.version)?.source === \"bundled_asset\"\n }\n return false\n }\n return app?.isMiniappDev === true\n }\n\n private async startInteropApp(packageName: string): Promise<boolean> {\n const app = this.interopApps().find((a) => a.packageName === packageName)\n if (!app) return false\n if (app.local) {\n await miniappLauncher.ensureConnected(packageName)\n return true\n }\n return useAppStatusStore.getState().start(app, {skipNavigation: true})\n }\n\n private stopInteropApp(packageName: string): Promise<void> {\n return useAppStatusStore.getState().stop(packageName)\n }\n\n private wakeInteropApp(packageName: string): Promise<void> {\n return miniappLauncher.ensureConnected(packageName)\n }\n\n /** Emit an interop audit event (best-effort — never let telemetry break a call). */\n private auditInterop(event: InteropAuditEvent): void {\n try {\n getAnalytics()?.(\"miniapp_interop\", {\n caller: event.caller,\n op: event.op,\n target: event.target ?? \"\",\n actionId: event.actionId ?? \"\",\n ok: event.ok,\n errorCode: event.errorCode ?? \"\",\n })\n } catch {\n /* telemetry must never break an interop call */\n }\n }\n\n /** Reject the request with NOT_PERMITTED unless the caller is a system app. */\n private requireSystemCaller(\n packageName: string,\n requestId: string | undefined,\n op: InteropAuditEvent[\"op\"],\n target?: string,\n ): boolean {\n if (this.isSystemPackage(packageName)) return true\n this.auditInterop({caller: packageName, op, target, ok: false, errorCode: MiniappErrorCode.NOT_PERMITTED})\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_PERMITTED,\n message: \"Inter-miniapp APIs are restricted to system apps\",\n })\n return false\n }\n\n /** Project a host ClientApp into the SDK's MiniappInfo shape (JSON over the wire). */\n private buildMiniappInfo(app: ClientApp): Record<string, unknown> {\n const compatibility = app.compatibility ?? {\n isCompatible: true,\n missingRequired: [],\n missingOptional: [],\n warnings: [],\n }\n return {\n packageName: app.packageName,\n name: app.name,\n version: app.version ?? \"\",\n running: app.running,\n compatibility,\n actions: app.actions ?? [],\n }\n }\n\n private handleMiniappsList(packageName: string, payload: Record<string, unknown>, requestId?: string): void {\n if (!this.requireSystemCaller(packageName, requestId, \"list\")) return\n const includeIncompatible = payload.includeIncompatible === true\n const infos = this.interopApps()\n .filter(\n (a) =>\n a.packageName &&\n a.packageName !== packageName &&\n !a.packageName.includes(\"@empty\") &&\n (includeIncompatible || a.compatibility?.isCompatible !== false),\n )\n .map((a) => this.buildMiniappInfo(a))\n this.sendResult(packageName, requestId, true, infos)\n this.auditInterop({caller: packageName, op: \"list\", ok: true})\n }\n\n private async handleMiniappsStart(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const target = payload.packageName as string | undefined\n if (!this.requireSystemCaller(packageName, requestId, \"start\", target)) return\n const app = target ? this.interopApps().find((a) => a.packageName === target) : undefined\n if (!target || !app) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.APP_NOT_FOUND,\n message: `Miniapp not found: ${target ?? \"(missing packageName)\"}`,\n })\n this.auditInterop({\n caller: packageName,\n op: \"start\",\n target,\n ok: false,\n errorCode: MiniappErrorCode.APP_NOT_FOUND,\n })\n return\n }\n // Pre-flight the hardware gate so the caller gets a precise reason rather\n // than a generic rejection (start()'s own gate would otherwise alert + abort).\n if (app.compatibility && app.compatibility.isCompatible === false) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.APP_NOT_COMPATIBLE,\n message: `${target} is not compatible with the connected glasses`,\n })\n islandNotifications.emit({\n kind: \"version_incompatible\",\n packageName: target,\n reason: `${target} is not compatible with the connected glasses`,\n metadata: {missingRequired: app.compatibility.missingRequired ?? [], via: \"miniapps.start\"},\n timestamp: Date.now(),\n })\n this.auditInterop({\n caller: packageName,\n op: \"start\",\n target,\n ok: false,\n errorCode: MiniappErrorCode.APP_NOT_COMPATIBLE,\n })\n return\n }\n try {\n // startInteropApp resolves to false when the app-store gate rejected the\n // launch or the background context failed to spawn — don't report success.\n const started = await this.startInteropApp(target)\n if (started) {\n this.sendResult(packageName, requestId, true)\n this.auditInterop({caller: packageName, op: \"start\", target, ok: true})\n } else {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: `start of ${target} was rejected by the host (gated or failed to spawn)`,\n })\n this.auditInterop({\n caller: packageName,\n op: \"start\",\n target,\n ok: false,\n errorCode: MiniappErrorCode.INTERNAL,\n })\n }\n } catch (e) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: (e as Error)?.message ?? \"start failed\",\n })\n this.auditInterop({\n caller: packageName,\n op: \"start\",\n target,\n ok: false,\n errorCode: MiniappErrorCode.INTERNAL,\n })\n }\n }\n\n private async handleMiniappsStop(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const target = payload.packageName as string | undefined\n if (!this.requireSystemCaller(packageName, requestId, \"stop\", target)) return\n if (!target) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.APP_NOT_FOUND,\n message: \"stop requires a packageName\",\n })\n return\n }\n try {\n await this.stopInteropApp(target)\n this.sendResult(packageName, requestId, true)\n this.auditInterop({caller: packageName, op: \"stop\", target, ok: true})\n } catch (e) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: (e as Error)?.message ?? \"stop failed\",\n })\n }\n }\n\n /** True iff `value` serializes larger than the action payload cap. */\n private actionPayloadTooLarge(value: unknown): boolean {\n try {\n return JSON.stringify(value ?? null).length > LocalMiniappRuntime.ACTION_PAYLOAD_CAP\n } catch {\n // Unserializable — let it through; the transport's own serialize handles it.\n return false\n }\n }\n\n /**\n * session.actions.invoke → wake the target headlessly, deliver an ACTION_CALL,\n * and correlate its ACTION_RESULT back to the caller's pending request.\n */\n private async handleActionInvoke(\n callerPackageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const targetForGate = payload.targetPackageName as string | undefined\n if (!this.requireSystemCaller(callerPackageName, requestId, \"invoke\", targetForGate)) return\n\n const target = payload.targetPackageName as string | undefined\n const actionId = payload.actionId as string | undefined\n const params = (payload.params as Record<string, unknown> | undefined) ?? {}\n // Floor the timeout at 6s so the host never rejects with ACTION_TIMEOUT before\n // the target SDK's handler-registration window closes. A freshly-woken miniapp\n // buffers an undelivered ACTION_CALL for HANDLER_WAIT_MS (5s in @mentra/miniapp's\n // actions module) waiting for session.actions.handle; a shorter host timeout\n // could fire while the target is still registering, then the action would run\n // with no caller left to receive its result. 6s = that 5s buffer + 1s for the\n // ACTION_RESULT/NO_ACTION_HANDLER reply to travel back. Keep these in sync.\n const timeoutMs = Math.min(Math.max(Number(payload.timeoutMs) || 30_000, 6_000), 120_000)\n\n if (this.actionPayloadTooLarge(params)) {\n this.sendResult(callerPackageName, requestId, false, undefined, {\n code: MiniappErrorCode.PAYLOAD_TOO_LARGE,\n message: \"action params exceeded the 256 KB cap\",\n })\n return\n }\n\n const app = target ? this.interopApps().find((a) => a.packageName === target) : undefined\n if (!target || !app) {\n this.sendResult(callerPackageName, requestId, false, undefined, {\n code: MiniappErrorCode.APP_NOT_FOUND,\n message: `Miniapp not found: ${target ?? \"(missing targetPackageName)\"}`,\n })\n return\n }\n if (!actionId) {\n this.sendResult(callerPackageName, requestId, false, undefined, {\n code: MiniappErrorCode.ACTION_NOT_FOUND,\n message: \"invoke requires an actionId\",\n })\n return\n }\n if (app.compatibility && app.compatibility.isCompatible === false) {\n this.sendResult(callerPackageName, requestId, false, undefined, {\n code: MiniappErrorCode.APP_NOT_COMPATIBLE,\n message: `${target} is not compatible with the connected glasses`,\n })\n islandNotifications.emit({\n kind: \"version_incompatible\",\n packageName: target,\n reason: `${target} is not compatible with the connected glasses`,\n metadata: {missingRequired: app.compatibility.missingRequired ?? [], via: \"miniapps.invoke\"},\n timestamp: Date.now(),\n })\n return\n }\n // Declared-action gate — only once the host populates app.actions (Phase 2);\n // until then app.actions is undefined and we fall through to NO_ACTION_HANDLER.\n if (!(app.actions ?? []).some((a) => a.id === actionId)) {\n this.sendResult(callerPackageName, requestId, false, undefined, {\n code: MiniappErrorCode.ACTION_NOT_FOUND,\n message: `${target} does not declare action \"${actionId}\"`,\n })\n return\n }\n\n // Headless wake + wait for CONNECT (idempotent / fast if already connected).\n try {\n await this.wakeInteropApp(target)\n } catch (e) {\n this.sendResult(callerPackageName, requestId, false, undefined, {\n code: MiniappErrorCode.WAKE_FAILED,\n message: (e as Error)?.message ?? `failed to wake ${target}`,\n })\n return\n }\n\n // The wake waited for CONNECT, but the target could have dropped in the gap\n // before delivery — fail fast rather than arming a timer for a call that\n // sendToMiniapp would silently drop (the caller would otherwise wait the\n // full invoke timeout for an ACTION_CALL that was never delivered).\n if (!this.connectedApps.has(target)) {\n this.sendResult(callerPackageName, requestId, false, undefined, {\n code: MiniappErrorCode.WAKE_FAILED,\n message: `${target} disconnected before the action could be delivered`,\n })\n this.auditInterop({\n caller: callerPackageName,\n op: \"invoke\",\n target,\n actionId,\n ok: false,\n errorCode: MiniappErrorCode.WAKE_FAILED,\n })\n return\n }\n\n // Deliver the call and arm the handler timeout; ACTION_RESULT resolves it.\n const callId = `act-${Date.now().toString(36)}-${this.actionCallSeq++}`\n const timer = BgTimer.setTimeout(() => {\n this.actionCalls.delete(callId)\n this.sendResult(callerPackageName, requestId, false, undefined, {\n code: MiniappErrorCode.ACTION_TIMEOUT,\n message: `action \"${actionId}\" timed out after ${timeoutMs}ms`,\n })\n }, timeoutMs)\n this.actionCalls.set(callId, {callerPackageName, targetPackageName: target, callerRequestId: requestId, timer})\n this.sendToMiniapp(target, {\n type: MiniappResponseType.ACTION_CALL,\n callId,\n actionId,\n params,\n callerPackageName,\n })\n this.auditInterop({caller: callerPackageName, op: \"invoke\", target, actionId, ok: true})\n }\n\n /** Target → host: forward an ACTION_RESULT back to the caller's pending invoke. */\n private handleActionResult(targetPackageName: string, payload: Record<string, unknown>): void {\n const callId = payload.callId as string | undefined\n if (!callId) return\n const pending = this.actionCalls.get(callId)\n if (!pending) return\n // Only the invoked target may resolve this call. callIds are guessable\n // (timestamp + seq), so a different connected miniapp must not be able to\n // spoof a result/error for someone else's invoke.\n if (pending.targetPackageName !== targetPackageName) return\n this.actionCalls.delete(callId)\n BgTimer.clearTimeout(pending.timer)\n\n if (payload.ok === true) {\n const result = payload.result\n if (this.actionPayloadTooLarge(result)) {\n this.sendResult(pending.callerPackageName, pending.callerRequestId, false, undefined, {\n code: MiniappErrorCode.PAYLOAD_TOO_LARGE,\n message: \"action result exceeded the 256 KB cap\",\n })\n return\n }\n this.sendResult(pending.callerPackageName, pending.callerRequestId, true, result ?? null)\n } else {\n const error = (payload.error as ({code: string; message: string} & Record<string, unknown>) | undefined) ?? {\n code: MiniappErrorCode.INTERNAL,\n message: \"action handler error\",\n }\n this.sendResult(pending.callerPackageName, pending.callerRequestId, false, undefined, error)\n }\n }\n\n private sendResult(\n packageName: string,\n requestId: string | undefined,\n ok: boolean,\n data?: unknown,\n error?: {code: string; message: string} & Record<string, unknown>,\n ): void {\n if (!requestId) return\n\n this.sendToMiniapp(\n packageName,\n {\n type: MiniappResponseType.REQUEST_RESULT,\n requestId,\n ok,\n ...(data !== undefined ? {data} : {}),\n ...(error ? {error} : {}),\n },\n requestId,\n )\n }\n\n /**\n * Send a VISIBILITY_CHANGE push to a miniapp.\n */\n public sendVisibilityChange(packageName: string, visibility: \"foreground\" | \"background\"): void {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.VISIBILITY_CHANGE,\n visibility,\n })\n }\n\n /**\n * Fast foreground liveness check used when a local miniapp UI is opened or\n * resumed. The normal watchdog intentionally waits ~30s to avoid killing a\n * healthy-but-busy background script. When the user is actively looking at a\n * WebView, a stale JSContext reads as \"cloud offline\" / no captions, so probe\n * immediately and reuse the crash-respawn path if no message comes back.\n */\n public probeForegroundLiveness(\n packageName: string,\n reason = \"foreground-open\",\n timeoutMs = FOREGROUND_LIVENESS_PROBE_TIMEOUT_MS,\n ): void {\n const app = this.connectedApps.get(packageName)\n if (!app) return\n\n this.clearForegroundProbe(packageName)\n const probeStartedAt = Date.now()\n\n this.sendToMiniapp(packageName, {\n type: MiniappRequestType.PING,\n })\n\n const timerId = BgTimer.setTimeout(() => {\n this.foregroundProbeTimers.delete(packageName)\n const current = this.connectedApps.get(packageName)\n if (!current) return\n if (current.lastPongAt >= probeStartedAt) return\n\n console.warn(`${LOG_TAG}: ${packageName} failed foreground liveness probe (${reason}), respawning`)\n this.unregisterApp(packageName)\n this.onLivenessTimeout?.(packageName)\n }, timeoutMs)\n this.foregroundProbeTimers.set(packageName, timerId)\n }\n\n // ===========================================================================\n // Ping / pong liveness\n // ===========================================================================\n\n private ensurePingLoop(): void {\n if (this.pingIntervalId !== null) return\n\n this.pingIntervalId = BgTimer.setInterval(() => {\n this.doPingRound()\n }, PING_INTERVAL_MS)\n }\n\n private stopPingLoop(): void {\n if (this.pingIntervalId !== null) {\n BgTimer.clearInterval(this.pingIntervalId)\n this.pingIntervalId = null\n }\n }\n\n private doPingRound(): void {\n const toRemove: string[] = []\n\n for (const [packageName, app] of this.connectedApps) {\n const holdPingLiveness = shouldHoldMiniappPingLiveness({\n packageName,\n softapPackageName: this.softapAttempt?.packageName,\n softapCancelled: this.softapAttempt?.cancelled,\n })\n if (!holdPingLiveness) {\n const liveness = advanceMiniappPingLiveness(app.unansweredPingRounds, PING_TIMEOUT_THRESHOLD)\n if (liveness.shouldUnregister) {\n console.warn(`${LOG_TAG}: ${packageName} missed ${PING_TIMEOUT_THRESHOLD} pings, unregistering`)\n toRemove.push(packageName)\n continue\n }\n app.unansweredPingRounds = liveness.unansweredPingRounds\n }\n\n // Send PING — SDK auto-replies with PONG\n this.sendToMiniapp(packageName, {\n type: MiniappRequestType.PING,\n })\n }\n\n for (const pkg of toRemove) {\n this.unregisterApp(pkg)\n // Hand the package to the router's respawn machinery — a missed-pings\n // death is treated like a crash so the background script comes back.\n this.onLivenessTimeout?.(pkg)\n }\n }\n\n /**\n * Called when a PONG is received from a miniapp (or any message, really).\n * Updates lastPongAt to keep the app alive.\n */\n public handlePong(packageName: string): void {\n const app = this.connectedApps.get(packageName)\n if (app) {\n app.lastPongAt = Date.now()\n app.unansweredPingRounds = 0\n this.clearForegroundProbe(packageName)\n }\n }\n\n private clearForegroundProbe(packageName: string): void {\n const timerId = this.foregroundProbeTimers.get(packageName)\n if (timerId == null) return\n BgTimer.clearTimeout(timerId)\n this.foregroundProbeTimers.delete(packageName)\n }\n\n // ===========================================================================\n // Lifecycle\n // ===========================================================================\n\n public cleanup(): void {\n console.log(`${LOG_TAG}: cleanup()`)\n this.stopPingLoop()\n\n // Copy keys since unregisterApp mutates the map\n const packageNames = [...this.connectedApps.keys()]\n for (const pkg of packageNames) {\n this.unregisterApp(pkg)\n }\n\n // Belt-and-suspenders: clear any remaining state\n const hadButtonPressSubscribers = this.getButtonPressSubscribers().length > 0\n this.streamSubscribers.clear()\n if (hadButtonPressSubscribers) {\n for (const listener of this.buttonPressSubscriberListeners) {\n try {\n listener([])\n } catch (error) {\n console.warn(`${LOG_TAG}: button press subscriber listener threw during cleanup:`, error)\n }\n }\n }\n this.connectedApps.clear()\n for (const timerId of this.foregroundProbeTimers.values()) {\n BgTimer.clearTimeout(timerId)\n }\n this.foregroundProbeTimers.clear()\n\n LocalMiniappRuntime.instance = null\n }\n\n /**\n * Number of currently connected miniapps (for diagnostics).\n */\n public get connectedAppCount(): number {\n return this.connectedApps.size\n }\n}\n\nconst localMiniappRuntime = LocalMiniappRuntime.getInstance()\nexport default localMiniappRuntime\n"]}
1
+ {"version":3,"file":"LocalMiniappRuntime.js","sourceRoot":"","sources":["../../src/services/LocalMiniappRuntime.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * LocalMiniappRuntime\n *\n * Singleton service that bridges local miniapps (running in WebViews) with\n * phone capabilities: display, audio, storage, sensors, LED, etc.\n *\n * Each miniapp communicates via the @mentra/miniapp envelope protocol.\n * This runtime handles request dispatch, stream fan-out, and lifecycle\n * management (connect/disconnect/ping).\n */\n\nimport {parsePhotoCompression} from \"@mentra/cloud-protocol/photo-compression\"\nimport {acquireGlassesHotspot} from \"./GlassesHotspotLease\"\nimport {AppState, Linking} from \"react-native\"\nimport Share from \"react-native-share\"\nimport * as Battery from \"expo-battery\"\nimport * as Clipboard from \"expo-clipboard\"\nimport {File, Paths} from \"expo-file-system\"\nimport * as Location from \"expo-location\"\nimport BluetoothSdk, {type RgbLedAction, type RgbLedColor} from \"@mentra/bluetooth-sdk\"\n\nimport {\n MiniappErrorCode,\n MiniappRequestType,\n MiniappResponseType,\n MiniappStreamType,\n CLOUD_STATUS_STREAM,\n parseEnvelope,\n serializeEnvelope,\n} from \"@mentra/miniapp\"\nimport type {MiniappEnvelope} from \"@mentra/miniapp\"\n\nimport {DeviceTypes, getModelCapabilities} from \"../types\"\nimport {storage as mmkvStorage} from \"../utils/storage/storage\"\nimport {BgTimer} from \"../utils/timers\"\nimport devServerBridge from \"./DevServerBridge\"\nimport {islandNotifications} from \"./NotificationsEmitter\"\nimport {isGlassesConnected, isGlassesReady, waitForGlassesReady} from \"./GlassesReadiness\"\nimport {toMiniappConnectionData} from \"./GlassesStatusProjection\"\nimport audioPlaybackService from \"./AudioPlaybackService\"\nimport {phoneLocationService} from \"./PhoneLocationService\"\nimport {useGlassesStore} from \"../stores/glasses\"\nimport {useSettingsStore} from \"../stores/settings\"\nimport localDisplayManager from \"./LocalDisplayManager\"\nimport type {DisplayPayload} from \"./LocalDisplayManager\"\nimport headingService from \"./HeadingService\"\nimport localSttFallbackCoordinator from \"./LocalSttFallbackCoordinator\"\nimport micStateCoordinator from \"./MicStateCoordinator\"\nimport {BlobStore} from \"./BlobStore\"\nimport {CloudAudioSubscriptionSync} from \"./CloudAudioSubscriptionSync\"\nimport {phoneCameraFovCoordinator} from \"./PhoneCameraFovCoordinator\"\nimport {phonePhotoCoordinator} from \"./PhonePhotoCoordinator\"\nimport {phoneStreamCoordinator} from \"./PhoneStreamCoordinator\"\nimport {phoneVideoCoordinator} from \"./PhoneVideoCoordinator\"\nimport {runSentenceTtsPipeline} from \"./SentenceTtsPipeline\"\nimport {summarizeTranscriptionRoutes, transcriptionDeliveryRoute} from \"./TranscriptionRouting\"\nimport {prepareTtsSentences} from \"./TtsTextSanitizer\"\nimport {handleWifiAdbRequest} from \"./WifiAdbRequest\"\nimport {cloudClientService} from \"./CloudClientService\"\nimport {miniappLauncher} from \"./MiniappLauncher\"\nimport {\n ISLAND_SETTINGS_KEYS,\n type CameraFovPreset,\n type CameraFovRequest,\n type CameraRoiPosition,\n type CloudClientStatusSnapshot,\n type InteropAuditEvent,\n type MiniappAuthToken,\n type TtsSynthesisResult,\n} from \"../runtime/config\"\nimport {getAnalytics, getMiniappConfiguration, getUiSeams, isFeatureEnabled} from \"../runtime/bootstrap\"\nimport {invokeScanQrSeam} from \"../runtime/scanQrSeam\"\nimport {\n normalizeStreamAudioConfig,\n normalizeStreamVideoConfig,\n normalizeCaptureAudio,\n resolveCaptureAudio,\n} from \"../runtime/streamConfig\"\nimport {toLanguageHint} from \"@mentra/cloud-protocol/languages\"\nimport type {AudioSubscription, LanguageSource, TranscriptionData, TranslationData} from \"@mentra/cloud-protocol\"\nimport {buildMiniappManifestSnapshot, type MiniappRuntimeDiagnosticSnapshot} from \"../utils/miniappDiagnostics\"\nimport ttsModelManager from \"./TTSModelManager\"\nimport {NavigationHandlers} from \"./NavigationHandlers\"\nimport type {ClientApp} from \"../types/applet\"\nimport {useAppStatusStore} from \"../stores/apps\"\nimport appRegistry, {getDevAppAttestation, getDevAppSourcePackage} from \"./AppRegistry\"\nimport {resolveForegroundLocationPermission} from \"./ForegroundLocationPermission\"\nimport {advanceMiniappPingLiveness, shouldHoldMiniappPingLiveness} from \"./MiniappLiveness\"\nimport {listPhoneCalendarEvents, PhoneCalendarError} from \"./PhoneCalendarService\"\nimport {LocalMiniappStorage} from \"./LocalMiniappStorage\"\nimport acsMeetingService, {\n parseAcsCallOrigin,\n parseAcsOutgoingVideo,\n parseAcsVideoSource,\n resolveAcsAudioSource,\n type AcsCallOrigin,\n type AcsOutgoingVideo,\n type AcsVideoSource,\n type MeetingState,\n} from \"./AcsMeetingService\"\nimport {\n createSoftapCallDeps,\n SoftapCallError,\n SoftapCallTransport,\n RETURN_DEADLINE_MS,\n SOFTAP_STEPS,\n type SoftapProgress,\n type SoftapTeardownMode,\n} from \"./SoftapCallTransport\"\nimport {awaitCleanupBarrier} from \"./SoftapCleanupBarrier\"\nimport {softapTrace, softapTraceFailure} from \"../utils/softapTrace\"\nimport {PermissionFeatures, permissions} from \"../facades/permissions\"\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface InstalledMiniappManifest {\n packageName?: string\n /** Human-facing app name (from miniapp.json `name`). Shown in the \"Starting\n * <name>…\" boot message; falls back to the package name when absent. */\n name?: string\n version?: string\n sdkVersion?: string\n minHostVersion?: string\n type?: string\n entry?: {background?: string; ui?: string}\n permissions?: Array<{type: string; required?: boolean; description?: string}>\n hardwareRequirements?: Array<{type: string; level: string; description?: string}>\n actions?: Array<{id?: unknown; description?: unknown; parameters?: unknown; outputSchema?: unknown}>\n}\n\ntype SpeakerStateValue = \"idle\" | \"loading\" | \"playing\" | \"stopped\" | \"error\"\n\ninterface ConnectedMiniapp {\n subscriptions: Set<string>\n /** Transcription streams this app explicitly requires to stay on-device. */\n forceLocalTranscriptionStreams: Set<string>\n /** Transcription streams with at least one listener using the default/cloud route. */\n cloudTranscriptionStreams: Set<string>\n sendMessage: (raw: string) => void\n lastPongAt: number\n unansweredPingRounds: number\n installedManifest?: InstalledMiniappManifest\n authRefreshTimerId: number | null\n /**\n * Backoff timer for re-attempting the INITIAL miniapp-token mint after it\n * failed (distinct from `authRefreshTimerId`, which renews an already-issued\n * token near expiry). Null when no retry is queued.\n */\n authRetryTimerId: number | null\n /**\n * True once this app has received a miniapp auth token (in CONNECT_ACK or a\n * follow-up AUTH_UPDATE). Gates the initial-mint retry loop and the\n * on-reconnect re-drive so we stop hammering once auth has landed.\n */\n authDelivered: boolean\n /** Last speaker state pushed to this app. Used to dedup SPEAKER_STATE pushes. */\n speakerState: SpeakerStateValue\n /** Live PCM output stream this app has open (speaker.createStream), if any. */\n activeSpeakerStreamId?: string\n /**\n * Location-tier rate this app is currently asking for via its\n * `location_stream` subscription, or null if it hasn't asked for\n * one. The aggregate tier handed to the host is the strictest\n * (highest-accuracy) rate across all currently connected apps —\n * see {@link LOCATION_RATE_PRIORITY}.\n */\n requestedLocationRate: string | null\n}\n\ninterface SpeechRun {\n id: string\n cancelled: boolean\n playbackRequestId?: string\n onCancelled?: () => void\n}\n\ntype TranscriptionEventSource = \"cloud\" | \"local\"\n\n/**\n * Strictness ordering for `location_stream` rate values. Higher index =\n * higher accuracy and higher power cost. The aggregate tier applied to\n * the OS is the max of every connected miniapp's requested rate;\n * miniapps that didn't ask for `location_stream` contribute nothing.\n *\n * If a miniapp passes a value we don't recognize, we treat it like the\n * weakest known rate (\"passive\") rather than blanket-overwriting an\n * active stronger request from another app.\n */\nconst LOCATION_RATE_PRIORITY = [\"off\", \"passive\", \"low\", \"high\", \"realtime\"] as const\ntype LocationRate = (typeof LOCATION_RATE_PRIORITY)[number]\nfunction locationRateRank(rate: string | null | undefined): number {\n if (!rate) return -1\n const i = LOCATION_RATE_PRIORITY.indexOf(rate as LocationRate)\n return i >= 0 ? i : LOCATION_RATE_PRIORITY.indexOf(\"passive\")\n}\n\nconst LOG_TAG = \"LOCAL_MINIAPP\"\nconst DIAGNOSTIC_MAX_LIST_ITEMS = 100\nconst DIAGNOSTIC_MAX_STRING_LENGTH = 512\n\nconst SYSTEM_MINIAPP_PACKAGE_SET = new Set([\n \"com.mentra.camera\",\n \"com.mentra.gallery\",\n \"com.mentra.settings\",\n \"com.mentra.simulated\",\n \"com.mentra.mirror\",\n \"com.mentra.ai\",\n \"cloud.augmentos.notify\",\n \"com.mentra.feedback\",\n \"com.mentra.miniappdev\",\n])\n\nfunction diagnosticStringList(values: Iterable<string>): string[] {\n return [...values]\n .map((value) => value.slice(0, DIAGNOSTIC_MAX_STRING_LENGTH))\n .sort()\n .slice(0, DIAGNOSTIC_MAX_LIST_ITEMS)\n}\n\nconst PING_INTERVAL_MS = 5_000\nconst MINIAPP_AUTH_REFRESH_HEADROOM_MS = 5 * 60 * 1000\nconst MINIAPP_AUTH_REFRESH_MIN_DELAY_MS = 5_000\n// Backoff bounds for re-minting the INITIAL miniapp token after a failed mint\n// (e.g. the cloud client had not finished its first-boot Core token exchange\n// when the miniapp connected). Exponential from base, capped, so a transient\n// not-yet-connected client self-heals within seconds instead of needing a full\n// manual Cloud V2 reconnect.\nconst MINIAPP_AUTH_RETRY_BASE_MS = 1_000\nconst MINIAPP_AUTH_RETRY_MAX_MS = 15_000\nconst FOREGROUND_LIVENESS_PROBE_TIMEOUT_MS = 2_500\n/**\n * How long a SoftAP call waits for the first frame to reach ACS before failing the join.\n *\n * Generous because it covers the glasses' whole publish path — WHIP POST, host-only ICE, and the\n * first decode — but bounded, since a call that connects and never paints has to fail as a join\n * rather than sit in \"connecting\" while the wearer waits.\n */\nconst SOFTAP_FIRST_FRAME_MS = 20_000\n/**\n * How long the BLE link must stay up before SoftAP recovery trusts it. Covers the gap between\n * the hotspot dying and the phone noticing the link died with it.\n */\nconst GLASSES_LINK_SETTLE_MS = 4_000\nconst REQUEST_WIFI_SETUP_TYPE = \"miniapp_request_wifi_setup\"\n// Unregister after this many missed pongs. Generous on purpose: a busy\n// context (heavy interim translation traffic) or OS scheduling while idle can\n// delay pongs well past one interval, and killing a healthy-but-busy script\n// drops its subscriptions (releasing the mic). With the liveness-timeout\n// respawn path wired (MentraJSRouter.start), a genuinely dead context still\n// comes back automatically — this threshold only bounds how long that takes.\nconst PING_TIMEOUT_THRESHOLD = 6 // ~30s\n\nconst TRANSCRIPT_TIMING_TELEMETRY = (globalThis as {__DEV__?: boolean}).__DEV__ === true\n\nconst RGB_LED_ACTIONS = new Set<RgbLedAction>([\"on\", \"off\"])\nconst RGB_LED_COLORS = new Set<RgbLedColor>([\"red\", \"green\", \"blue\", \"orange\", \"white\"])\nconst CAMERA_FOV_MIN = 62\nconst CAMERA_FOV_MAX = 118\nconst CAMERA_FOV_DEFAULT = 118\nconst CAMERA_FOV_PRESETS: Record<CameraFovPreset, number> = {narrow: 82, standard: 102, wide: 118}\nconst CAMERA_ROI_POSITION_BY_NAME: Record<string, CameraRoiPosition> = {center: \"center\", bottom: \"bottom\", top: \"top\"}\n\nconst localMiniappStorageBackend = {\n get(key: string): unknown | null {\n const result = mmkvStorage.load<unknown>(key)\n return result.is_ok() ? result.value : null\n },\n has(key: string): boolean {\n return mmkvStorage.load<unknown>(key).is_ok()\n },\n set(key: string, value: unknown): void {\n mmkvStorage.save(key, value)\n },\n remove(key: string): void {\n mmkvStorage.remove(key)\n },\n keys(): string[] {\n return mmkvStorage.getAllKeys()\n },\n}\n\n// =============================================================================\n// Declared-permission record helper (for CONNECT_ACK / PERMISSIONS_UPDATE)\n// =============================================================================\n\n/**\n * Map from manifest permission types (uppercase, snake-y) to the lowercase\n * canonical permission keys the SDK exposes via session.permissions. Mirrors\n * cloud SDK v3's PermissionType union.\n *\n * BACKGROUND_LOCATION + POST_NOTIFICATIONS aren't in v3's surface; they map\n * onto the same canonical keys (location / notifications) since the SDK's\n * `has()` is \"do I have *any* form of this permission declared\".\n */\nconst PERMISSION_TYPE_TO_CANONICAL: Record<string, string> = {\n MICROPHONE: \"microphone\",\n CAMERA: \"camera\",\n LOCATION: \"location\",\n BACKGROUND_LOCATION: \"location\",\n READ_NOTIFICATIONS: \"notifications\",\n POST_NOTIFICATIONS: \"notifications\",\n CALENDAR: \"calendar\",\n}\n\nfunction normalizeRgbLedAction(value: unknown): RgbLedAction {\n return typeof value === \"string\" && RGB_LED_ACTIONS.has(value as RgbLedAction) ? (value as RgbLedAction) : \"off\"\n}\n\nfunction normalizeRgbLedColor(value: unknown): RgbLedColor | null {\n return typeof value === \"string\" && RGB_LED_COLORS.has(value as RgbLedColor) ? (value as RgbLedColor) : null\n}\n\nfunction normalizeCameraFovPayload(payload: Record<string, unknown>): CameraFovRequest {\n if (typeof payload.preset === \"string\") {\n const preset = payload.preset in CAMERA_FOV_PRESETS ? (payload.preset as CameraFovPreset) : \"standard\"\n return {preset}\n }\n\n const rawFov = typeof payload.fov === \"number\" && Number.isFinite(payload.fov) ? payload.fov : CAMERA_FOV_DEFAULT\n\n return {\n fov: Math.min(CAMERA_FOV_MAX, Math.max(CAMERA_FOV_MIN, rawFov)),\n roiPosition: normalizeCameraRoiPosition(payload.roiPosition ?? payload.roi_position),\n }\n}\n\nfunction normalizeCameraRoiPosition(value: unknown): CameraRoiPosition {\n if (typeof value === \"number\" && Number.isInteger(value) && value >= 0 && value <= 2) {\n return value === 1 ? \"bottom\" : value === 2 ? \"top\" : \"center\"\n }\n\n if (typeof value === \"string\") {\n return CAMERA_ROI_POSITION_BY_NAME[value] ?? \"center\"\n }\n\n return \"center\"\n}\n\nconst ALL_CANONICAL_PERMISSIONS = [\"location\", \"microphone\", \"camera\", \"notifications\", \"calendar\"] as const\n\n/**\n * Build the {location, microphone, camera, notifications, calendar} record the\n * SDK's session.permissions module reads from. Missing types are false.\n */\nfunction computeDeclaredPermissionRecord(manifest: InstalledMiniappManifest | undefined): Record<string, boolean> {\n const record: Record<string, boolean> = {}\n for (const k of ALL_CANONICAL_PERMISSIONS) record[k] = false\n for (const perm of manifest?.permissions ?? []) {\n const canonical = PERMISSION_TYPE_TO_CANONICAL[perm.type?.toUpperCase()]\n if (canonical) record[canonical] = true\n }\n return record\n}\n\n// =============================================================================\n// PERMISSION_NOT_DECLARED warnings — per-session dedup\n// =============================================================================\n//\n// When a miniapp tries to subscribe / call something whose required permission\n// isn't declared in miniapp.json, the runtime rejects with\n// PERMISSION_NOT_DECLARED. The error reaches the SDK but most authors don't\n// subscribe to session.on(\"error\", ...), so it's silent in practice.\n//\n// To make the failure discoverable for developers running the MentraOS app\n// from source, log a clear, copy-pasteable message in the phone console that\n// names the offending permission, the offending stream/op, and the JSON\n// snippet to add to miniapp.json. Once-per-session per (packageName, permission)\n// to avoid spam from a tight retry loop.\n//\n// Production users running the App Store build of MentraOS won't see these\n// (they don't watch Metro/adb logcat). For them, the WebView console bridge\n// (#5 of the quick-fixes round) ships the structured error to the miniapp\n// itself, and the miniapp's own console.warn flows to the dev terminal.\n\nconst warnedPermission = new Set<string>() // key: `${packageName}::${permission}`\n\nfunction logPermissionNotDeclared(\n packageName: string,\n permission: string,\n context: string,\n manifestSnippet: string,\n): void {\n const key = `${packageName}::${permission}`\n if (warnedPermission.has(key)) return\n warnedPermission.add(key)\n console.warn(\n `${LOG_TAG}: ${packageName} attempted ${context}, but permission ${permission} is not declared in miniapp.json.\\n` +\n `Add this to the \"permissions\" array:\\n ${manifestSnippet}`,\n )\n}\n\n/** Reset the per-session dedup; called when a miniapp unregisters so a fresh launch warns again. */\nfunction resetPermissionWarnings(packageName: string): void {\n for (const key of warnedPermission) {\n if (key.startsWith(`${packageName}::`)) warnedPermission.delete(key)\n }\n}\n\n/**\n * One attempt to start a SoftAP call, from the first permission check to the last release.\n *\n * The unit is the attempt rather than the transport because the transport only exists for the\n * second half of it. Everything the wearer can cancel — the Nearby-devices prompt, the wait for\n * mobile data, the ACS sign-in — happens before `transport.start()`, and each of those leaves\n * something behind (a signed-in agent, a process-wide cellular pin) that only the attempt knows\n * about.\n */\ntype SoftapAttempt = {\n id: number\n packageName: string\n startedAt: number\n /** Set by leave, end, or a superseding join. Checked after every await the join performs. */\n cancelled: boolean\n /** Set only after the preceding attempt has fully settled. */\n releaseHotspot?: () => void\n ownsResources: boolean\n transport: SoftapCallTransport | null\n /** The checklist as the miniapp last saw it; preflight rows live here until `start()` takes over. */\n progress: SoftapProgress\n scopedLostUnsub: (() => void) | null\n /**\n * Mid-call media rebuild. Single-flight while [recoveryActive] is true; the promise is\n * cleared when that run settles so a later walk-away can start another. Joined to the\n * attempt barrier so a late re-arm cannot resurrect resources after Leave/End.\n */\n recovery: Promise<void> | null\n recoveryActive: boolean\n recoveryDeadlineAt: number | null\n /**\n * The join itself, settled either way. A native call still in flight owns state the teardown\n * cannot see — a `createCallAgent` mid-sign-in — so the barrier covers this as well.\n */\n body: Promise<void> | null\n /** Single-flight teardown, so a leave and the join's own failure path cannot both unwind. */\n teardown: Promise<void> | null\n /** Opens only once the attempt *and* its cleanup are finished. The next join waits on it. */\n settled: Promise<void>\n settledDone: boolean\n markSettled: () => void\n}\n\n/** How long a stalled SoftAP cleanup goes unremarked before it is logged. It is never abandoned. */\nconst SOFTAP_CLEANUP_STALL_LOG_MS = 10_000\n\n/**\n * The WHIP listener's tombstone (3s) plus a margin for the close itself.\n *\n * Sized to the grace period rather than picked round, so an expiry here means something actually\n * went wrong instead of meaning we guessed short.\n */\nconst SOFTAP_INGEST_CLOSE_WAIT_MS = 3_500\n\n/** How long the glasses get to acknowledge their hotspot off, over BLE. */\nconst SOFTAP_HOTSPOT_OFF_ACK_MS = 5_000\n\n/** After a forced close there is nothing left to wait for, so this only catches a real failure. */\nconst SOFTAP_FORCED_VERIFY_MS = 500\n\n/**\n * Rejection codes meaning the glasses replaced their Wi-Fi protocol session, not that the\n * command failed.\n *\n * The glasses emit `wifi_protocol_session_ready` on every `glasses_ready`, which fires on BLE\n * reconnects and ASG restarts — routine during a SoftAP teardown. The SDK cancels every pending\n * Wi-Fi request when that lands, so a hotspot command in flight is lost even though nothing is\n * actually wrong. `wifi_session_disconnected` is deliberately absent: that one is raised from the\n * store update where the glasses went away, so there is nothing left to re-send to.\n */\nconst HOTSPOT_SESSION_REFRESH_CODES = new Set([\"wifi_session_restarted\", \"wifi_session_changed\"])\n\n/**\n * Let the restarted ASG command path settle before re-sending.\n *\n * `handleSetHotspotState` returns false when its network manager is not up yet, which drops the\n * command silently, so an immediate re-send would just race the same initialization. Mirrors the\n * retry spacing `disableHotspotWithRetry` uses for the sibling ASG-replacement case.\n */\nconst HOTSPOT_SESSION_RETRY_DELAY_MS = 500\n\n/** Reject with [reason] if [work] has not settled in [ms]. The work itself is not cancellable. */\nfunction withTimeout<T>(work: Promise<T>, ms: number, reason: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(reason)), ms)\n work.then(\n (value) => {\n clearTimeout(timer)\n resolve(value)\n },\n (error) => {\n clearTimeout(timer)\n reject(error)\n },\n )\n })\n}\n\n/** How long the next call waits for the previous one's cleanup before telling the wearer about it. */\nconst SOFTAP_CLEANUP_NARRATE_AFTER_MS = 250\n\n// =============================================================================\n// LocalMiniappRuntime\n// =============================================================================\n\nclass LocalMiniappRuntime {\n private static instance: LocalMiniappRuntime | null = null\n\n /**\n * The SoftAP call being started or running, if any.\n *\n * An *attempt*, not a transport, because the cancellable part of a SoftAP call begins long\n * before the transport exists: a Nearby-devices prompt and an ACS sign-in run first, and a\n * wearer who taps Cancel during either of them has to be obeyed. The attempt is registered\n * before the first `await` and is what every later stage checks itself against.\n */\n private softapAttempt: SoftapAttempt | null = null\n /**\n * The outer generation. Every async callback that can outlive an attempt checks itself against\n * it and traces `softap_stale_callback` when it loses: ACS state, SoftAP progress, glasses\n * stream status, scoped-network loss, and each checkpoint through the join.\n *\n * There are inner generations below this one — `AcsMeetingSession.joinGeneration` and\n * `LocalWhipIngestSource.generation` — and they are not redundant. They fence work inside one\n * native session against itself; this one fences whole attempts against each other, and only it\n * knows that the wearer pressed Cancel before any of that native work existed.\n */\n private softapAttemptSeq = 0\n /**\n * Why the previous SoftAP call's cleanup failed, if it did.\n *\n * Read once by the next join, which refuses rather than building on leaked state: a hotspot that\n * would not turn off is precisely what makes the next call fail somewhere far less legible.\n */\n private softapCleanupError: string | null = null\n /**\n * SoftAP teardown disables the glasses hotspot from the transport and again\n * from the host barrier. Native used to throw `request_in_flight` on the\n * second call, which was recorded as a cleanup failure and refused the next\n * join. One queue so those overlapping disables wait their turn.\n */\n private glassesHotspotCommand: Promise<unknown> = Promise.resolve()\n\n /** Connected miniapps keyed by packageName. */\n private connectedApps: Map<string, ConnectedMiniapp> = new Map()\n\n /**\n * Packages that have completed their CONNECT handshake (sent\n * `miniapp_connect`, got `CONNECT_ACK`). Distinct from `connectedApps`,\n * which is populated at spawn/registration time — handshake is later.\n * Drives {@link waitForConnect}.\n */\n private handshookApps: Set<string> = new Set()\n\n /** Pending {@link waitForConnect} resolvers, keyed by packageName. */\n private connectWaiters: Map<string, Set<(err?: Error) => void>> = new Map()\n\n /** Ref-counted stream subscriptions: stream → set of packageNames. */\n private streamSubscribers: Map<string, Set<string>> = new Map()\n\n /** Host observers for the Mentra Live button-capture policy. */\n private buttonPressSubscriberListeners = new Set<(packageNames: string[]) => void>()\n\n /** Guards one-time wiring of the cloud transcript/translation fan-out. */\n private cloudResultsWired = false\n private cloudStatusWired = false\n private cloudAudioSubscriptionSync = new CloudAudioSubscriptionSync()\n\n /**\n * Per-miniapp language hints from TRANSCRIPTION_CONFIG (issue 021 WP3).\n * Bare ISO 639-1 codes, already registry-validated by the SDK and\n * re-normalized here (defense in depth). Merged (union) into the auto-mode\n * cloud transcription subscription in buildCloudAudioSubscriptions.\n */\n private transcriptionHintsByApp = new Map<string, string[]>()\n\n /** Ping interval handle. */\n private pingIntervalId: number | null = null\n private foregroundProbeTimers: Map<string, number> = new Map()\n\n /**\n * Notified when a miniapp is unregistered for missing liveness pings.\n * MentraJSRouter wires this into its crash-respawn machinery so a\n * silently-stalled background script is restarted (with crash-loop\n * protection) instead of staying dead — a dead background drops its\n * subscriptions, which releases the mic while the webview still looks\n * alive.\n */\n public onLivenessTimeout: ((packageName: string) => void) | null = null\n\n private speechRuns = new Map<string, SpeechRun>()\n\n // Browser fallback token auth — HMAC-signed blob with a phone-local\n // secret. Both issuer and verifier are the same process, so the\n // secret never leaves the device.\n private localSecret = `miniapp_${Date.now()}_${Math.random().toString(36).slice(2, 14)}`\n private usedTokens = new Set<string>()\n\n private constructor() {}\n\n /** Snapshot of miniapps actively subscribed to hardware button events. */\n public getButtonPressSubscribers(): string[] {\n return [...(this.streamSubscribers.get(MiniappStreamType.BUTTON_PRESS) ?? [])].sort()\n }\n\n /** Observe active hardware-button subscriptions. */\n public onButtonPressSubscribersChanged(listener: (packageNames: string[]) => void): () => void {\n this.buttonPressSubscriberListeners.add(listener)\n return () => this.buttonPressSubscriberListeners.delete(listener)\n }\n\n /** Report-safe live miniapp/subscription/resource snapshot. */\n public getDiagnosticSnapshot(nowMs = Date.now()): MiniappRuntimeDiagnosticSnapshot {\n const connectedApps = [...this.connectedApps.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .slice(0, DIAGNOSTIC_MAX_LIST_ITEMS)\n .map(([packageName, app]) => ({\n packageName: packageName.slice(0, DIAGNOSTIC_MAX_STRING_LENGTH),\n handshakeComplete: this.handshookApps.has(packageName),\n subscriptions: diagnosticStringList(app.subscriptions),\n lastMessageAgeMs: Math.max(0, nowMs - app.lastPongAt),\n requestedLocationRate: app.requestedLocationRate,\n hasActiveSpeakerStream: app.activeSpeakerStreamId !== undefined,\n ...(app.installedManifest\n ? {\n manifest: buildMiniappManifestSnapshot(app.installedManifest, {\n packageName,\n name: app.installedManifest.name,\n version: app.installedManifest.version,\n type: app.installedManifest.type,\n }),\n }\n : {}),\n }))\n const subscriptionsByStream = Object.fromEntries(\n [...this.streamSubscribers.entries()]\n .filter(([, packageNames]) => packageNames.size > 0)\n .sort(([a], [b]) => a.localeCompare(b))\n .slice(0, DIAGNOSTIC_MAX_LIST_ITEMS)\n .map(([stream, packageNames]) => [\n stream.slice(0, DIAGNOSTIC_MAX_STRING_LENGTH),\n diagnosticStringList(packageNames),\n ]),\n )\n\n return {\n connectedApps,\n subscriptionsByStream,\n resources: {\n display: localDisplayManager.getDiagnosticSnapshot(),\n camera: phonePhotoCoordinator.getDiagnosticSnapshot(),\n video: phoneVideoCoordinator.getDiagnosticSnapshot(),\n stream: phoneStreamCoordinator.getDiagnosticSnapshot(),\n cameraFov: phoneCameraFovCoordinator.getDiagnosticSnapshot(),\n },\n }\n }\n\n private replaceStreamSubscribers(\n packageName: string,\n previousStreams: Iterable<string>,\n nextStreams: Iterable<string>,\n ) {\n const previousButtonSubscribers = this.getButtonPressSubscribers().join(\"\\u0000\")\n\n for (const stream of previousStreams) {\n const subscribers = this.streamSubscribers.get(stream)\n if (!subscribers) continue\n subscribers.delete(packageName)\n if (subscribers.size === 0) this.streamSubscribers.delete(stream)\n }\n\n for (const stream of nextStreams) {\n let subscribers = this.streamSubscribers.get(stream)\n if (!subscribers) {\n subscribers = new Set()\n this.streamSubscribers.set(stream, subscribers)\n }\n subscribers.add(packageName)\n }\n\n const nextButtonSubscribers = this.getButtonPressSubscribers()\n if (previousButtonSubscribers !== nextButtonSubscribers.join(\"\\u0000\")) {\n for (const listener of this.buttonPressSubscriberListeners) {\n try {\n listener(nextButtonSubscribers)\n } catch (error) {\n console.warn(`${LOG_TAG}: button press subscriber listener threw:`, error)\n }\n }\n }\n }\n\n /**\n * Generate an HMAC-signed local session token for browser fallback auth.\n * Token format: base64(JSON({userId, packageName, exp})).base64(HMAC-SHA256(payload, secret))\n * Single-use, 5-minute TTL.\n */\n public generateLocalToken(userId: string, packageName: string): string {\n const payload = JSON.stringify({\n userId,\n packageName,\n exp: Date.now() + 5 * 60 * 1000, // 5 min TTL\n nonce: Math.random().toString(36).slice(2, 10),\n })\n const payloadB64 = btoa(payload)\n const sig = this.hmacSign(payload)\n return `${payloadB64}.${sig}`\n }\n\n /**\n * Validate and consume a local session token. Single-use.\n */\n public validateLocalToken(token: string): {userId: string; packageName: string} | null {\n const parts = token.split(\".\")\n if (parts.length !== 2) return null\n const [payloadB64, sig] = parts\n\n // Check single-use\n if (this.usedTokens.has(token)) return null\n\n // Verify signature\n let payload: string\n try {\n payload = atob(payloadB64!)\n } catch {\n return null\n }\n if (this.hmacSign(payload) !== sig) return null\n\n // Parse and check expiry\n let parsed: {userId: string; packageName: string; exp: number}\n try {\n parsed = JSON.parse(payload)\n } catch {\n return null\n }\n if (Date.now() > parsed.exp) return null\n\n // Mark as used\n this.usedTokens.add(token)\n // Prune old used tokens periodically (keep set from growing unbounded)\n if (this.usedTokens.size > 1000) {\n this.usedTokens.clear()\n }\n\n return {userId: parsed.userId, packageName: parsed.packageName}\n }\n\n /**\n * Simple HMAC-SHA256 using Web Crypto API (available in React Native).\n * Returns base64url-encoded signature.\n * Falls back to a simpler hash if crypto.subtle is not available.\n */\n private hmacSign(payload: string): string {\n // Synchronous HMAC using a simple hash — Web Crypto's subtle.sign is async\n // which doesn't fit cleanly here. For phone-local single-process auth,\n // a keyed hash is sufficient.\n let hash = 0\n const key = this.localSecret\n const input = key + payload + key\n for (let i = 0; i < input.length; i++) {\n const ch = input.charCodeAt(i)\n hash = ((hash << 5) - hash + ch) | 0\n }\n // Mix in more bytes for collision resistance\n let hash2 = 0x811c9dc5 // FNV offset basis\n for (let i = 0; i < input.length; i++) {\n hash2 ^= input.charCodeAt(i)\n hash2 = Math.imul(hash2, 0x01000193) // FNV prime\n }\n return btoa(String(hash >>> 0) + \".\" + String(hash2 >>> 0))\n }\n\n public static getInstance(): LocalMiniappRuntime {\n if (!LocalMiniappRuntime.instance) {\n LocalMiniappRuntime.instance = new LocalMiniappRuntime()\n }\n return LocalMiniappRuntime.instance\n }\n\n private initialized = false\n\n /**\n * Initialize the runtime. Called from MantleManager.init().\n * Idempotent — safe to call multiple times.\n */\n public initialize(): void {\n if (this.initialized) return\n this.initialized = true\n console.log(`${LOG_TAG}: initialize()`)\n this.ensurePingLoop()\n }\n\n // ===========================================================================\n // App registration\n // ===========================================================================\n\n public registerApp(\n packageName: string,\n sendFn: (raw: string) => void,\n installedManifest?: InstalledMiniappManifest,\n ): void {\n console.log(`${LOG_TAG}: registerApp(${packageName})`)\n this.clearForegroundProbe(packageName)\n // Fresh spawn → fresh handshake. Clear any prior handshake flag so\n // waitForConnect() blocks until this context's own CONNECT arrives.\n this.handshookApps.delete(packageName)\n // If the app is already registered (e.g. QR scanned again for same package),\n // tear down its old subscriptions first so streamSubscribers doesn't keep\n // dangling references. The WebView will re-subscribe after its CONNECT.\n if (this.connectedApps.has(packageName)) {\n const existing = this.connectedApps.get(packageName)!\n this.cancelSpeech(packageName)\n // A crash respawn replaces the ConnectedMiniapp without going through\n // unregisterApp(). Abort the old incarnation's native PCM player before\n // its only stream id is lost. Target the exact stream rather than using\n // stopForApp(), whose async playback cleanup could race with audio the\n // replacement app starts after it connects.\n const existingSpeakerStreamId = existing.activeSpeakerStreamId\n if (existingSpeakerStreamId) {\n existing.activeSpeakerStreamId = undefined\n void audioPlaybackService.abortStream(existingSpeakerStreamId).catch((error) => {\n console.warn(`${LOG_TAG}: failed to abort speaker stream while replacing ${packageName}`, error)\n })\n }\n if (existing.authRefreshTimerId !== null) {\n BgTimer.clearTimeout(existing.authRefreshTimerId)\n existing.authRefreshTimerId = null\n }\n if (existing.authRetryTimerId !== null) {\n BgTimer.clearTimeout(existing.authRetryTimerId)\n existing.authRetryTimerId = null\n }\n this.replaceStreamSubscribers(packageName, existing.subscriptions, [])\n this.recomputeMicRequirements()\n this.updateCloudSubscriptions()\n // Managed streams and ACS meetings deliberately survive a respawn: the new\n // incarnation re-adopts them on restore (Mentra Call does exactly this) so a\n // WebView reload does not drop the wearer out of a live call. An unmanaged\n // stream cannot be re-adopted — startUnmanaged rejects while any stream is\n // active, even for the same owner — so release it or the respawned miniapp\n // is stuck behind STREAM_ALREADY_ACTIVE until the process restarts.\n const streamSnapshot = phoneStreamCoordinator.getDiagnosticSnapshot()\n if (\n streamSnapshot.active === true &&\n streamSnapshot.kind === \"unmanaged\" &&\n streamSnapshot.ownerPackageName === packageName\n ) {\n void phoneStreamCoordinator.stop(packageName).catch((error) => {\n console.warn(`${LOG_TAG}: failed to stop unmanaged stream while replacing ${packageName}`, error)\n })\n }\n }\n this.connectedApps.set(packageName, {\n subscriptions: new Set(),\n forceLocalTranscriptionStreams: new Set(),\n cloudTranscriptionStreams: new Set(),\n sendMessage: sendFn,\n lastPongAt: Date.now(),\n unansweredPingRounds: 0,\n installedManifest,\n authRefreshTimerId: null,\n authRetryTimerId: null,\n authDelivered: false,\n speakerState: \"idle\",\n requestedLocationRate: null,\n })\n // If we just clobbered an existing entry, its requestedLocationRate is\n // now gone — recompute so the aggregate doesn't include a stale rate.\n // The WebView will re-SUBSCRIBE shortly and the rate will reappear.\n this.recomputeLocationTier()\n this.ensureCloudStatusWired()\n this.ensurePingLoop()\n\n // Show the system boot message (\"Starting <name>…\") on the glasses for the\n // bounded boot window, mirroring the cloud DisplayManager boot screen. The\n // window ends early once this app pushes its first display (see\n // LocalDisplayManager.request), or after ~1.5s. Fires once per spawn —\n // including a crash-respawn, since each spawn is a fresh \"app is starting\".\n localDisplayManager.onMount(packageName, installedManifest?.name ?? packageName)\n }\n\n /**\n * Resolve once `packageName` has completed its CONNECT handshake. If it has\n * already connected, resolves immediately. Rejects if the timeout elapses\n * first, or if the app is unregistered while waiting.\n *\n * Used by the launcher's `ensureConnected` (and thus the action broker) so a\n * just-spawned target is known to be live before anything is delivered to it.\n */\n public waitForConnect(packageName: string, timeoutMs: number): Promise<void> {\n if (this.handshookApps.has(packageName)) return Promise.resolve()\n return new Promise<void>((resolve, reject) => {\n let settled = false\n const waiter = (err?: Error) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n this.connectWaiters.get(packageName)?.delete(waiter)\n if (err) reject(err)\n else resolve()\n }\n const timer = setTimeout(() => {\n waiter(new Error(`waitForConnect: ${packageName} did not connect within ${timeoutMs}ms`))\n }, timeoutMs)\n let set = this.connectWaiters.get(packageName)\n if (!set) {\n set = new Set()\n this.connectWaiters.set(packageName, set)\n }\n set.add(waiter)\n })\n }\n\n /** Resolve/reject all pending {@link waitForConnect} waiters for a package. */\n private flushConnectWaiters(packageName: string, err?: Error): void {\n const waiters = this.connectWaiters.get(packageName)\n if (!waiters) return\n this.connectWaiters.delete(packageName)\n for (const w of waiters) w(err)\n }\n\n /**\n * Invalidate the CONNECT handshake for a package whose native context is\n * being replaced WITHOUT going through register/unregister — i.e. a crash\n * respawn. Without this, {@link waitForConnect} would treat the dead/\n * not-yet-initialized context as connected and deliver to it. Pending waiters\n * are failed so a wake mid-respawn retries rather than hanging.\n */\n public resetHandshake(packageName: string): void {\n this.handshookApps.delete(packageName)\n this.flushConnectWaiters(packageName, new Error(`${packageName} respawning`))\n }\n\n /**\n * Attach (or update) the installedManifest for an already-registered app.\n * Used when the manifest is fetched asynchronously (dev miniapps) after the\n * miniapp has already CONNECTed — preserves existing subscriptions.\n */\n public setInstalledManifest(packageName: string, installedManifest: InstalledMiniappManifest): void {\n const app = this.connectedApps.get(packageName)\n if (!app) return\n app.installedManifest = installedManifest\n\n // Push declared-permission record to the SDK so session.permissions stays\n // in sync. Sent regardless of CONNECT_ACK timing — covers the dev-miniapp\n // case where the manifest is fetched async after the miniapp CONNECTs.\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.PERMISSIONS_UPDATE,\n permissions: computeDeclaredPermissionRecord(installedManifest),\n })\n }\n\n /**\n * Graceful version of {@link unregisterApp}: notify the miniapp via\n * `WILL_DISCONNECT`, wait ~50ms so its `beforeDisconnect` handlers can\n * fire one last `sendOneShot` (e.g. `display.clear()`), then run the\n * normal teardown. Use this for any disconnect path where the socket\n * is still open. For ungraceful paths (transport already closed),\n * call {@link unregisterApp} directly — the heads-up would be\n * undeliverable anyway.\n */\n public async gracefullyUnregisterApp(packageName: string, reason = \"unregistering\"): Promise<void> {\n const app = this.connectedApps.get(packageName)\n if (!app) return\n\n console.log(`${LOG_TAG}: gracefullyUnregisterApp(${packageName}) — sending WILL_DISCONNECT`)\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.WILL_DISCONNECT,\n reason,\n })\n // 50 ms: imperceptible to the user, plenty of time for the SDK's\n // synchronous `beforeDisconnect` handlers to flush a final\n // sendOneShot through the still-open transport.\n await new Promise<void>((resolve) => setTimeout(resolve, 50))\n this.unregisterApp(packageName)\n }\n\n public unregisterApp(packageName: string): void {\n console.log(`${LOG_TAG}: unregisterApp(${packageName})`)\n const releasedMicGateOverride = micStateCoordinator.clearMiniappGateOverrides(packageName)\n this.clearForegroundProbe(packageName)\n this.clearMiniappAuthRefresh(packageName)\n this.clearMiniappAuthDeliveryRetry(packageName)\n // Drop the handshake flag and fail any in-flight waitForConnect() callers\n // (e.g. a wake that's mid-handshake when the app is torn down). Done before\n // the early-return so it runs even if the connectedApps entry is already gone.\n this.handshookApps.delete(packageName)\n this.flushConnectWaiters(packageName, new Error(`${packageName} unregistered before connect`))\n // Drop this app's transcription hints; the cloud subscription rebuild\n // below (via replaceStreamSubscribers) re-derives the hint union without it.\n this.transcriptionHintsByApp.delete(packageName)\n\n // Warm-up is a request-owned camera lease. Cancel it even if the app record was already\n // removed so a close racing the camera-open promise cannot leave the sensor running.\n // Close all camera consumers before restoring FOV. A shared publisher may\n // remain active for another subscriber; a rejected FOV release then stops\n // renewing the departed owner's lease and ASG restores it once idle.\n const cameraCleanup = Promise.allSettled([\n this.leaveMeetingForApp(packageName),\n phonePhotoCoordinator.stopWarmUpForApp(packageName),\n phoneStreamCoordinator.stop(packageName),\n phoneVideoCoordinator.stopForApp(packageName),\n ]).then((results) => {\n for (const result of results) {\n if (result.status === \"rejected\") {\n console.warn(`${LOG_TAG}: failed to stop miniapp resource for ${packageName} on unregister`, result.reason)\n }\n }\n })\n void phoneCameraFovCoordinator.releaseForApp(packageName, cameraCleanup).catch((error) => {\n console.warn(`${LOG_TAG}: failed to release camera FOV override for ${packageName} on unregister`, error)\n })\n const app = this.connectedApps.get(packageName)\n if (!app) {\n if (releasedMicGateOverride) {\n void micStateCoordinator.syncEffectiveGatePolicy(this.getConfiguredMicGates()).catch((error) => {\n console.warn(`${LOG_TAG}: failed to restore mic gate policy for ${packageName}`, error)\n })\n }\n return\n }\n\n // Remove from all stream subscriber sets\n this.replaceStreamSubscribers(packageName, app.subscriptions, [])\n\n // Reset per-session warning dedup so a relaunch surfaces issues again.\n resetPermissionWarnings(packageName)\n\n // Cancel lookahead/in-flight synthesis before stopping the current file so\n // an interrupted sentence cannot advance and reclaim playback.\n this.cancelSpeech(packageName)\n\n // Stop audio for this app\n audioPlaybackService.stopForApp(packageName)\n\n // Tear down this app's blob state: abort in-flight uploads + close readers\n // so a crashed/closed miniapp doesn't leak partial files or file handles.\n this.blobStore.onAppGone(packageName)\n\n // Detach the per-app nav event forwarder but leave the native nav session\n // running. The user may have just closed the mini-app UI and will reopen\n // it; stopping the session here would kill an active trip mid-route.\n // Navigation is only stopped when the mini-app explicitly calls\n // navigation.stop() or when the trip arrives/errors naturally.\n // (See NavigationHandlers — activeNavApps stays populated so a reconnect\n // can reattach listeners and resume.)\n this.navigationHandlers.onDisconnect(packageName)\n\n // Recompute heading subscription — if this app was the last subscriber,\n // the sensor will stop.\n this.recomputeHeadingSubscription()\n // Same for the IMU/accelerometer stream.\n this.recomputeImuSubscription()\n\n // Drop this app's location-tier request before recomputing so the\n // aggregate falls back down if it was the strictest. Done before\n // `connectedApps.delete` below so it doesn't matter that the iter\n // in `recomputeLocationTier` is over connectedApps — clearing the\n // field is enough.\n app.requestedLocationRate = null\n this.recomputeLocationTier()\n\n // Release any display real estate this app held — if it owned the\n // current on-glasses frame, this clears the glasses (or restores the\n // core app's saved frame).\n localDisplayManager.onUnmount(packageName)\n\n this.connectedApps.delete(packageName)\n this.recomputeMicRequirements()\n if (releasedMicGateOverride) {\n void micStateCoordinator.syncEffectiveGatePolicy(this.getConfiguredMicGates()).catch((error) => {\n console.warn(`${LOG_TAG}: failed to restore mic gate policy for ${packageName}`, error)\n })\n }\n this.updateCloudSubscriptions()\n\n if (this.connectedApps.size === 0) {\n this.stopPingLoop()\n }\n }\n\n // ===========================================================================\n // Inbound message handling\n // ===========================================================================\n\n public handleRawMessage(packageName: string, raw: string): void {\n const envelope = parseEnvelope(raw)\n if (!envelope) {\n // Not a miniapp envelope — ignore (could be legacy bridge message)\n return\n }\n\n const payload = envelope.payload as Record<string, unknown>\n const requestType = payload.type as string | undefined\n const requestId = envelope.requestId\n\n if (!requestType) {\n console.warn(`${LOG_TAG}: Envelope from ${packageName} missing payload.type`)\n return\n }\n\n // ANY inbound message proves the context is alive — a busy background\n // script streaming DISPLAY/storage traffic shouldn't be killed by the\n // liveness watchdog just because its PONG replies queue behind real work.\n this.handlePong(packageName)\n\n // Console-tap forwarding. The miniapp's console.log/warn/etc is wrapped\n // (via injected shim from miniappGlobals.ts) to post a `dev_log`\n // envelope. We fan out to two destinations:\n // 1. DevServerBridge — forwards to the laptop's `mentra-miniapp dev`\n // terminal. No-op when there's no sidecar (installed miniapps).\n // 2. React Native console — surfaces the log in Metro / Xcode console\n // / adb logcat so installed-miniapp errors are still inspectable\n // when there's no laptop to forward to.\n if (requestType === \"dev_log\") {\n const level = (payload.level as string | undefined) ?? \"log\"\n const args = Array.isArray(payload.args) ? (payload.args as unknown[]) : []\n const timestamp = (payload.timestamp as number | undefined) ?? Date.now()\n // Source is \"ui\" because the single-bundle WebView console-tap\n // shim in miniappGlobals.ts is the only thing that posts\n // `dev_log`; the two-layer path uses a separate envelope\n // (`{type:\"log\", source}`) routed by MentraUIRouter.\n devServerBridge.forwardLog(packageName, level, args, timestamp, \"ui\")\n\n const tag = `[MINIAPP ${packageName}]`\n const fn = (console as unknown as Record<string, (...a: unknown[]) => void>)[level] ?? console.log\n try {\n fn(tag, ...args)\n } catch {\n console.log(tag, ...args)\n }\n return\n }\n\n // Dispatch\n switch (requestType) {\n case MiniappRequestType.CONNECT:\n void this.handleConnect(packageName, payload, requestId)\n break\n case MiniappRequestType.AUTH_REFRESH:\n void this.handleAuthRefresh(packageName, payload, requestId)\n break\n case MiniappRequestType.SUBSCRIBE:\n this.handleSubscribe(packageName, payload, requestId)\n break\n case MiniappRequestType.DISPLAY:\n this.handleDisplay(packageName, payload, requestId)\n break\n case MiniappRequestType.RENDER:\n this.handleRender(packageName, payload, requestId)\n break\n case MiniappRequestType.PLAY_AUDIO:\n this.handlePlayAudio(packageName, payload, requestId)\n break\n case MiniappRequestType.STOP_AUDIO:\n this.handleStopAudio(packageName, payload, requestId)\n break\n case MiniappRequestType.SPEAK:\n this.handleSpeak(packageName, payload, requestId)\n break\n case MiniappRequestType.SPEAKER_STREAM_OPEN:\n void this.handleSpeakerStreamOpen(packageName, payload, requestId)\n break\n case MiniappRequestType.SPEAKER_STREAM_WRITE:\n void this.handleSpeakerStreamWrite(packageName, payload, requestId)\n break\n case MiniappRequestType.SPEAKER_STREAM_CLOSE:\n void this.handleSpeakerStreamClose(packageName, payload, requestId)\n break\n case MiniappRequestType.SPEAKER_STREAM_ABORT:\n void this.handleSpeakerStreamAbort(packageName, payload, requestId)\n break\n case MiniappRequestType.RGB_LED:\n void this.handleRgbLed(packageName, payload, requestId)\n break\n case MiniappRequestType.LOCATION_POLL:\n this.handleLocationPoll(packageName, requestId)\n break\n case MiniappRequestType.CALENDAR_LIST_EVENTS:\n void this.handleCalendarListEvents(packageName, payload, requestId)\n break\n case MiniappRequestType.NAVIGATION_START:\n this.navigationHandlers.handleStart(packageName, payload, requestId)\n break\n case MiniappRequestType.NAVIGATION_STOP:\n this.navigationHandlers.handleStop(packageName, requestId)\n break\n case MiniappRequestType.NAVIGATION_DEVIATE:\n this.navigationHandlers.handleDeviate(packageName, payload, requestId)\n break\n case MiniappRequestType.NAVIGATION_SET_WRONG_SIDEWALK:\n this.navigationHandlers.handleSetWrongSidewalk(packageName, payload, requestId)\n break\n case MiniappRequestType.NAVIGATION_SET_SKIP_CROSSINGS:\n this.navigationHandlers.handleSetSkipCrossings(packageName, payload, requestId)\n break\n case MiniappRequestType.NAVIGATION_GET_STATE:\n this.navigationHandlers.handleGetState(packageName, requestId)\n break\n case MiniappRequestType.NAVIGATION_COMPUTE_ROUTE:\n this.navigationHandlers.handleComputeRoute(packageName, payload, requestId)\n break\n case MiniappRequestType.NAVIGATION_REVERSE_GEOCODE:\n this.navigationHandlers.handleReverseGeocode(packageName, payload, requestId)\n break\n case MiniappRequestType.NAVIGATION_PLACE_AUTOCOMPLETE:\n this.navigationHandlers.handlePlaceAutocomplete(packageName, payload, requestId)\n break\n case MiniappRequestType.NAVIGATION_PLACE_DETAILS:\n this.navigationHandlers.handlePlaceDetails(packageName, payload, requestId)\n break\n case MiniappRequestType.NAVIGATION_REQUEST_PERMISSION:\n this.navigationHandlers.handleRequestPermission(packageName, requestId)\n break\n case MiniappRequestType.STORAGE_GET:\n this.handleStorageGet(packageName, payload, requestId)\n break\n case MiniappRequestType.STORAGE_SET:\n this.handleStorageSet(packageName, payload, requestId)\n break\n case MiniappRequestType.STORAGE_DELETE:\n this.handleStorageDelete(packageName, payload, requestId)\n break\n case MiniappRequestType.STORAGE_LIST:\n this.handleStorageList(packageName, payload, requestId)\n break\n case MiniappRequestType.STORAGE_CLEAR:\n this.handleStorageClear(packageName, requestId)\n break\n case MiniappRequestType.STORAGE_HAS:\n this.handleStorageHas(packageName, payload, requestId)\n break\n case MiniappRequestType.STORAGE_GET_ALL:\n this.handleStorageGetAll(packageName, requestId)\n break\n case MiniappRequestType.STORAGE_SET_MULTIPLE:\n this.handleStorageSetMultiple(packageName, payload, requestId)\n break\n case MiniappRequestType.STORAGE_FLUSH:\n // No-op today — MMKV writes through synchronously. Reserved so\n // a future debounced backend can honor \"flush before I quit\"\n // calls without breaking the API.\n this.sendResult(packageName, requestId, true)\n break\n case MiniappRequestType.CAMERA_FOV:\n void this.handleCameraFov(packageName, payload, requestId)\n break\n case MiniappRequestType.SET_WIFI_ADB_STATE:\n void this.handleSetWifiAdbState(packageName, payload, requestId)\n break\n case MiniappRequestType.IMU_SET_ENABLED:\n this.handleImuSetEnabled(packageName, payload, requestId)\n break\n case MiniappRequestType.MIC_SET_VAD_ENABLED:\n void this.handleMicSetVadEnabled(packageName, payload, requestId)\n break\n case MiniappRequestType.MIC_SET_LOUDNESS_GATE_ENABLED:\n void this.handleMicSetLoudnessGateEnabled(packageName, payload, requestId)\n break\n case MiniappRequestType.PING:\n // SDK should handle this itself; reply PONG just in case\n this.sendToMiniapp(packageName, {type: MiniappResponseType.PONG}, requestId)\n break\n case MiniappResponseType.PONG: {\n // Liveness already touched above for every inbound message; the\n // PONG carries no other action.\n break\n }\n\n case MiniappRequestType.SHARE:\n this.handleShare(packageName, payload, requestId)\n break\n case MiniappRequestType.OPEN_URL:\n this.handleOpenUrl(packageName, payload)\n break\n case MiniappRequestType.COPY_CLIPBOARD:\n this.handleCopyClipboard(packageName, payload, requestId)\n break\n case MiniappRequestType.DOWNLOAD:\n this.handleDownload(packageName, payload, requestId)\n break\n case MiniappRequestType.SCAN_QR:\n void this.handleScanQr(packageName, payload, requestId)\n break\n\n // Persistent binary blob storage (session.blob)\n case MiniappRequestType.BLOB_CREATE:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleCreate(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_WRITE:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleWrite(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_COMMIT:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleCommit(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_ABORT:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleAbort(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_SET_FROM_URL:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleSetFromUrl(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_IMPORT:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleImport(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_GET:\n this.enqueueBlobRequest(packageName, requestId, () => this.blobStore.handleGet(packageName, payload, requestId))\n break\n case MiniappRequestType.BLOB_LIST:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleList(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_USAGE:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleUsage(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_DELETE:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleDelete(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_CLEAR:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleClear(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_OPEN_READ:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleOpenRead(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_READ:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleRead(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_CLOSE_READ:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleCloseRead(packageName, payload, requestId),\n )\n break\n case MiniappRequestType.BLOB_SHARE:\n this.enqueueBlobRequest(packageName, requestId, () =>\n this.blobStore.handleShare(packageName, payload, requestId),\n )\n break\n\n // Cloud-coordinated features\n case MiniappRequestType.PHOTO:\n void this.handlePhoto(packageName, payload, requestId)\n break\n case MiniappRequestType.CAMERA_WARM_UP:\n void this.handleCameraWarmUp(packageName, payload, requestId)\n break\n case MiniappRequestType.VIDEO_RECORDING_START:\n void this.handleVideoRecordingStart(packageName, payload, requestId)\n break\n case MiniappRequestType.VIDEO_RECORDING_STOP:\n void this.handleVideoRecordingStop(packageName, payload, requestId)\n break\n case MiniappRequestType.STREAM_START:\n void this.handleStreamStart(packageName, payload, requestId)\n break\n case MiniappRequestType.STREAM_STOP:\n void this.handleStreamStop(packageName, payload, requestId)\n break\n case MiniappRequestType.MANAGED_STREAM_START:\n void this.handleManagedStreamStart(packageName, payload, requestId)\n break\n case MiniappRequestType.MANAGED_STREAM_STOP:\n void this.handleManagedStreamStop(packageName, payload, requestId)\n break\n case MiniappRequestType.MEETING_JOIN:\n void this.handleMeetingJoin(packageName, payload, requestId)\n break\n case MiniappRequestType.MEETING_LEAVE:\n void this.handleMeetingLeave(packageName, requestId)\n break\n case MiniappRequestType.MEETING_ADMIT:\n void this.handleMeetingAdmit(packageName, payload, requestId)\n break\n case MiniappRequestType.MEETING_END:\n void this.handleMeetingEnd(packageName, requestId)\n break\n case MiniappRequestType.MEETING_SET_MUTED:\n void this.handleMeetingSetMuted(packageName, payload, requestId)\n break\n case MiniappRequestType.MEETING_UPDATE_VIDEO_SOURCE:\n void this.handleMeetingUpdateVideoSource(packageName, payload, requestId)\n break\n case MiniappRequestType.MEETING_GET_STATE:\n void this.handleMeetingGetState(packageName, requestId)\n break\n case REQUEST_WIFI_SETUP_TYPE:\n void this.handleRequestWifiSetup(packageName, payload, requestId)\n break\n\n // Inter-miniapp interop (SYSTEM apps only)\n case MiniappRequestType.MINIAPPS_LIST:\n this.handleMiniappsList(packageName, payload, requestId)\n break\n case MiniappRequestType.MINIAPPS_START:\n void this.handleMiniappsStart(packageName, payload, requestId)\n break\n case MiniappRequestType.MINIAPPS_STOP:\n void this.handleMiniappsStop(packageName, payload, requestId)\n break\n case MiniappRequestType.ACTION_INVOKE:\n void this.handleActionInvoke(packageName, payload, requestId)\n break\n case MiniappRequestType.ACTION_RESULT:\n this.handleActionResult(packageName, payload)\n break\n\n // Deferred in v1\n case MiniappRequestType.DASHBOARD_CONTENT_UPDATE:\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_IMPLEMENTED,\n message: \"Dashboard API is deferred in v1\",\n })\n break\n\n case MiniappRequestType.TRANSCRIPTION_CONFIG:\n this.handleTranscriptionConfig(packageName, payload, requestId)\n break\n\n default:\n // NACK instead of silent drop (issue 021 S3): an SDK that sends a\n // request this runtime doesn't implement must get a rejected promise,\n // not a permanently-pending silent gap. One-shots (no requestId) can\n // only be logged.\n console.warn(`${LOG_TAG}: Unknown request type from ${packageName}: ${requestType}`)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_IMPLEMENTED,\n message: `Unknown or unimplemented request type: ${requestType}`,\n })\n break\n }\n }\n\n // ===========================================================================\n // Request handlers\n // ===========================================================================\n\n private async handleConnect(\n packageName: string,\n _payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n console.log(`${LOG_TAG}: CONNECT from ${packageName}`)\n\n // Register if not already\n const existing = this.connectedApps.get(packageName)\n if (!existing) {\n console.warn(`${LOG_TAG}: CONNECT from unregistered app ${packageName}, dropping — isolate already torn down`)\n return\n }\n\n // Update lastPongAt so it doesn't time out right away\n existing.lastPongAt = Date.now()\n existing.unansweredPingRounds = 0\n\n // Read current glasses capabilities from the settings store\n const defaultWearable = useSettingsStore.getState().getSetting(ISLAND_SETTINGS_KEYS.defaultWearable) as\n | DeviceTypes\n | undefined\n const capabilities = getModelCapabilities(defaultWearable || DeviceTypes.NONE)\n\n // Build the declared-permission record for the SDK's session.permissions\n // module. Lower-cased to match v3's PermissionType union (microphone,\n // camera, location, notifications, calendar). Missing permissions default\n // to false; this is manifest-declaration tracking only — OS-grant state\n // is intentionally not modeled here.\n const declaredPermissions = computeDeclaredPermissionRecord(existing.installedManifest)\n // Fresh handshake → clear any auth state from a prior context so a stale\n // retry timer can't fire against this new connection and so the retry loop\n // below re-arms from scratch.\n existing.authDelivered = false\n this.clearMiniappAuthDeliveryRetry(packageName)\n const authPromise = this.requestMiniappAuth(packageName)\n\n // Send CONNECT_ACK in this turn, before any await. A 1.5s auth wait let a\n // concurrent unregister (dev respawn, tray stop, glasses-not-ready teardown)\n // drop the ACK; Mentra Call then dies with CONNECT_ACK timeout even though\n // CONNECT landed. Auth still arrives on AUTH_UPDATE.\n this.sendToMiniapp(\n packageName,\n {\n type: MiniappResponseType.CONNECT_ACK,\n userId: \"\",\n packageName,\n capabilities,\n permissions: declaredPermissions,\n configuration: getMiniappConfiguration(packageName),\n hostFeatures: {captureAudio: true},\n },\n requestId,\n )\n this.deliverInitialMiniappAuth(packageName, authPromise, 0)\n this.sendCloudStatusToMiniapp(packageName)\n\n // Handshake complete — unblock any launcher.waitForConnect() callers.\n this.handshookApps.add(packageName)\n this.flushConnectWaiters(packageName)\n }\n\n private async requestMiniappAuth(packageName: string, opts?: {minTtlMs?: number}): Promise<MiniappAuthToken | null> {\n // Core owns miniapp-backend token minting. A Runtime-only deployment has\n // no such capability, so fail once instead of entering the retry loop.\n if (!cloudClientService.hasCore()) return null\n const authPackageName = getDevAppSourcePackage(packageName) ?? packageName\n const devAttestation = getDevAppAttestation(packageName) ?? undefined\n return cloudClientService.getMiniappAuthToken(authPackageName, {\n ...opts,\n ...(devAttestation ? {devAttestation} : {}),\n })\n }\n\n private async handleAuthRefresh(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const auth = await this.refreshMiniappAuth(packageName, this.authRefreshOptions(payload))\n if (!auth) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_CONNECTED,\n message: \"Miniapp auth is not configured\",\n })\n return\n }\n this.sendResult(packageName, requestId, true, {auth})\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: (err as Error)?.message ?? \"Miniapp auth refresh failed\",\n })\n }\n }\n\n private async refreshMiniappAuth(packageName: string, opts?: {minTtlMs?: number}): Promise<MiniappAuthToken | null> {\n const auth = await this.requestMiniappAuth(packageName, opts)\n if (!auth) return null\n this.scheduleMiniappAuthRefresh(packageName, auth)\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.AUTH_UPDATE,\n auth,\n })\n return auth\n }\n\n private authRefreshOptions(payload: Record<string, unknown>): {minTtlMs?: number} | undefined {\n const minTtlMs = Number(payload.minTtlMs)\n if (!Number.isFinite(minTtlMs) || minTtlMs <= 0) return undefined\n return {minTtlMs}\n }\n\n private scheduleMiniappAuthRefresh(packageName: string, auth: MiniappAuthToken): void {\n const app = this.connectedApps.get(packageName)\n if (!app) return\n this.clearMiniappAuthRefresh(packageName)\n\n const refreshAt = auth.expiresAt - MINIAPP_AUTH_REFRESH_HEADROOM_MS\n const delay = Math.max(MINIAPP_AUTH_REFRESH_MIN_DELAY_MS, refreshAt - Date.now())\n app.authRefreshTimerId = BgTimer.setTimeout(() => {\n const current = this.connectedApps.get(packageName)\n if (!current) return\n current.authRefreshTimerId = null\n void this.refreshMiniappAuth(packageName).catch((err) => {\n console.warn(`${LOG_TAG}: miniapp auth refresh failed for ${packageName}: ${(err as Error)?.message ?? err}`)\n })\n }, delay)\n }\n\n private clearMiniappAuthRefresh(packageName: string): void {\n const app = this.connectedApps.get(packageName)\n if (!app || app.authRefreshTimerId === null) return\n const timerId = app.authRefreshTimerId\n BgTimer.clearTimeout(timerId)\n app.authRefreshTimerId = null\n }\n\n /**\n * Deliver the miniapp's FIRST auth token, retrying until it lands. Called from\n * {@link handleConnect} when the initial mint didn't resolve in the CONNECT_ACK\n * window. `inFlight` lets attempt 0 reuse the mint the handshake already\n * started (avoids a redundant duplicate request); later attempts mint fresh.\n *\n * A `null` result means auth is fundamentally unavailable (no miniappAuth hook)\n * — permanent, so we do NOT retry. A REJECTION means a transient failure\n * (typically the cloud client isn't connection-ready yet) — retry with backoff.\n * Either way we bail if the app has since disconnected or already got a token\n * (e.g. via {@link redriveMiniappAuthDelivery} on cloud-connect).\n */\n private deliverInitialMiniappAuth(\n packageName: string,\n inFlight: Promise<MiniappAuthToken | null> | undefined,\n attempt: number,\n ): void {\n const app = this.connectedApps.get(packageName)\n if (!app || app.authDelivered) return\n const mint = inFlight ?? this.requestMiniappAuth(packageName)\n void mint\n .then((auth) => {\n const current = this.connectedApps.get(packageName)\n if (!current || current.authDelivered) return\n if (!auth) return // no auth hook — permanent, don't spin\n current.authDelivered = true\n this.clearMiniappAuthDeliveryRetry(packageName)\n this.scheduleMiniappAuthRefresh(packageName, auth)\n this.sendToMiniapp(packageName, {type: MiniappResponseType.AUTH_UPDATE, auth})\n })\n .catch((err) => {\n console.warn(\n `${LOG_TAG}: miniapp auth mint failed for ${packageName} (attempt ${attempt}): ${\n (err as Error)?.message ?? err\n }`,\n )\n this.scheduleInitialMiniappAuthRetry(packageName, attempt)\n })\n }\n\n private scheduleInitialMiniappAuthRetry(packageName: string, attempt: number): void {\n const app = this.connectedApps.get(packageName)\n if (!app || app.authDelivered) return\n this.clearMiniappAuthDeliveryRetry(packageName)\n const delay = Math.min(MINIAPP_AUTH_RETRY_MAX_MS, MINIAPP_AUTH_RETRY_BASE_MS * 2 ** attempt)\n app.authRetryTimerId = BgTimer.setTimeout(() => {\n const current = this.connectedApps.get(packageName)\n if (!current) return\n current.authRetryTimerId = null\n this.deliverInitialMiniappAuth(packageName, undefined, attempt + 1)\n }, delay)\n }\n\n private clearMiniappAuthDeliveryRetry(packageName: string): void {\n const app = this.connectedApps.get(packageName)\n if (!app || app.authRetryTimerId === null) return\n BgTimer.clearTimeout(app.authRetryTimerId)\n app.authRetryTimerId = null\n }\n\n /**\n * When the cloud client (re)connects, immediately re-attempt the initial mint\n * for any handshook app still missing its token, instead of waiting out the\n * backoff. This is what turns \"scan a dev app before the cloud is ready\" from\n * \"dead until you manually reconnect Cloud V2\" into \"authenticates on its own\n * the instant the connection comes up\".\n */\n private redriveMiniappAuthDelivery(): void {\n for (const [packageName, app] of this.connectedApps) {\n if (app.authDelivered) continue\n // Only apps that finished their CONNECT handshake are in the mint-retry\n // state; skip anything still mid-handshake (handleConnect owns that).\n if (!this.handshookApps.has(packageName)) continue\n this.clearMiniappAuthDeliveryRetry(packageName)\n this.deliverInitialMiniappAuth(packageName, undefined, 0)\n }\n }\n\n /**\n * TRANSCRIPTION_CONFIG (issue 021 WP3): store the miniapp's language hints\n * and rebuild the cloud subscription set so the auto-mode subscription\n * carries them. Replies with a REQUEST_RESULT so the SDK's configure()\n * promise settles: unknown hint values are an error, not a silent drop.\n */\n private handleTranscriptionConfig(packageName: string, payload: Record<string, unknown>, requestId?: string): void {\n const app = this.connectedApps.get(packageName)\n if (!app) return\n\n const config = (payload.config ?? {}) as Record<string, unknown>\n const rawHints = config.languageHints\n if (rawHints !== undefined && !Array.isArray(rawHints)) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"languageHints must be an array of language codes\",\n })\n return\n }\n\n if (rawHints === undefined || rawHints.length === 0) {\n this.transcriptionHintsByApp.delete(packageName)\n } else {\n // Defense in depth: the SDK already validated, but the wire is untyped.\n const hints: string[] = []\n const invalid: string[] = []\n for (const raw of rawHints as unknown[]) {\n const hint = typeof raw === \"string\" ? toLanguageHint(raw) : null\n if (hint) hints.push(hint)\n else invalid.push(String(raw))\n }\n if (invalid.length > 0) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: `Unknown language hint(s): ${invalid.join(\", \")}`,\n })\n return\n }\n this.transcriptionHintsByApp.set(packageName, [...new Set(hints)].sort())\n }\n\n this.updateCloudSubscriptions()\n this.sendResult(packageName, requestId, true, {applied: true})\n }\n\n private handleSubscribe(packageName: string, payload: Record<string, unknown>, requestId?: string): void {\n const app = this.connectedApps.get(packageName)\n if (!app) return\n\n const rawStreams = (payload.subscriptions ?? payload.streams) as\n | (string | {stream: string; rate?: string; forceLocal?: boolean; includeCloud?: boolean})[]\n | undefined\n // Normalize: objects like {stream: \"location_stream\", rate: \"realtime\"} → extract stream name\n // \"location_stream\" is the rate-bearing alias for \"location_update\".\n // The strictest rate wins when multiple `location_stream` entries appear\n // in one SUBSCRIBE — the same rule we apply across apps.\n let requestedLocationRate: string | null = null\n const forceLocalTranscriptionStreams = new Set<string>()\n const cloudTranscriptionStreams = new Set<string>()\n const streams = rawStreams?.map((s) => {\n if (typeof s === \"object\" && s !== null) {\n if (s.stream === \"location_stream\") {\n if (s.rate && locationRateRank(s.rate) > locationRateRank(requestedLocationRate)) {\n requestedLocationRate = s.rate\n }\n return \"location_update\"\n }\n if (s.forceLocal === true && s.stream.startsWith(\"transcription:\")) {\n forceLocalTranscriptionStreams.add(s.stream)\n }\n if (s.stream.startsWith(\"transcription:\") && (s.forceLocal !== true || s.includeCloud === true)) {\n cloudTranscriptionStreams.add(s.stream)\n }\n return s.stream\n }\n if (s.startsWith(\"transcription:\")) cloudTranscriptionStreams.add(s)\n return s\n }) as string[] | undefined\n if (!Array.isArray(streams)) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"subscribe requires a subscriptions array\",\n })\n return\n }\n\n for (const subscription of rawStreams ?? []) {\n const stream = typeof subscription === \"string\" ? subscription : subscription.stream\n if (stream.startsWith(\"translation:\") && !isFeatureEnabled(\"cloudSpeech\")) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_IMPLEMENTED,\n message: \"Cloud speech is disabled by this deployment\",\n })\n return\n }\n if (!stream.startsWith(\"transcription:\")) continue\n const forceLocal = typeof subscription === \"object\" && subscription.forceLocal === true\n const includeCloud = typeof subscription === \"object\" && subscription.includeCloud === true\n if (forceLocal && !isFeatureEnabled(\"onDeviceSpeech\")) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_IMPLEMENTED,\n message: \"On-device speech is disabled by this deployment\",\n })\n return\n }\n if ((!forceLocal || includeCloud) && !isFeatureEnabled(\"cloudSpeech\")) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_IMPLEMENTED,\n message: \"Cloud speech is disabled by this deployment\",\n })\n return\n }\n }\n\n console.log(`${LOG_TAG}: SUBSCRIBE from ${packageName}: [${streams.join(\", \")}]`)\n\n // Gate each stream on the permission type its data requires. The manifest\n // must declare the permission (miniapp.json -> permissions) or we reject\n // the whole subscribe with PERMISSION_NOT_DECLARED.\n const declaredTypes = new Set((app.installedManifest?.permissions ?? []).map((p) => p.type?.toUpperCase()))\n\n const permissionForStream = (s: string): string | null => {\n if (s === \"audio_chunk\" || s === \"vad\") return \"MICROPHONE\"\n if (s.startsWith(\"transcription\") || s.startsWith(\"translation\")) return \"MICROPHONE\"\n if (s === \"location_update\") return \"LOCATION\"\n if (s === \"phone_notification\") return \"READ_NOTIFICATIONS\"\n if (s === \"phone_notification_dismissed\") return \"READ_NOTIFICATIONS\"\n return null\n }\n\n for (const stream of streams) {\n const required = permissionForStream(stream)\n if (required && !declaredTypes.has(required)) {\n logPermissionNotDeclared(packageName, required, `to subscribe to \"${stream}\"`, `{\"type\": \"${required}\"}`)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: `${required} permission not declared in miniapp.json (required for \"${stream}\"). Add {\"type\": \"${required}\"} to the \"permissions\" array.`,\n // Extra context fields read by the SDK so authors that subscribe\n // to session.on(\"error\") can format their own messages.\n permission: required,\n subscription: stream,\n })\n return\n }\n }\n\n // Add new subscriptions\n const previousSubscriptions = app.subscriptions\n app.subscriptions = new Set(streams)\n app.forceLocalTranscriptionStreams = new Set(\n [...forceLocalTranscriptionStreams].filter((stream) => app.subscriptions.has(stream)),\n )\n app.cloudTranscriptionStreams = new Set(\n [...cloudTranscriptionStreams].filter((stream) => app.subscriptions.has(stream)),\n )\n this.replaceStreamSubscribers(packageName, previousSubscriptions, app.subscriptions)\n\n this.recomputeMicRequirements()\n this.updateCloudSubscriptions()\n this.recomputeHeadingSubscription()\n this.recomputeImuSubscription()\n // Persist this app's requested rate (or clear it if SUBSCRIBE didn't\n // include `location_stream` this time), then ask the host for the\n // strictest rate across all connected apps.\n app.requestedLocationRate = requestedLocationRate\n this.recomputeLocationTier()\n this.sendResult(packageName, requestId, true)\n\n // Fire initial snapshot values for stateful streams so miniapps don't have\n // to wait for the first change event.\n this.emitInitialSnapshots(packageName, streams)\n }\n\n private async handleCalendarListEvents(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const app = this.connectedApps.get(packageName)\n const declared = app?.installedManifest?.permissions?.some(\n (permission) => permission.type?.toUpperCase() === \"CALENDAR\",\n )\n if (!declared) {\n logPermissionNotDeclared(packageName, \"CALENDAR\", \"to list calendar events\", '{\"type\": \"CALENDAR\"}')\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: 'CALENDAR permission not declared in miniapp.json. Add {\"type\": \"CALENDAR\"} to the permissions array.',\n permission: \"CALENDAR\",\n })\n return\n }\n\n try {\n const result = await listPhoneCalendarEvents(payload)\n this.sendResult(packageName, requestId, true, result)\n } catch (error) {\n const known = error instanceof PhoneCalendarError\n this.sendResult(packageName, requestId, false, undefined, {\n code: known ? error.code : MiniappErrorCode.INTERNAL,\n message: error instanceof Error ? error.message : \"Failed to read phone calendar events\",\n })\n }\n }\n\n /**\n * For state-bearing streams (battery, connection), deliver the current value\n * immediately on subscribe. Other streams (button press, transcription, etc.)\n * are pure event streams with no \"current value\" to snapshot.\n */\n private emitInitialSnapshots(packageName: string, streams: string[]): void {\n // Read the engine glasses store directly (was a host glassesStatus hook).\n const gs = useGlassesStore.getState()\n const glassesState = {\n connected: isGlassesConnected(gs.connection),\n deviceModel: gs.deviceModel,\n batteryLevel: gs.batteryLevel,\n charging: gs.charging,\n }\n const isSimulated = (glassesState.deviceModel || \"\").toLowerCase().includes(\"simulated\")\n\n for (const stream of streams) {\n if (stream === \"glasses_battery\") {\n // Simulated glasses have no real battery; mirror the phone's battery\n // so miniapps see a sensible value during development.\n if (isSimulated) {\n void this.emitPhoneBatteryAs(packageName, \"glasses_battery\")\n } else if (typeof glassesState.batteryLevel === \"number\" && glassesState.batteryLevel >= 0) {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: \"glasses_battery\",\n data: {\n level: glassesState.batteryLevel,\n charging: !!glassesState.charging,\n timestamp: Date.now(),\n },\n })\n }\n } else if (stream === \"phone_battery\") {\n void this.emitPhoneBatteryAs(packageName, \"phone_battery\")\n } else if (stream === \"glasses_connection\") {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: \"glasses_connection\",\n data: {\n connected: glassesState.connected,\n modelName: glassesState.deviceModel || undefined,\n },\n })\n } else if (stream === \"glasses_wifi\") {\n // Snapshot the current glasses Wi-Fi state on subscribe (like battery).\n // Read the canonical nested `wifi: {state, ssid}` from the STORE state\n // (`glassesState` is the narrowed 4-field projection and has no `wifi`;\n // the pre-engine host hook spread the full store, so read gs directly —\n // NOT the legacy flat wifiConnected). Effective connectivity requires the\n // glasses connected AND on Wi-Fi — mirrors the host's store-derived\n // forward, so an already-disconnected device reports `connected: false`\n // rather than silently emitting nothing. Always emits so onWifi gets an\n // initial value.\n const wifi = gs.wifi.state === \"connected\" ? gs.wifi : null\n const connected = glassesState.connected === true && wifi !== null\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: \"glasses_wifi\",\n data: {\n connected,\n linkConnected: glassesState.connected === true,\n ssid: connected ? wifi?.ssid : undefined,\n localIp: connected ? wifi?.localIp : undefined,\n timestamp: Date.now(),\n },\n })\n } else if (stream === \"head_position\") {\n // The glasses store has no headUp field (same on the pre-engine host\n // hook), so this stays a no-emit until head state lands in the store.\n const headUp = (gs as {headUp?: boolean}).headUp\n if (typeof headUp === \"boolean\") {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: \"head_position\",\n data: {\n position: headUp ? \"up\" : \"down\",\n timestamp: Date.now(),\n },\n })\n }\n }\n }\n }\n\n /**\n * Read the phone's battery state right now and emit it as the given stream.\n * Used for both phone_battery snapshot on subscribe, and as a stand-in for\n * glasses_battery when connected to Simulated Glasses.\n */\n private async emitPhoneBatteryAs(\n packageName: string,\n streamType: \"phone_battery\" | \"glasses_battery\",\n ): Promise<void> {\n try {\n const level = await Battery.getBatteryLevelAsync()\n const state = await Battery.getBatteryStateAsync()\n const charging = state === Battery.BatteryState.CHARGING || state === Battery.BatteryState.FULL\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType,\n data: {\n level: Math.round(level * 100),\n charging,\n timestamp: Date.now(),\n },\n })\n } catch (err) {\n console.log(`${LOG_TAG}: phone battery snapshot failed`, err)\n }\n }\n\n private handleDisplay(packageName: string, payload: Record<string, unknown>, requestId?: string): void {\n try {\n // Zombie-frame gate: a dying miniapp's last in-flight frame can arrive\n // AFTER onUnmount cleared its display — repainting a dead app's UI (and\n // poisoning the next boot's pre-boot restore snapshot). Killed mid-route\n // nav reproduced this reliably; its 3s re-push raced the teardown.\n if (!this.connectedApps.has(packageName)) {\n console.log(`${LOG_TAG}: dropping display from unmounted app ${packageName}`)\n return\n }\n if (!payload.layout || typeof payload.layout !== \"object\") {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"display request missing layout object\",\n })\n return\n }\n\n // Hand off to LocalDisplayManager — it owns boot/throttle/arbitration/\n // expiry + the native BluetoothSdk.displayEvent call + useDisplayStore.\n localDisplayManager.request(packageName, {\n view: (payload.view as DisplayPayload[\"view\"]) ?? \"main\",\n layout: payload.layout as DisplayPayload[\"layout\"],\n durationMs: payload.durationMs as number | undefined,\n })\n\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n console.error(`${LOG_TAG}: display error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Display error\",\n })\n }\n }\n\n /**\n * Scene render (session.display.render()). Same arbitration as DISPLAY, but\n * the payload is a whole frame of positioned elements and the caller may be\n * awaiting the outcome: LocalDisplayManager guarantees the resolver fires\n * exactly once (displayed/blocked, with degraded/dropped reporting), and that\n * becomes the REQUEST_RESULT data.\n */\n private handleRender(packageName: string, payload: Record<string, unknown>, requestId?: string): void {\n try {\n // Zombie-frame gate — see handleDisplay.\n if (!this.connectedApps.has(packageName)) {\n this.sendResult(packageName, requestId, true, {status: \"blocked\", reason: \"app stopped\"})\n return\n }\n if (!Array.isArray(payload.elements)) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"render request missing elements array\",\n })\n return\n }\n\n localDisplayManager.request(\n packageName,\n {\n view: (payload.view as DisplayPayload[\"view\"]) ?? \"main\",\n scene: payload.elements as DisplayPayload[\"scene\"],\n durationMs: payload.durationMs as number | undefined,\n },\n (result) => this.sendResult(packageName, requestId, true, result),\n )\n } catch (err) {\n console.error(`${LOG_TAG}: render error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Render error\",\n })\n }\n }\n\n private handlePlayAudio(packageName: string, payload: Record<string, unknown>, requestId?: string): void {\n const audioUrl = (payload.audioUrl ?? payload.url) as string | undefined\n if (!audioUrl) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"play_audio requires an audioUrl\",\n })\n return\n }\n\n const audioRequestId = requestId || `local_${Date.now()}`\n const volume = typeof payload.volume === \"number\" ? payload.volume : 1.0\n const stopOtherAudio = payload.stopOtherAudio !== false\n\n this.cancelSpeech(packageName)\n this.setSpeakerState(packageName, \"loading\")\n audioPlaybackService.play(\n {requestId: audioRequestId, audioUrl, appId: packageName, volume, stopOtherAudio},\n (_respId, success, error, duration) => {\n if (success) {\n this.setSpeakerState(packageName, \"stopped\", {durationMs: duration ?? undefined})\n } else {\n this.setSpeakerState(packageName, \"error\", {\n errorCode: MiniappErrorCode.INTERNAL,\n errorMessage: error ?? \"play failed\",\n durationMs: duration ?? undefined,\n })\n }\n this.sendResult(\n packageName,\n requestId,\n success,\n {duration},\n error\n ? {\n code: MiniappErrorCode.INTERNAL,\n message: error,\n }\n : undefined,\n )\n },\n )\n // Optimistic \"started playing\" transition. The audio service doesn't\n // have a \"playback actually started\" callback today; cloud SDK v3 has\n // the same constraint and uses optimistic timing. Microtask so the\n // initial \"loading\" envelope flushes first.\n queueMicrotask(() => this.setSpeakerState(packageName, \"playing\"))\n }\n\n private handleStopAudio(packageName: string, _payload: Record<string, unknown>, requestId?: string): void {\n this.cancelSpeech(packageName)\n audioPlaybackService.stopForApp(packageName)\n this.setSpeakerState(packageName, \"stopped\")\n this.sendResult(packageName, requestId, true)\n }\n\n // ── speaker.createStream (live PCM output) ────────────────────────────────\n\n /** Valid PCM sample rates for speaker streams. Mirrors the SDK contract. */\n private static readonly SPEAKER_STREAM_SAMPLE_RATES = new Set([16000, 24000, 48000])\n private static readonly SPEAKER_STREAM_MAX_BASE64_CHARS = Math.ceil((256 * 1024) / 3) * 4\n private speakerStreamCounter = 0\n\n private async handleSpeakerStreamOpen(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const app = this.connectedApps.get(packageName)\n if (!app) return\n\n // One stream per miniapp: opening a second closes the first.\n const previous = app.activeSpeakerStreamId\n if (previous) {\n app.activeSpeakerStreamId = undefined\n await audioPlaybackService.abortStream(previous).catch((error) => {\n console.warn(`${LOG_TAG}: failed to abort previous speaker stream for ${packageName}`, error)\n })\n }\n\n const sampleRate = typeof payload.sampleRate === \"number\" ? payload.sampleRate : 16000\n if (!LocalMiniappRuntime.SPEAKER_STREAM_SAMPLE_RATES.has(sampleRate)) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: `unsupported sampleRate ${sampleRate} (use 16000, 24000, or 48000)`,\n })\n return\n }\n const channels = typeof payload.channels === \"number\" ? payload.channels : 1\n if (channels !== 1) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: \"speaker streams currently support mono PCM only\",\n })\n return\n }\n const volume = typeof payload.volume === \"number\" ? payload.volume : 1\n if (!Number.isFinite(volume) || volume < 0 || volume > 1) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: \"speaker stream volume must be between 0 and 1\",\n })\n return\n }\n\n const streamId = `spkstream_${Date.now()}_${++this.speakerStreamCounter}`\n this.setSpeakerState(packageName, \"loading\")\n try {\n await audioPlaybackService.openStream({\n streamId,\n appId: packageName,\n sampleRate,\n channels,\n volume,\n stopOtherAudio: payload.stopOtherAudio !== false,\n onEnded: (endedId, success, error, durationMs) => {\n const current = this.connectedApps.get(packageName)\n // Ignore completion from an app incarnation replaced by a crash\n // respawn. Its abort may finish after the new app has registered and\n // must not overwrite that app's speaker state.\n if (current !== app) return\n if (current.activeSpeakerStreamId === endedId) current.activeSpeakerStreamId = undefined\n if (success) {\n this.setSpeakerState(packageName, \"stopped\", {durationMs: durationMs ?? undefined})\n } else {\n this.setSpeakerState(packageName, \"error\", {\n errorCode: MiniappErrorCode.INTERNAL,\n errorMessage: error ?? \"speaker stream failed\",\n durationMs: durationMs ?? undefined,\n })\n }\n },\n })\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n this.setSpeakerState(packageName, \"error\", {\n errorCode: MiniappErrorCode.INTERNAL,\n errorMessage: message,\n })\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message,\n })\n return\n }\n\n // The native open can outlive a miniapp disconnect. Its ordinary teardown\n // ran while no StreamState existed yet, so close this late result here\n // instead of leaving an orphan AudioTrack/AVAudioEngine session.\n if (this.connectedApps.get(packageName) !== app) {\n await audioPlaybackService.abortStream(streamId)\n return\n }\n app.activeSpeakerStreamId = streamId\n // Optimistic \"playing\", same as play(): the chunk player starts as soon\n // as the first write lands. Microtask so \"loading\" flushes first.\n queueMicrotask(() => this.setSpeakerState(packageName, \"playing\"))\n this.sendResult(packageName, requestId, true, {streamId})\n }\n\n /** Resolve + validate a stream id from a payload against the app's active stream. */\n private activeSpeakerStream(packageName: string, payload: Record<string, unknown>): string | null {\n const streamId = typeof payload.streamId === \"string\" ? payload.streamId : undefined\n const app = this.connectedApps.get(packageName)\n if (!streamId || !app || app.activeSpeakerStreamId !== streamId) return null\n return streamId\n }\n\n private async handleSpeakerStreamWrite(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const streamId = this.activeSpeakerStream(packageName, payload)\n if (!streamId) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"speaker stream is not open\",\n })\n return\n }\n const base64 = typeof payload.base64 === \"string\" ? payload.base64 : \"\"\n if (!base64 || base64.length % 4 !== 0) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: \"speaker stream write requires padded base64 PCM data\",\n })\n return\n }\n if (base64.length > LocalMiniappRuntime.SPEAKER_STREAM_MAX_BASE64_CHARS) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PAYLOAD_TOO_LARGE,\n message: \"speaker stream chunk exceeds the 256 KB raw PCM limit\",\n })\n return\n }\n try {\n const result = await audioPlaybackService.writeStreamChunk(streamId, base64)\n this.sendResult(packageName, requestId, true, result)\n } catch (error) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n private async handleSpeakerStreamClose(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const streamId = this.activeSpeakerStream(packageName, payload)\n if (!streamId) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"speaker stream is not open\",\n })\n return\n }\n try {\n // Resolves once the buffered audio has drained; onEnded delivers the\n // terminal SPEAKER_STATE (\"stopped\").\n const result = await audioPlaybackService.closeStream(streamId)\n this.sendResult(packageName, requestId, true, result)\n } catch (error) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n private async handleSpeakerStreamAbort(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const streamId = this.activeSpeakerStream(packageName, payload)\n if (!streamId) {\n // Aborting an already-gone stream is fine — abort() is idempotent.\n this.sendResult(packageName, requestId, true)\n return\n }\n try {\n await audioPlaybackService.abortStream(streamId)\n this.sendResult(packageName, requestId, true)\n } catch (error) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n private async handleSpeak(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n const rawText = payload.text\n const rawSentences =\n typeof rawText === \"string\"\n ? [rawText.trim()].filter(Boolean)\n : Array.isArray(rawText)\n ? rawText\n .filter((sentence): sentence is string => typeof sentence === \"string\")\n .map((sentence) => sentence.trim())\n .filter(Boolean)\n : []\n const enableSanitization = payload.enableSanitization !== false\n const sentences = prepareTtsSentences(rawSentences, enableSanitization)\n if (sentences.length === 0) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"speak requires text or a non-empty sentence list with speakable content\",\n })\n return\n }\n const cloudText = sentences.join(\" \")\n\n const voice = ((payload.voice_id ?? payload.voice) as string) || \"default\"\n const audioRequestId = requestId || `tts_${Date.now()}`\n const volume = typeof payload.volume === \"number\" ? payload.volume : 1.0\n const stopOtherAudio = payload.stopOtherAudio !== false\n const voiceSettings =\n payload.voice_settings && typeof payload.voice_settings === \"object\"\n ? (payload.voice_settings as Record<string, unknown>)\n : undefined\n const speed = typeof voiceSettings?.speed === \"number\" ? voiceSettings.speed : undefined\n const run: SpeechRun = {id: audioRequestId, cancelled: false}\n\n this.cancelSpeech(packageName)\n this.speechRuns.set(packageName, run)\n this.setSpeakerState(packageName, \"loading\")\n\n let terminalSent = false\n const sendPlaybackResult = (\n success: boolean,\n error: string | null,\n duration: number | null,\n fallbackErrorMessage: string,\n completed = success,\n errorCode: MiniappErrorCode = MiniappErrorCode.TTS_UPSTREAM_ERROR,\n ) => {\n if (terminalSent) return\n terminalSent = true\n\n // A superseded run still owns its bridge request, but it no longer owns\n // the package's shared speaker state.\n const ownsSpeakerState = this.speechRuns.get(packageName) === run\n if (ownsSpeakerState) this.speechRuns.delete(packageName)\n\n if (ownsSpeakerState) {\n if (success) {\n this.setSpeakerState(packageName, \"stopped\", {durationMs: duration ?? undefined})\n } else {\n this.setSpeakerState(packageName, \"error\", {\n errorCode,\n errorMessage: error ?? fallbackErrorMessage,\n durationMs: duration ?? undefined,\n })\n }\n }\n\n this.sendResult(\n packageName,\n requestId,\n success,\n {completed, duration},\n error\n ? {\n code: errorCode,\n message: error,\n }\n : undefined,\n )\n }\n run.onCancelled = () => sendPlaybackResult(true, null, null, \"tts playback stopped\", false)\n\n try {\n const voiceExplicit = payload.voice_id !== undefined || payload.voice !== undefined\n const offlineSupportsVoice =\n !voiceExplicit || voice === \"default\" || ttsModelManager.getAvailableLanguages().some((l) => l.code === voice)\n\n const modelId = typeof payload.model_id === \"string\" ? payload.model_id : undefined\n const forceLocal = payload.forceLocal === true\n const cloudConnected = cloudClientService.isConnected()\n console.log(\n `${LOG_TAG}: TTS decision for ${packageName}: cloudConnected=${cloudConnected}, runtimeTts=yes, offlineVoice=${offlineSupportsVoice}, forceLocal=${forceLocal}`,\n )\n\n const playOfflineTts = async (reason?: string): Promise<boolean> => {\n if (run.cancelled) return true\n if (!isFeatureEnabled(\"onDeviceSpeech\")) return false\n if (!offlineSupportsVoice || !(await ttsModelManager.isModelAvailable())) {\n return false\n }\n if (run.cancelled) return true\n\n const languageCode = ttsModelManager.getAvailableLanguages().some((l) => l.code === voice) ? voice : undefined\n const offlineSentences = sentences\n\n if (offlineSentences.length > 1) {\n let firstSentence: TtsSynthesisResult\n try {\n firstSentence = await ttsModelManager.synthesizeToFile(offlineSentences[0], {languageCode, speed})\n } catch (offlineErr) {\n if (run.cancelled) return true\n console.warn(\n `${LOG_TAG}: offline sentence TTS synthesize failed${reason ? ` after ${reason}` : \"\"}:`,\n offlineErr,\n )\n return false\n }\n\n if (run.cancelled) {\n await Promise.resolve(firstSentence.cleanup?.())\n return true\n }\n void runSentenceTtsPipeline({\n sentences: offlineSentences,\n firstAudio: firstSentence,\n run,\n synthesize: (sentence) => ttsModelManager.synthesizeToFile(sentence, {languageCode, speed}),\n play: (audio, index) =>\n new Promise((resolve) => {\n const sentenceRequestId = `${audioRequestId}_sentence_${index}`\n run.playbackRequestId = sentenceRequestId\n audioPlaybackService.play(\n {\n requestId: sentenceRequestId,\n audioUrl: audio.audioUrl,\n appId: packageName,\n volume,\n stopOtherAudio,\n },\n (_responseId, success, error, duration, completionReason) => {\n if (run.playbackRequestId === sentenceRequestId) run.playbackRequestId = undefined\n resolve({success, completed: completionReason === \"completed\", error, duration})\n },\n )\n }),\n onCleanupError: (cleanupError) => {\n console.warn(`${LOG_TAG}: sentence TTS cleanup failed`, cleanupError)\n },\n }).then(\n ({success, completed, error, duration}) => {\n sendPlaybackResult(success, error, duration, \"offline sentence tts playback failed\", completed)\n },\n (pipelineError: unknown) => {\n const message = pipelineError instanceof Error ? pipelineError.message : String(pipelineError)\n sendPlaybackResult(false, message, null, \"offline sentence tts playback failed\", false)\n },\n )\n queueMicrotask(() => {\n if (this.speechRuns.get(packageName) === run) this.setSpeakerState(packageName, \"playing\")\n })\n return true\n }\n\n let offlineGenerated: TtsSynthesisResult | undefined\n\n try {\n offlineGenerated = await ttsModelManager.synthesizeToFile(offlineSentences[0], {languageCode, speed})\n } catch (offlineErr) {\n if (run.cancelled) return true\n console.warn(`${LOG_TAG}: offline TTS synthesize failed${reason ? ` after ${reason}` : \"\"}:`, offlineErr)\n return false\n }\n\n const generated = offlineGenerated\n if (run.cancelled) {\n await Promise.resolve(generated.cleanup?.())\n return true\n }\n run.playbackRequestId = audioRequestId\n audioPlaybackService.play(\n {\n requestId: audioRequestId,\n audioUrl: generated.audioUrl,\n appId: packageName,\n volume,\n stopOtherAudio,\n },\n (_respId, success, error, duration, completionReason) => {\n if (run.playbackRequestId === audioRequestId) run.playbackRequestId = undefined\n void Promise.resolve(generated.cleanup?.()).catch((cleanupError) => {\n console.warn(`${LOG_TAG}: offline TTS cleanup failed`, cleanupError)\n })\n sendPlaybackResult(\n success,\n error,\n duration,\n \"offline tts playback failed\",\n completionReason === \"completed\",\n )\n },\n )\n queueMicrotask(() => {\n if (this.speechRuns.get(packageName) === run) this.setSpeakerState(packageName, \"playing\")\n })\n return true\n }\n\n const playCloudTts = async (fallbackToOffline: boolean): Promise<boolean> => {\n if (run.cancelled) return true\n let source: Awaited<ReturnType<typeof cloudClientService.tts.speak>>\n try {\n source = await cloudClientService.tts.speak(cloudText, {\n ...(voiceExplicit && voice !== \"default\" ? {voice_id: voice} : {}),\n ...(modelId ? {model_id: modelId} : {}),\n ...(voiceSettings ? {voice_settings: voiceSettings} : {}),\n })\n } catch (cloudErr) {\n if (run.cancelled) return true\n const error = cloudErr instanceof Error ? cloudErr.message : String(cloudErr)\n console.warn(`${LOG_TAG}: cloud TTS source failed: ${error}`)\n if (fallbackToOffline && (await playOfflineTts(\"cloud tts source failed\"))) {\n return true\n }\n sendPlaybackResult(false, error, null, \"tts failed\")\n return true\n }\n\n if (run.cancelled) return true\n\n run.playbackRequestId = audioRequestId\n await Promise.resolve(\n audioPlaybackService.play(\n {\n requestId: audioRequestId,\n audioUrl: source.audioUrl,\n appId: packageName,\n volume,\n stopOtherAudio,\n },\n (_respId, success, error, duration, completionReason) => {\n if (run.playbackRequestId === audioRequestId) run.playbackRequestId = undefined\n if (!success && fallbackToOffline) {\n void playOfflineTts(\"cloud tts playback failed\").then((started) => {\n if (!started) {\n sendPlaybackResult(false, error, duration, \"tts failed\")\n }\n })\n return\n }\n sendPlaybackResult(success, error, duration, \"tts failed\", completionReason === \"completed\")\n },\n ),\n )\n queueMicrotask(() => {\n if (this.speechRuns.get(packageName) === run) this.setSpeakerState(packageName, \"playing\")\n })\n return true\n }\n\n if (forceLocal) {\n if (await playOfflineTts()) {\n return\n }\n if (run.cancelled) return\n const message = \"tts unavailable: forceLocal requested but offline TTS model is not available\"\n sendPlaybackResult(false, message, null, message, false, MiniappErrorCode.TTS_LOCAL_UNAVAILABLE)\n return\n }\n\n if (cloudConnected && (await playCloudTts(true))) {\n return\n }\n\n // Offline is the disconnected-cloud fallback. If the model is not\n // available, preserve the old behavior by trying cloud as a last resort.\n if (await playOfflineTts(cloudConnected ? undefined : \"cloud disconnected\")) {\n return\n }\n\n if (await playCloudTts(false)) {\n return\n }\n\n const message = \"tts unavailable: no cloud TTS URL or offline TTS model\"\n sendPlaybackResult(false, message, null, message, false)\n } catch (err) {\n console.error(`${LOG_TAG}: speak error:`, err)\n const message = err instanceof Error ? err.message : \"TTS error\"\n sendPlaybackResult(false, message, null, \"TTS error\", false)\n }\n }\n\n private cancelSpeech(packageName: string): void {\n const run = this.speechRuns.get(packageName)\n if (!run) return\n run.cancelled = true\n this.speechRuns.delete(packageName)\n if (run.playbackRequestId) audioPlaybackService.cancelPlayback(run.playbackRequestId)\n run.onCancelled?.()\n }\n\n private async handleRgbLed(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n const coerceNumber = (value: unknown, fallback: number): number => {\n const coerced = Number(value)\n return Number.isFinite(coerced) ? coerced : fallback\n }\n\n const ledRequestId = requestId || `led_${Date.now()}`\n const action = normalizeRgbLedAction(payload.action)\n const color = normalizeRgbLedColor(payload.color)\n\n try {\n const result = await BluetoothSdk.rgbLedControl(\n ledRequestId,\n packageName,\n action,\n color,\n coerceNumber(payload.ontime, 1000),\n coerceNumber(payload.offtime, 0),\n coerceNumber(payload.count, 1),\n )\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"RGB LED command failed\",\n })\n }\n }\n\n private async handleLocationPoll(packageName: string, requestId?: string): Promise<void> {\n try {\n // Expo's Android requestForegroundPermissionsAsync always delegates to\n // Activity.requestPermissions(), even when permission is already granted.\n // Calling it after the user presses Home therefore waits until the Activity\n // resumes. Read the current grant first, and only enter the prompt flow\n // while the Activity is actually foregrounded.\n const permissionStartedAt = Date.now()\n const permission = await resolveForegroundLocationPermission(Location, () => AppState.currentState)\n const {status} = permission\n console.log(\n `${LOG_TAG}: location poll permission status=${status} appState=${AppState.currentState} elapsed=${\n Date.now() - permissionStartedAt\n }ms`,\n )\n if (status !== \"granted\") {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: \"Location permission not granted\",\n })\n return\n }\n\n // Try the OS cache first — usually instant — and only fall back to\n // a fresh fix if the cache is empty. Use Low accuracy on the fresh\n // path so we get a cell/wifi-tower fix in ~1s instead of waiting\n // for full GPS warm-up.\n const locationStartedAt = Date.now()\n const cached = await Location.getLastKnownPositionAsync({maxAge: 60_000})\n console.log(`${LOG_TAG}: location poll cache hit=${cached !== null} elapsed=${Date.now() - locationStartedAt}ms`)\n const location = cached ?? (await Location.getCurrentPositionAsync({accuracy: Location.Accuracy.Low}))\n console.log(`${LOG_TAG}: location poll resolved elapsed=${Date.now() - locationStartedAt}ms`)\n\n this.sendResult(packageName, requestId, true, {\n lat: location.coords.latitude,\n lng: location.coords.longitude,\n accuracy: location.coords.accuracy ?? undefined,\n timestamp: location.timestamp,\n })\n } catch (err) {\n console.error(`${LOG_TAG}: location poll error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Location error\",\n })\n }\n }\n\n // ---------------------------------------------------------------------------\n // Navigation\n // ---------------------------------------------------------------------------\n\n /**\n * All navigation handlers + their state live in NavigationHandlers. The\n * dispatcher's NAVIGATION_* cases delegate here; the rest of the runtime\n * cross-cuts navigation through {@link NavigationHandlers.onDisconnect}\n * (mini-app disconnect) and {@link NavigationHandlers.isTripActive}\n * (location-stream gating during a trip).\n */\n private readonly navigationHandlers = new NavigationHandlers(\n (packageName, envelope) => this.sendToMiniapp(packageName, envelope),\n (packageName, requestId, ok, result, error) => this.sendResult(packageName, requestId, ok, result, error),\n )\n\n /**\n * `session.blob` — persistent, per-app binary storage. Like NavigationHandlers,\n * the BLOB_* dispatcher cases delegate here. It's a generic byte store; audio\n * recording lives entirely in the miniapp (mic.onAudioChunk → chunked\n * BLOB_WRITE), so nothing audio-specific runs in the host.\n */\n private readonly blobStore = new BlobStore({\n sendResult: (packageName, requestId, ok, result, error) =>\n this.sendResult(packageName, requestId, ok, result, error),\n getUserId: () => cloudClientService.getMentraUserId(),\n })\n private readonly blobRequestQueues = new Map<string, Promise<void>>()\n\n private readonly simpleStorage = new LocalMiniappStorage({\n backend: localMiniappStorageBackend,\n getUserId: () => cloudClientService.resolveMentraUserId(),\n })\n\n /**\n * BlobStore's file helpers are synchronous once a user namespace is selected,\n * but first-boot Core auth is not. Queue requests per app behind stable\n * identity resolution so CREATE/WRITE/COMMIT ordering survives that wait.\n */\n private enqueueBlobRequest(\n packageName: string,\n requestId: string | undefined,\n operation: () => Promise<void> | void,\n ): void {\n const app = this.connectedApps.get(packageName)\n const previous = this.blobRequestQueues.get(packageName) ?? Promise.resolve()\n const queued = previous.then(async () => {\n try {\n await cloudClientService.resolveMentraUserId()\n } catch (err) {\n console.error(`${LOG_TAG}: blob identity error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_CONNECTED,\n message: \"Blob storage is unavailable before sign-in completes\",\n })\n return\n }\n\n // unregisterApp() or a crash-respawn may have replaced this app while\n // identity resolution was pending. Never replay an old context's request\n // against its replacement.\n if (!app || this.connectedApps.get(packageName) !== app) return\n\n // Invoke in request order, but do not keep the queue occupied for the\n // lifetime of an async picker, download, or share sheet. CREATE/WRITE/\n // COMMIT are synchronous and therefore still dispatch strictly in order.\n try {\n const pending = operation()\n if (pending) {\n void pending.catch((err) => this.handleBlobRequestError(packageName, requestId, err))\n }\n } catch (err) {\n this.handleBlobRequestError(packageName, requestId, err)\n }\n })\n this.blobRequestQueues.set(packageName, queued)\n void queued.finally(() => {\n if (this.blobRequestQueues.get(packageName) === queued) this.blobRequestQueues.delete(packageName)\n })\n }\n\n private handleBlobRequestError(packageName: string, requestId: string | undefined, err: unknown): void {\n console.error(`${LOG_TAG}: blob request error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Blob storage error\",\n })\n }\n\n /**\n * Heading is a sensor stream — start the native compass when any mini\n * app is subscribed to \"heading_update\", stop it when none are.\n */\n private headingUnsub: (() => void) | null = null\n private recomputeHeadingSubscription(): void {\n const wantsHeading = this.streamSubscribers.has(MiniappStreamType.HEADING_UPDATE)\n if (wantsHeading && !this.headingUnsub) {\n // Heading sensor lives in engine (HeadingService) — subscribe directly.\n this.headingUnsub = headingService.addListener((degrees: number) => {\n this.forwardEvent(MiniappStreamType.HEADING_UPDATE, {degrees})\n })\n } else if (!wantsHeading && this.headingUnsub) {\n this.headingUnsub()\n this.headingUnsub = null\n }\n }\n\n /**\n * Accelerometer is a sensor stream — enable the glasses IMU when any mini\n * app is subscribed to \"accel_data\", disable it when none are. Mirrors the\n * heading pattern. Only G2 streams IMU today; on other devices the native\n * call is a no-op so this is harmless.\n */\n private imuEnabled = false\n private recomputeImuSubscription(): void {\n const wantsImu = this.streamSubscribers.has(MiniappStreamType.ACCEL_DATA)\n if (wantsImu === this.imuEnabled) return\n this.imuEnabled = wantsImu\n void BluetoothSdk.setImuEnabled(wantsImu)\n }\n\n /**\n * Last rate we asked the host for. Lets us skip the cross-process call\n * when nothing actually changed (most SUBSCRIBE / unregister churn\n * leaves the aggregate unchanged) and tracks state for the no-active-\n * subscribers → tell host to back off case.\n */\n private lastAppliedLocationRate: LocationRate | null = null\n\n /**\n * Recompute the aggregate location tier across every connected\n * miniapp and push the result to the host. The aggregate is the\n * STRICTEST rate any single app has requested — see\n * {@link LOCATION_RATE_PRIORITY} — because the GPS sample rate is a\n * shared OS-level setting that we can't bias per-app.\n *\n * Called after every SUBSCRIBE and every unregister so that when a\n * realtime-requesting app goes away the tier falls back down. If no\n * connected app is asking for a location rate, we tell the host\n * \"off\" so it can drop GPS power.\n */\n private recomputeLocationTier(): void {\n let bestRank = -1\n for (const app of this.connectedApps.values()) {\n const r = app.requestedLocationRate\n if (!r) continue\n const rank = locationRateRank(r)\n if (rank > bestRank) {\n bestRank = rank\n }\n }\n // When no app is asking, downgrade to \"off\". Without this we'd\n // leak the last-known-strictest rate forever (the original bug).\n const next: LocationRate = bestRank >= 0 ? LOCATION_RATE_PRIORITY[bestRank] : \"off\"\n if (next === this.lastAppliedLocationRate) return\n this.lastAppliedLocationRate = next\n console.log(`[LOCATION] aggregate tier → ${next}`)\n void phoneLocationService.setLocationTier(next)\n }\n\n // ---------------------------------------------------------------------------\n // Storage helpers\n // ---------------------------------------------------------------------------\n\n private async handleStorageGet(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const key = payload.key as string\n if (!key) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"storage_get requires a key\",\n })\n return\n }\n const value = await this.simpleStorage.get(packageName, key)\n this.sendResult(packageName, requestId, true, {key, value})\n } catch (err) {\n console.error(`${LOG_TAG}: storage_get error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Storage error\",\n })\n }\n }\n\n private async handleStorageSet(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const key = payload.key as string\n if (!key) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"storage_set requires a key\",\n })\n return\n }\n await this.simpleStorage.set(packageName, key, payload.value ?? null)\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n console.error(`${LOG_TAG}: storage_set error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Storage error\",\n })\n }\n }\n\n private async handleStorageDelete(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const key = payload.key as string\n if (!key) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"storage_delete requires a key\",\n })\n return\n }\n await this.simpleStorage.delete(packageName, key)\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n console.error(`${LOG_TAG}: storage_delete error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Storage error\",\n })\n }\n }\n\n private async handleStorageList(\n packageName: string,\n _payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const keys = await this.simpleStorage.keys(packageName)\n this.sendResult(packageName, requestId, true, {keys})\n } catch (err) {\n console.error(`${LOG_TAG}: storage_list error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Storage error\",\n })\n }\n }\n\n private async handleStorageClear(packageName: string, requestId?: string): Promise<void> {\n try {\n await this.simpleStorage.clear(packageName)\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n console.error(`${LOG_TAG}: storage_clear error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Storage error\",\n })\n }\n }\n\n private async handleStorageHas(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const key = payload.key as string\n if (!key) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"storage_has requires a key\",\n })\n return\n }\n const has = await this.simpleStorage.has(packageName, key)\n this.sendResult(packageName, requestId, true, {has})\n } catch (err) {\n console.error(`${LOG_TAG}: storage_has error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Storage error\",\n })\n }\n }\n\n private async handleStorageGetAll(packageName: string, requestId?: string): Promise<void> {\n try {\n const values = await this.simpleStorage.getAll(packageName)\n this.sendResult(packageName, requestId, true, {values})\n } catch (err) {\n console.error(`${LOG_TAG}: storage_get_all error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Storage error\",\n })\n }\n }\n\n private async handleStorageSetMultiple(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n const values = payload.values as Record<string, unknown> | undefined\n if (!values || typeof values !== \"object\") {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: \"storage_set_multiple requires a values object\",\n })\n return\n }\n await this.simpleStorage.setMultiple(packageName, values)\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n console.error(`${LOG_TAG}: storage_set_multiple error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Storage error\",\n })\n }\n }\n\n // ---------------------------------------------------------------------------\n // Wi-Fi ADB\n // ---------------------------------------------------------------------------\n\n private async handleSetWifiAdbState(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const result = await handleWifiAdbRequest(packageName, payload, {\n isSystemPackage: (candidate) => this.isSystemPackage(candidate),\n setWifiAdbState: async (enabled) => {\n console.log(`${LOG_TAG}: set_wifi_adb_state enabled=${enabled} from ${packageName}`)\n try {\n await BluetoothSdk.setWifiAdbState(enabled)\n } catch (error) {\n console.error(`${LOG_TAG}: set_wifi_adb_state error:`, error)\n throw error\n }\n },\n })\n\n if (result.ok) {\n this.sendResult(packageName, requestId, true)\n return\n }\n\n this.sendResult(packageName, requestId, false, undefined, result.error)\n }\n\n // ---------------------------------------------------------------------------\n // Camera FOV\n // ---------------------------------------------------------------------------\n\n private async handleCameraFov(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const app = this.connectedApps.get(packageName)\n const hasCameraPermission = app?.installedManifest?.permissions?.some((p) => p.type === \"CAMERA\")\n if (!hasCameraPermission) {\n logPermissionNotDeclared(packageName, \"CAMERA\", \"to set camera FOV\", `{\"type\": \"CAMERA\"}`)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: `CAMERA permission not declared in miniapp.json. Add {\"type\": \"CAMERA\"} to the \"permissions\" array.`,\n permission: \"CAMERA\",\n operation: MiniappRequestType.CAMERA_FOV,\n })\n return\n }\n\n try {\n const request = normalizeCameraFovPayload(payload)\n const description =\n \"preset\" in request ? `preset=${request.preset}` : `fov=${request.fov} roi=${request.roiPosition ?? \"center\"}`\n console.log(`${LOG_TAG}: camera_fov_set ${description}`)\n\n const result = await phoneCameraFovCoordinator.setOverride(packageName, request)\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n console.error(`${LOG_TAG}: camera_fov error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Camera FOV error\",\n })\n }\n }\n\n /**\n * Explicit IMU enable/disable from a miniapp (session.imu.setEnabled).\n *\n * The accel stream already auto-toggles the native IMU on subscribe (see\n * {@link recomputeImuSubscription}); this is a direct override. We sync\n * `this.imuEnabled` to the requested state so a subsequent subscription\n * recompute with the same aggregate doesn't issue a redundant native call.\n * Note that a later subscribe/unsubscribe that changes the aggregate will\n * still re-derive the sensor state from subscriptions.\n */\n private handleImuSetEnabled(packageName: string, payload: Record<string, unknown>, requestId?: string): void {\n try {\n const enabled = !!payload.enabled\n console.log(`${LOG_TAG}: imu_set_enabled ${enabled} (by ${packageName})`)\n this.imuEnabled = enabled\n void BluetoothSdk.setImuEnabled(enabled)\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n console.error(`${LOG_TAG}: imu_set_enabled error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"IMU set-enabled error\",\n })\n }\n }\n\n /**\n * Lifecycle-scoped glasses-side VAD override from a miniapp\n * (session.mic.setVoiceActivityDetectionEnabled). Requires MICROPHONE in the\n * miniapp manifest. Mentra Live only today — other models no-op via DeviceStore.\n */\n private async handleMicSetVadEnabled(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const app = this.connectedApps.get(packageName)\n const hasMicPermission = app?.installedManifest?.permissions?.some((p) => p.type === \"MICROPHONE\")\n if (!hasMicPermission) {\n logPermissionNotDeclared(packageName, \"MICROPHONE\", \"to set VAD enabled\", `{\"type\": \"MICROPHONE\"}`)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: `MICROPHONE permission not declared in miniapp.json. Add {\"type\": \"MICROPHONE\"} to the \"permissions\" array.`,\n permission: \"MICROPHONE\",\n operation: MiniappRequestType.MIC_SET_VAD_ENABLED,\n })\n return\n }\n\n if (typeof payload.enabled !== \"boolean\") {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: \"enabled must be a boolean\",\n })\n return\n }\n\n try {\n const enabled = payload.enabled\n console.log(`${LOG_TAG}: mic_set_vad_enabled ${enabled} (by ${packageName})`)\n await micStateCoordinator.setMiniappGateOverride(packageName, \"vad\", enabled, this.getConfiguredMicGates())\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n console.error(`${LOG_TAG}: mic_set_vad_enabled error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"VAD set-enabled error\",\n })\n }\n }\n\n /**\n * Lifecycle-scoped center-mic loudness gate (\"Barrier\") override from a miniapp\n * (session.mic.setLoudnessGateEnabled). Requires MICROPHONE in the miniapp\n * manifest. Mentra Live only today — other models no-op via DeviceStore.\n */\n private async handleMicSetLoudnessGateEnabled(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const app = this.connectedApps.get(packageName)\n const hasMicPermission = app?.installedManifest?.permissions?.some((p) => p.type === \"MICROPHONE\")\n if (!hasMicPermission) {\n logPermissionNotDeclared(packageName, \"MICROPHONE\", \"to set loudness gate enabled\", `{\"type\": \"MICROPHONE\"}`)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: `MICROPHONE permission not declared in miniapp.json. Add {\"type\": \"MICROPHONE\"} to the \"permissions\" array.`,\n permission: \"MICROPHONE\",\n operation: MiniappRequestType.MIC_SET_LOUDNESS_GATE_ENABLED,\n })\n return\n }\n\n if (typeof payload.enabled !== \"boolean\") {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: \"enabled must be a boolean\",\n })\n return\n }\n\n try {\n const enabled = payload.enabled\n console.log(`${LOG_TAG}: mic_set_loudness_gate_enabled ${enabled} (by ${packageName})`)\n await micStateCoordinator.setMiniappGateOverride(\n packageName,\n \"loudnessGate\",\n enabled,\n this.getConfiguredMicGates(),\n )\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n console.error(`${LOG_TAG}: mic_set_loudness_gate_enabled error:`, err)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Loudness gate set-enabled error\",\n })\n }\n }\n\n /**\n * session.system.scanQr — host camera overlay. Must not clear miniapp\n * foreground; the host seam is responsible for presenting a Modal on top.\n */\n private async handleScanQr(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n try {\n const result = await invokeScanQrSeam(getUiSeams().scanQr, payload)\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n if (!getUiSeams().scanQr) {\n console.warn(`${LOG_TAG}: scanQr seam missing — QR overlay is not registered`)\n }\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string} | null | undefined)?.code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"QR scan failed\",\n })\n }\n }\n\n // ---------------------------------------------------------------------------\n // System utilities (share, open URL, clipboard, download)\n // ---------------------------------------------------------------------------\n\n private async handleShare(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n const {text, title, base64, mimeType, filename, url} = payload as {\n text?: string\n title?: string\n base64?: string\n mimeType?: string\n filename?: string\n url?: string\n }\n try {\n if (base64) {\n // File share via base64 — write to temp file then share\n const tempFile = new File(Paths.cache, filename || \"shared_file\")\n tempFile.write(base64, {encoding: \"base64\"})\n await Share.open({\n url: tempFile.uri,\n type: mimeType || \"application/octet-stream\",\n filename: filename,\n title: title,\n })\n } else if (url) {\n await Share.open({url, title, message: text})\n } else {\n await Share.open({message: text || \"\", title})\n }\n this.sendResult(packageName, requestId, true, {success: true})\n } catch (error: any) {\n // react-native-share throws when user dismisses the share sheet\n if (error?.message?.includes(\"User did not share\")) {\n this.sendResult(packageName, requestId, true, {success: false, cancelled: true})\n } else {\n console.error(`${LOG_TAG}: share error:`, error)\n this.sendResult(packageName, requestId, true, {success: false})\n }\n }\n }\n\n private async handleOpenUrl(packageName: string, payload: Record<string, unknown>): Promise<void> {\n const url = payload.url as string | undefined\n if (!url || typeof url !== \"string\") {\n console.warn(`${LOG_TAG}: open_url missing url`)\n return\n }\n // Block dangerous schemes\n if (url.startsWith(\"javascript:\") || url.startsWith(\"file:\")) {\n console.warn(`${LOG_TAG}: open_url blocked dangerous scheme: ${url}`)\n return\n }\n try {\n await Linking.openURL(url)\n } catch (error) {\n console.error(`${LOG_TAG}: open_url error:`, error)\n }\n }\n\n private async handleCopyClipboard(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const text = payload.text as string | undefined\n if (typeof text !== \"string\") {\n console.warn(`${LOG_TAG}: copy_clipboard missing text`)\n return\n }\n try {\n await Clipboard.setStringAsync(text)\n this.sendResult(packageName, requestId, true)\n } catch (error: any) {\n console.error(`${LOG_TAG}: clipboard error:`, error)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: error?.message || \"Clipboard error\",\n })\n }\n }\n\n private async handleDownload(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const {base64, url, mimeType, filename} = payload as {\n base64?: string\n url?: string\n mimeType?: string\n filename?: string\n }\n const name = filename || \"download\"\n try {\n let file: File\n if (base64) {\n file = new File(Paths.cache, name)\n file.write(base64, {encoding: \"base64\"})\n } else if (url) {\n file = await File.downloadFileAsync(url, new File(Paths.cache, name), {idempotent: true})\n } else {\n console.warn(`${LOG_TAG}: download missing base64 or url`)\n return\n }\n // Open share sheet so user can choose where to save\n await Share.open({\n url: file.uri,\n type: mimeType || \"application/octet-stream\",\n filename: name,\n })\n this.sendResult(packageName, requestId, true, {success: true})\n } catch (error: any) {\n if (error?.message?.includes(\"User did not share\")) {\n this.sendResult(packageName, requestId, true, {success: true, cancelled: true})\n } else {\n console.error(`${LOG_TAG}: download error:`, error)\n this.sendResult(packageName, requestId, true, {success: false})\n }\n }\n }\n\n // ===========================================================================\n // Photo + streaming handlers (cloud-coordinated)\n // ===========================================================================\n\n /**\n * Manifest permission gate shared by the camera-and-mic RPCs (streams, meetings).\n * Sends PERMISSION_NOT_DECLARED and returns false when the miniapp did not declare\n * `permission`; the caller must return without doing the work.\n */\n private requireManifestPermission(\n packageName: string,\n requestId: string | undefined,\n permission: \"CAMERA\" | \"PHONE_CAMERA\" | \"MICROPHONE\",\n purpose: string,\n operation: MiniappRequestType,\n ): boolean {\n const app = this.connectedApps.get(packageName)\n if (app?.installedManifest?.permissions?.some((p) => p.type === permission)) return true\n logPermissionNotDeclared(packageName, permission, purpose, `{\"type\": \"${permission}\"}`)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: `${permission} permission not declared in miniapp.json. Add {\"type\": \"${permission}\"} to the \"permissions\" array.`,\n permission,\n operation,\n })\n return false\n }\n\n /**\n * OS-permission gate: checked, never requested.\n *\n * The prompt belongs at miniapp-open time, where it can be explained. Requesting here would put\n * a system dialog on top of a join that has already started building a hotspot, and a wearer who\n * denies it gets a call that half-exists. Missing means the join is refused with the permission\n * named, so the miniapp can send them to Settings.\n */\n private async requireOsPermission(\n packageName: string,\n requestId: string | undefined,\n feature: string,\n label: string,\n ): Promise<boolean> {\n if (await permissions.check(feature)) return true\n softapTraceFailure(\"softap_permission_missing\", {packageName, feature})\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_DENIED,\n message: `This phone's ${label} permission is not granted. Grant it in Settings, then try again.`,\n permission: feature,\n operation: MiniappRequestType.MEETING_JOIN,\n })\n return false\n }\n\n private async handlePhoto(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n // Manifest CAMERA permission gate.\n const app = this.connectedApps.get(packageName)\n const hasCameraPermission = app?.installedManifest?.permissions?.some((p) => p.type === \"CAMERA\")\n if (!hasCameraPermission) {\n logPermissionNotDeclared(packageName, \"CAMERA\", \"to take a photo\", `{\"type\": \"CAMERA\"}`)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: `CAMERA permission not declared in miniapp.json. Add {\"type\": \"CAMERA\"} to the \"permissions\" array.`,\n permission: \"CAMERA\",\n operation: MiniappRequestType.PHOTO,\n })\n return\n }\n\n try {\n const result = await phonePhotoCoordinator.takePhoto(packageName, {\n size: payload.size as \"low\" | \"medium\" | \"high\" | \"max\" | \"small\" | \"large\" | \"full\" | undefined,\n mode: payload.mode as \"photo\" | \"text\" | undefined,\n transferMethod: payload.transferMethod as \"auto\" | \"direct\" | \"ble\" | undefined,\n compress: parsePhotoCompression(payload.compress),\n sound: payload.sound as boolean | undefined,\n saveToGallery: payload.saveToGallery as boolean | undefined,\n exposureTimeNs: payload.exposureTimeNs as number | undefined,\n iso: payload.iso as number | null | undefined,\n aeExposureDivisor: payload.aeExposureDivisor as number | undefined,\n isoCap: payload.isoCap as number | undefined,\n noiseReduction: payload.noiseReduction as boolean | undefined,\n edgeEnhancement: payload.edgeEnhancement as boolean | undefined,\n zsl: payload.zsl as boolean | undefined,\n mfnr: payload.mfnr as boolean | undefined,\n ispDigitalGain: payload.ispDigitalGain as number | undefined,\n ispAnalogGain: payload.ispAnalogGain as string | undefined,\n })\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Photo request failed\",\n stage: (err as {stage?: string}).stage,\n transport: (err as {transport?: string}).transport,\n })\n }\n }\n\n private async handleCameraWarmUp(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n // Manifest CAMERA permission gate (same as photo).\n const app = this.connectedApps.get(packageName)\n const hasCameraPermission = app?.installedManifest?.permissions?.some((p) => p.type === \"CAMERA\")\n if (!hasCameraPermission) {\n logPermissionNotDeclared(packageName, \"CAMERA\", \"to warm up the camera\", `{\"type\": \"CAMERA\"}`)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: `CAMERA permission not declared in miniapp.json. Add {\"type\": \"CAMERA\"} to the \"permissions\" array.`,\n permission: \"CAMERA\",\n operation: MiniappRequestType.CAMERA_WARM_UP,\n })\n return\n }\n\n try {\n await phonePhotoCoordinator.warmUpCamera(packageName, {\n size: payload.size as \"low\" | \"medium\" | \"high\" | \"max\" | undefined,\n mode: payload.mode as \"photo\" | \"text\" | undefined,\n exposureTimeNs: payload.exposureTimeNs as number | undefined,\n durationMs: payload.durationMs as number | undefined,\n zsl: payload.zsl as boolean | undefined,\n mfnr: payload.mfnr as boolean | undefined,\n })\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Camera warm-up failed\",\n stage: (err as {stage?: string}).stage,\n transport: (err as {transport?: string}).transport,\n })\n }\n }\n\n private async handleVideoRecordingStart(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n // Manifest CAMERA permission gate (same as photo).\n const app = this.connectedApps.get(packageName)\n const hasCameraPermission = app?.installedManifest?.permissions?.some((p) => p.type === \"CAMERA\")\n if (!hasCameraPermission) {\n logPermissionNotDeclared(packageName, \"CAMERA\", \"to record video\", `{\"type\": \"CAMERA\"}`)\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.PERMISSION_NOT_DECLARED,\n message: `CAMERA permission not declared in miniapp.json. Add {\"type\": \"CAMERA\"} to the \"permissions\" array.`,\n permission: \"CAMERA\",\n operation: MiniappRequestType.VIDEO_RECORDING_START,\n })\n return\n }\n\n try {\n const result = await phoneVideoCoordinator.startRecording(packageName, {\n width: payload.width as number | undefined,\n height: payload.height as number | undefined,\n fps: payload.fps as number | undefined,\n sound: payload.sound as boolean | undefined,\n save: payload.save as boolean | undefined,\n })\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Video recording start failed\",\n })\n }\n }\n\n private async handleVideoRecordingStop(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n try {\n await phoneVideoCoordinator.stopRecording(packageName, payload.recordingId as string | undefined, {\n uploadUrl: payload.uploadUrl as string | undefined,\n uploadAuthToken: payload.uploadAuthToken as string | undefined,\n })\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Video recording stop failed\",\n })\n }\n }\n\n /**\n * Stream handlers — dispatched to PhoneStreamCoordinator on the phone.\n * Managed streams also use Cloud V2 REST calls to provision resources,\n * poll ingest status, and tear down the managed stream. Miniapp JavaScript\n * runs locally in the Mentra App.\n */\n private async handleStreamStart(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const streaming = phoneStreamCoordinator\n if (!streaming) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_IMPLEMENTED,\n message: \"Streaming is not configured on this host\",\n })\n return\n }\n // A stream is the glasses camera (and mic) leaving the device; gate it like a photo.\n if (\n !this.requireManifestPermission(\n packageName,\n requestId,\n \"CAMERA\",\n \"to stream the camera\",\n MiniappRequestType.STREAM_START,\n )\n ) {\n return\n }\n try {\n const result = await streaming.startUnmanaged(packageName, {\n streamUrl: payload.streamUrl as string,\n video: normalizeStreamVideoConfig(payload.video),\n audio: normalizeStreamAudioConfig(payload.audio),\n sound: payload.sound as boolean | undefined,\n authToken: typeof payload.authToken === \"string\" ? payload.authToken : undefined,\n captureAudio: resolveCaptureAudio(payload.captureAudio, resolveAcsAudioSource().source),\n })\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Stream start failed\",\n stage: (err as {stage?: string}).stage,\n transport: (err as {transport?: string}).transport,\n })\n }\n }\n\n private async handleStreamStop(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const streaming = phoneStreamCoordinator\n if (!streaming) {\n // No adapter wired — treat as already-stopped.\n this.sendResult(packageName, requestId, true)\n return\n }\n try {\n await streaming.stop(packageName, payload.streamId as string | undefined)\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Stream stop failed\",\n stage: (err as {stage?: string}).stage,\n transport: (err as {transport?: string}).transport,\n })\n }\n }\n\n private async handleManagedStreamStart(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const streaming = phoneStreamCoordinator\n if (!streaming) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_IMPLEMENTED,\n message: \"Streaming is not configured on this host\",\n })\n return\n }\n if (\n !this.requireManifestPermission(\n packageName,\n requestId,\n \"CAMERA\",\n \"to stream the camera\",\n MiniappRequestType.MANAGED_STREAM_START,\n )\n ) {\n return\n }\n try {\n if (payload.ingest === \"whip\" && !(await permissions.check(PermissionFeatures.LOCAL_WIFI))) {\n if (!(await permissions.request(PermissionFeatures.LOCAL_WIFI))) {\n throw new Error(\"Nearby devices permission is required to join the glasses hotspot\")\n }\n }\n const result = await streaming.startManaged(packageName, {\n restreamDestinations: payload.restreamDestinations as Array<string | {url: string; name?: string}> | undefined,\n video: normalizeStreamVideoConfig(payload.video),\n audio: normalizeStreamAudioConfig(payload.audio),\n sound: payload.sound as boolean | undefined,\n ingest: payload.ingest as \"srt\" | \"whip\" | \"rtmp\" | undefined,\n captureAudio: normalizeCaptureAudio(payload.captureAudio),\n })\n this.sendResult(packageName, requestId, true, result)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Managed stream start failed\",\n stage: (err as {stage?: string}).stage,\n transport: (err as {transport?: string}).transport,\n })\n }\n }\n\n private async handleManagedStreamStop(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n return this.handleStreamStop(packageName, payload, requestId)\n }\n\n private ensureMeetingStateBridge(): void {\n acsMeetingService.setStateHandler((owner, state) => {\n const attempt = this.softapAttempt\n // While a replacement waits for cleanup, native events still describe its predecessor.\n if (attempt?.packageName === owner && !attempt.ownsResources) return\n this.sendToMiniapp(owner, {\n type: MiniappResponseType.MEETING_STATE,\n ...state,\n ...this.softapRecoveryFields(attempt?.packageName === owner ? attempt : null),\n })\n if (attempt?.ownsResources && attempt.transport?.shouldRepublish(state.mediaSource)) {\n void attempt.transport.republish(state.mediaSourceReason ?? \"mediaSource failed\")\n }\n })\n }\n\n /** Startup owns the hotspot before ACS has an owner. Closing the app must retire both. */\n private async leaveMeetingForApp(packageName: string): Promise<void> {\n const attempt = this.softapAttempt\n if (attempt?.packageName === packageName) {\n await this.retireSoftapAttempt({attempt})\n } else {\n await acsMeetingService.leaveIfOwner(packageName)\n }\n }\n\n private async handleMeetingJoin(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n this.ensureMeetingStateBridge()\n // A meeting puts the glasses camera and mic in front of remote strangers; it\n // needs both declared, same as photo/stream and mic capture do individually.\n if (\n !this.requireManifestPermission(\n packageName,\n requestId,\n \"CAMERA\",\n \"to join a meeting\",\n MiniappRequestType.MEETING_JOIN,\n ) ||\n !this.requireManifestPermission(\n packageName,\n requestId,\n \"MICROPHONE\",\n \"to join a meeting\",\n MiniappRequestType.MEETING_JOIN,\n ) ||\n !this.requireManifestPermission(\n packageName,\n requestId,\n \"PHONE_CAMERA\",\n \"to join a meeting\",\n MiniappRequestType.MEETING_JOIN,\n )\n ) {\n return\n }\n // Defensive only: these are prompted for when the wearer opens the miniapp, so by the time a\n // join runs they are either granted or were refused minutes ago on a screen that explained\n // them. Checked and never requested — a permission dialog on top of a half-built call is\n // asked too late to explain itself, and ACS fails the join outright without the camera.\n if (!(await this.requireOsPermission(packageName, requestId, PermissionFeatures.CAMERA, \"camera\"))) return\n if (!(await this.requireOsPermission(packageName, requestId, PermissionFeatures.MICROPHONE, \"microphone\"))) return\n const meetingUrl = typeof payload.meetingUrl === \"string\" ? payload.meetingUrl : \"\"\n const token = typeof payload.token === \"string\" ? payload.token : \"\"\n const displayName = typeof payload.displayName === \"string\" ? payload.displayName : undefined\n // Diagnostic only. A miniapp that does not send it gets `unknown`, which is a third answer in\n // the comparison rather than a default that would quietly file every old build under \"created\".\n const origin = parseAcsCallOrigin(payload.origin)\n if (!meetingUrl || !token) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: \"meetingUrl and token are required\",\n })\n return\n }\n let videoSource: AcsVideoSource\n try {\n videoSource = parseAcsVideoSource(payload.videoSource)\n } catch (error) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: error instanceof Error ? error.message : \"Invalid meeting video source\",\n })\n return\n }\n try {\n let video: ReturnType<typeof parseAcsOutgoingVideo>\n try {\n video = parseAcsOutgoingVideo(payload.video)\n } catch (error) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: error instanceof Error ? error.message : \"Invalid meeting video\",\n })\n return\n }\n // SoftAP is a sequence, not a single call: the hotspot and the scoped network have to exist\n // before the ACS join binds a listener, and the glasses can only be told where to publish\n // after that. The miniapp asks for the transport and the host owns the ordering.\n if (videoSource.type === \"softap\") {\n // The miniapp's `requestId` is the only identifier the two logs share until the attempt\n // exists, so it is what joins the miniapp's own join line to the host's.\n softapTrace(\"meeting_join_request\", {\n packageName,\n requestId: requestId ?? \"none\",\n transport: videoSource.type,\n hasDisplayName: Boolean(displayName),\n video: video ? `${video.width}x${video.height}@${video.fps}` : \"default\",\n origin,\n })\n const startedAt = Date.now()\n try {\n const state = await this.joinSoftapMeeting(packageName, {meetingUrl, token, displayName, video, origin})\n softapTrace(\"meeting_join_result\", {\n packageName,\n requestId: requestId ?? \"none\",\n state: state.state,\n micTransport: state.micTransport ?? \"unknown\",\n durationMs: Date.now() - startedAt,\n })\n this.sendResult(packageName, requestId, true, state)\n } catch (error) {\n softapTraceFailure(\"meeting_join_result\", {\n packageName,\n requestId: requestId ?? \"none\",\n step: error instanceof SoftapCallError ? error.step : \"unknown\",\n code: error instanceof SoftapCallError ? error.code : \"INTERNAL\",\n reason: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startedAt,\n })\n throw error\n }\n return\n }\n const state = await acsMeetingService.join(packageName, {\n meetingUrl,\n token,\n videoSource,\n displayName,\n origin,\n ...(video ? {video} : {}),\n })\n this.sendResult(packageName, requestId, true, state)\n } catch (err) {\n // A SoftAP failure already knows what it was and where. Flattening every one of them to\n // INTERNAL is what left the miniapp unable to tell \"your Wi-Fi is off\" — a condition with a\n // two-tap fix — from an ACS timeout, so it showed the same shrug for both. The step comes\n // along too: the same code at `hotspot` and at `scopedJoin` are different stories.\n const softap = err instanceof SoftapCallError ? err : undefined\n this.sendResult(packageName, requestId, false, undefined, {\n code: softap?.code ?? MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"ACS meeting join failed\",\n ...(softap ? {step: softap.step} : {}),\n })\n }\n }\n\n /**\n * Runs the SoftAP call sequence and returns the meeting state it reached.\n *\n * Everything is hung off one [SoftapAttempt] registered before the first `await`, because the\n * cancellable part of this starts immediately and the transport only exists halfway through.\n * The attempt is also what `meeting.leave` unwinds: leaving only the ACS call would strand the\n * glasses publishing into a listener nobody reads, the phone on a hotspot it no longer needs,\n * and this process pinned to cellular.\n */\n private async joinSoftapMeeting(\n packageName: string,\n args: {meetingUrl: string; token: string; displayName?: string; video?: AcsOutgoingVideo; origin?: AcsCallOrigin},\n ): Promise<MeetingState> {\n // Reserve before awaiting retirement: a second Start or Cancel must see this request,\n // including while it is waiting for its predecessor's native cleanup.\n const previous = this.softapAttempt\n const attempt = this.createSoftapAttempt(packageName)\n this.softapAttempt = attempt\n const body = this.runSoftapAttempt(attempt, previous, args)\n // Settled, never rejected: this exists so the *next* attempt can tell when this one's native\n // work has actually stopped, and a rejection here is already handled below.\n attempt.body = body.then(\n () => undefined,\n () => undefined,\n )\n try {\n return await body\n } catch (error) {\n softapTraceFailure(\"softap_attempt_failed\", {\n attempt: attempt.id,\n step: error instanceof SoftapCallError ? error.step : \"unknown\",\n code: error instanceof SoftapCallError ? error.code : \"INTERNAL\",\n reason: error instanceof Error ? error.message : String(error),\n attemptAgeMs: Date.now() - attempt.startedAt,\n })\n // Unwind whatever the attempt reached — including the preflight-owned agent and cellular\n // pin, which the transport never sees — before the failure surfaces.\n await this.retireSoftapAttempt({attempt}).catch(() => undefined)\n throw error\n }\n }\n\n private createSoftapAttempt(packageName: string): SoftapAttempt {\n const id = ++this.softapAttemptSeq\n let resolveSettled!: () => void\n const settled = new Promise<void>((resolve) => {\n resolveSettled = resolve\n })\n const attempt: SoftapAttempt = {\n id,\n packageName,\n startedAt: Date.now(),\n cancelled: false,\n ownsResources: false,\n transport: null,\n progress: {\n traceId: `preflight-${id}`,\n phase: \"starting\",\n steps: SOFTAP_STEPS.map((step) => ({step, status: \"pending\" as const})),\n elapsedMs: 0,\n mediaGeneration: 0,\n },\n scopedLostUnsub: null,\n recovery: null,\n recoveryActive: false,\n recoveryDeadlineAt: null,\n body: null,\n teardown: null,\n settled,\n settledDone: false,\n markSettled: () => {\n if (attempt.settledDone) return\n attempt.settledDone = true\n softapTrace(\"softap_attempt_settled\", {attempt: id, attemptAgeMs: Date.now() - attempt.startedAt})\n resolveSettled()\n },\n }\n softapTrace(\"softap_attempt_created\", {attempt: id, packageName})\n return attempt\n }\n\n /**\n * Throws if this attempt has been cancelled or superseded.\n *\n * Called after every `await` in the join. The wearer's Cancel cannot interrupt a native call\n * that is already in flight, so the next best thing — and the thing that actually makes Cancel\n * work — is to refuse to take another step once they have asked.\n *\n * @param after the await this checkpoint follows. The whole join surfaces as one CANCELLED\n * error, so without a name in the log there is no way to tell a Cancel during the permission\n * prompt from one during a 35-second Teams sign-in.\n */\n private checkpointSoftapAttempt(attempt: SoftapAttempt, after: string): void {\n if (attempt.cancelled || this.softapAttempt !== attempt) {\n softapTraceFailure(\"softap_attempt_cancelled\", {\n attempt: attempt.id,\n after,\n attemptAgeMs: Date.now() - attempt.startedAt,\n // Two different causes with one outcome: the wearer asked to leave, or a second join\n // took the slot. They need different fixes, so they are not collapsed here.\n cause: attempt.cancelled ? \"retired\" : \"superseded\",\n current: this.softapAttempt?.id ?? \"none\",\n })\n throw new SoftapCallError(\"hotspot\", \"CANCELLED\", \"The call was cancelled while it was starting\")\n }\n }\n\n /** Publishes a checklist snapshot, unless this attempt has already been superseded. */\n private emitSoftapProgress(attempt: SoftapAttempt, progress: SoftapProgress): void {\n if (this.softapAttempt !== attempt || attempt.cancelled) {\n // A dropped checklist is why a stalled join used to look like a stuck UI: the wearer's last\n // row was written by an attempt that no longer owned the call, and nothing said so.\n softapTrace(\"softap_progress_dropped\", {\n attempt: attempt.id,\n phase: progress.phase,\n traceId: progress.traceId,\n cause: attempt.cancelled ? \"retired\" : \"superseded\",\n current: this.softapAttempt?.id ?? \"none\",\n })\n return\n }\n attempt.progress = progress\n // A reservation waiting behind another call must not inherit that call's connected state.\n const current = attempt.transport ? acsMeetingService.getState() : {state: \"connecting\", muted: false}\n this.sendToMiniapp(attempt.packageName, {\n type: MiniappResponseType.MEETING_STATE,\n ...current,\n // Before the ACS join there is no native state yet, so the phase reads `connecting`: the\n // join *is* in progress, and `idle` would make the miniapp think the call ended.\n state: current.state === \"idle\" ? \"connecting\" : current.state,\n softap: progress,\n ...this.softapRecoveryFields(attempt),\n })\n }\n\n private softapRecoveryFields(attempt: SoftapAttempt | null | undefined): {recovery?: {\n active: boolean\n generation?: number\n deadlineAt?: number\n phase?: string\n }} {\n if (!attempt?.recoveryDeadlineAt) return {}\n return {\n recovery: {\n active: attempt.recoveryActive,\n generation: attempt.transport?.currentMediaGeneration(),\n deadlineAt: attempt.recoveryDeadlineAt,\n phase: attempt.transport?.currentPhase(),\n },\n }\n }\n\n /**\n * Narrates preflight work on the first row while it is still pending.\n *\n * Permissions, mobile data, and the ACS sign-in take most of a minute between them and happen\n * before the transport exists, so without this the wearer watches five pending rows and\n * concludes the app has hung. No new step and no protocol change: it is the `hotspot` row's\n * detail, which the connecting screen renders as its one sub-line until step 1 starts.\n */\n private narrateSoftapPreflight(attempt: SoftapAttempt, detail: string): void {\n this.emitSoftapProgress(attempt, {\n ...attempt.progress,\n elapsedMs: Date.now() - attempt.startedAt,\n steps: attempt.progress.steps.map((step) => (step.step === \"hotspot\" ? {...step, detail} : step)),\n })\n }\n\n private async runSoftapAttempt(\n attempt: SoftapAttempt,\n previous: SoftapAttempt | null,\n args: {meetingUrl: string; token: string; displayName?: string; video?: AcsOutgoingVideo; origin?: AcsCallOrigin},\n ): Promise<MeetingState> {\n const packageName = attempt.packageName\n if (previous) {\n this.narrateSoftapPreflight(attempt, \"Finishing the previous call’s cleanup…\")\n softapTrace(\"softap_join_superseding\", {\n previousAttempt: previous.id,\n previousAgeMs: Date.now() - previous.startedAt,\n previousPhase: previous.progress.phase,\n packageName,\n })\n await this.retireSoftapAttempt({attempt: previous}).catch(() => undefined)\n await awaitCleanupBarrier({\n settled: previous.settled,\n settledDone: previous.settledDone,\n narrate: (detail) => this.narrateSoftapPreflight(attempt, detail),\n narrateAfterMs: SOFTAP_CLEANUP_NARRATE_AFTER_MS,\n attempt: attempt.id,\n waitingFor: `attempt ${previous.id} teardown`,\n })\n }\n this.checkpointSoftapAttempt(attempt, \"cleanup barrier\")\n const cleanupError = this.softapCleanupError\n if (cleanupError) {\n // Cleared on read, so this refuses at most once and the next attempt always gets through —\n // which is why the wearer is told to retry rather than to go power-cycle anything. The\n // native reason stays in the trace: it names a leaked port, not something they can act on.\n this.softapCleanupError = null\n softapTraceFailure(\"softap_join_refused\", {packageName, reason: cleanupError})\n throw new Error(\"Previous call cleanup has not finished yet. Please try joining again.\")\n }\n attempt.releaseHotspot = acquireGlassesHotspot()\n attempt.ownsResources = true\n this.narrateSoftapPreflight(attempt, \"Checking the Nearby devices permission…\")\n const permissionStartedAt = Date.now()\n if (!(await permissions.check(PermissionFeatures.LOCAL_WIFI))) {\n this.checkpointSoftapAttempt(attempt, \"permission check\")\n softapTrace(\"softap_permission_prompt\", {attempt: attempt.id, permission: \"LOCAL_WIFI\"})\n const granted = await permissions.request(PermissionFeatures.LOCAL_WIFI)\n this.checkpointSoftapAttempt(attempt, \"permission prompt\")\n softapTrace(\"softap_permission_result\", {\n attempt: attempt.id,\n granted,\n // The prompt is modal, so this is the wearer's own reaction time and the single largest\n // unexplained gap in a first-run join.\n durationMs: Date.now() - permissionStartedAt,\n })\n if (!granted) {\n throw new Error(\"Nearby devices permission is required to join the glasses hotspot\")\n }\n }\n this.checkpointSoftapAttempt(attempt, \"permissions\")\n const transport = new SoftapCallTransport(\n createSoftapCallDeps({\n packageName,\n meetingUrl: args.meetingUrl,\n token: args.token,\n displayName: args.displayName,\n video: args.video,\n awaitFirstFrame: (_report, options) =>\n acsMeetingService.waitForFirstFrame(SOFTAP_FIRST_FRAME_MS, options),\n waitUntilLive: (timeoutMs) => acsMeetingService.waitUntilMediaLive(timeoutMs),\n subsystems: {\n setHotspotState: async (enabled) => {\n const status = await this.setGlassesHotspotState(enabled)\n if (status.state === \"enabled\") {\n return {state: status.state, ssid: status.ssid, password: status.password, localIp: status.localIp}\n }\n return {state: status.state}\n },\n isWifiEnabled: async () => {\n // A host that cannot answer reports \"on\" so the preflight stands aside; the native\n // throw at scopedJoin is what covers those platforms.\n const enabled = await acsMeetingService.isWifiEnabled()\n return enabled ?? true\n },\n joinScopedNetwork: (ssid, passphrase, gateway) =>\n acsMeetingService.joinScopedNetwork(ssid, passphrase, gateway),\n leaveScopedNetwork: () => acsMeetingService.leaveScopedNetwork(),\n cancelScopedNetworkJoin: () => acsMeetingService.cancelScopedNetworkJoin(),\n probeGateway: async () => {\n const verdict = await acsMeetingService.probeScopedGateway()\n // No native probe means no verdict, and the orchestrator must not read that as \"down\".\n return verdict ?? {reachable: true, detail: \"probe unsupported on this host\"}\n },\n awaitValidatedDefaultNetwork: () => acsMeetingService.awaitValidatedDefaultNetwork(),\n onGlassesStreamStatus: (listener) => {\n const sub = BluetoothSdk.addListener(\"stream_status\", (event) => {\n // The glasses narrate over BLE, which is slow enough that a status from the previous\n // publish can land after this attempt was retired — and it is narration, so it would\n // be written straight onto the new call's checklist as if it were happening now.\n if (this.softapAttempt !== attempt || attempt.cancelled) {\n softapTrace(\"softap_stale_callback\", {\n source: \"glasses_stream_status\",\n attempt: attempt.id,\n status: event.status,\n current: this.softapAttempt?.id ?? \"none\",\n })\n return\n }\n listener({\n status: event.status,\n streamId: event.streamId,\n reason: \"reason\" in event && typeof event.reason === \"string\" ? event.reason : undefined,\n error: \"error\" in event && typeof event.error === \"string\" ? event.error : undefined,\n })\n })\n return () => sub.remove()\n },\n joinMeeting: (pkg, options) =>\n acsMeetingService.join(pkg, {\n meetingUrl: options.meetingUrl,\n token: options.token,\n videoSource: options.videoSource,\n displayName: options.displayName,\n origin: args.origin,\n ...(args.video ? {video: args.video} : {}),\n }),\n leaveMeeting: (pkg) => acsMeetingService.leave(pkg),\n endMeeting: async (pkg) => {\n await acsMeetingService.endForEveryone(pkg)\n },\n ingestUrl: () => acsMeetingService.softApIngestUrl(),\n glassesLc3Uplink: () => acsMeetingService.glassesLc3UplinkActive(),\n startPublishing: (pkg, options) => phoneStreamCoordinator.startUnmanaged(pkg, options),\n stopPublishing: (pkg) => phoneStreamCoordinator.stop(pkg),\n discardPendingBleStop: () => phoneStreamCoordinator.discardPendingBleStop(),\n rebindIngest: async (report) => {\n report?.(\"Rebinding the glasses video receiver on the hotspot\")\n const ingestUrl = await acsMeetingService.rebindSoftApIngest()\n if (!ingestUrl) throw new Error(\"the rebound meeting reported no ingest URL\")\n report?.(`Receiver rebound at ${ingestUrl}`)\n return {ingestUrl}\n },\n },\n }),\n )\n attempt.transport = transport\n // A hotspot that vanishes mid-call is a real failure and a normal teardown is not, so both\n // guards are checked: the attempt must still be the current one (a stale event from a finished\n // call must never touch the next one) and it must not already be terminating. The unsubscribe\n // lives on the attempt, so retiring attempt N cannot clear attempt N+1's listener. Teardown\n // itself is left to the miniapp's terminal path, which calls `meeting.leave` — one owner.\n attempt.scopedLostUnsub = acsMeetingService.onScopedNetworkLost((error) => {\n if (this.softapAttempt !== attempt || attempt.cancelled) {\n console.log(\"[LocalMiniappRuntime] scoped loss for a superseded SoftAP call; ignoring\", error)\n softapTrace(\"softap_scoped_loss_dropped\", {\n attempt: attempt.id,\n code: error.code,\n cause: attempt.cancelled ? \"retired\" : \"superseded\",\n current: this.softapAttempt?.id ?? \"none\",\n })\n return\n }\n if (transport.isTerminating()) {\n console.log(\"[LocalMiniappRuntime] scoped loss during teardown; expected\", error)\n softapTrace(\"softap_scoped_loss_dropped\", {attempt: attempt.id, code: error.code, cause: \"terminating\"})\n return\n }\n console.warn(\"[LocalMiniappRuntime] SoftAP hotspot lost mid-call\", error)\n softapTraceFailure(\"softap_scoped_loss_reported\", {\n attempt: attempt.id,\n code: error.code,\n reason: error.message,\n attemptAgeMs: Date.now() - attempt.startedAt,\n })\n this.beginSoftapRecovery(attempt, transport, error)\n })\n\n // Sign in on the phone's current internet *before* the glasses hotspot takes DNS. On device,\n // createCallAgent after the scoped join timed out at 20s and only finished once SoftAP was\n // released. It also waits for validated mobile data, which is why the wearer is told one\n // honest thing about the whole window rather than nothing at all.\n this.narrateSoftapPreflight(attempt, \"Signing in to Teams…\")\n const prepareStartedAt = Date.now()\n softapTrace(\"softap_prepare_agent_begin\", {attempt: attempt.id})\n try {\n await acsMeetingService.prepareAgent({token: args.token, displayName: args.displayName})\n } catch (error) {\n softapTraceFailure(\"softap_prepare_agent_failed\", {\n attempt: attempt.id,\n reason: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - prepareStartedAt,\n })\n throw error\n }\n softapTrace(\"softap_prepare_agent_done\", {attempt: attempt.id, durationMs: Date.now() - prepareStartedAt})\n this.checkpointSoftapAttempt(attempt, \"prepareAgent\")\n await transport.start({\n // What the wearer has been reading for the last minute, so the first snapshot does not\n // blank it.\n initialSteps: attempt.progress.steps,\n // Every transition reaches the miniapp as a meeting-state event carrying the checklist.\n onProgress: (progress) => this.emitSoftapProgress(attempt, progress),\n })\n this.checkpointSoftapAttempt(attempt, \"transport.start\")\n const state = acsMeetingService.getState()\n softapTrace(\"softap_attempt_live\", {\n attempt: attempt.id,\n state: state.state,\n micTransport: state.micTransport ?? \"unknown\",\n attemptAgeMs: Date.now() - attempt.startedAt,\n })\n return state\n }\n\n /**\n * SoftAP loss is a media outage. Keep ACS, destroy generation N, wait for the glasses,\n * then build generation N+1. Duplicate losses do not renew the deadline.\n */\n private beginSoftapRecovery(\n attempt: SoftapAttempt,\n transport: SoftapCallTransport,\n error: {code: string; message: string},\n ): void {\n // Gate on the live flag, not the promise: a settled Promise is still truthy, so a second\n // walk-away after a successful re-arm was dropped as \"in-flight\" and the glasses kept\n // POSTing WHIP at a hotspot the phone had already left.\n if (attempt.recoveryActive) {\n softapTrace(\"softap_recovery_dropped\", {attempt: attempt.id, cause: \"in-flight\"})\n return\n }\n if (attempt.cancelled || this.softapAttempt !== attempt) {\n softapTrace(\"softap_recovery_dropped\", {\n attempt: attempt.id,\n cause: attempt.cancelled ? \"retired\" : \"superseded\",\n })\n return\n }\n const lostAt = Date.now()\n attempt.recoveryDeadlineAt = lostAt + RETURN_DEADLINE_MS\n attempt.recoveryActive = true\n this.emitSoftapProgress(attempt, transport.progress())\n softapTrace(\"softap_recovery_begin\", {\n attempt: attempt.id,\n deadlineAt: attempt.recoveryDeadlineAt,\n mediaGeneration: transport.currentMediaGeneration(),\n reason: error.message,\n })\n\n let run!: Promise<void>\n run = (async () => {\n try {\n await transport.recover(`${error.code}: ${error.message}`, {\n wait: async () => {\n const remaining = (attempt.recoveryDeadlineAt ?? 0) - Date.now()\n if (remaining <= 0) {\n throw new SoftapCallError(\"hotspot\", \"RETURN_DEADLINE\", \"The glasses did not return in time\")\n }\n const ready = await this.waitForGlassesReturn(remaining, () => attempt.cancelled)\n if (attempt.cancelled || this.softapAttempt !== attempt) {\n throw new SoftapCallError(\"hotspot\", \"CANCELLED\", \"SoftAP recovery was cancelled\")\n }\n if (!ready) {\n throw new SoftapCallError(\"hotspot\", \"RETURN_DEADLINE\", \"The glasses did not return in time\")\n }\n },\n })\n if (attempt.cancelled || this.softapAttempt !== attempt) return\n this.emitSoftapProgress(attempt, transport.progress())\n const current = acsMeetingService.getState()\n this.sendToMiniapp(attempt.packageName, {\n type: MiniappResponseType.MEETING_STATE,\n ...current,\n softap: transport.progress(),\n ...this.softapRecoveryFields(attempt),\n })\n softapTrace(\"softap_recovery_live\", {\n attempt: attempt.id,\n mediaGeneration: transport.currentMediaGeneration(),\n elapsedMs: Date.now() - lostAt,\n })\n } catch (recoveryError) {\n if (attempt.cancelled || this.softapAttempt !== attempt) return\n const message = recoveryError instanceof Error ? recoveryError.message : String(recoveryError)\n softapTraceFailure(\"softap_recovery_failed\", {\n attempt: attempt.id,\n reason: message,\n elapsedMs: Date.now() - lostAt,\n })\n const current = acsMeetingService.getState()\n this.sendToMiniapp(attempt.packageName, {\n type: MiniappResponseType.MEETING_STATE,\n ...current,\n state: \"error\",\n error: `SOFTAP_NETWORK_LOST: ${error.message}`,\n softap: transport.progress(),\n recovery: {\n active: false,\n generation: transport.currentMediaGeneration(),\n deadlineAt: attempt.recoveryDeadlineAt ?? undefined,\n phase: transport.currentPhase(),\n },\n })\n } finally {\n attempt.recoveryActive = false\n if (attempt.recovery === run) attempt.recovery = null\n }\n })()\n attempt.recovery = run\n }\n\n /**\n * Wait for a link the hotspot commands can actually use.\n *\n * The hotspot goes away a couple of seconds before the phone declares the BLE link dead, so the\n * snapshot at loss time still reads \"ready\". Taking that at face value sent `set_hotspot_state`\n * into a dying link twice, and each one burned its full timeout before the wearer was even back.\n * Requiring the link to hold steady turns that into waiting, which is what the budget is for.\n */\n private async waitForGlassesReturn(timeoutMs: number, cancelled: () => boolean): Promise<boolean> {\n const deadlineAt = Date.now() + timeoutMs\n while (!cancelled()) {\n const remaining = deadlineAt - Date.now()\n if (remaining <= 0) return false\n if (!isGlassesReady(useGlassesStore.getState().connection) && !(await this.awaitGlassesReady(remaining, cancelled))) {\n return false\n }\n const settleMs = Math.min(GLASSES_LINK_SETTLE_MS, Math.max(0, deadlineAt - Date.now()))\n if (await this.glassesLinkHoldsSteady(settleMs, cancelled)) return true\n }\n return false\n }\n\n private awaitGlassesReady(timeoutMs: number, cancelled: () => boolean): Promise<boolean> {\n const controller = new AbortController()\n const poll = setInterval(() => {\n if (cancelled()) controller.abort()\n }, 250)\n return waitForGlassesReady({\n getConnection: () => useGlassesStore.getState().connection,\n subscribe: (listener) => useGlassesStore.subscribe((state) => state.connection, listener),\n timeoutMs,\n signal: controller.signal,\n }).finally(() => clearInterval(poll))\n }\n\n /** True when the link stays ready for [ms]; false the moment it drops again. */\n private glassesLinkHoldsSteady(ms: number, cancelled: () => boolean): Promise<boolean> {\n if (ms <= 0) return Promise.resolve(isGlassesReady(useGlassesStore.getState().connection))\n return new Promise<boolean>((resolve) => {\n let done = false\n const settle = (steady: boolean) => {\n if (done) return\n done = true\n clearTimeout(timer)\n clearInterval(poll)\n unsubscribe()\n resolve(steady)\n }\n const unsubscribe = useGlassesStore.subscribe(\n (state) => state.connection,\n (connection) => {\n if (!isGlassesReady(connection)) settle(false)\n },\n )\n const poll = setInterval(() => {\n if (cancelled()) settle(false)\n }, 250)\n const timer = setTimeout(() => settle(true), ms)\n })\n }\n\n /**\n * Cancels a SoftAP attempt and does not return until everything it owns has been released.\n *\n * This is the barrier the whole design rests on: \"leave returned\" has to mean \"nothing from that\n * call is still in flight\", or the next Start races the previous call's cleanup through the same\n * hotspot. There is deliberately no deadline — a native call that never returns holds the next\n * call back rather than letting it race — and a watchdog only says so in the log.\n *\n * Safe to call when there is no attempt, and safe to call twice: the teardown is single-flight\n * per attempt, so a leave and the join's own failure path share one unwind.\n */\n private async retireSoftapAttempt(options: {attempt?: SoftapAttempt; mode?: SoftapTeardownMode} = {}): Promise<void> {\n const attempt = options.attempt ?? this.softapAttempt\n if (!attempt) {\n // Not an error — every terminal path calls this without checking — but a Leave that found\n // nothing to retire and a Leave that tore a call down are very different log entries.\n softapTrace(\"softap_retire_noop\", {mode: options.mode ?? \"leave\"})\n return\n }\n attempt.cancelled = true\n // Keep the retiring attempt discoverable until both its join and cleanup settle.\n // A newer reservation replaces it immediately, but must still wait on its barrier.\n softapTrace(\"softap_retire_begin\", {\n attempt: attempt.id,\n mode: options.mode ?? \"leave\",\n attemptAgeMs: Date.now() - attempt.startedAt,\n phase: attempt.progress.phase,\n // Second and later callers join the first one's teardown rather than running their own, and\n // that sharing is what makes a leave racing a failed join safe.\n teardownAlreadyRunning: Boolean(attempt.teardown),\n })\n if (!attempt.teardown) {\n attempt.teardown = this.teardownSoftapAttempt(attempt, options.mode)\n // The barrier closes over the join body as well as the teardown, and opens only when both\n // have stopped. A watchdog reports a cleanup that is taking too long; it never declares one\n // finished, because \"probably done by now\" is exactly the assumption that broke restarts.\n const stallWatchdog = setTimeout(() => {\n console.warn(\"[LocalMiniappRuntime] softap_cleanup_stalled\", {\n attempt: attempt.id,\n afterMs: SOFTAP_CLEANUP_STALL_LOG_MS,\n })\n }, SOFTAP_CLEANUP_STALL_LOG_MS)\n void Promise.allSettled([\n attempt.teardown,\n attempt.body ?? Promise.resolve(),\n attempt.recovery ?? Promise.resolve(),\n ]).then(() => {\n clearTimeout(stallWatchdog)\n attempt.markSettled()\n if (this.softapAttempt === attempt) this.softapAttempt = null\n })\n }\n const awaitedFrom = Date.now()\n try {\n await attempt.teardown\n } catch (error) {\n // Only a refused End reaches here; the local unwind has completed either way, which is the\n // distinction the wearer's copy depends on.\n softapTraceFailure(\"softap_retire_done\", {\n attempt: attempt.id,\n waitedMs: Date.now() - awaitedFrom,\n reason: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n softapTrace(\"softap_retire_done\", {attempt: attempt.id, waitedMs: Date.now() - awaitedFrom})\n }\n\n /**\n * Releases everything one attempt could own, in the reverse of the order it was taken.\n *\n * The scoped network and the ACS agent are released unconditionally, not only when the transport\n * built them: `prepareAgent` signs in and pins this whole process to cellular *before* the\n * transport exists, so a Cancel during sign-in would otherwise leave both behind. Both releases\n * are idempotent.\n *\n * Failures are collected rather than swallowed. Reporting a clean teardown that did not happen\n * is what lets the next call start on leaked state.\n */\n private async teardownSoftapAttempt(attempt: SoftapAttempt, mode?: SoftapTeardownMode): Promise<void> {\n // A cancelled reservation waiting behind another call never acquired any shared resources.\n // Its cleanup must not release the preceding call's native agent or network.\n if (!attempt.ownsResources) return\n // Terminal intent before the first release, so the scoped network we are about to drop cannot\n // be reported as a hotspot that walked away.\n acsMeetingService.beginScopedTeardown()\n const failures: string[] = []\n let endFailure: unknown = null\n const teardownStartedAt = Date.now()\n softapTrace(\"softap_teardown_begin\", {\n attempt: attempt.id,\n mode: mode ?? \"leave\",\n hasTransport: Boolean(attempt.transport),\n steps: attempt.transport?.activeSteps().join(\",\") ?? \"\",\n })\n /**\n * One line per resource, whether it released or not.\n *\n * The releases below are sequential and every one of them can block on a native call, so a\n * teardown that takes half a minute is only readable if each step says how long it took. A\n * step that never reports is the one that hung.\n */\n const releaseStep = async (step: string, release: () => Promise<void>): Promise<unknown> => {\n const startedAt = Date.now()\n try {\n await release()\n softapTrace(\"softap_teardown_step\", {\n attempt: attempt.id,\n step,\n outcome: \"ok\",\n durationMs: Date.now() - startedAt,\n })\n return null\n } catch (error) {\n softapTraceFailure(\"softap_teardown_step\", {\n attempt: attempt.id,\n step,\n outcome: \"failed\",\n durationMs: Date.now() - startedAt,\n reason: error instanceof Error ? error.message : String(error),\n })\n return error\n }\n }\n const transport = attempt.transport\n if (transport) {\n // The only thing `stop()` throws is a refused End — the local teardown still completed,\n // so this is the caller's business, not a reason to block the next call.\n endFailure = await releaseStep(\"transport.stop\", () => transport.stop(mode ? {mode} : {}))\n const undoFailures = transport.lastTeardownFailures()\n // A hotspot that did not ACK off is leftover ON — the next join wants it on and will\n // call setHotspotState(true). Refusing that join is how we got hotspot_off_ack_timeout\n // as a wearer-facing \"power-cycle the glasses\" dead end.\n const blockingUndos = undoFailures.filter((step) => step !== \"hotspot\")\n if (blockingUndos.length > 0) failures.push(`could not release ${blockingUndos.join(\", \")}`)\n if (undoFailures.includes(\"hotspot\")) {\n console.warn(\"[LocalMiniappRuntime] glasses hotspot undo timed out; next join will raise it again\", {\n attempt: attempt.id,\n })\n }\n }\n const scopedFailure = await releaseStep(\"leaveScopedNetwork\", () => acsMeetingService.leaveScopedNetwork())\n if (scopedFailure) {\n failures.push(\n `leaveScopedNetwork: ${scopedFailure instanceof Error ? scopedFailure.message : String(scopedFailure)}`,\n )\n }\n // Stay pinned across this wait. Unpinning onto a leftover glasses AP is what made the next\n // Start Call's `teams:create` return `Request failed (503)` — Cloudflare, no internet, not a\n // Teams configuration problem.\n const defaultNetworkStartedAt = Date.now()\n let defaultNetworkOk = false\n try {\n const network = await acsMeetingService.awaitDefaultNetworkAfterHotspot()\n defaultNetworkOk = true\n softapTrace(\"softap_teardown_step\", {\n attempt: attempt.id,\n step: \"awaitValidatedDefaultNetwork\",\n outcome: \"ok\",\n durationMs: Date.now() - defaultNetworkStartedAt,\n // Null is \"this host cannot tell\", which is a different fact from an unusable route, and\n // the cellular pin is dropped on the strength of this answer.\n network: network?.detail ?? \"unknown\",\n usable: network?.usable ?? \"unknown\",\n })\n } catch (error) {\n console.warn(\"[LocalMiniappRuntime] default network after SoftAP teardown is unverified\", {\n attempt: attempt.id,\n error: error instanceof Error ? error.message : String(error),\n })\n softapTraceFailure(\"softap_teardown_step\", {\n attempt: attempt.id,\n step: \"awaitValidatedDefaultNetwork\",\n outcome: \"failed\",\n durationMs: Date.now() - defaultNetworkStartedAt,\n reason: error instanceof Error ? error.message : String(error),\n })\n }\n const defaultNetworkMs = Date.now() - defaultNetworkStartedAt\n const acsLeaveStartedAt = Date.now()\n let acsLeaveOk = false\n try {\n const outcome = await acsMeetingService.leaveAndAwait(attempt.packageName)\n acsLeaveOk = outcome.completed\n softapTrace(\"softap_teardown_step\", {\n attempt: attempt.id,\n step: \"acsLeaveAndAwait\",\n // `completed=false` is not a failure and is not recorded as one: the build simply cannot\n // confirm its own cleanup, so the next call's barrier is the only guarantee left.\n outcome: outcome.completed ? \"ok\" : \"unconfirmed\",\n reason: outcome.reason ?? \"\",\n durationMs: Date.now() - acsLeaveStartedAt,\n })\n if (!outcome.completed) {\n console.warn(\"[LocalMiniappRuntime] ACS cleanup completion is unverified on this build\", {\n attempt: attempt.id,\n reason: outcome.reason,\n })\n }\n } catch (error) {\n softapTraceFailure(\"softap_teardown_step\", {\n attempt: attempt.id,\n step: \"acsLeaveAndAwait\",\n outcome: \"failed\",\n durationMs: Date.now() - acsLeaveStartedAt,\n reason: error instanceof Error ? error.message : String(error),\n })\n failures.push(`ACS leave: ${error instanceof Error ? error.message : String(error)}`)\n }\n const hadScopedLostListener = Boolean(attempt.scopedLostUnsub)\n attempt.scopedLostUnsub?.()\n attempt.scopedLostUnsub = null\n softapTrace(\"softap_teardown_step\", {\n attempt: attempt.id,\n step: \"scopedLostListener\",\n outcome: hadScopedLostListener ? \"ok\" : \"not taken\",\n })\n failures.push(\n ...(await this.settleSoftapTeardown(attempt, {\n acsLeave: {ok: acsLeaveOk, durationMs: Date.now() - acsLeaveStartedAt},\n defaultNetwork: {ok: defaultNetworkOk, durationMs: defaultNetworkMs},\n })),\n )\n if (failures.length > 0) {\n this.softapCleanupError = failures.join(\"; \")\n console.warn(\"[LocalMiniappRuntime] softap_cleanup_failed\", {attempt: attempt.id, failures})\n }\n // The recorded failures are what the *next* join refuses on, so they are logged as the list\n // that will be quoted back to the wearer rather than only as the individual step failures.\n softapTrace(\"softap_teardown_done\", {\n attempt: attempt.id,\n durationMs: Date.now() - teardownStartedAt,\n refusesNextCall: failures.length > 0,\n failures: failures.join(\"; \"),\n endRefused: Boolean(endFailure),\n })\n attempt.releaseHotspot?.()\n attempt.releaseHotspot = undefined\n if (endFailure) throw endFailure\n }\n\n /**\n * Send one hotspot command, re-sending it once if a session refresh cancelled it.\n *\n * The retry lives inside the unit chained onto [glassesHotspotCommand] rather than around it,\n * which is what holds the invariant: one logical hotspot operation issues at most two native\n * commands, and no later operation runs between them. A retry outside the queue would let an\n * `on` land between the two halves of an `off` and leave the glasses in the opposite state.\n *\n * Re-sending is free because ASG compares against current state first and answers a same-state\n * command with its current status instead of cycling the AP.\n */\n private setGlassesHotspotState(enabled: boolean) {\n const send = async () => {\n try {\n return await BluetoothSdk.setHotspotState(enabled)\n } catch (error) {\n const code = (error as {code?: string} | null | undefined)?.code\n if (!code || !HOTSPOT_SESSION_REFRESH_CODES.has(code)) throw error\n softapTrace(\"softap_hotspot_session_retry\", {enabled, code})\n await new Promise<void>((resolve) => setTimeout(resolve, HOTSPOT_SESSION_RETRY_DELAY_MS))\n return await BluetoothSdk.setHotspotState(enabled)\n }\n }\n const run = this.glassesHotspotCommand.then(send, send)\n this.glassesHotspotCommand = run.then(\n () => undefined,\n () => undefined,\n )\n return run\n }\n\n /**\n * The last two gates, and the point where a timeout stops being treated as consent.\n *\n * Four things have to be true before the next call may start: this device is out of the ACS\n * call, the WHIP listener's port is released, the glasses have acknowledged their hotspot off,\n * and the phone has a validated default route again. The first and last already ran; this adds\n * the two that were never waited for at all, and the ones that produced the stop-then-start\n * failure — the listener was still inside its 3s tombstone and the glasses AP was still up.\n *\n * A bound that expires is not success. It means the resource is still held by a call nobody is\n * in any more, so it is taken by force and re-verified. An ingest port that is still held\n * refuses the next join. A glasses hotspot that missed its off-ack does not — the next join\n * wants the AP up and will raise it again.\n *\n * @returns failures to record; a non-empty list refuses the next join.\n */\n private async settleSoftapTeardown(\n attempt: SoftapAttempt,\n earlier: {acsLeave: {ok: boolean; durationMs: number}; defaultNetwork: {ok: boolean; durationMs: number}},\n ): Promise<string[]> {\n const ingestStartedAt = Date.now()\n let ingestClosed = false\n try {\n ingestClosed = await acsMeetingService.awaitIngestClosed(SOFTAP_INGEST_CLOSE_WAIT_MS)\n } catch (error) {\n softapTraceFailure(\"softap_teardown_step\", {\n attempt: attempt.id,\n step: \"awaitIngestClosed\",\n outcome: \"failed\",\n reason: error instanceof Error ? error.message : String(error),\n })\n }\n const ingestMs = Date.now() - ingestStartedAt\n\n const hotspotStartedAt = Date.now()\n let hotspotOff = false\n let hotspotReason = \"\"\n try {\n // Idempotent by design — the command asks for \"disabled\" rather than toggling — so sending\n // it again after the transport's own stop costs nothing and is the only way to get an ack\n // that is bound to a deadline we chose.\n const status = await withTimeout(\n this.setGlassesHotspotState(false),\n SOFTAP_HOTSPOT_OFF_ACK_MS,\n \"hotspot_off_ack_timeout\",\n )\n hotspotOff = status.state === \"disabled\"\n hotspotReason = status.state\n } catch (error) {\n hotspotReason = error instanceof Error ? error.message : String(error)\n }\n const hotspotMs = Date.now() - hotspotStartedAt\n\n softapTrace(\"softap_teardown_settled\", {\n attempt: attempt.id,\n acsLeaveMs: earlier.acsLeave.durationMs,\n acsLeaveOk: earlier.acsLeave.ok,\n ingestClosedMs: ingestMs,\n ingestClosed,\n hotspotOffMs: hotspotMs,\n hotspotOff,\n hotspotDetail: hotspotReason,\n defaultNetworkMs: earlier.defaultNetwork.durationMs,\n defaultNetworkOk: earlier.defaultNetwork.ok,\n })\n\n if (ingestClosed && hotspotOff) return []\n return this.forceSoftapCleanup(attempt, {ingestClosed, hotspotOff, hotspotReason})\n }\n\n /**\n * Take back what the bounded waits could not confirm was released.\n *\n * Runs only after a gate timed out, and re-verifies rather than assuming: the whole reason the\n * barrier exists is that \"it has probably finished by now\" is what broke restarts.\n */\n private async forceSoftapCleanup(\n attempt: SoftapAttempt,\n gates: {ingestClosed: boolean; hotspotOff: boolean; hotspotReason: string},\n ): Promise<string[]> {\n const failures: string[] = []\n softapTraceFailure(\"softap_teardown_forced\", {\n attempt: attempt.id,\n ingestClosed: gates.ingestClosed,\n hotspotOff: gates.hotspotOff,\n hotspotDetail: gates.hotspotReason,\n })\n if (!gates.ingestClosed) {\n try {\n await acsMeetingService.forceCloseIngest()\n // Re-asked, not assumed: `forceCloseIngest` skips the tombstone, so the latch should be\n // open immediately. A short bound here is enough and a failure is real.\n const closed = await acsMeetingService.awaitIngestClosed(SOFTAP_FORCED_VERIFY_MS)\n if (!closed) failures.push(\"the video receiver did not release its port\")\n } catch (error) {\n failures.push(`forced ingest close: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n if (!gates.hotspotOff) {\n try {\n const status = await withTimeout(\n this.setGlassesHotspotState(false),\n SOFTAP_HOTSPOT_OFF_ACK_MS,\n \"hotspot_off_ack_timeout\",\n )\n if (status.state !== \"disabled\") {\n console.warn(\"[LocalMiniappRuntime] glasses hotspot still reported after disable; next join will raise it\", {\n attempt: attempt.id,\n state: status.state,\n })\n }\n } catch (error) {\n console.warn(\"[LocalMiniappRuntime] glasses hotspot off ack missed; next join will raise it\", {\n attempt: attempt.id,\n reason: error instanceof Error ? error.message : String(error),\n })\n }\n }\n softapTrace(\"softap_teardown_forced_done\", {\n attempt: attempt.id,\n recovered: failures.length === 0,\n failures: failures.join(\"; \"),\n })\n return failures\n }\n\n private async handleMeetingLeave(packageName: string, requestId?: string): Promise<void> {\n const startedAt = Date.now()\n softapTrace(\"meeting_leave_request\", {\n packageName,\n requestId: requestId ?? \"none\",\n attempt: this.softapAttempt?.id ?? \"none\",\n })\n try {\n // A SoftAP call owns the hotspot, the scoped network, and the cellular pin as well as the\n // ACS call, and retiring the attempt releases all of them. Returning before that finishes is\n // what let the next Start race this teardown.\n if (this.softapAttempt) {\n await this.retireSoftapAttempt()\n softapTrace(\"meeting_leave_result\", {\n packageName,\n requestId: requestId ?? \"none\",\n path: \"softap\",\n durationMs: Date.now() - startedAt,\n })\n this.sendResult(packageName, requestId, true)\n return\n }\n await acsMeetingService.leave(packageName)\n softapTrace(\"meeting_leave_result\", {\n packageName,\n requestId: requestId ?? \"none\",\n path: \"acs\",\n durationMs: Date.now() - startedAt,\n })\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n softapTraceFailure(\"meeting_leave_result\", {\n packageName,\n requestId: requestId ?? \"none\",\n reason: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - startedAt,\n })\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"ACS meeting leave failed\",\n })\n }\n }\n\n /**\n * End the meeting for everyone, then tear this device down.\n *\n * A rejection here always means \"the others may still be in the meeting\", never \"you are still in\n * it\": both paths below complete local teardown before the error surfaces.\n */\n private async handleMeetingEnd(packageName: string, requestId?: string): Promise<void> {\n const startedAt = Date.now()\n const softap = Boolean(this.softapAttempt)\n softapTrace(\"meeting_end_request\", {\n packageName,\n requestId: requestId ?? \"none\",\n attempt: this.softapAttempt?.id ?? \"none\",\n })\n try {\n if (this.softapAttempt) {\n await this.retireSoftapAttempt({mode: \"end\"})\n } else {\n await acsMeetingService.endForEveryone(packageName)\n }\n softapTrace(\"meeting_end_result\", {\n packageName,\n requestId: requestId ?? \"none\",\n path: softap ? \"softap\" : \"acs\",\n durationMs: Date.now() - startedAt,\n })\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n // A rejection here always means the others may still be in the meeting, never that this\n // device is — the log has to be readable that way round or it accuses the wrong side.\n softapTraceFailure(\"meeting_end_result\", {\n packageName,\n requestId: requestId ?? \"none\",\n reason: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - startedAt,\n })\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Could not end the meeting for everyone\",\n })\n }\n }\n\n private async handleMeetingAdmit(packageName: string, payload: Record<string, unknown>, requestId?: string): Promise<void> {\n try {\n if (typeof payload.participantId !== \"string\") throw new Error(\"A participant ID is required\")\n await acsMeetingService.admitParticipant(packageName, payload.participantId)\n this.sendResult(packageName, requestId, true)\n } catch (error) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: error instanceof Error ? error.message : \"Could not admit this guest\",\n })\n }\n }\n\n private async handleMeetingSetMuted(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const startedAt = Date.now()\n try {\n const state = await acsMeetingService.setMuted(packageName, Boolean(payload.muted))\n softapTrace(\"meeting_set_muted\", {\n packageName,\n requestId: requestId ?? \"none\",\n requested: Boolean(payload.muted),\n muted: state.muted,\n durationMs: Date.now() - startedAt,\n })\n this.sendResult(packageName, requestId, true, state)\n } catch (err) {\n softapTraceFailure(\"meeting_set_muted\", {\n packageName,\n requestId: requestId ?? \"none\",\n requested: Boolean(payload.muted),\n reason: err instanceof Error ? err.message : String(err),\n durationMs: Date.now() - startedAt,\n })\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"ACS mute failed\",\n })\n }\n }\n\n private async handleMeetingUpdateVideoSource(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const videoSource = payload.videoSource as {type?: string; url?: string} | undefined\n const whepUrl = videoSource?.type === \"whep\" ? (videoSource.url ?? \"\") : \"\"\n if (!whepUrl) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INVALID_ARGUMENT,\n message: \"videoSource must be a WHEP URL\",\n })\n return\n }\n try {\n await acsMeetingService.updateVideoSource(packageName, whepUrl)\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"ACS video source update failed\",\n })\n }\n }\n\n private async handleMeetingGetState(packageName: string, requestId?: string): Promise<void> {\n try {\n const state = await acsMeetingService.readState(packageName)\n this.sendResult(packageName, requestId, true, state)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"ACS getState failed\",\n })\n }\n }\n\n /**\n * session.glasses.requestWifiSetup — open the phone's glasses Wi-Fi setup\n * flow. The host owns the actual UI via the `engine.configure({ui})` seam;\n * this just forwards the request and reports success/failure.\n */\n private async handleRequestWifiSetup(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const requestWifiSetup = getUiSeams().requestWifiSetup\n if (!requestWifiSetup) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_IMPLEMENTED,\n message: \"Wi-Fi setup is not configured on this host\",\n })\n return\n }\n try {\n await requestWifiSetup(payload.reason as string | undefined, packageName)\n this.sendResult(packageName, requestId, true)\n } catch (err) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: (err as {code?: string}).code || MiniappErrorCode.INTERNAL,\n message: err instanceof Error ? err.message : \"Wi-Fi setup failed\",\n })\n }\n }\n\n /**\n * Wire the PhoneStreamCoordinator's status callback so coordinator-emitted\n * updates become `EVENT { streamType: \"stream_status\" }` envelopes on the\n * subscribing miniapp(s).\n */\n public wireStreamingStatusFanout(): void {\n const streaming = phoneStreamCoordinator\n if (!streaming) return\n streaming.setStatusSubscriber((packageName, update) => {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: \"stream_status\",\n data: {\n streamId: update.streamId,\n status: update.status,\n source: update.source,\n ...(update.data || {}),\n },\n })\n })\n }\n\n // ===========================================================================\n // Public subscribe helper\n // ===========================================================================\n\n /**\n * Standalone subscribe — lets external code subscribe a registered miniapp to\n * streams without going through the envelope protocol.\n *\n * Returns `{ok: true}` on success, or `{ok: false, error}` on failure.\n */\n public subscribe(packageName: string, streams: string[]): {ok: boolean; error?: string} {\n const app = this.connectedApps.get(packageName)\n if (!app) {\n return {ok: false, error: `App ${packageName} is not registered`}\n }\n\n if (!Array.isArray(streams)) {\n return {ok: false, error: \"streams must be an array\"}\n }\n\n console.log(`${LOG_TAG}: subscribe(${packageName}, [${streams.join(\", \")}])`)\n\n // Check microphone permission for mic-requiring streams\n const micStreams = [\"transcription\", \"translation\", \"audio_chunk\", \"vad\"]\n const needsMic = streams.some((s: string) => micStreams.some((m) => s.startsWith(m) || s === m))\n if (needsMic) {\n const hasMicPermission = app.installedManifest?.permissions?.some((p) => p.type === \"MICROPHONE\")\n if (!hasMicPermission) {\n return {ok: false, error: \"MICROPHONE permission not declared in miniapp.json\"}\n }\n }\n\n // Add new subscriptions\n const previousSubscriptions = app.subscriptions\n app.subscriptions = new Set(streams)\n app.forceLocalTranscriptionStreams.clear()\n app.cloudTranscriptionStreams = new Set(streams.filter((stream) => stream.startsWith(\"transcription:\")))\n this.replaceStreamSubscribers(packageName, previousSubscriptions, app.subscriptions)\n\n this.recomputeMicRequirements()\n this.updateCloudSubscriptions()\n return {ok: true}\n }\n\n // ===========================================================================\n // Mic requirements\n // ===========================================================================\n\n private getConfiguredMicGates(): {vadEnabled: boolean | null; loudnessGateEnabled: boolean | null} {\n const bluetoothSettings = useSettingsStore.getState().getBluetoothSettings()\n const configuredVad = bluetoothSettings.voice_activity_detection_enabled\n const configuredLoudnessGate = bluetoothSettings.loudness_gate_enabled\n return {\n vadEnabled: typeof configuredVad === \"boolean\" ? configuredVad : null,\n loudnessGateEnabled: typeof configuredLoudnessGate === \"boolean\" ? configuredLoudnessGate : null,\n }\n }\n\n private recomputeMicRequirements(): void {\n let anyPcm = false\n let anyLc3 = false\n for (const [stream, subscribers] of this.streamSubscribers) {\n if (subscribers.size === 0) continue\n if (stream === \"audio_chunk\") anyPcm = true\n if (stream.startsWith(\"transcription:\") || stream.startsWith(\"translation:\") || stream === \"vad\") anyLc3 = true\n }\n micStateCoordinator.setLocalRequirements({\n pcm: anyPcm,\n lc3: anyLc3,\n ...this.getConfiguredMicGates(),\n })\n }\n\n /**\n * Recompute the aggregated v2 cloud subscription list across all local miniapps.\n *\n * Cloud-dependent streams (transcription:*, translation:*) only flow if the\n * v2 runtime knows the phone wants them. Local-only streams (button_press, etc.)\n * are NOT sent — they come from the Bluetooth SDK, not from cloud.\n */\n private updateCloudSubscriptions(): void {\n const cloudStreams = new Set<string>()\n let transcriptionLang: string | null = null\n let forceLocalTranscriptionLang: string | null = null\n let hasForceLocalTranscription = false\n for (const [stream, subscribers] of this.streamSubscribers) {\n if (subscribers.size === 0) continue\n // Only transcription / translation need cloud delivery. Location and\n // notifications are sourced natively on the phone — no cloud hop.\n if (stream.startsWith(\"translation:\")) {\n cloudStreams.add(stream)\n }\n if (stream.startsWith(\"transcription:\")) {\n const language = stream.substring(\"transcription:\".length)\n if (transcriptionLang === null) transcriptionLang = language\n\n const routes = summarizeTranscriptionRoutes(subscribers, (packageName) =>\n this.appTranscriptionRoutesForSubscription(packageName, stream),\n )\n if (routes.hasForceLocalSubscriber) {\n hasForceLocalTranscription = true\n if (forceLocalTranscriptionLang === null) forceLocalTranscriptionLang = language\n }\n if (routes.hasCloudSubscriber) cloudStreams.add(stream)\n }\n }\n localSttFallbackCoordinator.onSubscriptionChange(\n transcriptionLang !== null,\n forceLocalTranscriptionLang ?? transcriptionLang,\n hasForceLocalTranscription,\n )\n\n // Mirror the same set as typed AudioSubscription[] and push it to the cloud\n // runtime.\n this.ensureCloudResultsWired()\n const subs = this.buildCloudAudioSubscriptions(cloudStreams)\n const nextKey = this.audioSubscriptionKey(subs)\n if (!this.cloudAudioSubscriptionSync.begin(nextKey)) return\n console.log(\n `${LOG_TAG}: updateCloudSubscriptions streams=[${Array.from(cloudStreams).join(\", \")}] cloudSubs=${subs.length}`,\n )\n cloudClientService\n .setSubscriptions(subs)\n .then(() => {\n this.cloudAudioSubscriptionSync.succeeded(nextKey)\n })\n .catch((err) => {\n // Best-effort: the cloud may not be connected yet. Keep failed writes\n // retryable; otherwise a reconnect that recomputes the same desired\n // transcription set gets deduped and local captions never recover.\n this.cloudAudioSubscriptionSync.failed(nextKey)\n console.warn(`${LOG_TAG}: cloud setSubscriptions failed: ${(err as Error)?.message ?? err}`)\n })\n }\n\n /**\n * Build the cloud `AudioSubscription[]` from the miniapp cloud-stream key set.\n *\n * Stream keys: `transcription:<lang>` (lang may be `auto`, `en-US`, …) and\n * `translation:<source>:<target>` (3 colon-parts; source/target may be `*`\n * or `auto` wildcards, target may also be `*`). The cloud protocol requires a\n * concrete `target: string` for translation, so wildcard-target translation\n * keys (`translation:<source>:*`, `translation:*:*`, `translation:auto`) have\n * no cloud equivalent and are skipped. Wildcard/`auto` SOURCE maps to\n * `{mode: \"auto\"}`.\n */\n private buildCloudAudioSubscriptions(cloudStreams: Set<string>): AudioSubscription[] {\n const subs: AudioSubscription[] = []\n // Union of every connected app's TRANSCRIPTION_CONFIG hints. Hints only\n // apply to the auto-mode TRANSCRIPTION subscription (the wire schema has\n // no hints field on specific-language sources — the language IS the hint\n // there), and are deliberately NOT attached to translation sources.\n const hintUnion = [...new Set([...this.transcriptionHintsByApp.values()].flat())].sort()\n const langSource = (code: string): LanguageSource =>\n code === \"auto\" || code === \"*\" ? {mode: \"auto\"} : {mode: \"specific\", code}\n for (const stream of cloudStreams) {\n if (stream.startsWith(\"transcription:\")) {\n const lang = stream.substring(\"transcription:\".length)\n const source = langSource(lang)\n subs.push({\n kind: \"transcription\",\n language: source.mode === \"auto\" && hintUnion.length > 0 ? {mode: \"auto\", hints: hintUnion} : source,\n })\n } else if (stream.startsWith(\"translation:\")) {\n const parts = stream.split(\":\")\n // Only `translation:<source>:<target>` maps cleanly; a concrete target\n // is required by the cloud schema.\n if (parts.length === 3) {\n const [, source, target] = parts\n if (target === \"*\") continue\n subs.push({kind: \"translation\", source: langSource(source), target})\n }\n }\n }\n return subs\n }\n\n private audioSubscriptionKey(subs: AudioSubscription[]): string {\n return JSON.stringify(\n subs\n .map((sub) => {\n if (sub.kind === \"transcription\") {\n return {\n kind: sub.kind,\n language: sub.language,\n }\n }\n return {\n kind: sub.kind,\n source: sub.source,\n target: sub.target,\n }\n })\n .sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b))),\n )\n }\n\n /**\n * Wire the cloud's transcription/translation results into the existing\n * miniapp fan-out exactly once. Maps each cloud result back to the\n * cloud-to-app data shape `forwardEvent` already forwards, keyed on the\n * `transcription:<lang>` / `translation:<source>:<target>` stream strings, so\n * subscribed miniapps receive identical envelopes.\n */\n private ensureCloudResultsWired(): void {\n if (this.cloudResultsWired) return\n this.cloudResultsWired = true\n\n cloudClientService.onTranscript((d: TranscriptionData) => {\n const receivedAt = Date.now()\n if (TRANSCRIPT_TIMING_TELEMETRY) {\n console.log(\n `${LOG_TAG}: transcript cloud_recv t=${receivedAt} final=${d.isFinal} lang=${\n d.resolvedLanguage\n } text=\"${d.text.slice(0, 48)}\"`,\n )\n }\n this.forwardEvent(\n `transcription:${d.resolvedLanguage}`,\n {\n type: \"transcription\",\n text: d.text,\n isFinal: d.isFinal,\n utteranceId: d.utteranceId,\n transcribeLanguage: d.resolvedLanguage,\n detectedLanguage: d.languageDetected ? d.resolvedLanguage : undefined,\n startTime: d.startMs,\n endTime: d.endMs,\n speakerId: d.speakerId,\n duration: d.durationMs,\n provider: d.provider,\n confidence: d.confidence,\n __hostReceivedAt: receivedAt,\n },\n \"cloud\",\n )\n })\n\n cloudClientService.onTranslation((d: TranslationData) => {\n this.forwardEvent(`translation:${d.source.language}:${d.target.language}`, {\n type: \"translation\",\n text: d.text,\n originalText: d.originalText,\n isFinal: d.isFinal,\n utteranceId: d.utteranceId,\n startTime: d.startMs,\n endTime: d.endMs,\n speakerId: d.speakerId,\n duration: d.durationMs,\n transcribeLanguage: d.source.language,\n translateLanguage: d.target.language,\n didTranslate: true,\n provider: d.provider,\n confidence: d.confidence,\n })\n })\n }\n\n private ensureCloudStatusWired(): void {\n if (this.cloudStatusWired) return\n this.cloudStatusWired = true\n\n cloudClientService.onStatusChanged((status) => {\n if (status.status === \"connected\") {\n this.updateCloudSubscriptions()\n // A miniapp that connected before the cloud client was ready never got\n // its auth token; now that we're connected, mint it without waiting for\n // the retry backoff (or a full manual reconnect).\n this.redriveMiniappAuthDelivery()\n }\n this.broadcastCloudStatus()\n })\n\n useSettingsStore.subscribe(\n (s) => s.getSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive),\n () => {\n this.broadcastCloudStatus()\n },\n )\n }\n\n private currentCloudStatus(): CloudClientStatusSnapshot {\n const base = cloudClientService.getStatus()\n const fallbackActive =\n (useSettingsStore.getState().getSetting(ISLAND_SETTINGS_KEYS.localSttFallbackActive) as boolean | undefined) ===\n true\n return {\n status: base.status,\n audioTransport: fallbackActive ? \"offline\" : base.audioTransport,\n }\n }\n\n private broadcastCloudStatus(): void {\n const status = this.currentCloudStatus()\n for (const packageName of this.connectedApps.keys()) {\n this.sendCloudStatusToMiniapp(packageName, status)\n }\n }\n\n private sendCloudStatusToMiniapp(packageName: string, status = this.currentCloudStatus()): void {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: CLOUD_STATUS_STREAM,\n data: status,\n })\n }\n\n // ===========================================================================\n // Stream fan-out\n // ===========================================================================\n\n /**\n * Forward a streamed event to all miniapps subscribed to the given stream.\n *\n * Event name translation:\n * - Incoming \"head_up\" → miniapp protocol uses \"head_position\" (HEAD_POSITION)\n * - Incoming \"VAD\" (uppercase) → miniapp protocol uses \"vad\" (lowercase)\n */\n public forwardEvent(streamType: string, data: unknown, transcriptionSource?: TranscriptionEventSource): void {\n // Normalize incoming event names to miniapp protocol stream types\n const normalizedStream = this.normalizeStreamType(streamType)\n\n // Collect all subscribers: exact match, plus wildcard matches for streams\n // that carry a language tag. A miniapp subscribed to \"transcription:auto\"\n // should receive any \"transcription:<lang>\" event (the detected language\n // is conveyed in the event data, not the stream key).\n //\n // Translation streams support cloud v3's wildcard patterns. Incoming\n // events are keyed `translation:<source>:<target>` and we match against\n // any of:\n // translation:*:* — all-pairs (TranslationModule.on)\n // translation:*:<target> — any-source → target (TranslationModule.to)\n // translation:<source>:* — source → any-target (rare)\n // translation:<source>:<target> — exact (TranslationModule.fromTo)\n // translation:auto — back-compat alias for *:*\n const matchedSubs = new Set<string>()\n const exact = this.streamSubscribers.get(normalizedStream)\n if (exact) for (const p of exact) matchedSubs.add(p)\n\n if (normalizedStream.startsWith(\"transcription:\")) {\n const autoSubs = this.streamSubscribers.get(\"transcription:auto\")\n if (autoSubs) for (const p of autoSubs) matchedSubs.add(p)\n } else if (normalizedStream.startsWith(\"translation:\")) {\n // translation:<source>:<target> — match each wildcard variant.\n const parts = normalizedStream.split(\":\")\n // parts[0] = \"translation\", parts[1] = source, parts[2] = target\n if (parts.length === 3) {\n const [, source, target] = parts\n const patterns = [\n \"translation:auto\", // legacy alias for *:*\n \"translation:*:*\", // cloud v3 \"all pairs\"\n `translation:*:${target}`, // cloud v3 \"to <target>\"\n `translation:${source}:*`, // cloud v3 \"from <source>\"\n ]\n for (const pat of patterns) {\n const subs = this.streamSubscribers.get(pat)\n if (subs) for (const p of subs) matchedSubs.add(p)\n }\n } else {\n // Malformed stream key — still honor the legacy auto alias.\n const autoSubs = this.streamSubscribers.get(\"translation:auto\")\n if (autoSubs) for (const p of autoSubs) matchedSubs.add(p)\n }\n }\n\n // Touch event per-gesture fan-out. SDK-side dispatch is keyed on the\n // exact streamType, so per-gesture subscribers (`touch_event:single_tap`,\n // etc.) need their own EVENT envelope with the gesture-tagged streamType.\n // The bare `touch_event` stream above still catches `onTouch(handler)`.\n let perGestureStream: string | null = null\n let outboundData = data\n if (normalizedStream === MiniappStreamType.GLASSES_CONNECTION) {\n outboundData = toMiniappConnectionData(data) ?? data\n }\n if (normalizedStream === MiniappStreamType.TOUCH_EVENT) {\n // The Bluetooth SDK delivers the gesture under `gestureName` (single_tap /\n // double_tap / triple_tap / long_press / swipe_up / swipe_down). Surface it\n // to miniapps as `TouchData.kind` and tag a per-gesture stream so\n // onTouch(\"single_tap\", ...) routes correctly.\n const touch = data as {gestureName?: string; kind?: string} | null\n const gesture = touch?.gestureName ?? touch?.kind\n if (typeof gesture === \"string\" && gesture.length > 0) {\n outboundData = {...(touch as object), kind: gesture}\n perGestureStream = `${MiniappStreamType.TOUCH_EVENT}:${gesture}`\n }\n }\n\n if (normalizedStream.startsWith(\"transcription:\")) {\n // const known = Array.from(this.streamSubscribers.keys())\n // console.log(\n // `${LOG_TAG}: forwardEvent(${streamType} → ${normalizedStream}) matched=${matchedSubs.size} known=[${known.join(\", \")}]`,\n // )\n }\n\n if (matchedSubs.size === 0 && !perGestureStream) return\n\n for (const packageName of matchedSubs) {\n let transcriptionRoute: \"default\" | \"forceLocal\" | \"all\" | undefined\n if (normalizedStream.startsWith(\"transcription:\") && transcriptionSource) {\n const routes = this.appTranscriptionRoutesForEvent(packageName, normalizedStream)\n transcriptionRoute =\n transcriptionDeliveryRoute(transcriptionSource, routes, cloudClientService.isConnected()) ?? undefined\n if (!transcriptionRoute) continue\n }\n if (TRANSCRIPT_TIMING_TELEMETRY && normalizedStream.startsWith(\"transcription:\")) {\n const transcript = data as {text?: string; isFinal?: boolean; __hostReceivedAt?: number} | null\n const now = Date.now()\n console.log(\n `${LOG_TAG}: transcript fanout t=${now} app=${packageName} final=${!!transcript?.isFinal} hostDelta=${\n transcript?.__hostReceivedAt ? now - transcript.__hostReceivedAt : -1\n }ms text=\"${(transcript?.text ?? \"\").slice(0, 48)}\"`,\n )\n }\n // While a nav trip is active the Nav SDK's road-snapped fixes are\n // already being forwarded via addLocationListener (see NAV_START handler).\n // Suppress the raw background-GPS forward for that miniapp so the two\n // streams don't interleave and cause the position to jump back to the\n // real-phone location during simulation.\n if (normalizedStream === MiniappStreamType.LOCATION_UPDATE && this.navigationHandlers.isTripActive(packageName)) {\n continue\n }\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: normalizedStream,\n data: outboundData,\n ...(transcriptionRoute ? {transcriptionRoute} : {}),\n })\n }\n\n // Send a separate envelope to per-gesture subscribers tagged with the\n // gesture-specific streamType so SDK-side dispatch routes correctly.\n if (perGestureStream) {\n const gestureSubs = this.streamSubscribers.get(perGestureStream)\n if (gestureSubs) {\n for (const packageName of gestureSubs) {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.EVENT,\n streamType: perGestureStream,\n data: outboundData,\n })\n }\n }\n }\n }\n\n private appTranscriptionRoutesForSubscription(\n packageName: string,\n stream: string,\n ): {\n cloud: boolean\n forceLocal: boolean\n } {\n const app = this.connectedApps.get(packageName)\n return {\n cloud: app?.cloudTranscriptionStreams.has(stream) === true,\n forceLocal: app?.forceLocalTranscriptionStreams.has(stream) === true,\n }\n }\n\n private appTranscriptionRoutesForEvent(\n packageName: string,\n stream: string,\n ): {\n cloud: boolean\n forceLocal: boolean\n } {\n const app = this.connectedApps.get(packageName)\n const autoStream = `${MiniappStreamType.TRANSCRIPTION}:auto`\n return {\n cloud:\n app?.cloudTranscriptionStreams.has(stream) === true || app?.cloudTranscriptionStreams.has(autoStream) === true,\n forceLocal:\n app?.forceLocalTranscriptionStreams.has(stream) === true ||\n app?.forceLocalTranscriptionStreams.has(autoStream) === true,\n }\n }\n\n /**\n * Normalize incoming event names to miniapp stream type values.\n */\n private normalizeStreamType(cloudEventName: string): string {\n // Incoming event names → miniapp protocol translations.\n // Bluetooth SDK event names don't always match the miniapp wire values.\n switch (cloudEventName) {\n case \"head_up\":\n return MiniappStreamType.HEAD_POSITION // head_up → head_position\n case \"accel_event\":\n return MiniappStreamType.ACCEL_DATA // accel_event (native) → accel_data\n case \"VAD\":\n return MiniappStreamType.VAD // VAD (uppercase) → vad (lowercase)\n case \"glasses_battery_update\":\n return MiniappStreamType.GLASSES_BATTERY // glasses_battery_update → glasses_battery\n case \"glasses_connection_state\":\n return MiniappStreamType.GLASSES_CONNECTION // glasses_connection_state → glasses_connection\n default:\n // Preserve case for typed streams like \"transcription:en-US\" / \"translation:en-US:fr-FR\"\n // whose language tags are case-sensitive (BCP-47). Lowercase only plain names.\n if (cloudEventName.includes(\":\")) return cloudEventName\n return cloudEventName.toLowerCase()\n }\n }\n\n // ===========================================================================\n // Outbound helpers\n // ===========================================================================\n\n /**\n * Send a payload to a connected miniapp, wrapped in an envelope.\n */\n /**\n * Push a speaker-state transition to the owning miniapp. Idempotent: if\n * the new state matches the cached one (and isn't an error), no envelope\n * is sent. Error events are always sent — they're transient and the SDK\n * settles back to a non-error state immediately after.\n */\n private setSpeakerState(\n packageName: string,\n next: SpeakerStateValue,\n extra?: {errorCode?: string; errorMessage?: string; durationMs?: number},\n ): void {\n const app = this.connectedApps.get(packageName)\n if (!app) return\n if (app.speakerState === next && next !== \"error\") return\n app.speakerState = next === \"error\" ? \"error\" : next\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.SPEAKER_STATE,\n state: next,\n ...(extra?.errorCode !== undefined ? {errorCode: extra.errorCode} : {}),\n ...(extra?.errorMessage !== undefined ? {errorMessage: extra.errorMessage} : {}),\n ...(extra?.durationMs !== undefined ? {durationMs: extra.durationMs} : {}),\n })\n // After an error event, immediately transition to \"stopped\" so the\n // SDK's isPlaying getter reads false and a new play()/speak() call\n // starts cleanly from idle/stopped.\n if (next === \"error\") {\n app.speakerState = \"stopped\"\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.SPEAKER_STATE,\n state: \"stopped\",\n })\n }\n }\n\n private sendToMiniapp(packageName: string, payload: Record<string, unknown>, requestId?: string): void {\n const app = this.connectedApps.get(packageName)\n if (!app) {\n console.warn(`${LOG_TAG}: sendToMiniapp — ${packageName} not connected`)\n return\n }\n\n const envelope: MiniappEnvelope = {\n payload,\n requestId,\n }\n\n const serialized = serializeEnvelope(envelope)\n if ((payload as Record<string, unknown>)?.streamType?.toString().startsWith(\"transcription\")) {\n // console.log(\n // `${LOG_TAG}: sendToMiniapp → ${packageName} streamType=${(payload as Record<string, unknown>).streamType}`,\n // )\n }\n\n try {\n app.sendMessage(serialized)\n } catch (err) {\n console.error(`${LOG_TAG}: sendToMiniapp error for ${packageName}:`, err)\n }\n }\n\n /**\n * Send a REQUEST_RESULT response.\n */\n // ===========================================================================\n // Inter-miniapp interop (session.miniapps + session.actions.invoke)\n // ===========================================================================\n\n /** Max serialized size of an action call's params / result (256 KB). */\n private static readonly ACTION_PAYLOAD_CAP = 256 * 1024\n\n /** Outstanding action invocations, keyed by host-generated callId. */\n private actionCalls = new Map<\n string,\n {callerPackageName: string; targetPackageName: string; callerRequestId?: string; timer: number}\n >()\n private actionCallSeq = 0\n\n private interopApps(): ClientApp[] {\n return useAppStatusStore.getState().apps\n }\n\n private isSystemPackage(packageName: string): boolean {\n const app = this.interopApps().find((candidate) => candidate.packageName === packageName)\n if (SYSTEM_MINIAPP_PACKAGE_SET.has(packageName)) {\n if (app?.offline) return true\n if (app?.local && app.version) {\n return appRegistry.getReleaseIdentity(packageName, app.version)?.source === \"bundled_asset\"\n }\n return false\n }\n return app?.isMiniappDev === true\n }\n\n private async startInteropApp(packageName: string): Promise<boolean> {\n const app = this.interopApps().find((a) => a.packageName === packageName)\n if (!app) return false\n if (app.local) {\n await miniappLauncher.ensureConnected(packageName)\n return true\n }\n return useAppStatusStore.getState().start(app, {skipNavigation: true})\n }\n\n private stopInteropApp(packageName: string): Promise<void> {\n return useAppStatusStore.getState().stop(packageName)\n }\n\n private wakeInteropApp(packageName: string): Promise<void> {\n return miniappLauncher.ensureConnected(packageName)\n }\n\n /** Emit an interop audit event (best-effort — never let telemetry break a call). */\n private auditInterop(event: InteropAuditEvent): void {\n try {\n getAnalytics()?.(\"miniapp_interop\", {\n caller: event.caller,\n op: event.op,\n target: event.target ?? \"\",\n actionId: event.actionId ?? \"\",\n ok: event.ok,\n errorCode: event.errorCode ?? \"\",\n })\n } catch {\n /* telemetry must never break an interop call */\n }\n }\n\n /** Reject the request with NOT_PERMITTED unless the caller is a system app. */\n private requireSystemCaller(\n packageName: string,\n requestId: string | undefined,\n op: InteropAuditEvent[\"op\"],\n target?: string,\n ): boolean {\n if (this.isSystemPackage(packageName)) return true\n this.auditInterop({caller: packageName, op, target, ok: false, errorCode: MiniappErrorCode.NOT_PERMITTED})\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.NOT_PERMITTED,\n message: \"Inter-miniapp APIs are restricted to system apps\",\n })\n return false\n }\n\n /** Project a host ClientApp into the SDK's MiniappInfo shape (JSON over the wire). */\n private buildMiniappInfo(app: ClientApp): Record<string, unknown> {\n const compatibility = app.compatibility ?? {\n isCompatible: true,\n missingRequired: [],\n missingOptional: [],\n warnings: [],\n }\n return {\n packageName: app.packageName,\n name: app.name,\n version: app.version ?? \"\",\n running: app.running,\n compatibility,\n actions: app.actions ?? [],\n }\n }\n\n private handleMiniappsList(packageName: string, payload: Record<string, unknown>, requestId?: string): void {\n if (!this.requireSystemCaller(packageName, requestId, \"list\")) return\n const includeIncompatible = payload.includeIncompatible === true\n const infos = this.interopApps()\n .filter(\n (a) =>\n a.packageName &&\n a.packageName !== packageName &&\n !a.packageName.includes(\"@empty\") &&\n (includeIncompatible || a.compatibility?.isCompatible !== false),\n )\n .map((a) => this.buildMiniappInfo(a))\n this.sendResult(packageName, requestId, true, infos)\n this.auditInterop({caller: packageName, op: \"list\", ok: true})\n }\n\n private async handleMiniappsStart(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const target = payload.packageName as string | undefined\n if (!this.requireSystemCaller(packageName, requestId, \"start\", target)) return\n const app = target ? this.interopApps().find((a) => a.packageName === target) : undefined\n if (!target || !app) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.APP_NOT_FOUND,\n message: `Miniapp not found: ${target ?? \"(missing packageName)\"}`,\n })\n this.auditInterop({\n caller: packageName,\n op: \"start\",\n target,\n ok: false,\n errorCode: MiniappErrorCode.APP_NOT_FOUND,\n })\n return\n }\n // Pre-flight the hardware gate so the caller gets a precise reason rather\n // than a generic rejection (start()'s own gate would otherwise alert + abort).\n if (app.compatibility && app.compatibility.isCompatible === false) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.APP_NOT_COMPATIBLE,\n message: `${target} is not compatible with the connected glasses`,\n })\n islandNotifications.emit({\n kind: \"version_incompatible\",\n packageName: target,\n reason: `${target} is not compatible with the connected glasses`,\n metadata: {missingRequired: app.compatibility.missingRequired ?? [], via: \"miniapps.start\"},\n timestamp: Date.now(),\n })\n this.auditInterop({\n caller: packageName,\n op: \"start\",\n target,\n ok: false,\n errorCode: MiniappErrorCode.APP_NOT_COMPATIBLE,\n })\n return\n }\n try {\n // startInteropApp resolves to false when the app-store gate rejected the\n // launch or the background context failed to spawn — don't report success.\n const started = await this.startInteropApp(target)\n if (started) {\n this.sendResult(packageName, requestId, true)\n this.auditInterop({caller: packageName, op: \"start\", target, ok: true})\n } else {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: `start of ${target} was rejected by the host (gated or failed to spawn)`,\n })\n this.auditInterop({\n caller: packageName,\n op: \"start\",\n target,\n ok: false,\n errorCode: MiniappErrorCode.INTERNAL,\n })\n }\n } catch (e) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: (e as Error)?.message ?? \"start failed\",\n })\n this.auditInterop({\n caller: packageName,\n op: \"start\",\n target,\n ok: false,\n errorCode: MiniappErrorCode.INTERNAL,\n })\n }\n }\n\n private async handleMiniappsStop(\n packageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const target = payload.packageName as string | undefined\n if (!this.requireSystemCaller(packageName, requestId, \"stop\", target)) return\n if (!target) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.APP_NOT_FOUND,\n message: \"stop requires a packageName\",\n })\n return\n }\n try {\n await this.stopInteropApp(target)\n this.sendResult(packageName, requestId, true)\n this.auditInterop({caller: packageName, op: \"stop\", target, ok: true})\n } catch (e) {\n this.sendResult(packageName, requestId, false, undefined, {\n code: MiniappErrorCode.INTERNAL,\n message: (e as Error)?.message ?? \"stop failed\",\n })\n }\n }\n\n /** True iff `value` serializes larger than the action payload cap. */\n private actionPayloadTooLarge(value: unknown): boolean {\n try {\n return JSON.stringify(value ?? null).length > LocalMiniappRuntime.ACTION_PAYLOAD_CAP\n } catch {\n // Unserializable — let it through; the transport's own serialize handles it.\n return false\n }\n }\n\n /**\n * session.actions.invoke → wake the target headlessly, deliver an ACTION_CALL,\n * and correlate its ACTION_RESULT back to the caller's pending request.\n */\n private async handleActionInvoke(\n callerPackageName: string,\n payload: Record<string, unknown>,\n requestId?: string,\n ): Promise<void> {\n const targetForGate = payload.targetPackageName as string | undefined\n if (!this.requireSystemCaller(callerPackageName, requestId, \"invoke\", targetForGate)) return\n\n const target = payload.targetPackageName as string | undefined\n const actionId = payload.actionId as string | undefined\n const params = (payload.params as Record<string, unknown> | undefined) ?? {}\n // Floor the timeout at 6s so the host never rejects with ACTION_TIMEOUT before\n // the target SDK's handler-registration window closes. A freshly-woken miniapp\n // buffers an undelivered ACTION_CALL for HANDLER_WAIT_MS (5s in @mentra/miniapp's\n // actions module) waiting for session.actions.handle; a shorter host timeout\n // could fire while the target is still registering, then the action would run\n // with no caller left to receive its result. 6s = that 5s buffer + 1s for the\n // ACTION_RESULT/NO_ACTION_HANDLER reply to travel back. Keep these in sync.\n const timeoutMs = Math.min(Math.max(Number(payload.timeoutMs) || 30_000, 6_000), 120_000)\n\n if (this.actionPayloadTooLarge(params)) {\n this.sendResult(callerPackageName, requestId, false, undefined, {\n code: MiniappErrorCode.PAYLOAD_TOO_LARGE,\n message: \"action params exceeded the 256 KB cap\",\n })\n return\n }\n\n const app = target ? this.interopApps().find((a) => a.packageName === target) : undefined\n if (!target || !app) {\n this.sendResult(callerPackageName, requestId, false, undefined, {\n code: MiniappErrorCode.APP_NOT_FOUND,\n message: `Miniapp not found: ${target ?? \"(missing targetPackageName)\"}`,\n })\n return\n }\n if (!actionId) {\n this.sendResult(callerPackageName, requestId, false, undefined, {\n code: MiniappErrorCode.ACTION_NOT_FOUND,\n message: \"invoke requires an actionId\",\n })\n return\n }\n if (app.compatibility && app.compatibility.isCompatible === false) {\n this.sendResult(callerPackageName, requestId, false, undefined, {\n code: MiniappErrorCode.APP_NOT_COMPATIBLE,\n message: `${target} is not compatible with the connected glasses`,\n })\n islandNotifications.emit({\n kind: \"version_incompatible\",\n packageName: target,\n reason: `${target} is not compatible with the connected glasses`,\n metadata: {missingRequired: app.compatibility.missingRequired ?? [], via: \"miniapps.invoke\"},\n timestamp: Date.now(),\n })\n return\n }\n // Declared-action gate — only once the host populates app.actions (Phase 2);\n // until then app.actions is undefined and we fall through to NO_ACTION_HANDLER.\n if (!(app.actions ?? []).some((a) => a.id === actionId)) {\n this.sendResult(callerPackageName, requestId, false, undefined, {\n code: MiniappErrorCode.ACTION_NOT_FOUND,\n message: `${target} does not declare action \"${actionId}\"`,\n })\n return\n }\n\n // Headless wake + wait for CONNECT (idempotent / fast if already connected).\n try {\n await this.wakeInteropApp(target)\n } catch (e) {\n this.sendResult(callerPackageName, requestId, false, undefined, {\n code: MiniappErrorCode.WAKE_FAILED,\n message: (e as Error)?.message ?? `failed to wake ${target}`,\n })\n return\n }\n\n // The wake waited for CONNECT, but the target could have dropped in the gap\n // before delivery — fail fast rather than arming a timer for a call that\n // sendToMiniapp would silently drop (the caller would otherwise wait the\n // full invoke timeout for an ACTION_CALL that was never delivered).\n if (!this.connectedApps.has(target)) {\n this.sendResult(callerPackageName, requestId, false, undefined, {\n code: MiniappErrorCode.WAKE_FAILED,\n message: `${target} disconnected before the action could be delivered`,\n })\n this.auditInterop({\n caller: callerPackageName,\n op: \"invoke\",\n target,\n actionId,\n ok: false,\n errorCode: MiniappErrorCode.WAKE_FAILED,\n })\n return\n }\n\n // Deliver the call and arm the handler timeout; ACTION_RESULT resolves it.\n const callId = `act-${Date.now().toString(36)}-${this.actionCallSeq++}`\n const timer = BgTimer.setTimeout(() => {\n this.actionCalls.delete(callId)\n this.sendResult(callerPackageName, requestId, false, undefined, {\n code: MiniappErrorCode.ACTION_TIMEOUT,\n message: `action \"${actionId}\" timed out after ${timeoutMs}ms`,\n })\n }, timeoutMs)\n this.actionCalls.set(callId, {callerPackageName, targetPackageName: target, callerRequestId: requestId, timer})\n this.sendToMiniapp(target, {\n type: MiniappResponseType.ACTION_CALL,\n callId,\n actionId,\n params,\n callerPackageName,\n })\n this.auditInterop({caller: callerPackageName, op: \"invoke\", target, actionId, ok: true})\n }\n\n /** Target → host: forward an ACTION_RESULT back to the caller's pending invoke. */\n private handleActionResult(targetPackageName: string, payload: Record<string, unknown>): void {\n const callId = payload.callId as string | undefined\n if (!callId) return\n const pending = this.actionCalls.get(callId)\n if (!pending) return\n // Only the invoked target may resolve this call. callIds are guessable\n // (timestamp + seq), so a different connected miniapp must not be able to\n // spoof a result/error for someone else's invoke.\n if (pending.targetPackageName !== targetPackageName) return\n this.actionCalls.delete(callId)\n BgTimer.clearTimeout(pending.timer)\n\n if (payload.ok === true) {\n const result = payload.result\n if (this.actionPayloadTooLarge(result)) {\n this.sendResult(pending.callerPackageName, pending.callerRequestId, false, undefined, {\n code: MiniappErrorCode.PAYLOAD_TOO_LARGE,\n message: \"action result exceeded the 256 KB cap\",\n })\n return\n }\n this.sendResult(pending.callerPackageName, pending.callerRequestId, true, result ?? null)\n } else {\n const error = (payload.error as ({code: string; message: string} & Record<string, unknown>) | undefined) ?? {\n code: MiniappErrorCode.INTERNAL,\n message: \"action handler error\",\n }\n this.sendResult(pending.callerPackageName, pending.callerRequestId, false, undefined, error)\n }\n }\n\n private sendResult(\n packageName: string,\n requestId: string | undefined,\n ok: boolean,\n data?: unknown,\n error?: {code: string; message: string} & Record<string, unknown>,\n ): void {\n if (!requestId) return\n\n this.sendToMiniapp(\n packageName,\n {\n type: MiniappResponseType.REQUEST_RESULT,\n requestId,\n ok,\n ...(data !== undefined ? {data} : {}),\n ...(error ? {error} : {}),\n },\n requestId,\n )\n }\n\n /**\n * Send a VISIBILITY_CHANGE push to a miniapp.\n */\n public sendVisibilityChange(packageName: string, visibility: \"foreground\" | \"background\"): void {\n this.sendToMiniapp(packageName, {\n type: MiniappResponseType.VISIBILITY_CHANGE,\n visibility,\n })\n }\n\n /**\n * Fast foreground liveness check used when a local miniapp UI is opened or\n * resumed. The normal watchdog intentionally waits ~30s to avoid killing a\n * healthy-but-busy background script. When the user is actively looking at a\n * WebView, a stale JSContext reads as \"cloud offline\" / no captions, so probe\n * immediately and reuse the crash-respawn path if no message comes back.\n */\n public probeForegroundLiveness(\n packageName: string,\n reason = \"foreground-open\",\n timeoutMs = FOREGROUND_LIVENESS_PROBE_TIMEOUT_MS,\n ): void {\n const app = this.connectedApps.get(packageName)\n if (!app) return\n\n this.clearForegroundProbe(packageName)\n const probeStartedAt = Date.now()\n\n this.sendToMiniapp(packageName, {\n type: MiniappRequestType.PING,\n })\n\n const timerId = BgTimer.setTimeout(() => {\n this.foregroundProbeTimers.delete(packageName)\n const current = this.connectedApps.get(packageName)\n if (!current) return\n if (current.lastPongAt >= probeStartedAt) return\n\n console.warn(`${LOG_TAG}: ${packageName} failed foreground liveness probe (${reason}), respawning`)\n this.unregisterApp(packageName)\n this.onLivenessTimeout?.(packageName)\n }, timeoutMs)\n this.foregroundProbeTimers.set(packageName, timerId)\n }\n\n // ===========================================================================\n // Ping / pong liveness\n // ===========================================================================\n\n private ensurePingLoop(): void {\n if (this.pingIntervalId !== null) return\n\n this.pingIntervalId = BgTimer.setInterval(() => {\n this.doPingRound()\n }, PING_INTERVAL_MS)\n }\n\n private stopPingLoop(): void {\n if (this.pingIntervalId !== null) {\n BgTimer.clearInterval(this.pingIntervalId)\n this.pingIntervalId = null\n }\n }\n\n private doPingRound(): void {\n const toRemove: string[] = []\n\n for (const [packageName, app] of this.connectedApps) {\n const holdPingLiveness = shouldHoldMiniappPingLiveness({\n packageName,\n softapPackageName: this.softapAttempt?.packageName,\n softapCancelled: this.softapAttempt?.cancelled,\n })\n if (!holdPingLiveness) {\n const liveness = advanceMiniappPingLiveness(app.unansweredPingRounds, PING_TIMEOUT_THRESHOLD)\n if (liveness.shouldUnregister) {\n console.warn(`${LOG_TAG}: ${packageName} missed ${PING_TIMEOUT_THRESHOLD} pings, unregistering`)\n toRemove.push(packageName)\n continue\n }\n app.unansweredPingRounds = liveness.unansweredPingRounds\n }\n\n // Send PING — SDK auto-replies with PONG\n this.sendToMiniapp(packageName, {\n type: MiniappRequestType.PING,\n })\n }\n\n for (const pkg of toRemove) {\n this.unregisterApp(pkg)\n // Hand the package to the router's respawn machinery — a missed-pings\n // death is treated like a crash so the background script comes back.\n this.onLivenessTimeout?.(pkg)\n }\n }\n\n /**\n * Called when a PONG is received from a miniapp (or any message, really).\n * Updates lastPongAt to keep the app alive.\n */\n public handlePong(packageName: string): void {\n const app = this.connectedApps.get(packageName)\n if (app) {\n app.lastPongAt = Date.now()\n app.unansweredPingRounds = 0\n this.clearForegroundProbe(packageName)\n }\n }\n\n private clearForegroundProbe(packageName: string): void {\n const timerId = this.foregroundProbeTimers.get(packageName)\n if (timerId == null) return\n BgTimer.clearTimeout(timerId)\n this.foregroundProbeTimers.delete(packageName)\n }\n\n // ===========================================================================\n // Lifecycle\n // ===========================================================================\n\n public cleanup(): void {\n console.log(`${LOG_TAG}: cleanup()`)\n this.stopPingLoop()\n\n // Copy keys since unregisterApp mutates the map\n const packageNames = [...this.connectedApps.keys()]\n for (const pkg of packageNames) {\n this.unregisterApp(pkg)\n }\n\n // Belt-and-suspenders: clear any remaining state\n const hadButtonPressSubscribers = this.getButtonPressSubscribers().length > 0\n this.streamSubscribers.clear()\n if (hadButtonPressSubscribers) {\n for (const listener of this.buttonPressSubscriberListeners) {\n try {\n listener([])\n } catch (error) {\n console.warn(`${LOG_TAG}: button press subscriber listener threw during cleanup:`, error)\n }\n }\n }\n this.connectedApps.clear()\n for (const timerId of this.foregroundProbeTimers.values()) {\n BgTimer.clearTimeout(timerId)\n }\n this.foregroundProbeTimers.clear()\n\n LocalMiniappRuntime.instance = null\n }\n\n /**\n * Number of currently connected miniapps (for diagnostics).\n */\n public get connectedAppCount(): number {\n return this.connectedApps.size\n }\n}\n\nconst localMiniappRuntime = LocalMiniappRuntime.getInstance()\nexport default localMiniappRuntime\n"]}