@mentra/engine 3.2.0-dev.136 → 3.2.0-dev.153

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 (92) hide show
  1. package/build/engine.d.ts.map +1 -1
  2. package/build/engine.js +15 -9
  3. package/build/engine.js.map +1 -1
  4. package/build/facades/ota.d.ts +1 -0
  5. package/build/facades/ota.d.ts.map +1 -1
  6. package/build/facades/ota.js +1 -0
  7. package/build/facades/ota.js.map +1 -1
  8. package/build/facades/reports.d.ts.map +1 -1
  9. package/build/facades/reports.js +3 -0
  10. package/build/facades/reports.js.map +1 -1
  11. package/build/generated/releaseMetadata.js +5 -5
  12. package/build/generated/releaseMetadata.js.map +1 -1
  13. package/build/index.d.ts +1 -1
  14. package/build/index.d.ts.map +1 -1
  15. package/build/index.js.map +1 -1
  16. package/build/react/MentraLiveOtaFlow.d.ts.map +1 -1
  17. package/build/react/MentraLiveOtaFlow.js +12 -0
  18. package/build/react/MentraLiveOtaFlow.js.map +1 -1
  19. package/build/react/useMentraLiveOta.d.ts +3 -1
  20. package/build/react/useMentraLiveOta.d.ts.map +1 -1
  21. package/build/react/useMentraLiveOta.js +19 -1
  22. package/build/react/useMentraLiveOta.js.map +1 -1
  23. package/build/runtime/bootstrap.d.ts +46 -3
  24. package/build/runtime/bootstrap.d.ts.map +1 -1
  25. package/build/runtime/bootstrap.js +60 -1
  26. package/build/runtime/bootstrap.js.map +1 -1
  27. package/build/runtime/config.d.ts +4 -0
  28. package/build/runtime/config.d.ts.map +1 -1
  29. package/build/runtime/config.js.map +1 -1
  30. package/build/runtime/streamConfig.d.ts.map +1 -1
  31. package/build/runtime/streamConfig.js +6 -0
  32. package/build/runtime/streamConfig.js.map +1 -1
  33. package/build/services/AppRegistry.d.ts +15 -1
  34. package/build/services/AppRegistry.d.ts.map +1 -1
  35. package/build/services/AppRegistry.js +48 -12
  36. package/build/services/AppRegistry.js.map +1 -1
  37. package/build/services/CloudClientService.d.ts +3 -1
  38. package/build/services/CloudClientService.d.ts.map +1 -1
  39. package/build/services/CloudClientService.js +75 -18
  40. package/build/services/CloudClientService.js.map +1 -1
  41. package/build/services/LocalMiniappRuntime.d.ts.map +1 -1
  42. package/build/services/LocalMiniappRuntime.js +54 -12
  43. package/build/services/LocalMiniappRuntime.js.map +1 -1
  44. package/build/services/MiniappLauncher.d.ts.map +1 -1
  45. package/build/services/MiniappLauncher.js +9 -1
  46. package/build/services/MiniappLauncher.js.map +1 -1
  47. package/build/services/NavigationHandlers.d.ts.map +1 -1
  48. package/build/services/NavigationHandlers.js +8 -0
  49. package/build/services/NavigationHandlers.js.map +1 -1
  50. package/build/services/OtaUpdateCheckService.d.ts +10 -1
  51. package/build/services/OtaUpdateCheckService.d.ts.map +1 -1
  52. package/build/services/OtaUpdateCheckService.js +24 -5
  53. package/build/services/OtaUpdateCheckService.js.map +1 -1
  54. package/build/services/miniappInstallIdentity.d.ts +10 -0
  55. package/build/services/miniappInstallIdentity.d.ts.map +1 -0
  56. package/build/services/miniappInstallIdentity.js +10 -0
  57. package/build/services/miniappInstallIdentity.js.map +1 -0
  58. package/build/services/otaManifestPolicy.d.ts +3 -0
  59. package/build/services/otaManifestPolicy.d.ts.map +1 -1
  60. package/build/services/otaManifestPolicy.js +8 -0
  61. package/build/services/otaManifestPolicy.js.map +1 -1
  62. package/build/services/otaManifestUrl.d.ts.map +1 -1
  63. package/build/services/otaManifestUrl.js +10 -2
  64. package/build/services/otaManifestUrl.js.map +1 -1
  65. package/build/stores/glasses.d.ts.map +1 -1
  66. package/build/stores/glasses.js +6 -0
  67. package/build/stores/glasses.js.map +1 -1
  68. package/build/stores/settings.d.ts.map +1 -1
  69. package/build/stores/settings.js +20 -3
  70. package/build/stores/settings.js.map +1 -1
  71. package/package.json +7 -7
  72. package/src/engine.ts +22 -12
  73. package/src/facades/ota.ts +1 -0
  74. package/src/facades/reports.ts +4 -6
  75. package/src/generated/releaseMetadata.ts +5 -5
  76. package/src/index.ts +2 -0
  77. package/src/react/MentraLiveOtaFlow.tsx +21 -0
  78. package/src/react/useMentraLiveOta.ts +23 -2
  79. package/src/runtime/bootstrap.ts +117 -4
  80. package/src/runtime/config.ts +4 -0
  81. package/src/runtime/streamConfig.ts +4 -0
  82. package/src/services/AppRegistry.ts +94 -25
  83. package/src/services/CloudClientService.ts +70 -24
  84. package/src/services/LocalMiniappRuntime.ts +85 -26
  85. package/src/services/MiniappLauncher.ts +15 -1
  86. package/src/services/NavigationHandlers.ts +8 -0
  87. package/src/services/OtaUpdateCheckService.ts +32 -6
  88. package/src/services/miniappInstallIdentity.ts +18 -0
  89. package/src/services/otaManifestPolicy.ts +11 -0
  90. package/src/services/otaManifestUrl.ts +10 -2
  91. package/src/stores/glasses.ts +6 -0
  92. package/src/stores/settings.ts +20 -3
