@glassly/engine 0.4.0-beta.1086 → 0.4.0-beta.1091

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
1
  export const ENGINE_RELEASE_METADATA = Object.freeze({
2
2
  "schemaVersion": 1,
3
3
  "familyBaseVersion": "0.4.0",
4
- "releaseIdentity": "0.4.0-beta.1086",
5
- "releaseSetId": "glassly-0.4.0-beta.1086",
6
- "sourceCommit": "98789ba97bcc911b9f621a3ab282aea6b0cc52c0",
4
+ "releaseIdentity": "0.4.0-beta.1091",
5
+ "releaseSetId": "glassly-0.4.0-beta.1091",
6
+ "sourceCommit": "7e4bf2595c212f7b7b33a09b3a88ff2592c45111",
7
7
  "otaManifestUrl": null,
8
8
  "otaManifestSha256": null
9
9
  });
@@ -1 +1 @@
1
- {"version":3,"file":"releaseMetadata.js","sourceRoot":"","sources":["../../src/generated/releaseMetadata.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,uBAAuB,GAAoC,MAAM,CAAC,MAAM,CAAC;IACpF,eAAe,EAAE,CAAC;IAClB,mBAAmB,EAAE,OAAO;IAC5B,iBAAiB,EAAE,iBAAiB;IACpC,cAAc,EAAE,yBAAyB;IACzC,cAAc,EAAE,0CAA0C;IAC1D,gBAAgB,EAAE,IAAI;IACtB,mBAAmB,EAAE,IAAI;CAC1B,CAAC,CAAA","sourcesContent":["/** Generated by release CI. Do not edit in a release checkout. */\nexport interface EngineReleaseMetadata {\n schemaVersion: 1\n familyBaseVersion: string | null\n releaseIdentity: string | null\n releaseSetId: string | null\n sourceCommit: string | null\n otaManifestUrl: string | null\n otaManifestSha256: string | null\n}\n\nexport const ENGINE_RELEASE_METADATA: Readonly<EngineReleaseMetadata> = Object.freeze({\n \"schemaVersion\": 1,\n \"familyBaseVersion\": \"0.4.0\",\n \"releaseIdentity\": \"0.4.0-beta.1086\",\n \"releaseSetId\": \"glassly-0.4.0-beta.1086\",\n \"sourceCommit\": \"98789ba97bcc911b9f621a3ab282aea6b0cc52c0\",\n \"otaManifestUrl\": null,\n \"otaManifestSha256\": null\n})\n"]}
1
+ {"version":3,"file":"releaseMetadata.js","sourceRoot":"","sources":["../../src/generated/releaseMetadata.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,uBAAuB,GAAoC,MAAM,CAAC,MAAM,CAAC;IACpF,eAAe,EAAE,CAAC;IAClB,mBAAmB,EAAE,OAAO;IAC5B,iBAAiB,EAAE,iBAAiB;IACpC,cAAc,EAAE,yBAAyB;IACzC,cAAc,EAAE,0CAA0C;IAC1D,gBAAgB,EAAE,IAAI;IACtB,mBAAmB,EAAE,IAAI;CAC1B,CAAC,CAAA","sourcesContent":["/** Generated by release CI. Do not edit in a release checkout. */\nexport interface EngineReleaseMetadata {\n schemaVersion: 1\n familyBaseVersion: string | null\n releaseIdentity: string | null\n releaseSetId: string | null\n sourceCommit: string | null\n otaManifestUrl: string | null\n otaManifestSha256: string | null\n}\n\nexport const ENGINE_RELEASE_METADATA: Readonly<EngineReleaseMetadata> = Object.freeze({\n \"schemaVersion\": 1,\n \"familyBaseVersion\": \"0.4.0\",\n \"releaseIdentity\": \"0.4.0-beta.1091\",\n \"releaseSetId\": \"glassly-0.4.0-beta.1091\",\n \"sourceCommit\": \"7e4bf2595c212f7b7b33a09b3a88ff2592c45111\",\n \"otaManifestUrl\": null,\n \"otaManifestSha256\": null\n})\n"]}
package/build/index.d.ts CHANGED
@@ -55,7 +55,7 @@ export { DUMMY_APPLET, saveAppsOrder, getAppsOrder, sortAppsByPackageNamePriorit
55
55
  export { decideDevLaunchRoute, type DecideDevLaunchOptions, type DevLaunchResult, type DevManifest, } from "./utils/devMiniappLaunch";
56
56
  export { HardwareCompatibility, type CompatibilityResult } from "./utils/hardware";
57
57
  export { BgTimer } from "./utils/timers";
58
- export { MetaAuthError, authEntryUrl, callbackMatches, callbackQuery, decryptBlob, isLoginCallback, login, tokensQuery, type MetaSession, type MetaSsoTokens, } from "./services/neuralBand/MetaAuth";
58
+ export { MetaAuthError, authEntryUrl, callbackMatches, callbackQuery, callbackShape, decryptBlob, isLoginCallback, login, tokensQuery, type MetaSession, type MetaSsoTokens, } from "./services/neuralBand/MetaAuth";
59
59
  export type { NeuralBandClaimStatus, NeuralBandFirmwareStatus, NeuralBandHandwritingStatus, NeuralBandHandwritingUpdate, } from "./services/neuralBand/NeuralBandInput";
60
60
  export { HardwareType, HardwareRequirementLevel, DeviceTypes, ControllerTypes, HARDWARE_CAPABILITIES, getModelCapabilities, simulatedGlasses, evenRealitiesG1, evenRealitiesG2, mentraLive, nimo, rayneoIO, vuzixZ100, mentraDisplay, } from "./types";
61
61
  export type { HardwareRequirement, CameraCapabilities, DisplayCapabilities, MicrophoneCapabilities, SpeakerCapabilities, IMUCapabilities, ButtonCapabilities, LightCapabilities, PowerCapabilities, Capabilities, AppletType, AppPermissionType, AppletPermission, AppletInterface, ClientApp, } from "./types";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/build/index.js CHANGED
@@ -51,7 +51,7 @@ export { decideDevLaunchRoute, } from "./utils/devMiniappLaunch";
51
51
  export { HardwareCompatibility } from "./utils/hardware";
52
52
  export { BgTimer } from "./utils/timers";
53
53
  // Meta Neural Band: the account sign-in a claim needs (the WebView lives in the host).
54
- export { MetaAuthError, authEntryUrl, callbackMatches, callbackQuery, decryptBlob, isLoginCallback, login, tokensQuery, } from "./services/neuralBand/MetaAuth";
54
+ export { MetaAuthError, authEntryUrl, callbackMatches, callbackQuery, callbackShape, decryptBlob, isLoginCallback, login, tokensQuery, } from "./services/neuralBand/MetaAuth";
55
55
  // Hardware types and capability profiles.
56
56
  export { HardwareType, HardwareRequirementLevel, DeviceTypes, ControllerTypes, HARDWARE_CAPABILITIES, getModelCapabilities, simulatedGlasses, evenRealitiesG1, evenRealitiesG2, mentraLive, nimo, rayneoIO, vuzixZ100, mentraDisplay, } from "./types";
57
57
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `@glassly/engine` — the OEM-facing main entry.\n *\n * The `engine` namespace (configure/start/stop + typed domain facades), the\n * public contract/read-model types, and the pure helpers host UI legitimately\n * renders with (decision functions, sort/order helpers, policy constants,\n * capability tables, timers). Judgment rule: read models, commands, pure\n * functions and types belong here; anything that mutates runtime state or\n * exposes a raw store/service remains private to the Glassly host.\n * See cloud/docs/issues/020-glasses-status-boundary/integration-review.md §D.\n */\n\n// The namespaced OEM-facing engine API (the \"(A) host API\"). See ./engine.\nexport {engine} from \"./engine\"\nexport type {\n ReportAttachmentInput,\n ReportContext,\n ReportDetails,\n ReportStatus,\n ReportTrigger,\n ReportSubmitResult,\n EngineSubmitReportInput,\n} from \"./facades/reports\"\nexport type {IslandNotification, IslandNotificationKind} from \"./facades/notifications\"\nexport type {PresentationOwner} from \"./services/notifications/notificationPolicy\"\nexport type {MiniappNotificationEvent} from \"./services/notifications/miniappNotifications\"\nexport {DEFAULT_HIDDEN_PACKAGES, isGatedByDevTools, isSystemMiniapp} from \"./stores/appVisibility\"\nexport type {WifiSearchResult} from \"./facades/glassesWifi\"\nexport type {IdentitySnapshot} from \"./services/PairingIdentity\"\nexport type {DisplayMirrorEvent} from \"./facades/displayMirror\"\nexport type {\n IslandConfigureOptions,\n IslandAuth,\n IslandConfigValues,\n IslandAnalytics,\n IslandUiSeams,\n ScanQrOptions,\n ScanQrResult,\n WebLoginOptions,\n WebLoginResult,\n SubjectTokenType,\n} from \"./runtime/bootstrap\"\n\n// Settings contract: the typed key registry (schema descriptors — the same\n// surface engine.settings.descriptor()/keys() reads), the per-key React hook\n// (the hook layer, same precedent as the apps hooks below), and the pure\n// device-model key helpers. The raw useSettingsStore stays internal;\n// imperative access goes through engine.settings.\nexport {SETTINGS, useSetting, AI_DATA_CONSENT_VERSION} from \"./stores/settings\"\nexport {isCfwFirmwareVersion, isCustomDashboardEligible} from \"./services/pages/pageEligibility\"\nexport {getEffectiveCapabilities} from \"./services/effectiveCapabilities\"\nexport {isControllerModel, isControllerReady} from \"./services/controllers\"\n\n// AI tier registry: the curated per-tier model dropdown options and helpers\n// the Settings > AI Models screen renders. Resolution itself runs inside\n// LocalMiniappRuntime; the screen only reads/writes the ai_model_* settings.\nexport {AI_TIERS, TIER_MODEL_OPTIONS, parseTierSetting} from \"./services/AiTierResolution\"\nexport type {AiTier, AiTierProvider, TierModelOption} from \"./services/AiTierResolution\"\n// On-device LLM: the model catalog and download status the same screen\n// renders for the phone-side model (engine.ai.local).\nexport type {\n LocalLlmDownloadStage,\n LocalLlmDownloadStatus,\n LocalLlmModelConfig,\n LocalLlmModelId,\n} from \"./services/LocalLlmModelManager\"\nexport {DEFAULT_LOCAL_LLM_MODEL, isLocalLlmModelId} from \"./services/LocalLlmModelManager\"\nexport type {\n OfflineActivity,\n OfflineActivityReason,\n OfflineLlmActivity,\n OfflineTranscriptionActivity,\n OfflineTranslationActivity,\n OfflineTranslationPair,\n} from \"./services/OfflineActivity\"\n\n// Shared user memory timeline (engine.memory / Settings > Memory). Entry and\n// session shapes are canonical in @glassly/miniapp (the session.memory\n// surface); the stats read model is engine-side.\nexport type {MemoryStats} from \"./services/MemoryStore\"\nexport type {AppStateExportResult, AppStateRestoreOptions, AppStateRestoreResult} from \"./services/appStateBackupFile\"\nexport type {SpeakerProfile} from \"./services/SpeakerProfileStore\"\nexport type {EnrollOutcome} from \"./facades/speakers\"\nexport {MENTRA_LIVE_SETTING_KEYS, getBluetoothSettingKeysForDevice} from \"./stores/bluetoothSettingKeys\"\n\n// Runtime-shared constants and contract DTOs.\nexport {ISLAND_SETTINGS_KEYS} from \"./runtime/config\"\nexport type {CloudClientStatusSnapshot, MiniappAuthToken, InteropAuditEvent, TtsSynthesisResult} from \"./runtime/config\"\n\n// Pure readiness predicates over glasses connection state.\nexport {\n isGlassesConnected,\n isGlassesReady,\n isGlassesLinkLayerBusy,\n waitForGlassesReady,\n type GlassesConnectionStatus,\n type WaitForGlassesReadyOptions,\n} from \"./services/GlassesReadiness\"\n// Pure connect/reconnect decision helpers (host UI renders the outcome).\nexport {\n decideReconnect,\n decideConnectButtonAction,\n type ReconnectDecision,\n type ReconnectDecisionInput,\n type ConnectButtonAction,\n} from \"./services/ConnectionCoordinator\"\n\n// OTA read-model types for host OTA UI (progress screen, error mapping,\n// progress section) — the check/install machinery itself is internal.\nexport type {\n VersionInfo,\n MtkPatch,\n BesFirmware,\n VersionJson,\n OtaCheckResult,\n OtaCheckCurrentGlassesResult,\n OtaCheckCurrentGlassesOptions,\n} from \"./services/OtaUpdateCheckService\"\n// OTA install policy (watchdog timings + failure copy) + display-state\n// derivation, consumed by the OTA screens and their tests.\nexport {\n MINIMUM_OTA_STATUS_BUILD,\n MAX_RETRIES,\n RETRY_INTERVAL_MS,\n PROGRESS_TIMEOUT_MS,\n DOWNLOAD_STUCK_TIMEOUT_MS,\n MTK_INSTALL_TIMEOUT_MS,\n GLOBAL_OTA_TIMEOUT_MS,\n PING_INTERVAL_MS,\n QUERY_REPLY_TIMEOUT_MS,\n BES_RESTART_TIMEOUT_MS,\n OtaProgressMessages,\n} from \"./services/otaInstallPolicy\"\nexport {deriveDisplayState} from \"./services/otaDisplayState\"\nexport type {DisplayState} from \"./services/otaDisplayState\"\nexport type {\n OtaProgress,\n OtaProgressStatus,\n OtaStatus,\n OtaUpdateInfo,\n ReleaseChangelog,\n OtaSnapshot,\n OtaInstallSnapshot,\n} from \"./facades/ota\"\nexport {\n beginOtaAutoChain,\n clearOtaAutoChainReconnectWait,\n isOtaAutoChainActive,\n otaAutoChainFingerprint,\n otaAutoChainReconnectWaitRemaining,\n stopOtaAutoChain,\n tryAdvanceOtaAutoChain,\n MAX_OTA_AUTO_CHAIN_PASSES,\n OTA_AUTO_CHAIN_RECONNECT_TIMEOUT_MS,\n} from \"./services/OtaAutoChain\"\nexport type {OtaAutoChainAdvanceResult} from \"./services/OtaAutoChain\"\nexport {\n BES_INSTALL_RESTART_MESSAGE,\n getOtaErrorMessage,\n shouldRequireGlassesRebootForBesFailure,\n shouldShowChangeWifiForOtaDownloadFailure,\n} from \"./services/OtaErrorMapping\"\n\n// Gallery read models: engine.gallery.onNotice payload types, the media\n// permission helper + display-name derivation host gallery UI uses, and the\n// glasses-camera DTO types (re-exported through the host @/types/asg shim).\nexport type {GalleryNotice, GalleryNoticeCode} from \"./services/asg/galleryNotices\"\nexport {MediaLibraryPermissions} from \"./utils/permissions/MediaLibraryPermissions\"\nexport {deriveGalleryDisplayName} from \"./utils/permissions/galleryDisplayName\"\nexport type {\n PhotoInfo,\n CaptureFile,\n CaptureGroup,\n GalleryResponse,\n ServerStatus,\n HealthResponse,\n GalleryEvent,\n} from \"./types/asg\"\n\n// Bluetooth SDK event types host UI subscribes to via engine facades (the\n// BluetoothSdk singleton passthrough itself is internal).\nexport type {PairFailureEvent, GlassesNotReadyEvent, PairedController, ControllerStatus} from \"@glassly/bluetooth-sdk\"\n\n// Cloud connection status enum (read model; the connection store is internal).\nexport {WebSocketStatus} from \"./stores/connection\"\n\n// App-list hook layer + pure list helpers (the raw useAppStatusStore and\n// installAppStoreHooks wiring are internal).\nexport {\n DUMMY_APPLET,\n saveAppsOrder,\n getAppsOrder,\n sortAppsByPackageNamePriority,\n saveLastOpenTime,\n getLastOpenTime,\n sortAppsByLastOpenTime,\n useApps,\n useStart,\n useStop,\n useSetForeground,\n useClearForeground,\n useRefresh,\n useStopAll,\n useInstall,\n useUninstall,\n useActiveApps,\n useRunningAlwaysOnApps,\n useWidgetApps,\n useActiveBackgroundApps,\n useBackgroundApps,\n useActiveForegroundApp,\n useForegroundApp,\n useActiveBackgroundAppsCount,\n useLocalMiniApps,\n type StartOptions,\n type OrderMap,\n} from \"./stores/apps\"\n\n// Pure dev-miniapp launch-route decision (registration itself is internal).\nexport {\n decideDevLaunchRoute,\n type DecideDevLaunchOptions,\n type DevLaunchResult,\n type DevManifest,\n} from \"./utils/devMiniappLaunch\"\nexport {HardwareCompatibility, type CompatibilityResult} from \"./utils/hardware\"\nexport {BgTimer} from \"./utils/timers\"\n// Meta Neural Band: the account sign-in a claim needs (the WebView lives in the host).\nexport {\n MetaAuthError,\n authEntryUrl,\n callbackMatches,\n callbackQuery,\n decryptBlob,\n isLoginCallback,\n login,\n tokensQuery,\n type MetaSession,\n type MetaSsoTokens,\n} from \"./services/neuralBand/MetaAuth\"\nexport type {\n NeuralBandClaimStatus,\n NeuralBandFirmwareStatus,\n NeuralBandHandwritingStatus,\n NeuralBandHandwritingUpdate,\n} from \"./services/neuralBand/NeuralBandInput\"\n\n// Hardware types and capability profiles.\nexport {\n HardwareType,\n HardwareRequirementLevel,\n DeviceTypes,\n ControllerTypes,\n HARDWARE_CAPABILITIES,\n getModelCapabilities,\n simulatedGlasses,\n evenRealitiesG1,\n evenRealitiesG2,\n mentraLive,\n nimo,\n rayneoIO,\n vuzixZ100,\n mentraDisplay,\n} from \"./types\"\nexport type {\n HardwareRequirement,\n CameraCapabilities,\n DisplayCapabilities,\n MicrophoneCapabilities,\n SpeakerCapabilities,\n IMUCapabilities,\n ButtonCapabilities,\n LightCapabilities,\n PowerCapabilities,\n Capabilities,\n AppletType,\n AppPermissionType,\n AppletPermission,\n AppletInterface,\n ClientApp,\n} from \"./types\"\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `@glassly/engine` — the OEM-facing main entry.\n *\n * The `engine` namespace (configure/start/stop + typed domain facades), the\n * public contract/read-model types, and the pure helpers host UI legitimately\n * renders with (decision functions, sort/order helpers, policy constants,\n * capability tables, timers). Judgment rule: read models, commands, pure\n * functions and types belong here; anything that mutates runtime state or\n * exposes a raw store/service remains private to the Glassly host.\n * See cloud/docs/issues/020-glasses-status-boundary/integration-review.md §D.\n */\n\n// The namespaced OEM-facing engine API (the \"(A) host API\"). See ./engine.\nexport {engine} from \"./engine\"\nexport type {\n ReportAttachmentInput,\n ReportContext,\n ReportDetails,\n ReportStatus,\n ReportTrigger,\n ReportSubmitResult,\n EngineSubmitReportInput,\n} from \"./facades/reports\"\nexport type {IslandNotification, IslandNotificationKind} from \"./facades/notifications\"\nexport type {PresentationOwner} from \"./services/notifications/notificationPolicy\"\nexport type {MiniappNotificationEvent} from \"./services/notifications/miniappNotifications\"\nexport {DEFAULT_HIDDEN_PACKAGES, isGatedByDevTools, isSystemMiniapp} from \"./stores/appVisibility\"\nexport type {WifiSearchResult} from \"./facades/glassesWifi\"\nexport type {IdentitySnapshot} from \"./services/PairingIdentity\"\nexport type {DisplayMirrorEvent} from \"./facades/displayMirror\"\nexport type {\n IslandConfigureOptions,\n IslandAuth,\n IslandConfigValues,\n IslandAnalytics,\n IslandUiSeams,\n ScanQrOptions,\n ScanQrResult,\n WebLoginOptions,\n WebLoginResult,\n SubjectTokenType,\n} from \"./runtime/bootstrap\"\n\n// Settings contract: the typed key registry (schema descriptors — the same\n// surface engine.settings.descriptor()/keys() reads), the per-key React hook\n// (the hook layer, same precedent as the apps hooks below), and the pure\n// device-model key helpers. The raw useSettingsStore stays internal;\n// imperative access goes through engine.settings.\nexport {SETTINGS, useSetting, AI_DATA_CONSENT_VERSION} from \"./stores/settings\"\nexport {isCfwFirmwareVersion, isCustomDashboardEligible} from \"./services/pages/pageEligibility\"\nexport {getEffectiveCapabilities} from \"./services/effectiveCapabilities\"\nexport {isControllerModel, isControllerReady} from \"./services/controllers\"\n\n// AI tier registry: the curated per-tier model dropdown options and helpers\n// the Settings > AI Models screen renders. Resolution itself runs inside\n// LocalMiniappRuntime; the screen only reads/writes the ai_model_* settings.\nexport {AI_TIERS, TIER_MODEL_OPTIONS, parseTierSetting} from \"./services/AiTierResolution\"\nexport type {AiTier, AiTierProvider, TierModelOption} from \"./services/AiTierResolution\"\n// On-device LLM: the model catalog and download status the same screen\n// renders for the phone-side model (engine.ai.local).\nexport type {\n LocalLlmDownloadStage,\n LocalLlmDownloadStatus,\n LocalLlmModelConfig,\n LocalLlmModelId,\n} from \"./services/LocalLlmModelManager\"\nexport {DEFAULT_LOCAL_LLM_MODEL, isLocalLlmModelId} from \"./services/LocalLlmModelManager\"\nexport type {\n OfflineActivity,\n OfflineActivityReason,\n OfflineLlmActivity,\n OfflineTranscriptionActivity,\n OfflineTranslationActivity,\n OfflineTranslationPair,\n} from \"./services/OfflineActivity\"\n\n// Shared user memory timeline (engine.memory / Settings > Memory). Entry and\n// session shapes are canonical in @glassly/miniapp (the session.memory\n// surface); the stats read model is engine-side.\nexport type {MemoryStats} from \"./services/MemoryStore\"\nexport type {AppStateExportResult, AppStateRestoreOptions, AppStateRestoreResult} from \"./services/appStateBackupFile\"\nexport type {SpeakerProfile} from \"./services/SpeakerProfileStore\"\nexport type {EnrollOutcome} from \"./facades/speakers\"\nexport {MENTRA_LIVE_SETTING_KEYS, getBluetoothSettingKeysForDevice} from \"./stores/bluetoothSettingKeys\"\n\n// Runtime-shared constants and contract DTOs.\nexport {ISLAND_SETTINGS_KEYS} from \"./runtime/config\"\nexport type {CloudClientStatusSnapshot, MiniappAuthToken, InteropAuditEvent, TtsSynthesisResult} from \"./runtime/config\"\n\n// Pure readiness predicates over glasses connection state.\nexport {\n isGlassesConnected,\n isGlassesReady,\n isGlassesLinkLayerBusy,\n waitForGlassesReady,\n type GlassesConnectionStatus,\n type WaitForGlassesReadyOptions,\n} from \"./services/GlassesReadiness\"\n// Pure connect/reconnect decision helpers (host UI renders the outcome).\nexport {\n decideReconnect,\n decideConnectButtonAction,\n type ReconnectDecision,\n type ReconnectDecisionInput,\n type ConnectButtonAction,\n} from \"./services/ConnectionCoordinator\"\n\n// OTA read-model types for host OTA UI (progress screen, error mapping,\n// progress section) — the check/install machinery itself is internal.\nexport type {\n VersionInfo,\n MtkPatch,\n BesFirmware,\n VersionJson,\n OtaCheckResult,\n OtaCheckCurrentGlassesResult,\n OtaCheckCurrentGlassesOptions,\n} from \"./services/OtaUpdateCheckService\"\n// OTA install policy (watchdog timings + failure copy) + display-state\n// derivation, consumed by the OTA screens and their tests.\nexport {\n MINIMUM_OTA_STATUS_BUILD,\n MAX_RETRIES,\n RETRY_INTERVAL_MS,\n PROGRESS_TIMEOUT_MS,\n DOWNLOAD_STUCK_TIMEOUT_MS,\n MTK_INSTALL_TIMEOUT_MS,\n GLOBAL_OTA_TIMEOUT_MS,\n PING_INTERVAL_MS,\n QUERY_REPLY_TIMEOUT_MS,\n BES_RESTART_TIMEOUT_MS,\n OtaProgressMessages,\n} from \"./services/otaInstallPolicy\"\nexport {deriveDisplayState} from \"./services/otaDisplayState\"\nexport type {DisplayState} from \"./services/otaDisplayState\"\nexport type {\n OtaProgress,\n OtaProgressStatus,\n OtaStatus,\n OtaUpdateInfo,\n ReleaseChangelog,\n OtaSnapshot,\n OtaInstallSnapshot,\n} from \"./facades/ota\"\nexport {\n beginOtaAutoChain,\n clearOtaAutoChainReconnectWait,\n isOtaAutoChainActive,\n otaAutoChainFingerprint,\n otaAutoChainReconnectWaitRemaining,\n stopOtaAutoChain,\n tryAdvanceOtaAutoChain,\n MAX_OTA_AUTO_CHAIN_PASSES,\n OTA_AUTO_CHAIN_RECONNECT_TIMEOUT_MS,\n} from \"./services/OtaAutoChain\"\nexport type {OtaAutoChainAdvanceResult} from \"./services/OtaAutoChain\"\nexport {\n BES_INSTALL_RESTART_MESSAGE,\n getOtaErrorMessage,\n shouldRequireGlassesRebootForBesFailure,\n shouldShowChangeWifiForOtaDownloadFailure,\n} from \"./services/OtaErrorMapping\"\n\n// Gallery read models: engine.gallery.onNotice payload types, the media\n// permission helper + display-name derivation host gallery UI uses, and the\n// glasses-camera DTO types (re-exported through the host @/types/asg shim).\nexport type {GalleryNotice, GalleryNoticeCode} from \"./services/asg/galleryNotices\"\nexport {MediaLibraryPermissions} from \"./utils/permissions/MediaLibraryPermissions\"\nexport {deriveGalleryDisplayName} from \"./utils/permissions/galleryDisplayName\"\nexport type {\n PhotoInfo,\n CaptureFile,\n CaptureGroup,\n GalleryResponse,\n ServerStatus,\n HealthResponse,\n GalleryEvent,\n} from \"./types/asg\"\n\n// Bluetooth SDK event types host UI subscribes to via engine facades (the\n// BluetoothSdk singleton passthrough itself is internal).\nexport type {PairFailureEvent, GlassesNotReadyEvent, PairedController, ControllerStatus} from \"@glassly/bluetooth-sdk\"\n\n// Cloud connection status enum (read model; the connection store is internal).\nexport {WebSocketStatus} from \"./stores/connection\"\n\n// App-list hook layer + pure list helpers (the raw useAppStatusStore and\n// installAppStoreHooks wiring are internal).\nexport {\n DUMMY_APPLET,\n saveAppsOrder,\n getAppsOrder,\n sortAppsByPackageNamePriority,\n saveLastOpenTime,\n getLastOpenTime,\n sortAppsByLastOpenTime,\n useApps,\n useStart,\n useStop,\n useSetForeground,\n useClearForeground,\n useRefresh,\n useStopAll,\n useInstall,\n useUninstall,\n useActiveApps,\n useRunningAlwaysOnApps,\n useWidgetApps,\n useActiveBackgroundApps,\n useBackgroundApps,\n useActiveForegroundApp,\n useForegroundApp,\n useActiveBackgroundAppsCount,\n useLocalMiniApps,\n type StartOptions,\n type OrderMap,\n} from \"./stores/apps\"\n\n// Pure dev-miniapp launch-route decision (registration itself is internal).\nexport {\n decideDevLaunchRoute,\n type DecideDevLaunchOptions,\n type DevLaunchResult,\n type DevManifest,\n} from \"./utils/devMiniappLaunch\"\nexport {HardwareCompatibility, type CompatibilityResult} from \"./utils/hardware\"\nexport {BgTimer} from \"./utils/timers\"\n// Meta Neural Band: the account sign-in a claim needs (the WebView lives in the host).\nexport {\n MetaAuthError,\n authEntryUrl,\n callbackMatches,\n callbackQuery,\n callbackShape,\n decryptBlob,\n isLoginCallback,\n login,\n tokensQuery,\n type MetaSession,\n type MetaSsoTokens,\n} from \"./services/neuralBand/MetaAuth\"\nexport type {\n NeuralBandClaimStatus,\n NeuralBandFirmwareStatus,\n NeuralBandHandwritingStatus,\n NeuralBandHandwritingUpdate,\n} from \"./services/neuralBand/NeuralBandInput\"\n\n// Hardware types and capability profiles.\nexport {\n HardwareType,\n HardwareRequirementLevel,\n DeviceTypes,\n ControllerTypes,\n HARDWARE_CAPABILITIES,\n getModelCapabilities,\n simulatedGlasses,\n evenRealitiesG1,\n evenRealitiesG2,\n mentraLive,\n nimo,\n rayneoIO,\n vuzixZ100,\n mentraDisplay,\n} from \"./types\"\nexport type {\n HardwareRequirement,\n CameraCapabilities,\n DisplayCapabilities,\n MicrophoneCapabilities,\n SpeakerCapabilities,\n IMUCapabilities,\n ButtonCapabilities,\n LightCapabilities,\n PowerCapabilities,\n Capabilities,\n AppletType,\n AppPermissionType,\n AppletPermission,\n AppletInterface,\n ClientApp,\n} from \"./types\"\n"]}
@@ -15,6 +15,7 @@ export declare function callbackQuery(url: string): {
15
15
  token?: string;
16
16
  blob?: string;
17
17
  };
18
+ export declare function callbackShape(url: string): string;
18
19
  /** The first 16 hex digits of the request token's SHA-256, which the callback must present. */
19
20
  export declare function expectedCallbackToken(nativeSsoToken: string): string;
20
21
  export declare function callbackMatches(token: string | undefined, nativeSsoToken: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"MetaAuth.d.ts","sourceRoot":"","sources":["../../../src/services/neuralBand/MetaAuth.ts"],"names":[],"mappings":"AAsBA,qBAAa,aAAc,SAAQ,KAAK;CAAG;AAE3C,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAE1D;AAED,6FAA6F;AAC7F,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,CAS1E;AAED,+FAA+F;AAC/F,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAM1F;AAED,wBAAgB,OAAO,IAAI,MAAM,CAIhC;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI3C;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMlF;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM,CAE1D;AAqCD,kDAAkD;AAClD,wBAAsB,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC,CAa1D;AAED,gEAAgE;AAChE,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYrF;AAUD,8DAA8D;AAC9D,wBAAsB,KAAK,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAyBxE"}
1
+ {"version":3,"file":"MetaAuth.d.ts","sourceRoot":"","sources":["../../../src/services/neuralBand/MetaAuth.ts"],"names":[],"mappings":"AAsBA,qBAAa,aAAc,SAAQ,KAAK;CAAG;AAE3C,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAE1D;AAED,6FAA6F;AAC7F,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEpD;AAsBD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,CAO1E;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED,+FAA+F;AAC/F,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAM1F;AAED,wBAAgB,OAAO,IAAI,MAAM,CAIhC;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI3C;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMlF;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM,CAE1D;AAsCD,kDAAkD;AAClD,wBAAsB,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC,CAa1D;AAED,gEAAgE;AAChE,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAYrF;AAUD,8DAA8D;AAC9D,wBAAsB,KAAK,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAyBxE"}
@@ -26,18 +26,45 @@ export function authEntryUrl(tokens) {
26
26
  export function isLoginCallback(url) {
27
27
  return url.toLowerCase().startsWith("fb-viewapp:") || url.includes("frl_login");
28
28
  }
29
+ function queryPairs(url) {
30
+ const withoutFragment = url.includes("#") ? url.slice(0, url.indexOf("#")) : url;
31
+ const query = withoutFragment.includes("?") ? withoutFragment.slice(withoutFragment.indexOf("?") + 1) : "";
32
+ const pairs = [];
33
+ for (const pair of query.split("&")) {
34
+ if (!pair)
35
+ continue;
36
+ const eq = pair.indexOf("=");
37
+ pairs.push(eq === -1 ? [pair, ""] : [pair.slice(0, eq), pair.slice(eq + 1)]);
38
+ }
39
+ return pairs;
40
+ }
41
+ function decodeValue(value) {
42
+ try {
43
+ return decodeURIComponent(value);
44
+ }
45
+ catch {
46
+ return value;
47
+ }
48
+ }
29
49
  export function callbackQuery(url) {
30
- const query = url.includes("?") ? url.slice(url.indexOf("?") + 1) : "";
31
50
  const out = {};
32
- for (const pair of query.split("&")) {
33
- const [key, value = ""] = pair.split("=");
51
+ for (const [key, value] of queryPairs(url)) {
34
52
  if (key === "token")
35
- out.token = decodeURIComponent(value);
53
+ out.token = decodeValue(value);
36
54
  if (key === "blob")
37
- out.blob = decodeURIComponent(value);
55
+ out.blob = decodeValue(value);
38
56
  }
39
57
  return out;
40
58
  }
59
+ export function callbackShape(url) {
60
+ const scheme = url.includes(":") ? url.slice(0, url.indexOf(":")) : "-";
61
+ const afterScheme = url.slice(scheme.length + 1);
62
+ const pathEnd = afterScheme.search(/[?#]/);
63
+ const path = pathEnd === -1 ? afterScheme : afterScheme.slice(0, pathEnd);
64
+ const keys = queryPairs(url).map(([key, value]) => `${key}:${value.length}`);
65
+ const fragment = url.includes("#") ? ` fragment=${url.slice(url.indexOf("#") + 1).length}` : "";
66
+ return `${scheme}:${path} query=[${keys.join(",")}]${fragment}`;
67
+ }
41
68
  /** The first 16 hex digits of the request token's SHA-256, which the callback must present. */
42
69
  export function expectedCallbackToken(nativeSsoToken) {
43
70
  return sha256Hex(nativeSsoToken).slice(0, 16);
@@ -82,11 +109,12 @@ async function post(url, headers, body) {
82
109
  catch {
83
110
  json = null;
84
111
  }
112
+ const error = json?.error;
85
113
  if (response.status !== 200 || json === null) {
86
- throw new MetaAuthError(`Meta sign-in failed (HTTP ${response.status}). Try again.`);
114
+ const code = error ? `, code ${error.code ?? "-"}` : "";
115
+ throw new MetaAuthError(`Meta sign-in failed (HTTP ${response.status}${code}). Try again.`);
87
116
  }
88
- if (json.error !== undefined) {
89
- const error = json.error;
117
+ if (error !== undefined) {
90
118
  throw new MetaAuthError(`Meta sign-in failed (code ${error?.code ?? "-"}, subcode ${error?.error_subcode ?? "-"}). Try again.`);
91
119
  }
92
120
  return json;
@@ -1 +1 @@
1
- {"version":3,"file":"MetaAuth.js","sourceRoot":"","sources":["../../../src/services/neuralBand/MetaAuth.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The Meta account sign-in a Neural Band claim needs, ported from callbacked/kinesis\n * (MIT, Copyright (c) 2026 callbacked): Sources/Kinesis/MetaAuth.swift.\n *\n * The chain: an anonymous tokens query, a WebView sign-in on auth.meta.com whose\n * fb-viewapp://…frl_login redirect carries a token and a blob, a blob decrypt, and\n * the ar-genai exchange that yields the user session. The session then goes to the\n * native Bluetooth SDK (keychain / keystore), which runs the ownership exchanges;\n * nothing here persists it.\n */\nimport {sha256Hex} from \"./sha256\"\n\n// Meta's own client identifiers, the same in every copy of Meta's apps. They name the\n// app that asks, not a person. They are not secrets, and no account or session is in them.\nconst FRL_CLIENT = \"FRL|388177446008673|083800dd7efbbd42eab18c9886d79c18\"\nconst AR_CLIENT = \"AR|306760944872162|a919421a55a8ea18080ab2f10f57f1be\"\nconst TOKENS_QUERY_URL = \"https://meta.graph.meta.com/webview_tokens_query\"\nconst BLOBS_DECRYPT_URL = \"https://meta.graph.meta.com/webview_blobs_decrypt\"\nconst LOGIN_URL = \"https://ar-genai.graph.meta.com/login\"\nconst AUTH_ENTRY_BASE =\n \"https://auth.meta.com/?native_app_id=388177446008673&source_app_id=388177446008673&native_sso_etoken=\"\n\nexport class MetaAuthError extends Error {}\n\nexport interface MetaSsoTokens {\n nativeSsoToken: string\n etoken: string\n}\n\nexport interface MetaSession {\n accessToken: string\n userId: string\n}\n\nexport function authEntryUrl(tokens: MetaSsoTokens): string {\n return AUTH_ENTRY_BASE + encodeURIComponent(tokens.etoken)\n}\n\n/** The redirect that ends the sign-in: a custom scheme, or the frl_login marker on https. */\nexport function isLoginCallback(url: string): boolean {\n return url.toLowerCase().startsWith(\"fb-viewapp:\") || url.includes(\"frl_login\")\n}\n\nexport function callbackQuery(url: string): {token?: string; blob?: string} {\n const query = url.includes(\"?\") ? url.slice(url.indexOf(\"?\") + 1) : \"\"\n const out: {token?: string; blob?: string} = {}\n for (const pair of query.split(\"&\")) {\n const [key, value = \"\"] = pair.split(\"=\")\n if (key === \"token\") out.token = decodeURIComponent(value)\n if (key === \"blob\") out.blob = decodeURIComponent(value)\n }\n return out\n}\n\n/** The first 16 hex digits of the request token's SHA-256, which the callback must present. */\nexport function expectedCallbackToken(nativeSsoToken: string): string {\n return sha256Hex(nativeSsoToken).slice(0, 16)\n}\n\nexport function callbackMatches(token: string | undefined, nativeSsoToken: string): boolean {\n if (!token || token.length !== 16) return false\n const expected = expectedCallbackToken(nativeSsoToken)\n let difference = 0\n for (let i = 0; i < 16; i++) difference |= token.charCodeAt(i) ^ expected.charCodeAt(i)\n return difference === 0\n}\n\nexport function makeLsd(): string {\n let digits = \"\"\n for (let i = 0; i < 6; i++) digits += Math.floor(Math.random() * 10)\n return \"S0.\" + digits\n}\n\nexport function jazoest(lsd: string): string {\n let sum = 0\n for (const char of lsd) sum += char.codePointAt(0) ?? 0\n return \"2\" + sum\n}\n\nexport function multipartBody(fields: [string, string][], boundary: string): string {\n let body = \"\"\n for (const [name, value] of fields) {\n body += `--${boundary}\\r\\nContent-Disposition: form-data; name=\"${name}\"\\r\\n\\r\\n${value}\\r\\n`\n }\n return body + `--${boundary}--\\r\\n`\n}\n\nexport function urlForm(fields: [string, string][]): string {\n return fields.map(([name, value]) => `${name}=${encodeURIComponent(value)}`).join(\"&\")\n}\n\ntype Json = Record<string, unknown>\n\nasync function post(url: string, headers: Record<string, string>, body: string): Promise<Json> {\n const response = await fetch(url, {method: \"POST\", headers, body})\n let json: Json | null = null\n try {\n json = (await response.json()) as Json\n } catch {\n json = null\n }\n if (response.status !== 200 || json === null) {\n throw new MetaAuthError(`Meta sign-in failed (HTTP ${response.status}). Try again.`)\n }\n if (json.error !== undefined) {\n const error = json.error as {code?: number; error_subcode?: number} | null\n throw new MetaAuthError(\n `Meta sign-in failed (code ${error?.code ?? \"-\"}, subcode ${error?.error_subcode ?? \"-\"}). Try again.`,\n )\n }\n return json\n}\n\nasync function postMultipart(url: string, fields: [string, string][]): Promise<Json> {\n const boundary = `glassly.form.${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`\n return post(\n url,\n {\n \"Content-Type\": `multipart/form-data; boundary=${boundary}`,\n \"Accept\": \"application/json\",\n \"Origin\": \"https://auth.meta.com\",\n },\n multipartBody(fields, boundary),\n )\n}\n\n/** Step 1: the anonymous WebView tokens query. */\nexport async function tokensQuery(): Promise<MetaSsoTokens> {\n const lsd = makeLsd()\n const json = await postMultipart(TOKENS_QUERY_URL, [\n [\"access_token\", FRL_CLIENT],\n [\"lsd\", lsd],\n [\"jazoest\", jazoest(lsd)],\n ])\n const nativeSsoToken = json.native_sso_token\n const etoken = json.native_sso_etoken\n if (typeof nativeSsoToken !== \"string\" || !nativeSsoToken || typeof etoken !== \"string\" || !etoken) {\n throw new MetaAuthError(\"Meta didn't return sign-in tokens. Try again.\")\n }\n return {nativeSsoToken, etoken}\n}\n\n/** Step 3: decrypt the login blob into the FRL access token. */\nexport async function decryptBlob(blob: string, requestToken: string): Promise<string> {\n const lsd = makeLsd()\n const json = await postMultipart(BLOBS_DECRYPT_URL, [\n [\"blob\", blob],\n [\"request_token\", requestToken],\n [\"access_token\", FRL_CLIENT],\n [\"lsd\", lsd],\n [\"jazoest\", jazoest(lsd)],\n ])\n const token = json.access_token\n if (typeof token !== \"string\" || !token) throw new MetaAuthError(\"Meta didn't confirm the sign-in. Try again.\")\n return token\n}\n\nfunction randomId(): string {\n const hex = () =>\n Math.floor(Math.random() * 0x10000)\n .toString(16)\n .padStart(4, \"0\")\n return `${hex()}${hex()}-${hex()}-${hex()}-${hex()}-${hex()}${hex()}${hex()}`.toUpperCase()\n}\n\n/** Step 4: exchange the FRL token for the ar user session. */\nexport async function login(frlAccessToken: string): Promise<MetaSession> {\n const json = await post(\n LOGIN_URL,\n {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n \"Accept\": \"application/json\",\n \"Authorization\": \"OAuth \" + AR_CLIENT,\n },\n urlForm([\n [\"frl_access_token\", frlAccessToken],\n [\"logging_session_id\", randomId()],\n [\"format\", \"json\"],\n [\"device_id\", randomId()],\n [\"generate_session_cookies\", \"1\"],\n [\"generate_analytics_claim\", \"1\"],\n [\"method\", \"POST\"],\n ]),\n )\n const accessToken = json.access_token\n const rawUserId = json.user_id\n const userId = typeof rawUserId === \"string\" ? rawUserId : typeof rawUserId === \"number\" ? String(rawUserId) : \"\"\n if (typeof accessToken !== \"string\" || !accessToken || !userId) {\n throw new MetaAuthError(\"Meta didn't return an account session. Try again.\")\n }\n return {accessToken, userId}\n}\n"]}
1
+ {"version":3,"file":"MetaAuth.js","sourceRoot":"","sources":["../../../src/services/neuralBand/MetaAuth.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The Meta account sign-in a Neural Band claim needs, ported from callbacked/kinesis\n * (MIT, Copyright (c) 2026 callbacked): Sources/Kinesis/MetaAuth.swift.\n *\n * The chain: an anonymous tokens query, a WebView sign-in on auth.meta.com whose\n * fb-viewapp://…frl_login redirect carries a token and a blob, a blob decrypt, and\n * the ar-genai exchange that yields the user session. The session then goes to the\n * native Bluetooth SDK (keychain / keystore), which runs the ownership exchanges;\n * nothing here persists it.\n */\nimport {sha256Hex} from \"./sha256\"\n\n// Meta's own client identifiers, the same in every copy of Meta's apps. They name the\n// app that asks, not a person. They are not secrets, and no account or session is in them.\nconst FRL_CLIENT = \"FRL|388177446008673|083800dd7efbbd42eab18c9886d79c18\"\nconst AR_CLIENT = \"AR|306760944872162|a919421a55a8ea18080ab2f10f57f1be\"\nconst TOKENS_QUERY_URL = \"https://meta.graph.meta.com/webview_tokens_query\"\nconst BLOBS_DECRYPT_URL = \"https://meta.graph.meta.com/webview_blobs_decrypt\"\nconst LOGIN_URL = \"https://ar-genai.graph.meta.com/login\"\nconst AUTH_ENTRY_BASE =\n \"https://auth.meta.com/?native_app_id=388177446008673&source_app_id=388177446008673&native_sso_etoken=\"\n\nexport class MetaAuthError extends Error {}\n\nexport interface MetaSsoTokens {\n nativeSsoToken: string\n etoken: string\n}\n\nexport interface MetaSession {\n accessToken: string\n userId: string\n}\n\nexport function authEntryUrl(tokens: MetaSsoTokens): string {\n return AUTH_ENTRY_BASE + encodeURIComponent(tokens.etoken)\n}\n\n/** The redirect that ends the sign-in: a custom scheme, or the frl_login marker on https. */\nexport function isLoginCallback(url: string): boolean {\n return url.toLowerCase().startsWith(\"fb-viewapp:\") || url.includes(\"frl_login\")\n}\n\nfunction queryPairs(url: string): [string, string][] {\n const withoutFragment = url.includes(\"#\") ? url.slice(0, url.indexOf(\"#\")) : url\n const query = withoutFragment.includes(\"?\") ? withoutFragment.slice(withoutFragment.indexOf(\"?\") + 1) : \"\"\n const pairs: [string, string][] = []\n for (const pair of query.split(\"&\")) {\n if (!pair) continue\n const eq = pair.indexOf(\"=\")\n pairs.push(eq === -1 ? [pair, \"\"] : [pair.slice(0, eq), pair.slice(eq + 1)])\n }\n return pairs\n}\n\nfunction decodeValue(value: string): string {\n try {\n return decodeURIComponent(value)\n } catch {\n return value\n }\n}\n\nexport function callbackQuery(url: string): {token?: string; blob?: string} {\n const out: {token?: string; blob?: string} = {}\n for (const [key, value] of queryPairs(url)) {\n if (key === \"token\") out.token = decodeValue(value)\n if (key === \"blob\") out.blob = decodeValue(value)\n }\n return out\n}\n\nexport function callbackShape(url: string): string {\n const scheme = url.includes(\":\") ? url.slice(0, url.indexOf(\":\")) : \"-\"\n const afterScheme = url.slice(scheme.length + 1)\n const pathEnd = afterScheme.search(/[?#]/)\n const path = pathEnd === -1 ? afterScheme : afterScheme.slice(0, pathEnd)\n const keys = queryPairs(url).map(([key, value]) => `${key}:${value.length}`)\n const fragment = url.includes(\"#\") ? ` fragment=${url.slice(url.indexOf(\"#\") + 1).length}` : \"\"\n return `${scheme}:${path} query=[${keys.join(\",\")}]${fragment}`\n}\n\n/** The first 16 hex digits of the request token's SHA-256, which the callback must present. */\nexport function expectedCallbackToken(nativeSsoToken: string): string {\n return sha256Hex(nativeSsoToken).slice(0, 16)\n}\n\nexport function callbackMatches(token: string | undefined, nativeSsoToken: string): boolean {\n if (!token || token.length !== 16) return false\n const expected = expectedCallbackToken(nativeSsoToken)\n let difference = 0\n for (let i = 0; i < 16; i++) difference |= token.charCodeAt(i) ^ expected.charCodeAt(i)\n return difference === 0\n}\n\nexport function makeLsd(): string {\n let digits = \"\"\n for (let i = 0; i < 6; i++) digits += Math.floor(Math.random() * 10)\n return \"S0.\" + digits\n}\n\nexport function jazoest(lsd: string): string {\n let sum = 0\n for (const char of lsd) sum += char.codePointAt(0) ?? 0\n return \"2\" + sum\n}\n\nexport function multipartBody(fields: [string, string][], boundary: string): string {\n let body = \"\"\n for (const [name, value] of fields) {\n body += `--${boundary}\\r\\nContent-Disposition: form-data; name=\"${name}\"\\r\\n\\r\\n${value}\\r\\n`\n }\n return body + `--${boundary}--\\r\\n`\n}\n\nexport function urlForm(fields: [string, string][]): string {\n return fields.map(([name, value]) => `${name}=${encodeURIComponent(value)}`).join(\"&\")\n}\n\ntype Json = Record<string, unknown>\n\nasync function post(url: string, headers: Record<string, string>, body: string): Promise<Json> {\n const response = await fetch(url, {method: \"POST\", headers, body})\n let json: Json | null = null\n try {\n json = (await response.json()) as Json\n } catch {\n json = null\n }\n const error = json?.error as {code?: number; error_subcode?: number} | null | undefined\n if (response.status !== 200 || json === null) {\n const code = error ? `, code ${error.code ?? \"-\"}` : \"\"\n throw new MetaAuthError(`Meta sign-in failed (HTTP ${response.status}${code}). Try again.`)\n }\n if (error !== undefined) {\n throw new MetaAuthError(\n `Meta sign-in failed (code ${error?.code ?? \"-\"}, subcode ${error?.error_subcode ?? \"-\"}). Try again.`,\n )\n }\n return json\n}\n\nasync function postMultipart(url: string, fields: [string, string][]): Promise<Json> {\n const boundary = `glassly.form.${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`\n return post(\n url,\n {\n \"Content-Type\": `multipart/form-data; boundary=${boundary}`,\n \"Accept\": \"application/json\",\n \"Origin\": \"https://auth.meta.com\",\n },\n multipartBody(fields, boundary),\n )\n}\n\n/** Step 1: the anonymous WebView tokens query. */\nexport async function tokensQuery(): Promise<MetaSsoTokens> {\n const lsd = makeLsd()\n const json = await postMultipart(TOKENS_QUERY_URL, [\n [\"access_token\", FRL_CLIENT],\n [\"lsd\", lsd],\n [\"jazoest\", jazoest(lsd)],\n ])\n const nativeSsoToken = json.native_sso_token\n const etoken = json.native_sso_etoken\n if (typeof nativeSsoToken !== \"string\" || !nativeSsoToken || typeof etoken !== \"string\" || !etoken) {\n throw new MetaAuthError(\"Meta didn't return sign-in tokens. Try again.\")\n }\n return {nativeSsoToken, etoken}\n}\n\n/** Step 3: decrypt the login blob into the FRL access token. */\nexport async function decryptBlob(blob: string, requestToken: string): Promise<string> {\n const lsd = makeLsd()\n const json = await postMultipart(BLOBS_DECRYPT_URL, [\n [\"blob\", blob],\n [\"request_token\", requestToken],\n [\"access_token\", FRL_CLIENT],\n [\"lsd\", lsd],\n [\"jazoest\", jazoest(lsd)],\n ])\n const token = json.access_token\n if (typeof token !== \"string\" || !token) throw new MetaAuthError(\"Meta didn't confirm the sign-in. Try again.\")\n return token\n}\n\nfunction randomId(): string {\n const hex = () =>\n Math.floor(Math.random() * 0x10000)\n .toString(16)\n .padStart(4, \"0\")\n return `${hex()}${hex()}-${hex()}-${hex()}-${hex()}-${hex()}${hex()}${hex()}`.toUpperCase()\n}\n\n/** Step 4: exchange the FRL token for the ar user session. */\nexport async function login(frlAccessToken: string): Promise<MetaSession> {\n const json = await post(\n LOGIN_URL,\n {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n \"Accept\": \"application/json\",\n \"Authorization\": \"OAuth \" + AR_CLIENT,\n },\n urlForm([\n [\"frl_access_token\", frlAccessToken],\n [\"logging_session_id\", randomId()],\n [\"format\", \"json\"],\n [\"device_id\", randomId()],\n [\"generate_session_cookies\", \"1\"],\n [\"generate_analytics_claim\", \"1\"],\n [\"method\", \"POST\"],\n ]),\n )\n const accessToken = json.access_token\n const rawUserId = json.user_id\n const userId = typeof rawUserId === \"string\" ? rawUserId : typeof rawUserId === \"number\" ? String(rawUserId) : \"\"\n if (typeof accessToken !== \"string\" || !accessToken || !userId) {\n throw new MetaAuthError(\"Meta didn't return an account session. Try again.\")\n }\n return {accessToken, userId}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"even-realities-g1.d.ts","sourceRoot":"","sources":["../../../src/types/capabilities/even-realities-g1.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,aAAa,CAAA;AAE7C;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,YA8D7B,CAAA"}
1
+ {"version":3,"file":"even-realities-g1.d.ts","sourceRoot":"","sources":["../../../src/types/capabilities/even-realities-g1.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,aAAa,CAAA;AAE7C;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,YAmE7B,CAAA"}
@@ -57,5 +57,9 @@ export const evenRealitiesG1 = {
57
57
  // The app flashes the bundled Glassly CFW over MCUmgr SMP (see
58
58
  // bluetooth-sdk/ios/Source/Resources/G1Firmware/README.md).
59
59
  hasCustomFirmware: true,
60
+ // On iOS the Glassly CFW (G1CFW/51) relays the notifications the phone shares
61
+ // with the glasses over ANCS; the dashboard presents them.
62
+ hasNativeNotifications: false,
63
+ hasNotificationRelay: true,
60
64
  };
61
65
  //# sourceMappingURL=even-realities-g1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"even-realities-g1.js","sourceRoot":"","sources":["../../../src/types/capabilities/even-realities-g1.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAiB;IAC3C,SAAS,EAAE,mBAAmB;IAE9B,kDAAkD;IAClD,SAAS,EAAE,KAAK;IAChB,MAAM,EAAE,IAAI;IAEZ,2DAA2D;IAC3D,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE;QACP,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,OAAO;QACd,gBAAgB,EAAE,KAAK,EAAE,kEAAkE;QAC3F,UAAU,EAAE,EAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAC;QACrC,WAAW,EAAE,EAAC,UAAU,EAAE,EAAE,EAAC;QAC7B,YAAY,EAAE,CAAC;QACf,gBAAgB,EAAE,IAAI;QACtB,aAAa,EAAE,EAAC,MAAM,EAAE,EAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAC,EAAE,KAAK,EAAE,EAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAC,EAAC;QAElE,4EAA4E;QAC5E,WAAW,EAAE,KAAK;QAClB,gBAAgB,EAAE,CAAC;KACpB;IAED,8DAA8D;IAC9D,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE;QACV,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,KAAK;KACd;IAED,oDAAoD;IACpD,UAAU,EAAE,KAAK;IACjB,OAAO,EAAE,IAAI;IAEb,4FAA4F;IAC5F,MAAM,EAAE,IAAI;IACZ,GAAG,EAAE,IAAI;IAET,iDAAiD;IACjD,SAAS,EAAE,KAAK;IAChB,MAAM,EAAE,IAAI;IAEZ,+CAA+C;IAC/C,QAAQ,EAAE,KAAK;IACf,KAAK,EAAE,IAAI;IAEX,yDAAyD;IACzD,KAAK,EAAE;QACL,kBAAkB,EAAE,KAAK;KAC1B;IAED,+CAA+C;IAC/C,OAAO,EAAE,KAAK;IAEd,4EAA4E;IAC5E,MAAM,EAAE,KAAK;IAEb,+DAA+D;IAC/D,4DAA4D;IAC5D,iBAAiB,EAAE,IAAI;CACxB,CAAA","sourcesContent":["/**\n * @fileoverview Even Realities G1 Hardware Capabilities\n *\n * Capability profile for the Even Realities G1 smart glasses model.\n * Defines the hardware and software features available on this device.\n */\n\nimport type {Capabilities} from \"../hardware\"\n\n/**\n * Even Realities G1 capability profile\n */\nexport const evenRealitiesG1: Capabilities = {\n modelName: \"Even Realities G1\",\n\n // Camera capabilities - G1 does not have a camera\n hasCamera: false,\n camera: null,\n\n // Display capabilities - G1 has a green monochrome display\n hasDisplay: true,\n display: {\n count: 2,\n isColor: false,\n color: \"green\",\n canDisplayBitmap: false, // broken in practice — capability stops lying (design doc §3.4.8)\n resolution: {width: 640, height: 200},\n fieldOfView: {horizontal: 25},\n maxTextLines: 5,\n adjustBrightness: true,\n positionRange: {height: {min: 0, max: 8}, depth: {min: 1, max: 9}},\n\n // Scene display API — no positioned elements; scenes degrade to text walls.\n canPosition: false,\n maxImageElements: 0,\n },\n\n // Microphone capabilities - G1 has one microphone without VAD\n hasMicrophone: true,\n microphone: {\n count: 1,\n hasVAD: false,\n },\n\n // Speaker capabilities - G1 does not have a speaker\n hasSpeaker: false,\n speaker: null,\n\n // IMU capabilities - G1 has IMU for head-up/down detection but raw data not exposed to apps\n hasIMU: true,\n imu: null,\n\n // Button capabilities - G1 does not have buttons\n hasButton: false,\n button: null,\n\n // Light capabilities - G1 does not have lights\n hasLight: false,\n light: null,\n\n // Power capabilities - G1 does not have external battery\n power: {\n hasExternalBattery: false,\n },\n\n // WiFi capabilities - G1 does not support WiFi\n hasWifi: false,\n\n // OTA capabilities - G1 firmware updates are not driven by the ASG OTA flow\n hasOta: false,\n\n // The app flashes the bundled Glassly CFW over MCUmgr SMP (see\n // bluetooth-sdk/ios/Source/Resources/G1Firmware/README.md).\n hasCustomFirmware: true,\n}\n"]}
1
+ {"version":3,"file":"even-realities-g1.js","sourceRoot":"","sources":["../../../src/types/capabilities/even-realities-g1.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAiB;IAC3C,SAAS,EAAE,mBAAmB;IAE9B,kDAAkD;IAClD,SAAS,EAAE,KAAK;IAChB,MAAM,EAAE,IAAI;IAEZ,2DAA2D;IAC3D,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE;QACP,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,OAAO;QACd,gBAAgB,EAAE,KAAK,EAAE,kEAAkE;QAC3F,UAAU,EAAE,EAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAC;QACrC,WAAW,EAAE,EAAC,UAAU,EAAE,EAAE,EAAC;QAC7B,YAAY,EAAE,CAAC;QACf,gBAAgB,EAAE,IAAI;QACtB,aAAa,EAAE,EAAC,MAAM,EAAE,EAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAC,EAAE,KAAK,EAAE,EAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAC,EAAC;QAElE,4EAA4E;QAC5E,WAAW,EAAE,KAAK;QAClB,gBAAgB,EAAE,CAAC;KACpB;IAED,8DAA8D;IAC9D,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE;QACV,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,KAAK;KACd;IAED,oDAAoD;IACpD,UAAU,EAAE,KAAK;IACjB,OAAO,EAAE,IAAI;IAEb,4FAA4F;IAC5F,MAAM,EAAE,IAAI;IACZ,GAAG,EAAE,IAAI;IAET,iDAAiD;IACjD,SAAS,EAAE,KAAK;IAChB,MAAM,EAAE,IAAI;IAEZ,+CAA+C;IAC/C,QAAQ,EAAE,KAAK;IACf,KAAK,EAAE,IAAI;IAEX,yDAAyD;IACzD,KAAK,EAAE;QACL,kBAAkB,EAAE,KAAK;KAC1B;IAED,+CAA+C;IAC/C,OAAO,EAAE,KAAK;IAEd,4EAA4E;IAC5E,MAAM,EAAE,KAAK;IAEb,+DAA+D;IAC/D,4DAA4D;IAC5D,iBAAiB,EAAE,IAAI;IAEvB,8EAA8E;IAC9E,2DAA2D;IAC3D,sBAAsB,EAAE,KAAK;IAC7B,oBAAoB,EAAE,IAAI;CAC3B,CAAA","sourcesContent":["/**\n * @fileoverview Even Realities G1 Hardware Capabilities\n *\n * Capability profile for the Even Realities G1 smart glasses model.\n * Defines the hardware and software features available on this device.\n */\n\nimport type {Capabilities} from \"../hardware\"\n\n/**\n * Even Realities G1 capability profile\n */\nexport const evenRealitiesG1: Capabilities = {\n modelName: \"Even Realities G1\",\n\n // Camera capabilities - G1 does not have a camera\n hasCamera: false,\n camera: null,\n\n // Display capabilities - G1 has a green monochrome display\n hasDisplay: true,\n display: {\n count: 2,\n isColor: false,\n color: \"green\",\n canDisplayBitmap: false, // broken in practice — capability stops lying (design doc §3.4.8)\n resolution: {width: 640, height: 200},\n fieldOfView: {horizontal: 25},\n maxTextLines: 5,\n adjustBrightness: true,\n positionRange: {height: {min: 0, max: 8}, depth: {min: 1, max: 9}},\n\n // Scene display API — no positioned elements; scenes degrade to text walls.\n canPosition: false,\n maxImageElements: 0,\n },\n\n // Microphone capabilities - G1 has one microphone without VAD\n hasMicrophone: true,\n microphone: {\n count: 1,\n hasVAD: false,\n },\n\n // Speaker capabilities - G1 does not have a speaker\n hasSpeaker: false,\n speaker: null,\n\n // IMU capabilities - G1 has IMU for head-up/down detection but raw data not exposed to apps\n hasIMU: true,\n imu: null,\n\n // Button capabilities - G1 does not have buttons\n hasButton: false,\n button: null,\n\n // Light capabilities - G1 does not have lights\n hasLight: false,\n light: null,\n\n // Power capabilities - G1 does not have external battery\n power: {\n hasExternalBattery: false,\n },\n\n // WiFi capabilities - G1 does not support WiFi\n hasWifi: false,\n\n // OTA capabilities - G1 firmware updates are not driven by the ASG OTA flow\n hasOta: false,\n\n // The app flashes the bundled Glassly CFW over MCUmgr SMP (see\n // bluetooth-sdk/ios/Source/Resources/G1Firmware/README.md).\n hasCustomFirmware: true,\n\n // On iOS the Glassly CFW (G1CFW/51) relays the notifications the phone shares\n // with the glasses over ANCS; the dashboard presents them.\n hasNativeNotifications: false,\n hasNotificationRelay: true,\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glassly/engine",
3
- "version": "0.4.0-beta.1086",
3
+ "version": "0.4.0-beta.1091",
4
4
  "description": "Glassly Engine — miniapp registry, WebView bridge, and miniapp store",
5
5
  "main": "build/index.js",
6
6
  "react-native": "src/index.ts",
@@ -97,17 +97,17 @@
97
97
  "registry": "https://registry.npmjs.org/"
98
98
  },
99
99
  "dependencies": {
100
- "@glassly/bluetooth-sdk": "0.4.0-beta.1086",
101
- "@glassly/cloud-client": "0.4.0-beta.1086",
102
- "@glassly/cloud-protocol": "0.4.0-beta.1086",
103
- "@glassly/crust": "0.4.0-beta.1086",
104
- "@glassly/miniapp": "0.4.0-beta.1086",
100
+ "@glassly/bluetooth-sdk": "0.4.0-beta.1091",
101
+ "@glassly/cloud-client": "0.4.0-beta.1091",
102
+ "@glassly/cloud-protocol": "0.4.0-beta.1091",
103
+ "@glassly/crust": "0.4.0-beta.1091",
104
+ "@glassly/miniapp": "0.4.0-beta.1091",
105
105
  "buffer": "^6.0.3",
106
106
  "events": "^3.3.0",
107
107
  "react-native-marked": "8.3.4",
108
108
  "semver": "^7.8.6",
109
109
  "typesafe-ts": "^1.7.1",
110
- "@glassly/llm-providers": "0.4.0-beta.1086",
110
+ "@glassly/llm-providers": "0.4.0-beta.1091",
111
111
  "@huggingface/jinja": "^0.5.12",
112
112
  "jsonrepair": "^3.15.0"
113
113
  },
@@ -12,9 +12,9 @@ export interface EngineReleaseMetadata {
12
12
  export const ENGINE_RELEASE_METADATA: Readonly<EngineReleaseMetadata> = Object.freeze({
13
13
  "schemaVersion": 1,
14
14
  "familyBaseVersion": "0.4.0",
15
- "releaseIdentity": "0.4.0-beta.1086",
16
- "releaseSetId": "glassly-0.4.0-beta.1086",
17
- "sourceCommit": "98789ba97bcc911b9f621a3ab282aea6b0cc52c0",
15
+ "releaseIdentity": "0.4.0-beta.1091",
16
+ "releaseSetId": "glassly-0.4.0-beta.1091",
17
+ "sourceCommit": "7e4bf2595c212f7b7b33a09b3a88ff2592c45111",
18
18
  "otaManifestUrl": null,
19
19
  "otaManifestSha256": null
20
20
  })
package/src/index.ts CHANGED
@@ -231,6 +231,7 @@ export {
231
231
  authEntryUrl,
232
232
  callbackMatches,
233
233
  callbackQuery,
234
+ callbackShape,
234
235
  decryptBlob,
235
236
  isLoginCallback,
236
237
  login,
@@ -41,17 +41,45 @@ export function isLoginCallback(url: string): boolean {
41
41
  return url.toLowerCase().startsWith("fb-viewapp:") || url.includes("frl_login")
42
42
  }
43
43
 
44
+ function queryPairs(url: string): [string, string][] {
45
+ const withoutFragment = url.includes("#") ? url.slice(0, url.indexOf("#")) : url
46
+ const query = withoutFragment.includes("?") ? withoutFragment.slice(withoutFragment.indexOf("?") + 1) : ""
47
+ const pairs: [string, string][] = []
48
+ for (const pair of query.split("&")) {
49
+ if (!pair) continue
50
+ const eq = pair.indexOf("=")
51
+ pairs.push(eq === -1 ? [pair, ""] : [pair.slice(0, eq), pair.slice(eq + 1)])
52
+ }
53
+ return pairs
54
+ }
55
+
56
+ function decodeValue(value: string): string {
57
+ try {
58
+ return decodeURIComponent(value)
59
+ } catch {
60
+ return value
61
+ }
62
+ }
63
+
44
64
  export function callbackQuery(url: string): {token?: string; blob?: string} {
45
- const query = url.includes("?") ? url.slice(url.indexOf("?") + 1) : ""
46
65
  const out: {token?: string; blob?: string} = {}
47
- for (const pair of query.split("&")) {
48
- const [key, value = ""] = pair.split("=")
49
- if (key === "token") out.token = decodeURIComponent(value)
50
- if (key === "blob") out.blob = decodeURIComponent(value)
66
+ for (const [key, value] of queryPairs(url)) {
67
+ if (key === "token") out.token = decodeValue(value)
68
+ if (key === "blob") out.blob = decodeValue(value)
51
69
  }
52
70
  return out
53
71
  }
54
72
 
73
+ export function callbackShape(url: string): string {
74
+ const scheme = url.includes(":") ? url.slice(0, url.indexOf(":")) : "-"
75
+ const afterScheme = url.slice(scheme.length + 1)
76
+ const pathEnd = afterScheme.search(/[?#]/)
77
+ const path = pathEnd === -1 ? afterScheme : afterScheme.slice(0, pathEnd)
78
+ const keys = queryPairs(url).map(([key, value]) => `${key}:${value.length}`)
79
+ const fragment = url.includes("#") ? ` fragment=${url.slice(url.indexOf("#") + 1).length}` : ""
80
+ return `${scheme}:${path} query=[${keys.join(",")}]${fragment}`
81
+ }
82
+
55
83
  /** The first 16 hex digits of the request token's SHA-256, which the callback must present. */
56
84
  export function expectedCallbackToken(nativeSsoToken: string): string {
57
85
  return sha256Hex(nativeSsoToken).slice(0, 16)
@@ -99,11 +127,12 @@ async function post(url: string, headers: Record<string, string>, body: string):
99
127
  } catch {
100
128
  json = null
101
129
  }
130
+ const error = json?.error as {code?: number; error_subcode?: number} | null | undefined
102
131
  if (response.status !== 200 || json === null) {
103
- throw new MetaAuthError(`Meta sign-in failed (HTTP ${response.status}). Try again.`)
132
+ const code = error ? `, code ${error.code ?? "-"}` : ""
133
+ throw new MetaAuthError(`Meta sign-in failed (HTTP ${response.status}${code}). Try again.`)
104
134
  }
105
- if (json.error !== undefined) {
106
- const error = json.error as {code?: number; error_subcode?: number} | null
135
+ if (error !== undefined) {
107
136
  throw new MetaAuthError(
108
137
  `Meta sign-in failed (code ${error?.code ?? "-"}, subcode ${error?.error_subcode ?? "-"}). Try again.`,
109
138
  )
@@ -72,4 +72,9 @@ export const evenRealitiesG1: Capabilities = {
72
72
  // The app flashes the bundled Glassly CFW over MCUmgr SMP (see
73
73
  // bluetooth-sdk/ios/Source/Resources/G1Firmware/README.md).
74
74
  hasCustomFirmware: true,
75
+
76
+ // On iOS the Glassly CFW (G1CFW/51) relays the notifications the phone shares
77
+ // with the glasses over ANCS; the dashboard presents them.
78
+ hasNativeNotifications: false,
79
+ hasNotificationRelay: true,
75
80
  }