@mentra/engine 3.4.0-dev.1208 → 3.4.0-dev.1210
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/facades/glasses.d.ts.map +1 -1
- package/build/facades/glasses.js +5 -3
- package/build/facades/glasses.js.map +1 -1
- package/build/generated/releaseMetadata.js +5 -5
- package/build/generated/releaseMetadata.js.map +1 -1
- package/build/services/AppRegistry.d.ts +2 -0
- package/build/services/AppRegistry.d.ts.map +1 -1
- package/build/services/AppRegistry.js.map +1 -1
- package/build/services/LocalMiniappRuntime.d.ts +2 -0
- package/build/services/LocalMiniappRuntime.d.ts.map +1 -1
- package/build/services/LocalMiniappRuntime.js +18 -1
- package/build/services/LocalMiniappRuntime.js.map +1 -1
- package/build/services/MentraJSCrashController.d.ts +2 -0
- package/build/services/MentraJSCrashController.d.ts.map +1 -1
- package/build/services/MentraJSCrashController.js +4 -0
- package/build/services/MentraJSCrashController.js.map +1 -1
- package/build/services/MentraJSRouter.d.ts.map +1 -1
- package/build/services/MentraJSRouter.js +14 -3
- package/build/services/MentraJSRouter.js.map +1 -1
- package/build/services/MiniappEngine.d.ts.map +1 -1
- package/build/services/MiniappEngine.js +2 -0
- package/build/services/MiniappEngine.js.map +1 -1
- package/build/services/MiniappLauncher.d.ts +24 -2
- package/build/services/MiniappLauncher.d.ts.map +1 -1
- package/build/services/MiniappLauncher.js +58 -6
- package/build/services/MiniappLauncher.js.map +1 -1
- package/build/services/fleet/FleetReporter.d.ts.map +1 -1
- package/build/services/fleet/FleetReporter.js +43 -0
- package/build/services/fleet/FleetReporter.js.map +1 -1
- package/build/services/fleet/fleetCollector.d.ts +1 -1
- package/build/services/fleet/fleetCollector.d.ts.map +1 -1
- package/build/services/fleet/fleetCollector.js +146 -5
- package/build/services/fleet/fleetCollector.js.map +1 -1
- package/build/services/fleet/fleetEvents.d.ts +39 -3
- package/build/services/fleet/fleetEvents.d.ts.map +1 -1
- package/build/services/fleet/fleetEvents.js +66 -22
- package/build/services/fleet/fleetEvents.js.map +1 -1
- package/build/services/fleet/fleetQueue.d.ts +26 -0
- package/build/services/fleet/fleetQueue.d.ts.map +1 -1
- package/build/services/fleet/fleetQueue.js +94 -8
- package/build/services/fleet/fleetQueue.js.map +1 -1
- package/build/services/fleet/telemetryLimits.d.ts +16 -0
- package/build/services/fleet/telemetryLimits.d.ts.map +1 -0
- package/build/services/fleet/telemetryLimits.js +69 -0
- package/build/services/fleet/telemetryLimits.js.map +1 -0
- package/build/services/installMiniapp.d.ts +13 -0
- package/build/services/installMiniapp.d.ts.map +1 -1
- package/build/services/installMiniapp.js +64 -1
- package/build/services/installMiniapp.js.map +1 -1
- package/build/services/miniappReleaseInstall.js +1 -1
- package/build/services/miniappReleaseInstall.js.map +1 -1
- package/build/stores/apps.d.ts.map +1 -1
- package/build/stores/apps.js +16 -1
- package/build/stores/apps.js.map +1 -1
- package/package.json +8 -8
- package/src/facades/glasses.ts +5 -3
- package/src/generated/releaseMetadata.ts +5 -5
- package/src/services/AppRegistry.ts +2 -0
- package/src/services/LocalMiniappRuntime.ts +20 -1
- package/src/services/MentraJSCrashController.ts +5 -0
- package/src/services/MentraJSRouter.ts +15 -3
- package/src/services/MiniappEngine.ts +2 -0
- package/src/services/MiniappLauncher.ts +58 -5
- package/src/services/fleet/FleetReporter.ts +40 -0
- package/src/services/fleet/fleetCollector.ts +160 -6
- package/src/services/fleet/fleetEvents.ts +104 -20
- package/src/services/fleet/fleetQueue.ts +100 -7
- package/src/services/fleet/telemetryLimits.ts +78 -0
- package/src/services/installMiniapp.ts +78 -2
- package/src/services/miniappReleaseInstall.ts +1 -1
- package/src/stores/apps.ts +19 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppRegistry.js","sourceRoot":"","sources":["../../src/services/AppRegistry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AppRegistry — on-disk install/uninstall registry for local miniapps.\n *\n * Owns the `Documents/lmas/<packageName>/<version>/` filesystem layout, the\n * one installer every source uses (QR/manual releases, bundled ZIPs,\n * deployment-managed releases, dev snapshots), and the active-version pointer\n * in MMKV. It does NOT touch the apps store directly — instead it notifies\n * subscribers when the install set changes, so the host (mobile manager, OEM\n * app) can refresh its own state.\n *\n * Every install validates the archive, applies the publisher signer rule and\n * the version rule (never lower than an installed release), and activates the\n * bundle and its registry metadata in one serialized, crash-recoverable\n * transaction. See {@link InstallBundleOptions}.\n *\n * Public surface:\n * - installFromUrl(url, opts?) install/replace a miniapp from a URL\n * - installFromLocalZip(path, opts?) install/replace from a local zip\n * - uninstall(packageName, version?) remove one or all versions\n * - getInstalledMiniapps() ClientApp[] derived from disk\n * - getActiveVersion(packageName) active version string for a package\n * - getPublisherKeyFingerprint(pkg) recorded publisher signer, if any\n * - getLatestDevSnapshotVersion(pkg) newest on-disk `dev-*` snapshot\n * - getBundleDir / getMiniappManifest filesystem helpers used by hosts\n * - subscribe(fn) register a refresh listener\n */\n\nimport {fetch as expoFetch} from \"expo/fetch\"\nimport {Directory, Paths, File} from \"expo-file-system\"\nimport {unzip} from \"react-native-zip-archive\"\nimport {createMMKV, type MMKV} from \"react-native-mmkv\"\nimport semver from \"semver\"\nimport {AsyncResult, Result, result as Res} from \"typesafe-ts\"\n\nimport type {AppletType, ClientApp} from \"../types/applet\"\nimport {HardwareRequirement, HardwareRequirementLevel, HardwareType} from \"../types\"\nimport {readBoundedByteStream} from \"../utils/boundedByteStream\"\nimport {configuredDevHost} from \"../utils/configuredDevHost\"\nimport {invalidateDevSnapshotRequests} from \"../utils/devSnapshotRequests\"\nimport {storage} from \"../utils/storage/storage\"\nimport {printDirectory} from \"../utils/storage/zip\"\nimport {sha256Hex} from \"../utils/sha256\"\nimport {\n assertMiniappDevelopmentAllowed,\n getConfigValues,\n isDevMiniappAllowed,\n isInstalledMiniappAllowed,\n isLocalMiniappPackageAllowed,\n isMiniappAvailable,\n isOfflineSystemMiniappAllowed,\n} from \"../runtime/bootstrap\"\nimport {\n type ActivatedInstall,\n type ActivationArtifact,\n type InstallFinalization,\n completeInstallFilesystemTransaction,\n installedVersionDirectoryNames,\n interruptedActivationRecovery,\n isInstallScratchDirectoryName,\n nextInstallOperationId,\n parseActivationArtifact,\n runInstallFilesystemTransaction,\n} from \"./installOperation\"\nimport {checkManifestVersions} from \"./manifestVersionGate\"\nimport {linkedEntry} from \"./miniappFiles\"\nimport {checkMiniappRunsOnPhone, type MiniappVersionPolicy} from \"./miniappInstallCompatibility\"\nimport {normalizeManifestActions} from \"./manifestActions\"\nimport {normalizeManifestPermissions} from \"./manifestPermissions\"\nimport {isFileUriInside} from \"./miniappPaths\"\nimport {\n assertMiniappUpdateVersion,\n miniappInstallIdentityError,\n type MiniappInstallExpectations,\n} from \"./miniappInstallIdentity\"\nimport {\n forgetDevSnapshotOwner,\n isAssignedByCurrentWorkspace,\n isDevelopmentSelectionCurrent,\n isDevSnapshotOfCurrentContext,\n isDevSnapshotVisible,\n recordDevSnapshotOwner,\n restoreStashedDevelopmentSelection,\n stashedDevelopmentSelectionOf,\n type StashedDevelopmentSelection,\n} from \"./miniappDataPartition\"\nimport {miniappRunningRegistry} from \"./MiniappRunningRegistry\"\nimport {assertPublisherIdentityPolicy, assertUnsignedDevBuildAllowed} from \"./publisherIdentityPolicy\"\nimport {selectReleaseVersionsForGarbageCollection} from \"./releaseVersionGc\"\nimport {sameMiniappBundle} from \"./sameMiniappBundle\"\nimport {validateInstallBundleArchive} from \"./validateInstallBundle\"\n\nexport {normalizeManifestActions} from \"./manifestActions\"\nexport {normalizeManifestPermissions} from \"./manifestPermissions\"\nexport {SignedMiniappDevBuildError} from \"./publisherIdentityPolicy\"\n\nfunction normalizeManifestType(raw: unknown): AppletType {\n return raw === \"background\" || raw === \"system_dashboard\" || raw === \"standard\" ? raw : \"standard\"\n}\n\n/**\n * Convert declared hardwareRequirements from a miniapp.json manifest into\n * runtime `HardwareRequirement[]`, always appending `{EXIST, REQUIRED}` so\n * launchers show \"Glasses Required\" when no glasses are connected.\n *\n * Malformed entries are dropped with a single warning per package so the\n * rest of the manifest still works.\n */\nexport function buildHardwareRequirements(\n raw: Array<{type: string; level: string; description?: string}> | undefined,\n packageName: string,\n): HardwareRequirement[] {\n const out: HardwareRequirement[] = []\n const validTypes = new Set(Object.values(HardwareType) as string[])\n const validLevels = new Set(Object.values(HardwareRequirementLevel) as string[])\n\n if (!Array.isArray(raw)) {\n if (raw !== undefined) {\n console.warn(`APP_REGISTRY: ${packageName} has invalid hardwareRequirements (not an array); treating as []`)\n }\n } else {\n let warned = false\n for (const r of raw) {\n if (\n !r ||\n typeof r !== \"object\" ||\n typeof r.type !== \"string\" ||\n typeof r.level !== \"string\" ||\n !validTypes.has(r.type) ||\n !validLevels.has(r.level)\n ) {\n if (!warned) {\n console.warn(\n `APP_REGISTRY: ${packageName} has malformed hardwareRequirements entry; skipping invalid entries`,\n r,\n )\n warned = true\n }\n continue\n }\n out.push({\n type: r.type as HardwareType,\n level: r.level as HardwareRequirementLevel,\n ...(typeof r.description === \"string\" ? {description: r.description} : {}),\n })\n }\n }\n\n // Every miniapp requires connected glasses.\n out.push({type: HardwareType.EXIST, level: HardwareRequirementLevel.REQUIRED})\n return out\n}\n\ninterface InstalledInfo {\n name: string\n logoUrl: string\n}\n\ninterface InstalledLma {\n packageName: string\n versions: Record<string, InstalledInfo>\n}\n\n/**\n * Where an installed release came from. `url`: installed from the miniapp's own URL (`sourceUrl`).\n * `direct_download`: a release Fleet installed from a resolved URL, or a release QR on an earlier Mentra App.\n * `bundled_asset`: the ZIP this build ships.\n * `deployment_manifest`: a workspace's deployment manifest. `dev_snapshot`: a development build. `local`: a\n * local-network build or a release QR (`sourceUrl` is its address), always a `dev-*` development snapshot: it never\n * updates from a URL, never gets system privileges, keeps its data apart and gets tokens marked as a local build.\n */\nexport type MiniappReleaseSource =\n | \"direct_download\"\n | \"bundled_asset\"\n | \"deployment_manifest\"\n | \"dev_snapshot\"\n | \"local\"\n | \"url\"\n\n/**\n * Sources only releases that earlier Mentra Apps installed carry: read, never written. `store`: installed by a\n * bundled Store. `system_store`: a bundled package a Store updated. `preinstalled_registry`: installed by Core's\n * retired preinstall registry.\n */\nexport type RetiredMiniappReleaseSource = \"preinstalled_registry\" | \"store\" | \"system_store\"\n\nexport interface MiniappReleaseIdentity {\n source: MiniappReleaseSource | RetiredMiniappReleaseSource\n /** The miniapp URL (`url` and `local` releases): the base that serves `miniapp.json`, ending in `/`. */\n sourceUrl?: string\n /** `url` releases: the miniapp's server asked for sign-in, for `miniapp.json` or the ZIP. */\n private?: boolean\n bundleSha256?: string\n /** The Store that installed this release, and its release id and channel (`store` / `system_store`, read only). */\n storePackageName?: string\n releaseId?: string\n channel?: string\n deploymentId?: string\n deploymentOrigin?: string\n /**\n * Verified Ed25519 publisher fingerprint from the bundle's\n * `META-INF/MENTRA.SIG`. Set only by the installer after verification.\n */\n publisherKeyFingerprint?: string\n}\n\n/** The identity an install records: a current source, and none of the retired Store's fields. */\nexport type InstallableReleaseIdentity = Omit<\n MiniappReleaseIdentity,\n \"source\" | \"storePackageName\" | \"releaseId\" | \"channel\"\n> & {source: MiniappReleaseSource}\n\n/**\n * Why a package is installed (the provisioning spec's installation reasons). Kept apart from the artifact's\n * provenance, {@link MiniappReleaseIdentity.source}: a package installs once and may hold several reasons, and the\n * `assignment` reason never appears in `source`.\n */\nexport type MiniappInstallReason = \"bundled\" | \"explicit\" | \"manifest\" | \"assignment\"\nexport const MINIAPP_INSTALL_REASONS: readonly MiniappInstallReason[] = [\n \"bundled\",\n \"explicit\",\n \"manifest\",\n \"assignment\",\n]\n\n/** The Fleet assignment behind a package's `assignment` reason. */\nexport interface MiniappAssignment {\n assignmentId: string\n assignmentRevision: number\n workspaceId: string\n /** The Core and account the assignment was made to. Its data partition belongs to them. */\n coreUrl: string\n mentraUserId: string\n url: string\n}\n\ninterface StoredInstallReasons {\n reasons: MiniappInstallReason[]\n assignment?: MiniappAssignment\n}\n\n/** Options shared by every install entry point. */\nexport interface InstallBundleOptions {\n /**\n * Install under this version instead of `manifest.version`. The dev caching\n * path uses `dev-<ms>` so snapshots coexist with semver-installed versions.\n */\n versionOverride?: string\n /** Recorded with the release. Installs write only current sources. */\n releaseIdentity?: InstallableReleaseIdentity\n /** The archive's manifest must name this package. */\n expectedPackageName?: string\n /** The archive's manifest must declare this version. */\n expectedVersion?: string\n /** Refuse to overwrite a version that is already installed. */\n rejectExistingVersion?: boolean\n /** The downloaded ZIP must have this SHA-256 (the one its `miniapp.json` or manifest names). */\n expectedBundleSha256?: string\n /**\n * Remote installs: fetch the ZIP's bytes this way instead of with an anonymous request, for a miniapp URL whose\n * server may ask for sign-in. It runs before the release identity is read, so it may complete that identity. The\n * installer still checks the size and `expectedBundleSha256` of what it returns.\n */\n downloadBundle?: (url: string) => Promise<Uint8Array>\n /** Refuse a bundle this host cannot run. Hardware is the glasses' business, and never refuses an install. */\n compatibilityPolicy?: MiniappVersionPolicy\n onProgress?: (phase: InstallProgressPhase) => void\n /**\n * Runs once the bundle is downloaded, verified, checked against the signer,\n * version and compatibility rules, and unpacked, before the serialized\n * activation. It may wait (for example for the user's consent) without\n * holding up other installs. Throwing discards the unpacked files.\n */\n whenStaged?: () => Promise<void>\n /**\n * Synchronous check run inside the serialized install, after extraction and\n * immediately before installed files change. Throwing aborts the install\n * and leaves the previous installation untouched.\n */\n beforeActivate?: () => void\n /**\n * Add this installation reason in the same metadata commit as the bundle. With `assignment`, `assignment` must\n * name it. Without either, the package's reasons are unchanged.\n */\n installReason?: MiniappInstallReason\n assignment?: MiniappAssignment\n}\n\nexport type InstallProgressPhase = \"downloading\" | \"verifying\" | \"extracting\" | \"activating\"\n\nexport interface UninstallOptions {\n /**\n * Runs inside the serialized uninstall, before anything is removed. Throwing keeps the package as it is: a caller\n * that checked what it may remove checks again here, where no install can change it.\n */\n beforeRemove?: () => void\n}\n\n/** Local ZIP installs may additionally adopt an identical, already installed bundle. */\nexport interface LocalZipInstallOptions extends InstallBundleOptions {\n /** Host-only migration after the deployment ZIP's digest is verified. */\n adoptIdenticalInstalledVersion?: boolean\n}\n\nconst MAX_REMOTE_BUNDLE_BYTES = 50 * 1024 * 1024\nconst REMOTE_BUNDLE_TIMEOUT_MS = 45_000\nconst INSTALL_METADATA_ROLLBACK_FILE = \"metadata-rollback.json\"\n\nfunction releaseIdentityKey(packageName: string, version: string): string {\n return `miniapp_release_identity:${packageName}:${version}`\n}\n\nfunction publisherIdentityKey(packageName: string): string {\n return `miniapp_publisher_identity:${packageName}`\n}\n\nfunction activeVersionKey(packageName: string): string {\n return `${packageName}_active_version`\n}\n\nfunction installReasonsKey(packageName: string): string {\n return `miniapp_install_reasons:${packageName}`\n}\n\nfunction revokedAccessKey(packageName: string): string {\n return `miniapp_access_revoked:${packageName}`\n}\n\ninterface StorageSnapshot<T> {\n present: boolean\n value?: T\n}\n\n// Live-dev routing for a package. A release install clears it in the same\n// metadata transaction that activates the release, so an interrupted install\n// can never leave a committed release shadowed by its old dev registration.\nconst DEV_ROUTING_FIELDS = [\"meta\", \"url\", \"port\", \"mdns\", \"last_reachable\", \"selected_snapshot\"] as const\ntype DevRoutingSnapshot = Record<(typeof DEV_ROUTING_FIELDS)[number], StorageSnapshot<unknown>>\n\n/** Written into the pending activation marker before any metadata changes. */\ninterface InstallMetadataRollbackJournal {\n schemaVersion: 1\n packageName: string\n version: string\n publisher: StorageSnapshot<string>\n release: StorageSnapshot<MiniappReleaseIdentity>\n active: StorageSnapshot<string>\n devRouting?: DevRoutingSnapshot\n /** The current context's stashed selection of the package, which a release install empties (see finalizeInstall). */\n devStash?: StashedDevelopmentSelection\n reasons?: StorageSnapshot<StoredInstallReasons>\n}\n\nfunction isStashedDevelopmentSelection(value: unknown): value is StashedDevelopmentSelection {\n const stash = value as Partial<StashedDevelopmentSelection> | null\n return (\n Boolean(stash) &&\n typeof stash!.contextId === \"string\" &&\n Boolean(stash!.selection) &&\n typeof stash!.selection === \"object\" &&\n !Array.isArray(stash!.selection)\n )\n}\n\nfunction snapshotStorage<T>(key: string): StorageSnapshot<T> {\n const loaded = storage.load<T>(key)\n return loaded.is_ok() ? {present: true, value: loaded.value} : {present: false}\n}\n\nfunction restoreStorage<T>(key: string, snapshot: StorageSnapshot<T>): void {\n if (!snapshot.present) {\n const removed = storage.remove(key)\n if (removed.is_error()) throw removed.error\n return\n }\n const restored = storage.save(key, snapshot.value)\n if (restored.is_error()) throw restored.error\n}\n\nfunction isStorageSnapshot(value: unknown, valueType: \"object\" | \"string\" | \"any\"): value is StorageSnapshot<unknown> {\n if (!value || typeof value !== \"object\" || typeof (value as {present?: unknown}).present !== \"boolean\") return false\n const snapshot = value as {present: boolean; value?: unknown}\n if (!snapshot.present) return true\n if (valueType === \"any\") return Object.prototype.hasOwnProperty.call(snapshot, \"value\")\n return valueType === \"string\"\n ? typeof snapshot.value === \"string\"\n : Boolean(snapshot.value && typeof snapshot.value === \"object\" && !Array.isArray(snapshot.value))\n}\n\nfunction readMetadataRollbackJournal(\n pendingDir: Directory,\n packageName: string,\n version: string,\n): InstallMetadataRollbackJournal | null {\n try {\n const file = new File(pendingDir, INSTALL_METADATA_ROLLBACK_FILE)\n if (!file.exists) return null\n const parsed = JSON.parse(file.textSync()) as Partial<InstallMetadataRollbackJournal>\n if (\n parsed.schemaVersion !== 1 ||\n parsed.packageName !== packageName ||\n parsed.version !== version ||\n !isStorageSnapshot(parsed.publisher, \"string\") ||\n !isStorageSnapshot(parsed.release, \"object\") ||\n !isStorageSnapshot(parsed.active, \"string\") ||\n (parsed.reasons !== undefined && !isStorageSnapshot(parsed.reasons, \"object\")) ||\n (parsed.devStash !== undefined && !isStashedDevelopmentSelection(parsed.devStash)) ||\n (parsed.devRouting !== undefined &&\n (!parsed.devRouting ||\n DEV_ROUTING_FIELDS.some((field) => !isStorageSnapshot(parsed.devRouting?.[field], \"any\"))))\n ) {\n console.warn(`APP_REGISTRY: ignoring invalid metadata rollback journal for ${packageName}@${version}`)\n return null\n }\n return parsed as InstallMetadataRollbackJournal\n } catch (error) {\n // Metadata writes start only after this file has been written successfully,\n // so a missing/corrupt journal means there is no partial metadata commit to\n // undo. Filesystem rollback remains safe and authoritative.\n console.warn(`APP_REGISTRY: could not read metadata rollback journal for ${packageName}@${version}`, error)\n return null\n }\n}\n\n// Bundle files survive logout; their provenance and publisher must survive with\n// them. Keep installation metadata out of the default, session-cleared MMKV store.\nlet installationMetadata: MMKV | undefined\nfunction getInstallationMetadata(): MMKV {\n return (installationMetadata ??= createMMKV({id: \"mentra-miniapp-installations\"}))\n}\n\nfunction snapshotInstallationMetadata<T>(key: string): StorageSnapshot<T> {\n const metadata = getInstallationMetadata()\n const stored = metadata.getString(key)\n if (stored) return {present: true, value: JSON.parse(stored) as T}\n // Migrate pre-upgrade metadata from the default store when it still exists.\n const legacy = snapshotStorage<T>(key)\n if (legacy.present) {\n metadata.set(key, JSON.stringify(legacy.value))\n storage.remove(key)\n }\n return legacy\n}\n\nfunction restoreInstallationMetadata<T>(key: string, snapshot: StorageSnapshot<T>): void {\n const metadata = getInstallationMetadata()\n if (snapshot.present) metadata.set(key, JSON.stringify(snapshot.value))\n else metadata.remove(key)\n const removed = storage.remove(key)\n if (removed.is_error()) throw removed.error\n}\n\nfunction restoreDevRouting(packageName: string, snapshot: DevRoutingSnapshot): void {\n for (const field of DEV_ROUTING_FIELDS) restoreStorage(`${packageName}_dev_${field}`, snapshot[field])\n}\n\nfunction restoreInstallMetadata(journal: InstallMetadataRollbackJournal): void {\n if (journal.reasons) restoreInstallationMetadata(installReasonsKey(journal.packageName), journal.reasons)\n if (journal.devRouting) restoreDevRouting(journal.packageName, journal.devRouting)\n if (journal.devStash) restoreStashedDevelopmentSelection(journal.packageName, journal.devStash)\n restoreStorage(activeVersionKey(journal.packageName), journal.active)\n restoreInstallationMetadata(releaseIdentityKey(journal.packageName, journal.version), journal.release)\n restoreInstallationMetadata(publisherIdentityKey(journal.packageName), journal.publisher)\n}\n\nfunction readStoredInstallReasons(packageName: string): StoredInstallReasons | null {\n try {\n const stored = getInstallationMetadata().getString(installReasonsKey(packageName))\n if (!stored) return null\n const parsed = JSON.parse(stored) as Partial<StoredInstallReasons>\n const reasons = Array.isArray(parsed.reasons)\n ? MINIAPP_INSTALL_REASONS.filter((reason) => parsed.reasons!.includes(reason))\n : []\n const assignment = reasons.includes(\"assignment\") && parsed.assignment ? parsed.assignment : undefined\n return assignment ? {reasons, assignment} : {reasons: reasons.filter((reason) => reason !== \"assignment\")}\n } catch {\n return null\n }\n}\n\nfunction writeStoredInstallReasons(packageName: string, value: StoredInstallReasons): void {\n getInstallationMetadata().set(installReasonsKey(packageName), JSON.stringify(value))\n}\n\n/** A package installed before reasons were recorded holds the reason its provenance implies. */\nfunction inferredInstallReason(identity: MiniappReleaseIdentity | null): MiniappInstallReason {\n switch (identity?.source) {\n case \"bundled_asset\":\n case \"system_store\":\n case \"preinstalled_registry\":\n return \"bundled\"\n case \"deployment_manifest\":\n return \"manifest\"\n default:\n return \"explicit\"\n }\n}\n\n/** The installed signer decides which bundles may replace a package. */\nfunction assertPublisherContinuity(packageName: string, publisherKeyFingerprint: string | undefined): void {\n const installed = snapshotInstallationMetadata<string>(publisherIdentityKey(packageName))\n assertPublisherIdentityPolicy({\n packageName,\n candidateFingerprint: publisherKeyFingerprint,\n installedFingerprint: installed.present ? installed.value : null,\n })\n}\n\nfunction assertInstallCompatibility(\n manifest: Awaited<ReturnType<typeof validateInstallBundleArchive>>,\n policy: NonNullable<InstallBundleOptions[\"compatibilityPolicy\"]>,\n): void {\n const compatibility = checkMiniappRunsOnPhone(manifest, policy)\n if (!compatibility.compatible) throw new Error(compatibility.reason)\n}\n\n/**\n * Download a miniapp zip from `url` and return its bytes. The response is\n * streamed through a size ceiling and a deadline, so an attacker-controlled\n * server cannot exhaust memory or hang an install. An expected SHA-256 is\n * checked before any other step reads the bytes.\n */\nasync function downloadMiniAppZip(\n url: string,\n options: Pick<InstallBundleOptions, \"expectedBundleSha256\" | \"onProgress\"> = {},\n): Promise<Uint8Array> {\n const abortController = new AbortController()\n const timeout = setTimeout(() => abortController.abort(), REMOTE_BUNDLE_TIMEOUT_MS)\n try {\n options.onProgress?.(\"downloading\")\n // React Native's global fetch polyfill does not expose Response.body.\n // Expo fetch provides the native ReadableStream required for bounded\n // downloads without buffering an attacker-controlled response first.\n const requestUrl = new URL(url)\n const response = await expoFetch(url, {signal: abortController.signal})\n if (!response.ok) throw new Error(`bundle download failed with HTTP ${response.status}`)\n if (requestUrl.protocol === \"https:\" && response.url && new URL(response.url).protocol !== \"https:\") {\n throw new Error(\"bundle download redirected away from HTTPS\")\n }\n const declaredSize = Number(response.headers.get(\"content-length\"))\n if (Number.isFinite(declaredSize) && declaredSize > MAX_REMOTE_BUNDLE_BYTES) {\n throw new Error(`bundle exceeds ${MAX_REMOTE_BUNDLE_BYTES} bytes`)\n }\n if (!response.body) throw new Error(\"bundle download returned no response body\")\n const bytes = await readBoundedByteStream(response.body, MAX_REMOTE_BUNDLE_BYTES)\n if (bytes.byteLength === 0) {\n throw new Error(`bundle must be between 1 and ${MAX_REMOTE_BUNDLE_BYTES} bytes`)\n }\n if (options.expectedBundleSha256 !== undefined) {\n const expected = options.expectedBundleSha256.toLowerCase()\n if (!/^[a-f0-9]{64}$/.test(expected)) throw new Error(\"expected bundle SHA-256 is invalid\")\n const actual = await sha256Hex(bytes)\n if (actual !== expected) throw new Error(`bundle SHA-256 mismatch: expected ${expected}, got ${actual}`)\n }\n return bytes\n } catch (error) {\n console.error(\"ZIP: Error downloading zip file\", error)\n if (abortController.signal.aborted) {\n throw new Error(`bundle download timed out after ${REMOTE_BUNDLE_TIMEOUT_MS}ms`)\n }\n throw error instanceof Error ? error : new Error(\"bundle download failed\")\n } finally {\n clearTimeout(timeout)\n }\n}\n\n/**\n * Download a ZIP with the caller's `downloadBundle`, then hold its bytes to the same limits and expected SHA-256 as\n * the installer's own download.\n */\nasync function downloadWith(\n download: NonNullable<InstallBundleOptions[\"downloadBundle\"]>,\n url: string,\n options: Pick<InstallBundleOptions, \"expectedBundleSha256\" | \"onProgress\">,\n): Promise<Uint8Array> {\n options.onProgress?.(\"downloading\")\n const bytes = await download(url)\n if (bytes.byteLength === 0 || bytes.byteLength > MAX_REMOTE_BUNDLE_BYTES) {\n throw new Error(`bundle must be between 1 and ${MAX_REMOTE_BUNDLE_BYTES} bytes`)\n }\n if (options.expectedBundleSha256 !== undefined) {\n const expected = options.expectedBundleSha256.toLowerCase()\n const actual = await sha256Hex(bytes)\n if (actual !== expected) throw new Error(`bundle SHA-256 mismatch: expected ${expected}, got ${actual}`)\n }\n return bytes\n}\n\n/**\n * Every release records the SHA-256 of the ZIP it installed, a bundled or release-QR install included, so Fleet can\n * report it and an assignment can tell whether its URL serves the same bytes. Development snapshots record none.\n */\nexport async function withReleaseDigest(\n identity: MiniappReleaseIdentity,\n version: string,\n bytes: Uint8Array,\n): Promise<MiniappReleaseIdentity> {\n if (identity.bundleSha256 || version.startsWith(\"dev-\")) return identity\n return {...identity, bundleSha256: await sha256Hex(bytes)}\n}\n\n/**\n * Write validated archive bytes to a unique host-owned cache file. Native\n * extraction reads this private copy, never a caller's path that could change\n * while the install waits in the queue. Startup cleanup removes leftovers.\n */\nfunction writePrivateArchive(bytes: Uint8Array): File {\n const directory = new Directory(Paths.cache, \"lma_downloads\")\n try {\n if (!directory.exists) directory.create()\n } catch (error) {\n console.error(\"ZIP: Error creating the archive cache directory\", error)\n throw new Error(\"CREATE_DOWNLOAD_DIR_FAILED\")\n }\n // Never derive the name from an untrusted URL or caller path, and never let\n // two simultaneous installs alias the same file.\n const archive = new File(\n directory,\n `bundle-${nextInstallOperationId()}-${Math.random().toString(36).slice(2, 10)}.zip`,\n )\n archive.write(bytes)\n return archive\n}\n\ntype AdoptExistingBundle = (\n packageName: string,\n version: string,\n extracted: Directory,\n installed: Directory,\n) => Promise<boolean>\n\ninterface InstalledBundle {\n packageName: string\n version: string\n}\n\ninterface UnpackOptions {\n onProgress?: InstallBundleOptions[\"onProgress\"]\n whenStaged?: InstallBundleOptions[\"whenStaged\"]\n}\n\n/**\n * Unpack a local miniapp zip and install it under\n * `lmas/<packageName>/<version>/` inside the serialized install transaction.\n *\n * Zip layout: flat — files at root, `miniapp.json` at the top level. We're\n * strict on shape so we fail loudly on malformed bundles.\n *\n * `validate` runs first inside the queue (after any earlier install\n * committed), `beforeActivate` runs after extraction and before installed\n * files change, and `finalize` writes registry metadata before the atomic\n * commit. Any failure before commit restores the previous installation.\n *\n * With `whenStaged`, extraction happens first, into a private cache directory\n * outside the queue, and the hook may wait before the queue is entered; the\n * queue then activates the already-unpacked files. Without it, extraction stays\n * inside the queue.\n *\n * @param zipPath file:// URI of the zip on local disk.\n * @param versionOverride override the manifest's version field (dev snapshots).\n */\nasync function unpackMiniApp(\n zipPath: string,\n versionOverride: string | undefined,\n expected: MiniappInstallExpectations,\n finalize: (\n installed: InstalledBundle,\n activation: ActivatedInstall<InstalledBundle>,\n ) => InstallFinalization | Promise<InstallFinalization>,\n beforeActivate: () => void,\n validate: () => void,\n adoptExisting?: AdoptExistingBundle,\n options: UnpackOptions = {},\n): Promise<InstalledBundle> {\n if (!options.whenStaged) {\n return completeInstallFilesystemTransaction(\n () =>\n withExtractedMiniApp(zipPath, expected, options.onProgress, (extracted) =>\n activateExtractedMiniApp(\n extracted,\n versionOverride,\n expected,\n beforeActivate,\n adoptExisting,\n options.onProgress,\n ),\n ),\n finalize,\n validate,\n )\n }\n const whenStaged = options.whenStaged\n return withExtractedMiniApp(zipPath, expected, options.onProgress, async (extracted) => {\n await whenStaged()\n return completeInstallFilesystemTransaction(\n () =>\n activateExtractedMiniApp(\n extracted,\n versionOverride,\n expected,\n beforeActivate,\n adoptExisting,\n options.onProgress,\n ),\n finalize,\n validate,\n )\n })\n}\n\ninterface ExtractedMiniApp {\n directory: Directory\n operationId: string\n packageName: string\n manifestVersion: string\n}\n\n/** Unzip into a private cache directory, run `run`, and always remove the directory afterwards. */\nasync function withExtractedMiniApp<T>(\n zipPath: string,\n expected: MiniappInstallExpectations,\n onProgress: InstallBundleOptions[\"onProgress\"],\n run: (extracted: ExtractedMiniApp) => Promise<T>,\n): Promise<T> {\n const operationId = nextInstallOperationId()\n const unzipDir = new Directory(Paths.cache, `lma_unzip-${operationId}`)\n try {\n unzipDir.create()\n } catch (error) {\n console.error(\"ZIP: Error creating the unzip directory\", error)\n throw new Error(\"CREATE_CACHE_DIR_FAILED\")\n }\n\n try {\n return await run(await extractMiniApp(zipPath, unzipDir, operationId, expected, onProgress))\n } finally {\n try {\n if (unzipDir.exists) unzipDir.delete()\n } catch (error) {\n console.warn(\"ZIP: Error cleaning the unzip directory\", error)\n }\n }\n}\n\nasync function extractMiniApp(\n zipPath: string,\n unzipDir: Directory,\n operationId: string,\n expected: MiniappInstallExpectations,\n onProgress: InstallBundleOptions[\"onProgress\"],\n): Promise<ExtractedMiniApp> {\n try {\n onProgress?.(\"extracting\")\n console.log(\"ZIP: unzipping\", zipPath)\n await unzip(zipPath, unzipDir.uri)\n } catch (error) {\n console.error(\"Error unzipping zip file\", error)\n throw new Error(\"UNZIP_FAILED\")\n }\n // The validator refuses ZIP entries marked as links, but the native unzipper decides what it writes. Before\n // anything reads the files, every one must be a plain file or directory where it was written: a link could make\n // the miniapp's files point at the Mentra App's own.\n const linked = linkedEntry(unzipDir)\n if (linked !== null) throw new Error(`bundle contains a symbolic link: ${linked}`)\n\n // Strict zip shape: miniapp.json at unzip root. No tolerance for an\n // enclosing folder or app.json fallback — we own the dev-server emit\n // format, so any deviation indicates a corrupt bundle.\n const appDir = unzipDir\n let packageName: string\n let manifestVersion: string\n try {\n const miniappJsonFile = new File(appDir, \"miniapp.json\")\n if (!miniappJsonFile.exists) throw new Error(\"miniapp.json missing at zip root\")\n const manifest = JSON.parse(miniappJsonFile.textSync())\n if (!manifest.packageName) throw new Error(\"miniapp.json missing packageName\")\n if (!manifest.version) throw new Error(\"miniapp.json missing version\")\n packageName = manifest.packageName\n manifestVersion = manifest.version\n } catch (error) {\n console.error(\"Error reading miniapp.json from zip:\", error)\n throw new Error(\"READ_MANIFEST_FAILED\")\n }\n // The extracted manifest must be the one that was validated.\n const identityError = miniappInstallIdentityError({packageName, version: manifestVersion}, expected)\n if (identityError) throw new Error(identityError)\n return {directory: unzipDir, operationId, packageName, manifestVersion}\n}\n\nasync function activateExtractedMiniApp(\n extracted: ExtractedMiniApp,\n versionOverride: string | undefined,\n expected: MiniappInstallExpectations,\n beforeActivate: () => void,\n adoptExisting: AdoptExistingBundle | undefined,\n onProgress: InstallBundleOptions[\"onProgress\"],\n): Promise<ActivatedInstall<InstalledBundle>> {\n const {directory: appDir, operationId, packageName} = extracted\n const version = versionOverride ?? extracted.manifestVersion\n console.log(`ZIP: installing ${packageName} as version ${version}`)\n\n const basePackageDir = new Directory(Paths.document, \"lmas\", packageName)\n try {\n if (!basePackageDir.exists) {\n basePackageDir.create({intermediates: true})\n }\n } catch (error) {\n console.error(\"Error creating the base package directory\", error)\n throw new Error(\"CREATE_PACKAGE_DIR_FAILED\")\n }\n\n const directory = (name: string) => new Directory(basePackageDir, name)\n const stagingName = `.staging-${version}-${operationId}`\n const backupName = `.backup-${version}-${operationId}`\n const hadExisting = directory(version).exists\n let adoptingExisting = false\n if (expected.rejectExistingVersion && hadExisting) {\n // A verified deployment may claim identical bundled bytes without replacing\n // the installed directory. Ownership still commits through the same journal.\n adoptingExisting = Boolean(adoptExisting && (await adoptExisting(packageName, version, appDir, directory(version))))\n if (!adoptingExisting) throw new Error(`Miniapp ${packageName}@${version} is already installed`)\n }\n const activationKind = hadExisting ? \"existing\" : \"new\"\n const pendingName = `.pending-${activationKind}-${version}-${operationId}`\n const committedName = `.committed-${activationKind}-${version}-${operationId}`\n try {\n if (!adoptingExisting) directory(stagingName).create()\n } catch (error) {\n console.error(\"Error creating the staging directory\", error)\n throw new Error(\"CREATE_VERSION_DIR_FAILED\")\n }\n\n try {\n const contents = adoptingExisting ? [] : appDir.list()\n for (const item of contents) {\n item.move(directory(stagingName))\n }\n } catch (error) {\n console.error(\"Error moving the contents of the folder to the destination directory\", error)\n if (directory(stagingName).exists) directory(stagingName).delete()\n throw new Error(\"INSTALL_CONTENTS_FAILED\")\n }\n\n // Recheck the signer and version rules (and any caller guard) now that the\n // bundle is staged and no installed file has changed yet.\n try {\n beforeActivate()\n } catch (error) {\n if (directory(stagingName).exists) directory(stagingName).delete()\n throw error\n }\n\n // Swap only after the complete bundle is staged. If activation fails,\n // restore a previous same-version directory instead of leaving a partial\n // installation behind.\n let movedExisting = false\n onProgress?.(\"activating\")\n try {\n // Move an existing target aside before creating the pending marker. A\n // crash in that first move leaves only a backup, which startup restores.\n // Once the marker exists its name records whether a prior target existed,\n // making recovery idempotent even if it is interrupted itself.\n if (!adoptingExisting && directory(version).exists) {\n directory(version).move(directory(backupName))\n movedExisting = true\n }\n directory(pendingName).create()\n if (!adoptingExisting) directory(stagingName).move(directory(version))\n } catch (error) {\n console.error(\"Error activating the staged miniapp\", error)\n try {\n if (movedExisting) {\n if (directory(version).exists) directory(version).delete()\n if (directory(backupName).exists) directory(backupName).move(directory(version))\n } else if (!hadExisting && directory(version).exists) {\n // No prior install can be harmed; remove a partially moved first\n // install if the filesystem move failed after creating its target.\n directory(version).delete()\n }\n if (directory(stagingName).exists) directory(stagingName).delete()\n if (directory(pendingName).exists) directory(pendingName).delete()\n } catch (rollbackError) {\n console.error(\"Error restoring the previous miniapp version\", rollbackError)\n }\n throw new Error(\"ACTIVATE_VERSION_FAILED\")\n }\n\n console.log(\"ZIP: local mini app installed at\", directory(version).uri)\n printDirectory(directory(version), 2)\n return {\n value: {packageName, version},\n commit: () => {\n // Renaming the journal is the atomic commit boundary. Recovery keeps a\n // candidate with a committed marker and rolls back one with a pending\n // marker. Cleanup after the rename may be retried on the next launch.\n if (directory(pendingName).exists) directory(pendingName).move(directory(committedName))\n else if (!directory(committedName).exists) throw new Error(\"activation journal disappeared before commit\")\n try {\n if (directory(backupName).exists) directory(backupName).delete()\n if (directory(committedName).exists) directory(committedName).delete()\n } catch (error) {\n console.warn(\"ZIP: Error cleaning committed miniapp activation artifacts\", error)\n }\n },\n rollback: (options?: {preserveRecoveryState?: boolean}) => {\n try {\n if (options?.preserveRecoveryState && directory(committedName).exists) {\n if (directory(pendingName).exists) directory(committedName).delete()\n else directory(committedName).move(directory(pendingName))\n }\n if (!adoptingExisting) {\n if (directory(version).exists) directory(version).delete()\n if (directory(backupName).exists) directory(backupName).move(directory(version))\n }\n if (!options?.preserveRecoveryState) {\n if (directory(pendingName).exists) directory(pendingName).delete()\n if (directory(committedName).exists) directory(committedName).delete()\n }\n } catch (error) {\n console.error(\"ZIP: Error rolling back miniapp after metadata finalization failed\", error)\n throw error\n }\n },\n recordRecoveryState: (serializedState: string) => {\n const file = new File(directory(pendingName), INSTALL_METADATA_ROLLBACK_FILE)\n file.write(serializedState)\n },\n }\n}\n\nfunction directoryNames(directory: Directory): string[] {\n return directory\n .list()\n .filter((entry): entry is Directory => entry instanceof Directory)\n .map((entry) => entry.name)\n}\n\n/** Delete the locally cached icon named by a serialized dev record, best effort. */\nfunction deleteCachedDevIcon(serializedRecord: string, packageName: string): void {\n try {\n const iconUrl = (JSON.parse(serializedRecord) as Partial<DevAppRecord>).iconUrl\n if (typeof iconUrl !== \"string\" || !iconUrl.startsWith(\"file://\")) return\n const icon = new File(iconUrl)\n if (icon.exists) icon.delete()\n } catch (error) {\n console.warn(`APP_REGISTRY: failed to delete dev icon for ${packageName}:`, error)\n }\n}\n\ntype Listener = () => void\n\nclass AppRegistry {\n private cachedApps: ClientApp[] = []\n // Offline apps live in a separate layer so they survive the disk-rebuild\n // path in getInstalledMiniapps (which reassigns cachedApps).\n private offlineApps: ClientApp[] = []\n /** Package names whose start() requires the on-device STT model (host-declared). */\n private sttModelRequired = new Set<string>()\n private refreshNeeded: boolean = true\n private loaded = false\n private listeners = new Set<Listener>()\n private retainedDevVersions = new Map<string, Set<string>>()\n\n /** Hold the running and rollback bundles while an explicit replacement settles. */\n public retainDevVersions(packageName: string, versions: string[]): () => void {\n if (this.retainedDevVersions.has(packageName)) throw new Error(\"A miniapp replacement is already in progress\")\n this.retainedDevVersions.set(packageName, new Set(versions.filter((version) => version.startsWith(\"dev-\"))))\n return () => {\n this.retainedDevVersions.delete(packageName)\n }\n }\n\n private protectedDevVersions(packageName: string): Set<string> {\n const versions = new Set(this.retainedDevVersions.get(packageName))\n const selected = this.getSelectedDevSnapshot(packageName)\n if (selected) versions.add(selected)\n const active = storage.load<string>(activeVersionKey(packageName))\n if (active.is_ok() && active.value.startsWith(\"dev-\") && miniappRunningRegistry.has(packageName))\n versions.add(active.value)\n return versions\n }\n\n private removeReleaseIdentity(packageName: string, version: string): void {\n const key = releaseIdentityKey(packageName, version)\n getInstallationMetadata().remove(key)\n storage.remove(key)\n if (version.startsWith(\"dev-\")) forgetDevSnapshotOwner(packageName, version)\n }\n\n /**\n * Why `packageName` is installed. A package installed before reasons were recorded holds the reason its active\n * release's provenance implies. Empty when it is not installed and holds no recorded reason.\n */\n public getInstallReasons(packageName: string): MiniappInstallReason[] {\n const stored = readStoredInstallReasons(packageName)\n if (stored) return [...stored.reasons]\n const version = this.getActiveReleaseVersion(packageName)\n if (version === null) return []\n return [inferredInstallReason(this.getReleaseIdentity(packageName, version))]\n }\n\n /**\n * The installed release (not a `dev-*` snapshot) that stands for the package: the stored active version when it\n * is a release on disk, else the newest release. Null when only development builds are on disk. Reads only.\n */\n public getActiveReleaseVersion(packageName: string): string | null {\n const versions = this.getInstalledVersions(packageName).filter((version) => !version.startsWith(\"dev-\"))\n if (versions.length === 0) return null\n const active = storage.load<string>(activeVersionKey(packageName))\n if (active.is_ok() && versions.includes(active.value)) return active.value\n return versions.filter((candidate) => semver.valid(candidate)).sort(semver.rcompare)[0] ?? versions[0]\n }\n\n /** True once the installed miniapps have been read from disk (the first `getInstalledMiniapps`). */\n public isLoaded(): boolean {\n return this.loaded\n }\n\n /** The assignment behind the package's `assignment` reason, or null. */\n public getMiniappAssignment(packageName: string): MiniappAssignment | null {\n return readStoredInstallReasons(packageName)?.assignment ?? null\n }\n\n /** Every installed package holding an `assignment` reason, whichever account's assignment recorded it. */\n public getAssignedPackages(): string[] {\n return this.getPackageNames().filter((packageName) =>\n readStoredInstallReasons(packageName)?.reasons.includes(\"assignment\"),\n )\n }\n\n /**\n * A live-development URL, build or snapshot would run for the package instead of its installed release. True also\n * while a live context of the package holds an earlier account's or workspace's selection: it is not this context's\n * to clear, and the current one's is restored when that context stops.\n */\n public hasDevelopmentSelection(packageName: string): boolean {\n return (\n !isDevelopmentSelectionCurrent(packageName) ||\n readDevAppRecord(packageName) !== null ||\n storage.load<string>(`${packageName}_dev_url`).is_ok() ||\n this.chooseActiveVersion(packageName).version?.startsWith(\"dev-\") === true\n )\n }\n\n /**\n * Clear the package's live-development selection and the development builds of the current context, as a release\n * install does, so launching runs its installed release. Another account's or workspace's snapshots stay on disk\n * with their selections. Resolves false, clearing nothing, while a live context of the package still holds an\n * earlier context's selection. Serialized with installs: `assertCurrent` runs once the transaction holds the queue,\n * before anything changes, so a caller whose session ended while it waited clears nothing.\n */\n public clearDevelopmentSelection(packageName: string, options: {assertCurrent?: () => void} = {}): Promise<boolean> {\n return runInstallFilesystemTransaction(async () => {\n options.assertCurrent?.()\n if (!isDevelopmentSelectionCurrent(packageName)) return false\n invalidateDevSnapshotRequests(packageName)\n this.clearDevArtifacts(packageName, {currentContextOnly: true})\n const active = storage.load<string>(activeVersionKey(packageName))\n if (active.is_ok() && active.value.startsWith(\"dev-\")) storage.remove(activeVersionKey(packageName))\n this.refreshNeeded = true\n this.notify()\n return true\n })\n }\n\n /** Add the `assignment` reason (or replace its assignment), keeping every other reason. */\n public setMiniappAssignment(packageName: string, assignment: MiniappAssignment): void {\n this.recordAssignment(packageName, assignment)\n this.notify()\n }\n\n /** Remove the `assignment` reason. Returns the reasons that remain. Uninstalls nothing. */\n public clearMiniappAssignment(packageName: string): MiniappInstallReason[] {\n const remaining = this.getInstallReasons(packageName).filter((reason) => reason !== \"assignment\")\n writeStoredInstallReasons(packageName, {reasons: remaining})\n this.notify()\n return remaining\n }\n\n /** Add a reason other than `assignment` (which needs {@link setMiniappAssignment}). */\n public addInstallReason(packageName: string, reason: Exclude<MiniappInstallReason, \"assignment\">): void {\n this.recordInstallReason(packageName, reason)\n this.notify()\n }\n\n /** The reasons a package holds while `replaced`, the identity of a release being replaced in place, is hidden. */\n private installReasonsReplacing(\n packageName: string,\n replaced: MiniappReleaseIdentity | null,\n ): MiniappInstallReason[] {\n const reasons = this.getInstallReasons(packageName)\n if (reasons.length > 0 || readStoredInstallReasons(packageName) || !replaced) return reasons\n return [inferredInstallReason(replaced)]\n }\n\n /** Writes without notifying: the install transaction notifies once its files commit. */\n private recordAssignment(\n packageName: string,\n assignment: MiniappAssignment,\n current: MiniappInstallReason[] = this.getInstallReasons(packageName),\n ): void {\n const reasons = new Set(current)\n reasons.add(\"assignment\")\n writeStoredInstallReasons(packageName, {\n reasons: MINIAPP_INSTALL_REASONS.filter((reason) => reasons.has(reason)),\n assignment,\n })\n }\n\n private recordInstallReason(\n packageName: string,\n reason: Exclude<MiniappInstallReason, \"assignment\">,\n current: MiniappInstallReason[] = this.getInstallReasons(packageName),\n ): void {\n const stored = readStoredInstallReasons(packageName)\n const reasons = new Set(current)\n reasons.add(reason)\n writeStoredInstallReasons(packageName, {\n reasons: MINIAPP_INSTALL_REASONS.filter((candidate) => reasons.has(candidate)),\n ...(stored?.assignment ? {assignment: stored.assignment} : {}),\n })\n }\n\n /**\n * Revocation: the miniapp's server stopped admitting this account. Its installed bundles no longer resolve, so it\n * cannot launch, whatever its reasons (a manual install included). Nothing is uninstalled and no data changes.\n */\n public revokeMiniappAccess(packageName: string): void {\n if (this.isMiniappAccessRevoked(packageName)) return\n getInstallationMetadata().set(revokedAccessKey(packageName), JSON.stringify(true))\n this.refreshNeeded = true\n this.notify()\n }\n\n public restoreMiniappAccess(packageName: string): void {\n if (!this.isMiniappAccessRevoked(packageName)) return\n getInstallationMetadata().remove(revokedAccessKey(packageName))\n this.refreshNeeded = true\n this.notify()\n }\n\n public isMiniappAccessRevoked(packageName: string): boolean {\n return getInstallationMetadata().getString(revokedAccessKey(packageName)) !== undefined\n }\n\n private static instance: AppRegistry | null = null\n\n private constructor() {\n this.cleanupInterruptedInstallCache()\n this.recoverInterruptedActivations()\n }\n\n /** Remove cache artifacts left behind when the process died mid-install. */\n private cleanupInterruptedInstallCache(): void {\n try {\n for (const item of Paths.cache.list()) {\n if (item instanceof Directory && isInstallScratchDirectoryName(item.name)) item.delete()\n }\n\n const downloadDir = new Directory(Paths.cache, \"lma_downloads\")\n if (downloadDir.exists) {\n for (const item of downloadDir.list()) item.delete()\n }\n } catch (error) {\n console.warn(\"APP_REGISTRY: interrupted install cache cleanup failed\", error)\n }\n }\n\n /**\n * Recover an activation interrupted by process death. Pending markers roll\n * back both durable metadata and the filesystem; their encoded prior-target\n * state makes that rollback idempotent. A committed marker is the opposite:\n * metadata and the candidate are authoritative and only cleanup remains.\n * Unjournaled backups are restored when their target is absent. Staging\n * directories are always inert and removable.\n */\n private recoverInterruptedActivations(): void {\n try {\n const lmasDir = new Directory(Paths.document, \"lmas\")\n if (!lmasDir.exists) return\n for (const packageDir of lmasDir.list()) {\n if (!(packageDir instanceof Directory)) continue\n const artifacts = packageDir\n .list()\n .filter((item): item is Directory => item instanceof Directory)\n .map((directory) => ({directory, parsed: parseActivationArtifact(directory.name)}))\n .filter((item): item is {directory: Directory; parsed: ActivationArtifact} => item.parsed !== null)\n\n const committed = artifacts\n .filter((item) => item.parsed.kind === \"committed\")\n .sort((left, right) => right.parsed.timestamp - left.parsed.timestamp)\n for (const {directory, parsed} of committed) {\n const matchingBackup = artifacts.find(\n (item) =>\n item.parsed.kind === \"backup\" &&\n item.parsed.version === parsed.version &&\n item.parsed.timestamp === parsed.timestamp,\n )?.directory\n if (matchingBackup?.exists) matchingBackup.delete()\n if (directory.exists) directory.delete()\n }\n\n const pending = artifacts\n .filter((item) => item.parsed.kind === \"pending\")\n .sort((left, right) => right.parsed.timestamp - left.parsed.timestamp)\n for (const {directory, parsed} of pending) {\n const target = new Directory(packageDir, parsed.version)\n const matchingBackup = artifacts.find(\n (item) =>\n item.parsed.kind === \"backup\" &&\n item.parsed.version === parsed.version &&\n item.parsed.timestamp === parsed.timestamp,\n )?.directory\n const metadataJournal = readMetadataRollbackJournal(directory, packageDir.name, parsed.version)\n if (metadataJournal) restoreInstallMetadata(metadataJournal)\n\n const recovery = interruptedActivationRecovery({\n hasBackup: matchingBackup?.exists === true,\n hadExisting: parsed.hadExisting === true,\n })\n if (recovery === \"restore-backup\") {\n if (target.exists) target.delete()\n new Directory(packageDir, matchingBackup!.name).move(target)\n } else if (recovery === \"remove-target\" && target.exists) {\n target.delete()\n }\n if (directory.exists) directory.delete()\n }\n\n const backups = artifacts\n .filter((item) => item.parsed.kind === \"backup\")\n .sort((left, right) => right.parsed.timestamp - left.parsed.timestamp)\n for (const {directory, parsed} of backups) {\n const target = new Directory(packageDir, parsed.version)\n if (!directory.exists) continue\n if (target.exists) directory.delete()\n else new Directory(packageDir, directory.name).move(target)\n }\n for (const {directory, parsed} of artifacts) {\n if (\n (parsed.kind === \"staging\" || parsed.kind === \"pending\" || parsed.kind === \"committed\") &&\n directory.exists\n ) {\n directory.delete()\n }\n }\n }\n } catch (error) {\n console.warn(\"APP_REGISTRY: interrupted activation recovery failed\", error)\n }\n }\n\n public static getInstance(): AppRegistry {\n if (!AppRegistry.instance) {\n AppRegistry.instance = new AppRegistry()\n }\n return AppRegistry.instance\n }\n\n /** Subscribe to install/uninstall events. Listener fires after refreshNeeded flips. */\n public subscribe(fn: Listener): () => void {\n this.listeners.add(fn)\n return () => {\n this.listeners.delete(fn)\n }\n }\n\n private notify(): void {\n for (const fn of this.listeners) {\n try {\n fn()\n } catch (e) {\n console.warn(\"AppRegistry: listener threw\", e)\n }\n }\n }\n\n /**\n * On-disk path for a given miniapp bundle version.\n */\n public getBundleDir(packageName: string, version: string): string {\n const bundleDir = new Directory(Paths.document, \"lmas\", packageName, version)\n return bundleDir.uri\n }\n\n /**\n * Resolve the two-layer entry paths for an installed miniapp version.\n * Returns absolute file:// URIs for `background` and (when present) `ui`,\n * the bundle's root directory, and the UI entry's path relative to that\n * root. The screen loads from the package's own origin, which serves the\n * root (`miniappOriginUrl(packageName, uiPath, platform)`), so hosts use\n * `rootDir` and `uiPath` rather than the `ui` file.\n *\n * Legacy single-layer bundles (no `entry` object in manifest) fall back\n * to `index.html` discovery so the WebView host keeps working unchanged.\n * Two-layer bundles ship `entry.background` and optional `entry.ui`\n * paths relative to the bundle root.\n *\n * Returns null if neither shape resolves to existing files on disk.\n */\n public getMiniappEntryPaths(\n packageName: string,\n version: string,\n ): {background: string | null; ui: string | null; rootDir: string; uiPath: string | null} | null {\n if (this.isMiniappAccessRevoked(packageName)) return null\n const manifest = this.getMiniappManifest(packageName, version) as {\n entry?: {background?: string; ui?: string}\n } | null\n const bundleDir = this.getBundleDir(packageName, version)\n const resolve = (rel: string): {uri: string; path: string} | null => {\n const trimmed = rel.replace(/^\\.?\\/+/, \"\")\n const file = new File(bundleDir, trimmed)\n // The manifest is the miniapp's: an entry outside its own bundle (`../`) is not one.\n return isFileUriInside(bundleDir, file.uri) && file.exists ? {uri: file.uri, path: trimmed} : null\n }\n if (manifest?.entry) {\n const bg = manifest.entry.background ? resolve(manifest.entry.background) : null\n const ui = manifest.entry.ui ? resolve(manifest.entry.ui) : null\n if (bg || ui) {\n return {background: bg?.uri ?? null, ui: ui?.uri ?? null, rootDir: bundleDir, uiPath: ui?.path ?? null}\n }\n }\n // Legacy single-bundle fallback — `index.html` at the bundle root.\n const legacy = new File(new Directory(bundleDir.replace(/^file:\\/\\//, \"\")), \"index.html\")\n return {\n background: null,\n ui: legacy.exists ? legacy.uri : null,\n rootDir: bundleDir,\n uiPath: legacy.exists ? \"index.html\" : null,\n }\n }\n\n /**\n * Verify a manifest declares an SDK / host version range compatible\n * with the current host. Delegates to the pure\n * {@link checkManifestVersions} helper — same shape, no React Native\n * imports, unit-testable. Manifests missing either field pass\n * through unchanged (legacy single-layer path).\n */\n public checkManifestVersions(\n manifest: {sdkVersion?: string; minHostVersion?: string} | null,\n options: {hostVersion: string; supportedSdkRange: string},\n ): {ok: true} | {ok: false; reason: string} {\n return checkManifestVersions(manifest, options)\n }\n\n /**\n * Read and parse the miniapp manifest (miniapp.json with app.json fallback)\n * from a given bundle directory.\n */\n public getMiniappManifest(packageName: string, version: string): any {\n const bundleDir = new Directory(Paths.document, \"lmas\", packageName, version)\n try {\n const miniappJsonFile = new File(bundleDir, \"miniapp.json\")\n if (miniappJsonFile.exists) {\n return JSON.parse(miniappJsonFile.textSync())\n }\n } catch (e) {\n console.warn(\"AppRegistry: Error reading miniapp.json, trying app.json fallback\", e)\n }\n try {\n const appJsonFile = new File(bundleDir, \"app.json\")\n if (appJsonFile.exists) {\n return JSON.parse(appJsonFile.textSync())\n }\n } catch (e) {\n console.warn(\"AppRegistry: Error reading app.json fallback\", e)\n }\n return null\n }\n\n /**\n * The deployment lets this package run at all ({@link isLocalMiniappPackageAllowed}), a package the account's\n * current workspace assigned included. Launches check it before the release.\n */\n public isPackageAllowed(packageName: string): boolean {\n return isLocalMiniappPackageAllowed(packageName, {assigned: isAssignedByCurrentWorkspace(packageName)})\n }\n\n /**\n * The deployment lets this installed release run ({@link isInstalledMiniappAllowed}): listing, launch precedence,\n * launches and the version rule ask this. A release installed from a URL runs as a Fleet assignment while the\n * account's current workspace assigned the package.\n */\n public isReleaseAllowed(\n packageName: string,\n version: string | undefined,\n identity: MiniappReleaseIdentity | null = version ? this.getReleaseIdentity(packageName, version) : null,\n ): boolean {\n return isInstalledMiniappAllowed(packageName, version, identity, {\n assigned: identity?.source === \"url\" && isAssignedByCurrentWorkspace(packageName),\n })\n }\n\n /**\n * One version rule for every install source: an incoming release must be\n * greater than or equal to every installed release; an equal version is a\n * reinstall. Dev snapshot versions (`dev-*`) are sessions, not releases.\n */\n public assertCanInstallVersion(packageName: string, version: string): void {\n const policy = getConfigValues().localMiniappPolicy\n const workspaceManaged = policy?.managed.some((entry) => entry.packageName === packageName) ?? false\n const installed = this.getInstalledVersions(packageName).filter((installedVersion) => {\n if (!policy) return true\n // In a workspace, consumer releases retained on disk are not installations\n // in that environment; compare only releases its policy can use. For a\n // package the workspace manages, its deployment releases are the\n // installation, never a consumer copy of the same package.\n const identity = this.getReleaseIdentity(packageName, installedVersion)\n if (workspaceManaged && identity?.source !== \"deployment_manifest\") return false\n return this.isReleaseAllowed(packageName, installedVersion, identity)\n })\n assertMiniappUpdateVersion(packageName, version, installed)\n }\n\n /**\n * Download and install a miniapp bundle from a URL. The URL must serve a\n * zip whose root contains `miniapp.json` plus the bundle entry files.\n * The bundle goes through the same validated transaction as every other\n * install source; see {@link InstallBundleOptions}.\n */\n public installFromUrl(url: string, opts?: InstallBundleOptions): AsyncResult<void, Error> {\n return Res.try_async(async () => {\n if (opts?.expectedPackageName) this.assertNoReplacementInProgress(opts.expectedPackageName, opts.versionOverride)\n const bytes = opts?.downloadBundle\n ? await downloadWith(opts.downloadBundle, url, opts)\n : await downloadMiniAppZip(url, {\n expectedBundleSha256: opts?.expectedBundleSha256,\n onProgress: opts?.onProgress,\n })\n console.log(\"ZIP: done downloading, starting unzip\")\n await this.installArchive(bytes, opts, false)\n console.log(\"APP_REGISTRY: Downloaded and installed mini app\")\n })\n }\n\n /**\n * Install a miniapp from a zip already on local disk (e.g. a bundled asset\n * copied into cache). Skips the HTTP download path that `installFromUrl`\n * uses; otherwise identical, including every installation check.\n *\n * @param zipPath file:// URI of the local zip.\n */\n public installFromLocalZip(\n zipPath: string,\n opts?: LocalZipInstallOptions,\n ): AsyncResult<{packageName: string; version: string}, Error> {\n return Res.try_async(async () => {\n if (opts?.expectedPackageName) this.assertNoReplacementInProgress(opts.expectedPackageName, opts.versionOverride)\n if (\n opts?.adoptIdenticalInstalledVersion &&\n (opts.releaseIdentity?.source !== \"deployment_manifest\" ||\n !opts.expectedPackageName ||\n !opts.expectedVersion ||\n opts.versionOverride ||\n !opts.rejectExistingVersion)\n )\n throw new Error(\"Bundle adoption requires a verified deployment release with an exact identity\")\n // Read the caller's file once. Validation and extraction both use this\n // snapshot, so replacing the file afterwards cannot change what installs.\n const bytes = await new File(zipPath).bytes()\n if (opts?.expectedBundleSha256 !== undefined) {\n const expected = opts.expectedBundleSha256.toLowerCase()\n const actual = await sha256Hex(bytes)\n if (actual !== expected) throw new Error(`bundle SHA-256 mismatch: expected ${expected}, got ${actual}`)\n }\n const installed = await this.installArchive(\n bytes,\n opts,\n true,\n opts?.adoptIdenticalInstalledVersion\n ? async (pkg, ver, extracted, installedDir) => {\n const identity = this.getReleaseIdentity(pkg, ver)\n return identity?.source !== \"deployment_manifest\" && (await sameMiniappBundle(extracted, installedDir))\n }\n : undefined,\n )\n console.log(\"APP_REGISTRY: Installed mini app from local zip\")\n return installed\n })\n }\n\n /**\n * A release may not land while a dev build replacement of the same package\n * (retainDevVersions) is settling; dev snapshots belong to that replacement.\n * Checked before download, inside the serialized install, and at commit.\n */\n private assertNoReplacementInProgress(packageName: string, version: string | undefined): void {\n if (!version?.startsWith(\"dev-\") && this.retainedDevVersions.has(packageName))\n throw new Error(\"Cannot install a release during miniapp replacement\")\n }\n\n /**\n * The one installer. Validates the archive bytes, then extracts and\n * activates them in the serialized filesystem transaction. The signer and\n * version rules are checked before extraction and again inside the queue\n * immediately before any installed file changes, so a competing install\n * that commits first cannot make this one's earlier decision valid.\n */\n private async installArchive(\n bytes: Uint8Array,\n opts: InstallBundleOptions | undefined,\n localZip: boolean,\n adoptExisting?: AdoptExistingBundle,\n ): Promise<InstalledBundle> {\n const expected = {packageName: opts?.expectedPackageName, version: opts?.expectedVersion}\n if (opts?.installReason === \"assignment\" && !opts.assignment)\n throw new Error(\"An assignment install must name its assignment\")\n opts?.onProgress?.(\"verifying\")\n const manifest = await validateInstallBundleArchive(bytes, expected)\n // The artifact must be the package and version its source selected.\n const identityError = miniappInstallIdentityError(manifest, expected)\n if (identityError) throw new Error(identityError)\n // The bundle's own manifest decides compatibility, not the catalog that offered it.\n if (opts?.compatibilityPolicy) assertInstallCompatibility(manifest, opts.compatibilityPolicy)\n const version = opts?.versionOverride ?? manifest.version\n // The publisher fingerprint only ever comes from signature verification.\n const {publisherKeyFingerprint: _callerFingerprint, ...callerIdentity} = opts?.releaseIdentity ?? {\n source: version.startsWith(\"dev-\") ? \"dev_snapshot\" : localZip ? \"bundled_asset\" : \"direct_download\",\n }\n const releaseIdentity: MiniappReleaseIdentity = {\n ...(await withReleaseDigest(callerIdentity, version, bytes)),\n ...(manifest.publisherKeyFingerprint ? {publisherKeyFingerprint: manifest.publisherKeyFingerprint} : {}),\n }\n const validateTrust = () => {\n this.assertNoReplacementInProgress(manifest.packageName, version)\n assertPublisherContinuity(manifest.packageName, manifest.publisherKeyFingerprint)\n this.assertCanInstallVersion(manifest.packageName, version)\n }\n // Fail fast before extraction; the transaction checks again under the queue.\n validateTrust()\n // Extract exactly the bytes that were validated.\n const archive = writePrivateArchive(bytes)\n try {\n return await unpackMiniApp(\n archive.uri,\n opts?.versionOverride,\n {\n packageName: manifest.packageName,\n version: manifest.version,\n rejectExistingVersion: opts?.rejectExistingVersion,\n },\n ({packageName, version: installedVersion}, activation) =>\n this.finalizeInstall(\n packageName,\n installedVersion,\n releaseIdentity,\n (state) => activation.recordRecoveryState(state),\n opts?.installReason,\n opts?.assignment,\n ),\n () => {\n validateTrust()\n opts?.beforeActivate?.()\n },\n validateTrust,\n adoptExisting,\n {onProgress: opts?.onProgress, whenStaged: opts?.whenStaged},\n )\n } finally {\n try {\n if (archive.exists) archive.delete()\n } catch (error) {\n console.warn(\"ZIP: Error removing the private archive copy\", error)\n }\n }\n }\n\n /**\n * Registry metadata for an activation, applied before the atomic commit:\n * the verified publisher (recorded the first time a signed bundle installs),\n * the release identity, the active-version pointer, and — for a release —\n * the removal of the package's live-dev routing. A rollback journal is\n * written first so a crash before commit restores all of it.\n */\n private finalizeInstall(\n packageName: string,\n version: string,\n releaseIdentity: MiniappReleaseIdentity,\n recordRecoveryState: (serializedState: string) => void,\n installReason?: MiniappInstallReason,\n assignment?: MiniappAssignment,\n ): InstallFinalization {\n const publisherKey = publisherIdentityKey(packageName)\n const releaseKey = releaseIdentityKey(packageName, version)\n const activeKey = activeVersionKey(packageName)\n const releaseInstall = !version.startsWith(\"dev-\")\n const publisherBefore = snapshotInstallationMetadata<string>(publisherKey)\n const previousRelease = this.getReleaseIdentity(packageName, version)\n const releaseBefore: StorageSnapshot<MiniappReleaseIdentity> = previousRelease\n ? {present: true, value: previousRelease}\n : {present: false}\n const activeBefore = snapshotStorage<string>(activeKey)\n const devRoutingBefore = releaseInstall\n ? (Object.fromEntries(\n DEV_ROUTING_FIELDS.map((field) => [field, snapshotStorage(`${packageName}_dev_${field}`)]),\n ) as DevRoutingSnapshot)\n : undefined\n // A live context may hold an earlier context's selection: the current context's then waits in the stash. The\n // release replaces that one too, in the same transaction as the live keys.\n const devStashBefore = releaseInstall ? stashedDevelopmentSelectionOf(packageName) : null\n const reasonsKey = installReasonsKey(packageName)\n const reasonsBefore = installReason ? snapshotInstallationMetadata<StoredInstallReasons>(reasonsKey) : undefined\n // The pending activation hides a replaced same-version release from inference: take the reasons it held.\n const reasonsAtActivation = installReason ? this.installReasonsReplacing(packageName, previousRelease) : []\n\n const rollbackJournal: InstallMetadataRollbackJournal = {\n schemaVersion: 1,\n packageName,\n version,\n publisher: publisherBefore,\n release: releaseBefore,\n active: activeBefore,\n ...(devRoutingBefore ? {devRouting: devRoutingBefore} : {}),\n ...(devStashBefore ? {devStash: devStashBefore} : {}),\n ...(reasonsBefore ? {reasons: reasonsBefore} : {}),\n }\n recordRecoveryState(JSON.stringify(rollbackJournal))\n\n // Whether the live development selection this release replaces is the current context's. While a live context\n // still holds an earlier context's, the install leaves that one alone and replaces the current context's.\n let selectionCurrent = true\n\n const rollbackMetadata = () => {\n let firstError: unknown\n for (const restore of [\n () => {\n if (devRoutingBefore) restoreDevRouting(packageName, devRoutingBefore)\n },\n () => {\n if (devStashBefore) restoreStashedDevelopmentSelection(packageName, devStashBefore)\n },\n () => restoreStorage(activeKey, activeBefore),\n () => restoreInstallationMetadata(releaseKey, releaseBefore),\n () => restoreInstallationMetadata(publisherKey, publisherBefore),\n () => {\n if (reasonsBefore) restoreInstallationMetadata(reasonsKey, reasonsBefore)\n },\n ]) {\n try {\n restore()\n } catch (rollbackError) {\n console.error(\"APP_REGISTRY: failed to restore install metadata after finalization error\", rollbackError)\n firstError ??= rollbackError\n }\n }\n if (firstError !== undefined) throw firstError\n }\n\n return {\n apply: () => {\n // The commit point: apply and the commit rename run without yielding,\n // so a replacement that began after the queue's checks still wins.\n this.assertNoReplacementInProgress(packageName, version)\n if (releaseInstall) {\n // A dev probe or snapshot download started earlier must not\n // reactivate development code over this release.\n invalidateDevSnapshotRequests(packageName)\n // A held earlier context's live keys stay; the current context's selection is replaced wherever it is.\n selectionCurrent = isDevelopmentSelectionCurrent(packageName)\n if (selectionCurrent) {\n for (const field of DEV_ROUTING_FIELDS) restoreStorage(`${packageName}_dev_${field}`, {present: false})\n }\n if (devStashBefore) {\n restoreStashedDevelopmentSelection(packageName, {contextId: devStashBefore.contextId, selection: {}})\n }\n }\n // Every signed install records its publisher, development snapshots\n // included: from here on only bundles signed with the same key replace\n // this package, until an uninstall clears the record.\n if (releaseIdentity.publisherKeyFingerprint) {\n getInstallationMetadata().set(publisherKey, JSON.stringify(releaseIdentity.publisherKeyFingerprint))\n }\n getInstallationMetadata().set(releaseKey, JSON.stringify(releaseIdentity))\n if (installReason === \"assignment\") this.recordAssignment(packageName, assignment!, reasonsAtActivation)\n else if (installReason) this.recordInstallReason(packageName, installReason, reasonsAtActivation)\n if (!releaseInstall) recordDevSnapshotOwner(packageName, version)\n // Do not notify until the pending filesystem marker has committed.\n // A subscriber scanning here would exclude the pending version and\n // could replace this pointer with the previous installed release.\n const activated = storage.save(activeKey, version)\n if (activated.is_error()) throw activated.error\n },\n rollback: rollbackMetadata,\n afterCommit: () => {\n if (releaseInstall) {\n // Routing already committed with the active release. Only disposable\n // snapshot files, the dev index entry and the cached dev icon remain,\n // so an interruption here cannot select old dev code.\n // Only the current context's development builds go; a held selection of another context keeps its own.\n try {\n this.gcDevVersions(packageName, 0, {currentContext: true})\n if (selectionCurrent) {\n if (getDevAppIndex().includes(packageName)) {\n storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(getDevAppIndex().filter((pkg) => pkg !== packageName)))\n }\n const devMeta = devRoutingBefore?.meta\n if (devMeta?.present && typeof devMeta.value === \"string\") deleteCachedDevIcon(devMeta.value, packageName)\n }\n } catch (error) {\n console.warn(`APP_REGISTRY: failed to clean obsolete dev artifacts for ${packageName}`, error)\n }\n }\n this.refreshNeeded = true\n this.notify()\n },\n }\n }\n\n public getReleaseIdentity(packageName: string, version: string): MiniappReleaseIdentity | null {\n if (!version) return null\n try {\n const snapshot = snapshotInstallationMetadata<MiniappReleaseIdentity>(releaseIdentityKey(packageName, version))\n return snapshot.present ? snapshot.value! : null\n } catch {\n return null\n }\n }\n\n /**\n * A miniapp installed from its URL moved (a permanent redirect within its domain): record the URL this release\n * updates from now. Only `sourceUrl` changes. Answers false, and changes nothing, unless the release is a `url`\n * release that still records `fromUrl`, so a move can't overwrite a release an install just replaced.\n */\n public setReleaseSourceUrl(packageName: string, version: string, fromUrl: string, sourceUrl: string): boolean {\n const identity = this.getReleaseIdentity(packageName, version)\n if (identity?.source !== \"url\" || identity.sourceUrl !== fromUrl) return false\n getInstallationMetadata().set(releaseIdentityKey(packageName, version), JSON.stringify({...identity, sourceUrl}))\n return true\n }\n\n /** The publisher key a package is pinned to, or null when it is unsigned or not installed. */\n public getPublisherKeyFingerprint(packageName: string): string | null {\n try {\n const snapshot = snapshotInstallationMetadata<string>(publisherIdentityKey(packageName))\n return snapshot.present ? snapshot.value! : null\n } catch {\n return null\n }\n }\n\n /** Enumerate installed releases carrying deployment ownership metadata. */\n public getDeploymentOwnedReleases(): Array<{\n packageName: string\n version: string\n identity: MiniappReleaseIdentity\n }> {\n const releases: Array<{packageName: string; version: string; identity: MiniappReleaseIdentity}> = []\n for (const packageName of this.getPackageNames()) {\n for (const version of this.getInstalledVersions(packageName)) {\n const identity = this.getReleaseIdentity(packageName, version)\n if (identity?.source === \"deployment_manifest\") releases.push({packageName, version, identity})\n }\n }\n return releases\n }\n\n /**\n * Drop every dev-* version directory for a package plus ALL dev MMKV keys\n * (URL/port/reachability + the home-tile metadata record). Called on\n * uninstall, so a dev package leaves nothing behind that `projectDevApps`\n * could re-surface. A release install clears the same routing inside its\n * install transaction instead (see finalizeInstall).\n */\n private clearDevArtifacts(packageName: string, opts: {currentContextOnly?: boolean} = {}): void {\n if (this.retainedDevVersions.has(packageName)) throw new Error(\"Cannot clear a miniapp during replacement\")\n try {\n const pkgDir = new Directory(Paths.document, \"lmas\", packageName)\n if (pkgDir.exists) {\n for (const item of pkgDir.list()) {\n if (\n item instanceof Directory &&\n item.name.startsWith(\"dev-\") &&\n (!opts.currentContextOnly || isDevSnapshotVisible(packageName, item.name))\n ) {\n try {\n this.removeReleaseIdentity(packageName, item.name)\n item.delete()\n } catch (e) {\n console.warn(`APP_REGISTRY: failed to delete ${item.name}:`, e)\n }\n }\n }\n }\n } catch (e) {\n console.warn(`APP_REGISTRY: clearDevArtifacts dir scan failed for ${packageName}:`, e)\n }\n storage.remove(`${packageName}_dev_selected_snapshot`)\n storage.remove(`${packageName}_dev_url`)\n storage.remove(`${packageName}_dev_port`)\n storage.remove(`${packageName}_dev_mdns`)\n storage.remove(`${packageName}_dev_last_reachable`)\n // HTTP-direct dev miniapps are indexed by their real package name. A\n // release install/uninstall of that same package should remove only its\n // dev tile; unrelated dev miniapps must remain available.\n if (readDevAppRecord(packageName)) unregisterDevApp(packageName)\n }\n\n /**\n * Garbage-collect older `dev-*` version directories for this package,\n * keeping the latest `keep` (by lexicographic sort, which matches\n * timestamp ordering since dev-<ms> is zero-padded).\n *\n * Only touches `dev-*` versions of one development context: the package's own (the one a live context of it\n * holds, else the current one), or with `currentContext` the current one. Semver-installed versions and another\n * account's or workspace's snapshots (kept with that context's selection) are left alone.\n */\n public gcDevVersions(packageName: string, keep: number, opts: {currentContext?: boolean} = {}): void {\n const owned = opts.currentContext ? isDevSnapshotOfCurrentContext : isDevSnapshotVisible\n try {\n const pkgDir = new Directory(Paths.document, \"lmas\", packageName)\n if (!pkgDir.exists) return\n const dirs = pkgDir\n .list()\n .filter(\n (d): d is Directory => d instanceof Directory && d.name.startsWith(\"dev-\") && owned(packageName, d.name),\n )\n .sort((a, b) => (a.name < b.name ? 1 : -1))\n const protectedVersions = this.protectedDevVersions(packageName)\n for (let i = keep; i < dirs.length; i++) {\n if (protectedVersions.has(dirs[i].name)) continue\n try {\n dirs[i].delete()\n this.removeReleaseIdentity(packageName, dirs[i].name)\n } catch (e) {\n console.warn(`APP_REGISTRY: failed to delete ${dirs[i].name}:`, e)\n }\n }\n if (dirs.length > keep) this.refreshNeeded = true\n } catch (e) {\n console.warn(`APP_REGISTRY: gcDevVersions error for ${packageName}:`, e)\n }\n }\n\n /**\n * Remove obsolete release directories after a Store update committed. Keeps\n * the given versions (the new release and the one it replaced), the active\n * selection, organization-owned releases and every dev snapshot. Runs in the\n * install queue so it never touches a version another install is activating.\n */\n public gcReleaseVersions(packageName: string, keepVersions: readonly string[]): Promise<void> {\n return runInstallFilesystemTransaction(async () => {\n const keep = new Set(keepVersions.filter(Boolean))\n const active = storage.load<string>(activeVersionKey(packageName))\n if (active.is_ok()) keep.add(active.value)\n for (const version of this.getInstalledVersions(packageName)) {\n if (this.getReleaseIdentity(packageName, version)?.source === \"deployment_manifest\") keep.add(version)\n }\n const obsolete = selectReleaseVersionsForGarbageCollection(this.getInstalledVersions(packageName), keep)\n for (const version of obsolete) {\n try {\n const directory = new Directory(Paths.document, \"lmas\", packageName, version)\n if (directory.exists) directory.delete()\n this.removeReleaseIdentity(packageName, version)\n } catch (error) {\n console.warn(`APP_REGISTRY: failed to garbage-collect ${packageName}@${version}:`, error)\n }\n }\n if (obsolete.length > 0) {\n this.refreshNeeded = true\n this.notify()\n }\n }).catch((error) => {\n console.warn(`APP_REGISTRY: release garbage collection failed for ${packageName}:`, error)\n })\n }\n\n /** An explicitly selected packed snapshot takes precedence over scanned live URLs. */\n public getSelectedDevSnapshot(packageName: string): string | null {\n const selected = storage.load<string>(`${packageName}_dev_selected_snapshot`)\n return selected.is_ok() &&\n selected.value.startsWith(\"dev-\") &&\n this.getInstalledVersions(packageName).includes(selected.value) &&\n isDevSnapshotVisible(packageName, selected.value)\n ? selected.value\n : null\n }\n\n public selectDevSnapshot(packageName: string, version: string | null): void {\n if (version !== null && (!version.startsWith(\"dev-\") || !this.getInstalledVersions(packageName).includes(version)))\n throw new Error(\"Selected dev snapshot is not installed\")\n if (version === null) storage.remove(`${packageName}_dev_selected_snapshot`)\n else storage.save(`${packageName}_dev_selected_snapshot`, version)\n this.markRefreshNeeded()\n }\n\n /** Remove one failed staged dev replacement without clearing other dev files or settings. */\n public discardDevSnapshot(packageName: string, version: string): void {\n if (!/^dev-[0-9a-f-]+$/.test(version)) throw new Error(\"Expected an owned dev snapshot version\")\n const directory = new Directory(Paths.document, \"lmas\", packageName, version)\n if (directory.exists) directory.delete()\n this.removeReleaseIdentity(packageName, version)\n this.refreshNeeded = true\n this.notify()\n }\n\n public uninstall(packageName: string, version?: string, options: UninstallOptions = {}): AsyncResult<void, Error> {\n // Serialize with installs: an uninstall must not delete a package tree\n // while another operation is staging or activating inside it.\n return Res.try_async(() =>\n runInstallFilesystemTransaction(async () => {\n options.beforeRemove?.()\n if (this.retainedDevVersions.has(packageName)) throw new Error(\"Cannot uninstall a miniapp during replacement\")\n if (version) {\n const lmaDir = new Directory(Paths.document, \"lmas\", packageName, version)\n // Guard exists: a dev miniapp loads over HTTP and has no on-disk dir,\n // so an unconditional delete() would throw and abort the cleanup below.\n if (lmaDir.exists) lmaDir.delete()\n this.removeReleaseIdentity(packageName, version)\n console.log(\"APP_REGISTRY: Uninstalled mini app version\", version)\n const packageDir = new Directory(Paths.document, \"lmas\", packageName)\n if (packageDir.exists && packageDir.list().length === 0) {\n packageDir.delete()\n }\n } else {\n for (const installedVersion of this.getInstalledVersions(packageName)) {\n this.removeReleaseIdentity(packageName, installedVersion)\n }\n const packageDir = new Directory(Paths.document, \"lmas\", packageName)\n if (packageDir.exists) {\n packageDir.delete()\n }\n console.log(\"APP_REGISTRY: Uninstalled all versions of mini app\", packageName)\n }\n // Always clear dev artifacts: for HTTP-direct dev miniapps the tile is\n // backed by storage records (_dev_meta + dev_apps_index), not the disk\n // dir, so without this the projected tile reappears on the next refresh.\n this.clearDevArtifacts(packageName)\n // Removing the last installed version clears the recorded signer, so\n // any build of the package (an unsigned or dev build included) may\n // install again. Android's uninstall-then-install, for the same reason.\n if (this.getInstalledVersions(packageName).length === 0) {\n restoreInstallationMetadata(publisherIdentityKey(packageName), {present: false})\n getInstallationMetadata().remove(installReasonsKey(packageName))\n // Clear the revocation flag too: it blocks getMiniappEntryPaths and\n // launch, so leaving it set would make a later QR/store/manual\n // reinstall of the same package permanently unusable on this device.\n getInstallationMetadata().remove(revokedAccessKey(packageName))\n }\n this.refreshNeeded = true\n this.notify()\n }),\n )\n }\n\n public getPackageNames(): string[] {\n try {\n const lmasDir = new Directory(Paths.document, \"lmas\")\n if (!lmasDir.exists) return []\n return lmasDir\n .list()\n .filter(\n (lma): lma is Directory =>\n lma instanceof Directory && installedVersionDirectoryNames(directoryNames(lma)).length > 0,\n )\n .map((lma) => lma.name)\n } catch (error) {\n console.error(\"APP_REGISTRY: Error getting locally installed package names\", error)\n return []\n }\n }\n\n /**\n * Committed version directories of a package. Install transaction artifacts\n * (staging, backup and journal directories) and a candidate whose pending\n * activation has not committed are never versions.\n */\n public getInstalledVersions(packageName: string): string[] {\n try {\n const lmaDir = new Directory(Paths.document, \"lmas\", packageName)\n // Not installed yet is an expected state (e.g. preinstall sync probing\n // versions before first install) — return [] without the error noise.\n if (!lmaDir.exists) {\n return []\n }\n return installedVersionDirectoryNames(directoryNames(lmaDir))\n } catch (error) {\n console.error(\"APP_REGISTRY: Error getting local applet versions\", error)\n return []\n }\n }\n\n /** A `dev-*` snapshot or a release a developer installed from a release QR. */\n private isDeveloperVersion(packageName: string, version: string): boolean {\n return version.startsWith(\"dev-\") || this.getReleaseIdentity(packageName, version)?.source === \"direct_download\"\n }\n\n public async getActiveVersion(packageName: string): Promise<string | undefined> {\n const {version, remember} = this.chooseActiveVersion(packageName)\n if (remember) this.setActiveVersion(packageName, remember)\n return version\n }\n\n /** The version a launch would run now (as `getActiveVersion` chooses it), read without storing anything. */\n public peekActiveVersion(packageName: string): string | undefined {\n return this.chooseActiveVersion(packageName).version\n }\n\n /** The version a launch runs, by launch precedence, and the active pointer to store for it (null to leave it). */\n private chooseActiveVersion(packageName: string): {version: string | undefined; remember: string | null} {\n // Another account's or workspace's dev snapshot is not an installation here.\n let versions = this.getInstalledVersions(packageName).filter((version) =>\n isDevSnapshotVisible(packageName, version),\n )\n // A developer build only stands in while the deployment allows development.\n // A stored dev snapshot pointer is left alone so re-allowing it brings that\n // scan back; until then a released version stays on screen.\n const devAllowed = isDevMiniappAllowed(packageName)\n const selectedSnapshot = devAllowed ? this.getSelectedDevSnapshot(packageName) : null\n if (selectedSnapshot) return {version: selectedSnapshot, remember: null}\n // Treat MMKV as a hint, not authority. A stored version may have been\n // GC'd off disk without this pointer being updated.\n const res = storage.load<string>(`${packageName}_active_version`)\n if (\n res.is_ok() &&\n versions.includes(res.value) &&\n (devAllowed || !this.isDeveloperVersion(packageName, res.value))\n ) {\n return {version: res.value, remember: null}\n }\n // Dev versions take precedence over semver-installed versions.\n if (devAllowed) {\n const devVersions = versions\n .filter((v) => v.startsWith(\"dev-\"))\n .sort()\n .reverse()\n if (devVersions.length > 0) return {version: devVersions[0], remember: devVersions[0]}\n }\n versions = versions.filter((v) => semver.valid(v))\n versions.sort((a, b) => semver.rcompare(a, b))\n if (!versions.length) return {version: undefined, remember: null}\n // The newest release the deployment allows, e.g. a workspace's managed\n // release over a newer release-QR or Store install that it does not.\n const active = versions.find((v) => this.isReleaseAllowed(packageName, v)) ?? versions[0]\n return {version: active, remember: res.is_ok() && res.value.startsWith(\"dev-\") ? null : active}\n }\n\n public setActiveVersion(packageName: string, version: string): Result<void, Error> {\n const key = `${packageName}_active_version`\n const previous = storage.load<string>(key)\n const result = storage.save(key, version)\n if (result.is_ok() && (previous.is_error() || previous.value !== version)) {\n // Selecting an already-installed workspace pin must update cached app\n // metadata and subscribers just like a new installation does.\n this.refreshNeeded = true\n this.notify()\n }\n return result\n }\n\n /**\n * Newest `dev-*` snapshot that still has a resolvable UI or background\n * entry. Semver store installs are ignored — a live-dev tile must not\n * silently fall back to a released store bundle when the laptop drops.\n */\n public getLatestDevSnapshotVersion(packageName: string): string | null {\n const versions = this.getInstalledVersions(packageName)\n .filter((v) => v.startsWith(\"dev-\") && isDevSnapshotVisible(packageName, v))\n .sort()\n .reverse()\n for (const version of versions) {\n const paths = this.getMiniappEntryPaths(packageName, version)\n if (paths?.background || paths?.ui) return version\n }\n return null\n }\n\n /** True iff {@link getLatestDevSnapshotVersion} finds a usable snapshot. */\n public hasDevSnapshot(packageName: string): boolean {\n return this.getLatestDevSnapshotVersion(packageName) != null\n }\n\n public getMetadata(packageName: string, version: string): InstalledInfo {\n try {\n const lmaDir = new Directory(Paths.document, \"lmas\", packageName, version)\n const miniappJsonFile = new File(lmaDir, \"miniapp.json\")\n const manifest = JSON.parse(miniappJsonFile.textSync())\n const iconPath = typeof manifest.icon === \"string\" && manifest.icon.trim() ? manifest.icon : \"icon.png\"\n const safeRelativeIcon =\n !/^[a-z]+:/i.test(iconPath) && !iconPath.startsWith(\"/\") && !iconPath.split(\"/\").includes(\"..\")\n const declaredIcon = safeRelativeIcon ? new File(lmaDir, iconPath) : null\n const logoUrl = declaredIcon?.exists ? declaredIcon.uri : new File(lmaDir, \"icon.png\").uri\n return {name: manifest.name, logoUrl: logoUrl}\n } catch (error) {\n console.error(\"APP_REGISTRY: Error getting local miniapp metadata\", error)\n return {name: \"error\", logoUrl: \"\"}\n }\n }\n\n public getInstalledInfo(): InstalledLma[] {\n const packageNames = this.getPackageNames()\n const out: InstalledLma[] = []\n for (const packageName of packageNames) {\n const versionStrings = this.getInstalledVersions(packageName)\n const installedVersion: InstalledLma = {packageName, versions: {}}\n for (const versionString of versionStrings) {\n installedVersion.versions[versionString] = this.getMetadata(packageName, versionString)\n }\n out.push(installedVersion)\n }\n return out\n }\n\n /**\n * Merge disk-derived apps with the projected dev + offline layers,\n * de-duping by packageName. An active dev registration wins over an older\n * disk install of the same package; installing a release clears that dev\n * registration in finalizeInstall. Native offline apps keep top priority.\n */\n private mergeProjectedApps(diskApps: ClientApp[], includeBackgroundOnly = false): ClientApp[] {\n const offline = this.projectOfflineApps().filter((app) => isOfflineSystemMiniappAllowed(app.packageName))\n const offlinePackages = new Set(offline.map((app) => app.packageName))\n const dev = this.projectDevApps().filter(\n (app) =>\n isDevMiniappAllowed(app.packageName) &&\n !offlinePackages.has(app.packageName) &&\n !this.getSelectedDevSnapshot(app.packageName),\n )\n const devPackages = new Set(dev.map((app) => app.packageName))\n const installed = diskApps.filter(\n (app) =>\n (app.version?.startsWith(\"dev-\")\n ? isDevMiniappAllowed(app.packageName)\n : this.isReleaseAllowed(app.packageName, app.version)) &&\n !offlinePackages.has(app.packageName) &&\n !devPackages.has(app.packageName),\n )\n // A background-only miniapp (a Store) never appears in user-facing lists;\n // only the host's own maintenance asks for it.\n return [...installed, ...dev, ...offline].filter((app) =>\n isMiniappAvailable(app.packageName, includeBackgroundOnly ? \"background\" : \"interactive\"),\n )\n }\n\n public async getInstalledMiniapps({includeBackgroundOnly = false}: {includeBackgroundOnly?: boolean} = {}): Promise<\n ClientApp[]\n > {\n if (!this.refreshNeeded && this.cachedApps.length > 0) {\n // Cache hit: re-project running from the registry. The cached array\n // IS the disk-derived truth; running comes from the mount registry.\n return this.mergeProjectedApps(\n this.cachedApps.map((a) => ({\n ...a,\n running: miniappRunningRegistry.has(a.packageName),\n })),\n includeBackgroundOnly,\n )\n }\n\n try {\n const installedInfo = this.getInstalledInfo()\n const out: ClientApp[] = []\n for (const lmaInfo of installedInfo) {\n const versionString = await this.getActiveVersion(lmaInfo.packageName)\n if (!versionString) continue\n const versionInfo = lmaInfo.versions[versionString]\n\n const manifest = this.getMiniappManifest(lmaInfo.packageName, versionString) as {\n permissions?: Array<string | {type: string; required?: boolean; description?: string}>\n hardwareRequirements?: Array<{type: string; level: string; description?: string}>\n type?: string\n actions?: Array<{\n id?: unknown\n description?: unknown\n parameters?: unknown\n outputSchema?: unknown\n lifecycle?: unknown\n audience?: unknown\n }>\n } | null\n\n const permissions = normalizeManifestPermissions(manifest?.permissions)\n const hardwareRequirements = buildHardwareRequirements(manifest?.hardwareRequirements, lmaInfo.packageName)\n const appType = normalizeManifestType(manifest?.type)\n\n // Declared actions (for session.miniapps.list + invoke gating).\n const actions = normalizeManifestActions(manifest?.actions)\n\n // Dev miniapps live in the same lmas/ tree as installed ones, but\n // their version directory name starts with \"dev-\".\n const isMiniappDev = versionString.startsWith(\"dev-\")\n let devUrl: string | undefined\n if (isMiniappDev && !this.getSelectedDevSnapshot(lmaInfo.packageName)) {\n const devUrlRes = storage.load<string>(`${lmaInfo.packageName}_dev_url`)\n if (devUrlRes.is_ok()) devUrl = devUrlRes.value\n }\n\n out.push({\n packageName: lmaInfo.packageName,\n version: versionString,\n running: miniappRunningRegistry.has(lmaInfo.packageName),\n local: true,\n healthy: true,\n loading: false,\n offline: false,\n hidden: false,\n offlineRoute: \"\",\n name: versionInfo.name,\n webviewUrl: \"\",\n logoUrl: versionInfo.logoUrl,\n type: appType,\n permissions,\n hardwareRequirements,\n // Always project actions (even []) so the invoke gate can enforce\n // declared-action membership unconditionally — an app with no declared\n // actions must reject every invoke, not bypass the check.\n actions,\n ...(isMiniappDev ? {isMiniappDev: true} : {}),\n ...(devUrl ? {devUrl} : {}),\n onStart: () => saveLocalAppRunningState(lmaInfo.packageName, true),\n onStop: () => saveLocalAppRunningState(lmaInfo.packageName, false),\n })\n }\n\n this.cachedApps = out\n this.refreshNeeded = false\n if (!this.loaded) {\n this.loaded = true\n this.notify()\n }\n return this.mergeProjectedApps(this.cachedApps, includeBackgroundOnly)\n } catch (error) {\n console.error(\"APP_REGISTRY: Error getting local applets\", error)\n return this.mergeProjectedApps(\n this.cachedApps.map((a) => ({\n ...a,\n running: miniappRunningRegistry.has(a.packageName),\n })),\n includeBackgroundOnly,\n )\n }\n }\n\n /** Force the next getInstalledMiniapps() to re-derive from disk + records. */\n public markRefreshNeeded(): void {\n this.refreshNeeded = true\n this.notify()\n }\n\n /**\n * Project persisted dev-app metadata records into ClientApp tiles. Dev\n * miniapps aren't installed to disk (they load over HTTP), so they don't\n * appear in the `lmas/` scan — this surfaces them on the home screen so\n * they're re-launchable without re-scanning the QR.\n */\n private projectDevApps(): ClientApp[] {\n return getDevAppRecords().map((rec) => {\n // Every dev rebuild has a unique snapshot directory. Prefer its manifest\n // icon so home tiles update with the bundle instead of retaining the\n // separately cached, stable-path QR preview (and its decoded image cache).\n const snapshotVersion = this.getLatestDevSnapshotVersion(rec.packageName)\n const snapshotIcon = snapshotVersion ? this.getMetadata(rec.packageName, snapshotVersion).logoUrl : undefined\n const permissions = normalizeManifestPermissions(rec.permissions)\n const hardwareRequirements = buildHardwareRequirements(rec.hardwareRequirements, rec.packageName)\n return {\n packageName: rec.packageName,\n version: undefined,\n running: miniappRunningRegistry.has(rec.packageName),\n local: true,\n healthy: true,\n loading: false,\n offline: false,\n hidden: false,\n offlineRoute: \"\",\n name: rec.name,\n webviewUrl: \"\",\n logoUrl: snapshotIcon || rec.iconUrl,\n type: normalizeManifestType(rec.type),\n permissions,\n hardwareRequirements,\n actions: normalizeManifestActions(rec.actions),\n isMiniappDev: true,\n devUrl: rec.devUrl,\n devPort: rec.devPort,\n onStart: () => saveLocalAppRunningState(rec.packageName, true),\n onStop: () => saveLocalAppRunningState(rec.packageName, false),\n }\n })\n }\n\n private projectOfflineApps(): ClientApp[] {\n // Offline apps don't go through miniappRunningRegistry (that's for\n // MiniappHost-mounted webviews). Their running flag is persisted to\n // MMKV by saveLocalAppRunningState — read it back here so refreshes\n // don't blow away the active flag.\n return this.offlineApps.map((a) => {\n const running = getLocalAppRunningState(a.packageName)\n const screenshot = getLocalAppScreenshot(a.packageName)\n\n return {...a, running, screenshot}\n })\n }\n\n // Register an offline (locally-routed) app. Survives disk rebuilds.\n public installOfflineApp(app: ClientApp, opts?: {requiresLocalSttModel?: boolean}): void {\n if (opts?.requiresLocalSttModel) {\n this.sttModelRequired.add(app.packageName)\n }\n this.offlineApps.push({\n ...app,\n onStart: () => saveLocalAppRunningState(app.packageName, true),\n onStop: () => saveLocalAppRunningState(app.packageName, false),\n })\n this.refreshNeeded = true\n this.notify()\n }\n\n /**\n * Update whether a registered offline app is projected into launcher UIs.\n *\n * Offline apps are registered once at host startup, so settings-backed\n * visibility changes need to update the projection without reinstalling or\n * duplicating the app. No-op when the app is missing or already matches.\n */\n public setOfflineAppHidden(packageName: string, hidden: boolean): void {\n const app = this.offlineApps.find((candidate) => candidate.packageName === packageName)\n if (!app || app.hidden === hidden) return\n\n app.hidden = hidden\n this.refreshNeeded = true\n this.notify()\n }\n\n /**\n * Registered as needing the on-device STT model before it can start (the\n * host declares this per offline app; the apps store gates start() on it).\n */\n public requiresLocalSttModel(packageName: string): boolean {\n return this.sttModelRequired.has(packageName)\n }\n\n public getMiniappHtml(packageName: string, version: string): Result<string, Error> {\n return Res.try(() => {\n const lmaDir = new Directory(Paths.document, \"lmas\", packageName, version)\n const htmlFile = new File(lmaDir, \"index.html\")\n return htmlFile.textSync()\n })\n }\n}\n\n/**\n * Persist the running flag for a local miniapp (read on next cold boot so\n * autostart picks the right set of apps). Exported for hosts that want to\n * track running state independently.\n */\nexport function saveLocalAppRunningState(packageName: string, status: boolean): void {\n storage.save(`${packageName}_running`, status)\n}\n\nexport function getLocalAppRunningState(packageName: string): boolean {\n const res = storage.load<boolean>(`${packageName}_running`)\n if (res.is_ok()) return res.value\n return false\n}\n\nexport function getLocalAppScreenshot(packageName: string): string | undefined {\n const key = `${packageName}_screenshot`\n const res = storage.load<string>(key)\n if (res.is_error()) return undefined\n\n const uri = res.value\n if (uri.startsWith(\"file://\")) {\n try {\n if (!new File(uri).exists) {\n storage.remove(key)\n return undefined\n }\n } catch {\n storage.remove(key)\n return undefined\n }\n }\n\n return uri\n}\n\n/**\n * Persisted metadata for a dev miniapp's home tile.\n *\n * Dev miniapps load directly off the dev server over HTTP and are NOT\n * installed into `lmas/`, so the disk scan in `getInstalledMiniapps` can't\n * see them. We persist a tiny record at scan / dev-URL-entry time so the\n * tile survives across app launches and is re-launchable without re-scanning.\n * `permissions` / `hardwareRequirements` are snapshotted from the manifest so\n * the home-screen permission gate has data without a disk bundle.\n */\nexport interface DevAppRecord {\n packageName: string\n name: string\n iconUrl: string\n devUrl: string\n devPort?: number\n /**\n * Bonjour / mDNS hostname from the QR (`ComputerName.local`). Used as a\n * failover host when the raw LAN IP in `devUrl` goes stale after a Wi-Fi\n * change — phones that resolve `.local` can relaunch without re-scanning.\n */\n mdnsHost?: string\n type?: AppletType\n permissions?: Array<string | {type: string; required?: boolean; description?: string}>\n hardwareRequirements?: Array<{type: string; level: string; description?: string}>\n /** Manifest-declared actions — so dev-sideloaded miniapps can be invoked too. */\n actions?: Array<{\n id?: unknown\n description?: unknown\n parameters?: unknown\n outputSchema?: unknown\n lifecycle?: unknown\n audience?: unknown\n }>\n /** Legacy single-slot migration field. New records use the real packageName directly. */\n sourcePackageName?: string\n}\n\nconst DEV_APPS_INDEX_KEY = \"dev_apps_index\"\nconst DEV_APP_ICONS_DIR = \"dev-miniapp-icons\"\n\nfunction isPrivateLanHost(hostname: string): boolean {\n return (\n hostname === \"localhost\" ||\n hostname.startsWith(\"192.168.\") ||\n hostname.startsWith(\"10.\") ||\n /^172\\.(1[6-9]|2\\d|3[0-1])\\./.test(hostname)\n )\n}\n\nfunction rewriteStaleDevUrl(value: string): string {\n if (!__DEV__) return value\n const host = configuredDevHost()\n if (!host) return value\n\n try {\n const url = new URL(value)\n if (url.hostname === host || !isPrivateLanHost(url.hostname)) return value\n url.hostname = host\n return url.toString().replace(/\\/$/, \"\")\n } catch {\n return value\n }\n}\n\nfunction normalizeDevAppRecord(record: DevAppRecord): DevAppRecord {\n const devUrl = rewriteStaleDevUrl(record.devUrl)\n const iconUrl = rewriteStaleDevUrl(record.iconUrl)\n return devUrl === record.devUrl && iconUrl === record.iconUrl ? record : {...record, devUrl, iconUrl}\n}\n\n/** Legacy package used by builds that supported only one dev miniapp. */\nexport const DEV_APP_PACKAGE_NAME = \"com.dev\"\nexport const DEV_APP_NAME = \"Dev\"\n\n/**\n * Copy a dev-server icon into Documents so the tile remains branded after the\n * laptop/server disappears. A failed download is non-fatal: the remote URL is\n * retained and can still render while the server is reachable.\n */\nasync function cacheDevAppIcon(packageName: string, iconUrl: string): Promise<string> {\n if (!/^https?:\\/\\//.test(iconUrl)) return iconUrl\n\n try {\n const dir = new Directory(Paths.document, DEV_APP_ICONS_DIR)\n if (!dir.exists) dir.create({intermediates: true})\n\n const safePackageName = packageName.replace(/[^a-zA-Z0-9._-]/g, \"_\")\n let extension = \".png\"\n try {\n const match = new URL(iconUrl).pathname.match(/\\.(png|jpe?g|webp|gif|svg)$/i)\n if (match) extension = `.${match[1].toLowerCase()}`\n } catch {\n // Keep the decoder-friendly .png fallback; image loaders sniff content.\n }\n\n const target = new File(dir, `${safePackageName}${extension}`)\n const downloaded = await File.downloadFileAsync(iconUrl, target, {idempotent: true})\n\n // Only remove older extensions AFTER the replacement is safely on disk;\n // a broken icon URL must not destroy the last known-good cached logo.\n for (const item of dir.list()) {\n if (item instanceof File && item.uri !== downloaded.uri && item.name.startsWith(`${safePackageName}.`)) {\n try {\n item.delete()\n } catch {\n // Best effort; the current icon has already been persisted.\n }\n }\n }\n return downloaded.uri\n } catch (error) {\n console.warn(`APP_REGISTRY: failed to cache dev icon for ${packageName}:`, error)\n return readDevAppRecord(packageName)?.iconUrl ?? iconUrl\n }\n}\n\nfunction removeDevRecordKeys(packageName: string): void {\n const existing = readDevAppRecord(packageName)\n if (existing?.iconUrl.startsWith(\"file://\")) {\n try {\n const icon = new File(existing.iconUrl)\n if (icon.exists) icon.delete()\n } catch (error) {\n console.warn(`APP_REGISTRY: failed to delete dev icon for ${packageName}:`, error)\n }\n }\n storage.remove(`${packageName}_dev_meta`)\n storage.remove(`${packageName}_dev_url`)\n storage.remove(`${packageName}_dev_port`)\n storage.remove(`${packageName}_dev_mdns`)\n storage.remove(`${packageName}_dev_last_reachable`)\n}\n\nfunction readDevAppRecord(packageName: string): DevAppRecord | null {\n const res = storage.load<string>(`${packageName}_dev_meta`)\n if (!res.is_ok()) return null\n try {\n return JSON.parse(res.value) as DevAppRecord\n } catch {\n return null\n }\n}\n\n/** Move the historical `com.dev` record onto its real manifest package key. */\nfunction migrateLegacyDevSlot(): void {\n const legacy = readDevAppRecord(DEV_APP_PACKAGE_NAME)\n const targetPackage = legacy?.sourcePackageName?.trim()\n if (!legacy || !targetPackage || targetPackage === DEV_APP_PACKAGE_NAME) return\n\n const existingTarget = readDevAppRecord(targetPackage)\n const migrated: DevAppRecord = existingTarget ?? {\n ...legacy,\n packageName: targetPackage,\n sourcePackageName: targetPackage,\n }\n if (!existingTarget) storage.save(`${targetPackage}_dev_meta`, JSON.stringify(migrated))\n\n const legacyUrl = storage.load<string>(`${DEV_APP_PACKAGE_NAME}_dev_url`)\n const targetUrl = storage.load<string>(`${targetPackage}_dev_url`)\n if (!targetUrl.is_ok()) {\n storage.save(`${targetPackage}_dev_url`, legacyUrl.is_ok() ? legacyUrl.value : migrated.devUrl)\n }\n const legacyPort = storage.load<number>(`${DEV_APP_PACKAGE_NAME}_dev_port`)\n const targetPort = storage.load<number>(`${targetPackage}_dev_port`)\n if (!targetPort.is_ok()) {\n const port = migrated.devPort ?? (legacyPort.is_ok() ? legacyPort.value : undefined)\n if (typeof port === \"number\" && Number.isFinite(port)) storage.save(`${targetPackage}_dev_port`, port)\n }\n const legacyMdns = storage.load<string>(`${DEV_APP_PACKAGE_NAME}_dev_mdns`)\n const targetMdns = storage.load<string>(`${targetPackage}_dev_mdns`)\n if (!targetMdns.is_ok() && legacyMdns.is_ok() && legacyMdns.value.trim()) {\n storage.save(`${targetPackage}_dev_mdns`, legacyMdns.value.trim())\n }\n\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_meta`)\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_url`)\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_port`)\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_mdns`)\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_last_reachable`)\n\n const index = Array.from(new Set(getDevAppIndex().map((pkg) => (pkg === DEV_APP_PACKAGE_NAME ? targetPackage : pkg))))\n storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(index))\n}\n\nfunction readStoredMdnsHost(packageName: string): string | undefined {\n const res = storage.load<string>(`${packageName}_dev_mdns`)\n if (!res.is_ok()) return undefined\n return res.value.trim() || undefined\n}\n\n/**\n * Whether live development code may run under `packageName`. The deployment\n * must allow miniapp development. A dev build is the package itself, served\n * unsigned, so it is also refused while the installed package carries a\n * publisher signature (throwing {@link SignedMiniappDevBuildError});\n * uninstalling clears that signature.\n */\nexport function assertDevBuildAllowed(packageName: string): void {\n assertMiniappDevelopmentAllowed()\n assertUnsignedDevBuildAllowed({\n packageName,\n installedFingerprint: appRegistry.getPublisherKeyFingerprint(packageName),\n })\n}\n\n/**\n * Register or update one dev miniapp under its real manifest package. Different\n * package names coexist; rescanning the same package updates that package only.\n * The phone keeps the record, its `${packageName}_dev_*` routing keys, and the\n * dev-build marking until a release install or uninstall replaces them.\n *\n * A dev build follows the local-build rules whatever name it claims: it keeps\n * its data apart from the package's, its tokens are marked as a local build's,\n * it never gets system privileges and it never updates from a URL.\n *\n * `assertCurrent` runs after the icon download, immediately before the record\n * and routing keys are written: an install whose session ended meanwhile\n * throws there, so it never selects its server in a later session.\n */\nexport async function registerDevApp(record: DevAppRecord, options: {assertCurrent?: () => void} = {}): Promise<void> {\n migrateLegacyDevSlot()\n const packageName = record.packageName.trim()\n if (!packageName) throw new Error(\"Dev miniapp manifest is missing packageName\")\n assertDevBuildAllowed(packageName)\n\n const iconUrl = await cacheDevAppIcon(packageName, record.iconUrl)\n options.assertCurrent?.()\n // Relaunch paths (developer-URL screen, loadDevMiniapp) omit mdnsHost, so an\n // omitted field keeps whatever the QR scan stored instead of wiping the\n // `.local` failover host.\n const mdnsHost = record.mdnsHost !== undefined ? record.mdnsHost.trim() || undefined : readStoredMdnsHost(packageName)\n const devRecord: DevAppRecord = {\n ...record,\n packageName,\n sourcePackageName: packageName,\n name: record.name || DEV_APP_NAME,\n iconUrl,\n mdnsHost,\n }\n storage.save(`${packageName}_dev_meta`, JSON.stringify(devRecord))\n storage.remove(`${packageName}_dev_selected_snapshot`)\n storage.save(`${packageName}_dev_url`, record.devUrl)\n if (typeof record.devPort === \"number\" && Number.isFinite(record.devPort)) {\n storage.save(`${packageName}_dev_port`, record.devPort)\n } else {\n storage.remove(`${packageName}_dev_port`)\n }\n if (mdnsHost) {\n storage.save(`${packageName}_dev_mdns`, mdnsHost)\n } else {\n storage.remove(`${packageName}_dev_mdns`)\n }\n const idx = getDevAppIndex()\n if (!idx.includes(packageName)) {\n idx.push(packageName)\n storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(idx))\n }\n appRegistry.markRefreshNeeded()\n}\n\n/** Drop one dev miniapp's metadata, routing keys, and cached icon. */\nexport function unregisterDevApp(packageName = DEV_APP_PACKAGE_NAME): void {\n removeDevRecordKeys(packageName)\n const idx = getDevAppIndex().filter((p) => p !== packageName)\n storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(idx))\n appRegistry.markRefreshNeeded()\n}\n\nfunction getDevAppIndex(): string[] {\n const res = storage.load<string>(DEV_APPS_INDEX_KEY)\n if (!res.is_ok()) return []\n try {\n const parsed = JSON.parse(res.value)\n return Array.isArray(parsed) ? (parsed as string[]) : []\n } catch {\n return []\n }\n}\n\nexport function getDevAppRecords(): DevAppRecord[] {\n migrateLegacyDevSlot()\n const out: DevAppRecord[] = []\n for (const pkg of getDevAppIndex()) {\n const res = storage.load<string>(`${pkg}_dev_meta`)\n if (!res.is_ok()) continue\n try {\n const record = JSON.parse(res.value) as DevAppRecord\n const normalized = normalizeDevAppRecord(record)\n if (normalized !== record) {\n storage.save(`${pkg}_dev_meta`, JSON.stringify(normalized))\n storage.save(`${pkg}_dev_url`, normalized.devUrl)\n }\n out.push(normalized)\n } catch {\n /* corrupt record — skip */\n }\n }\n return out\n}\n\nconst appRegistry = AppRegistry.getInstance()\nexport default appRegistry\n\n/** Whether a Fleet assignment is one of the reasons `packageName` is installed. */\nexport function hasAssignmentReason(packageName: string): boolean {\n return appRegistry.getInstallReasons(packageName).includes(\"assignment\")\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AppRegistry.js","sourceRoot":"","sources":["../../src/services/AppRegistry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AppRegistry — on-disk install/uninstall registry for local miniapps.\n *\n * Owns the `Documents/lmas/<packageName>/<version>/` filesystem layout, the\n * one installer every source uses (QR/manual releases, bundled ZIPs,\n * deployment-managed releases, dev snapshots), and the active-version pointer\n * in MMKV. It does NOT touch the apps store directly — instead it notifies\n * subscribers when the install set changes, so the host (mobile manager, OEM\n * app) can refresh its own state.\n *\n * Every install validates the archive, applies the publisher signer rule and\n * the version rule (never lower than an installed release), and activates the\n * bundle and its registry metadata in one serialized, crash-recoverable\n * transaction. See {@link InstallBundleOptions}.\n *\n * Public surface:\n * - installFromUrl(url, opts?) install/replace a miniapp from a URL\n * - installFromLocalZip(path, opts?) install/replace from a local zip\n * - uninstall(packageName, version?) remove one or all versions\n * - getInstalledMiniapps() ClientApp[] derived from disk\n * - getActiveVersion(packageName) active version string for a package\n * - getPublisherKeyFingerprint(pkg) recorded publisher signer, if any\n * - getLatestDevSnapshotVersion(pkg) newest on-disk `dev-*` snapshot\n * - getBundleDir / getMiniappManifest filesystem helpers used by hosts\n * - subscribe(fn) register a refresh listener\n */\n\nimport {fetch as expoFetch} from \"expo/fetch\"\nimport {Directory, Paths, File} from \"expo-file-system\"\nimport {unzip} from \"react-native-zip-archive\"\nimport {createMMKV, type MMKV} from \"react-native-mmkv\"\nimport semver from \"semver\"\nimport {AsyncResult, Result, result as Res} from \"typesafe-ts\"\n\nimport type {AppletType, ClientApp} from \"../types/applet\"\nimport {HardwareRequirement, HardwareRequirementLevel, HardwareType} from \"../types\"\nimport {readBoundedByteStream} from \"../utils/boundedByteStream\"\nimport {configuredDevHost} from \"../utils/configuredDevHost\"\nimport {invalidateDevSnapshotRequests} from \"../utils/devSnapshotRequests\"\nimport {storage} from \"../utils/storage/storage\"\nimport {printDirectory} from \"../utils/storage/zip\"\nimport {sha256Hex} from \"../utils/sha256\"\nimport {\n assertMiniappDevelopmentAllowed,\n getConfigValues,\n isDevMiniappAllowed,\n isInstalledMiniappAllowed,\n isLocalMiniappPackageAllowed,\n isMiniappAvailable,\n isOfflineSystemMiniappAllowed,\n} from \"../runtime/bootstrap\"\nimport {\n type ActivatedInstall,\n type ActivationArtifact,\n type InstallFinalization,\n completeInstallFilesystemTransaction,\n installedVersionDirectoryNames,\n interruptedActivationRecovery,\n isInstallScratchDirectoryName,\n nextInstallOperationId,\n parseActivationArtifact,\n runInstallFilesystemTransaction,\n} from \"./installOperation\"\nimport {checkManifestVersions} from \"./manifestVersionGate\"\nimport {linkedEntry} from \"./miniappFiles\"\nimport {checkMiniappRunsOnPhone, type MiniappVersionPolicy} from \"./miniappInstallCompatibility\"\nimport {normalizeManifestActions} from \"./manifestActions\"\nimport {normalizeManifestPermissions} from \"./manifestPermissions\"\nimport {isFileUriInside} from \"./miniappPaths\"\nimport {\n assertMiniappUpdateVersion,\n miniappInstallIdentityError,\n type MiniappInstallExpectations,\n} from \"./miniappInstallIdentity\"\nimport {\n forgetDevSnapshotOwner,\n isAssignedByCurrentWorkspace,\n isDevelopmentSelectionCurrent,\n isDevSnapshotOfCurrentContext,\n isDevSnapshotVisible,\n recordDevSnapshotOwner,\n restoreStashedDevelopmentSelection,\n stashedDevelopmentSelectionOf,\n type StashedDevelopmentSelection,\n} from \"./miniappDataPartition\"\nimport {miniappRunningRegistry} from \"./MiniappRunningRegistry\"\nimport {assertPublisherIdentityPolicy, assertUnsignedDevBuildAllowed} from \"./publisherIdentityPolicy\"\nimport {selectReleaseVersionsForGarbageCollection} from \"./releaseVersionGc\"\nimport {sameMiniappBundle} from \"./sameMiniappBundle\"\nimport {validateInstallBundleArchive} from \"./validateInstallBundle\"\n\nexport {normalizeManifestActions} from \"./manifestActions\"\nexport {normalizeManifestPermissions} from \"./manifestPermissions\"\nexport {SignedMiniappDevBuildError} from \"./publisherIdentityPolicy\"\n\nfunction normalizeManifestType(raw: unknown): AppletType {\n return raw === \"background\" || raw === \"system_dashboard\" || raw === \"standard\" ? raw : \"standard\"\n}\n\n/**\n * Convert declared hardwareRequirements from a miniapp.json manifest into\n * runtime `HardwareRequirement[]`, always appending `{EXIST, REQUIRED}` so\n * launchers show \"Glasses Required\" when no glasses are connected.\n *\n * Malformed entries are dropped with a single warning per package so the\n * rest of the manifest still works.\n */\nexport function buildHardwareRequirements(\n raw: Array<{type: string; level: string; description?: string}> | undefined,\n packageName: string,\n): HardwareRequirement[] {\n const out: HardwareRequirement[] = []\n const validTypes = new Set(Object.values(HardwareType) as string[])\n const validLevels = new Set(Object.values(HardwareRequirementLevel) as string[])\n\n if (!Array.isArray(raw)) {\n if (raw !== undefined) {\n console.warn(`APP_REGISTRY: ${packageName} has invalid hardwareRequirements (not an array); treating as []`)\n }\n } else {\n let warned = false\n for (const r of raw) {\n if (\n !r ||\n typeof r !== \"object\" ||\n typeof r.type !== \"string\" ||\n typeof r.level !== \"string\" ||\n !validTypes.has(r.type) ||\n !validLevels.has(r.level)\n ) {\n if (!warned) {\n console.warn(\n `APP_REGISTRY: ${packageName} has malformed hardwareRequirements entry; skipping invalid entries`,\n r,\n )\n warned = true\n }\n continue\n }\n out.push({\n type: r.type as HardwareType,\n level: r.level as HardwareRequirementLevel,\n ...(typeof r.description === \"string\" ? {description: r.description} : {}),\n })\n }\n }\n\n // Every miniapp requires connected glasses.\n out.push({type: HardwareType.EXIST, level: HardwareRequirementLevel.REQUIRED})\n return out\n}\n\ninterface InstalledInfo {\n name: string\n logoUrl: string\n}\n\ninterface InstalledLma {\n packageName: string\n versions: Record<string, InstalledInfo>\n}\n\n/**\n * Where an installed release came from. `url`: installed from the miniapp's own URL (`sourceUrl`).\n * `direct_download`: a release Fleet installed from a resolved URL, or a release QR on an earlier Mentra App.\n * `bundled_asset`: the ZIP this build ships.\n * `deployment_manifest`: a workspace's deployment manifest. `dev_snapshot`: a development build. `local`: a\n * local-network build or a release QR (`sourceUrl` is its address), always a `dev-*` development snapshot: it never\n * updates from a URL, never gets system privileges, keeps its data apart and gets tokens marked as a local build.\n */\nexport type MiniappReleaseSource =\n | \"direct_download\"\n | \"bundled_asset\"\n | \"deployment_manifest\"\n | \"dev_snapshot\"\n | \"local\"\n | \"url\"\n\n/**\n * Sources only releases that earlier Mentra Apps installed carry: read, never written. `store`: installed by a\n * bundled Store. `system_store`: a bundled package a Store updated. `preinstalled_registry`: installed by Core's\n * retired preinstall registry.\n */\nexport type RetiredMiniappReleaseSource = \"preinstalled_registry\" | \"store\" | \"system_store\"\n\nexport interface MiniappReleaseIdentity {\n source: MiniappReleaseSource | RetiredMiniappReleaseSource\n /** The miniapp URL (`url` and `local` releases): the base that serves `miniapp.json`, ending in `/`. */\n sourceUrl?: string\n /** `url` releases: the miniapp's server asked for sign-in, for `miniapp.json` or the ZIP. */\n private?: boolean\n bundleSha256?: string\n /** The Store that installed this release, and its release id and channel (`store` / `system_store`, read only). */\n storePackageName?: string\n releaseId?: string\n channel?: string\n deploymentId?: string\n deploymentOrigin?: string\n /**\n * Verified Ed25519 publisher fingerprint from the bundle's\n * `META-INF/MENTRA.SIG`. Set only by the installer after verification.\n */\n publisherKeyFingerprint?: string\n}\n\n/** The identity an install records: a current source, and none of the retired Store's fields. */\nexport type InstallableReleaseIdentity = Omit<\n MiniappReleaseIdentity,\n \"source\" | \"storePackageName\" | \"releaseId\" | \"channel\"\n> & {source: MiniappReleaseSource}\n\n/**\n * Why a package is installed (the provisioning spec's installation reasons). Kept apart from the artifact's\n * provenance, {@link MiniappReleaseIdentity.source}: a package installs once and may hold several reasons, and the\n * `assignment` reason never appears in `source`.\n */\nexport type MiniappInstallReason = \"bundled\" | \"explicit\" | \"manifest\" | \"assignment\"\nexport const MINIAPP_INSTALL_REASONS: readonly MiniappInstallReason[] = [\n \"bundled\",\n \"explicit\",\n \"manifest\",\n \"assignment\",\n]\n\n/** The Fleet assignment behind a package's `assignment` reason. */\nexport interface MiniappAssignment {\n assignmentId: string\n assignmentRevision: number\n workspaceId: string\n /** The Core and account the assignment was made to. Its data partition belongs to them. */\n coreUrl: string\n mentraUserId: string\n url: string\n}\n\ninterface StoredInstallReasons {\n reasons: MiniappInstallReason[]\n assignment?: MiniappAssignment\n}\n\n/** Options shared by every install entry point. */\nexport interface InstallBundleOptions {\n /**\n * Install under this version instead of `manifest.version`. The dev caching\n * path uses `dev-<ms>` so snapshots coexist with semver-installed versions.\n */\n versionOverride?: string\n /** Recorded with the release. Installs write only current sources. */\n releaseIdentity?: InstallableReleaseIdentity\n /** The archive's manifest must name this package. */\n expectedPackageName?: string\n /** The archive's manifest must declare this version. */\n expectedVersion?: string\n /** Refuse to overwrite a version that is already installed. */\n rejectExistingVersion?: boolean\n /** The downloaded ZIP must have this SHA-256 (the one its `miniapp.json` or manifest names). */\n expectedBundleSha256?: string\n /**\n * Remote installs: fetch the ZIP's bytes this way instead of with an anonymous request, for a miniapp URL whose\n * server may ask for sign-in. It runs before the release identity is read, so it may complete that identity. The\n * installer still checks the size and `expectedBundleSha256` of what it returns.\n */\n downloadBundle?: (url: string) => Promise<Uint8Array>\n /** Refuse a bundle this host cannot run. Hardware is the glasses' business, and never refuses an install. */\n compatibilityPolicy?: MiniappVersionPolicy\n onProgress?: (phase: InstallProgressPhase) => void\n /**\n * Runs once the bundle is downloaded, verified, checked against the signer,\n * version and compatibility rules, and unpacked, before the serialized\n * activation. It may wait (for example for the user's consent) without\n * holding up other installs. Throwing discards the unpacked files.\n */\n whenStaged?: () => Promise<void>\n /**\n * Synchronous check run inside the serialized install, after extraction and\n * immediately before installed files change. Throwing aborts the install\n * and leaves the previous installation untouched.\n */\n beforeActivate?: () => void\n /**\n * Add this installation reason in the same metadata commit as the bundle. With `assignment`, `assignment` must\n * name it. Without either, the package's reasons are unchanged.\n */\n installReason?: MiniappInstallReason\n assignment?: MiniappAssignment\n}\n\nexport type InstallProgressPhase = \"downloading\" | \"verifying\" | \"extracting\" | \"activating\"\n\nexport interface UninstallOptions {\n /**\n * Runs inside the serialized uninstall, before anything is removed. Throwing keeps the package as it is: a caller\n * that checked what it may remove checks again here, where no install can change it.\n */\n beforeRemove?: () => void\n /** What Fleet records the removal as started by (Phase 12, `miniapp_install`); the person's own removal by default. */\n fleetSource?: \"url\" | \"assignment\" | \"manifest\" | \"local\" | \"bundled\"\n}\n\n/** Local ZIP installs may additionally adopt an identical, already installed bundle. */\nexport interface LocalZipInstallOptions extends InstallBundleOptions {\n /** Host-only migration after the deployment ZIP's digest is verified. */\n adoptIdenticalInstalledVersion?: boolean\n}\n\nconst MAX_REMOTE_BUNDLE_BYTES = 50 * 1024 * 1024\nconst REMOTE_BUNDLE_TIMEOUT_MS = 45_000\nconst INSTALL_METADATA_ROLLBACK_FILE = \"metadata-rollback.json\"\n\nfunction releaseIdentityKey(packageName: string, version: string): string {\n return `miniapp_release_identity:${packageName}:${version}`\n}\n\nfunction publisherIdentityKey(packageName: string): string {\n return `miniapp_publisher_identity:${packageName}`\n}\n\nfunction activeVersionKey(packageName: string): string {\n return `${packageName}_active_version`\n}\n\nfunction installReasonsKey(packageName: string): string {\n return `miniapp_install_reasons:${packageName}`\n}\n\nfunction revokedAccessKey(packageName: string): string {\n return `miniapp_access_revoked:${packageName}`\n}\n\ninterface StorageSnapshot<T> {\n present: boolean\n value?: T\n}\n\n// Live-dev routing for a package. A release install clears it in the same\n// metadata transaction that activates the release, so an interrupted install\n// can never leave a committed release shadowed by its old dev registration.\nconst DEV_ROUTING_FIELDS = [\"meta\", \"url\", \"port\", \"mdns\", \"last_reachable\", \"selected_snapshot\"] as const\ntype DevRoutingSnapshot = Record<(typeof DEV_ROUTING_FIELDS)[number], StorageSnapshot<unknown>>\n\n/** Written into the pending activation marker before any metadata changes. */\ninterface InstallMetadataRollbackJournal {\n schemaVersion: 1\n packageName: string\n version: string\n publisher: StorageSnapshot<string>\n release: StorageSnapshot<MiniappReleaseIdentity>\n active: StorageSnapshot<string>\n devRouting?: DevRoutingSnapshot\n /** The current context's stashed selection of the package, which a release install empties (see finalizeInstall). */\n devStash?: StashedDevelopmentSelection\n reasons?: StorageSnapshot<StoredInstallReasons>\n}\n\nfunction isStashedDevelopmentSelection(value: unknown): value is StashedDevelopmentSelection {\n const stash = value as Partial<StashedDevelopmentSelection> | null\n return (\n Boolean(stash) &&\n typeof stash!.contextId === \"string\" &&\n Boolean(stash!.selection) &&\n typeof stash!.selection === \"object\" &&\n !Array.isArray(stash!.selection)\n )\n}\n\nfunction snapshotStorage<T>(key: string): StorageSnapshot<T> {\n const loaded = storage.load<T>(key)\n return loaded.is_ok() ? {present: true, value: loaded.value} : {present: false}\n}\n\nfunction restoreStorage<T>(key: string, snapshot: StorageSnapshot<T>): void {\n if (!snapshot.present) {\n const removed = storage.remove(key)\n if (removed.is_error()) throw removed.error\n return\n }\n const restored = storage.save(key, snapshot.value)\n if (restored.is_error()) throw restored.error\n}\n\nfunction isStorageSnapshot(value: unknown, valueType: \"object\" | \"string\" | \"any\"): value is StorageSnapshot<unknown> {\n if (!value || typeof value !== \"object\" || typeof (value as {present?: unknown}).present !== \"boolean\") return false\n const snapshot = value as {present: boolean; value?: unknown}\n if (!snapshot.present) return true\n if (valueType === \"any\") return Object.prototype.hasOwnProperty.call(snapshot, \"value\")\n return valueType === \"string\"\n ? typeof snapshot.value === \"string\"\n : Boolean(snapshot.value && typeof snapshot.value === \"object\" && !Array.isArray(snapshot.value))\n}\n\nfunction readMetadataRollbackJournal(\n pendingDir: Directory,\n packageName: string,\n version: string,\n): InstallMetadataRollbackJournal | null {\n try {\n const file = new File(pendingDir, INSTALL_METADATA_ROLLBACK_FILE)\n if (!file.exists) return null\n const parsed = JSON.parse(file.textSync()) as Partial<InstallMetadataRollbackJournal>\n if (\n parsed.schemaVersion !== 1 ||\n parsed.packageName !== packageName ||\n parsed.version !== version ||\n !isStorageSnapshot(parsed.publisher, \"string\") ||\n !isStorageSnapshot(parsed.release, \"object\") ||\n !isStorageSnapshot(parsed.active, \"string\") ||\n (parsed.reasons !== undefined && !isStorageSnapshot(parsed.reasons, \"object\")) ||\n (parsed.devStash !== undefined && !isStashedDevelopmentSelection(parsed.devStash)) ||\n (parsed.devRouting !== undefined &&\n (!parsed.devRouting ||\n DEV_ROUTING_FIELDS.some((field) => !isStorageSnapshot(parsed.devRouting?.[field], \"any\"))))\n ) {\n console.warn(`APP_REGISTRY: ignoring invalid metadata rollback journal for ${packageName}@${version}`)\n return null\n }\n return parsed as InstallMetadataRollbackJournal\n } catch (error) {\n // Metadata writes start only after this file has been written successfully,\n // so a missing/corrupt journal means there is no partial metadata commit to\n // undo. Filesystem rollback remains safe and authoritative.\n console.warn(`APP_REGISTRY: could not read metadata rollback journal for ${packageName}@${version}`, error)\n return null\n }\n}\n\n// Bundle files survive logout; their provenance and publisher must survive with\n// them. Keep installation metadata out of the default, session-cleared MMKV store.\nlet installationMetadata: MMKV | undefined\nfunction getInstallationMetadata(): MMKV {\n return (installationMetadata ??= createMMKV({id: \"mentra-miniapp-installations\"}))\n}\n\nfunction snapshotInstallationMetadata<T>(key: string): StorageSnapshot<T> {\n const metadata = getInstallationMetadata()\n const stored = metadata.getString(key)\n if (stored) return {present: true, value: JSON.parse(stored) as T}\n // Migrate pre-upgrade metadata from the default store when it still exists.\n const legacy = snapshotStorage<T>(key)\n if (legacy.present) {\n metadata.set(key, JSON.stringify(legacy.value))\n storage.remove(key)\n }\n return legacy\n}\n\nfunction restoreInstallationMetadata<T>(key: string, snapshot: StorageSnapshot<T>): void {\n const metadata = getInstallationMetadata()\n if (snapshot.present) metadata.set(key, JSON.stringify(snapshot.value))\n else metadata.remove(key)\n const removed = storage.remove(key)\n if (removed.is_error()) throw removed.error\n}\n\nfunction restoreDevRouting(packageName: string, snapshot: DevRoutingSnapshot): void {\n for (const field of DEV_ROUTING_FIELDS) restoreStorage(`${packageName}_dev_${field}`, snapshot[field])\n}\n\nfunction restoreInstallMetadata(journal: InstallMetadataRollbackJournal): void {\n if (journal.reasons) restoreInstallationMetadata(installReasonsKey(journal.packageName), journal.reasons)\n if (journal.devRouting) restoreDevRouting(journal.packageName, journal.devRouting)\n if (journal.devStash) restoreStashedDevelopmentSelection(journal.packageName, journal.devStash)\n restoreStorage(activeVersionKey(journal.packageName), journal.active)\n restoreInstallationMetadata(releaseIdentityKey(journal.packageName, journal.version), journal.release)\n restoreInstallationMetadata(publisherIdentityKey(journal.packageName), journal.publisher)\n}\n\nfunction readStoredInstallReasons(packageName: string): StoredInstallReasons | null {\n try {\n const stored = getInstallationMetadata().getString(installReasonsKey(packageName))\n if (!stored) return null\n const parsed = JSON.parse(stored) as Partial<StoredInstallReasons>\n const reasons = Array.isArray(parsed.reasons)\n ? MINIAPP_INSTALL_REASONS.filter((reason) => parsed.reasons!.includes(reason))\n : []\n const assignment = reasons.includes(\"assignment\") && parsed.assignment ? parsed.assignment : undefined\n return assignment ? {reasons, assignment} : {reasons: reasons.filter((reason) => reason !== \"assignment\")}\n } catch {\n return null\n }\n}\n\nfunction writeStoredInstallReasons(packageName: string, value: StoredInstallReasons): void {\n getInstallationMetadata().set(installReasonsKey(packageName), JSON.stringify(value))\n}\n\n/** A package installed before reasons were recorded holds the reason its provenance implies. */\nfunction inferredInstallReason(identity: MiniappReleaseIdentity | null): MiniappInstallReason {\n switch (identity?.source) {\n case \"bundled_asset\":\n case \"system_store\":\n case \"preinstalled_registry\":\n return \"bundled\"\n case \"deployment_manifest\":\n return \"manifest\"\n default:\n return \"explicit\"\n }\n}\n\n/** The installed signer decides which bundles may replace a package. */\nfunction assertPublisherContinuity(packageName: string, publisherKeyFingerprint: string | undefined): void {\n const installed = snapshotInstallationMetadata<string>(publisherIdentityKey(packageName))\n assertPublisherIdentityPolicy({\n packageName,\n candidateFingerprint: publisherKeyFingerprint,\n installedFingerprint: installed.present ? installed.value : null,\n })\n}\n\nfunction assertInstallCompatibility(\n manifest: Awaited<ReturnType<typeof validateInstallBundleArchive>>,\n policy: NonNullable<InstallBundleOptions[\"compatibilityPolicy\"]>,\n): void {\n const compatibility = checkMiniappRunsOnPhone(manifest, policy)\n if (!compatibility.compatible) throw new Error(compatibility.reason)\n}\n\n/**\n * Download a miniapp zip from `url` and return its bytes. The response is\n * streamed through a size ceiling and a deadline, so an attacker-controlled\n * server cannot exhaust memory or hang an install. An expected SHA-256 is\n * checked before any other step reads the bytes.\n */\nasync function downloadMiniAppZip(\n url: string,\n options: Pick<InstallBundleOptions, \"expectedBundleSha256\" | \"onProgress\"> = {},\n): Promise<Uint8Array> {\n const abortController = new AbortController()\n const timeout = setTimeout(() => abortController.abort(), REMOTE_BUNDLE_TIMEOUT_MS)\n try {\n options.onProgress?.(\"downloading\")\n // React Native's global fetch polyfill does not expose Response.body.\n // Expo fetch provides the native ReadableStream required for bounded\n // downloads without buffering an attacker-controlled response first.\n const requestUrl = new URL(url)\n const response = await expoFetch(url, {signal: abortController.signal})\n if (!response.ok) throw new Error(`bundle download failed with HTTP ${response.status}`)\n if (requestUrl.protocol === \"https:\" && response.url && new URL(response.url).protocol !== \"https:\") {\n throw new Error(\"bundle download redirected away from HTTPS\")\n }\n const declaredSize = Number(response.headers.get(\"content-length\"))\n if (Number.isFinite(declaredSize) && declaredSize > MAX_REMOTE_BUNDLE_BYTES) {\n throw new Error(`bundle exceeds ${MAX_REMOTE_BUNDLE_BYTES} bytes`)\n }\n if (!response.body) throw new Error(\"bundle download returned no response body\")\n const bytes = await readBoundedByteStream(response.body, MAX_REMOTE_BUNDLE_BYTES)\n if (bytes.byteLength === 0) {\n throw new Error(`bundle must be between 1 and ${MAX_REMOTE_BUNDLE_BYTES} bytes`)\n }\n if (options.expectedBundleSha256 !== undefined) {\n const expected = options.expectedBundleSha256.toLowerCase()\n if (!/^[a-f0-9]{64}$/.test(expected)) throw new Error(\"expected bundle SHA-256 is invalid\")\n const actual = await sha256Hex(bytes)\n if (actual !== expected) throw new Error(`bundle SHA-256 mismatch: expected ${expected}, got ${actual}`)\n }\n return bytes\n } catch (error) {\n console.error(\"ZIP: Error downloading zip file\", error)\n if (abortController.signal.aborted) {\n throw new Error(`bundle download timed out after ${REMOTE_BUNDLE_TIMEOUT_MS}ms`)\n }\n throw error instanceof Error ? error : new Error(\"bundle download failed\")\n } finally {\n clearTimeout(timeout)\n }\n}\n\n/**\n * Download a ZIP with the caller's `downloadBundle`, then hold its bytes to the same limits and expected SHA-256 as\n * the installer's own download.\n */\nasync function downloadWith(\n download: NonNullable<InstallBundleOptions[\"downloadBundle\"]>,\n url: string,\n options: Pick<InstallBundleOptions, \"expectedBundleSha256\" | \"onProgress\">,\n): Promise<Uint8Array> {\n options.onProgress?.(\"downloading\")\n const bytes = await download(url)\n if (bytes.byteLength === 0 || bytes.byteLength > MAX_REMOTE_BUNDLE_BYTES) {\n throw new Error(`bundle must be between 1 and ${MAX_REMOTE_BUNDLE_BYTES} bytes`)\n }\n if (options.expectedBundleSha256 !== undefined) {\n const expected = options.expectedBundleSha256.toLowerCase()\n const actual = await sha256Hex(bytes)\n if (actual !== expected) throw new Error(`bundle SHA-256 mismatch: expected ${expected}, got ${actual}`)\n }\n return bytes\n}\n\n/**\n * Every release records the SHA-256 of the ZIP it installed, a bundled or release-QR install included, so Fleet can\n * report it and an assignment can tell whether its URL serves the same bytes. Development snapshots record none.\n */\nexport async function withReleaseDigest(\n identity: MiniappReleaseIdentity,\n version: string,\n bytes: Uint8Array,\n): Promise<MiniappReleaseIdentity> {\n if (identity.bundleSha256 || version.startsWith(\"dev-\")) return identity\n return {...identity, bundleSha256: await sha256Hex(bytes)}\n}\n\n/**\n * Write validated archive bytes to a unique host-owned cache file. Native\n * extraction reads this private copy, never a caller's path that could change\n * while the install waits in the queue. Startup cleanup removes leftovers.\n */\nfunction writePrivateArchive(bytes: Uint8Array): File {\n const directory = new Directory(Paths.cache, \"lma_downloads\")\n try {\n if (!directory.exists) directory.create()\n } catch (error) {\n console.error(\"ZIP: Error creating the archive cache directory\", error)\n throw new Error(\"CREATE_DOWNLOAD_DIR_FAILED\")\n }\n // Never derive the name from an untrusted URL or caller path, and never let\n // two simultaneous installs alias the same file.\n const archive = new File(\n directory,\n `bundle-${nextInstallOperationId()}-${Math.random().toString(36).slice(2, 10)}.zip`,\n )\n archive.write(bytes)\n return archive\n}\n\ntype AdoptExistingBundle = (\n packageName: string,\n version: string,\n extracted: Directory,\n installed: Directory,\n) => Promise<boolean>\n\ninterface InstalledBundle {\n packageName: string\n version: string\n}\n\ninterface UnpackOptions {\n onProgress?: InstallBundleOptions[\"onProgress\"]\n whenStaged?: InstallBundleOptions[\"whenStaged\"]\n}\n\n/**\n * Unpack a local miniapp zip and install it under\n * `lmas/<packageName>/<version>/` inside the serialized install transaction.\n *\n * Zip layout: flat — files at root, `miniapp.json` at the top level. We're\n * strict on shape so we fail loudly on malformed bundles.\n *\n * `validate` runs first inside the queue (after any earlier install\n * committed), `beforeActivate` runs after extraction and before installed\n * files change, and `finalize` writes registry metadata before the atomic\n * commit. Any failure before commit restores the previous installation.\n *\n * With `whenStaged`, extraction happens first, into a private cache directory\n * outside the queue, and the hook may wait before the queue is entered; the\n * queue then activates the already-unpacked files. Without it, extraction stays\n * inside the queue.\n *\n * @param zipPath file:// URI of the zip on local disk.\n * @param versionOverride override the manifest's version field (dev snapshots).\n */\nasync function unpackMiniApp(\n zipPath: string,\n versionOverride: string | undefined,\n expected: MiniappInstallExpectations,\n finalize: (\n installed: InstalledBundle,\n activation: ActivatedInstall<InstalledBundle>,\n ) => InstallFinalization | Promise<InstallFinalization>,\n beforeActivate: () => void,\n validate: () => void,\n adoptExisting?: AdoptExistingBundle,\n options: UnpackOptions = {},\n): Promise<InstalledBundle> {\n if (!options.whenStaged) {\n return completeInstallFilesystemTransaction(\n () =>\n withExtractedMiniApp(zipPath, expected, options.onProgress, (extracted) =>\n activateExtractedMiniApp(\n extracted,\n versionOverride,\n expected,\n beforeActivate,\n adoptExisting,\n options.onProgress,\n ),\n ),\n finalize,\n validate,\n )\n }\n const whenStaged = options.whenStaged\n return withExtractedMiniApp(zipPath, expected, options.onProgress, async (extracted) => {\n await whenStaged()\n return completeInstallFilesystemTransaction(\n () =>\n activateExtractedMiniApp(\n extracted,\n versionOverride,\n expected,\n beforeActivate,\n adoptExisting,\n options.onProgress,\n ),\n finalize,\n validate,\n )\n })\n}\n\ninterface ExtractedMiniApp {\n directory: Directory\n operationId: string\n packageName: string\n manifestVersion: string\n}\n\n/** Unzip into a private cache directory, run `run`, and always remove the directory afterwards. */\nasync function withExtractedMiniApp<T>(\n zipPath: string,\n expected: MiniappInstallExpectations,\n onProgress: InstallBundleOptions[\"onProgress\"],\n run: (extracted: ExtractedMiniApp) => Promise<T>,\n): Promise<T> {\n const operationId = nextInstallOperationId()\n const unzipDir = new Directory(Paths.cache, `lma_unzip-${operationId}`)\n try {\n unzipDir.create()\n } catch (error) {\n console.error(\"ZIP: Error creating the unzip directory\", error)\n throw new Error(\"CREATE_CACHE_DIR_FAILED\")\n }\n\n try {\n return await run(await extractMiniApp(zipPath, unzipDir, operationId, expected, onProgress))\n } finally {\n try {\n if (unzipDir.exists) unzipDir.delete()\n } catch (error) {\n console.warn(\"ZIP: Error cleaning the unzip directory\", error)\n }\n }\n}\n\nasync function extractMiniApp(\n zipPath: string,\n unzipDir: Directory,\n operationId: string,\n expected: MiniappInstallExpectations,\n onProgress: InstallBundleOptions[\"onProgress\"],\n): Promise<ExtractedMiniApp> {\n try {\n onProgress?.(\"extracting\")\n console.log(\"ZIP: unzipping\", zipPath)\n await unzip(zipPath, unzipDir.uri)\n } catch (error) {\n console.error(\"Error unzipping zip file\", error)\n throw new Error(\"UNZIP_FAILED\")\n }\n // The validator refuses ZIP entries marked as links, but the native unzipper decides what it writes. Before\n // anything reads the files, every one must be a plain file or directory where it was written: a link could make\n // the miniapp's files point at the Mentra App's own.\n const linked = linkedEntry(unzipDir)\n if (linked !== null) throw new Error(`bundle contains a symbolic link: ${linked}`)\n\n // Strict zip shape: miniapp.json at unzip root. No tolerance for an\n // enclosing folder or app.json fallback — we own the dev-server emit\n // format, so any deviation indicates a corrupt bundle.\n const appDir = unzipDir\n let packageName: string\n let manifestVersion: string\n try {\n const miniappJsonFile = new File(appDir, \"miniapp.json\")\n if (!miniappJsonFile.exists) throw new Error(\"miniapp.json missing at zip root\")\n const manifest = JSON.parse(miniappJsonFile.textSync())\n if (!manifest.packageName) throw new Error(\"miniapp.json missing packageName\")\n if (!manifest.version) throw new Error(\"miniapp.json missing version\")\n packageName = manifest.packageName\n manifestVersion = manifest.version\n } catch (error) {\n console.error(\"Error reading miniapp.json from zip:\", error)\n throw new Error(\"READ_MANIFEST_FAILED\")\n }\n // The extracted manifest must be the one that was validated.\n const identityError = miniappInstallIdentityError({packageName, version: manifestVersion}, expected)\n if (identityError) throw new Error(identityError)\n return {directory: unzipDir, operationId, packageName, manifestVersion}\n}\n\nasync function activateExtractedMiniApp(\n extracted: ExtractedMiniApp,\n versionOverride: string | undefined,\n expected: MiniappInstallExpectations,\n beforeActivate: () => void,\n adoptExisting: AdoptExistingBundle | undefined,\n onProgress: InstallBundleOptions[\"onProgress\"],\n): Promise<ActivatedInstall<InstalledBundle>> {\n const {directory: appDir, operationId, packageName} = extracted\n const version = versionOverride ?? extracted.manifestVersion\n console.log(`ZIP: installing ${packageName} as version ${version}`)\n\n const basePackageDir = new Directory(Paths.document, \"lmas\", packageName)\n try {\n if (!basePackageDir.exists) {\n basePackageDir.create({intermediates: true})\n }\n } catch (error) {\n console.error(\"Error creating the base package directory\", error)\n throw new Error(\"CREATE_PACKAGE_DIR_FAILED\")\n }\n\n const directory = (name: string) => new Directory(basePackageDir, name)\n const stagingName = `.staging-${version}-${operationId}`\n const backupName = `.backup-${version}-${operationId}`\n const hadExisting = directory(version).exists\n let adoptingExisting = false\n if (expected.rejectExistingVersion && hadExisting) {\n // A verified deployment may claim identical bundled bytes without replacing\n // the installed directory. Ownership still commits through the same journal.\n adoptingExisting = Boolean(adoptExisting && (await adoptExisting(packageName, version, appDir, directory(version))))\n if (!adoptingExisting) throw new Error(`Miniapp ${packageName}@${version} is already installed`)\n }\n const activationKind = hadExisting ? \"existing\" : \"new\"\n const pendingName = `.pending-${activationKind}-${version}-${operationId}`\n const committedName = `.committed-${activationKind}-${version}-${operationId}`\n try {\n if (!adoptingExisting) directory(stagingName).create()\n } catch (error) {\n console.error(\"Error creating the staging directory\", error)\n throw new Error(\"CREATE_VERSION_DIR_FAILED\")\n }\n\n try {\n const contents = adoptingExisting ? [] : appDir.list()\n for (const item of contents) {\n item.move(directory(stagingName))\n }\n } catch (error) {\n console.error(\"Error moving the contents of the folder to the destination directory\", error)\n if (directory(stagingName).exists) directory(stagingName).delete()\n throw new Error(\"INSTALL_CONTENTS_FAILED\")\n }\n\n // Recheck the signer and version rules (and any caller guard) now that the\n // bundle is staged and no installed file has changed yet.\n try {\n beforeActivate()\n } catch (error) {\n if (directory(stagingName).exists) directory(stagingName).delete()\n throw error\n }\n\n // Swap only after the complete bundle is staged. If activation fails,\n // restore a previous same-version directory instead of leaving a partial\n // installation behind.\n let movedExisting = false\n onProgress?.(\"activating\")\n try {\n // Move an existing target aside before creating the pending marker. A\n // crash in that first move leaves only a backup, which startup restores.\n // Once the marker exists its name records whether a prior target existed,\n // making recovery idempotent even if it is interrupted itself.\n if (!adoptingExisting && directory(version).exists) {\n directory(version).move(directory(backupName))\n movedExisting = true\n }\n directory(pendingName).create()\n if (!adoptingExisting) directory(stagingName).move(directory(version))\n } catch (error) {\n console.error(\"Error activating the staged miniapp\", error)\n try {\n if (movedExisting) {\n if (directory(version).exists) directory(version).delete()\n if (directory(backupName).exists) directory(backupName).move(directory(version))\n } else if (!hadExisting && directory(version).exists) {\n // No prior install can be harmed; remove a partially moved first\n // install if the filesystem move failed after creating its target.\n directory(version).delete()\n }\n if (directory(stagingName).exists) directory(stagingName).delete()\n if (directory(pendingName).exists) directory(pendingName).delete()\n } catch (rollbackError) {\n console.error(\"Error restoring the previous miniapp version\", rollbackError)\n }\n throw new Error(\"ACTIVATE_VERSION_FAILED\")\n }\n\n console.log(\"ZIP: local mini app installed at\", directory(version).uri)\n printDirectory(directory(version), 2)\n return {\n value: {packageName, version},\n commit: () => {\n // Renaming the journal is the atomic commit boundary. Recovery keeps a\n // candidate with a committed marker and rolls back one with a pending\n // marker. Cleanup after the rename may be retried on the next launch.\n if (directory(pendingName).exists) directory(pendingName).move(directory(committedName))\n else if (!directory(committedName).exists) throw new Error(\"activation journal disappeared before commit\")\n try {\n if (directory(backupName).exists) directory(backupName).delete()\n if (directory(committedName).exists) directory(committedName).delete()\n } catch (error) {\n console.warn(\"ZIP: Error cleaning committed miniapp activation artifacts\", error)\n }\n },\n rollback: (options?: {preserveRecoveryState?: boolean}) => {\n try {\n if (options?.preserveRecoveryState && directory(committedName).exists) {\n if (directory(pendingName).exists) directory(committedName).delete()\n else directory(committedName).move(directory(pendingName))\n }\n if (!adoptingExisting) {\n if (directory(version).exists) directory(version).delete()\n if (directory(backupName).exists) directory(backupName).move(directory(version))\n }\n if (!options?.preserveRecoveryState) {\n if (directory(pendingName).exists) directory(pendingName).delete()\n if (directory(committedName).exists) directory(committedName).delete()\n }\n } catch (error) {\n console.error(\"ZIP: Error rolling back miniapp after metadata finalization failed\", error)\n throw error\n }\n },\n recordRecoveryState: (serializedState: string) => {\n const file = new File(directory(pendingName), INSTALL_METADATA_ROLLBACK_FILE)\n file.write(serializedState)\n },\n }\n}\n\nfunction directoryNames(directory: Directory): string[] {\n return directory\n .list()\n .filter((entry): entry is Directory => entry instanceof Directory)\n .map((entry) => entry.name)\n}\n\n/** Delete the locally cached icon named by a serialized dev record, best effort. */\nfunction deleteCachedDevIcon(serializedRecord: string, packageName: string): void {\n try {\n const iconUrl = (JSON.parse(serializedRecord) as Partial<DevAppRecord>).iconUrl\n if (typeof iconUrl !== \"string\" || !iconUrl.startsWith(\"file://\")) return\n const icon = new File(iconUrl)\n if (icon.exists) icon.delete()\n } catch (error) {\n console.warn(`APP_REGISTRY: failed to delete dev icon for ${packageName}:`, error)\n }\n}\n\ntype Listener = () => void\n\nclass AppRegistry {\n private cachedApps: ClientApp[] = []\n // Offline apps live in a separate layer so they survive the disk-rebuild\n // path in getInstalledMiniapps (which reassigns cachedApps).\n private offlineApps: ClientApp[] = []\n /** Package names whose start() requires the on-device STT model (host-declared). */\n private sttModelRequired = new Set<string>()\n private refreshNeeded: boolean = true\n private loaded = false\n private listeners = new Set<Listener>()\n private retainedDevVersions = new Map<string, Set<string>>()\n\n /** Hold the running and rollback bundles while an explicit replacement settles. */\n public retainDevVersions(packageName: string, versions: string[]): () => void {\n if (this.retainedDevVersions.has(packageName)) throw new Error(\"A miniapp replacement is already in progress\")\n this.retainedDevVersions.set(packageName, new Set(versions.filter((version) => version.startsWith(\"dev-\"))))\n return () => {\n this.retainedDevVersions.delete(packageName)\n }\n }\n\n private protectedDevVersions(packageName: string): Set<string> {\n const versions = new Set(this.retainedDevVersions.get(packageName))\n const selected = this.getSelectedDevSnapshot(packageName)\n if (selected) versions.add(selected)\n const active = storage.load<string>(activeVersionKey(packageName))\n if (active.is_ok() && active.value.startsWith(\"dev-\") && miniappRunningRegistry.has(packageName))\n versions.add(active.value)\n return versions\n }\n\n private removeReleaseIdentity(packageName: string, version: string): void {\n const key = releaseIdentityKey(packageName, version)\n getInstallationMetadata().remove(key)\n storage.remove(key)\n if (version.startsWith(\"dev-\")) forgetDevSnapshotOwner(packageName, version)\n }\n\n /**\n * Why `packageName` is installed. A package installed before reasons were recorded holds the reason its active\n * release's provenance implies. Empty when it is not installed and holds no recorded reason.\n */\n public getInstallReasons(packageName: string): MiniappInstallReason[] {\n const stored = readStoredInstallReasons(packageName)\n if (stored) return [...stored.reasons]\n const version = this.getActiveReleaseVersion(packageName)\n if (version === null) return []\n return [inferredInstallReason(this.getReleaseIdentity(packageName, version))]\n }\n\n /**\n * The installed release (not a `dev-*` snapshot) that stands for the package: the stored active version when it\n * is a release on disk, else the newest release. Null when only development builds are on disk. Reads only.\n */\n public getActiveReleaseVersion(packageName: string): string | null {\n const versions = this.getInstalledVersions(packageName).filter((version) => !version.startsWith(\"dev-\"))\n if (versions.length === 0) return null\n const active = storage.load<string>(activeVersionKey(packageName))\n if (active.is_ok() && versions.includes(active.value)) return active.value\n return versions.filter((candidate) => semver.valid(candidate)).sort(semver.rcompare)[0] ?? versions[0]\n }\n\n /** True once the installed miniapps have been read from disk (the first `getInstalledMiniapps`). */\n public isLoaded(): boolean {\n return this.loaded\n }\n\n /** The assignment behind the package's `assignment` reason, or null. */\n public getMiniappAssignment(packageName: string): MiniappAssignment | null {\n return readStoredInstallReasons(packageName)?.assignment ?? null\n }\n\n /** Every installed package holding an `assignment` reason, whichever account's assignment recorded it. */\n public getAssignedPackages(): string[] {\n return this.getPackageNames().filter((packageName) =>\n readStoredInstallReasons(packageName)?.reasons.includes(\"assignment\"),\n )\n }\n\n /**\n * A live-development URL, build or snapshot would run for the package instead of its installed release. True also\n * while a live context of the package holds an earlier account's or workspace's selection: it is not this context's\n * to clear, and the current one's is restored when that context stops.\n */\n public hasDevelopmentSelection(packageName: string): boolean {\n return (\n !isDevelopmentSelectionCurrent(packageName) ||\n readDevAppRecord(packageName) !== null ||\n storage.load<string>(`${packageName}_dev_url`).is_ok() ||\n this.chooseActiveVersion(packageName).version?.startsWith(\"dev-\") === true\n )\n }\n\n /**\n * Clear the package's live-development selection and the development builds of the current context, as a release\n * install does, so launching runs its installed release. Another account's or workspace's snapshots stay on disk\n * with their selections. Resolves false, clearing nothing, while a live context of the package still holds an\n * earlier context's selection. Serialized with installs: `assertCurrent` runs once the transaction holds the queue,\n * before anything changes, so a caller whose session ended while it waited clears nothing.\n */\n public clearDevelopmentSelection(packageName: string, options: {assertCurrent?: () => void} = {}): Promise<boolean> {\n return runInstallFilesystemTransaction(async () => {\n options.assertCurrent?.()\n if (!isDevelopmentSelectionCurrent(packageName)) return false\n invalidateDevSnapshotRequests(packageName)\n this.clearDevArtifacts(packageName, {currentContextOnly: true})\n const active = storage.load<string>(activeVersionKey(packageName))\n if (active.is_ok() && active.value.startsWith(\"dev-\")) storage.remove(activeVersionKey(packageName))\n this.refreshNeeded = true\n this.notify()\n return true\n })\n }\n\n /** Add the `assignment` reason (or replace its assignment), keeping every other reason. */\n public setMiniappAssignment(packageName: string, assignment: MiniappAssignment): void {\n this.recordAssignment(packageName, assignment)\n this.notify()\n }\n\n /** Remove the `assignment` reason. Returns the reasons that remain. Uninstalls nothing. */\n public clearMiniappAssignment(packageName: string): MiniappInstallReason[] {\n const remaining = this.getInstallReasons(packageName).filter((reason) => reason !== \"assignment\")\n writeStoredInstallReasons(packageName, {reasons: remaining})\n this.notify()\n return remaining\n }\n\n /** Add a reason other than `assignment` (which needs {@link setMiniappAssignment}). */\n public addInstallReason(packageName: string, reason: Exclude<MiniappInstallReason, \"assignment\">): void {\n this.recordInstallReason(packageName, reason)\n this.notify()\n }\n\n /** The reasons a package holds while `replaced`, the identity of a release being replaced in place, is hidden. */\n private installReasonsReplacing(\n packageName: string,\n replaced: MiniappReleaseIdentity | null,\n ): MiniappInstallReason[] {\n const reasons = this.getInstallReasons(packageName)\n if (reasons.length > 0 || readStoredInstallReasons(packageName) || !replaced) return reasons\n return [inferredInstallReason(replaced)]\n }\n\n /** Writes without notifying: the install transaction notifies once its files commit. */\n private recordAssignment(\n packageName: string,\n assignment: MiniappAssignment,\n current: MiniappInstallReason[] = this.getInstallReasons(packageName),\n ): void {\n const reasons = new Set(current)\n reasons.add(\"assignment\")\n writeStoredInstallReasons(packageName, {\n reasons: MINIAPP_INSTALL_REASONS.filter((reason) => reasons.has(reason)),\n assignment,\n })\n }\n\n private recordInstallReason(\n packageName: string,\n reason: Exclude<MiniappInstallReason, \"assignment\">,\n current: MiniappInstallReason[] = this.getInstallReasons(packageName),\n ): void {\n const stored = readStoredInstallReasons(packageName)\n const reasons = new Set(current)\n reasons.add(reason)\n writeStoredInstallReasons(packageName, {\n reasons: MINIAPP_INSTALL_REASONS.filter((candidate) => reasons.has(candidate)),\n ...(stored?.assignment ? {assignment: stored.assignment} : {}),\n })\n }\n\n /**\n * Revocation: the miniapp's server stopped admitting this account. Its installed bundles no longer resolve, so it\n * cannot launch, whatever its reasons (a manual install included). Nothing is uninstalled and no data changes.\n */\n public revokeMiniappAccess(packageName: string): void {\n if (this.isMiniappAccessRevoked(packageName)) return\n getInstallationMetadata().set(revokedAccessKey(packageName), JSON.stringify(true))\n this.refreshNeeded = true\n this.notify()\n }\n\n public restoreMiniappAccess(packageName: string): void {\n if (!this.isMiniappAccessRevoked(packageName)) return\n getInstallationMetadata().remove(revokedAccessKey(packageName))\n this.refreshNeeded = true\n this.notify()\n }\n\n public isMiniappAccessRevoked(packageName: string): boolean {\n return getInstallationMetadata().getString(revokedAccessKey(packageName)) !== undefined\n }\n\n private static instance: AppRegistry | null = null\n\n private constructor() {\n this.cleanupInterruptedInstallCache()\n this.recoverInterruptedActivations()\n }\n\n /** Remove cache artifacts left behind when the process died mid-install. */\n private cleanupInterruptedInstallCache(): void {\n try {\n for (const item of Paths.cache.list()) {\n if (item instanceof Directory && isInstallScratchDirectoryName(item.name)) item.delete()\n }\n\n const downloadDir = new Directory(Paths.cache, \"lma_downloads\")\n if (downloadDir.exists) {\n for (const item of downloadDir.list()) item.delete()\n }\n } catch (error) {\n console.warn(\"APP_REGISTRY: interrupted install cache cleanup failed\", error)\n }\n }\n\n /**\n * Recover an activation interrupted by process death. Pending markers roll\n * back both durable metadata and the filesystem; their encoded prior-target\n * state makes that rollback idempotent. A committed marker is the opposite:\n * metadata and the candidate are authoritative and only cleanup remains.\n * Unjournaled backups are restored when their target is absent. Staging\n * directories are always inert and removable.\n */\n private recoverInterruptedActivations(): void {\n try {\n const lmasDir = new Directory(Paths.document, \"lmas\")\n if (!lmasDir.exists) return\n for (const packageDir of lmasDir.list()) {\n if (!(packageDir instanceof Directory)) continue\n const artifacts = packageDir\n .list()\n .filter((item): item is Directory => item instanceof Directory)\n .map((directory) => ({directory, parsed: parseActivationArtifact(directory.name)}))\n .filter((item): item is {directory: Directory; parsed: ActivationArtifact} => item.parsed !== null)\n\n const committed = artifacts\n .filter((item) => item.parsed.kind === \"committed\")\n .sort((left, right) => right.parsed.timestamp - left.parsed.timestamp)\n for (const {directory, parsed} of committed) {\n const matchingBackup = artifacts.find(\n (item) =>\n item.parsed.kind === \"backup\" &&\n item.parsed.version === parsed.version &&\n item.parsed.timestamp === parsed.timestamp,\n )?.directory\n if (matchingBackup?.exists) matchingBackup.delete()\n if (directory.exists) directory.delete()\n }\n\n const pending = artifacts\n .filter((item) => item.parsed.kind === \"pending\")\n .sort((left, right) => right.parsed.timestamp - left.parsed.timestamp)\n for (const {directory, parsed} of pending) {\n const target = new Directory(packageDir, parsed.version)\n const matchingBackup = artifacts.find(\n (item) =>\n item.parsed.kind === \"backup\" &&\n item.parsed.version === parsed.version &&\n item.parsed.timestamp === parsed.timestamp,\n )?.directory\n const metadataJournal = readMetadataRollbackJournal(directory, packageDir.name, parsed.version)\n if (metadataJournal) restoreInstallMetadata(metadataJournal)\n\n const recovery = interruptedActivationRecovery({\n hasBackup: matchingBackup?.exists === true,\n hadExisting: parsed.hadExisting === true,\n })\n if (recovery === \"restore-backup\") {\n if (target.exists) target.delete()\n new Directory(packageDir, matchingBackup!.name).move(target)\n } else if (recovery === \"remove-target\" && target.exists) {\n target.delete()\n }\n if (directory.exists) directory.delete()\n }\n\n const backups = artifacts\n .filter((item) => item.parsed.kind === \"backup\")\n .sort((left, right) => right.parsed.timestamp - left.parsed.timestamp)\n for (const {directory, parsed} of backups) {\n const target = new Directory(packageDir, parsed.version)\n if (!directory.exists) continue\n if (target.exists) directory.delete()\n else new Directory(packageDir, directory.name).move(target)\n }\n for (const {directory, parsed} of artifacts) {\n if (\n (parsed.kind === \"staging\" || parsed.kind === \"pending\" || parsed.kind === \"committed\") &&\n directory.exists\n ) {\n directory.delete()\n }\n }\n }\n } catch (error) {\n console.warn(\"APP_REGISTRY: interrupted activation recovery failed\", error)\n }\n }\n\n public static getInstance(): AppRegistry {\n if (!AppRegistry.instance) {\n AppRegistry.instance = new AppRegistry()\n }\n return AppRegistry.instance\n }\n\n /** Subscribe to install/uninstall events. Listener fires after refreshNeeded flips. */\n public subscribe(fn: Listener): () => void {\n this.listeners.add(fn)\n return () => {\n this.listeners.delete(fn)\n }\n }\n\n private notify(): void {\n for (const fn of this.listeners) {\n try {\n fn()\n } catch (e) {\n console.warn(\"AppRegistry: listener threw\", e)\n }\n }\n }\n\n /**\n * On-disk path for a given miniapp bundle version.\n */\n public getBundleDir(packageName: string, version: string): string {\n const bundleDir = new Directory(Paths.document, \"lmas\", packageName, version)\n return bundleDir.uri\n }\n\n /**\n * Resolve the two-layer entry paths for an installed miniapp version.\n * Returns absolute file:// URIs for `background` and (when present) `ui`,\n * the bundle's root directory, and the UI entry's path relative to that\n * root. The screen loads from the package's own origin, which serves the\n * root (`miniappOriginUrl(packageName, uiPath, platform)`), so hosts use\n * `rootDir` and `uiPath` rather than the `ui` file.\n *\n * Legacy single-layer bundles (no `entry` object in manifest) fall back\n * to `index.html` discovery so the WebView host keeps working unchanged.\n * Two-layer bundles ship `entry.background` and optional `entry.ui`\n * paths relative to the bundle root.\n *\n * Returns null if neither shape resolves to existing files on disk.\n */\n public getMiniappEntryPaths(\n packageName: string,\n version: string,\n ): {background: string | null; ui: string | null; rootDir: string; uiPath: string | null} | null {\n if (this.isMiniappAccessRevoked(packageName)) return null\n const manifest = this.getMiniappManifest(packageName, version) as {\n entry?: {background?: string; ui?: string}\n } | null\n const bundleDir = this.getBundleDir(packageName, version)\n const resolve = (rel: string): {uri: string; path: string} | null => {\n const trimmed = rel.replace(/^\\.?\\/+/, \"\")\n const file = new File(bundleDir, trimmed)\n // The manifest is the miniapp's: an entry outside its own bundle (`../`) is not one.\n return isFileUriInside(bundleDir, file.uri) && file.exists ? {uri: file.uri, path: trimmed} : null\n }\n if (manifest?.entry) {\n const bg = manifest.entry.background ? resolve(manifest.entry.background) : null\n const ui = manifest.entry.ui ? resolve(manifest.entry.ui) : null\n if (bg || ui) {\n return {background: bg?.uri ?? null, ui: ui?.uri ?? null, rootDir: bundleDir, uiPath: ui?.path ?? null}\n }\n }\n // Legacy single-bundle fallback — `index.html` at the bundle root.\n const legacy = new File(new Directory(bundleDir.replace(/^file:\\/\\//, \"\")), \"index.html\")\n return {\n background: null,\n ui: legacy.exists ? legacy.uri : null,\n rootDir: bundleDir,\n uiPath: legacy.exists ? \"index.html\" : null,\n }\n }\n\n /**\n * Verify a manifest declares an SDK / host version range compatible\n * with the current host. Delegates to the pure\n * {@link checkManifestVersions} helper — same shape, no React Native\n * imports, unit-testable. Manifests missing either field pass\n * through unchanged (legacy single-layer path).\n */\n public checkManifestVersions(\n manifest: {sdkVersion?: string; minHostVersion?: string} | null,\n options: {hostVersion: string; supportedSdkRange: string},\n ): {ok: true} | {ok: false; reason: string} {\n return checkManifestVersions(manifest, options)\n }\n\n /**\n * Read and parse the miniapp manifest (miniapp.json with app.json fallback)\n * from a given bundle directory.\n */\n public getMiniappManifest(packageName: string, version: string): any {\n const bundleDir = new Directory(Paths.document, \"lmas\", packageName, version)\n try {\n const miniappJsonFile = new File(bundleDir, \"miniapp.json\")\n if (miniappJsonFile.exists) {\n return JSON.parse(miniappJsonFile.textSync())\n }\n } catch (e) {\n console.warn(\"AppRegistry: Error reading miniapp.json, trying app.json fallback\", e)\n }\n try {\n const appJsonFile = new File(bundleDir, \"app.json\")\n if (appJsonFile.exists) {\n return JSON.parse(appJsonFile.textSync())\n }\n } catch (e) {\n console.warn(\"AppRegistry: Error reading app.json fallback\", e)\n }\n return null\n }\n\n /**\n * The deployment lets this package run at all ({@link isLocalMiniappPackageAllowed}), a package the account's\n * current workspace assigned included. Launches check it before the release.\n */\n public isPackageAllowed(packageName: string): boolean {\n return isLocalMiniappPackageAllowed(packageName, {assigned: isAssignedByCurrentWorkspace(packageName)})\n }\n\n /**\n * The deployment lets this installed release run ({@link isInstalledMiniappAllowed}): listing, launch precedence,\n * launches and the version rule ask this. A release installed from a URL runs as a Fleet assignment while the\n * account's current workspace assigned the package.\n */\n public isReleaseAllowed(\n packageName: string,\n version: string | undefined,\n identity: MiniappReleaseIdentity | null = version ? this.getReleaseIdentity(packageName, version) : null,\n ): boolean {\n return isInstalledMiniappAllowed(packageName, version, identity, {\n assigned: identity?.source === \"url\" && isAssignedByCurrentWorkspace(packageName),\n })\n }\n\n /**\n * One version rule for every install source: an incoming release must be\n * greater than or equal to every installed release; an equal version is a\n * reinstall. Dev snapshot versions (`dev-*`) are sessions, not releases.\n */\n public assertCanInstallVersion(packageName: string, version: string): void {\n const policy = getConfigValues().localMiniappPolicy\n const workspaceManaged = policy?.managed.some((entry) => entry.packageName === packageName) ?? false\n const installed = this.getInstalledVersions(packageName).filter((installedVersion) => {\n if (!policy) return true\n // In a workspace, consumer releases retained on disk are not installations\n // in that environment; compare only releases its policy can use. For a\n // package the workspace manages, its deployment releases are the\n // installation, never a consumer copy of the same package.\n const identity = this.getReleaseIdentity(packageName, installedVersion)\n if (workspaceManaged && identity?.source !== \"deployment_manifest\") return false\n return this.isReleaseAllowed(packageName, installedVersion, identity)\n })\n assertMiniappUpdateVersion(packageName, version, installed)\n }\n\n /**\n * Download and install a miniapp bundle from a URL. The URL must serve a\n * zip whose root contains `miniapp.json` plus the bundle entry files.\n * The bundle goes through the same validated transaction as every other\n * install source; see {@link InstallBundleOptions}.\n */\n public installFromUrl(url: string, opts?: InstallBundleOptions): AsyncResult<void, Error> {\n return Res.try_async(async () => {\n if (opts?.expectedPackageName) this.assertNoReplacementInProgress(opts.expectedPackageName, opts.versionOverride)\n const bytes = opts?.downloadBundle\n ? await downloadWith(opts.downloadBundle, url, opts)\n : await downloadMiniAppZip(url, {\n expectedBundleSha256: opts?.expectedBundleSha256,\n onProgress: opts?.onProgress,\n })\n console.log(\"ZIP: done downloading, starting unzip\")\n await this.installArchive(bytes, opts, false)\n console.log(\"APP_REGISTRY: Downloaded and installed mini app\")\n })\n }\n\n /**\n * Install a miniapp from a zip already on local disk (e.g. a bundled asset\n * copied into cache). Skips the HTTP download path that `installFromUrl`\n * uses; otherwise identical, including every installation check.\n *\n * @param zipPath file:// URI of the local zip.\n */\n public installFromLocalZip(\n zipPath: string,\n opts?: LocalZipInstallOptions,\n ): AsyncResult<{packageName: string; version: string}, Error> {\n return Res.try_async(async () => {\n if (opts?.expectedPackageName) this.assertNoReplacementInProgress(opts.expectedPackageName, opts.versionOverride)\n if (\n opts?.adoptIdenticalInstalledVersion &&\n (opts.releaseIdentity?.source !== \"deployment_manifest\" ||\n !opts.expectedPackageName ||\n !opts.expectedVersion ||\n opts.versionOverride ||\n !opts.rejectExistingVersion)\n )\n throw new Error(\"Bundle adoption requires a verified deployment release with an exact identity\")\n // Read the caller's file once. Validation and extraction both use this\n // snapshot, so replacing the file afterwards cannot change what installs.\n const bytes = await new File(zipPath).bytes()\n if (opts?.expectedBundleSha256 !== undefined) {\n const expected = opts.expectedBundleSha256.toLowerCase()\n const actual = await sha256Hex(bytes)\n if (actual !== expected) throw new Error(`bundle SHA-256 mismatch: expected ${expected}, got ${actual}`)\n }\n const installed = await this.installArchive(\n bytes,\n opts,\n true,\n opts?.adoptIdenticalInstalledVersion\n ? async (pkg, ver, extracted, installedDir) => {\n const identity = this.getReleaseIdentity(pkg, ver)\n return identity?.source !== \"deployment_manifest\" && (await sameMiniappBundle(extracted, installedDir))\n }\n : undefined,\n )\n console.log(\"APP_REGISTRY: Installed mini app from local zip\")\n return installed\n })\n }\n\n /**\n * A release may not land while a dev build replacement of the same package\n * (retainDevVersions) is settling; dev snapshots belong to that replacement.\n * Checked before download, inside the serialized install, and at commit.\n */\n private assertNoReplacementInProgress(packageName: string, version: string | undefined): void {\n if (!version?.startsWith(\"dev-\") && this.retainedDevVersions.has(packageName))\n throw new Error(\"Cannot install a release during miniapp replacement\")\n }\n\n /**\n * The one installer. Validates the archive bytes, then extracts and\n * activates them in the serialized filesystem transaction. The signer and\n * version rules are checked before extraction and again inside the queue\n * immediately before any installed file changes, so a competing install\n * that commits first cannot make this one's earlier decision valid.\n */\n private async installArchive(\n bytes: Uint8Array,\n opts: InstallBundleOptions | undefined,\n localZip: boolean,\n adoptExisting?: AdoptExistingBundle,\n ): Promise<InstalledBundle> {\n const expected = {packageName: opts?.expectedPackageName, version: opts?.expectedVersion}\n if (opts?.installReason === \"assignment\" && !opts.assignment)\n throw new Error(\"An assignment install must name its assignment\")\n opts?.onProgress?.(\"verifying\")\n const manifest = await validateInstallBundleArchive(bytes, expected)\n // The artifact must be the package and version its source selected.\n const identityError = miniappInstallIdentityError(manifest, expected)\n if (identityError) throw new Error(identityError)\n // The bundle's own manifest decides compatibility, not the catalog that offered it.\n if (opts?.compatibilityPolicy) assertInstallCompatibility(manifest, opts.compatibilityPolicy)\n const version = opts?.versionOverride ?? manifest.version\n // The publisher fingerprint only ever comes from signature verification.\n const {publisherKeyFingerprint: _callerFingerprint, ...callerIdentity} = opts?.releaseIdentity ?? {\n source: version.startsWith(\"dev-\") ? \"dev_snapshot\" : localZip ? \"bundled_asset\" : \"direct_download\",\n }\n const releaseIdentity: MiniappReleaseIdentity = {\n ...(await withReleaseDigest(callerIdentity, version, bytes)),\n ...(manifest.publisherKeyFingerprint ? {publisherKeyFingerprint: manifest.publisherKeyFingerprint} : {}),\n }\n const validateTrust = () => {\n this.assertNoReplacementInProgress(manifest.packageName, version)\n assertPublisherContinuity(manifest.packageName, manifest.publisherKeyFingerprint)\n this.assertCanInstallVersion(manifest.packageName, version)\n }\n // Fail fast before extraction; the transaction checks again under the queue.\n validateTrust()\n // Extract exactly the bytes that were validated.\n const archive = writePrivateArchive(bytes)\n try {\n return await unpackMiniApp(\n archive.uri,\n opts?.versionOverride,\n {\n packageName: manifest.packageName,\n version: manifest.version,\n rejectExistingVersion: opts?.rejectExistingVersion,\n },\n ({packageName, version: installedVersion}, activation) =>\n this.finalizeInstall(\n packageName,\n installedVersion,\n releaseIdentity,\n (state) => activation.recordRecoveryState(state),\n opts?.installReason,\n opts?.assignment,\n ),\n () => {\n validateTrust()\n opts?.beforeActivate?.()\n },\n validateTrust,\n adoptExisting,\n {onProgress: opts?.onProgress, whenStaged: opts?.whenStaged},\n )\n } finally {\n try {\n if (archive.exists) archive.delete()\n } catch (error) {\n console.warn(\"ZIP: Error removing the private archive copy\", error)\n }\n }\n }\n\n /**\n * Registry metadata for an activation, applied before the atomic commit:\n * the verified publisher (recorded the first time a signed bundle installs),\n * the release identity, the active-version pointer, and — for a release —\n * the removal of the package's live-dev routing. A rollback journal is\n * written first so a crash before commit restores all of it.\n */\n private finalizeInstall(\n packageName: string,\n version: string,\n releaseIdentity: MiniappReleaseIdentity,\n recordRecoveryState: (serializedState: string) => void,\n installReason?: MiniappInstallReason,\n assignment?: MiniappAssignment,\n ): InstallFinalization {\n const publisherKey = publisherIdentityKey(packageName)\n const releaseKey = releaseIdentityKey(packageName, version)\n const activeKey = activeVersionKey(packageName)\n const releaseInstall = !version.startsWith(\"dev-\")\n const publisherBefore = snapshotInstallationMetadata<string>(publisherKey)\n const previousRelease = this.getReleaseIdentity(packageName, version)\n const releaseBefore: StorageSnapshot<MiniappReleaseIdentity> = previousRelease\n ? {present: true, value: previousRelease}\n : {present: false}\n const activeBefore = snapshotStorage<string>(activeKey)\n const devRoutingBefore = releaseInstall\n ? (Object.fromEntries(\n DEV_ROUTING_FIELDS.map((field) => [field, snapshotStorage(`${packageName}_dev_${field}`)]),\n ) as DevRoutingSnapshot)\n : undefined\n // A live context may hold an earlier context's selection: the current context's then waits in the stash. The\n // release replaces that one too, in the same transaction as the live keys.\n const devStashBefore = releaseInstall ? stashedDevelopmentSelectionOf(packageName) : null\n const reasonsKey = installReasonsKey(packageName)\n const reasonsBefore = installReason ? snapshotInstallationMetadata<StoredInstallReasons>(reasonsKey) : undefined\n // The pending activation hides a replaced same-version release from inference: take the reasons it held.\n const reasonsAtActivation = installReason ? this.installReasonsReplacing(packageName, previousRelease) : []\n\n const rollbackJournal: InstallMetadataRollbackJournal = {\n schemaVersion: 1,\n packageName,\n version,\n publisher: publisherBefore,\n release: releaseBefore,\n active: activeBefore,\n ...(devRoutingBefore ? {devRouting: devRoutingBefore} : {}),\n ...(devStashBefore ? {devStash: devStashBefore} : {}),\n ...(reasonsBefore ? {reasons: reasonsBefore} : {}),\n }\n recordRecoveryState(JSON.stringify(rollbackJournal))\n\n // Whether the live development selection this release replaces is the current context's. While a live context\n // still holds an earlier context's, the install leaves that one alone and replaces the current context's.\n let selectionCurrent = true\n\n const rollbackMetadata = () => {\n let firstError: unknown\n for (const restore of [\n () => {\n if (devRoutingBefore) restoreDevRouting(packageName, devRoutingBefore)\n },\n () => {\n if (devStashBefore) restoreStashedDevelopmentSelection(packageName, devStashBefore)\n },\n () => restoreStorage(activeKey, activeBefore),\n () => restoreInstallationMetadata(releaseKey, releaseBefore),\n () => restoreInstallationMetadata(publisherKey, publisherBefore),\n () => {\n if (reasonsBefore) restoreInstallationMetadata(reasonsKey, reasonsBefore)\n },\n ]) {\n try {\n restore()\n } catch (rollbackError) {\n console.error(\"APP_REGISTRY: failed to restore install metadata after finalization error\", rollbackError)\n firstError ??= rollbackError\n }\n }\n if (firstError !== undefined) throw firstError\n }\n\n return {\n apply: () => {\n // The commit point: apply and the commit rename run without yielding,\n // so a replacement that began after the queue's checks still wins.\n this.assertNoReplacementInProgress(packageName, version)\n if (releaseInstall) {\n // A dev probe or snapshot download started earlier must not\n // reactivate development code over this release.\n invalidateDevSnapshotRequests(packageName)\n // A held earlier context's live keys stay; the current context's selection is replaced wherever it is.\n selectionCurrent = isDevelopmentSelectionCurrent(packageName)\n if (selectionCurrent) {\n for (const field of DEV_ROUTING_FIELDS) restoreStorage(`${packageName}_dev_${field}`, {present: false})\n }\n if (devStashBefore) {\n restoreStashedDevelopmentSelection(packageName, {contextId: devStashBefore.contextId, selection: {}})\n }\n }\n // Every signed install records its publisher, development snapshots\n // included: from here on only bundles signed with the same key replace\n // this package, until an uninstall clears the record.\n if (releaseIdentity.publisherKeyFingerprint) {\n getInstallationMetadata().set(publisherKey, JSON.stringify(releaseIdentity.publisherKeyFingerprint))\n }\n getInstallationMetadata().set(releaseKey, JSON.stringify(releaseIdentity))\n if (installReason === \"assignment\") this.recordAssignment(packageName, assignment!, reasonsAtActivation)\n else if (installReason) this.recordInstallReason(packageName, installReason, reasonsAtActivation)\n if (!releaseInstall) recordDevSnapshotOwner(packageName, version)\n // Do not notify until the pending filesystem marker has committed.\n // A subscriber scanning here would exclude the pending version and\n // could replace this pointer with the previous installed release.\n const activated = storage.save(activeKey, version)\n if (activated.is_error()) throw activated.error\n },\n rollback: rollbackMetadata,\n afterCommit: () => {\n if (releaseInstall) {\n // Routing already committed with the active release. Only disposable\n // snapshot files, the dev index entry and the cached dev icon remain,\n // so an interruption here cannot select old dev code.\n // Only the current context's development builds go; a held selection of another context keeps its own.\n try {\n this.gcDevVersions(packageName, 0, {currentContext: true})\n if (selectionCurrent) {\n if (getDevAppIndex().includes(packageName)) {\n storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(getDevAppIndex().filter((pkg) => pkg !== packageName)))\n }\n const devMeta = devRoutingBefore?.meta\n if (devMeta?.present && typeof devMeta.value === \"string\") deleteCachedDevIcon(devMeta.value, packageName)\n }\n } catch (error) {\n console.warn(`APP_REGISTRY: failed to clean obsolete dev artifacts for ${packageName}`, error)\n }\n }\n this.refreshNeeded = true\n this.notify()\n },\n }\n }\n\n public getReleaseIdentity(packageName: string, version: string): MiniappReleaseIdentity | null {\n if (!version) return null\n try {\n const snapshot = snapshotInstallationMetadata<MiniappReleaseIdentity>(releaseIdentityKey(packageName, version))\n return snapshot.present ? snapshot.value! : null\n } catch {\n return null\n }\n }\n\n /**\n * A miniapp installed from its URL moved (a permanent redirect within its domain): record the URL this release\n * updates from now. Only `sourceUrl` changes. Answers false, and changes nothing, unless the release is a `url`\n * release that still records `fromUrl`, so a move can't overwrite a release an install just replaced.\n */\n public setReleaseSourceUrl(packageName: string, version: string, fromUrl: string, sourceUrl: string): boolean {\n const identity = this.getReleaseIdentity(packageName, version)\n if (identity?.source !== \"url\" || identity.sourceUrl !== fromUrl) return false\n getInstallationMetadata().set(releaseIdentityKey(packageName, version), JSON.stringify({...identity, sourceUrl}))\n return true\n }\n\n /** The publisher key a package is pinned to, or null when it is unsigned or not installed. */\n public getPublisherKeyFingerprint(packageName: string): string | null {\n try {\n const snapshot = snapshotInstallationMetadata<string>(publisherIdentityKey(packageName))\n return snapshot.present ? snapshot.value! : null\n } catch {\n return null\n }\n }\n\n /** Enumerate installed releases carrying deployment ownership metadata. */\n public getDeploymentOwnedReleases(): Array<{\n packageName: string\n version: string\n identity: MiniappReleaseIdentity\n }> {\n const releases: Array<{packageName: string; version: string; identity: MiniappReleaseIdentity}> = []\n for (const packageName of this.getPackageNames()) {\n for (const version of this.getInstalledVersions(packageName)) {\n const identity = this.getReleaseIdentity(packageName, version)\n if (identity?.source === \"deployment_manifest\") releases.push({packageName, version, identity})\n }\n }\n return releases\n }\n\n /**\n * Drop every dev-* version directory for a package plus ALL dev MMKV keys\n * (URL/port/reachability + the home-tile metadata record). Called on\n * uninstall, so a dev package leaves nothing behind that `projectDevApps`\n * could re-surface. A release install clears the same routing inside its\n * install transaction instead (see finalizeInstall).\n */\n private clearDevArtifacts(packageName: string, opts: {currentContextOnly?: boolean} = {}): void {\n if (this.retainedDevVersions.has(packageName)) throw new Error(\"Cannot clear a miniapp during replacement\")\n try {\n const pkgDir = new Directory(Paths.document, \"lmas\", packageName)\n if (pkgDir.exists) {\n for (const item of pkgDir.list()) {\n if (\n item instanceof Directory &&\n item.name.startsWith(\"dev-\") &&\n (!opts.currentContextOnly || isDevSnapshotVisible(packageName, item.name))\n ) {\n try {\n this.removeReleaseIdentity(packageName, item.name)\n item.delete()\n } catch (e) {\n console.warn(`APP_REGISTRY: failed to delete ${item.name}:`, e)\n }\n }\n }\n }\n } catch (e) {\n console.warn(`APP_REGISTRY: clearDevArtifacts dir scan failed for ${packageName}:`, e)\n }\n storage.remove(`${packageName}_dev_selected_snapshot`)\n storage.remove(`${packageName}_dev_url`)\n storage.remove(`${packageName}_dev_port`)\n storage.remove(`${packageName}_dev_mdns`)\n storage.remove(`${packageName}_dev_last_reachable`)\n // HTTP-direct dev miniapps are indexed by their real package name. A\n // release install/uninstall of that same package should remove only its\n // dev tile; unrelated dev miniapps must remain available.\n if (readDevAppRecord(packageName)) unregisterDevApp(packageName)\n }\n\n /**\n * Garbage-collect older `dev-*` version directories for this package,\n * keeping the latest `keep` (by lexicographic sort, which matches\n * timestamp ordering since dev-<ms> is zero-padded).\n *\n * Only touches `dev-*` versions of one development context: the package's own (the one a live context of it\n * holds, else the current one), or with `currentContext` the current one. Semver-installed versions and another\n * account's or workspace's snapshots (kept with that context's selection) are left alone.\n */\n public gcDevVersions(packageName: string, keep: number, opts: {currentContext?: boolean} = {}): void {\n const owned = opts.currentContext ? isDevSnapshotOfCurrentContext : isDevSnapshotVisible\n try {\n const pkgDir = new Directory(Paths.document, \"lmas\", packageName)\n if (!pkgDir.exists) return\n const dirs = pkgDir\n .list()\n .filter(\n (d): d is Directory => d instanceof Directory && d.name.startsWith(\"dev-\") && owned(packageName, d.name),\n )\n .sort((a, b) => (a.name < b.name ? 1 : -1))\n const protectedVersions = this.protectedDevVersions(packageName)\n for (let i = keep; i < dirs.length; i++) {\n if (protectedVersions.has(dirs[i].name)) continue\n try {\n dirs[i].delete()\n this.removeReleaseIdentity(packageName, dirs[i].name)\n } catch (e) {\n console.warn(`APP_REGISTRY: failed to delete ${dirs[i].name}:`, e)\n }\n }\n if (dirs.length > keep) this.refreshNeeded = true\n } catch (e) {\n console.warn(`APP_REGISTRY: gcDevVersions error for ${packageName}:`, e)\n }\n }\n\n /**\n * Remove obsolete release directories after a Store update committed. Keeps\n * the given versions (the new release and the one it replaced), the active\n * selection, organization-owned releases and every dev snapshot. Runs in the\n * install queue so it never touches a version another install is activating.\n */\n public gcReleaseVersions(packageName: string, keepVersions: readonly string[]): Promise<void> {\n return runInstallFilesystemTransaction(async () => {\n const keep = new Set(keepVersions.filter(Boolean))\n const active = storage.load<string>(activeVersionKey(packageName))\n if (active.is_ok()) keep.add(active.value)\n for (const version of this.getInstalledVersions(packageName)) {\n if (this.getReleaseIdentity(packageName, version)?.source === \"deployment_manifest\") keep.add(version)\n }\n const obsolete = selectReleaseVersionsForGarbageCollection(this.getInstalledVersions(packageName), keep)\n for (const version of obsolete) {\n try {\n const directory = new Directory(Paths.document, \"lmas\", packageName, version)\n if (directory.exists) directory.delete()\n this.removeReleaseIdentity(packageName, version)\n } catch (error) {\n console.warn(`APP_REGISTRY: failed to garbage-collect ${packageName}@${version}:`, error)\n }\n }\n if (obsolete.length > 0) {\n this.refreshNeeded = true\n this.notify()\n }\n }).catch((error) => {\n console.warn(`APP_REGISTRY: release garbage collection failed for ${packageName}:`, error)\n })\n }\n\n /** An explicitly selected packed snapshot takes precedence over scanned live URLs. */\n public getSelectedDevSnapshot(packageName: string): string | null {\n const selected = storage.load<string>(`${packageName}_dev_selected_snapshot`)\n return selected.is_ok() &&\n selected.value.startsWith(\"dev-\") &&\n this.getInstalledVersions(packageName).includes(selected.value) &&\n isDevSnapshotVisible(packageName, selected.value)\n ? selected.value\n : null\n }\n\n public selectDevSnapshot(packageName: string, version: string | null): void {\n if (version !== null && (!version.startsWith(\"dev-\") || !this.getInstalledVersions(packageName).includes(version)))\n throw new Error(\"Selected dev snapshot is not installed\")\n if (version === null) storage.remove(`${packageName}_dev_selected_snapshot`)\n else storage.save(`${packageName}_dev_selected_snapshot`, version)\n this.markRefreshNeeded()\n }\n\n /** Remove one failed staged dev replacement without clearing other dev files or settings. */\n public discardDevSnapshot(packageName: string, version: string): void {\n if (!/^dev-[0-9a-f-]+$/.test(version)) throw new Error(\"Expected an owned dev snapshot version\")\n const directory = new Directory(Paths.document, \"lmas\", packageName, version)\n if (directory.exists) directory.delete()\n this.removeReleaseIdentity(packageName, version)\n this.refreshNeeded = true\n this.notify()\n }\n\n public uninstall(packageName: string, version?: string, options: UninstallOptions = {}): AsyncResult<void, Error> {\n // Serialize with installs: an uninstall must not delete a package tree\n // while another operation is staging or activating inside it.\n return Res.try_async(() =>\n runInstallFilesystemTransaction(async () => {\n options.beforeRemove?.()\n if (this.retainedDevVersions.has(packageName)) throw new Error(\"Cannot uninstall a miniapp during replacement\")\n if (version) {\n const lmaDir = new Directory(Paths.document, \"lmas\", packageName, version)\n // Guard exists: a dev miniapp loads over HTTP and has no on-disk dir,\n // so an unconditional delete() would throw and abort the cleanup below.\n if (lmaDir.exists) lmaDir.delete()\n this.removeReleaseIdentity(packageName, version)\n console.log(\"APP_REGISTRY: Uninstalled mini app version\", version)\n const packageDir = new Directory(Paths.document, \"lmas\", packageName)\n if (packageDir.exists && packageDir.list().length === 0) {\n packageDir.delete()\n }\n } else {\n for (const installedVersion of this.getInstalledVersions(packageName)) {\n this.removeReleaseIdentity(packageName, installedVersion)\n }\n const packageDir = new Directory(Paths.document, \"lmas\", packageName)\n if (packageDir.exists) {\n packageDir.delete()\n }\n console.log(\"APP_REGISTRY: Uninstalled all versions of mini app\", packageName)\n }\n // Always clear dev artifacts: for HTTP-direct dev miniapps the tile is\n // backed by storage records (_dev_meta + dev_apps_index), not the disk\n // dir, so without this the projected tile reappears on the next refresh.\n this.clearDevArtifacts(packageName)\n // Removing the last installed version clears the recorded signer, so\n // any build of the package (an unsigned or dev build included) may\n // install again. Android's uninstall-then-install, for the same reason.\n if (this.getInstalledVersions(packageName).length === 0) {\n restoreInstallationMetadata(publisherIdentityKey(packageName), {present: false})\n getInstallationMetadata().remove(installReasonsKey(packageName))\n // Clear the revocation flag too: it blocks getMiniappEntryPaths and\n // launch, so leaving it set would make a later QR/store/manual\n // reinstall of the same package permanently unusable on this device.\n getInstallationMetadata().remove(revokedAccessKey(packageName))\n }\n this.refreshNeeded = true\n this.notify()\n }),\n )\n }\n\n public getPackageNames(): string[] {\n try {\n const lmasDir = new Directory(Paths.document, \"lmas\")\n if (!lmasDir.exists) return []\n return lmasDir\n .list()\n .filter(\n (lma): lma is Directory =>\n lma instanceof Directory && installedVersionDirectoryNames(directoryNames(lma)).length > 0,\n )\n .map((lma) => lma.name)\n } catch (error) {\n console.error(\"APP_REGISTRY: Error getting locally installed package names\", error)\n return []\n }\n }\n\n /**\n * Committed version directories of a package. Install transaction artifacts\n * (staging, backup and journal directories) and a candidate whose pending\n * activation has not committed are never versions.\n */\n public getInstalledVersions(packageName: string): string[] {\n try {\n const lmaDir = new Directory(Paths.document, \"lmas\", packageName)\n // Not installed yet is an expected state (e.g. preinstall sync probing\n // versions before first install) — return [] without the error noise.\n if (!lmaDir.exists) {\n return []\n }\n return installedVersionDirectoryNames(directoryNames(lmaDir))\n } catch (error) {\n console.error(\"APP_REGISTRY: Error getting local applet versions\", error)\n return []\n }\n }\n\n /** A `dev-*` snapshot or a release a developer installed from a release QR. */\n private isDeveloperVersion(packageName: string, version: string): boolean {\n return version.startsWith(\"dev-\") || this.getReleaseIdentity(packageName, version)?.source === \"direct_download\"\n }\n\n public async getActiveVersion(packageName: string): Promise<string | undefined> {\n const {version, remember} = this.chooseActiveVersion(packageName)\n if (remember) this.setActiveVersion(packageName, remember)\n return version\n }\n\n /** The version a launch would run now (as `getActiveVersion` chooses it), read without storing anything. */\n public peekActiveVersion(packageName: string): string | undefined {\n return this.chooseActiveVersion(packageName).version\n }\n\n /** The version a launch runs, by launch precedence, and the active pointer to store for it (null to leave it). */\n private chooseActiveVersion(packageName: string): {version: string | undefined; remember: string | null} {\n // Another account's or workspace's dev snapshot is not an installation here.\n let versions = this.getInstalledVersions(packageName).filter((version) =>\n isDevSnapshotVisible(packageName, version),\n )\n // A developer build only stands in while the deployment allows development.\n // A stored dev snapshot pointer is left alone so re-allowing it brings that\n // scan back; until then a released version stays on screen.\n const devAllowed = isDevMiniappAllowed(packageName)\n const selectedSnapshot = devAllowed ? this.getSelectedDevSnapshot(packageName) : null\n if (selectedSnapshot) return {version: selectedSnapshot, remember: null}\n // Treat MMKV as a hint, not authority. A stored version may have been\n // GC'd off disk without this pointer being updated.\n const res = storage.load<string>(`${packageName}_active_version`)\n if (\n res.is_ok() &&\n versions.includes(res.value) &&\n (devAllowed || !this.isDeveloperVersion(packageName, res.value))\n ) {\n return {version: res.value, remember: null}\n }\n // Dev versions take precedence over semver-installed versions.\n if (devAllowed) {\n const devVersions = versions\n .filter((v) => v.startsWith(\"dev-\"))\n .sort()\n .reverse()\n if (devVersions.length > 0) return {version: devVersions[0], remember: devVersions[0]}\n }\n versions = versions.filter((v) => semver.valid(v))\n versions.sort((a, b) => semver.rcompare(a, b))\n if (!versions.length) return {version: undefined, remember: null}\n // The newest release the deployment allows, e.g. a workspace's managed\n // release over a newer release-QR or Store install that it does not.\n const active = versions.find((v) => this.isReleaseAllowed(packageName, v)) ?? versions[0]\n return {version: active, remember: res.is_ok() && res.value.startsWith(\"dev-\") ? null : active}\n }\n\n public setActiveVersion(packageName: string, version: string): Result<void, Error> {\n const key = `${packageName}_active_version`\n const previous = storage.load<string>(key)\n const result = storage.save(key, version)\n if (result.is_ok() && (previous.is_error() || previous.value !== version)) {\n // Selecting an already-installed workspace pin must update cached app\n // metadata and subscribers just like a new installation does.\n this.refreshNeeded = true\n this.notify()\n }\n return result\n }\n\n /**\n * Newest `dev-*` snapshot that still has a resolvable UI or background\n * entry. Semver store installs are ignored — a live-dev tile must not\n * silently fall back to a released store bundle when the laptop drops.\n */\n public getLatestDevSnapshotVersion(packageName: string): string | null {\n const versions = this.getInstalledVersions(packageName)\n .filter((v) => v.startsWith(\"dev-\") && isDevSnapshotVisible(packageName, v))\n .sort()\n .reverse()\n for (const version of versions) {\n const paths = this.getMiniappEntryPaths(packageName, version)\n if (paths?.background || paths?.ui) return version\n }\n return null\n }\n\n /** True iff {@link getLatestDevSnapshotVersion} finds a usable snapshot. */\n public hasDevSnapshot(packageName: string): boolean {\n return this.getLatestDevSnapshotVersion(packageName) != null\n }\n\n public getMetadata(packageName: string, version: string): InstalledInfo {\n try {\n const lmaDir = new Directory(Paths.document, \"lmas\", packageName, version)\n const miniappJsonFile = new File(lmaDir, \"miniapp.json\")\n const manifest = JSON.parse(miniappJsonFile.textSync())\n const iconPath = typeof manifest.icon === \"string\" && manifest.icon.trim() ? manifest.icon : \"icon.png\"\n const safeRelativeIcon =\n !/^[a-z]+:/i.test(iconPath) && !iconPath.startsWith(\"/\") && !iconPath.split(\"/\").includes(\"..\")\n const declaredIcon = safeRelativeIcon ? new File(lmaDir, iconPath) : null\n const logoUrl = declaredIcon?.exists ? declaredIcon.uri : new File(lmaDir, \"icon.png\").uri\n return {name: manifest.name, logoUrl: logoUrl}\n } catch (error) {\n console.error(\"APP_REGISTRY: Error getting local miniapp metadata\", error)\n return {name: \"error\", logoUrl: \"\"}\n }\n }\n\n public getInstalledInfo(): InstalledLma[] {\n const packageNames = this.getPackageNames()\n const out: InstalledLma[] = []\n for (const packageName of packageNames) {\n const versionStrings = this.getInstalledVersions(packageName)\n const installedVersion: InstalledLma = {packageName, versions: {}}\n for (const versionString of versionStrings) {\n installedVersion.versions[versionString] = this.getMetadata(packageName, versionString)\n }\n out.push(installedVersion)\n }\n return out\n }\n\n /**\n * Merge disk-derived apps with the projected dev + offline layers,\n * de-duping by packageName. An active dev registration wins over an older\n * disk install of the same package; installing a release clears that dev\n * registration in finalizeInstall. Native offline apps keep top priority.\n */\n private mergeProjectedApps(diskApps: ClientApp[], includeBackgroundOnly = false): ClientApp[] {\n const offline = this.projectOfflineApps().filter((app) => isOfflineSystemMiniappAllowed(app.packageName))\n const offlinePackages = new Set(offline.map((app) => app.packageName))\n const dev = this.projectDevApps().filter(\n (app) =>\n isDevMiniappAllowed(app.packageName) &&\n !offlinePackages.has(app.packageName) &&\n !this.getSelectedDevSnapshot(app.packageName),\n )\n const devPackages = new Set(dev.map((app) => app.packageName))\n const installed = diskApps.filter(\n (app) =>\n (app.version?.startsWith(\"dev-\")\n ? isDevMiniappAllowed(app.packageName)\n : this.isReleaseAllowed(app.packageName, app.version)) &&\n !offlinePackages.has(app.packageName) &&\n !devPackages.has(app.packageName),\n )\n // A background-only miniapp (a Store) never appears in user-facing lists;\n // only the host's own maintenance asks for it.\n return [...installed, ...dev, ...offline].filter((app) =>\n isMiniappAvailable(app.packageName, includeBackgroundOnly ? \"background\" : \"interactive\"),\n )\n }\n\n public async getInstalledMiniapps({includeBackgroundOnly = false}: {includeBackgroundOnly?: boolean} = {}): Promise<\n ClientApp[]\n > {\n if (!this.refreshNeeded && this.cachedApps.length > 0) {\n // Cache hit: re-project running from the registry. The cached array\n // IS the disk-derived truth; running comes from the mount registry.\n return this.mergeProjectedApps(\n this.cachedApps.map((a) => ({\n ...a,\n running: miniappRunningRegistry.has(a.packageName),\n })),\n includeBackgroundOnly,\n )\n }\n\n try {\n const installedInfo = this.getInstalledInfo()\n const out: ClientApp[] = []\n for (const lmaInfo of installedInfo) {\n const versionString = await this.getActiveVersion(lmaInfo.packageName)\n if (!versionString) continue\n const versionInfo = lmaInfo.versions[versionString]\n\n const manifest = this.getMiniappManifest(lmaInfo.packageName, versionString) as {\n permissions?: Array<string | {type: string; required?: boolean; description?: string}>\n hardwareRequirements?: Array<{type: string; level: string; description?: string}>\n type?: string\n actions?: Array<{\n id?: unknown\n description?: unknown\n parameters?: unknown\n outputSchema?: unknown\n lifecycle?: unknown\n audience?: unknown\n }>\n } | null\n\n const permissions = normalizeManifestPermissions(manifest?.permissions)\n const hardwareRequirements = buildHardwareRequirements(manifest?.hardwareRequirements, lmaInfo.packageName)\n const appType = normalizeManifestType(manifest?.type)\n\n // Declared actions (for session.miniapps.list + invoke gating).\n const actions = normalizeManifestActions(manifest?.actions)\n\n // Dev miniapps live in the same lmas/ tree as installed ones, but\n // their version directory name starts with \"dev-\".\n const isMiniappDev = versionString.startsWith(\"dev-\")\n let devUrl: string | undefined\n if (isMiniappDev && !this.getSelectedDevSnapshot(lmaInfo.packageName)) {\n const devUrlRes = storage.load<string>(`${lmaInfo.packageName}_dev_url`)\n if (devUrlRes.is_ok()) devUrl = devUrlRes.value\n }\n\n out.push({\n packageName: lmaInfo.packageName,\n version: versionString,\n running: miniappRunningRegistry.has(lmaInfo.packageName),\n local: true,\n healthy: true,\n loading: false,\n offline: false,\n hidden: false,\n offlineRoute: \"\",\n name: versionInfo.name,\n webviewUrl: \"\",\n logoUrl: versionInfo.logoUrl,\n type: appType,\n permissions,\n hardwareRequirements,\n // Always project actions (even []) so the invoke gate can enforce\n // declared-action membership unconditionally — an app with no declared\n // actions must reject every invoke, not bypass the check.\n actions,\n ...(isMiniappDev ? {isMiniappDev: true} : {}),\n ...(devUrl ? {devUrl} : {}),\n onStart: () => saveLocalAppRunningState(lmaInfo.packageName, true),\n onStop: () => saveLocalAppRunningState(lmaInfo.packageName, false),\n })\n }\n\n this.cachedApps = out\n this.refreshNeeded = false\n if (!this.loaded) {\n this.loaded = true\n this.notify()\n }\n return this.mergeProjectedApps(this.cachedApps, includeBackgroundOnly)\n } catch (error) {\n console.error(\"APP_REGISTRY: Error getting local applets\", error)\n return this.mergeProjectedApps(\n this.cachedApps.map((a) => ({\n ...a,\n running: miniappRunningRegistry.has(a.packageName),\n })),\n includeBackgroundOnly,\n )\n }\n }\n\n /** Force the next getInstalledMiniapps() to re-derive from disk + records. */\n public markRefreshNeeded(): void {\n this.refreshNeeded = true\n this.notify()\n }\n\n /**\n * Project persisted dev-app metadata records into ClientApp tiles. Dev\n * miniapps aren't installed to disk (they load over HTTP), so they don't\n * appear in the `lmas/` scan — this surfaces them on the home screen so\n * they're re-launchable without re-scanning the QR.\n */\n private projectDevApps(): ClientApp[] {\n return getDevAppRecords().map((rec) => {\n // Every dev rebuild has a unique snapshot directory. Prefer its manifest\n // icon so home tiles update with the bundle instead of retaining the\n // separately cached, stable-path QR preview (and its decoded image cache).\n const snapshotVersion = this.getLatestDevSnapshotVersion(rec.packageName)\n const snapshotIcon = snapshotVersion ? this.getMetadata(rec.packageName, snapshotVersion).logoUrl : undefined\n const permissions = normalizeManifestPermissions(rec.permissions)\n const hardwareRequirements = buildHardwareRequirements(rec.hardwareRequirements, rec.packageName)\n return {\n packageName: rec.packageName,\n version: undefined,\n running: miniappRunningRegistry.has(rec.packageName),\n local: true,\n healthy: true,\n loading: false,\n offline: false,\n hidden: false,\n offlineRoute: \"\",\n name: rec.name,\n webviewUrl: \"\",\n logoUrl: snapshotIcon || rec.iconUrl,\n type: normalizeManifestType(rec.type),\n permissions,\n hardwareRequirements,\n actions: normalizeManifestActions(rec.actions),\n isMiniappDev: true,\n devUrl: rec.devUrl,\n devPort: rec.devPort,\n onStart: () => saveLocalAppRunningState(rec.packageName, true),\n onStop: () => saveLocalAppRunningState(rec.packageName, false),\n }\n })\n }\n\n private projectOfflineApps(): ClientApp[] {\n // Offline apps don't go through miniappRunningRegistry (that's for\n // MiniappHost-mounted webviews). Their running flag is persisted to\n // MMKV by saveLocalAppRunningState — read it back here so refreshes\n // don't blow away the active flag.\n return this.offlineApps.map((a) => {\n const running = getLocalAppRunningState(a.packageName)\n const screenshot = getLocalAppScreenshot(a.packageName)\n\n return {...a, running, screenshot}\n })\n }\n\n // Register an offline (locally-routed) app. Survives disk rebuilds.\n public installOfflineApp(app: ClientApp, opts?: {requiresLocalSttModel?: boolean}): void {\n if (opts?.requiresLocalSttModel) {\n this.sttModelRequired.add(app.packageName)\n }\n this.offlineApps.push({\n ...app,\n onStart: () => saveLocalAppRunningState(app.packageName, true),\n onStop: () => saveLocalAppRunningState(app.packageName, false),\n })\n this.refreshNeeded = true\n this.notify()\n }\n\n /**\n * Update whether a registered offline app is projected into launcher UIs.\n *\n * Offline apps are registered once at host startup, so settings-backed\n * visibility changes need to update the projection without reinstalling or\n * duplicating the app. No-op when the app is missing or already matches.\n */\n public setOfflineAppHidden(packageName: string, hidden: boolean): void {\n const app = this.offlineApps.find((candidate) => candidate.packageName === packageName)\n if (!app || app.hidden === hidden) return\n\n app.hidden = hidden\n this.refreshNeeded = true\n this.notify()\n }\n\n /**\n * Registered as needing the on-device STT model before it can start (the\n * host declares this per offline app; the apps store gates start() on it).\n */\n public requiresLocalSttModel(packageName: string): boolean {\n return this.sttModelRequired.has(packageName)\n }\n\n public getMiniappHtml(packageName: string, version: string): Result<string, Error> {\n return Res.try(() => {\n const lmaDir = new Directory(Paths.document, \"lmas\", packageName, version)\n const htmlFile = new File(lmaDir, \"index.html\")\n return htmlFile.textSync()\n })\n }\n}\n\n/**\n * Persist the running flag for a local miniapp (read on next cold boot so\n * autostart picks the right set of apps). Exported for hosts that want to\n * track running state independently.\n */\nexport function saveLocalAppRunningState(packageName: string, status: boolean): void {\n storage.save(`${packageName}_running`, status)\n}\n\nexport function getLocalAppRunningState(packageName: string): boolean {\n const res = storage.load<boolean>(`${packageName}_running`)\n if (res.is_ok()) return res.value\n return false\n}\n\nexport function getLocalAppScreenshot(packageName: string): string | undefined {\n const key = `${packageName}_screenshot`\n const res = storage.load<string>(key)\n if (res.is_error()) return undefined\n\n const uri = res.value\n if (uri.startsWith(\"file://\")) {\n try {\n if (!new File(uri).exists) {\n storage.remove(key)\n return undefined\n }\n } catch {\n storage.remove(key)\n return undefined\n }\n }\n\n return uri\n}\n\n/**\n * Persisted metadata for a dev miniapp's home tile.\n *\n * Dev miniapps load directly off the dev server over HTTP and are NOT\n * installed into `lmas/`, so the disk scan in `getInstalledMiniapps` can't\n * see them. We persist a tiny record at scan / dev-URL-entry time so the\n * tile survives across app launches and is re-launchable without re-scanning.\n * `permissions` / `hardwareRequirements` are snapshotted from the manifest so\n * the home-screen permission gate has data without a disk bundle.\n */\nexport interface DevAppRecord {\n packageName: string\n name: string\n iconUrl: string\n devUrl: string\n devPort?: number\n /**\n * Bonjour / mDNS hostname from the QR (`ComputerName.local`). Used as a\n * failover host when the raw LAN IP in `devUrl` goes stale after a Wi-Fi\n * change — phones that resolve `.local` can relaunch without re-scanning.\n */\n mdnsHost?: string\n type?: AppletType\n permissions?: Array<string | {type: string; required?: boolean; description?: string}>\n hardwareRequirements?: Array<{type: string; level: string; description?: string}>\n /** Manifest-declared actions — so dev-sideloaded miniapps can be invoked too. */\n actions?: Array<{\n id?: unknown\n description?: unknown\n parameters?: unknown\n outputSchema?: unknown\n lifecycle?: unknown\n audience?: unknown\n }>\n /** Legacy single-slot migration field. New records use the real packageName directly. */\n sourcePackageName?: string\n}\n\nconst DEV_APPS_INDEX_KEY = \"dev_apps_index\"\nconst DEV_APP_ICONS_DIR = \"dev-miniapp-icons\"\n\nfunction isPrivateLanHost(hostname: string): boolean {\n return (\n hostname === \"localhost\" ||\n hostname.startsWith(\"192.168.\") ||\n hostname.startsWith(\"10.\") ||\n /^172\\.(1[6-9]|2\\d|3[0-1])\\./.test(hostname)\n )\n}\n\nfunction rewriteStaleDevUrl(value: string): string {\n if (!__DEV__) return value\n const host = configuredDevHost()\n if (!host) return value\n\n try {\n const url = new URL(value)\n if (url.hostname === host || !isPrivateLanHost(url.hostname)) return value\n url.hostname = host\n return url.toString().replace(/\\/$/, \"\")\n } catch {\n return value\n }\n}\n\nfunction normalizeDevAppRecord(record: DevAppRecord): DevAppRecord {\n const devUrl = rewriteStaleDevUrl(record.devUrl)\n const iconUrl = rewriteStaleDevUrl(record.iconUrl)\n return devUrl === record.devUrl && iconUrl === record.iconUrl ? record : {...record, devUrl, iconUrl}\n}\n\n/** Legacy package used by builds that supported only one dev miniapp. */\nexport const DEV_APP_PACKAGE_NAME = \"com.dev\"\nexport const DEV_APP_NAME = \"Dev\"\n\n/**\n * Copy a dev-server icon into Documents so the tile remains branded after the\n * laptop/server disappears. A failed download is non-fatal: the remote URL is\n * retained and can still render while the server is reachable.\n */\nasync function cacheDevAppIcon(packageName: string, iconUrl: string): Promise<string> {\n if (!/^https?:\\/\\//.test(iconUrl)) return iconUrl\n\n try {\n const dir = new Directory(Paths.document, DEV_APP_ICONS_DIR)\n if (!dir.exists) dir.create({intermediates: true})\n\n const safePackageName = packageName.replace(/[^a-zA-Z0-9._-]/g, \"_\")\n let extension = \".png\"\n try {\n const match = new URL(iconUrl).pathname.match(/\\.(png|jpe?g|webp|gif|svg)$/i)\n if (match) extension = `.${match[1].toLowerCase()}`\n } catch {\n // Keep the decoder-friendly .png fallback; image loaders sniff content.\n }\n\n const target = new File(dir, `${safePackageName}${extension}`)\n const downloaded = await File.downloadFileAsync(iconUrl, target, {idempotent: true})\n\n // Only remove older extensions AFTER the replacement is safely on disk;\n // a broken icon URL must not destroy the last known-good cached logo.\n for (const item of dir.list()) {\n if (item instanceof File && item.uri !== downloaded.uri && item.name.startsWith(`${safePackageName}.`)) {\n try {\n item.delete()\n } catch {\n // Best effort; the current icon has already been persisted.\n }\n }\n }\n return downloaded.uri\n } catch (error) {\n console.warn(`APP_REGISTRY: failed to cache dev icon for ${packageName}:`, error)\n return readDevAppRecord(packageName)?.iconUrl ?? iconUrl\n }\n}\n\nfunction removeDevRecordKeys(packageName: string): void {\n const existing = readDevAppRecord(packageName)\n if (existing?.iconUrl.startsWith(\"file://\")) {\n try {\n const icon = new File(existing.iconUrl)\n if (icon.exists) icon.delete()\n } catch (error) {\n console.warn(`APP_REGISTRY: failed to delete dev icon for ${packageName}:`, error)\n }\n }\n storage.remove(`${packageName}_dev_meta`)\n storage.remove(`${packageName}_dev_url`)\n storage.remove(`${packageName}_dev_port`)\n storage.remove(`${packageName}_dev_mdns`)\n storage.remove(`${packageName}_dev_last_reachable`)\n}\n\nfunction readDevAppRecord(packageName: string): DevAppRecord | null {\n const res = storage.load<string>(`${packageName}_dev_meta`)\n if (!res.is_ok()) return null\n try {\n return JSON.parse(res.value) as DevAppRecord\n } catch {\n return null\n }\n}\n\n/** Move the historical `com.dev` record onto its real manifest package key. */\nfunction migrateLegacyDevSlot(): void {\n const legacy = readDevAppRecord(DEV_APP_PACKAGE_NAME)\n const targetPackage = legacy?.sourcePackageName?.trim()\n if (!legacy || !targetPackage || targetPackage === DEV_APP_PACKAGE_NAME) return\n\n const existingTarget = readDevAppRecord(targetPackage)\n const migrated: DevAppRecord = existingTarget ?? {\n ...legacy,\n packageName: targetPackage,\n sourcePackageName: targetPackage,\n }\n if (!existingTarget) storage.save(`${targetPackage}_dev_meta`, JSON.stringify(migrated))\n\n const legacyUrl = storage.load<string>(`${DEV_APP_PACKAGE_NAME}_dev_url`)\n const targetUrl = storage.load<string>(`${targetPackage}_dev_url`)\n if (!targetUrl.is_ok()) {\n storage.save(`${targetPackage}_dev_url`, legacyUrl.is_ok() ? legacyUrl.value : migrated.devUrl)\n }\n const legacyPort = storage.load<number>(`${DEV_APP_PACKAGE_NAME}_dev_port`)\n const targetPort = storage.load<number>(`${targetPackage}_dev_port`)\n if (!targetPort.is_ok()) {\n const port = migrated.devPort ?? (legacyPort.is_ok() ? legacyPort.value : undefined)\n if (typeof port === \"number\" && Number.isFinite(port)) storage.save(`${targetPackage}_dev_port`, port)\n }\n const legacyMdns = storage.load<string>(`${DEV_APP_PACKAGE_NAME}_dev_mdns`)\n const targetMdns = storage.load<string>(`${targetPackage}_dev_mdns`)\n if (!targetMdns.is_ok() && legacyMdns.is_ok() && legacyMdns.value.trim()) {\n storage.save(`${targetPackage}_dev_mdns`, legacyMdns.value.trim())\n }\n\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_meta`)\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_url`)\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_port`)\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_mdns`)\n storage.remove(`${DEV_APP_PACKAGE_NAME}_dev_last_reachable`)\n\n const index = Array.from(new Set(getDevAppIndex().map((pkg) => (pkg === DEV_APP_PACKAGE_NAME ? targetPackage : pkg))))\n storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(index))\n}\n\nfunction readStoredMdnsHost(packageName: string): string | undefined {\n const res = storage.load<string>(`${packageName}_dev_mdns`)\n if (!res.is_ok()) return undefined\n return res.value.trim() || undefined\n}\n\n/**\n * Whether live development code may run under `packageName`. The deployment\n * must allow miniapp development. A dev build is the package itself, served\n * unsigned, so it is also refused while the installed package carries a\n * publisher signature (throwing {@link SignedMiniappDevBuildError});\n * uninstalling clears that signature.\n */\nexport function assertDevBuildAllowed(packageName: string): void {\n assertMiniappDevelopmentAllowed()\n assertUnsignedDevBuildAllowed({\n packageName,\n installedFingerprint: appRegistry.getPublisherKeyFingerprint(packageName),\n })\n}\n\n/**\n * Register or update one dev miniapp under its real manifest package. Different\n * package names coexist; rescanning the same package updates that package only.\n * The phone keeps the record, its `${packageName}_dev_*` routing keys, and the\n * dev-build marking until a release install or uninstall replaces them.\n *\n * A dev build follows the local-build rules whatever name it claims: it keeps\n * its data apart from the package's, its tokens are marked as a local build's,\n * it never gets system privileges and it never updates from a URL.\n *\n * `assertCurrent` runs after the icon download, immediately before the record\n * and routing keys are written: an install whose session ended meanwhile\n * throws there, so it never selects its server in a later session.\n */\nexport async function registerDevApp(record: DevAppRecord, options: {assertCurrent?: () => void} = {}): Promise<void> {\n migrateLegacyDevSlot()\n const packageName = record.packageName.trim()\n if (!packageName) throw new Error(\"Dev miniapp manifest is missing packageName\")\n assertDevBuildAllowed(packageName)\n\n const iconUrl = await cacheDevAppIcon(packageName, record.iconUrl)\n options.assertCurrent?.()\n // Relaunch paths (developer-URL screen, loadDevMiniapp) omit mdnsHost, so an\n // omitted field keeps whatever the QR scan stored instead of wiping the\n // `.local` failover host.\n const mdnsHost = record.mdnsHost !== undefined ? record.mdnsHost.trim() || undefined : readStoredMdnsHost(packageName)\n const devRecord: DevAppRecord = {\n ...record,\n packageName,\n sourcePackageName: packageName,\n name: record.name || DEV_APP_NAME,\n iconUrl,\n mdnsHost,\n }\n storage.save(`${packageName}_dev_meta`, JSON.stringify(devRecord))\n storage.remove(`${packageName}_dev_selected_snapshot`)\n storage.save(`${packageName}_dev_url`, record.devUrl)\n if (typeof record.devPort === \"number\" && Number.isFinite(record.devPort)) {\n storage.save(`${packageName}_dev_port`, record.devPort)\n } else {\n storage.remove(`${packageName}_dev_port`)\n }\n if (mdnsHost) {\n storage.save(`${packageName}_dev_mdns`, mdnsHost)\n } else {\n storage.remove(`${packageName}_dev_mdns`)\n }\n const idx = getDevAppIndex()\n if (!idx.includes(packageName)) {\n idx.push(packageName)\n storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(idx))\n }\n appRegistry.markRefreshNeeded()\n}\n\n/** Drop one dev miniapp's metadata, routing keys, and cached icon. */\nexport function unregisterDevApp(packageName = DEV_APP_PACKAGE_NAME): void {\n removeDevRecordKeys(packageName)\n const idx = getDevAppIndex().filter((p) => p !== packageName)\n storage.save(DEV_APPS_INDEX_KEY, JSON.stringify(idx))\n appRegistry.markRefreshNeeded()\n}\n\nfunction getDevAppIndex(): string[] {\n const res = storage.load<string>(DEV_APPS_INDEX_KEY)\n if (!res.is_ok()) return []\n try {\n const parsed = JSON.parse(res.value)\n return Array.isArray(parsed) ? (parsed as string[]) : []\n } catch {\n return []\n }\n}\n\nexport function getDevAppRecords(): DevAppRecord[] {\n migrateLegacyDevSlot()\n const out: DevAppRecord[] = []\n for (const pkg of getDevAppIndex()) {\n const res = storage.load<string>(`${pkg}_dev_meta`)\n if (!res.is_ok()) continue\n try {\n const record = JSON.parse(res.value) as DevAppRecord\n const normalized = normalizeDevAppRecord(record)\n if (normalized !== record) {\n storage.save(`${pkg}_dev_meta`, JSON.stringify(normalized))\n storage.save(`${pkg}_dev_url`, normalized.devUrl)\n }\n out.push(normalized)\n } catch {\n /* corrupt record — skip */\n }\n }\n return out\n}\n\nconst appRegistry = AppRegistry.getInstance()\nexport default appRegistry\n\n/** Whether a Fleet assignment is one of the reasons `packageName` is installed. */\nexport function hasAssignmentReason(packageName: string): boolean {\n return appRegistry.getInstallReasons(packageName).includes(\"assignment\")\n}\n"]}
|