@@ -1 +1 @@
1
- {"version":3,"file":"useMentraLiveOta.js","sourceRoot":"","sources":["../../src/react/useMentraLiveOta.ts"],"names":[],"mappings":"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","sourcesContent":["import {useCallback, useEffect, useMemo, useRef, useState} from \"react\"\n\nimport {ota} from \"../facades/ota\"\nimport {\n beginOtaAutoChain,\n clearOtaAutoChainReconnectWait,\n isOtaAutoChainActive,\n otaAutoChainFingerprint,\n otaAutoChainReleaseRange,\n otaAutoChainReconnectWaitRemaining,\n stopOtaAutoChain,\n tryAdvanceOtaAutoChain,\n type OtaAutoChainReleaseRange,\n} from \"../services/OtaAutoChain\"\nimport {\n BES_INSTALL_RESTART_MESSAGE,\n getOtaErrorMessage,\n shouldRequireGlassesRebootForBesFailure,\n shouldShowChangeWifiForOtaDownloadFailure,\n} from \"../services/OtaErrorMapping\"\nimport type {OtaInstallSnapshot} from \"../services/OtaInstallCoordinator\"\nimport type {OtaCheckCurrentGlassesResult} from \"../services/OtaUpdateCheckService\"\nimport type {ReleaseChangelog} from \"../facades/ota\"\nimport {useEngineSnapshot} from \"./useEngineSnapshot\"\n\nexport type MentraLiveOtaFlowPage = \"check\" | \"progress\"\n\nexport type MentraLiveOtaScreen =\n | \"initializing\"\n | \"checking\"\n | \"finishing\"\n | \"update_available\"\n | \"battery_required\"\n | \"wifi_required\"\n | \"up_to_date\"\n | \"dev_build\"\n | \"check_failed\"\n | \"update_info_unavailable\"\n | \"starting\"\n | \"preparing_hotspot\"\n | \"updating\"\n | \"restarting\"\n | \"verifying\"\n | \"complete\"\n | \"failed\"\n | \"disconnected\"\n\nexport type MentraLiveOtaErrorCode =\n | \"check_failed\"\n | \"update_info_unavailable\"\n | \"install_failed\"\n | \"bes_restart_required\"\n\nexport type MentraLiveOtaError = {\n code: MentraLiveOtaErrorCode\n message: string\n}\n\nexport type MentraLiveOtaTransport = \"wifi\" | \"hotspot\"\nexport type MentraLiveOtaHotspotPhase = \"idle\" | \"downloading\" | \"starting_hotspot\" | \"joining_hotspot\" | \"serving\"\nexport type MentraLiveOtaInstallPhase = \"download\" | \"install\"\nexport type MentraLiveOtaStep = \"apk\" | \"mtk\" | \"bes\"\n\nexport type MentraLiveOtaReleaseTransition = {\n /** Current glasses software label. Temporarily backed by the reported ASG app version. */\n fromVersion: string | null\n /** Exact coordinated release identity for the selected OTA pin. */\n toVersion: string\n}\n\nexport type MentraLiveOtaState = {\n screen: MentraLiveOtaScreen\n connected: boolean\n batteryLevel: number | null\n transport: MentraLiveOtaTransport | null\n updateRequired: boolean\n versionChange: boolean\n versionChangeConverged: boolean\n versionChangePhase: \"installing\" | \"restarting\" | \"verifying\" | null\n wifiConnected: boolean\n wifiStatusKnown: boolean\n hotspotSupported: boolean\n hotspotPhase: MentraLiveOtaHotspotPhase\n hotspotArtifactPercent: number | null\n phase: MentraLiveOtaInstallPhase | null\n step: MentraLiveOtaStep | null\n currentStep: number | null\n totalSteps: number | null\n progress: number | null\n installingApkOnly: boolean\n firmwareRestarting: boolean\n error: MentraLiveOtaError | null\n canInstall: boolean\n canRetry: boolean\n canFinish: boolean\n canDismiss: boolean\n canDiscard: boolean\n canOpenWifiSetup: boolean\n continueDisabled: boolean\n /** True only after an approved update session reaches a final no-update check. */\n completedUpdate: boolean\n /** Release labels for the offered or just-completed coordinated update. */\n releaseTransition: MentraLiveOtaReleaseTransition | null\n /** Release notes crossed by this update, newest first. Populated on completion. */\n changelogs: ReleaseChangelog[]\n}\n\nexport type UseMentraLiveOtaOptions = {\n /** Entry page. `progress` exists for interrupted-session recovery. */\n initialPage?: MentraLiveOtaFlowPage\n /** Start Engine's OTA-only projections. Full Engine hosts should pass false. */\n initializeRuntime?: boolean\n /** Called after the final check or when an optional update is dismissed. */\n onFinished?: () => void\n /** Host-owned Wi-Fi setup for glasses without hotspot OTA support. */\n onOpenWifiSetup?: () => void\n /** Lets a host coordinate its connection overlay with OTA firmware restarts. */\n onFirmwareRestartingChange?: (restarting: boolean, progressActive: boolean) => void\n}\n\nexport type MentraLiveOtaController = {\n state: MentraLiveOtaState\n check: () => void\n retryCheck: () => void\n install: () => void\n retryInstall: () => void\n finish: () => void\n discard: () => void\n openWifiSetup: () => void\n}\n\ntype CheckState = \"checking\" | \"update_available\" | \"no_update\" | \"dev_build\" | \"error\"\n\nconst AUTO_CHAIN_NETWORK_RETRY_DELAY_MS = 5000\nconst AUTO_CHAIN_COMPLETE_DELAY_MS = 750\nexport const MINIMUM_OTA_BATTERY_LEVEL = 25\n\nfunction releaseRangeTargetVersion(result: OtaCheckCurrentGlassesResult): string | null {\n return result.releaseVersion ?? result.updateInfo?.versionName ?? result.latestVersionInfo?.versionName ?? null\n}\n\nfunction currentReleaseVersion(appVersion: string | null): string | null {\n const version = appVersion?.trim()\n return version || null\n}\n\nfunction releaseTransitionFromRange(range: OtaAutoChainReleaseRange | null): MentraLiveOtaReleaseTransition | null {\n if (!range?.releaseVersion) return null\n return {fromVersion: range.fromVersion, toVersion: range.releaseVersion}\n}\n\nfunction releaseChangelogsForActiveChain(): ReleaseChangelog[] {\n const range = otaAutoChainReleaseRange()\n if (!range?.toVersion) return []\n try {\n return ota.getReleaseChangelogs(range.fromVersion, range.toVersion)\n } catch {\n try {\n return ota.getReleaseChangelogs(null, range.toVersion)\n } catch {\n return []\n }\n }\n}\n\nfunction installProgress(snapshot: OtaInstallSnapshot): number | null {\n if (snapshot.displayState !== \"updating\") return null\n const {otaStatus} = snapshot\n const isDownload = otaStatus?.phase === \"download\"\n const totalSteps = otaStatus?.totalSteps ?? 1\n const rawPercent = isDownload\n ? (otaStatus?.stepPercent ?? 0)\n : totalSteps >= 2\n ? (otaStatus?.overallPercent ?? 0)\n : (otaStatus?.stepPercent ?? 0)\n return Math.min(Math.max(rawPercent, snapshot.mtkInstallStallSimulatedPercent ?? 0, 0), 100)\n}\n\nfunction progressScreen(snapshot: OtaInstallSnapshot): MentraLiveOtaScreen {\n if (snapshot.versionChangePhase === \"restarting\") return \"restarting\"\n if (snapshot.versionChangePhase === \"verifying\") return \"verifying\"\n switch (snapshot.displayState) {\n case \"starting\":\n return snapshot.hotspotPhase === \"idle\" || snapshot.hotspotPhase === \"serving\" ? \"starting\" : \"preparing_hotspot\"\n case \"updating\":\n return \"updating\"\n case \"restarting\":\n return \"restarting\"\n case \"complete\":\n return \"complete\"\n case \"failed\":\n return \"failed\"\n default:\n return \"disconnected\"\n }\n}\n\n/**\n * Headless Mentra Live OTA flow. Engine owns checking, hotspot staging,\n * APK/MTK/BES sequencing, restart recovery, retries, and verification; the host\n * renders semantic state and invokes these idempotent actions.\n */\nexport function useMentraLiveOta(options: UseMentraLiveOtaOptions = {}): MentraLiveOtaController {\n const {\n initialPage = \"check\",\n initializeRuntime = true,\n onFinished,\n onFirmwareRestartingChange,\n onOpenWifiSetup,\n } = options\n const otaSnapshot = useEngineSnapshot(ota.snapshot, ota.onSnapshot)\n const installSnapshot = useEngineSnapshot(ota.installSession.snapshot, ota.installSession.onSnapshot)\n const [page, setPage] = useState<MentraLiveOtaFlowPage>(initialPage)\n const [runtimeReady, setRuntimeReady] = useState(!initializeRuntime)\n const [checkState, setCheckState] = useState<CheckState>(\"checking\")\n const [isUpdateRequired, setIsUpdateRequired] = useState(true)\n const [isVersionChange, setIsVersionChange] = useState(false)\n const [errorKind, setErrorKind] = useState<\"network\" | \"pin_unavailable\">(\"network\")\n const [updateFingerprint, setUpdateFingerprint] = useState<string | null>(null)\n const [offeredReleaseTransition, setOfferedReleaseTransition] = useState<MentraLiveOtaReleaseTransition | null>(null)\n const [completedReleaseTransition, setCompletedReleaseTransition] = useState<MentraLiveOtaReleaseTransition | null>(\n null,\n )\n const [completedUpdate, setCompletedUpdate] = useState(false)\n const [completedChangelogs, setCompletedChangelogs] = useState<ReleaseChangelog[]>([])\n const [batteryBlocked, setBatteryBlocked] = useState(false)\n const [checkGeneration, setCheckGeneration] = useState(0)\n const performCheckGenerationRef = useRef(0)\n const activeCheckKeyRef = useRef<string | null>(null)\n const checkStartedRef = useRef(false)\n const checkCompletedRef = useRef(false)\n const selectedCheckResultRef = useRef<OtaCheckCurrentGlassesResult | null>(null)\n const autoChainAdvancedRef = useRef(false)\n const installActionPendingRef = useRef(false)\n const onFinishedRef = useRef(onFinished)\n const onOpenWifiSetupRef = useRef(onOpenWifiSetup)\n const onFirmwareRestartingChangeRef = useRef(onFirmwareRestartingChange)\n onFinishedRef.current = onFinished\n onOpenWifiSetupRef.current = onOpenWifiSetup\n onFirmwareRestartingChangeRef.current = onFirmwareRestartingChange\n\n useEffect(() => {\n if (!initializeRuntime) {\n setRuntimeReady(true)\n return\n }\n let cancelled = false\n setRuntimeReady(false)\n void ota.initialize().finally(() => {\n if (!cancelled) setRuntimeReady(true)\n })\n return () => {\n cancelled = true\n }\n }, [initializeRuntime])\n\n const returnToCheck = useCallback(() => {\n installActionPendingRef.current = false\n autoChainAdvancedRef.current = false\n setCheckState(\"checking\")\n setPage(\"check\")\n setCheckGeneration((generation) => generation + 1)\n }, [])\n\n const navigateToProgress = useCallback(() => {\n installActionPendingRef.current = true\n ota.clearProgress()\n setPage(\"progress\")\n }, [])\n\n const continueApprovedChain = useCallback(\n (result: OtaCheckCurrentGlassesResult): boolean => {\n if (installActionPendingRef.current || !isOtaAutoChainActive() || !result.updateInfo) return false\n const snapshot = ota.snapshot()\n if (!snapshot.wifiStatusKnown || (!snapshot.wifiConnected && snapshot.hotspotOtaVersion !== 1)) return false\n\n const admission = tryAdvanceOtaAutoChain(\n otaAutoChainFingerprint(result),\n result.updateInfo.isDowngrade === true,\n releaseRangeTargetVersion(result),\n result.releaseVersion,\n )\n if (!admission.advance) return false\n\n checkCompletedRef.current = true\n ota.installSession.prepare(result)\n navigateToProgress()\n return true\n },\n [navigateToProgress],\n )\n\n useEffect(() => {\n if (!runtimeReady || page !== \"check\") return\n const MIN_DISPLAY_TIME_MS = 1100\n const MAX_WAIT_FOR_VERSION_INFO_MS = 10_000\n const checkKey = String(checkGeneration)\n if (activeCheckKeyRef.current !== checkKey) {\n activeCheckKeyRef.current = checkKey\n checkStartedRef.current = false\n checkCompletedRef.current = false\n selectedCheckResultRef.current = null\n installActionPendingRef.current = false\n setCheckState(\"checking\")\n }\n\n const myGeneration = ++performCheckGenerationRef.current\n let cancelled = false\n let reconnectTimeout: ReturnType<typeof setTimeout> | null = null\n\n const performCheck = async () => {\n if (checkCompletedRef.current) return\n if (isOtaAutoChainActive() && !otaSnapshot.ready) {\n const remainingMs = otaAutoChainReconnectWaitRemaining()\n if (remainingMs === null) return\n reconnectTimeout = setTimeout(() => {\n if (cancelled || myGeneration !== performCheckGenerationRef.current || ota.snapshot().ready) return\n stopOtaAutoChain()\n checkCompletedRef.current = true\n setCheckState(\"error\")\n }, remainingMs)\n return\n }\n if (!otaSnapshot.connected) {\n if (checkStartedRef.current) {\n stopOtaAutoChain()\n checkCompletedRef.current = true\n setCheckState(\"error\")\n return\n }\n checkCompletedRef.current = true\n onFinishedRef.current?.()\n return\n }\n\n clearOtaAutoChainReconnectWait()\n checkStartedRef.current = true\n const startTime = Date.now()\n try {\n const checkOptions = {\n waitForBuildNumberMs: MAX_WAIT_FOR_VERSION_INFO_MS,\n waitForBesVersionMs: 5000,\n waitForMtkVersionMs: 2000,\n refreshVersionInfo: true,\n fixClockBeforeCheck: false,\n }\n let result = await ota.checkForUpdates(checkOptions)\n if (cancelled || myGeneration !== performCheckGenerationRef.current) return\n if (!result.hasCheckCompleted && result.checkFailureReason === \"network\" && isOtaAutoChainActive()) {\n await new Promise((resolve) => setTimeout(resolve, AUTO_CHAIN_NETWORK_RETRY_DELAY_MS))\n if (cancelled || myGeneration !== performCheckGenerationRef.current) return\n result = await ota.checkForUpdates(checkOptions)\n }\n if (cancelled || myGeneration !== performCheckGenerationRef.current) return\n selectedCheckResultRef.current = result\n await new Promise((resolve) => setTimeout(resolve, Math.max(0, MIN_DISPLAY_TIME_MS - (Date.now() - startTime))))\n if (cancelled || myGeneration !== performCheckGenerationRef.current) return\n\n if (result.skippedReason === \"disconnected\") {\n stopOtaAutoChain()\n checkCompletedRef.current = true\n setCheckState(\"error\")\n return\n }\n if (result.skippedReason === \"missing_build\") {\n checkCompletedRef.current = true\n if (isOtaAutoChainActive()) {\n stopOtaAutoChain()\n setCheckState(\"error\")\n } else {\n onFinishedRef.current?.()\n }\n return\n }\n if (result.skippedReason === \"dev_build\") {\n stopOtaAutoChain()\n checkCompletedRef.current = true\n ota.clearUpdateAvailable()\n setCheckState(\"dev_build\")\n return\n }\n if (!result.hasCheckCompleted) {\n stopOtaAutoChain()\n checkCompletedRef.current = true\n setErrorKind(result.checkFailureReason === \"pin_unavailable\" ? \"pin_unavailable\" : \"network\")\n setCheckState(\"error\")\n return\n }\n if (result.updateAvailable && result.updateInfo) {\n setIsUpdateRequired(result.isRequired)\n setIsVersionChange(result.updateInfo.isDowngrade === true)\n const fingerprint = otaAutoChainFingerprint(result)\n setUpdateFingerprint(fingerprint)\n if (!isOtaAutoChainActive()) {\n const fromVersion = currentReleaseVersion(ota.snapshot().appVersion)\n setOfferedReleaseTransition(result.releaseVersion ? {fromVersion, toVersion: result.releaseVersion} : null)\n }\n if (isOtaAutoChainActive() && !ota.snapshot().wifiStatusKnown) {\n checkCompletedRef.current = true\n return\n }\n if (continueApprovedChain(result)) return\n checkCompletedRef.current = true\n setCheckState(\"update_available\")\n return\n }\n const completedApprovedSession = isOtaAutoChainActive()\n if (completedApprovedSession) {\n setCompletedChangelogs(releaseChangelogsForActiveChain())\n setCompletedReleaseTransition(releaseTransitionFromRange(otaAutoChainReleaseRange()))\n }\n setCompletedUpdate(completedApprovedSession)\n stopOtaAutoChain()\n checkCompletedRef.current = true\n ota.clearUpdateAvailable()\n setCheckState(\"no_update\")\n } catch (error) {\n console.error(\"OTA check failed:\", error)\n await new Promise((resolve) => setTimeout(resolve, Math.max(0, MIN_DISPLAY_TIME_MS - (Date.now() - startTime))))\n if (cancelled || myGeneration !== performCheckGenerationRef.current) return\n stopOtaAutoChain()\n checkCompletedRef.current = true\n setErrorKind(\"network\")\n setCheckState(\"error\")\n }\n }\n\n void performCheck()\n return () => {\n cancelled = true\n if (reconnectTimeout) clearTimeout(reconnectTimeout)\n }\n }, [\n checkGeneration,\n continueApprovedChain,\n otaSnapshot.connected,\n otaSnapshot.ready,\n otaSnapshot.wifiStatusKnown,\n page,\n runtimeReady,\n ])\n\n useEffect(() => {\n if (\n !runtimeReady ||\n page !== \"check\" ||\n (checkState !== \"checking\" && checkState !== \"update_available\") ||\n !otaSnapshot.wifiStatusKnown ||\n !isOtaAutoChainActive()\n ) {\n return\n }\n const result = selectedCheckResultRef.current\n if (!result?.updateAvailable || !result.updateInfo) return\n if (!otaSnapshot.wifiConnected && otaSnapshot.hotspotOtaVersion !== 1) {\n setCheckState(\"update_available\")\n return\n }\n continueApprovedChain(result)\n }, [\n checkState,\n continueApprovedChain,\n otaSnapshot.hotspotOtaVersion,\n otaSnapshot.wifiConnected,\n otaSnapshot.wifiStatusKnown,\n page,\n runtimeReady,\n ])\n\n useEffect(() => {\n if (!runtimeReady || page !== \"progress\") return\n ota.installSession.attach()\n return () => ota.installSession.detach()\n }, [page, runtimeReady])\n\n const firmwareRestarting =\n page === \"progress\" &&\n ((!installSnapshot.connected && installSnapshot.displayState === \"restarting\") ||\n installSnapshot.versionChangePhase === \"restarting\")\n\n useEffect(() => {\n if (page !== \"progress\") return\n onFirmwareRestartingChangeRef.current?.(firmwareRestarting, true)\n }, [firmwareRestarting, page])\n\n useEffect(() => {\n if (page !== \"progress\") return\n return () => {\n onFirmwareRestartingChangeRef.current?.(false, false)\n }\n }, [page])\n\n useEffect(() => {\n if (\n page !== \"progress\" ||\n installSnapshot.displayState !== \"complete\" ||\n !installSnapshot.connected ||\n !isOtaAutoChainActive() ||\n autoChainAdvancedRef.current\n ) {\n return\n }\n const timeout = setTimeout(async () => {\n if (!isOtaAutoChainActive()) return\n autoChainAdvancedRef.current = true\n await ota.installSession.finish()\n returnToCheck()\n }, AUTO_CHAIN_COMPLETE_DELAY_MS)\n return () => clearTimeout(timeout)\n }, [installSnapshot.connected, installSnapshot.displayState, page, returnToCheck])\n\n const check = useCallback(() => {\n setBatteryBlocked(false)\n setOfferedReleaseTransition(null)\n setCompletedReleaseTransition(null)\n setCompletedUpdate(false)\n setCompletedChangelogs([])\n setPage(\"check\")\n setCheckState(\"checking\")\n setCheckGeneration((generation) => generation + 1)\n }, [])\n\n const install = useCallback(() => {\n if (installActionPendingRef.current || page !== \"check\") return\n const result = selectedCheckResultRef.current\n if (!result) {\n setErrorKind(\"network\")\n setCheckState(\"error\")\n return\n }\n const snapshot = ota.snapshot()\n if (snapshot.batteryLevel !== null && snapshot.batteryLevel < MINIMUM_OTA_BATTERY_LEVEL) {\n setBatteryBlocked(true)\n return\n }\n if (!snapshot.wifiStatusKnown) {\n check()\n return\n }\n if (!snapshot.wifiConnected && snapshot.hotspotOtaVersion !== 1) {\n onOpenWifiSetupRef.current?.()\n return\n }\n ota.installSession.prepare(result)\n setBatteryBlocked(false)\n setCompletedUpdate(false)\n setCompletedChangelogs([])\n if (updateFingerprint) {\n const fromVersion = offeredReleaseTransition\n ? offeredReleaseTransition.fromVersion\n : currentReleaseVersion(snapshot.appVersion)\n beginOtaAutoChain(updateFingerprint, isVersionChange, {\n fromVersion,\n toVersion: releaseRangeTargetVersion(result),\n releaseVersion: result.releaseVersion,\n })\n }\n navigateToProgress()\n }, [check, isVersionChange, navigateToProgress, offeredReleaseTransition, page, updateFingerprint])\n\n useEffect(() => {\n if (\n batteryBlocked &&\n (otaSnapshot.batteryLevel === null || otaSnapshot.batteryLevel >= MINIMUM_OTA_BATTERY_LEVEL)\n ) {\n setBatteryBlocked(false)\n }\n }, [batteryBlocked, otaSnapshot.batteryLevel])\n\n const retryInstall = useCallback(() => {\n if (page !== \"progress\") return\n onFirmwareRestartingChangeRef.current?.(false, true)\n ota.installSession.retry()\n }, [page])\n\n const finish = useCallback(async () => {\n if (page === \"check\") {\n onFinishedRef.current?.()\n return\n }\n const restartStillInProgress =\n installSnapshot.displayState === \"restarting\" ||\n installSnapshot.versionChangePhase === \"restarting\" ||\n installSnapshot.versionChangePhase === \"verifying\"\n if (restartStillInProgress) return\n const requiresGlassesReboot = shouldRequireGlassesRebootForBesFailure(\n installSnapshot.otaStatus,\n installSnapshot.otaProgress,\n installSnapshot.errorMsg,\n )\n if (requiresGlassesReboot) stopOtaAutoChain()\n await ota.installSession.finish()\n returnToCheck()\n }, [installSnapshot, page, returnToCheck])\n\n const discard = useCallback(async () => {\n if (page !== \"progress\") return\n stopOtaAutoChain()\n await ota.installSession.discard()\n returnToCheck()\n }, [page, returnToCheck])\n\n const openWifiSetup = useCallback(() => {\n if (page === \"progress\") stopOtaAutoChain()\n onOpenWifiSetupRef.current?.()\n }, [page])\n\n const state = useMemo<MentraLiveOtaState>(() => {\n const hotspotSupported = otaSnapshot.hotspotOtaVersion === 1\n const canInstall = otaSnapshot.wifiStatusKnown && (otaSnapshot.wifiConnected || hotspotSupported)\n const autoChainActive = isOtaAutoChainActive()\n if (!runtimeReady) {\n return {\n screen: \"initializing\",\n connected: otaSnapshot.connected,\n batteryLevel: otaSnapshot.batteryLevel,\n transport: null,\n updateRequired: isUpdateRequired,\n versionChange: isVersionChange,\n versionChangeConverged: false,\n versionChangePhase: null,\n wifiConnected: otaSnapshot.wifiConnected,\n wifiStatusKnown: otaSnapshot.wifiStatusKnown,\n hotspotSupported,\n hotspotPhase: \"idle\",\n hotspotArtifactPercent: null,\n phase: null,\n step: null,\n currentStep: null,\n totalSteps: null,\n progress: null,\n installingApkOnly: false,\n firmwareRestarting: false,\n error: null,\n canInstall: false,\n canRetry: false,\n canFinish: false,\n canDismiss: false,\n canDiscard: false,\n canOpenWifiSetup: false,\n continueDisabled: false,\n completedUpdate: false,\n releaseTransition: null,\n changelogs: [],\n }\n }\n\n if (page === \"check\") {\n const wifiRequired = otaSnapshot.wifiStatusKnown && !otaSnapshot.wifiConnected && !hotspotSupported\n let screen: MentraLiveOtaScreen\n if (checkState === \"checking\") screen = autoChainActive ? \"finishing\" : \"checking\"\n else if (checkState === \"update_available\") {\n screen = wifiRequired ? \"wifi_required\" : batteryBlocked ? \"battery_required\" : \"update_available\"\n } else if (checkState === \"no_update\") screen = \"up_to_date\"\n else if (checkState === \"dev_build\") screen = \"dev_build\"\n else screen = errorKind === \"pin_unavailable\" ? \"update_info_unavailable\" : \"check_failed\"\n\n let error: MentraLiveOtaError | null = null\n if (screen === \"check_failed\") {\n error = {\n code: \"check_failed\",\n message: \"Couldn't check for updates. Please check your connection and try again.\",\n }\n } else if (screen === \"update_info_unavailable\") {\n error = {code: \"update_info_unavailable\", message: \"Update information for this app version is unavailable.\"}\n }\n return {\n screen,\n connected: otaSnapshot.connected,\n batteryLevel: otaSnapshot.batteryLevel,\n transport: otaSnapshot.wifiConnected ? \"wifi\" : hotspotSupported ? \"hotspot\" : null,\n updateRequired: isUpdateRequired,\n versionChange: isVersionChange,\n versionChangeConverged: false,\n versionChangePhase: null,\n wifiConnected: otaSnapshot.wifiConnected,\n wifiStatusKnown: otaSnapshot.wifiStatusKnown,\n hotspotSupported,\n hotspotPhase: \"idle\",\n hotspotArtifactPercent: null,\n phase: null,\n step: null,\n currentStep: null,\n totalSteps: null,\n progress: null,\n installingApkOnly: false,\n firmwareRestarting: false,\n error,\n canInstall: screen === \"update_available\" && canInstall,\n canRetry: screen === \"check_failed\",\n canFinish: screen === \"up_to_date\" || screen === \"dev_build\" || screen === \"update_info_unavailable\",\n canDismiss:\n (screen === \"update_available\" || screen === \"wifi_required\" || screen === \"battery_required\") &&\n !isUpdateRequired &&\n !autoChainActive,\n canDiscard: false,\n canOpenWifiSetup: screen === \"wifi_required\",\n continueDisabled: false,\n completedUpdate: screen === \"up_to_date\" && completedUpdate,\n releaseTransition:\n screen === \"update_available\" || screen === \"wifi_required\"\n ? autoChainActive\n ? releaseTransitionFromRange(otaAutoChainReleaseRange())\n : offeredReleaseTransition\n : screen === \"up_to_date\"\n ? completedReleaseTransition\n : null,\n changelogs: screen === \"up_to_date\" ? completedChangelogs : [],\n }\n }\n\n const requiresGlassesReboot = shouldRequireGlassesRebootForBesFailure(\n installSnapshot.otaStatus,\n installSnapshot.otaProgress,\n installSnapshot.errorMsg,\n )\n const showChangeWifi = shouldShowChangeWifiForOtaDownloadFailure(\n installSnapshot.otaStatus,\n installSnapshot.otaProgress,\n installSnapshot.errorMsg,\n )\n const displayedError = requiresGlassesReboot\n ? BES_INSTALL_RESTART_MESSAGE\n : installSnapshot.errorMsg || getOtaErrorMessage(installSnapshot.otaStatus?.error)\n const progressState = progressScreen(installSnapshot)\n const screen = progressState === \"complete\" && autoChainActive ? \"finishing\" : progressState\n const error =\n screen === \"failed\"\n ? {\n code: requiresGlassesReboot ? (\"bes_restart_required\" as const) : (\"install_failed\" as const),\n message: displayedError,\n }\n : null\n const totalSteps = installSnapshot.otaStatus?.totalSteps ?? null\n const changelogs = screen === \"complete\" ? releaseChangelogsForActiveChain() : []\n return {\n screen,\n connected: installSnapshot.connected,\n batteryLevel: otaSnapshot.batteryLevel,\n transport: installSnapshot.transport,\n updateRequired: isUpdateRequired,\n versionChange: installSnapshot.isVersionChange,\n versionChangeConverged: installSnapshot.versionChangeConverged,\n versionChangePhase: installSnapshot.versionChangePhase,\n wifiConnected: otaSnapshot.wifiConnected,\n wifiStatusKnown: otaSnapshot.wifiStatusKnown,\n hotspotSupported,\n hotspotPhase: installSnapshot.hotspotPhase,\n hotspotArtifactPercent: installSnapshot.hotspotArtifactPercent,\n phase: installSnapshot.otaStatus?.phase ?? installSnapshot.otaProgress?.stage ?? null,\n step: installSnapshot.otaStatus?.stepType ?? null,\n currentStep: installSnapshot.otaStatus?.currentStep ?? null,\n totalSteps,\n progress: installProgress(installSnapshot),\n installingApkOnly:\n installSnapshot.otaStatus?.stepType === \"apk\" &&\n installSnapshot.otaStatus.phase === \"install\" &&\n totalSteps === 1,\n firmwareRestarting,\n error,\n canInstall: false,\n canRetry: screen === \"failed\" && !requiresGlassesReboot,\n canFinish: screen === \"complete\" || (screen === \"failed\" && requiresGlassesReboot),\n canDismiss: false,\n canDiscard: screen === \"disconnected\",\n canOpenWifiSetup: screen === \"failed\" && showChangeWifi,\n continueDisabled: installSnapshot.continueButtonDisabled,\n completedUpdate: false,\n releaseTransition: releaseTransitionFromRange(otaAutoChainReleaseRange()),\n changelogs,\n }\n }, [\n checkState,\n batteryBlocked,\n completedChangelogs,\n completedReleaseTransition,\n completedUpdate,\n errorKind,\n firmwareRestarting,\n installSnapshot,\n isUpdateRequired,\n isVersionChange,\n otaSnapshot,\n offeredReleaseTransition,\n page,\n runtimeReady,\n ])\n\n return useMemo(\n () => ({state, check, retryCheck: check, install, retryInstall, finish, discard, openWifiSetup}),\n [check, discard, finish, install, openWifiSetup, retryInstall, state],\n )\n}\n"]}
1
+ {"version":3,"file":"useMentraLiveOta.js","sourceRoot":"","sources":["../../src/react/useMentraLiveOta.ts"],"names":[],"mappings":"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","sourcesContent":["import {useCallback, useEffect, useMemo, useRef, useState} from \"react\"\n\nimport {ota} from \"../facades/ota\"\nimport {\n beginOtaAutoChain,\n clearOtaAutoChainReconnectWait,\n isOtaAutoChainActive,\n otaAutoChainFingerprint,\n otaAutoChainReleaseRange,\n otaAutoChainReconnectWaitRemaining,\n stopOtaAutoChain,\n tryAdvanceOtaAutoChain,\n type OtaAutoChainReleaseRange,\n} from \"../services/OtaAutoChain\"\nimport {\n BES_INSTALL_RESTART_MESSAGE,\n getOtaErrorMessage,\n shouldRequireGlassesRebootForBesFailure,\n shouldShowChangeWifiForOtaDownloadFailure,\n} from \"../services/OtaErrorMapping\"\nimport type {OtaInstallSnapshot} from \"../services/OtaInstallCoordinator\"\nimport type {OtaCheckCurrentGlassesResult} from \"../services/OtaUpdateCheckService\"\nimport type {ReleaseChangelog} from \"../facades/ota\"\nimport {useEngineSnapshot} from \"./useEngineSnapshot\"\n\nexport type MentraLiveOtaFlowPage = \"check\" | \"progress\"\n\nexport type MentraLiveOtaScreen =\n | \"initializing\"\n | \"checking\"\n | \"finishing\"\n | \"update_available\"\n | \"battery_required\"\n | \"wifi_required\"\n | \"up_to_date\"\n | \"dev_build\"\n | \"unofficial_client\"\n | \"check_failed\"\n | \"update_info_unavailable\"\n | \"starting\"\n | \"preparing_hotspot\"\n | \"updating\"\n | \"restarting\"\n | \"verifying\"\n | \"complete\"\n | \"failed\"\n | \"disconnected\"\n\nexport type MentraLiveOtaErrorCode =\n | \"check_failed\"\n | \"update_info_unavailable\"\n | \"install_failed\"\n | \"bes_restart_required\"\n\nexport type MentraLiveOtaError = {\n code: MentraLiveOtaErrorCode\n message: string\n}\n\nexport type MentraLiveOtaTransport = \"wifi\" | \"hotspot\"\nexport type MentraLiveOtaHotspotPhase = \"idle\" | \"downloading\" | \"starting_hotspot\" | \"joining_hotspot\" | \"serving\"\nexport type MentraLiveOtaInstallPhase = \"download\" | \"install\"\nexport type MentraLiveOtaStep = \"apk\" | \"mtk\" | \"bes\"\n\nexport type MentraLiveOtaReleaseTransition = {\n /** Current glasses software label. Temporarily backed by the reported ASG app version. */\n fromVersion: string | null\n /** Exact coordinated release identity for the selected OTA pin. */\n toVersion: string\n}\n\nexport type MentraLiveOtaState = {\n screen: MentraLiveOtaScreen\n connected: boolean\n batteryLevel: number | null\n transport: MentraLiveOtaTransport | null\n updateRequired: boolean\n versionChange: boolean\n versionChangeConverged: boolean\n versionChangePhase: \"installing\" | \"restarting\" | \"verifying\" | null\n wifiConnected: boolean\n wifiStatusKnown: boolean\n hotspotSupported: boolean\n hotspotPhase: MentraLiveOtaHotspotPhase\n hotspotArtifactPercent: number | null\n phase: MentraLiveOtaInstallPhase | null\n step: MentraLiveOtaStep | null\n currentStep: number | null\n totalSteps: number | null\n progress: number | null\n installingApkOnly: boolean\n firmwareRestarting: boolean\n error: MentraLiveOtaError | null\n canInstall: boolean\n canRetry: boolean\n canFinish: boolean\n canDismiss: boolean\n canDiscard: boolean\n canOpenWifiSetup: boolean\n continueDisabled: boolean\n /** True only after an approved update session reaches a final no-update check. */\n completedUpdate: boolean\n /** Release labels for the offered or just-completed coordinated update. */\n releaseTransition: MentraLiveOtaReleaseTransition | null\n /** Release notes crossed by this update, newest first. Populated on completion. */\n changelogs: ReleaseChangelog[]\n /** Sideloaded glasses client package, set only on the `unofficial_client` screen. */\n glassesPackageName: string | null\n}\n\nexport type UseMentraLiveOtaOptions = {\n /** Entry page. `progress` exists for interrupted-session recovery. */\n initialPage?: MentraLiveOtaFlowPage\n /** Start Engine's OTA-only projections. Full Engine hosts should pass false. */\n initializeRuntime?: boolean\n /** Called after the final check or when an optional update is dismissed. */\n onFinished?: () => void\n /** Host-owned Wi-Fi setup for glasses without hotspot OTA support. */\n onOpenWifiSetup?: () => void\n /** Lets a host coordinate its connection overlay with OTA firmware restarts. */\n onFirmwareRestartingChange?: (restarting: boolean, progressActive: boolean) => void\n}\n\nexport type MentraLiveOtaController = {\n state: MentraLiveOtaState\n check: () => void\n retryCheck: () => void\n install: () => void\n retryInstall: () => void\n finish: () => void\n discard: () => void\n openWifiSetup: () => void\n}\n\ntype CheckState = \"checking\" | \"update_available\" | \"no_update\" | \"dev_build\" | \"unofficial_client\" | \"error\"\n\nconst AUTO_CHAIN_NETWORK_RETRY_DELAY_MS = 5000\nconst AUTO_CHAIN_COMPLETE_DELAY_MS = 750\nexport const MINIMUM_OTA_BATTERY_LEVEL = 25\n\nfunction releaseRangeTargetVersion(result: OtaCheckCurrentGlassesResult): string | null {\n return result.releaseVersion ?? result.updateInfo?.versionName ?? result.latestVersionInfo?.versionName ?? null\n}\n\nfunction currentReleaseVersion(appVersion: string | null): string | null {\n const version = appVersion?.trim()\n return version || null\n}\n\nfunction releaseTransitionFromRange(range: OtaAutoChainReleaseRange | null): MentraLiveOtaReleaseTransition | null {\n if (!range?.releaseVersion) return null\n return {fromVersion: range.fromVersion, toVersion: range.releaseVersion}\n}\n\nfunction releaseChangelogsForActiveChain(): ReleaseChangelog[] {\n const range = otaAutoChainReleaseRange()\n if (!range?.toVersion) return []\n try {\n return ota.getReleaseChangelogs(range.fromVersion, range.toVersion)\n } catch {\n try {\n return ota.getReleaseChangelogs(null, range.toVersion)\n } catch {\n return []\n }\n }\n}\n\nfunction installProgress(snapshot: OtaInstallSnapshot): number | null {\n if (snapshot.displayState !== \"updating\") return null\n const {otaStatus} = snapshot\n const isDownload = otaStatus?.phase === \"download\"\n const totalSteps = otaStatus?.totalSteps ?? 1\n const rawPercent = isDownload\n ? (otaStatus?.stepPercent ?? 0)\n : totalSteps >= 2\n ? (otaStatus?.overallPercent ?? 0)\n : (otaStatus?.stepPercent ?? 0)\n return Math.min(Math.max(rawPercent, snapshot.mtkInstallStallSimulatedPercent ?? 0, 0), 100)\n}\n\nfunction progressScreen(snapshot: OtaInstallSnapshot): MentraLiveOtaScreen {\n if (snapshot.versionChangePhase === \"restarting\") return \"restarting\"\n if (snapshot.versionChangePhase === \"verifying\") return \"verifying\"\n switch (snapshot.displayState) {\n case \"starting\":\n return snapshot.hotspotPhase === \"idle\" || snapshot.hotspotPhase === \"serving\" ? \"starting\" : \"preparing_hotspot\"\n case \"updating\":\n return \"updating\"\n case \"restarting\":\n return \"restarting\"\n case \"complete\":\n return \"complete\"\n case \"failed\":\n return \"failed\"\n default:\n return \"disconnected\"\n }\n}\n\n/**\n * Headless Mentra Live OTA flow. Engine owns checking, hotspot staging,\n * APK/MTK/BES sequencing, restart recovery, retries, and verification; the host\n * renders semantic state and invokes these idempotent actions.\n */\nexport function useMentraLiveOta(options: UseMentraLiveOtaOptions = {}): MentraLiveOtaController {\n const {\n initialPage = \"check\",\n initializeRuntime = true,\n onFinished,\n onFirmwareRestartingChange,\n onOpenWifiSetup,\n } = options\n const otaSnapshot = useEngineSnapshot(ota.snapshot, ota.onSnapshot)\n const installSnapshot = useEngineSnapshot(ota.installSession.snapshot, ota.installSession.onSnapshot)\n const [page, setPage] = useState<MentraLiveOtaFlowPage>(initialPage)\n const [runtimeReady, setRuntimeReady] = useState(!initializeRuntime)\n const [checkState, setCheckState] = useState<CheckState>(\"checking\")\n const [isUpdateRequired, setIsUpdateRequired] = useState(true)\n const [isVersionChange, setIsVersionChange] = useState(false)\n const [errorKind, setErrorKind] = useState<\"network\" | \"pin_unavailable\">(\"network\")\n const [unofficialClientPackage, setUnofficialClientPackage] = useState<string | null>(null)\n const [updateFingerprint, setUpdateFingerprint] = useState<string | null>(null)\n const [offeredReleaseTransition, setOfferedReleaseTransition] = useState<MentraLiveOtaReleaseTransition | null>(null)\n const [completedReleaseTransition, setCompletedReleaseTransition] = useState<MentraLiveOtaReleaseTransition | null>(\n null,\n )\n const [completedUpdate, setCompletedUpdate] = useState(false)\n const [completedChangelogs, setCompletedChangelogs] = useState<ReleaseChangelog[]>([])\n const [batteryBlocked, setBatteryBlocked] = useState(false)\n const [checkGeneration, setCheckGeneration] = useState(0)\n const performCheckGenerationRef = useRef(0)\n const activeCheckKeyRef = useRef<string | null>(null)\n const checkStartedRef = useRef(false)\n const checkCompletedRef = useRef(false)\n const selectedCheckResultRef = useRef<OtaCheckCurrentGlassesResult | null>(null)\n const autoChainAdvancedRef = useRef(false)\n const installActionPendingRef = useRef(false)\n const onFinishedRef = useRef(onFinished)\n const onOpenWifiSetupRef = useRef(onOpenWifiSetup)\n const onFirmwareRestartingChangeRef = useRef(onFirmwareRestartingChange)\n onFinishedRef.current = onFinished\n onOpenWifiSetupRef.current = onOpenWifiSetup\n onFirmwareRestartingChangeRef.current = onFirmwareRestartingChange\n\n useEffect(() => {\n if (!initializeRuntime) {\n setRuntimeReady(true)\n return\n }\n let cancelled = false\n setRuntimeReady(false)\n void ota.initialize().finally(() => {\n if (!cancelled) setRuntimeReady(true)\n })\n return () => {\n cancelled = true\n }\n }, [initializeRuntime])\n\n const returnToCheck = useCallback(() => {\n installActionPendingRef.current = false\n autoChainAdvancedRef.current = false\n setCheckState(\"checking\")\n setPage(\"check\")\n setCheckGeneration((generation) => generation + 1)\n }, [])\n\n const navigateToProgress = useCallback(() => {\n installActionPendingRef.current = true\n ota.clearProgress()\n setPage(\"progress\")\n }, [])\n\n const continueApprovedChain = useCallback(\n (result: OtaCheckCurrentGlassesResult): boolean => {\n if (installActionPendingRef.current || !isOtaAutoChainActive() || !result.updateInfo) return false\n const snapshot = ota.snapshot()\n if (!snapshot.wifiStatusKnown || (!snapshot.wifiConnected && snapshot.hotspotOtaVersion !== 1)) return false\n\n const admission = tryAdvanceOtaAutoChain(\n otaAutoChainFingerprint(result),\n result.updateInfo.isDowngrade === true,\n releaseRangeTargetVersion(result),\n result.releaseVersion,\n )\n if (!admission.advance) return false\n\n checkCompletedRef.current = true\n ota.installSession.prepare(result)\n navigateToProgress()\n return true\n },\n [navigateToProgress],\n )\n\n useEffect(() => {\n if (!runtimeReady || page !== \"check\") return\n const MIN_DISPLAY_TIME_MS = 1100\n const MAX_WAIT_FOR_VERSION_INFO_MS = 10_000\n const checkKey = String(checkGeneration)\n if (activeCheckKeyRef.current !== checkKey) {\n activeCheckKeyRef.current = checkKey\n checkStartedRef.current = false\n checkCompletedRef.current = false\n selectedCheckResultRef.current = null\n installActionPendingRef.current = false\n setCheckState(\"checking\")\n }\n\n const myGeneration = ++performCheckGenerationRef.current\n let cancelled = false\n let reconnectTimeout: ReturnType<typeof setTimeout> | null = null\n\n const performCheck = async () => {\n if (checkCompletedRef.current) return\n if (isOtaAutoChainActive() && !otaSnapshot.ready) {\n const remainingMs = otaAutoChainReconnectWaitRemaining()\n if (remainingMs === null) return\n reconnectTimeout = setTimeout(() => {\n if (cancelled || myGeneration !== performCheckGenerationRef.current || ota.snapshot().ready) return\n stopOtaAutoChain()\n checkCompletedRef.current = true\n setCheckState(\"error\")\n }, remainingMs)\n return\n }\n if (!otaSnapshot.connected) {\n if (checkStartedRef.current) {\n stopOtaAutoChain()\n checkCompletedRef.current = true\n setCheckState(\"error\")\n return\n }\n checkCompletedRef.current = true\n onFinishedRef.current?.()\n return\n }\n\n clearOtaAutoChainReconnectWait()\n checkStartedRef.current = true\n const startTime = Date.now()\n try {\n const checkOptions = {\n waitForBuildNumberMs: MAX_WAIT_FOR_VERSION_INFO_MS,\n waitForBesVersionMs: 5000,\n waitForMtkVersionMs: 2000,\n refreshVersionInfo: true,\n fixClockBeforeCheck: false,\n }\n let result = await ota.checkForUpdates(checkOptions)\n if (cancelled || myGeneration !== performCheckGenerationRef.current) return\n if (!result.hasCheckCompleted && result.checkFailureReason === \"network\" && isOtaAutoChainActive()) {\n await new Promise((resolve) => setTimeout(resolve, AUTO_CHAIN_NETWORK_RETRY_DELAY_MS))\n if (cancelled || myGeneration !== performCheckGenerationRef.current) return\n result = await ota.checkForUpdates(checkOptions)\n }\n if (cancelled || myGeneration !== performCheckGenerationRef.current) return\n selectedCheckResultRef.current = result\n await new Promise((resolve) => setTimeout(resolve, Math.max(0, MIN_DISPLAY_TIME_MS - (Date.now() - startTime))))\n if (cancelled || myGeneration !== performCheckGenerationRef.current) return\n\n if (result.skippedReason === \"disconnected\") {\n stopOtaAutoChain()\n checkCompletedRef.current = true\n setCheckState(\"error\")\n return\n }\n if (result.skippedReason === \"missing_build\") {\n checkCompletedRef.current = true\n if (isOtaAutoChainActive()) {\n stopOtaAutoChain()\n setCheckState(\"error\")\n } else {\n onFinishedRef.current?.()\n }\n return\n }\n if (result.skippedReason === \"dev_build\") {\n stopOtaAutoChain()\n checkCompletedRef.current = true\n ota.clearUpdateAvailable()\n setCheckState(\"dev_build\")\n return\n }\n if (result.skippedReason === \"unofficial_client\") {\n stopOtaAutoChain()\n checkCompletedRef.current = true\n ota.clearUpdateAvailable()\n setUnofficialClientPackage(result.packageName ?? null)\n setCheckState(\"unofficial_client\")\n return\n }\n if (!result.hasCheckCompleted) {\n stopOtaAutoChain()\n checkCompletedRef.current = true\n setErrorKind(result.checkFailureReason === \"pin_unavailable\" ? \"pin_unavailable\" : \"network\")\n setCheckState(\"error\")\n return\n }\n if (result.updateAvailable && result.updateInfo) {\n setIsUpdateRequired(result.isRequired)\n setIsVersionChange(result.updateInfo.isDowngrade === true)\n const fingerprint = otaAutoChainFingerprint(result)\n setUpdateFingerprint(fingerprint)\n if (!isOtaAutoChainActive()) {\n const fromVersion = currentReleaseVersion(ota.snapshot().appVersion)\n setOfferedReleaseTransition(result.releaseVersion ? {fromVersion, toVersion: result.releaseVersion} : null)\n }\n if (isOtaAutoChainActive() && !ota.snapshot().wifiStatusKnown) {\n checkCompletedRef.current = true\n return\n }\n if (continueApprovedChain(result)) return\n checkCompletedRef.current = true\n setCheckState(\"update_available\")\n return\n }\n const completedApprovedSession = isOtaAutoChainActive()\n if (completedApprovedSession) {\n setCompletedChangelogs(releaseChangelogsForActiveChain())\n setCompletedReleaseTransition(releaseTransitionFromRange(otaAutoChainReleaseRange()))\n }\n setCompletedUpdate(completedApprovedSession)\n stopOtaAutoChain()\n checkCompletedRef.current = true\n ota.clearUpdateAvailable()\n setCheckState(\"no_update\")\n } catch (error) {\n console.error(\"OTA check failed:\", error)\n await new Promise((resolve) => setTimeout(resolve, Math.max(0, MIN_DISPLAY_TIME_MS - (Date.now() - startTime))))\n if (cancelled || myGeneration !== performCheckGenerationRef.current) return\n stopOtaAutoChain()\n checkCompletedRef.current = true\n setErrorKind(\"network\")\n setCheckState(\"error\")\n }\n }\n\n void performCheck()\n return () => {\n cancelled = true\n if (reconnectTimeout) clearTimeout(reconnectTimeout)\n }\n }, [\n checkGeneration,\n continueApprovedChain,\n otaSnapshot.connected,\n otaSnapshot.ready,\n otaSnapshot.wifiStatusKnown,\n page,\n runtimeReady,\n ])\n\n useEffect(() => {\n if (\n !runtimeReady ||\n page !== \"check\" ||\n (checkState !== \"checking\" && checkState !== \"update_available\") ||\n !otaSnapshot.wifiStatusKnown ||\n !isOtaAutoChainActive()\n ) {\n return\n }\n const result = selectedCheckResultRef.current\n if (!result?.updateAvailable || !result.updateInfo) return\n if (!otaSnapshot.wifiConnected && otaSnapshot.hotspotOtaVersion !== 1) {\n setCheckState(\"update_available\")\n return\n }\n continueApprovedChain(result)\n }, [\n checkState,\n continueApprovedChain,\n otaSnapshot.hotspotOtaVersion,\n otaSnapshot.wifiConnected,\n otaSnapshot.wifiStatusKnown,\n page,\n runtimeReady,\n ])\n\n useEffect(() => {\n if (!runtimeReady || page !== \"progress\") return\n ota.installSession.attach()\n return () => ota.installSession.detach()\n }, [page, runtimeReady])\n\n const firmwareRestarting =\n page === \"progress\" &&\n ((!installSnapshot.connected && installSnapshot.displayState === \"restarting\") ||\n installSnapshot.versionChangePhase === \"restarting\")\n\n useEffect(() => {\n if (page !== \"progress\") return\n onFirmwareRestartingChangeRef.current?.(firmwareRestarting, true)\n }, [firmwareRestarting, page])\n\n useEffect(() => {\n if (page !== \"progress\") return\n return () => {\n onFirmwareRestartingChangeRef.current?.(false, false)\n }\n }, [page])\n\n useEffect(() => {\n if (\n page !== \"progress\" ||\n installSnapshot.displayState !== \"complete\" ||\n !installSnapshot.connected ||\n !isOtaAutoChainActive() ||\n autoChainAdvancedRef.current\n ) {\n return\n }\n const timeout = setTimeout(async () => {\n if (!isOtaAutoChainActive()) return\n autoChainAdvancedRef.current = true\n await ota.installSession.finish()\n returnToCheck()\n }, AUTO_CHAIN_COMPLETE_DELAY_MS)\n return () => clearTimeout(timeout)\n }, [installSnapshot.connected, installSnapshot.displayState, page, returnToCheck])\n\n const check = useCallback(() => {\n setBatteryBlocked(false)\n setOfferedReleaseTransition(null)\n setCompletedReleaseTransition(null)\n setCompletedUpdate(false)\n setCompletedChangelogs([])\n setPage(\"check\")\n setCheckState(\"checking\")\n setCheckGeneration((generation) => generation + 1)\n }, [])\n\n const install = useCallback(() => {\n if (installActionPendingRef.current || page !== \"check\") return\n const result = selectedCheckResultRef.current\n if (!result) {\n setErrorKind(\"network\")\n setCheckState(\"error\")\n return\n }\n const snapshot = ota.snapshot()\n if (snapshot.batteryLevel !== null && snapshot.batteryLevel < MINIMUM_OTA_BATTERY_LEVEL) {\n setBatteryBlocked(true)\n return\n }\n if (!snapshot.wifiStatusKnown) {\n check()\n return\n }\n if (!snapshot.wifiConnected && snapshot.hotspotOtaVersion !== 1) {\n onOpenWifiSetupRef.current?.()\n return\n }\n ota.installSession.prepare(result)\n setBatteryBlocked(false)\n setCompletedUpdate(false)\n setCompletedChangelogs([])\n if (updateFingerprint) {\n const fromVersion = offeredReleaseTransition\n ? offeredReleaseTransition.fromVersion\n : currentReleaseVersion(snapshot.appVersion)\n beginOtaAutoChain(updateFingerprint, isVersionChange, {\n fromVersion,\n toVersion: releaseRangeTargetVersion(result),\n releaseVersion: result.releaseVersion,\n })\n }\n navigateToProgress()\n }, [check, isVersionChange, navigateToProgress, offeredReleaseTransition, page, updateFingerprint])\n\n useEffect(() => {\n if (\n batteryBlocked &&\n (otaSnapshot.batteryLevel === null || otaSnapshot.batteryLevel >= MINIMUM_OTA_BATTERY_LEVEL)\n ) {\n setBatteryBlocked(false)\n }\n }, [batteryBlocked, otaSnapshot.batteryLevel])\n\n const retryInstall = useCallback(() => {\n if (page !== \"progress\") return\n onFirmwareRestartingChangeRef.current?.(false, true)\n ota.installSession.retry()\n }, [page])\n\n const finish = useCallback(async () => {\n if (page === \"check\") {\n onFinishedRef.current?.()\n return\n }\n const restartStillInProgress =\n installSnapshot.displayState === \"restarting\" ||\n installSnapshot.versionChangePhase === \"restarting\" ||\n installSnapshot.versionChangePhase === \"verifying\"\n if (restartStillInProgress) return\n const requiresGlassesReboot = shouldRequireGlassesRebootForBesFailure(\n installSnapshot.otaStatus,\n installSnapshot.otaProgress,\n installSnapshot.errorMsg,\n )\n if (requiresGlassesReboot) stopOtaAutoChain()\n await ota.installSession.finish()\n returnToCheck()\n }, [installSnapshot, page, returnToCheck])\n\n const discard = useCallback(async () => {\n if (page !== \"progress\") return\n stopOtaAutoChain()\n await ota.installSession.discard()\n returnToCheck()\n }, [page, returnToCheck])\n\n const openWifiSetup = useCallback(() => {\n if (page === \"progress\") stopOtaAutoChain()\n onOpenWifiSetupRef.current?.()\n }, [page])\n\n const state = useMemo<MentraLiveOtaState>(() => {\n const hotspotSupported = otaSnapshot.hotspotOtaVersion === 1\n const canInstall = otaSnapshot.wifiStatusKnown && (otaSnapshot.wifiConnected || hotspotSupported)\n const autoChainActive = isOtaAutoChainActive()\n if (!runtimeReady) {\n return {\n screen: \"initializing\",\n connected: otaSnapshot.connected,\n batteryLevel: otaSnapshot.batteryLevel,\n transport: null,\n updateRequired: isUpdateRequired,\n versionChange: isVersionChange,\n versionChangeConverged: false,\n versionChangePhase: null,\n wifiConnected: otaSnapshot.wifiConnected,\n wifiStatusKnown: otaSnapshot.wifiStatusKnown,\n hotspotSupported,\n hotspotPhase: \"idle\",\n hotspotArtifactPercent: null,\n phase: null,\n step: null,\n currentStep: null,\n totalSteps: null,\n progress: null,\n installingApkOnly: false,\n firmwareRestarting: false,\n error: null,\n canInstall: false,\n canRetry: false,\n canFinish: false,\n canDismiss: false,\n canDiscard: false,\n canOpenWifiSetup: false,\n continueDisabled: false,\n completedUpdate: false,\n releaseTransition: null,\n changelogs: [],\n glassesPackageName: null,\n }\n }\n\n if (page === \"check\") {\n const wifiRequired = otaSnapshot.wifiStatusKnown && !otaSnapshot.wifiConnected && !hotspotSupported\n let screen: MentraLiveOtaScreen\n if (checkState === \"checking\") screen = autoChainActive ? \"finishing\" : \"checking\"\n else if (checkState === \"update_available\") {\n screen = wifiRequired ? \"wifi_required\" : batteryBlocked ? \"battery_required\" : \"update_available\"\n } else if (checkState === \"no_update\") screen = \"up_to_date\"\n else if (checkState === \"dev_build\") screen = \"dev_build\"\n else if (checkState === \"unofficial_client\") screen = \"unofficial_client\"\n else screen = errorKind === \"pin_unavailable\" ? \"update_info_unavailable\" : \"check_failed\"\n\n let error: MentraLiveOtaError | null = null\n if (screen === \"check_failed\") {\n error = {\n code: \"check_failed\",\n message: \"Couldn't check for updates. Please check your connection and try again.\",\n }\n } else if (screen === \"update_info_unavailable\") {\n error = {code: \"update_info_unavailable\", message: \"Update information for this app version is unavailable.\"}\n }\n return {\n screen,\n connected: otaSnapshot.connected,\n batteryLevel: otaSnapshot.batteryLevel,\n transport: otaSnapshot.wifiConnected ? \"wifi\" : hotspotSupported ? \"hotspot\" : null,\n updateRequired: isUpdateRequired,\n versionChange: isVersionChange,\n versionChangeConverged: false,\n versionChangePhase: null,\n wifiConnected: otaSnapshot.wifiConnected,\n wifiStatusKnown: otaSnapshot.wifiStatusKnown,\n hotspotSupported,\n hotspotPhase: \"idle\",\n hotspotArtifactPercent: null,\n phase: null,\n step: null,\n currentStep: null,\n totalSteps: null,\n progress: null,\n installingApkOnly: false,\n firmwareRestarting: false,\n error,\n canInstall: screen === \"update_available\" && canInstall,\n canRetry: screen === \"check_failed\",\n canFinish:\n screen === \"up_to_date\" ||\n screen === \"dev_build\" ||\n screen === \"unofficial_client\" ||\n screen === \"update_info_unavailable\",\n canDismiss:\n (screen === \"update_available\" || screen === \"wifi_required\" || screen === \"battery_required\") &&\n !isUpdateRequired &&\n !autoChainActive,\n canDiscard: false,\n canOpenWifiSetup: screen === \"wifi_required\",\n continueDisabled: false,\n completedUpdate: screen === \"up_to_date\" && completedUpdate,\n releaseTransition:\n screen === \"update_available\" || screen === \"wifi_required\"\n ? autoChainActive\n ? releaseTransitionFromRange(otaAutoChainReleaseRange())\n : offeredReleaseTransition\n : screen === \"up_to_date\"\n ? completedReleaseTransition\n : null,\n changelogs: screen === \"up_to_date\" ? completedChangelogs : [],\n glassesPackageName: screen === \"unofficial_client\" ? unofficialClientPackage : null,\n }\n }\n\n const requiresGlassesReboot = shouldRequireGlassesRebootForBesFailure(\n installSnapshot.otaStatus,\n installSnapshot.otaProgress,\n installSnapshot.errorMsg,\n )\n const showChangeWifi = shouldShowChangeWifiForOtaDownloadFailure(\n installSnapshot.otaStatus,\n installSnapshot.otaProgress,\n installSnapshot.errorMsg,\n )\n const displayedError = requiresGlassesReboot\n ? BES_INSTALL_RESTART_MESSAGE\n : installSnapshot.errorMsg || getOtaErrorMessage(installSnapshot.otaStatus?.error)\n const progressState = progressScreen(installSnapshot)\n const screen = progressState === \"complete\" && autoChainActive ? \"finishing\" : progressState\n const error =\n screen === \"failed\"\n ? {\n code: requiresGlassesReboot ? (\"bes_restart_required\" as const) : (\"install_failed\" as const),\n message: displayedError,\n }\n : null\n const totalSteps = installSnapshot.otaStatus?.totalSteps ?? null\n const changelogs = screen === \"complete\" ? releaseChangelogsForActiveChain() : []\n return {\n screen,\n connected: installSnapshot.connected,\n batteryLevel: otaSnapshot.batteryLevel,\n transport: installSnapshot.transport,\n updateRequired: isUpdateRequired,\n versionChange: installSnapshot.isVersionChange,\n versionChangeConverged: installSnapshot.versionChangeConverged,\n versionChangePhase: installSnapshot.versionChangePhase,\n wifiConnected: otaSnapshot.wifiConnected,\n wifiStatusKnown: otaSnapshot.wifiStatusKnown,\n hotspotSupported,\n hotspotPhase: installSnapshot.hotspotPhase,\n hotspotArtifactPercent: installSnapshot.hotspotArtifactPercent,\n phase: installSnapshot.otaStatus?.phase ?? installSnapshot.otaProgress?.stage ?? null,\n step: installSnapshot.otaStatus?.stepType ?? null,\n currentStep: installSnapshot.otaStatus?.currentStep ?? null,\n totalSteps,\n progress: installProgress(installSnapshot),\n installingApkOnly:\n installSnapshot.otaStatus?.stepType === \"apk\" &&\n installSnapshot.otaStatus.phase === \"install\" &&\n totalSteps === 1,\n firmwareRestarting,\n error,\n canInstall: false,\n canRetry: screen === \"failed\" && !requiresGlassesReboot,\n canFinish: screen === \"complete\" || (screen === \"failed\" && requiresGlassesReboot),\n canDismiss: false,\n canDiscard: screen === \"disconnected\",\n canOpenWifiSetup: screen === \"failed\" && showChangeWifi,\n continueDisabled: installSnapshot.continueButtonDisabled,\n completedUpdate: false,\n releaseTransition: releaseTransitionFromRange(otaAutoChainReleaseRange()),\n changelogs,\n glassesPackageName: null,\n }\n }, [\n unofficialClientPackage,\n checkState,\n batteryBlocked,\n completedChangelogs,\n completedReleaseTransition,\n completedUpdate,\n errorKind,\n firmwareRestarting,\n installSnapshot,\n isUpdateRequired,\n isVersionChange,\n otaSnapshot,\n offeredReleaseTransition,\n page,\n runtimeReady,\n ])\n\n return useMemo(\n () => ({state, check, retryCheck: check, install, retryInstall, finish, discard, openWifiSetup}),\n [check, discard, finish, install, openWifiSetup, retryInstall, state],\n )\n}\n"]}
@@ -8,10 +8,16 @@
8
8
  export type SubjectTokenType = "supabase" | "authing" | (string & {});
