@mentra/engine 3.2.0-dev.187 → 3.2.0-dev.191

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.
Files changed (34) hide show
  1. package/build/engine.d.ts.map +1 -1
  2. package/build/facades/dev.d.ts.map +1 -1
  3. package/build/facades/dev.js +30 -0
  4. package/build/facades/dev.js.map +1 -1
  5. package/build/generated/releaseMetadata.js +5 -5
  6. package/build/generated/releaseMetadata.js.map +1 -1
  7. package/build/runtime/bootstrap.d.ts +9 -0
  8. package/build/runtime/bootstrap.d.ts.map +1 -1
  9. package/build/runtime/bootstrap.js.map +1 -1
  10. package/build/services/CloudClientService.d.ts +1 -1
  11. package/build/services/CloudClientService.d.ts.map +1 -1
  12. package/build/services/CloudClientService.js +3 -17
  13. package/build/services/CloudClientService.js.map +1 -1
  14. package/build/services/cloudEndpointPolicy.d.ts +19 -0
  15. package/build/services/cloudEndpointPolicy.d.ts.map +1 -0
  16. package/build/services/cloudEndpointPolicy.js +20 -0
  17. package/build/services/cloudEndpointPolicy.js.map +1 -0
  18. package/build/services/otaManifestPolicy.js +1 -1
  19. package/build/services/otaManifestPolicy.js.map +1 -1
  20. package/build/services/otaManifestUrl.d.ts.map +1 -1
  21. package/build/services/otaManifestUrl.js +2 -1
  22. package/build/services/otaManifestUrl.js.map +1 -1
  23. package/build/stores/settings.d.ts.map +1 -1
  24. package/build/stores/settings.js +16 -5
  25. package/build/stores/settings.js.map +1 -1
  26. package/package.json +7 -7
  27. package/src/facades/dev.ts +32 -0
  28. package/src/generated/releaseMetadata.ts +5 -5
  29. package/src/runtime/bootstrap.ts +6 -0
  30. package/src/services/CloudClientService.ts +3 -15
  31. package/src/services/cloudEndpointPolicy.ts +25 -0
  32. package/src/services/otaManifestPolicy.ts +1 -1
  33. package/src/services/otaManifestUrl.ts +2 -1
  34. package/src/stores/settings.ts +15 -6