9
9
  export interface IslandAuth {
10
10
  /** Returns the host's current (auto-refreshed) subject token for the backend. */
11
- getSubjectToken: () => Promise<{
11
+ getSubjectToken?: () => Promise<{
12
12
  token: string;
13
13
  type: SubjectTokenType;
14
14
  }>;
15
+ /** Supplies a token issued directly for Runtime in a Core-free deployment. */
16
+ getRuntimeToken?: (opts?: {
17
+ forceRefresh?: boolean;
18
+ }) => Promise<string>;
19
+ /** Stable, deployment-scoped local identity for bundled miniapp storage. */
20
+ getUserId?: () => Promise<string> | string;
15
21
  /**
16
22
  * Optional auth-session listener. Hosts that can emit auth changes should
17
23
  * wire this so engine can reconnect backend sessions after restored login
@@ -23,9 +29,23 @@ export interface IslandAuth {
23
29
  }
24
30
  export interface IslandConfigValues {
25
31
  /** cloud-v2 core service base URL (defaults resolved by the cloud client). */
26
- coreUrl?: string;
32
+ coreUrl?: string | null;
27
33
  /** cloud-v2 runtime service base URL. */
28
- runtimeUrl?: string;
34
+ runtimeUrl?: string | null;
35
+ /** Open Runtime's live WebSocket/audio session. Defaults to true. */
36
+ runtimeRealtimeSession?: boolean;
37
+ /** Complete allowlist for bundled/local miniapps; null or omitted allows all. */
38
+ localMiniappAllowlist?: readonly string[] | null;
39
+ /** Provenance-aware policy for workspace SYSTEM and managed miniapps. */
40
+ localMiniappPolicy?: LocalMiniappPolicy;
41
+ /** Optional per-package configuration supplied by the host deployment. */
42
+ miniappConfiguration?: Readonly<Record<string, Readonly<Record<string, string>>>>;
43
+ /** Deployment-scoped key for the persisted Core refresh token. */
44
+ cloudAuthStorageKey?: string;
45
+ /** Deployment-pinned Mentra Live OTA manifest; explicit null disables remote OTA. */
46
+ otaManifestUrl?: string | null;
47
+ /** Deployment capability policy. Omitted entries preserve consumer behavior. */
48
+ features?: Partial<Record<IslandFeatureName, boolean>>;
29
49
  /** OEM identifier (Mentra is OEM #0); reserved for OEM auth/telemetry. */
30
50
  oemId?: string;
31
51
  /**
@@ -39,6 +59,18 @@ export interface IslandConfigValues {
39
59
  */
40
60
  devServerHost?: () => string | undefined;
41
61
  }
62
+ export interface ManagedMiniappPolicyEntry {
63
+ packageName: string;
64
+ version: string;
65
+ sha256: string;
66
+ deploymentId: string;
67
+ deploymentOrigin: string;
68
+ }
69
+ export interface LocalMiniappPolicy {
70
+ systemPackageNames: readonly string[] | null;
71
+ managed: readonly ManagedMiniappPolicyEntry[];
72
+ }
73
+ export type IslandFeatureName = "managedStreams" | "nativeMeetings" | "cloudSpeech" | "onDeviceSpeech" | "navigation";
42
74
  export type IslandAnalytics = (event: string, props?: Record<string, unknown>) => void;
43
75
  /**
44
76
  * Named host-UI seams: engine dispatches the runtime request, the host owns the
@@ -74,6 +106,17 @@ export interface IslandConfigureOptions {
74
106
  analytics?: IslandAnalytics;
75
107
  ui?: IslandUiSeams;
76
108
  }
109
+ export declare function isLocalMiniappPackageAllowed(packageName: string): boolean;
110
+ export declare function isOfflineSystemMiniappAllowed(packageName: string): boolean;
111
+ export declare function isInstalledMiniappAllowed(packageName: string, version: string | undefined, releaseIdentity: {
112
+ source: string;
113
+ bundleSha256?: string;
114
+ deploymentId?: string;
115
+ deploymentOrigin?: string;
116
+ } | null): boolean;
117
+ /** Read a defensive package-scoped configuration snapshot. */
118
+ export declare function getMiniappConfiguration(packageName: string): Record<string, string>;
119
+ export declare function isFeatureEnabled(feature: IslandFeatureName): boolean;
77
120
  /**
78
121
  * Hand engine its auth + config + analytics. Call once, before `start()`.
79
122
  *
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/runtime/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;AAErE,MAAM,WAAW,UAAU;IACzB,iFAAiF;IACjF,eAAe,EAAE,MAAM,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,gBAAgB,CAAA;KAAC,CAAC,CAAA;IACvE;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAC,GAAG,IAAI,KAAK,IAAI,KAAK,OAAO,CAAA;CACxG;AAED,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;CACzC;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;AAEtF;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAClF;;;;OAIG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;CAC5D;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,MAAM,YAAY,GAAG;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,GAAG;IAAC,SAAS,EAAE,IAAI,CAAA;CAAC,CAAA;AAE7D,MAAM,WAAW,sBAAsB;IACrC,qFAAqF;IACrF,IAAI,EAAE,UAAU,CAAA;IAChB,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,SAAS,CAAC,EAAE,eAAe,CAAA;IAC3B,EAAE,CAAC,EAAE,aAAa,CAAA;CACnB;AAKD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,sBAAsB,GAAG,IAAI,CAM5D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI,CAMrD;AAED,4CAA4C;AAC5C,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAM3C;AAED,6BAA6B;AAC7B,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1C;AAED,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,IAAI,IAAI,CAGpC;AAED,sEAAsE;AACtE,wBAAgB,OAAO,IAAI,UAAU,GAAG,IAAI,CAE3C;AAED,wBAAgB,eAAe,IAAI,kBAAkB,CAEpD;AAED,wBAAgB,YAAY,IAAI,eAAe,GAAG,IAAI,CAErD;AAED,uEAAuE;AACvE,wBAAgB,UAAU,IAAI,aAAa,CAE1C"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/runtime/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,45 @@
5
5
  * runtime construction behind `start()`. Internal services read this holder
6
6
  * directly instead of exposing host-facing adapter bags.
7
7
  */
8
+ export function isLocalMiniappPackageAllowed(packageName) {
9
+ const policy = options?.config?.localMiniappPolicy;
10
+ if (policy) {
11
+ return (policy.systemPackageNames === null ||
12
+ policy.systemPackageNames.includes(packageName) ||
13
+ policy.managed.some((entry) => entry.packageName === packageName));
14
+ }
15
+ const allowlist = options?.config?.localMiniappAllowlist;
16
+ return allowlist == null || allowlist.includes(packageName);
17
+ }
18
+ export function isOfflineSystemMiniappAllowed(packageName) {
19
+ const policy = options?.config?.localMiniappPolicy;
20
+ if (!policy)
21
+ return isLocalMiniappPackageAllowed(packageName);
22
+ return policy.systemPackageNames === null || policy.systemPackageNames.includes(packageName);
23
+ }
24
+ export function isInstalledMiniappAllowed(packageName, version, releaseIdentity) {
25
+ const policy = options?.config?.localMiniappPolicy;
26
+ if (!policy)
27
+ return isLocalMiniappPackageAllowed(packageName);
28
+ const systemApproved = policy.systemPackageNames === null || policy.systemPackageNames.includes(packageName);
29
+ if (systemApproved && releaseIdentity?.source === "bundled_asset")
30
+ return true;
31
+ if (!version || releaseIdentity?.source !== "deployment_manifest")
32
+ return false;
33
+ return policy.managed.some((entry) => entry.packageName === packageName &&
34
+ entry.version === version &&
35
+ entry.sha256 === releaseIdentity.bundleSha256?.toLowerCase() &&
36
+ entry.deploymentId === releaseIdentity.deploymentId &&
37
+ entry.deploymentOrigin === releaseIdentity.deploymentOrigin);
38
+ }
39
+ /** Read a defensive package-scoped configuration snapshot. */
40
+ export function getMiniappConfiguration(packageName) {
41
+ const configuration = options?.config?.miniappConfiguration?.[packageName];
42
+ return configuration ? { ...configuration } : {};
43
+ }
44
+ export function isFeatureEnabled(feature) {
45
+ return options?.config?.features?.[feature] !== false;
46
+ }
8
47
  let options = null;
9
48
  let started = false;
10
49
  /**
@@ -21,7 +60,27 @@ export function configure(opts) {
21
60
  console.warn("engine.configure() called after engine.start(); ignored — stop() the runtime before reconfiguring");
22
61
  return;
23
62
  }
24
- options = opts;
63
+ const localMiniappAllowlist = opts.config?.localMiniappAllowlist;
64
+ const localMiniappPolicy = opts.config?.localMiniappPolicy;
65
+ options = {
66
+ ...opts,
67
+ config: opts.config
68
+ ? {
69
+ ...opts.config,
70
+ localMiniappAllowlist: Array.isArray(localMiniappAllowlist)
71
+ ? Object.freeze([...localMiniappAllowlist])
72
+ : localMiniappAllowlist,
73
+ localMiniappPolicy: localMiniappPolicy
74
+ ? Object.freeze({
75
+ systemPackageNames: Array.isArray(localMiniappPolicy.systemPackageNames)
76
+ ? Object.freeze([...localMiniappPolicy.systemPackageNames])
77
+ : null,
78
+ managed: Object.freeze(localMiniappPolicy.managed.map((entry) => Object.freeze({ ...entry, sha256: entry.sha256.toLowerCase() }))),
79
+ })
80
+ : undefined,
81
+ }
82
+ : undefined,
83
+ };
25
84
  }
26
85
  /**
27
86
  * Merge host-UI seams after configure/start. UI capabilities (scan overlay,
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/runtime/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAsEH,IAAI,OAAO,GAAkC,IAAI,CAAA;AACjD,IAAI,OAAO,GAAG,KAAK,CAAA;AAEnB;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CAAC,IAA4B;IACpD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,mGAAmG,CAAC,CAAA;QACjH,OAAM;IACR,CAAC;IACD,OAAO,GAAG,IAAI,CAAA;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,EAAiB;IAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAA;QAChF,OAAM;IACR,CAAC;IACD,OAAO,GAAG,EAAC,GAAG,OAAO,EAAE,EAAE,EAAE,EAAC,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,EAAC,EAAC,CAAA;AACpD,CAAC;AAED,4CAA4C;AAC5C,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,IAAI,OAAO;QAAE,OAAM;IACnB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;IACpE,CAAC;IACD,OAAO,GAAG,IAAI,CAAA;AAChB,CAAC;AAED,6BAA6B;AAC7B,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,OAAO,GAAG,KAAK,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa;IAC3B,OAAO,GAAG,IAAI,CAAA;IACd,OAAO,GAAG,KAAK,CAAA;AACjB,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,OAAO;IACrB,OAAO,OAAO,EAAE,IAAI,IAAI,IAAI,CAAA;AAC9B,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,OAAO,EAAE,MAAM,IAAI,EAAE,CAAA;AAC9B,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,OAAO,EAAE,SAAS,IAAI,IAAI,CAAA;AACnC,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,EAAE,EAAE,IAAI,EAAE,CAAA;AAC1B,CAAC","sourcesContent":["/**\n * Bootstrap — the engine's single front door (`engine.configure` / `start` / `stop`).\n *\n * The host hands engine auth + config + analytics in one call; engine owns the\n * runtime construction behind `start()`. Internal services read this holder\n * directly instead of exposing host-facing adapter bags.\n */\n\nexport type SubjectTokenType = \"supabase\" | \"authing\" | (string & {})\n\nexport interface IslandAuth {\n /** Returns the host's current (auto-refreshed) subject token for the backend. */\n getSubjectToken: () => Promise<{token: string; type: SubjectTokenType}>\n /**\n * Optional auth-session listener. Hosts that can emit auth changes should\n * wire this so engine can reconnect backend sessions after restored login\n * state lands post-boot.\n */\n onStateChange?: (callback: (event: string, session: {token?: string | null} | null) => void) => unknown\n}\n\nexport interface IslandConfigValues {\n /** cloud-v2 core service base URL (defaults resolved by the cloud client). */\n coreUrl?: string\n /** cloud-v2 runtime service base URL. */\n runtimeUrl?: string\n /** OEM identifier (Mentra is OEM #0); reserved for OEM auth/telemetry. */\n oemId?: string\n /**\n * LC3 frame size (bytes) the phone's mic encoder emits — announced to the\n * cloud on connect (20 for G1, 40 for G2, …). Defaults to 20 if unset.\n */\n audioFrameSizeBytes?: number\n /**\n * Dev-only live Metro/LAN host used to repair persisted local-miniapp dev URLs\n * after the laptop changes networks. Omitted in production/OEM builds.\n */\n devServerHost?: () => string | undefined\n}\n\nexport type IslandAnalytics = (event: string, props?: Record<string, unknown>) => void\n\n/**\n * Named host-UI seams: engine dispatches the runtime request, the host owns the\n * screen/navigation/branding. Keep each entry a single narrow purpose — this is\n * a contract of specific UI capabilities, not a generic runtime-hook bag.\n */\nexport interface IslandUiSeams {\n /**\n * `session.glasses.requestWifiSetup` — open the host's glasses Wi-Fi setup\n * flow. Absent ⇒ miniapps get NOT_IMPLEMENTED for the request.\n */\n requestWifiSetup?: (reason?: string, packageName?: string) => Promise<void> | void\n /**\n * `session.system.scanQr` — open a phone-camera QR scanner overlay. Must NOT\n * clear miniapp foreground: UI_CLOSE on a live call hangs it up. Absent ⇒\n * miniapps get NOT_IMPLEMENTED.\n */\n scanQr?: (options?: ScanQrOptions) => Promise<ScanQrResult>\n}\n\nexport interface ScanQrOptions {\n title?: string\n hint?: string\n}\n\nexport type ScanQrResult = {data: string} | {cancelled: true}\n\nexport interface IslandConfigureOptions {\n /** REQUIRED — the only must-have seam. The host owns login; engine owns the rest. */\n auth: IslandAuth\n config?: IslandConfigValues\n analytics?: IslandAnalytics\n ui?: IslandUiSeams\n}\n\nlet options: IslandConfigureOptions | null = null\nlet started = false\n\n/**\n * Hand engine its auth + config + analytics. Call once, before `start()`.\n *\n * Reconfiguring a RUNNING runtime is not supported: services capture pieces of\n * this config as they build (e.g. the cloud client's endpoints), so swapping the\n * options mid-run would split-brain the runtime (`getAuth()`/`getConfigValues()`\n * report values the running services never consumed). Ignored with a warning\n * while started; after `stop()`, `configure()` + `start()` begin a fresh cycle.\n */\nexport function configure(opts: IslandConfigureOptions): void {\n if (started) {\n console.warn(\"engine.configure() called after engine.start(); ignored — stop() the runtime before reconfiguring\")\n return\n }\n options = opts\n}\n\n/**\n * Merge host-UI seams after configure/start. UI capabilities (scan overlay,\n * wifi setup) are looked up per request, so this is safe on a running runtime.\n * Used so Metro reloads can attach seams that missed the original configure().\n */\nexport function updateUiSeams(ui: IslandUiSeams): void {\n if (!options) {\n console.warn(\"engine.updateUiSeams() called before engine.configure(); ignored\")\n return\n }\n options = {...options, ui: {...options.ui, ...ui}}\n}\n\n/** Mark the runtime started. Idempotent. */\nexport async function start(): Promise<void> {\n if (started) return\n if (!options) {\n throw new Error(\"engine.start() called before engine.configure()\")\n }\n started = true\n}\n\n/** Tear down. Idempotent. */\nexport async function stop(): Promise<void> {\n started = false\n}\n\nexport function isStarted(): boolean {\n return started\n}\n\n/** Test-only: wipe configure state so suites can start from a cold host. */\nexport function resetForTests(): void {\n options = null\n started = false\n}\n\n/** The host-supplied auth provider, or null if not configured yet. */\nexport function getAuth(): IslandAuth | null {\n return options?.auth ?? null\n}\n\nexport function getConfigValues(): IslandConfigValues {\n return options?.config ?? {}\n}\n\nexport function getAnalytics(): IslandAnalytics | null {\n return options?.analytics ?? null\n}\n\n/** The host-supplied UI seams ({} until configure() provides them). */\nexport function getUiSeams(): IslandUiSeams {\n return options?.ui ?? {}\n}\n"]}
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/runtime/bootstrap.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Bootstrap — the engine's single front door (`engine.configure` / `start` / `stop`).\n *\n * The host hands engine auth + config + analytics in one call; engine owns the\n * runtime construction behind `start()`. Internal services read this holder\n * directly instead of exposing host-facing adapter bags.\n */\n\nexport type SubjectTokenType = \"supabase\" | \"authing\" | (string & {})\n\nexport interface IslandAuth {\n /** Returns the host's current (auto-refreshed) subject token for the backend. */\n getSubjectToken?: () => Promise<{token: string; type: SubjectTokenType}>\n /** Supplies a token issued directly for Runtime in a Core-free deployment. */\n getRuntimeToken?: (opts?: {forceRefresh?: boolean}) => Promise<string>\n /** Stable, deployment-scoped local identity for bundled miniapp storage. */\n getUserId?: () => Promise<string> | string\n /**\n * Optional auth-session listener. Hosts that can emit auth changes should\n * wire this so engine can reconnect backend sessions after restored login\n * state lands post-boot.\n */\n onStateChange?: (callback: (event: string, session: {token?: string | null} | null) => void) => unknown\n}\n\nexport interface IslandConfigValues {\n /** cloud-v2 core service base URL (defaults resolved by the cloud client). */\n coreUrl?: string | null\n /** cloud-v2 runtime service base URL. */\n runtimeUrl?: string | null\n /** Open Runtime's live WebSocket/audio session. Defaults to true. */\n runtimeRealtimeSession?: boolean\n /** Complete allowlist for bundled/local miniapps; null or omitted allows all. */\n localMiniappAllowlist?: readonly string[] | null\n /** Provenance-aware policy for workspace SYSTEM and managed miniapps. */\n localMiniappPolicy?: LocalMiniappPolicy\n /** Optional per-package configuration supplied by the host deployment. */\n miniappConfiguration?: Readonly<Record<string, Readonly<Record<string, string>>>>\n /** Deployment-scoped key for the persisted Core refresh token. */\n cloudAuthStorageKey?: string\n /** Deployment-pinned Mentra Live OTA manifest; explicit null disables remote OTA. */\n otaManifestUrl?: string | null\n /** Deployment capability policy. Omitted entries preserve consumer behavior. */\n features?: Partial<Record<IslandFeatureName, boolean>>\n /** OEM identifier (Mentra is OEM #0); reserved for OEM auth/telemetry. */\n oemId?: string\n /**\n * LC3 frame size (bytes) the phone's mic encoder emits — announced to the\n * cloud on connect (20 for G1, 40 for G2, …). Defaults to 20 if unset.\n */\n audioFrameSizeBytes?: number\n /**\n * Dev-only live Metro/LAN host used to repair persisted local-miniapp dev URLs\n * after the laptop changes networks. Omitted in production/OEM builds.\n */\n devServerHost?: () => string | undefined\n}\n\nexport interface ManagedMiniappPolicyEntry {\n packageName: string\n version: string\n sha256: string\n deploymentId: string\n deploymentOrigin: string\n}\n\nexport interface LocalMiniappPolicy {\n systemPackageNames: readonly string[] | null\n managed: readonly ManagedMiniappPolicyEntry[]\n}\n\nexport type IslandFeatureName = \"managedStreams\" | \"nativeMeetings\" | \"cloudSpeech\" | \"onDeviceSpeech\" | \"navigation\"\n\nexport type IslandAnalytics = (event: string, props?: Record<string, unknown>) => void\n\n/**\n * Named host-UI seams: engine dispatches the runtime request, the host owns the\n * screen/navigation/branding. Keep each entry a single narrow purpose — this is\n * a contract of specific UI capabilities, not a generic runtime-hook bag.\n */\nexport interface IslandUiSeams {\n /**\n * `session.glasses.requestWifiSetup` — open the host's glasses Wi-Fi setup\n * flow. Absent ⇒ miniapps get NOT_IMPLEMENTED for the request.\n */\n requestWifiSetup?: (reason?: string, packageName?: string) => Promise<void> | void\n /**\n * `session.system.scanQr` — open a phone-camera QR scanner overlay. Must NOT\n * clear miniapp foreground: UI_CLOSE on a live call hangs it up. Absent ⇒\n * miniapps get NOT_IMPLEMENTED.\n */\n scanQr?: (options?: ScanQrOptions) => Promise<ScanQrResult>\n}\n\nexport interface ScanQrOptions {\n title?: string\n hint?: string\n}\n\nexport type ScanQrResult = {data: string} | {cancelled: true}\n\nexport interface IslandConfigureOptions {\n /** REQUIRED — the only must-have seam. The host owns login; engine owns the rest. */\n auth: IslandAuth\n config?: IslandConfigValues\n analytics?: IslandAnalytics\n ui?: IslandUiSeams\n}\n\nexport function isLocalMiniappPackageAllowed(packageName: string): boolean {\n const policy = options?.config?.localMiniappPolicy\n if (policy) {\n return (\n policy.systemPackageNames === null ||\n policy.systemPackageNames.includes(packageName) ||\n policy.managed.some((entry) => entry.packageName === packageName)\n )\n }\n const allowlist = options?.config?.localMiniappAllowlist\n return allowlist == null || allowlist.includes(packageName)\n}\n\nexport function isOfflineSystemMiniappAllowed(packageName: string): boolean {\n const policy = options?.config?.localMiniappPolicy\n if (!policy) return isLocalMiniappPackageAllowed(packageName)\n return policy.systemPackageNames === null || policy.systemPackageNames.includes(packageName)\n}\n\nexport function isInstalledMiniappAllowed(\n packageName: string,\n version: string | undefined,\n releaseIdentity: {\n source: string\n bundleSha256?: string\n deploymentId?: string\n deploymentOrigin?: string\n } | null,\n): boolean {\n const policy = options?.config?.localMiniappPolicy\n if (!policy) return isLocalMiniappPackageAllowed(packageName)\n\n const systemApproved = policy.systemPackageNames === null || policy.systemPackageNames.includes(packageName)\n if (systemApproved && releaseIdentity?.source === \"bundled_asset\") return true\n if (!version || releaseIdentity?.source !== \"deployment_manifest\") return false\n\n return policy.managed.some(\n (entry) =>\n entry.packageName === packageName &&\n entry.version === version &&\n entry.sha256 === releaseIdentity.bundleSha256?.toLowerCase() &&\n entry.deploymentId === releaseIdentity.deploymentId &&\n entry.deploymentOrigin === releaseIdentity.deploymentOrigin,\n )\n}\n\n/** Read a defensive package-scoped configuration snapshot. */\nexport function getMiniappConfiguration(packageName: string): Record<string, string> {\n const configuration = options?.config?.miniappConfiguration?.[packageName]\n return configuration ? {...configuration} : {}\n}\n\nexport function isFeatureEnabled(feature: IslandFeatureName): boolean {\n return options?.config?.features?.[feature] !== false\n}\n\nlet options: IslandConfigureOptions | null = null\nlet started = false\n\n/**\n * Hand engine its auth + config + analytics. Call once, before `start()`.\n *\n * Reconfiguring a RUNNING runtime is not supported: services capture pieces of\n * this config as they build (e.g. the cloud client's endpoints), so swapping the\n * options mid-run would split-brain the runtime (`getAuth()`/`getConfigValues()`\n * report values the running services never consumed). Ignored with a warning\n * while started; after `stop()`, `configure()` + `start()` begin a fresh cycle.\n */\nexport function configure(opts: IslandConfigureOptions): void {\n if (started) {\n console.warn(\"engine.configure() called after engine.start(); ignored — stop() the runtime before reconfiguring\")\n return\n }\n const localMiniappAllowlist = opts.config?.localMiniappAllowlist\n const localMiniappPolicy = opts.config?.localMiniappPolicy\n options = {\n ...opts,\n config: opts.config\n ? {\n ...opts.config,\n localMiniappAllowlist: Array.isArray(localMiniappAllowlist)\n ? Object.freeze([...localMiniappAllowlist])\n : localMiniappAllowlist,\n localMiniappPolicy: localMiniappPolicy\n ? Object.freeze({\n systemPackageNames: Array.isArray(localMiniappPolicy.systemPackageNames)\n ? Object.freeze([...localMiniappPolicy.systemPackageNames])\n : null,\n managed: Object.freeze(\n localMiniappPolicy.managed.map((entry) =>\n Object.freeze({...entry, sha256: entry.sha256.toLowerCase()}),\n ),\n ),\n })\n : undefined,\n }\n : undefined,\n }\n}\n\n/**\n * Merge host-UI seams after configure/start. UI capabilities (scan overlay,\n * wifi setup) are looked up per request, so this is safe on a running runtime.\n * Used so Metro reloads can attach seams that missed the original configure().\n */\nexport function updateUiSeams(ui: IslandUiSeams): void {\n if (!options) {\n console.warn(\"engine.updateUiSeams() called before engine.configure(); ignored\")\n return\n }\n options = {...options, ui: {...options.ui, ...ui}}\n}\n\n/** Mark the runtime started. Idempotent. */\nexport async function start(): Promise<void> {\n if (started) return\n if (!options) {\n throw new Error(\"engine.start() called before engine.configure()\")\n }\n started = true\n}\n\n/** Tear down. Idempotent. */\nexport async function stop(): Promise<void> {\n started = false\n}\n\nexport function isStarted(): boolean {\n return started\n}\n\n/** Test-only: wipe configure state so suites can start from a cold host. */\nexport function resetForTests(): void {\n options = null\n started = false\n}\n\n/** The host-supplied auth provider, or null if not configured yet. */\nexport function getAuth(): IslandAuth | null {\n return options?.auth ?? null\n}\n\nexport function getConfigValues(): IslandConfigValues {\n return options?.config ?? {}\n}\n\nexport function getAnalytics(): IslandAnalytics | null {\n return options?.analytics ?? null\n}\n\n/** The host-supplied UI seams ({} until configure() provides them). */\nexport function getUiSeams(): IslandUiSeams {\n return options?.ui ?? {}\n}\n"]}
@@ -107,6 +107,10 @@ export interface StreamVideoConfig {
107
107
  width?: number;
108
108
  height?: number;
109
109
  bitrate?: number;
110
+ /** WHIP minimum target in bps; omitted leaves it unset. Clamped to the maximum. */
111
+ minBitrateBps?: number;
112
+ /** WHIP startup bitrate in bps, clamped to the requested bounds. */
113
+ initialBitrateBps?: number;
110
114
  fps?: number;
111
115
  }
112
116
  export interface StreamAudioConfig {
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/runtime/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/runtime/config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/runtime/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0BH;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,sBAAsB,EAAE,2BAA2B;IACnD,eAAe,EAAE,kBAAkB;IACnC,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;CACf,CAAA","sourcesContent":["/**\n * Runtime-shared constants and DTOs.\n *\n * The old host-injected runtime adapter surface has moved behind engine-owned\n * services and `engine.configure({auth, config, analytics})`. Keep this file\n * limited to stable types that are shared across those services.\n */\n\nexport type CloudClientConnectionStatus = \"connected\" | \"connecting\" | \"reconnecting\" | \"disconnected\"\nexport type CloudClientAudioTransport = \"udp\" | \"ws\" | \"offline\" | \"none\"\n\nexport interface CloudClientStatusSnapshot {\n status: CloudClientConnectionStatus\n audioTransport: CloudClientAudioTransport\n}\n\nexport interface MiniappAuthToken {\n mentraUserId: string\n tenantId?: string\n token: string\n expiresAt: number\n}\n\n/**\n * Result of an offline TTS synthesis. The engine's TTSModelManager produces\n * this directly; the type is kept exported for hosts that wrap it.\n */\nexport interface TtsSynthesisResult {\n audioUrl: string\n cleanup?: () => Promise<void> | void\n}\n\n/**\n * Stable settings keys read by engine services. Hosts must wire their own\n * settings store keys to these names. Mobile already uses these strings.\n */\nexport const ISLAND_SETTINGS_KEYS = {\n localSttFallbackActive: \"local_stt_fallback_active\",\n defaultWearable: \"default_wearable\",\n coreToken: \"core_token\",\n cameraFov: \"camera_fov\",\n} as const\n\n/**\n * Navigation event payloads. Mirror the host's NavigationService types but are\n * duplicated here so the engine module does not import host types.\n */\nexport type NavManeuverEvent = {\n kind: \"maneuver\"\n maneuverType: string\n distanceMeters: number\n fromRoad?: string | null\n toRoad?: string | null\n nextStepRoad?: string | null\n distanceToDestinationMeters?: number\n timeToDestinationSeconds?: number\n currentSpeedMps?: number | null\n speedLimitMps?: number | null\n routeHeadingDeg?: number | null\n}\nexport type NavOffRouteEvent = {kind: \"off_route\"; offRouteDistanceMeters: number}\nexport type NavReroutingEvent = {kind: \"rerouting\"}\nexport type NavArrivedEvent = {kind: \"arrived\"}\nexport type NavErrorEvent = {kind: \"error\"; message: string}\nexport type NavUpdate = NavManeuverEvent | NavOffRouteEvent | NavReroutingEvent | NavArrivedEvent | NavErrorEvent\n\nexport type NavLocation = {\n lat: number\n lng: number\n accuracy: number | null\n timestamp: number\n}\n\nexport type NavRouteStep = {\n lat: number\n lng: number\n routeIndex: number\n road: string | null\n maneuver: string\n distanceMeters: number\n}\nexport type NavRoute = {\n points: Array<{lat: number; lng: number}>\n steps?: NavRouteStep[]\n}\n\nexport type NavTripSnapshot = {\n active: boolean\n mode?: string\n stops?: Array<{lat: number; lng: number}>\n currentStopIndex?: number\n route?: NavRoute\n maneuver?: NavManeuverEvent\n distanceToDestinationMeters?: number\n timeToDestinationSeconds?: number\n currentSpeedMps?: number | null\n speedLimitMps?: number | null\n}\n\nexport interface StreamVideoConfig {\n width?: number\n height?: number\n bitrate?: number\n fps?: number\n}\n\nexport interface StreamAudioConfig {\n bitrate?: number\n sampleRate?: number\n echoCancellation?: boolean\n noiseSuppression?: boolean\n}\n\nexport type CameraRoiPosition = \"center\" | \"bottom\" | \"top\"\nexport type CameraFovPreset = \"narrow\" | \"standard\" | \"wide\"\n\nexport type CameraFovRequest =\n | {\n fov: number\n roiPosition?: CameraRoiPosition\n }\n | {\n preset: CameraFovPreset\n }\n\nexport interface CameraFovResult {\n requestId: string\n fov: number\n roiPosition: CameraRoiPosition\n timestamp: number\n}\n\n/** One audited inter-miniapp call. */\nexport interface InteropAuditEvent {\n /** The system app that made the call. */\n caller: string\n op: \"list\" | \"start\" | \"stop\" | \"invoke\"\n /** Target miniapp (start/stop/invoke). */\n target?: string\n /** Action id (invoke only). */\n actionId?: string\n /** True if the call was permitted and accepted; false on denial / pre-flight failure. */\n ok: boolean\n /** MiniappErrorCode when ok is false. */\n errorCode?: string\n}\n\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/runtime/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0BH;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,sBAAsB,EAAE,2BAA2B;IACnD,eAAe,EAAE,kBAAkB;IACnC,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;CACf,CAAA","sourcesContent":["/**\n * Runtime-shared constants and DTOs.\n *\n * The old host-injected runtime adapter surface has moved behind engine-owned\n * services and `engine.configure({auth, config, analytics})`. Keep this file\n * limited to stable types that are shared across those services.\n */\n\nexport type CloudClientConnectionStatus = \"connected\" | \"connecting\" | \"reconnecting\" | \"disconnected\"\nexport type CloudClientAudioTransport = \"udp\" | \"ws\" | \"offline\" | \"none\"\n\nexport interface CloudClientStatusSnapshot {\n status: CloudClientConnectionStatus\n audioTransport: CloudClientAudioTransport\n}\n\nexport interface MiniappAuthToken {\n mentraUserId: string\n tenantId?: string\n token: string\n expiresAt: number\n}\n\n/**\n * Result of an offline TTS synthesis. The engine's TTSModelManager produces\n * this directly; the type is kept exported for hosts that wrap it.\n */\nexport interface TtsSynthesisResult {\n audioUrl: string\n cleanup?: () => Promise<void> | void\n}\n\n/**\n * Stable settings keys read by engine services. Hosts must wire their own\n * settings store keys to these names. Mobile already uses these strings.\n */\nexport const ISLAND_SETTINGS_KEYS = {\n localSttFallbackActive: \"local_stt_fallback_active\",\n defaultWearable: \"default_wearable\",\n coreToken: \"core_token\",\n cameraFov: \"camera_fov\",\n} as const\n\n/**\n * Navigation event payloads. Mirror the host's NavigationService types but are\n * duplicated here so the engine module does not import host types.\n */\nexport type NavManeuverEvent = {\n kind: \"maneuver\"\n maneuverType: string\n distanceMeters: number\n fromRoad?: string | null\n toRoad?: string | null\n nextStepRoad?: string | null\n distanceToDestinationMeters?: number\n timeToDestinationSeconds?: number\n currentSpeedMps?: number | null\n speedLimitMps?: number | null\n routeHeadingDeg?: number | null\n}\nexport type NavOffRouteEvent = {kind: \"off_route\"; offRouteDistanceMeters: number}\nexport type NavReroutingEvent = {kind: \"rerouting\"}\nexport type NavArrivedEvent = {kind: \"arrived\"}\nexport type NavErrorEvent = {kind: \"error\"; message: string}\nexport type NavUpdate = NavManeuverEvent | NavOffRouteEvent | NavReroutingEvent | NavArrivedEvent | NavErrorEvent\n\nexport type NavLocation = {\n lat: number\n lng: number\n accuracy: number | null\n timestamp: number\n}\n\nexport type NavRouteStep = {\n lat: number\n lng: number\n routeIndex: number\n road: string | null\n maneuver: string\n distanceMeters: number\n}\nexport type NavRoute = {\n points: Array<{lat: number; lng: number}>\n steps?: NavRouteStep[]\n}\n\nexport type NavTripSnapshot = {\n active: boolean\n mode?: string\n stops?: Array<{lat: number; lng: number}>\n currentStopIndex?: number\n route?: NavRoute\n maneuver?: NavManeuverEvent\n distanceToDestinationMeters?: number\n timeToDestinationSeconds?: number\n currentSpeedMps?: number | null\n speedLimitMps?: number | null\n}\n\nexport interface StreamVideoConfig {\n width?: number\n height?: number\n bitrate?: number\n /** WHIP minimum target in bps; omitted leaves it unset. Clamped to the maximum. */\n minBitrateBps?: number\n /** WHIP startup bitrate in bps, clamped to the requested bounds. */\n initialBitrateBps?: number\n fps?: number\n}\n\nexport interface StreamAudioConfig {\n bitrate?: number\n sampleRate?: number\n echoCancellation?: boolean\n noiseSuppression?: boolean\n}\n\nexport type CameraRoiPosition = \"center\" | \"bottom\" | \"top\"\nexport type CameraFovPreset = \"narrow\" | \"standard\" | \"wide\"\n\nexport type CameraFovRequest =\n | {\n fov: number\n roiPosition?: CameraRoiPosition\n }\n | {\n preset: CameraFovPreset\n }\n\nexport interface CameraFovResult {\n requestId: string\n fov: number\n roiPosition: CameraRoiPosition\n timestamp: number\n}\n\n/** One audited inter-miniapp call. */\nexport interface InteropAuditEvent {\n /** The system app that made the call. */\n caller: string\n op: \"list\" | \"start\" | \"stop\" | \"invoke\"\n /** Target miniapp (start/stop/invoke). */\n target?: string\n /** Action id (invoke only). */\n actionId?: string\n /** True if the call was permitted and accepted; false on denial / pre-flight failure. */\n ok: boolean\n /** MiniappErrorCode when ok is false. */\n errorCode?: string\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"streamConfig.d.ts","sourceRoot":"","sources":["../../src/runtime/streamConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,iBAAiB,EAAE,iBAAiB,EAAC,MAAM,UAAU,CAAA;AAQlE,eAAO,MAAM,0BAA0B,GAAI,OAAO,OAAO,KAAG,iBAAiB,GAAG,SAa/E,CAAA;AAED,eAAO,MAAM,0BAA0B,GAAI,OAAO,OAAO,KAAG,iBAAiB,GAAG,SAU/E,CAAA;AAED,qFAAqF;AACrF,eAAO,MAAM,qBAAqB,GAAI,OAAO,OAAO,EAAE,kBAAe,KAAG,OACzB,CAAA;AAE/C;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAC9B,SAAS,OAAO,EAChB,QAAQ,SAAS,GAAG,OAAO,KAC1B,OAAuE,CAAA"}
1
+ {"version":3,"file":"streamConfig.d.ts","sourceRoot":"","sources":["../../src/runtime/streamConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,iBAAiB,EAAE,iBAAiB,EAAC,MAAM,UAAU,CAAA;AAQlE,eAAO,MAAM,0BAA0B,GAAI,OAAO,OAAO,KAAG,iBAAiB,GAAG,SAiB/E,CAAA;AAED,eAAO,MAAM,0BAA0B,GAAI,OAAO,OAAO,KAAG,iBAAiB,GAAG,SAU/E,CAAA;AAED,qFAAqF;AACrF,eAAO,MAAM,qBAAqB,GAAI,OAAO,OAAO,EAAE,kBAAe,KAAG,OACzB,CAAA;AAE/C;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAC9B,SAAS,OAAO,EAChB,QAAQ,SAAS,GAAG,OAAO,KAC1B,OAAuE,CAAA"}
@@ -7,6 +7,8 @@ export const normalizeStreamVideoConfig = (value) => {
7
7
  const width = finiteNumber(value.width);
8
8
  const height = finiteNumber(value.height);
9
9
  const bitrate = finiteNumber(value.bitrate);
10
+ const minBitrateBps = finiteNumber(value.minBitrateBps);
11
+ const initialBitrateBps = finiteNumber(value.initialBitrateBps);
10
12
  const frameRate = finiteNumber(value.frameRate);
11
13
  const fps = frameRate ?? finiteNumber(value.fps);
12
14
  if (width !== undefined)
@@ -15,6 +17,10 @@ export const normalizeStreamVideoConfig = (value) => {
15
17
  config.height = height;
16
18
  if (bitrate !== undefined)
17
19
  config.bitrate = bitrate;
20
+ if (minBitrateBps !== undefined)
21
+ config.minBitrateBps = Math.max(0, Math.trunc(minBitrateBps));
22
+ if (initialBitrateBps !== undefined)
23
+ config.initialBitrateBps = Math.max(0, Math.trunc(initialBitrateBps));
18
24
  if (fps !== undefined)
19
25
  config.fps = fps;
20
26
  return Object.keys(config).length > 0 ? config : undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"streamConfig.js","sourceRoot":"","sources":["../../src/runtime/streamConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import type {StreamAudioConfig, StreamVideoConfig} from \"./config\"\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst finiteNumber = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) ? value : undefined\n\nexport const normalizeStreamVideoConfig = (value: unknown): StreamVideoConfig | undefined => {\n if (!isRecord(value)) return undefined\n const config: StreamVideoConfig = {}\n const width = finiteNumber(value.width)\n const height = finiteNumber(value.height)\n const bitrate = finiteNumber(value.bitrate)\n const frameRate = finiteNumber(value.frameRate)\n const fps = frameRate ?? finiteNumber(value.fps)\n if (width !== undefined) config.width = width\n if (height !== undefined) config.height = height\n if (bitrate !== undefined) config.bitrate = bitrate\n if (fps !== undefined) config.fps = fps\n return Object.keys(config).length > 0 ? config : undefined\n}\n\nexport const normalizeStreamAudioConfig = (value: unknown): StreamAudioConfig | undefined => {\n if (!isRecord(value)) return undefined\n const config: StreamAudioConfig = {}\n const bitrate = finiteNumber(value.bitrate)\n const sampleRate = finiteNumber(value.sampleRate)\n if (bitrate !== undefined) config.bitrate = bitrate\n if (sampleRate !== undefined) config.sampleRate = sampleRate\n if (typeof value.echoCancellation === \"boolean\") config.echoCancellation = value.echoCancellation\n if (typeof value.noiseSuppression === \"boolean\") config.noiseSuppression = value.noiseSuppression\n return Object.keys(config).length > 0 ? config : undefined\n}\n\n/** Absent or non-boolean values keep the caller-supplied fallback (default true). */\nexport const normalizeCaptureAudio = (value: unknown, fallback = true): boolean =>\n typeof value === \"boolean\" ? value : fallback\n\n/**\n * Glasses capture is locked to the ACS source for the WHIP session.\n * Phone/bluetooth never encode the glasses mic, even if a miniapp asks for it.\n */\nexport const resolveCaptureAudio = (\n payload: unknown,\n source: \"glasses\" | \"phone\",\n): boolean => source === \"glasses\" && normalizeCaptureAudio(payload, true)\n"]}
1
+ {"version":3,"file":"streamConfig.js","sourceRoot":"","sources":["../../src/runtime/streamConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import type {StreamAudioConfig, StreamVideoConfig} from \"./config\"\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst finiteNumber = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) ? value : undefined\n\nexport const normalizeStreamVideoConfig = (value: unknown): StreamVideoConfig | undefined => {\n if (!isRecord(value)) return undefined\n const config: StreamVideoConfig = {}\n const width = finiteNumber(value.width)\n const height = finiteNumber(value.height)\n const bitrate = finiteNumber(value.bitrate)\n const minBitrateBps = finiteNumber(value.minBitrateBps)\n const initialBitrateBps = finiteNumber(value.initialBitrateBps)\n const frameRate = finiteNumber(value.frameRate)\n const fps = frameRate ?? finiteNumber(value.fps)\n if (width !== undefined) config.width = width\n if (height !== undefined) config.height = height\n if (bitrate !== undefined) config.bitrate = bitrate\n if (minBitrateBps !== undefined) config.minBitrateBps = Math.max(0, Math.trunc(minBitrateBps))\n if (initialBitrateBps !== undefined) config.initialBitrateBps = Math.max(0, Math.trunc(initialBitrateBps))\n if (fps !== undefined) config.fps = fps\n return Object.keys(config).length > 0 ? config : undefined\n}\n\nexport const normalizeStreamAudioConfig = (value: unknown): StreamAudioConfig | undefined => {\n if (!isRecord(value)) return undefined\n const config: StreamAudioConfig = {}\n const bitrate = finiteNumber(value.bitrate)\n const sampleRate = finiteNumber(value.sampleRate)\n if (bitrate !== undefined) config.bitrate = bitrate\n if (sampleRate !== undefined) config.sampleRate = sampleRate\n if (typeof value.echoCancellation === \"boolean\") config.echoCancellation = value.echoCancellation\n if (typeof value.noiseSuppression === \"boolean\") config.noiseSuppression = value.noiseSuppression\n return Object.keys(config).length > 0 ? config : undefined\n}\n\n/** Absent or non-boolean values keep the caller-supplied fallback (default true). */\nexport const normalizeCaptureAudio = (value: unknown, fallback = true): boolean =>\n typeof value === \"boolean\" ? value : fallback\n\n/**\n * Glasses capture is locked to the ACS source for the WHIP session.\n * Phone/bluetooth never encode the glasses mic, even if a miniapp asks for it.\n */\nexport const resolveCaptureAudio = (\n payload: unknown,\n source: \"glasses\" | \"phone\",\n): boolean => source === \"glasses\" && normalizeCaptureAudio(payload, true)\n"]}