@@ -1 +1 @@
1
- {"version":3,"file":"CloudClientService.js","sourceRoot":"","sources":["../../src/services/CloudClientService.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Owns the singleton `@mentra/cloud-client` (CloudClient) for the engine runtime\n * — the keystone move that pulls backend comms INTO engine.\n *\n * engine constructs the client from engine-owned pieces (the native UDP socket,\n * the MMKV secure store, the cloud-status store) plus the two things the host\n * provides through the engine front door: `auth.getSubjectToken` (the one\n * permanent seam — the OEM owns login) and the resolved cloud endpoints\n * (`config.coreUrl/runtimeUrl`, computed host-side from dev/settings). On init it\n * exposes cloud runtime methods directly from this service, so the host no longer\n * injects a cloud adapter — engine owns construction and wiring.\n *\n * The local-miniapp path drives the cloud's transcription/translation through\n * this service.\n */\nimport {CloudClient, setNativeHttp, setNativeUdp, setSecureStorage} from \"@mentra/cloud-client/react-native\"\nimport {DEFAULT_REFRESH_TOKEN_KEY} from \"@mentra/cloud-client\"\nimport type {PreinstalledMiniappRegistry, RuntimeSnapshot} from \"@mentra/cloud-client/react-native\"\nimport type {SubjectTokenType} from \"@mentra/cloud-client\"\nimport {Platform} from \"react-native\"\nimport type {AudioSubscription, TranscriptionData, TranslationData} from \"@mentra/cloud-protocol\"\n\nimport BluetoothSdk from \"@mentra/bluetooth-sdk/internal\"\nimport CrustModule from \"@mentra/crust\"\nimport {getAuth, getConfigValues, isFeatureEnabled} from \"../runtime/bootstrap\"\nimport {useSettingsStore, SETTINGS} from \"../stores/settings\"\nimport {type CloudClientStatusSnapshot, type MiniappAuthToken} from \"../runtime/config\"\nimport {createCloudUdpSocket} from \"../utils/cloudClient/RnUdpAdapter\"\nimport {cloudSecureStore} from \"../utils/cloudClient/cloudSecureStore\"\nimport {storage as mmkvStorage} from \"../utils/storage\"\nimport {useCloudClientStatusStore} from \"../stores/cloudClientStatus\"\nimport {islandNotifications} from \"./NotificationsEmitter\"\nimport {BgTimer} from \"../utils/timers\"\nimport {logCloudV2TranscriptMetric} from \"./CloudTranscriptE2EMetrics\"\nimport {LocalMiniappUserIdentity} from \"./LocalMiniappUserIdentity\"\nimport {nativeHttpResponseBody} from \"./NativeHttpResponse\"\n\nconst LOG_TAG = \"cloudClient\"\ntype CloudCore = NonNullable<CloudClient[\"core\"]>\n\n// Persistent cloud-disconnect detector: the cloud-client reconnect loop is infinite\n// and never surfaces a \"giving up\" signal, so \"persistent failure\" = the session has\n// been continuously NOT connected for this long. A quick reconnect cancels it; brief\n// flaps that recover don't fire. Raised as engine.notifications(connection_failed_persistent).\nconst CLOUD_PERSISTENT_FAILURE_MS = 60_000\nconst LOCAL_MINIAPP_USER_ID_KEY = \"mentra.localMiniapp.userId\"\n\n/** Cancel the pending persistent-failure alarm + re-arm for the next outage. */\nfunction clearPersistentFailureAlarm(): void {\n if (persistentFailureTimer) {\n BgTimer.clearTimeout(persistentFailureTimer)\n persistentFailureTimer = null\n }\n persistentFailureNotified = false\n}\n\ntype Lc3FrameSizeBytes = 20 | 40 | 60\n\n// Neutral last-ditch fallbacks (reachable under `adb reverse`) for when the host\n// passes no endpoints. The host normally resolves the real URLs (dev override /\n// Metro host / env) and hands them in via `engine.configure({config})`.\nconst FALLBACK_CORE_URL = \"http://localhost:3000\"\nconst FALLBACK_RUNTIME_URL = \"http://localhost:3001\"\nconst LOCAL_AUTH_PORT = 3002\n\nlet client: CloudClient | null = null\nlet connected = false\nlet persistentFailureTimer: ReturnType<typeof BgTimer.setTimeout> | null = null\nlet persistentFailureNotified = false\nlet audioSubscriptions: AudioSubscription[] = []\nlet transportsReady = false\n/** Endpoints to build with — seeded from config, overridable via reconnect(). */\nlet endpointsOverride: {core?: string; runtime: string} | null = null\nlet runtimeStatusUnsubscribe: (() => void) | null = null\nlet transcriptUnsubscribe: (() => void) | null = null\nlet translationUnsubscribe: (() => void) | null = null\nlet authStateUnsubscribe: (() => void) | null = null\nlet localDevRuntimeToken: {runtimeUrl: string; token: string; expiresAtMs: number} | null = null\nlet lc3FrameSizeUnsubscribe: (() => void) | null = null\nlet coreTokenSyncPromise: Promise<string> | null = null\n\nconst localMiniappUserIdentity = new LocalMiniappUserIdentity({\n get(): string | null {\n const result = mmkvStorage.load<string>(LOCAL_MINIAPP_USER_ID_KEY)\n return result.is_ok() ? result.value : null\n },\n set(userId: string): void {\n const result = mmkvStorage.save(LOCAL_MINIAPP_USER_ID_KEY, userId)\n if (result.is_error()) throw result.error\n },\n remove(): void {\n const result = mmkvStorage.remove(LOCAL_MINIAPP_USER_ID_KEY)\n if (result.is_error()) throw result.error\n },\n})\n\nconst transcriptListeners = new Set<(d: TranscriptionData) => void>()\nconst translationListeners = new Set<(d: TranslationData) => void>()\nconst statusListeners = new Set<(snapshot: CloudClientStatusSnapshot) => void>()\nconst connectionListeners = new Set<(connected: boolean) => void>()\n\nfunction resolveEndpoints(): {core?: string; runtime: string} {\n if (endpointsOverride) return endpointsOverride\n const cfg = getConfigValues()\n const runtime = cfg.runtimeUrl === null ? \"\" : cfg.runtimeUrl?.trim() || FALLBACK_RUNTIME_URL\n if (!runtime) throw new Error(\"cloudClient: Runtime endpoint is not configured\")\n const core = cfg.coreUrl === null ? undefined : cfg.coreUrl?.trim() || FALLBACK_CORE_URL\n return {\n ...(core ? {core} : {}),\n runtime,\n }\n}\n\nfunction getCoreClient(): CloudCore {\n if (!client) construct()\n const core = client?.core\n if (!core) throw new Error(\"cloud client core not configured\")\n return core\n}\n\nfunction syncCoreAccessTokenToBluetooth(): Promise<string> {\n if (coreTokenSyncPromise) return coreTokenSyncPromise\n\n coreTokenSyncPromise = syncCoreAccessTokenToBluetoothInternal().finally(() => {\n coreTokenSyncPromise = null\n })\n return coreTokenSyncPromise\n}\n\nasync function syncCoreAccessTokenToBluetoothInternal(): Promise<string> {\n if (!client) construct()\n const c = client\n if (!c) throw new Error(\"cloud client not initialized\")\n\n const token = await c.auth.getCoreToken()\n if (c !== client) {\n throw new Error(\"cloud client changed while syncing core token\")\n }\n localMiniappUserIdentity.remember(c.auth.identity.mentraUserId)\n const result = await useSettingsStore.getState().setSetting(SETTINGS.core_token.key, token, false)\n if (result.is_error()) {\n throw result.error\n }\n\n try {\n await BluetoothSdk.updateBluetoothSettings({[SETTINGS.core_token.key]: token})\n } catch (err) {\n console.warn(`${LOG_TAG}: direct Bluetooth core_token sync failed: ${(err as Error)?.message ?? err}`)\n }\n\n return token\n}\n\nfunction frameSizeBytes(): Lc3FrameSizeBytes {\n // Read LIVE from the engine settings store (the source of truth) so a\n // reconnect after a glasses swap (G1=20 ↔ G2=40) picks up the new frame size,\n // not the one-time engine.configure({config}) snapshot. Falls back to the\n // config value (set at boot) then 20 when the setting is unset.\n const fromSettings = useSettingsStore.getState().getSetting(SETTINGS.lc3_frame_size.key)\n const size = fromSettings ?? getConfigValues().audioFrameSizeBytes\n return size === 20 || size === 40 || size === 60 ? size : 20\n}\n\nasync function getSubjectToken(): Promise<{token: string; type: SubjectTokenType}> {\n const a = getAuth()\n if (!a?.getSubjectToken) throw new Error(\"cloudClient: Core subject-token auth is not configured\")\n const r = await a.getSubjectToken()\n // IslandAuth's SubjectTokenType is intentionally open (`string & {}`) so OEMs\n // can use other token kinds; cloud-client's is a closed union. The host's\n // actual value (\"supabase\") is valid — narrow at this boundary.\n return {token: r.token, type: r.type as SubjectTokenType}\n}\n\nfunction normalizeExpiresAt(expiresAt: number): number {\n return expiresAt < 10_000_000_000 ? expiresAt * 1000 : expiresAt\n}\n\nfunction shouldUseLocalDevRuntimeToken(endpoints: {runtime: string}): boolean {\n if (!__DEV__) return false\n try {\n const host = new URL(endpoints.runtime).hostname\n return host === \"localhost\" || host === \"127.0.0.1\" || host === \"10.0.2.2\"\n } catch {\n return false\n }\n}\n\nasync function getLocalDevRuntimeToken(runtimeEndpoint: string, opts?: {forceRefresh?: boolean}): Promise<string> {\n const now = Date.now()\n if (\n !opts?.forceRefresh &&\n localDevRuntimeToken?.runtimeUrl === runtimeEndpoint &&\n localDevRuntimeToken.expiresAtMs - now > 60_000\n ) {\n return localDevRuntimeToken.token\n }\n\n const base = new URL(runtimeEndpoint)\n base.port = String(LOCAL_AUTH_PORT)\n base.pathname = \"/api/dev/runtime-token\"\n base.search = new URLSearchParams({userId: \"local-phone-user\", tenantId: \"mentra\"}).toString()\n\n const res = await fetch(base.toString())\n if (!res.ok) {\n throw new Error(`cloudClient: local dev runtime token failed (${res.status})`)\n }\n const body = (await res.json()) as {access_token?: string; expires_in?: number}\n if (!body.access_token) {\n throw new Error(\"cloudClient: local dev runtime token response missing access_token\")\n }\n localDevRuntimeToken = {\n runtimeUrl: runtimeEndpoint,\n token: body.access_token,\n expiresAtMs: now + (body.expires_in ?? 300) * 1000,\n }\n return body.access_token\n}\n\nfunction toCloudClientStatusSnapshot(snapshot: RuntimeSnapshot): CloudClientStatusSnapshot {\n return {status: snapshot.status, audioTransport: snapshot.audioTransport}\n}\n\nfunction currentRuntimeStatus(): CloudClientStatusSnapshot {\n const state = useCloudClientStatusStore.getState()\n return {status: state.status, audioTransport: state.audioTransport}\n}\n\nfunction setRuntimeStatus(snapshot: RuntimeSnapshot): void {\n useCloudClientStatusStore.getState().setSnapshot(snapshot)\n emitStatus(toCloudClientStatusSnapshot(snapshot))\n}\n\nfunction resetRuntimeStatus(): void {\n useCloudClientStatusStore.getState().reset()\n emitStatus(currentRuntimeStatus())\n}\n\nfunction stringifyMeta(meta: unknown): string {\n if (!meta || typeof meta !== \"object\") return \"\"\n try {\n return ` ${JSON.stringify(meta)}`\n } catch {\n return \"\"\n }\n}\n\nconst cloudLogger = {\n debug: (msg: string, meta?: unknown) => console.log(`${LOG_TAG}: debug: ${msg}${stringifyMeta(meta)}`),\n info: (msg: string, meta?: unknown) => console.log(`${LOG_TAG}: info: ${msg}${stringifyMeta(meta)}`),\n warn: (msg: string, meta?: unknown) => console.warn(`${LOG_TAG}: warn: ${msg}${stringifyMeta(meta)}`),\n error: (msg: string, meta?: unknown) => console.warn(`${LOG_TAG}: error: ${msg}${stringifyMeta(meta)}`),\n}\n\nfunction notifyConnectionListeners(next: boolean): void {\n for (const l of connectionListeners) {\n try {\n l(next)\n } catch (err) {\n console.warn(`${LOG_TAG}: connection listener threw: ${(err as Error)?.message ?? err}`)\n }\n }\n}\n\nfunction extractUnsubscribe(sub: unknown): (() => void) | null {\n const candidates: unknown[] = []\n const s = sub as Record<string, unknown> | null | undefined\n if (s && typeof s === \"object\") {\n candidates.push(s)\n candidates.push((s.value as Record<string, unknown>)?.subscription)\n candidates.push((s.data as Record<string, unknown>)?.subscription)\n candidates.push(s.subscription)\n }\n for (const c of candidates) {\n const unsub = (c as {unsubscribe?: unknown})?.unsubscribe\n if (typeof unsub === \"function\") return unsub as () => void\n }\n return null\n}\n\nfunction ensureAuthWatch(): void {\n if (authStateUnsubscribe) return\n authStateUnsubscribe = () => {}\n\n const auth = getAuth()\n if (!auth?.onStateChange) return\n\n let reconnectPending = false\n try {\n const sub = auth.onStateChange((event, session) => {\n if (event === \"SIGNED_OUT\") {\n localMiniappUserIdentity.forget()\n return\n }\n // A new sign-in may belong to a different account. Force the next\n // storage request to resolve and persist that account's Core identity.\n if (event === \"SIGNED_IN\") localMiniappUserIdentity.forget()\n if (!session?.token) return\n if (connected || reconnectPending) return\n\n reconnectPending = true\n console.log(`${LOG_TAG}: auth session available (${event}) while disconnected — reconnecting`)\n try {\n cloudClientService.reconnect()\n } finally {\n setTimeout(() => {\n reconnectPending = false\n }, 0)\n }\n })\n\n const unsub = extractUnsubscribe(sub)\n if (unsub) authStateUnsubscribe = unsub\n } catch (err) {\n console.warn(`${LOG_TAG}: auth watch subscribe failed: ${(err as Error)?.message ?? err}`)\n }\n}\n\nfunction stopAuthWatch(): void {\n authStateUnsubscribe?.()\n authStateUnsubscribe = null\n}\n\nfunction emitTranscript(data: TranscriptionData): void {\n for (const l of transcriptListeners) {\n try {\n l(data)\n } catch (err) {\n console.warn(`${LOG_TAG}: transcript listener threw: ${(err as Error)?.message ?? err}`)\n }\n }\n}\n\nfunction emitTranslation(data: TranslationData): void {\n for (const l of translationListeners) {\n try {\n l(data)\n } catch (err) {\n console.warn(`${LOG_TAG}: translation listener threw: ${(err as Error)?.message ?? err}`)\n }\n }\n}\n\nfunction emitStatus(snapshot: CloudClientStatusSnapshot): void {\n for (const l of statusListeners) {\n try {\n l(snapshot)\n } catch (err) {\n console.warn(`${LOG_TAG}: status listener threw: ${(err as Error)?.message ?? err}`)\n }\n }\n}\n\nfunction ensureTransports(): void {\n if (transportsReady) return\n transportsReady = true\n setNativeUdp(() => createCloudUdpSocket())\n setSecureStorage(cloudSecureStore)\n if (Platform.OS !== \"android\") return\n setNativeHttp(async (input, init) => {\n if (typeof input !== \"string\" || (init?.body != null && typeof init.body !== \"string\")) {\n return globalThis.fetch(input, init)\n }\n const headers = Object.fromEntries(new Headers(init?.headers).entries())\n const result = await CrustModule.nativeHttpRequest(\n init?.method ?? \"GET\",\n input,\n headers,\n (init?.body as string | undefined) ?? null,\n )\n return new Response(nativeHttpResponseBody(result.status, result.body), {\n status: result.status,\n statusText: result.statusText,\n headers: result.headers,\n })\n })\n}\n\nfunction clearRuntimeEventSubscriptions(): void {\n runtimeStatusUnsubscribe?.()\n runtimeStatusUnsubscribe = null\n transcriptUnsubscribe?.()\n transcriptUnsubscribe = null\n translationUnsubscribe?.()\n translationUnsubscribe = null\n}\n\nfunction startLc3FrameSizeWatcher(): void {\n if (lc3FrameSizeUnsubscribe) return\n\n let last = frameSizeBytes()\n lc3FrameSizeUnsubscribe = useSettingsStore.subscribe(\n (state) => state.getSetting(SETTINGS.lc3_frame_size.key),\n () => {\n const next = frameSizeBytes()\n if (next === last) return\n last = next\n if (!client) return\n console.log(`${LOG_TAG}: LC3 frame size changed to ${next}; reconnecting runtime`)\n cloudClientService.reconnect()\n },\n )\n}\n\nfunction stopLc3FrameSizeWatcher(): void {\n lc3FrameSizeUnsubscribe?.()\n lc3FrameSizeUnsubscribe = null\n}\n\nfunction construct(): void {\n ensureTransports()\n\n const endpoints = resolveEndpoints()\n console.log(`${LOG_TAG}: endpoints ${JSON.stringify(endpoints)}`)\n\n const configuredAuth = getAuth()\n if (!configuredAuth) throw new Error(\"cloudClient: engine.configure({auth}) not called\")\n const coreAuth = configuredAuth.getSubjectToken ? {getSubjectToken} : undefined\n const auth = configuredAuth.getRuntimeToken\n ? {\n ...(coreAuth && endpoints.core ? {core: coreAuth} : {}),\n runtime: {getToken: configuredAuth.getRuntimeToken},\n }\n : shouldUseLocalDevRuntimeToken(endpoints)\n ? {\n ...(coreAuth ? {core: coreAuth} : {}),\n runtime: {getToken: (opts?: {forceRefresh?: boolean}) => getLocalDevRuntimeToken(endpoints.runtime, opts)},\n }\n : coreAuth && endpoints.core\n ? {core: coreAuth, runtime: {source: \"core\" as const}}\n : null\n if (!auth) throw new Error(\"cloudClient: no Runtime authentication mode is configured\")\n\n client = new CloudClient({\n endpoints,\n // The phone LC3-encodes mic audio (even in phone/simulated mode); announce\n // LC3 at 16 kHz with the frame size the encoder emits.\n audio: {codec: \"lc3\", sampleRate: 16000, frameSizeBytes: frameSizeBytes()},\n auth,\n authStorageKey: getConfigValues().cloudAuthStorageKey,\n timers: {\n setTimeout: (callback, delayMs) => BgTimer.setTimeout(callback, delayMs),\n clearTimeout: (handle) => BgTimer.clearTimeout(handle as number),\n setInterval: (callback, intervalMs) => BgTimer.setInterval(callback, intervalMs),\n clearInterval: (handle) => BgTimer.clearInterval(handle as number),\n },\n logger: cloudLogger,\n })\n\n const c = client\n clearRuntimeEventSubscriptions()\n runtimeStatusUnsubscribe = c.runtime.onStatusChanged((status) => {\n if (c !== client) return\n setRuntimeStatus(status)\n })\n transcriptUnsubscribe = c.runtime.onTranscript((data) => {\n if (c !== client) return\n logCloudV2TranscriptMetric(data)\n emitTranscript(data)\n })\n translationUnsubscribe = c.runtime.onTranslation((data) => {\n if (c !== client) return\n emitTranslation(data)\n })\n setRuntimeStatus(c.runtime.getStatus())\n\n c.runtime.onConnected(() => {\n if (c !== client) return\n connected = true\n console.log(`${LOG_TAG}: runtime connected`)\n console.log(`${LOG_TAG}: debug: ws-session-debug connected`)\n // Cloud is up — cancel any pending persistent-failure alarm and re-arm for the\n // next outage.\n clearPersistentFailureAlarm()\n // Re-apply the authoritative subscription set, including the empty set, so\n // a fresh phone launch clears any stale server-side audio subscriptions.\n c.runtime\n .setSubscriptions(audioSubscriptions)\n .catch((err) =>\n console.warn(`${LOG_TAG}: re-applying queued subscriptions failed: ${(err as Error)?.message ?? err}`),\n )\n notifyConnectionListeners(true)\n })\n c.runtime.onDisconnected((info) => {\n if (c !== client) return\n connected = false\n console.log(`${LOG_TAG}: runtime disconnected (${info.reason})`)\n console.log(\n `${LOG_TAG}: debug: ws-session-debug disconnected reason=${\n info.reason\n } willStayDown=${/superseded by newer session/i.test(info.reason)}`,\n )\n // Arm the persistent-failure alarm once; if we're still down when it fires, raise\n // the notification. A reconnect within the window cancels it (onConnected above).\n if (!persistentFailureTimer && !persistentFailureNotified) {\n persistentFailureTimer = BgTimer.setTimeout(() => {\n persistentFailureTimer = null\n if (connected) return\n persistentFailureNotified = true\n islandNotifications.emit({\n kind: \"connection_failed_persistent\",\n reason: `Cloud session has been disconnected for over ${Math.round(CLOUD_PERSISTENT_FAILURE_MS / 1000)}s`,\n metadata: {downForMs: CLOUD_PERSISTENT_FAILURE_MS, lastReason: info.reason},\n timestamp: Date.now(),\n })\n }, CLOUD_PERSISTENT_FAILURE_MS)\n }\n notifyConnectionListeners(false)\n })\n c.runtime.onError((err) => {\n console.warn(`${LOG_TAG}: runtime error: ${err.code}`)\n })\n\n if (getConfigValues().runtimeRealtimeSession !== false) {\n // Best-effort connect. Do not crash the app if the dev cloud is unreachable.\n c.runtime\n .connect()\n .then(() => console.log(`${LOG_TAG}: connect() resolved`))\n .catch((err) => console.warn(`${LOG_TAG}: connect() failed: ${err?.message ?? err}`))\n startLc3FrameSizeWatcher()\n } else {\n console.log(`${LOG_TAG}: Runtime live session disabled; REST capabilities remain available`)\n }\n\n if (c.core) {\n syncCoreAccessTokenToBluetooth().catch((err) =>\n console.warn(`${LOG_TAG}: initial Bluetooth core_token sync failed: ${(err as Error)?.message ?? err}`),\n )\n }\n}\n\n/**\n * engine's cloud client. Owns the singleton CloudClient, its connection state,\n * and the runtime-hook wiring.\n */\nexport const cloudClientService = {\n async clearAuthSession(): Promise<void> {\n if (client) {\n await client.auth.clearSession()\n return\n }\n await cloudSecureStore.delete(getConfigValues().cloudAuthStorageKey ?? DEFAULT_REFRESH_TOKEN_KEY)\n },\n\n /**\n * Construct (once) + connect the client. Idempotent. Best-effort connect — a\n * failure is logged and the app keeps running. Requires\n * `engine.configure({auth, config})` first.\n */\n init(): void {\n if (client) return\n ensureAuthWatch()\n construct()\n },\n\n /**\n * Tear down + rebuild. Pass new endpoints to switch URLs; pass `null` to CLEAR\n * a prior override and fall back to the boot config (so cleared/default cloud\n * URLs don't keep reconnecting to a stale override); omit to keep the current.\n */\n reconnect(endpoints?: {core?: string; runtime: string} | null): void {\n if (endpoints !== undefined) endpointsOverride = endpoints\n try {\n client?.runtime.close()\n } catch (err) {\n console.warn(`${LOG_TAG}: reconnect close() failed: ${(err as Error)?.message ?? err}`)\n }\n clearRuntimeEventSubscriptions()\n clearPersistentFailureAlarm()\n\n const wasConnected = connected\n client = null\n localDevRuntimeToken = null\n connected = false\n resetRuntimeStatus()\n if (wasConnected) notifyConnectionListeners(false)\n\n construct()\n },\n\n async getPreinstalledMiniappRegistry(): Promise<PreinstalledMiniappRegistry> {\n if (!client) this.init()\n const c = client\n if (!c?.core) throw new Error(\"cloud client core is unavailable\")\n return c.core.miniapps.getRegistry()\n },\n\n /**\n * Resolve the stable Core-owned Mentra user id.\n *\n * Storage must use this identity rather than the short-lived Core access\n * token. A previously verified id is restored from MMKV so local miniapps\n * remain available after an offline process restart. On first sign-in,\n * callers join the auth module's single-flight exchange/refresh instead of\n * falling back to an anonymous namespace.\n */\n async resolveMentraUserId(): Promise<string> {\n return localMiniappUserIdentity.resolve(async () => {\n const hostIdentity = getAuth()?.getUserId\n if (hostIdentity) return await hostIdentity()\n if (!client) this.init()\n const c = client\n if (!c) throw new Error(\"cloud client not initialized\")\n\n await c.auth.getCoreToken()\n if (c !== client) throw new Error(\"cloud client changed while resolving user identity\")\n return c.auth.identity.mentraUserId\n })\n },\n\n /** Read the stable Mentra user id after async identity resolution. */\n getMentraUserId(): string {\n const userId = localMiniappUserIdentity.get()\n if (!userId) throw new Error(\"Mentra user identity is unavailable\")\n return userId\n },\n\n async getMiniappAuthToken(\n packageName: string,\n opts?: {minTtlMs?: number; devAttestation?: string},\n ): Promise<MiniappAuthToken> {\n if (!client) this.init()\n const c = client\n if (!c) throw new Error(\"cloud client not initialized\")\n\n const {token, expiresAt} = await c.auth.getMiniappToken(packageName, opts)\n const identity = c.auth.identity\n return {\n mentraUserId: identity.mentraUserId,\n tenantId: identity.tenantId,\n token,\n expiresAt: normalizeExpiresAt(expiresAt),\n }\n },\n\n /** Tear down the client + connection (the engine.stop() lifecycle). */\n stop(): void {\n try {\n client?.runtime.close()\n } catch (err) {\n console.warn(`${LOG_TAG}: stop close() failed: ${(err as Error)?.message ?? err}`)\n }\n stopLc3FrameSizeWatcher()\n stopAuthWatch()\n clearRuntimeEventSubscriptions()\n clearPersistentFailureAlarm()\n const wasConnected = connected\n client = null\n // stop() is part of the logout lifecycle and runs before the host emits\n // SIGNED_OUT. Remove the persisted namespace owner here so a later account\n // can never inherit it. A force-stop/process kill does not call stop(), so\n // the cached id still survives the offline cold-start case.\n localMiniappUserIdentity.forget()\n localDevRuntimeToken = null\n connected = false\n resetRuntimeStatus()\n if (wasConnected) notifyConnectionListeners(false)\n },\n\n /** Device-side managed photo (cloud-v2): presign now, deliver bytes, await ready. */\n startManagedPhoto(opts: Record<string, unknown> = {}) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.startManagedPhoto(opts)\n },\n awaitManagedPhotoReady(requestId: string) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.awaitManagedPhotoReady(requestId)\n },\n\n /** Managed stream (cloud-v2): provision ingest+playback on the runtime. */\n startManagedStream(opts: Record<string, unknown> = {}) {\n if (!isFeatureEnabled(\"managedStreams\")) throw new Error(\"managed streams are disabled by this deployment\")\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.startManagedStream(opts)\n },\n getManagedStreamStatus(streamId: string) {\n if (!isFeatureEnabled(\"managedStreams\")) throw new Error(\"managed streams are disabled by this deployment\")\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.getManagedStreamStatus(streamId)\n },\n stopManagedStream(streamId: string) {\n if (!isFeatureEnabled(\"managedStreams\")) throw new Error(\"managed streams are disabled by this deployment\")\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.stopManagedStream(streamId)\n },\n\n /** Current live-session connection state (handshake completed). */\n isConnected(): boolean {\n return connected\n },\n\n /** Subscribe to connection-state transitions. Returns an unsubscribe fn. */\n onConnectionChange(listener: (connected: boolean) => void): () => void {\n connectionListeners.add(listener)\n return () => {\n connectionListeners.delete(listener)\n }\n },\n\n /** Replace the v2 cloud's audio subscription set for the live session. */\n async setSubscriptions(subs: AudioSubscription[]): Promise<void> {\n // Cache unconditionally so the desired set survives a not-yet-connected\n // session and reconnects; the onConnected handler re-applies the cached set.\n audioSubscriptions = subs\n const c = client\n if (connected && c) {\n await c.runtime.setSubscriptions(subs)\n }\n },\n\n sendAudioFrame(frame: Uint8Array): void {\n client?.runtime.sendAudioFrame(frame)\n },\n\n onTranscript(cb: (d: TranscriptionData) => void): () => void {\n transcriptListeners.add(cb)\n return () => {\n transcriptListeners.delete(cb)\n }\n },\n\n onTranslation(cb: (d: TranslationData) => void): () => void {\n translationListeners.add(cb)\n return () => {\n translationListeners.delete(cb)\n }\n },\n\n getStatus(): CloudClientStatusSnapshot {\n return currentRuntimeStatus()\n },\n\n getCoreUrl(): string {\n const core = resolveEndpoints().core\n if (!core) throw new Error(\"cloud client core is unavailable\")\n return core\n },\n\n hasCore(): boolean {\n return Boolean(client?.core)\n },\n\n syncCoreTokenToBluetooth(): Promise<string> {\n return syncCoreAccessTokenToBluetooth()\n },\n\n onStatusChanged(cb: (snapshot: CloudClientStatusSnapshot) => void): () => void {\n statusListeners.add(cb)\n return () => {\n statusListeners.delete(cb)\n }\n },\n\n tts: {\n speak(text: string, options?: Parameters<CloudClient[\"runtime\"][\"tts\"][\"speak\"]>[1]) {\n if (!isFeatureEnabled(\"cloudSpeech\")) throw new Error(\"cloud speech is disabled by this deployment\")\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.tts.speak(text, options)\n },\n },\n\n maps: {\n directions(req: Parameters<CloudClient[\"runtime\"][\"maps\"][\"directions\"]>[0]) {\n if (!isFeatureEnabled(\"navigation\")) throw new Error(\"navigation is disabled by this deployment\")\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.maps.directions(req)\n },\n reverseGeocode(coord: Parameters<CloudClient[\"runtime\"][\"maps\"][\"reverseGeocode\"]>[0]) {\n if (!isFeatureEnabled(\"navigation\")) throw new Error(\"navigation is disabled by this deployment\")\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.maps.reverseGeocode(coord)\n },\n placeAutocomplete(req: Parameters<CloudClient[\"runtime\"][\"maps\"][\"placeAutocomplete\"]>[0]) {\n if (!isFeatureEnabled(\"navigation\")) throw new Error(\"navigation is disabled by this deployment\")\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.maps.placeAutocomplete(req)\n },\n placeDetails(req: Parameters<CloudClient[\"runtime\"][\"maps\"][\"placeDetails\"]>[0]) {\n if (!isFeatureEnabled(\"navigation\")) throw new Error(\"navigation is disabled by this deployment\")\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.maps.placeDetails(req)\n },\n },\n\n core: {\n reports: {\n submit(...args: Parameters<CloudCore[\"reports\"][\"submit\"]>) {\n return getCoreClient().reports.submit(...args)\n },\n addLogs(...args: Parameters<CloudCore[\"reports\"][\"addLogs\"]>) {\n return getCoreClient().reports.addLogs(...args)\n },\n addScreenshots(...args: Parameters<CloudCore[\"reports\"][\"addScreenshots\"]>) {\n return getCoreClient().reports.addScreenshots(...args)\n },\n complete(...args: Parameters<CloudCore[\"reports\"][\"complete\"]>) {\n return getCoreClient().reports.complete(...args)\n },\n },\n supportProfile: {\n update(...args: Parameters<CloudCore[\"supportProfile\"][\"update\"]>) {\n return getCoreClient().supportProfile.update(...args)\n },\n },\n },\n\n hasAudioSubscriptions(): boolean {\n return audioSubscriptions.length > 0\n },\n}\n"]}
1
+ {"version":3,"file":"CloudClientService.js","sourceRoot":"","sources":["../../src/services/CloudClientService.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Owns the singleton `@mentra/cloud-client` (CloudClient) for the engine runtime\n * — the keystone move that pulls backend comms INTO engine.\n *\n * engine constructs the client from engine-owned pieces (the native UDP socket,\n * the MMKV secure store, the cloud-status store) plus the two things the host\n * provides through the engine front door: `auth.getSubjectToken` (the one\n * permanent seam — the OEM owns login) and the resolved cloud endpoints\n * (`config.coreUrl/runtimeUrl`, computed host-side from dev/settings). On init it\n * exposes cloud runtime methods directly from this service, so the host no longer\n * injects a cloud adapter — engine owns construction and wiring.\n *\n * The local-miniapp path drives the cloud's transcription/translation through\n * this service.\n */\nimport {CloudClient, setNativeHttp, setNativeUdp, setSecureStorage} from \"@mentra/cloud-client/react-native\"\nimport {DEFAULT_REFRESH_TOKEN_KEY} from \"@mentra/cloud-client\"\nimport type {PreinstalledMiniappRegistry, RuntimeSnapshot} from \"@mentra/cloud-client/react-native\"\nimport type {SubjectTokenType} from \"@mentra/cloud-client\"\nimport {Platform} from \"react-native\"\nimport type {AudioSubscription, TranscriptionData, TranslationData} from \"@mentra/cloud-protocol\"\n\nimport BluetoothSdk from \"@mentra/bluetooth-sdk/internal\"\nimport CrustModule from \"@mentra/crust\"\nimport {getAuth, getConfigValues, isFeatureEnabled} from \"../runtime/bootstrap\"\nimport {useSettingsStore, SETTINGS} from \"../stores/settings\"\nimport {type CloudClientStatusSnapshot, type MiniappAuthToken} from \"../runtime/config\"\nimport {createCloudUdpSocket} from \"../utils/cloudClient/RnUdpAdapter\"\nimport {cloudSecureStore} from \"../utils/cloudClient/cloudSecureStore\"\nimport {storage as mmkvStorage} from \"../utils/storage\"\nimport {useCloudClientStatusStore} from \"../stores/cloudClientStatus\"\nimport {islandNotifications} from \"./NotificationsEmitter\"\nimport {BgTimer} from \"../utils/timers\"\nimport {logCloudV2TranscriptMetric} from \"./CloudTranscriptE2EMetrics\"\nimport {LocalMiniappUserIdentity} from \"./LocalMiniappUserIdentity\"\nimport {nativeHttpResponseBody} from \"./NativeHttpResponse\"\nimport {resolveCloudEndpoints} from \"./cloudEndpointPolicy\"\n\nconst LOG_TAG = \"cloudClient\"\ntype CloudCore = NonNullable<CloudClient[\"core\"]>\n\n// Persistent cloud-disconnect detector: the cloud-client reconnect loop is infinite\n// and never surfaces a \"giving up\" signal, so \"persistent failure\" = the session has\n// been continuously NOT connected for this long. A quick reconnect cancels it; brief\n// flaps that recover don't fire. Raised as engine.notifications(connection_failed_persistent).\nconst CLOUD_PERSISTENT_FAILURE_MS = 60_000\nconst LOCAL_MINIAPP_USER_ID_KEY = \"mentra.localMiniapp.userId\"\n\n/** Cancel the pending persistent-failure alarm + re-arm for the next outage. */\nfunction clearPersistentFailureAlarm(): void {\n if (persistentFailureTimer) {\n BgTimer.clearTimeout(persistentFailureTimer)\n persistentFailureTimer = null\n }\n persistentFailureNotified = false\n}\n\ntype Lc3FrameSizeBytes = 20 | 40 | 60\n\nconst LOCAL_AUTH_PORT = 3002\n\nlet client: CloudClient | null = null\nlet connected = false\nlet persistentFailureTimer: ReturnType<typeof BgTimer.setTimeout> | null = null\nlet persistentFailureNotified = false\nlet audioSubscriptions: AudioSubscription[] = []\nlet transportsReady = false\n/** Endpoints to build with — seeded from config, overridable via reconnect(). */\nlet endpointsOverride: {core?: string; runtime: string} | null = null\nlet runtimeStatusUnsubscribe: (() => void) | null = null\nlet transcriptUnsubscribe: (() => void) | null = null\nlet translationUnsubscribe: (() => void) | null = null\nlet authStateUnsubscribe: (() => void) | null = null\nlet localDevRuntimeToken: {runtimeUrl: string; token: string; expiresAtMs: number} | null = null\nlet lc3FrameSizeUnsubscribe: (() => void) | null = null\nlet coreTokenSyncPromise: Promise<string> | null = null\n\nconst localMiniappUserIdentity = new LocalMiniappUserIdentity({\n get(): string | null {\n const result = mmkvStorage.load<string>(LOCAL_MINIAPP_USER_ID_KEY)\n return result.is_ok() ? result.value : null\n },\n set(userId: string): void {\n const result = mmkvStorage.save(LOCAL_MINIAPP_USER_ID_KEY, userId)\n if (result.is_error()) throw result.error\n },\n remove(): void {\n const result = mmkvStorage.remove(LOCAL_MINIAPP_USER_ID_KEY)\n if (result.is_error()) throw result.error\n },\n})\n\nconst transcriptListeners = new Set<(d: TranscriptionData) => void>()\nconst translationListeners = new Set<(d: TranslationData) => void>()\nconst statusListeners = new Set<(snapshot: CloudClientStatusSnapshot) => void>()\nconst connectionListeners = new Set<(connected: boolean) => void>()\n\nfunction resolveEndpoints(): {core?: string; runtime: string} {\n return resolveCloudEndpoints(getConfigValues(), endpointsOverride)\n}\n\nfunction getCoreClient(): CloudCore {\n if (!client) construct()\n const core = client?.core\n if (!core) throw new Error(\"cloud client core not configured\")\n return core\n}\n\nfunction syncCoreAccessTokenToBluetooth(): Promise<string> {\n if (coreTokenSyncPromise) return coreTokenSyncPromise\n\n coreTokenSyncPromise = syncCoreAccessTokenToBluetoothInternal().finally(() => {\n coreTokenSyncPromise = null\n })\n return coreTokenSyncPromise\n}\n\nasync function syncCoreAccessTokenToBluetoothInternal(): Promise<string> {\n if (!client) construct()\n const c = client\n if (!c) throw new Error(\"cloud client not initialized\")\n\n const token = await c.auth.getCoreToken()\n if (c !== client) {\n throw new Error(\"cloud client changed while syncing core token\")\n }\n localMiniappUserIdentity.remember(c.auth.identity.mentraUserId)\n const result = await useSettingsStore.getState().setSetting(SETTINGS.core_token.key, token, false)\n if (result.is_error()) {\n throw result.error\n }\n\n try {\n await BluetoothSdk.updateBluetoothSettings({[SETTINGS.core_token.key]: token})\n } catch (err) {\n console.warn(`${LOG_TAG}: direct Bluetooth core_token sync failed: ${(err as Error)?.message ?? err}`)\n }\n\n return token\n}\n\nfunction frameSizeBytes(): Lc3FrameSizeBytes {\n // Read LIVE from the engine settings store (the source of truth) so a\n // reconnect after a glasses swap (G1=20 ↔ G2=40) picks up the new frame size,\n // not the one-time engine.configure({config}) snapshot. Falls back to the\n // config value (set at boot) then 20 when the setting is unset.\n const fromSettings = useSettingsStore.getState().getSetting(SETTINGS.lc3_frame_size.key)\n const size = fromSettings ?? getConfigValues().audioFrameSizeBytes\n return size === 20 || size === 40 || size === 60 ? size : 20\n}\n\nasync function getSubjectToken(): Promise<{token: string; type: SubjectTokenType}> {\n const a = getAuth()\n if (!a?.getSubjectToken) throw new Error(\"cloudClient: Core subject-token auth is not configured\")\n const r = await a.getSubjectToken()\n // IslandAuth's SubjectTokenType is intentionally open (`string & {}`) so OEMs\n // can use other token kinds; cloud-client's is a closed union. The host's\n // actual value (\"supabase\") is valid — narrow at this boundary.\n return {token: r.token, type: r.type as SubjectTokenType}\n}\n\nfunction normalizeExpiresAt(expiresAt: number): number {\n return expiresAt < 10_000_000_000 ? expiresAt * 1000 : expiresAt\n}\n\nfunction shouldUseLocalDevRuntimeToken(endpoints: {runtime: string}): boolean {\n if (!__DEV__) return false\n try {\n const host = new URL(endpoints.runtime).hostname\n return host === \"localhost\" || host === \"127.0.0.1\" || host === \"10.0.2.2\"\n } catch {\n return false\n }\n}\n\nasync function getLocalDevRuntimeToken(runtimeEndpoint: string, opts?: {forceRefresh?: boolean}): Promise<string> {\n const now = Date.now()\n if (\n !opts?.forceRefresh &&\n localDevRuntimeToken?.runtimeUrl === runtimeEndpoint &&\n localDevRuntimeToken.expiresAtMs - now > 60_000\n ) {\n return localDevRuntimeToken.token\n }\n\n const base = new URL(runtimeEndpoint)\n base.port = String(LOCAL_AUTH_PORT)\n base.pathname = \"/api/dev/runtime-token\"\n base.search = new URLSearchParams({userId: \"local-phone-user\", tenantId: \"mentra\"}).toString()\n\n const res = await fetch(base.toString())\n if (!res.ok) {\n throw new Error(`cloudClient: local dev runtime token failed (${res.status})`)\n }\n const body = (await res.json()) as {access_token?: string; expires_in?: number}\n if (!body.access_token) {\n throw new Error(\"cloudClient: local dev runtime token response missing access_token\")\n }\n localDevRuntimeToken = {\n runtimeUrl: runtimeEndpoint,\n token: body.access_token,\n expiresAtMs: now + (body.expires_in ?? 300) * 1000,\n }\n return body.access_token\n}\n\nfunction toCloudClientStatusSnapshot(snapshot: RuntimeSnapshot): CloudClientStatusSnapshot {\n return {status: snapshot.status, audioTransport: snapshot.audioTransport}\n}\n\nfunction currentRuntimeStatus(): CloudClientStatusSnapshot {\n const state = useCloudClientStatusStore.getState()\n return {status: state.status, audioTransport: state.audioTransport}\n}\n\nfunction setRuntimeStatus(snapshot: RuntimeSnapshot): void {\n useCloudClientStatusStore.getState().setSnapshot(snapshot)\n emitStatus(toCloudClientStatusSnapshot(snapshot))\n}\n\nfunction resetRuntimeStatus(): void {\n useCloudClientStatusStore.getState().reset()\n emitStatus(currentRuntimeStatus())\n}\n\nfunction stringifyMeta(meta: unknown): string {\n if (!meta || typeof meta !== \"object\") return \"\"\n try {\n return ` ${JSON.stringify(meta)}`\n } catch {\n return \"\"\n }\n}\n\nconst cloudLogger = {\n debug: (msg: string, meta?: unknown) => console.log(`${LOG_TAG}: debug: ${msg}${stringifyMeta(meta)}`),\n info: (msg: string, meta?: unknown) => console.log(`${LOG_TAG}: info: ${msg}${stringifyMeta(meta)}`),\n warn: (msg: string, meta?: unknown) => console.warn(`${LOG_TAG}: warn: ${msg}${stringifyMeta(meta)}`),\n error: (msg: string, meta?: unknown) => console.warn(`${LOG_TAG}: error: ${msg}${stringifyMeta(meta)}`),\n}\n\nfunction notifyConnectionListeners(next: boolean): void {\n for (const l of connectionListeners) {\n try {\n l(next)\n } catch (err) {\n console.warn(`${LOG_TAG}: connection listener threw: ${(err as Error)?.message ?? err}`)\n }\n }\n}\n\nfunction extractUnsubscribe(sub: unknown): (() => void) | null {\n const candidates: unknown[] = []\n const s = sub as Record<string, unknown> | null | undefined\n if (s && typeof s === \"object\") {\n candidates.push(s)\n candidates.push((s.value as Record<string, unknown>)?.subscription)\n candidates.push((s.data as Record<string, unknown>)?.subscription)\n candidates.push(s.subscription)\n }\n for (const c of candidates) {\n const unsub = (c as {unsubscribe?: unknown})?.unsubscribe\n if (typeof unsub === \"function\") return unsub as () => void\n }\n return null\n}\n\nfunction ensureAuthWatch(): void {\n if (authStateUnsubscribe) return\n authStateUnsubscribe = () => {}\n\n const auth = getAuth()\n if (!auth?.onStateChange) return\n\n let reconnectPending = false\n try {\n const sub = auth.onStateChange((event, session) => {\n if (event === \"SIGNED_OUT\") {\n localMiniappUserIdentity.forget()\n return\n }\n // A new sign-in may belong to a different account. Force the next\n // storage request to resolve and persist that account's Core identity.\n if (event === \"SIGNED_IN\") localMiniappUserIdentity.forget()\n if (!session?.token) return\n if (connected || reconnectPending) return\n\n reconnectPending = true\n console.log(`${LOG_TAG}: auth session available (${event}) while disconnected — reconnecting`)\n try {\n cloudClientService.reconnect()\n } finally {\n setTimeout(() => {\n reconnectPending = false\n }, 0)\n }\n })\n\n const unsub = extractUnsubscribe(sub)\n if (unsub) authStateUnsubscribe = unsub\n } catch (err) {\n console.warn(`${LOG_TAG}: auth watch subscribe failed: ${(err as Error)?.message ?? err}`)\n }\n}\n\nfunction stopAuthWatch(): void {\n authStateUnsubscribe?.()\n authStateUnsubscribe = null\n}\n\nfunction emitTranscript(data: TranscriptionData): void {\n for (const l of transcriptListeners) {\n try {\n l(data)\n } catch (err) {\n console.warn(`${LOG_TAG}: transcript listener threw: ${(err as Error)?.message ?? err}`)\n }\n }\n}\n\nfunction emitTranslation(data: TranslationData): void {\n for (const l of translationListeners) {\n try {\n l(data)\n } catch (err) {\n console.warn(`${LOG_TAG}: translation listener threw: ${(err as Error)?.message ?? err}`)\n }\n }\n}\n\nfunction emitStatus(snapshot: CloudClientStatusSnapshot): void {\n for (const l of statusListeners) {\n try {\n l(snapshot)\n } catch (err) {\n console.warn(`${LOG_TAG}: status listener threw: ${(err as Error)?.message ?? err}`)\n }\n }\n}\n\nfunction ensureTransports(): void {\n if (transportsReady) return\n transportsReady = true\n setNativeUdp(() => createCloudUdpSocket())\n setSecureStorage(cloudSecureStore)\n if (Platform.OS !== \"android\") return\n setNativeHttp(async (input, init) => {\n if (typeof input !== \"string\" || (init?.body != null && typeof init.body !== \"string\")) {\n return globalThis.fetch(input, init)\n }\n const headers = Object.fromEntries(new Headers(init?.headers).entries())\n const result = await CrustModule.nativeHttpRequest(\n init?.method ?? \"GET\",\n input,\n headers,\n (init?.body as string | undefined) ?? null,\n )\n return new Response(nativeHttpResponseBody(result.status, result.body), {\n status: result.status,\n statusText: result.statusText,\n headers: result.headers,\n })\n })\n}\n\nfunction clearRuntimeEventSubscriptions(): void {\n runtimeStatusUnsubscribe?.()\n runtimeStatusUnsubscribe = null\n transcriptUnsubscribe?.()\n transcriptUnsubscribe = null\n translationUnsubscribe?.()\n translationUnsubscribe = null\n}\n\nfunction startLc3FrameSizeWatcher(): void {\n if (lc3FrameSizeUnsubscribe) return\n\n let last = frameSizeBytes()\n lc3FrameSizeUnsubscribe = useSettingsStore.subscribe(\n (state) => state.getSetting(SETTINGS.lc3_frame_size.key),\n () => {\n const next = frameSizeBytes()\n if (next === last) return\n last = next\n if (!client) return\n console.log(`${LOG_TAG}: LC3 frame size changed to ${next}; reconnecting runtime`)\n cloudClientService.reconnect()\n },\n )\n}\n\nfunction stopLc3FrameSizeWatcher(): void {\n lc3FrameSizeUnsubscribe?.()\n lc3FrameSizeUnsubscribe = null\n}\n\nfunction construct(): void {\n ensureTransports()\n\n const endpoints = resolveEndpoints()\n console.log(`${LOG_TAG}: endpoints ${JSON.stringify(endpoints)}`)\n\n const configuredAuth = getAuth()\n if (!configuredAuth) throw new Error(\"cloudClient: engine.configure({auth}) not called\")\n const coreAuth = configuredAuth.getSubjectToken ? {getSubjectToken} : undefined\n const auth = configuredAuth.getRuntimeToken\n ? {\n ...(coreAuth && endpoints.core ? {core: coreAuth} : {}),\n runtime: {getToken: configuredAuth.getRuntimeToken},\n }\n : shouldUseLocalDevRuntimeToken(endpoints)\n ? {\n ...(coreAuth ? {core: coreAuth} : {}),\n runtime: {getToken: (opts?: {forceRefresh?: boolean}) => getLocalDevRuntimeToken(endpoints.runtime, opts)},\n }\n : coreAuth && endpoints.core\n ? {core: coreAuth, runtime: {source: \"core\" as const}}\n : null\n if (!auth) throw new Error(\"cloudClient: no Runtime authentication mode is configured\")\n\n client = new CloudClient({\n endpoints,\n // The phone LC3-encodes mic audio (even in phone/simulated mode); announce\n // LC3 at 16 kHz with the frame size the encoder emits.\n audio: {codec: \"lc3\", sampleRate: 16000, frameSizeBytes: frameSizeBytes()},\n auth,\n authStorageKey: getConfigValues().cloudAuthStorageKey,\n timers: {\n setTimeout: (callback, delayMs) => BgTimer.setTimeout(callback, delayMs),\n clearTimeout: (handle) => BgTimer.clearTimeout(handle as number),\n setInterval: (callback, intervalMs) => BgTimer.setInterval(callback, intervalMs),\n clearInterval: (handle) => BgTimer.clearInterval(handle as number),\n },\n logger: cloudLogger,\n })\n\n const c = client\n clearRuntimeEventSubscriptions()\n runtimeStatusUnsubscribe = c.runtime.onStatusChanged((status) => {\n if (c !== client) return\n setRuntimeStatus(status)\n })\n transcriptUnsubscribe = c.runtime.onTranscript((data) => {\n if (c !== client) return\n logCloudV2TranscriptMetric(data)\n emitTranscript(data)\n })\n translationUnsubscribe = c.runtime.onTranslation((data) => {\n if (c !== client) return\n emitTranslation(data)\n })\n setRuntimeStatus(c.runtime.getStatus())\n\n c.runtime.onConnected(() => {\n if (c !== client) return\n connected = true\n console.log(`${LOG_TAG}: runtime connected`)\n console.log(`${LOG_TAG}: debug: ws-session-debug connected`)\n // Cloud is up — cancel any pending persistent-failure alarm and re-arm for the\n // next outage.\n clearPersistentFailureAlarm()\n // Re-apply the authoritative subscription set, including the empty set, so\n // a fresh phone launch clears any stale server-side audio subscriptions.\n c.runtime\n .setSubscriptions(audioSubscriptions)\n .catch((err) =>\n console.warn(`${LOG_TAG}: re-applying queued subscriptions failed: ${(err as Error)?.message ?? err}`),\n )\n notifyConnectionListeners(true)\n })\n c.runtime.onDisconnected((info) => {\n if (c !== client) return\n connected = false\n console.log(`${LOG_TAG}: runtime disconnected (${info.reason})`)\n console.log(\n `${LOG_TAG}: debug: ws-session-debug disconnected reason=${\n info.reason\n } willStayDown=${/superseded by newer session/i.test(info.reason)}`,\n )\n // Arm the persistent-failure alarm once; if we're still down when it fires, raise\n // the notification. A reconnect within the window cancels it (onConnected above).\n if (!persistentFailureTimer && !persistentFailureNotified) {\n persistentFailureTimer = BgTimer.setTimeout(() => {\n persistentFailureTimer = null\n if (connected) return\n persistentFailureNotified = true\n islandNotifications.emit({\n kind: \"connection_failed_persistent\",\n reason: `Cloud session has been disconnected for over ${Math.round(CLOUD_PERSISTENT_FAILURE_MS / 1000)}s`,\n metadata: {downForMs: CLOUD_PERSISTENT_FAILURE_MS, lastReason: info.reason},\n timestamp: Date.now(),\n })\n }, CLOUD_PERSISTENT_FAILURE_MS)\n }\n notifyConnectionListeners(false)\n })\n c.runtime.onError((err) => {\n console.warn(`${LOG_TAG}: runtime error: ${err.code}`)\n })\n\n if (getConfigValues().runtimeRealtimeSession !== false) {\n // Best-effort connect. Do not crash the app if the dev cloud is unreachable.\n c.runtime\n .connect()\n .then(() => console.log(`${LOG_TAG}: connect() resolved`))\n .catch((err) => console.warn(`${LOG_TAG}: connect() failed: ${err?.message ?? err}`))\n startLc3FrameSizeWatcher()\n } else {\n console.log(`${LOG_TAG}: Runtime live session disabled; REST capabilities remain available`)\n }\n\n if (c.core) {\n syncCoreAccessTokenToBluetooth().catch((err) =>\n console.warn(`${LOG_TAG}: initial Bluetooth core_token sync failed: ${(err as Error)?.message ?? err}`),\n )\n }\n}\n\n/**\n * engine's cloud client. Owns the singleton CloudClient, its connection state,\n * and the runtime-hook wiring.\n */\nexport const cloudClientService = {\n async clearAuthSession(): Promise<void> {\n if (client) {\n await client.auth.clearSession()\n return\n }\n await cloudSecureStore.delete(getConfigValues().cloudAuthStorageKey ?? DEFAULT_REFRESH_TOKEN_KEY)\n },\n\n /**\n * Construct (once) + connect the client. Idempotent. Best-effort connect — a\n * failure is logged and the app keeps running. Requires\n * `engine.configure({auth, config})` first.\n */\n init(): void {\n if (client) return\n ensureAuthWatch()\n construct()\n },\n\n /**\n * Tear down + rebuild. Pass new endpoints to switch URLs; pass `null` to CLEAR\n * a prior override and resume the host resolver or boot config (so cleared/default cloud\n * URLs don't keep reconnecting to a stale override); omit to keep the current.\n */\n reconnect(endpoints?: {core?: string; runtime: string} | null): void {\n if (endpoints !== undefined) endpointsOverride = endpoints\n try {\n client?.runtime.close()\n } catch (err) {\n console.warn(`${LOG_TAG}: reconnect close() failed: ${(err as Error)?.message ?? err}`)\n }\n clearRuntimeEventSubscriptions()\n clearPersistentFailureAlarm()\n\n const wasConnected = connected\n client = null\n localDevRuntimeToken = null\n connected = false\n resetRuntimeStatus()\n if (wasConnected) notifyConnectionListeners(false)\n\n construct()\n },\n\n async getPreinstalledMiniappRegistry(): Promise<PreinstalledMiniappRegistry> {\n if (!client) this.init()\n const c = client\n if (!c?.core) throw new Error(\"cloud client core is unavailable\")\n return c.core.miniapps.getRegistry()\n },\n\n /**\n * Resolve the stable Core-owned Mentra user id.\n *\n * Storage must use this identity rather than the short-lived Core access\n * token. A previously verified id is restored from MMKV so local miniapps\n * remain available after an offline process restart. On first sign-in,\n * callers join the auth module's single-flight exchange/refresh instead of\n * falling back to an anonymous namespace.\n */\n async resolveMentraUserId(): Promise<string> {\n return localMiniappUserIdentity.resolve(async () => {\n const hostIdentity = getAuth()?.getUserId\n if (hostIdentity) return await hostIdentity()\n if (!client) this.init()\n const c = client\n if (!c) throw new Error(\"cloud client not initialized\")\n\n await c.auth.getCoreToken()\n if (c !== client) throw new Error(\"cloud client changed while resolving user identity\")\n return c.auth.identity.mentraUserId\n })\n },\n\n /** Read the stable Mentra user id after async identity resolution. */\n getMentraUserId(): string {\n const userId = localMiniappUserIdentity.get()\n if (!userId) throw new Error(\"Mentra user identity is unavailable\")\n return userId\n },\n\n async getMiniappAuthToken(\n packageName: string,\n opts?: {minTtlMs?: number; devAttestation?: string},\n ): Promise<MiniappAuthToken> {\n if (!client) this.init()\n const c = client\n if (!c) throw new Error(\"cloud client not initialized\")\n\n const {token, expiresAt} = await c.auth.getMiniappToken(packageName, opts)\n const identity = c.auth.identity\n return {\n mentraUserId: identity.mentraUserId,\n tenantId: identity.tenantId,\n token,\n expiresAt: normalizeExpiresAt(expiresAt),\n }\n },\n\n /** Tear down the client + connection (the engine.stop() lifecycle). */\n stop(): void {\n try {\n client?.runtime.close()\n } catch (err) {\n console.warn(`${LOG_TAG}: stop close() failed: ${(err as Error)?.message ?? err}`)\n }\n stopLc3FrameSizeWatcher()\n stopAuthWatch()\n clearRuntimeEventSubscriptions()\n clearPersistentFailureAlarm()\n const wasConnected = connected\n client = null\n // stop() is part of the logout lifecycle and runs before the host emits\n // SIGNED_OUT. Remove the persisted namespace owner here so a later account\n // can never inherit it. A force-stop/process kill does not call stop(), so\n // the cached id still survives the offline cold-start case.\n localMiniappUserIdentity.forget()\n localDevRuntimeToken = null\n connected = false\n resetRuntimeStatus()\n if (wasConnected) notifyConnectionListeners(false)\n },\n\n /** Device-side managed photo (cloud-v2): presign now, deliver bytes, await ready. */\n startManagedPhoto(opts: Record<string, unknown> = {}) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.startManagedPhoto(opts)\n },\n awaitManagedPhotoReady(requestId: string) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.awaitManagedPhotoReady(requestId)\n },\n\n /** Managed stream (cloud-v2): provision ingest+playback on the runtime. */\n startManagedStream(opts: Record<string, unknown> = {}) {\n if (!isFeatureEnabled(\"managedStreams\")) throw new Error(\"managed streams are disabled by this deployment\")\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.startManagedStream(opts)\n },\n getManagedStreamStatus(streamId: string) {\n if (!isFeatureEnabled(\"managedStreams\")) throw new Error(\"managed streams are disabled by this deployment\")\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.getManagedStreamStatus(streamId)\n },\n stopManagedStream(streamId: string) {\n if (!isFeatureEnabled(\"managedStreams\")) throw new Error(\"managed streams are disabled by this deployment\")\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.stopManagedStream(streamId)\n },\n\n /** Current live-session connection state (handshake completed). */\n isConnected(): boolean {\n return connected\n },\n\n /** Subscribe to connection-state transitions. Returns an unsubscribe fn. */\n onConnectionChange(listener: (connected: boolean) => void): () => void {\n connectionListeners.add(listener)\n return () => {\n connectionListeners.delete(listener)\n }\n },\n\n /** Replace the v2 cloud's audio subscription set for the live session. */\n async setSubscriptions(subs: AudioSubscription[]): Promise<void> {\n // Cache unconditionally so the desired set survives a not-yet-connected\n // session and reconnects; the onConnected handler re-applies the cached set.\n audioSubscriptions = subs\n const c = client\n if (connected && c) {\n await c.runtime.setSubscriptions(subs)\n }\n },\n\n sendAudioFrame(frame: Uint8Array): void {\n client?.runtime.sendAudioFrame(frame)\n },\n\n onTranscript(cb: (d: TranscriptionData) => void): () => void {\n transcriptListeners.add(cb)\n return () => {\n transcriptListeners.delete(cb)\n }\n },\n\n onTranslation(cb: (d: TranslationData) => void): () => void {\n translationListeners.add(cb)\n return () => {\n translationListeners.delete(cb)\n }\n },\n\n getStatus(): CloudClientStatusSnapshot {\n return currentRuntimeStatus()\n },\n\n getCoreUrl(): string {\n const core = resolveEndpoints().core\n if (!core) throw new Error(\"cloud client core is unavailable\")\n return core\n },\n\n hasCore(): boolean {\n return Boolean(client?.core)\n },\n\n syncCoreTokenToBluetooth(): Promise<string> {\n return syncCoreAccessTokenToBluetooth()\n },\n\n onStatusChanged(cb: (snapshot: CloudClientStatusSnapshot) => void): () => void {\n statusListeners.add(cb)\n return () => {\n statusListeners.delete(cb)\n }\n },\n\n tts: {\n speak(text: string, options?: Parameters<CloudClient[\"runtime\"][\"tts\"][\"speak\"]>[1]) {\n if (!isFeatureEnabled(\"cloudSpeech\")) throw new Error(\"cloud speech is disabled by this deployment\")\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.tts.speak(text, options)\n },\n },\n\n maps: {\n directions(req: Parameters<CloudClient[\"runtime\"][\"maps\"][\"directions\"]>[0]) {\n if (!isFeatureEnabled(\"navigation\")) throw new Error(\"navigation is disabled by this deployment\")\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.maps.directions(req)\n },\n reverseGeocode(coord: Parameters<CloudClient[\"runtime\"][\"maps\"][\"reverseGeocode\"]>[0]) {\n if (!isFeatureEnabled(\"navigation\")) throw new Error(\"navigation is disabled by this deployment\")\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.maps.reverseGeocode(coord)\n },\n placeAutocomplete(req: Parameters<CloudClient[\"runtime\"][\"maps\"][\"placeAutocomplete\"]>[0]) {\n if (!isFeatureEnabled(\"navigation\")) throw new Error(\"navigation is disabled by this deployment\")\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.maps.placeAutocomplete(req)\n },\n placeDetails(req: Parameters<CloudClient[\"runtime\"][\"maps\"][\"placeDetails\"]>[0]) {\n if (!isFeatureEnabled(\"navigation\")) throw new Error(\"navigation is disabled by this deployment\")\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.maps.placeDetails(req)\n },\n },\n\n core: {\n reports: {\n submit(...args: Parameters<CloudCore[\"reports\"][\"submit\"]>) {\n return getCoreClient().reports.submit(...args)\n },\n addLogs(...args: Parameters<CloudCore[\"reports\"][\"addLogs\"]>) {\n return getCoreClient().reports.addLogs(...args)\n },\n addScreenshots(...args: Parameters<CloudCore[\"reports\"][\"addScreenshots\"]>) {\n return getCoreClient().reports.addScreenshots(...args)\n },\n complete(...args: Parameters<CloudCore[\"reports\"][\"complete\"]>) {\n return getCoreClient().reports.complete(...args)\n },\n },\n supportProfile: {\n update(...args: Parameters<CloudCore[\"supportProfile\"][\"update\"]>) {\n return getCoreClient().supportProfile.update(...args)\n },\n },\n },\n\n hasAudioSubscriptions(): boolean {\n return audioSubscriptions.length > 0\n },\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import type { IslandConfigValues } from "../runtime/bootstrap";
2
+ export type CloudEndpoints = {
3
+ core?: string;
4
+ runtime: string;
5
+ };
6
+ /** Explicit reconnect pins win; clearing a pin resumes the live host resolver. */
7
+ export declare function resolveCloudEndpoints(config: IslandConfigValues, override: CloudEndpoints | null): CloudEndpoints;
8
+ export declare function scopeCloudUrlOverrides(current: {
9
+ scope: unknown;
10
+ core?: string;
11
+ runtime?: string;
12
+ }, scope: string, update: {
13
+ core?: string;
14
+ runtime?: string;
15
+ }): {
16
+ core: string;
17
+ runtime: string;
18
+ };
19
+ //# sourceMappingURL=cloudEndpointPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudEndpointPolicy.d.ts","sourceRoot":"","sources":["../../src/services/cloudEndpointPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAA;AAE5D,MAAM,MAAM,cAAc,GAAG;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,CAAA;AAE7D,kFAAkF;AAClF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,GAAG,cAAc,CAOjH;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAC,EAC1D,KAAK,EAAE,MAAM,EACb,MAAM,EAAE;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAC,GACxC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,CAMjC"}
@@ -0,0 +1,20 @@
1
+ /** Explicit reconnect pins win; clearing a pin resumes the live host resolver. */
2
+ export function resolveCloudEndpoints(config, override) {
3
+ if (override)
4
+ return override;
5
+ if (config.resolveCloudEndpoints)
6
+ return config.resolveCloudEndpoints();
7
+ const runtime = config.runtimeUrl === null ? "" : config.runtimeUrl?.trim() || "http://localhost:3001";
8
+ if (!runtime)
9
+ throw new Error("cloudClient: Runtime endpoint is not configured");
10
+ const core = config.coreUrl === null ? undefined : config.coreUrl?.trim() || "http://localhost:3000";
11
+ return { ...(core ? { core } : {}), runtime };
12
+ }
13
+ export function scopeCloudUrlOverrides(current, scope, update) {
14
+ const sameScope = current.scope === scope || (!current.scope && scope === "consumer");
15
+ return {
16
+ core: update.core ?? (sameScope ? (current.core ?? "") : ""),
17
+ runtime: update.runtime ?? (sameScope ? (current.runtime ?? "") : ""),
18
+ };
19
+ }
20
+ //# sourceMappingURL=cloudEndpointPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudEndpointPolicy.js","sourceRoot":"","sources":["../../src/services/cloudEndpointPolicy.ts"],"names":[],"mappings":"AAIA,kFAAkF;AAClF,MAAM,UAAU,qBAAqB,CAAC,MAA0B,EAAE,QAA+B;IAC/F,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAC7B,IAAI,MAAM,CAAC,qBAAqB;QAAE,OAAO,MAAM,CAAC,qBAAqB,EAAE,CAAA;IACvE,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,uBAAuB,CAAA;IACtG,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;IAChF,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,uBAAuB,CAAA;IACpG,OAAO,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC,IAAI,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAC,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,OAA0D,EAC1D,KAAa,EACb,MAAyC;IAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,KAAK,UAAU,CAAC,CAAA;IACrF,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACtE,CAAA;AACH,CAAC","sourcesContent":["import type {IslandConfigValues} from \"../runtime/bootstrap\"\n\nexport type CloudEndpoints = {core?: string; runtime: string}\n\n/** Explicit reconnect pins win; clearing a pin resumes the live host resolver. */\nexport function resolveCloudEndpoints(config: IslandConfigValues, override: CloudEndpoints | null): CloudEndpoints {\n if (override) return override\n if (config.resolveCloudEndpoints) return config.resolveCloudEndpoints()\n const runtime = config.runtimeUrl === null ? \"\" : config.runtimeUrl?.trim() || \"http://localhost:3001\"\n if (!runtime) throw new Error(\"cloudClient: Runtime endpoint is not configured\")\n const core = config.coreUrl === null ? undefined : config.coreUrl?.trim() || \"http://localhost:3000\"\n return {...(core ? {core} : {}), runtime}\n}\n\nexport function scopeCloudUrlOverrides(\n current: {scope: unknown; core?: string; runtime?: string},\n scope: string,\n update: {core?: string; runtime?: string},\n): {core: string; runtime: string} {\n const sameScope = current.scope === scope || (!current.scope && scope === \"consumer\")\n return {\n core: update.core ?? (sameScope ? (current.core ?? \"\") : \"\"),\n runtime: update.runtime ?? (sameScope ? (current.runtime ?? \"\") : \"\"),\n }\n}\n"]}
@@ -21,7 +21,7 @@ export function resolveDeploymentAwareOtaManifestPolicy({ hostPolicyConfigured,
21
21
  // explicit null is a deliberate OTA-off policy, not permission to inherit a
22
22
  // device-reported URL or Mentra's legacy public default.
23
23
  if (hostPolicyConfigured)
24
- return trimmed(policy.hostReleasePin);
24
+ return trimmed(policy.developerOverride) || trimmed(policy.hostReleasePin);
25
25
  return resolveOtaManifestPolicy(policy);
26
26
  }
27
27
  //# sourceMappingURL=otaManifestPolicy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"otaManifestPolicy.js","sourceRoot":"","sources":["../../src/services/otaManifestPolicy.ts"],"names":[],"mappings":"AAAA,MAAM,2BAA2B,GAAG,oDAAoD,CAAA;AAExF,SAAS,OAAO,CAAC,KAAqB;IACpC,MAAM,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,CAAA;IAC5B,OAAO,MAAM,IAAI,IAAI,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,kBAAkC;IACzE,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,kBAAkB,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;IACjE,OAAO,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,EAAE,CAAA;AACzD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,EACzC,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GAKjB;IACC,OAAO,OAAO,CAAC,iBAAiB,CAAC,IAAI,OAAO,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAA;AAC3F,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,EACvC,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GAOjB;IACC,IAAI,wBAAwB,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,2BAA2B,CAAA;IAC3D,CAAC;IACD,OAAO,0BAA0B,CAAC,EAAC,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAC,CAAC,CAAA;AAC1F,CAAC;AAED,MAAM,UAAU,uCAAuC,CAAC,EACtD,oBAAoB,EACpB,GAAG,MAAM,EACwE;IACjF,0EAA0E;IAC1E,4EAA4E;IAC5E,yDAAyD;IACzD,IAAI,oBAAoB;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;IAC/D,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAA;AACzC,CAAC","sourcesContent":["const OTA_VERSION_URL_LEGACY_PROD = \"https://ota.mentraglass.com/prod_live_version.json\"\n\nfunction trimmed(value?: string | null): string | null {\n const result = value?.trim()\n return result || null\n}\n\nexport function isLegacyAsgOtaStartBuild(glassesBuildNumber?: string | null): boolean {\n const buildNumber = Number.parseInt(glassesBuildNumber ?? \"\", 10)\n return Number.isFinite(buildNumber) && buildNumber < 39\n}\n\nexport function selectModernOtaManifestPin({\n developerOverride,\n hostReleasePin,\n engineReleasePin,\n}: {\n developerOverride?: string | null\n hostReleasePin?: string | null\n engineReleasePin?: string | null\n}): string | null {\n return trimmed(developerOverride) || trimmed(hostReleasePin) || trimmed(engineReleasePin)\n}\n\nexport function resolveOtaManifestPolicy({\n glassesUrl,\n glassesBuildNumber,\n developerOverride,\n hostReleasePin,\n engineReleasePin,\n}: {\n glassesUrl?: string | null\n glassesBuildNumber?: string | null\n developerOverride?: string | null\n hostReleasePin?: string | null\n engineReleasePin?: string | null\n}): string | null {\n if (isLegacyAsgOtaStartBuild(glassesBuildNumber)) {\n return trimmed(glassesUrl) || OTA_VERSION_URL_LEGACY_PROD\n }\n return selectModernOtaManifestPin({developerOverride, hostReleasePin, engineReleasePin})\n}\n\nexport function resolveDeploymentAwareOtaManifestPolicy({\n hostPolicyConfigured,\n ...policy\n}: Parameters<typeof resolveOtaManifestPolicy>[0] & {hostPolicyConfigured: boolean}): string | null {\n // A selected deployment is authoritative for every glasses generation. An\n // explicit null is a deliberate OTA-off policy, not permission to inherit a\n // device-reported URL or Mentra's legacy public default.\n if (hostPolicyConfigured) return trimmed(policy.hostReleasePin)\n return resolveOtaManifestPolicy(policy)\n}\n"]}
1
+ {"version":3,"file":"otaManifestPolicy.js","sourceRoot":"","sources":["../../src/services/otaManifestPolicy.ts"],"names":[],"mappings":"AAAA,MAAM,2BAA2B,GAAG,oDAAoD,CAAA;AAExF,SAAS,OAAO,CAAC,KAAqB;IACpC,MAAM,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,CAAA;IAC5B,OAAO,MAAM,IAAI,IAAI,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,kBAAkC;IACzE,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,kBAAkB,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;IACjE,OAAO,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,EAAE,CAAA;AACzD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,EACzC,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GAKjB;IACC,OAAO,OAAO,CAAC,iBAAiB,CAAC,IAAI,OAAO,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAA;AAC3F,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,EACvC,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GAOjB;IACC,IAAI,wBAAwB,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,2BAA2B,CAAA;IAC3D,CAAC;IACD,OAAO,0BAA0B,CAAC,EAAC,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAC,CAAC,CAAA;AAC1F,CAAC;AAED,MAAM,UAAU,uCAAuC,CAAC,EACtD,oBAAoB,EACpB,GAAG,MAAM,EACwE;IACjF,0EAA0E;IAC1E,4EAA4E;IAC5E,yDAAyD;IACzD,IAAI,oBAAoB;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;IACpG,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAA;AACzC,CAAC","sourcesContent":["const OTA_VERSION_URL_LEGACY_PROD = \"https://ota.mentraglass.com/prod_live_version.json\"\n\nfunction trimmed(value?: string | null): string | null {\n const result = value?.trim()\n return result || null\n}\n\nexport function isLegacyAsgOtaStartBuild(glassesBuildNumber?: string | null): boolean {\n const buildNumber = Number.parseInt(glassesBuildNumber ?? \"\", 10)\n return Number.isFinite(buildNumber) && buildNumber < 39\n}\n\nexport function selectModernOtaManifestPin({\n developerOverride,\n hostReleasePin,\n engineReleasePin,\n}: {\n developerOverride?: string | null\n hostReleasePin?: string | null\n engineReleasePin?: string | null\n}): string | null {\n return trimmed(developerOverride) || trimmed(hostReleasePin) || trimmed(engineReleasePin)\n}\n\nexport function resolveOtaManifestPolicy({\n glassesUrl,\n glassesBuildNumber,\n developerOverride,\n hostReleasePin,\n engineReleasePin,\n}: {\n glassesUrl?: string | null\n glassesBuildNumber?: string | null\n developerOverride?: string | null\n hostReleasePin?: string | null\n engineReleasePin?: string | null\n}): string | null {\n if (isLegacyAsgOtaStartBuild(glassesBuildNumber)) {\n return trimmed(glassesUrl) || OTA_VERSION_URL_LEGACY_PROD\n }\n return selectModernOtaManifestPin({developerOverride, hostReleasePin, engineReleasePin})\n}\n\nexport function resolveDeploymentAwareOtaManifestPolicy({\n hostPolicyConfigured,\n ...policy\n}: Parameters<typeof resolveOtaManifestPolicy>[0] & {hostPolicyConfigured: boolean}): string | null {\n // A selected deployment is authoritative for every glasses generation. An\n // explicit null is a deliberate OTA-off policy, not permission to inherit a\n // device-reported URL or Mentra's legacy public default.\n if (hostPolicyConfigured) return trimmed(policy.developerOverride) || trimmed(policy.hostReleasePin)\n return resolveOtaManifestPolicy(policy)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"otaManifestUrl.d.ts","sourceRoot":"","sources":["../../src/services/otaManifestUrl.ts"],"names":[],"mappings":"AAgCA,wBAAgB,iCAAiC,IAAI,OAAO,CAQ3D;AAED,wBAAgB,qBAAqB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CASnH"}
1
+ {"version":3,"file":"otaManifestUrl.d.ts","sourceRoot":"","sources":["../../src/services/otaManifestUrl.ts"],"names":[],"mappings":"AAiCA,wBAAgB,iCAAiC,IAAI,OAAO,CAQ3D;AAED,wBAAgB,qBAAqB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CASnH"}
@@ -20,7 +20,8 @@ function getHostReleasePin() {
20
20
  return value || null;
21
21
  }
22
22
  function hasDeploymentOtaPolicy() {
23
- return getConfigValues().otaManifestUrl !== undefined;
23
+ const config = getConfigValues();
24
+ return config.otaManifestUrl !== undefined && !config.allowLegacyOtaFallback;
24
25
  }
25
26
  function getEmbeddedEngineReleasePin() {
26
27
  const value = ENGINE_RELEASE_METADATA.otaManifestUrl?.trim();
@@ -1 +1 @@
1
- {"version":3,"file":"otaManifestUrl.js","sourceRoot":"","sources":["../../src/services/otaManifestUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,uBAAuB,EAAC,MAAM,8BAA8B,CAAA;AACpE,OAAO,EAAC,QAAQ,EAAE,gBAAgB,EAAC,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAC,uCAAuC,EAAE,0BAA0B,EAAC,MAAM,qBAAqB,CAAA;AACvG,OAAO,EAAC,eAAe,EAAC,MAAM,sBAAsB,CAAA;AAEpD,SAAS,2BAA2B;IAClC,sEAAsE;IACtE,4DAA4D;IAC5D,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrE,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;IAClF,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC7D,OAAO,OAAO,IAAI,IAAI,CAAA;AACxB,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,UAAU,GAAG,eAAe,EAAE,CAAC,cAAc,CAAA;IACnD,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,UAAU,EAAE,IAAI,EAAE,IAAI,IAAI,CAAA;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,IAAI,EAAE,CAAA;IACjE,OAAO,KAAK,IAAI,IAAI,CAAA;AACtB,CAAC;AAED,SAAS,sBAAsB;IAC7B,OAAO,eAAe,EAAE,CAAC,cAAc,KAAK,SAAS,CAAA;AACvD,CAAC;AAED,SAAS,2BAA2B;IAClC,MAAM,KAAK,GAAG,uBAAuB,CAAC,cAAc,EAAE,IAAI,EAAE,CAAA;IAC5D,OAAO,KAAK,IAAI,IAAI,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,iCAAiC;IAC/C,OAAO,OAAO,CACZ,0BAA0B,CAAC;QACzB,iBAAiB,EAAE,2BAA2B,EAAE;QAChD,cAAc,EAAE,iBAAiB,EAAE;QACnC,gBAAgB,EAAE,2BAA2B,EAAE;KAChD,CAAC,CACH,CAAA;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAA0B,EAAE,kBAAkC;IAClG,OAAO,uCAAuC,CAAC;QAC7C,oBAAoB,EAAE,sBAAsB,EAAE;QAC9C,UAAU;QACV,kBAAkB;QAClB,iBAAiB,EAAE,2BAA2B,EAAE;QAChD,cAAc,EAAE,iBAAiB,EAAE;QACnC,gBAAgB,EAAE,2BAA2B,EAAE;KAChD,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import {ENGINE_RELEASE_METADATA} from \"../generated/releaseMetadata\"\nimport {SETTINGS, useSettingsStore} from \"../stores/settings\"\nimport {resolveDeploymentAwareOtaManifestPolicy, selectModernOtaManifestPin} from \"./otaManifestPolicy\"\nimport {getConfigValues} from \"../runtime/bootstrap\"\n\nfunction getOtaVersionUrlDevOverride(): string | null {\n // Super mode only: a wrong OTA manifest can brick glasses, so a saved\n // override is inert unless super mode is currently enabled.\n if (!useSettingsStore.getState().getSetting(SETTINGS.super_mode.key)) {\n return null\n }\n const value = useSettingsStore.getState().getSetting(SETTINGS.ota_version_url.key)\n const trimmed = typeof value === \"string\" ? value.trim() : \"\"\n return trimmed || null\n}\n\nfunction getHostReleasePin(): string | null {\n const configured = getConfigValues().otaManifestUrl\n if (configured !== undefined) return configured?.trim() || null\n const value = process.env.EXPO_PUBLIC_ASG_OTA_VERSION_URL?.trim()\n return value || null\n}\n\nfunction hasDeploymentOtaPolicy(): boolean {\n return getConfigValues().otaManifestUrl !== undefined\n}\n\nfunction getEmbeddedEngineReleasePin(): string | null {\n const value = ENGINE_RELEASE_METADATA.otaManifestUrl?.trim()\n return value || null\n}\n\nexport function hasConfiguredModernOtaManifestPin(): boolean {\n return Boolean(\n selectModernOtaManifestPin({\n developerOverride: getOtaVersionUrlDevOverride(),\n hostReleasePin: getHostReleasePin(),\n engineReleasePin: getEmbeddedEngineReleasePin(),\n }),\n )\n}\n\nexport function resolveOtaManifestUrl(glassesUrl?: string | null, glassesBuildNumber?: string | null): string | null {\n return resolveDeploymentAwareOtaManifestPolicy({\n hostPolicyConfigured: hasDeploymentOtaPolicy(),\n glassesUrl,\n glassesBuildNumber,\n developerOverride: getOtaVersionUrlDevOverride(),\n hostReleasePin: getHostReleasePin(),\n engineReleasePin: getEmbeddedEngineReleasePin(),\n })\n}\n"]}
1
+ {"version":3,"file":"otaManifestUrl.js","sourceRoot":"","sources":["../../src/services/otaManifestUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,uBAAuB,EAAC,MAAM,8BAA8B,CAAA;AACpE,OAAO,EAAC,QAAQ,EAAE,gBAAgB,EAAC,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAC,uCAAuC,EAAE,0BAA0B,EAAC,MAAM,qBAAqB,CAAA;AACvG,OAAO,EAAC,eAAe,EAAC,MAAM,sBAAsB,CAAA;AAEpD,SAAS,2BAA2B;IAClC,sEAAsE;IACtE,4DAA4D;IAC5D,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrE,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;IAClF,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC7D,OAAO,OAAO,IAAI,IAAI,CAAA;AACxB,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,UAAU,GAAG,eAAe,EAAE,CAAC,cAAc,CAAA;IACnD,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,UAAU,EAAE,IAAI,EAAE,IAAI,IAAI,CAAA;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,IAAI,EAAE,CAAA;IACjE,OAAO,KAAK,IAAI,IAAI,CAAA;AACtB,CAAC;AAED,SAAS,sBAAsB;IAC7B,MAAM,MAAM,GAAG,eAAe,EAAE,CAAA;IAChC,OAAO,MAAM,CAAC,cAAc,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAA;AAC9E,CAAC;AAED,SAAS,2BAA2B;IAClC,MAAM,KAAK,GAAG,uBAAuB,CAAC,cAAc,EAAE,IAAI,EAAE,CAAA;IAC5D,OAAO,KAAK,IAAI,IAAI,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,iCAAiC;IAC/C,OAAO,OAAO,CACZ,0BAA0B,CAAC;QACzB,iBAAiB,EAAE,2BAA2B,EAAE;QAChD,cAAc,EAAE,iBAAiB,EAAE;QACnC,gBAAgB,EAAE,2BAA2B,EAAE;KAChD,CAAC,CACH,CAAA;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAA0B,EAAE,kBAAkC;IAClG,OAAO,uCAAuC,CAAC;QAC7C,oBAAoB,EAAE,sBAAsB,EAAE;QAC9C,UAAU;QACV,kBAAkB;QAClB,iBAAiB,EAAE,2BAA2B,EAAE;QAChD,cAAc,EAAE,iBAAiB,EAAE;QACnC,gBAAgB,EAAE,2BAA2B,EAAE;KAChD,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import {ENGINE_RELEASE_METADATA} from \"../generated/releaseMetadata\"\nimport {SETTINGS, useSettingsStore} from \"../stores/settings\"\nimport {resolveDeploymentAwareOtaManifestPolicy, selectModernOtaManifestPin} from \"./otaManifestPolicy\"\nimport {getConfigValues} from \"../runtime/bootstrap\"\n\nfunction getOtaVersionUrlDevOverride(): string | null {\n // Super mode only: a wrong OTA manifest can brick glasses, so a saved\n // override is inert unless super mode is currently enabled.\n if (!useSettingsStore.getState().getSetting(SETTINGS.super_mode.key)) {\n return null\n }\n const value = useSettingsStore.getState().getSetting(SETTINGS.ota_version_url.key)\n const trimmed = typeof value === \"string\" ? value.trim() : \"\"\n return trimmed || null\n}\n\nfunction getHostReleasePin(): string | null {\n const configured = getConfigValues().otaManifestUrl\n if (configured !== undefined) return configured?.trim() || null\n const value = process.env.EXPO_PUBLIC_ASG_OTA_VERSION_URL?.trim()\n return value || null\n}\n\nfunction hasDeploymentOtaPolicy(): boolean {\n const config = getConfigValues()\n return config.otaManifestUrl !== undefined && !config.allowLegacyOtaFallback\n}\n\nfunction getEmbeddedEngineReleasePin(): string | null {\n const value = ENGINE_RELEASE_METADATA.otaManifestUrl?.trim()\n return value || null\n}\n\nexport function hasConfiguredModernOtaManifestPin(): boolean {\n return Boolean(\n selectModernOtaManifestPin({\n developerOverride: getOtaVersionUrlDevOverride(),\n hostReleasePin: getHostReleasePin(),\n engineReleasePin: getEmbeddedEngineReleasePin(),\n }),\n )\n}\n\nexport function resolveOtaManifestUrl(glassesUrl?: string | null, glassesBuildNumber?: string | null): string | null {\n return resolveDeploymentAwareOtaManifestPolicy({\n hostPolicyConfigured: hasDeploymentOtaPolicy(),\n glassesUrl,\n glassesBuildNumber,\n developerOverride: getOtaVersionUrlDevOverride(),\n hostReleasePin: getHostReleasePin(),\n engineReleasePin: getEmbeddedEngineReleasePin(),\n })\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/stores/settings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,WAAW,EAAwB,MAAM,aAAa,CAAA;AAQ9D,OAAO,EAAC,wBAAwB,EAAE,gCAAgC,EAAC,MAAM,wBAAwB,CAAA;AAEjG,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,YAAY,EAAE,MAAM,GAAG,CAAA;IACvB,QAAQ,EAAE,OAAO,CAAA;IACjB,YAAY,EAAE,OAAO,CAAA;IAGrB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IAEjC,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAA;IAEpB,OAAO,EAAE,OAAO,CAAA;IAQhB,mBAAmB,CAAC,EAAE,IAAI,CAAA;IAC1B;;;;;;;;;;;;;;;OAeG;IACH,qBAAqB,CAAC,EAAE,IAAI,CAAA;CAC7B;AAED,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAyqBnC,CAAA;AAEV,eAAO,MAAM,eAAe,EAAE,MAAM,EAAqD,CAAA;AAIzF,eAAO,MAAM,sBAAsB,EAAE,MAAM,EAiD1C,CAAA;AAeD,eAAO,MAAM,qBAAqB,EAAE,MAAM,EAEV,CAAA;AAIhC,MAAM,WAAW,aAAa;IAE5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAE7B,aAAa,EAAE,OAAO,CAAA;IAEtB,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,OAAO,KAAK,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACzF,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IAC3E,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,GAAG,CAAA;IAEhC,eAAe,EAAE,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IAE/C,oBAAoB,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC/C,uBAAuB,EAAE,MAAM,IAAI,CAAA;CACpC;AAkBD,eAAO,MAAM,gBAAgB;;;;;;;;EA8V5B,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,CAAC,GAAG,GAAG,EAAE,KAAK,MAAM,KAAG,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAK3F,CAAA"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/stores/settings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,WAAW,EAAwB,MAAM,aAAa,CAAA;AAQ9D,OAAO,EAAC,wBAAwB,EAAE,gCAAgC,EAAC,MAAM,wBAAwB,CAAA;AAEjG,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,YAAY,EAAE,MAAM,GAAG,CAAA;IACvB,QAAQ,EAAE,OAAO,CAAA;IACjB,YAAY,EAAE,OAAO,CAAA;IAGrB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IAEjC,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAA;IAEpB,OAAO,EAAE,OAAO,CAAA;IAQhB,mBAAmB,CAAC,EAAE,IAAI,CAAA;IAC1B;;;;;;;;;;;;;;;OAeG;IACH,qBAAqB,CAAC,EAAE,IAAI,CAAA;CAC7B;AAED,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAirBnC,CAAA;AAEV,eAAO,MAAM,eAAe,EAAE,MAAM,EAAqD,CAAA;AAIzF,eAAO,MAAM,sBAAsB,EAAE,MAAM,EAiD1C,CAAA;AAeD,eAAO,MAAM,qBAAqB,EAAE,MAAM,EAEV,CAAA;AAIhC,MAAM,WAAW,aAAa;IAE5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAE7B,aAAa,EAAE,OAAO,CAAA;IAEtB,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,OAAO,KAAK,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACzF,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IAC3E,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,GAAG,CAAA;IAEhC,eAAe,EAAE,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IAE/C,oBAAoB,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC/C,uBAAuB,EAAE,MAAM,IAAI,CAAA;CACpC;AAkBD,eAAO,MAAM,gBAAgB;;;;;;;;EA+V5B,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,CAAC,GAAG,GAAG,EAAE,KAAK,MAAM,KAAG,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAK3F,CAAA"}
@@ -184,6 +184,14 @@ export const SETTINGS = {
184
184
  persist: true,
185
185
  resetOnBuildEnvChange: true,
186
186
  },
187
+ cloud_url_deployment: {
188
+ key: "cloud_url_deployment",
189
+ defaultValue: () => "",
190
+ writable: true,
191
+ saveOnServer: false,
192
+ persist: true,
193
+ resetOnBuildEnvChange: true,
194
+ },
187
195
  // Bookmarked Cloud V2 endpoint pairs. Each entry is {label, coreUrl,
188
196
  // runtimeUrl} — core + runtime are saved together because they are always
189
197
  // applied as a matched set (presets fill both; Save & Test verifies both).
@@ -846,11 +854,14 @@ export const useSettingsStore = create()(subscribeWithSelector((set, get) => ({
846
854
  settingsToLoad[key.toLowerCase()] = value;
847
855
  }
848
856
  // console.log("SETTINGS: SET MANY LOCALLY: ", settingsToLoad)
849
- set((state) => ({
850
- settings: { ...state.settings, ...settingsToLoad },
851
- }));
852
- // save to storage:
853
- await Promise.all(Object.entries(settingsToLoad).map(([key, value]) => storage.save(key, value)));
857
+ // MMKV writes are synchronous Results, not rejecting Promises. Check
858
+ // each result before publishing the new in-memory settings.
859
+ for (const [key, value] of Object.entries(settingsToLoad)) {
860
+ const saved = storage.save(key, value);
861
+ if (saved.is_error())
862
+ throw saved.error;
863
+ }
864
+ set((state) => ({ settings: { ...state.settings, ...settingsToLoad } }));
854
865
  });
855
866
  },
856
867
  // loads any preferences that have been changed from the default and saved to DISK!