@mentra/sdk 3.0.0-alpha.1 → 3.0.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/app/server/index.d.ts +3 -12
  2. package/dist/app/server/index.d.ts.map +1 -1
  3. package/dist/display-utils.js +102 -102
  4. package/dist/display-utils.js.map +3 -3
  5. package/dist/index.js +163 -117
  6. package/dist/index.js.map +16 -16
  7. package/dist/internal/_SessionManager.d.ts.map +1 -1
  8. package/dist/session/MentraSession.d.ts.map +1 -1
  9. package/dist/session/internal/_V2CameraShim.d.ts +0 -1
  10. package/dist/session/internal/_V2CameraShim.d.ts.map +1 -1
  11. package/dist/session/internal/_V2EventManagerShim.d.ts +0 -1
  12. package/dist/session/internal/_V2EventManagerShim.d.ts.map +1 -1
  13. package/dist/session/internal/_V2SessionShim.d.ts +0 -4
  14. package/dist/session/internal/_V2SessionShim.d.ts.map +1 -1
  15. package/dist/session/managers/CameraManager.d.ts +0 -1
  16. package/dist/session/managers/CameraManager.d.ts.map +1 -1
  17. package/dist/session/managers/DeviceManager.d.ts +1 -17
  18. package/dist/session/managers/DeviceManager.d.ts.map +1 -1
  19. package/dist/session/managers/LedManager.d.ts +19 -4
  20. package/dist/session/managers/LedManager.d.ts.map +1 -1
  21. package/dist/session/managers/LocationManager.d.ts +41 -10
  22. package/dist/session/managers/LocationManager.d.ts.map +1 -1
  23. package/dist/session/managers/PermissionsManager.d.ts +43 -0
  24. package/dist/session/managers/PermissionsManager.d.ts.map +1 -1
  25. package/dist/session/managers/PhoneManager.d.ts +1 -57
  26. package/dist/session/managers/PhoneManager.d.ts.map +1 -1
  27. package/dist/session/managers/SpeakerManager.d.ts.map +1 -1
  28. package/dist/session.js +145 -87
  29. package/dist/session.js.map +10 -10
  30. package/node_modules/@mentra/types/src/applet.ts +55 -0
  31. package/node_modules/@mentra/types/src/capabilities/even-realities-g1.ts +63 -0
  32. package/node_modules/@mentra/types/src/capabilities/even-realities-g2.ts +70 -0
  33. package/node_modules/@mentra/types/src/capabilities/mentra-display.ts +63 -0
  34. package/node_modules/@mentra/types/src/capabilities/mentra-live.ts +103 -0
  35. package/node_modules/@mentra/types/src/capabilities/none.ts +76 -0
  36. package/node_modules/@mentra/types/src/capabilities/simulated-glasses.ts +76 -0
  37. package/node_modules/@mentra/types/src/capabilities/vuzix-z100.ts +60 -0
  38. package/node_modules/@mentra/types/src/cli.ts +169 -0
  39. package/node_modules/@mentra/types/src/device.ts +43 -0
  40. package/node_modules/@mentra/types/src/enums.ts +43 -0
  41. package/node_modules/@mentra/types/src/hardware.ts +179 -0
  42. package/node_modules/@mentra/types/src/index.ts +64 -0
  43. package/node_modules/@mentra/types/tsconfig.json +22 -0
  44. package/node_modules/@mentra/types/tsconfig.tsbuildinfo +1 -0
  45. package/package.json +1 -1
package/dist/session.js CHANGED
@@ -164,7 +164,7 @@ function tryCreateBetterStackTransport() {
164
164
  }
165
165
  function createLogger(config) {
166
166
  const { pinoLevel, verbose } = resolveConfig(config);
167
- const NODE_ENV = "development";
167
+ const NODE_ENV = "isaiah";
168
168
  const PORTER_APP_NAME = process.env.PORTER_APP_NAME || "cloud-local";
169
169
  const streams = [];
170
170
  if (pinoLevel !== "silent") {
@@ -1144,21 +1144,6 @@ class CameraManager {
1144
1144
  }
1145
1145
  });
1146
1146
  }
1147
- onPhotoTaken(handler) {
1148
- const streamKey = "photo_taken" /* PHOTO_TAKEN */;
1149
- this.deps.addSubscription(streamKey);
1150
- const routerCleanup = this.deps.router.on(streamKey, (_streamType, data) => {
1151
- try {
1152
- handler(normalisePhotoData(data));
1153
- } catch (err) {
1154
- this.deps.logger.error("[CameraManager] Error in onPhotoTaken handler:", err);
1155
- }
1156
- });
1157
- return () => {
1158
- routerCleanup();
1159
- this.deps.removeSubscription(streamKey);
1160
- };
1161
- }
1162
1147
  async startStream(options) {
1163
1148
  const opts = options ?? {};
1164
1149
  if (opts.direct) {
@@ -1265,7 +1250,13 @@ class CameraManager {
1265
1250
  });
1266
1251
  }
1267
1252
  async startDirectStream(options) {
1268
- return this._startDirectStream({ direct: options.rtmpUrl, video: options.video, audio: options.audio, stream: options.stream, sound: options.sound });
1253
+ return this._startDirectStream({
1254
+ direct: options.rtmpUrl,
1255
+ video: options.video,
1256
+ audio: options.audio,
1257
+ stream: options.stream,
1258
+ sound: options.sound
1259
+ });
1269
1260
  }
1270
1261
  async startManagedStream(options = {}) {
1271
1262
  return this._startManagedStream({
@@ -1458,15 +1449,6 @@ class CameraManager {
1458
1449
  this.isManagedStreaming = false;
1459
1450
  }
1460
1451
  }
1461
- function normalisePhotoData(raw) {
1462
- return {
1463
- url: raw.photoUrl ?? raw.url ?? "",
1464
- width: raw.width ?? 0,
1465
- height: raw.height ?? 0,
1466
- timestamp: raw.timestamp ? new Date(raw.timestamp).getTime() : Date.now(),
1467
- savedToGallery: raw.savedToGallery ?? false
1468
- };
1469
- }
1470
1452
 
1471
1453
  // src/session/managers/DashboardManager.ts
1472
1454
  init_message_types();
@@ -1645,6 +1627,20 @@ class DeviceManager {
1645
1627
  });
1646
1628
  }
1647
1629
  onTouchEvent(gestureOrHandler, handler) {
1630
+ if (Array.isArray(gestureOrHandler)) {
1631
+ const gestures = gestureOrHandler;
1632
+ const cleanups = [];
1633
+ for (const gesture2 of gestures) {
1634
+ const gestureStream2 = `${"touch_event" /* TOUCH_EVENT */}:${gesture2}`;
1635
+ cleanups.push(this.addStreamHandler(gestureStream2, (_st, data) => {
1636
+ handler(normaliseTouchEvent(data));
1637
+ }));
1638
+ }
1639
+ return () => {
1640
+ for (const fn of cleanups)
1641
+ fn();
1642
+ };
1643
+ }
1648
1644
  if (typeof gestureOrHandler === "function") {
1649
1645
  return this.addStreamHandler("touch_event" /* TOUCH_EVENT */, (_st, data) => {
1650
1646
  gestureOrHandler(normaliseTouchEvent(data));
@@ -1656,19 +1652,6 @@ class DeviceManager {
1656
1652
  handler(normaliseTouchEvent(data));
1657
1653
  });
1658
1654
  }
1659
- subscribeToGestures(gestures) {
1660
- const cleanupFns = [];
1661
- for (const gesture of gestures) {
1662
- const gestureStream = `${"touch_event" /* TOUCH_EVENT */}:${gesture}`;
1663
- const cleanup = this.addStreamHandler(gestureStream, () => {});
1664
- cleanupFns.push(cleanup);
1665
- }
1666
- return () => {
1667
- for (const fn of cleanupFns) {
1668
- fn();
1669
- }
1670
- };
1671
- }
1672
1655
  onBatteryUpdate(handler) {
1673
1656
  return this.addStreamHandler("glasses_battery_update" /* GLASSES_BATTERY_UPDATE */, (_st, data) => {
1674
1657
  if (data.level !== undefined) {
@@ -1711,7 +1694,6 @@ class DeviceManager {
1711
1694
  this.deps.logger.debug("DeviceManager: Received empty device_state_update");
1712
1695
  return;
1713
1696
  }
1714
- this.deps.logger.debug("DeviceManager: Processing device state update");
1715
1697
  if (state.connected !== undefined)
1716
1698
  this._connected.setValue(state.connected);
1717
1699
  if (state.modelName !== undefined)
@@ -1749,7 +1731,8 @@ class DeviceManager {
1749
1731
  }
1750
1732
  setCapabilities(caps) {
1751
1733
  this.capabilities = caps;
1752
- this.deps.logger.info(`DeviceManager: Capabilities ${caps ? "updated" : "cleared"}`);
1734
+ const model = this._modelName.value;
1735
+ this.deps.logger.info({ model: model ?? undefined, hasCamera: !!caps?.camera, hasMicrophone: !!caps?.microphone }, `Glasses capabilities ${caps ? "received" : "cleared"}${model ? ` (${model})` : ""}`);
1753
1736
  for (const listener of this.capabilitiesListeners) {
1754
1737
  try {
1755
1738
  listener(caps);
@@ -1913,8 +1896,20 @@ class LedManager {
1913
1896
  constructor(deps) {
1914
1897
  this.deps = deps;
1915
1898
  }
1916
- setColor(color, onTimeMs) {
1899
+ setColor(color, durationOrOptions) {
1917
1900
  const requestId = generateRequestId2();
1901
+ let ontime;
1902
+ let offtime;
1903
+ let count;
1904
+ if (typeof durationOrOptions === "object" && durationOrOptions !== null) {
1905
+ ontime = durationOrOptions.onTime;
1906
+ offtime = durationOrOptions.offTime;
1907
+ count = durationOrOptions.count;
1908
+ } else {
1909
+ ontime = durationOrOptions ?? 1000;
1910
+ offtime = 0;
1911
+ count = 1;
1912
+ }
1918
1913
  const message = {
1919
1914
  type: "rgb_led_control" /* RGB_LED_CONTROL */,
1920
1915
  packageName: this.deps.getPackageName(),
@@ -1923,12 +1918,12 @@ class LedManager {
1923
1918
  timestamp: new Date,
1924
1919
  action: "on",
1925
1920
  color,
1926
- ontime: onTimeMs ?? 1000,
1927
- offtime: 0,
1928
- count: 1
1921
+ ontime,
1922
+ offtime,
1923
+ count
1929
1924
  };
1930
1925
  this.deps.sendMessage(message);
1931
- this.deps.logger.debug({ requestId, color, ontime: message.ontime }, "\uD83D\uDCA1 LED setColor request sent");
1926
+ this.deps.logger.debug({ requestId, color, ontime, offtime, count }, "\uD83D\uDCA1 LED setColor request sent");
1932
1927
  }
1933
1928
  off() {
1934
1929
  const requestId = generateRequestId2();
@@ -1952,6 +1947,7 @@ class LedManager {
1952
1947
  init_types();
1953
1948
  var LOCATION_STREAM = "location_stream" /* LOCATION_STREAM */;
1954
1949
  var LOCATION_UPDATE = "location_update" /* LOCATION_UPDATE */;
1950
+ var POLL_TIMEOUT_MS = 15000;
1955
1951
  function generateCorrelationId() {
1956
1952
  if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
1957
1953
  return `poll_${crypto.randomUUID()}`;
@@ -1977,19 +1973,27 @@ class LocationManager {
1977
1973
  _accuracy = null;
1978
1974
  _timestamp = null;
1979
1975
  _hasPermission = true;
1976
+ _config = {};
1977
+ pendingPolls = new Map;
1980
1978
  locationUpdateCleanup = null;
1981
1979
  constructor(deps) {
1982
1980
  this.deps = deps;
1983
1981
  this.locationUpdateCleanup = this.deps.router.on(LOCATION_UPDATE, (_streamType, data, _message) => {
1984
1982
  this.cacheLocation(data);
1983
+ this.resolvePendingPoll(data);
1985
1984
  });
1986
1985
  }
1987
- onUpdate(handler, accuracy) {
1986
+ configure(config) {
1987
+ this._config = { ...this._config, ...config };
1988
+ }
1989
+ onUpdate(handler) {
1988
1990
  const streamKey = LOCATION_STREAM;
1991
+ const accuracy = this._config.accuracy ?? "standard";
1989
1992
  const routerCleanup = this.deps.router.on(streamKey, (_streamType, data, _message) => {
1990
1993
  try {
1991
1994
  const location = normalise(data);
1992
1995
  this.cacheLocation(data);
1996
+ this.resolvePendingPoll(data);
1993
1997
  handler(location);
1994
1998
  } catch (err) {
1995
1999
  this.deps.logger.error("[LocationManager] Error in onUpdate handler:", err);
@@ -1999,6 +2003,7 @@ class LocationManager {
1999
2003
  try {
2000
2004
  const location = normalise(data);
2001
2005
  this.cacheLocation(data);
2006
+ this.resolvePendingPoll(data);
2002
2007
  handler(location);
2003
2008
  } catch (err) {
2004
2009
  this.deps.logger.error("[LocationManager] Error in onUpdate handler (location_update):", err);
@@ -2009,7 +2014,7 @@ class LocationManager {
2009
2014
  this.streamRefCount++;
2010
2015
  if (this.streamRefCount === 1) {
2011
2016
  this.deps.addSubscription(streamKey);
2012
- this.deps.logger.debug({ accuracy: accuracy ?? "standard" }, `[LocationManager] Subscribed to "${streamKey}".`);
2017
+ this.deps.logger.debug({ accuracy }, `[LocationManager] Subscribed to "${streamKey}".`);
2013
2018
  }
2014
2019
  return () => {
2015
2020
  if (!this.registrations.has(reg))
@@ -2025,17 +2030,31 @@ class LocationManager {
2025
2030
  }
2026
2031
  };
2027
2032
  }
2028
- requestUpdate(accuracy) {
2033
+ requestUpdate() {
2029
2034
  const correlationId = generateCorrelationId();
2030
- const message = {
2031
- type: "location_poll_request" /* LOCATION_POLL_REQUEST */,
2032
- correlationId,
2033
- packageName: this.deps.getPackageName(),
2034
- sessionId: this.deps.getSessionId(),
2035
- accuracy: accuracy ?? "standard"
2036
- };
2037
- this.deps.sendMessage(message);
2038
- this.deps.logger.debug({ correlationId, accuracy: message.accuracy }, "\uD83D\uDCCD Location poll request sent");
2035
+ const accuracy = this._config.accuracy ?? "standard";
2036
+ return new Promise((resolve, reject) => {
2037
+ const timeoutId = setTimeout(() => {
2038
+ this.pendingPolls.delete(correlationId);
2039
+ reject(new Error(`Location poll timed out after ${POLL_TIMEOUT_MS}ms (correlationId: ${correlationId})`));
2040
+ }, POLL_TIMEOUT_MS);
2041
+ this.pendingPolls.set(correlationId, { resolve, reject, timeoutId });
2042
+ const message = {
2043
+ type: "location_poll_request" /* LOCATION_POLL_REQUEST */,
2044
+ correlationId,
2045
+ packageName: this.deps.getPackageName(),
2046
+ sessionId: this.deps.getSessionId(),
2047
+ accuracy
2048
+ };
2049
+ try {
2050
+ this.deps.sendMessage(message);
2051
+ this.deps.logger.debug({ correlationId, accuracy }, "\uD83D\uDCCD Location poll request sent");
2052
+ } catch (err) {
2053
+ clearTimeout(timeoutId);
2054
+ this.pendingPolls.delete(correlationId);
2055
+ reject(err instanceof Error ? err : new Error(String(err)));
2056
+ }
2057
+ });
2039
2058
  }
2040
2059
  stop() {
2041
2060
  const snapshot = Array.from(this.registrations);
@@ -2048,6 +2067,11 @@ class LocationManager {
2048
2067
  this.deps.removeSubscription(LOCATION_STREAM);
2049
2068
  }
2050
2069
  this.streamRefCount = 0;
2070
+ for (const [id, pending] of this.pendingPolls) {
2071
+ clearTimeout(pending.timeoutId);
2072
+ pending.reject(new Error("LocationManager stopped while poll was pending"));
2073
+ this.pendingPolls.delete(id);
2074
+ }
2051
2075
  this.deps.logger.debug("[LocationManager] All subscriptions stopped.");
2052
2076
  }
2053
2077
  get lat() {
@@ -2065,6 +2089,17 @@ class LocationManager {
2065
2089
  get hasPermission() {
2066
2090
  return this._hasPermission;
2067
2091
  }
2092
+ resolvePendingPoll(raw) {
2093
+ const correlationId = raw?.correlationId;
2094
+ if (!correlationId)
2095
+ return;
2096
+ const pending = this.pendingPolls.get(correlationId);
2097
+ if (!pending)
2098
+ return;
2099
+ clearTimeout(pending.timeoutId);
2100
+ this.pendingPolls.delete(correlationId);
2101
+ pending.resolve(normalise(raw));
2102
+ }
2068
2103
  cacheLocation(raw) {
2069
2104
  if (typeof raw.lat === "number") {
2070
2105
  this._lat = raw.lat;
@@ -2090,6 +2125,7 @@ class LocationManager {
2090
2125
  this._lng = null;
2091
2126
  this._accuracy = null;
2092
2127
  this._timestamp = null;
2128
+ this._config = {};
2093
2129
  this.deps.logger.debug("[LocationManager] Destroyed.");
2094
2130
  }
2095
2131
  }
@@ -2239,8 +2275,10 @@ class PermissionsManager {
2239
2275
  permissions;
2240
2276
  listeners = new Set;
2241
2277
  logger;
2278
+ messageHandlers;
2242
2279
  constructor(deps) {
2243
2280
  this.logger = deps.logger;
2281
+ this.messageHandlers = deps.messageHandlers;
2244
2282
  this.permissions = createDefaultPermissions();
2245
2283
  }
2246
2284
  has(permission) {
@@ -2255,6 +2293,26 @@ class PermissionsManager {
2255
2293
  this.listeners.delete(handler);
2256
2294
  };
2257
2295
  }
2296
+ onPermissionError(handler) {
2297
+ const cleanup = this.messageHandlers.register("permission_error", (msg) => {
2298
+ try {
2299
+ handler({ message: msg.message ?? "Permission error", deniedPermissions: msg.deniedPermissions });
2300
+ } catch (err) {
2301
+ this.logger.error("[PermissionsManager] Error in onPermissionError handler:", err);
2302
+ }
2303
+ });
2304
+ return cleanup;
2305
+ }
2306
+ onPermissionDenied(handler) {
2307
+ const cleanup = this.messageHandlers.register("permission_denied", (msg) => {
2308
+ try {
2309
+ handler({ message: msg.message ?? "Permission denied", permission: msg.permission, streamType: msg.streamType });
2310
+ } catch (err) {
2311
+ this.logger.error("[PermissionsManager] Error in onPermissionDenied handler:", err);
2312
+ }
2313
+ });
2314
+ return cleanup;
2315
+ }
2258
2316
  updateFromSettings(settings) {
2259
2317
  if (!settings) {
2260
2318
  this.logger.debug("PermissionsManager: No settings provided, skipping update");
@@ -2425,7 +2483,6 @@ class PhoneManager {
2425
2483
  deps;
2426
2484
  permissions;
2427
2485
  tracker;
2428
- _battery = null;
2429
2486
  constructor(deps) {
2430
2487
  this.deps = deps;
2431
2488
  this.permissions = deps.permissions;
@@ -2433,29 +2490,8 @@ class PhoneManager {
2433
2490
  this.notifications = new NotificationSubManager(this.permissions, this.tracker, deps.logger);
2434
2491
  this.calendar = new CalendarSubManager(this.permissions, this.tracker, deps.logger);
2435
2492
  }
2436
- get battery() {
2437
- return this._battery;
2438
- }
2439
- onBatteryUpdate(handler) {
2440
- return this.tracker.add("phone_battery_update" /* PHONE_BATTERY_UPDATE */, (_streamType, data) => {
2441
- const level = data.level ?? data.batteryLevel ?? data.battery_level;
2442
- if (level !== undefined) {
2443
- this._battery = level;
2444
- }
2445
- try {
2446
- handler({
2447
- level: level ?? 0,
2448
- charging: data.charging ?? false,
2449
- timeRemaining: data.timeRemaining ?? data.time_remaining
2450
- });
2451
- } catch (err) {
2452
- this.deps.logger.error(`PhoneManager: Error in battery handler: ${err instanceof Error ? err.message : String(err)}`);
2453
- }
2454
- });
2455
- }
2456
2493
  destroy() {
2457
2494
  this.tracker.destroyAll();
2458
- this._battery = null;
2459
2495
  this.deps.logger.debug("PhoneManager: Destroyed.");
2460
2496
  }
2461
2497
  }
@@ -2465,6 +2501,20 @@ init_message_types();
2465
2501
  var STREAM_ID_LENGTH = 36;
2466
2502
  var STREAM_READY_TIMEOUT_MS = 1e4;
2467
2503
  var PLAY_RESPONSE_TIMEOUT_MS = 60000;
2504
+ function createMp3Encoder(channels, sampleRate, bitrate) {
2505
+ globalThis.MPEGMode ??= __require("lamejs/src/js/MPEGMode.js");
2506
+ globalThis.Lame ??= __require("lamejs/src/js/Lame.js");
2507
+ globalThis.BitStream ??= __require("lamejs/src/js/BitStream.js");
2508
+ const lamejs = __require("lamejs");
2509
+ const Encoder = lamejs.Mp3Encoder ?? lamejs.default?.Mp3Encoder;
2510
+ return new Encoder(channels, sampleRate, bitrate);
2511
+ }
2512
+ function toInt16Array(data) {
2513
+ if (data instanceof Int16Array)
2514
+ return data;
2515
+ const buffer = data instanceof ArrayBuffer ? data : data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
2516
+ return new Int16Array(buffer);
2517
+ }
2468
2518
 
2469
2519
  class AudioOutputStreamImpl {
2470
2520
  id;
@@ -2474,6 +2524,7 @@ class AudioOutputStreamImpl {
2474
2524
  options;
2475
2525
  stateChangeHandlers = [];
2476
2526
  streamUrl = null;
2527
+ encoder = null;
2477
2528
  constructor(streamId, deps, opts = {}) {
2478
2529
  this.id = streamId;
2479
2530
  this.deps = deps;
@@ -2495,6 +2546,9 @@ class AudioOutputStreamImpl {
2495
2546
  if (this._state !== "created") {
2496
2547
  throw new Error(`Cannot open stream in state "${this._state}"`);
2497
2548
  }
2549
+ if (this.options.format === "pcm16") {
2550
+ this.encoder = createMp3Encoder(this.options.channels, this.options.sampleRate, this.options.bitrate);
2551
+ }
2498
2552
  const startMessage = {
2499
2553
  type: "audio_stream_start" /* AUDIO_STREAM_START */,
2500
2554
  packageName: this.deps.getPackageName(),
@@ -2527,7 +2581,15 @@ class AudioOutputStreamImpl {
2527
2581
  }
2528
2582
  if (chunk.length === 0)
2529
2583
  return;
2530
- this.sendBinaryFrame(chunk);
2584
+ if (this.options.format === "pcm16" && this.encoder) {
2585
+ const pcm = toInt16Array(chunk);
2586
+ const encoded = this.encoder.encodeBuffer(pcm);
2587
+ if (encoded.length === 0)
2588
+ return;
2589
+ this.sendBinaryFrame(new Uint8Array(encoded));
2590
+ } else {
2591
+ this.sendBinaryFrame(chunk);
2592
+ }
2531
2593
  }
2532
2594
  async end() {
2533
2595
  if (this._state !== "streaming")
@@ -3794,7 +3856,7 @@ class MentraSession {
3794
3856
  this.logger.error(error, "MentraSession transport error");
3795
3857
  }
3796
3858
  });
3797
- this.permissions = new PermissionsManager({ logger: sdkLogger });
3859
+ this.permissions = new PermissionsManager({ logger: sdkLogger, messageHandlers: this._router.messageHandlers });
3798
3860
  const deps = {
3799
3861
  router: this._router.dataStreamRouter,
3800
3862
  messageHandlers: this._router.messageHandlers,
@@ -3913,10 +3975,6 @@ class MentraSession {
3913
3975
  }));
3914
3976
  this.cleanupTasks.push(this._router.messageHandlers.register("capabilities_update" /* CAPABILITIES_UPDATE */, (message) => {
3915
3977
  this.capabilities = message.capabilities ?? null;
3916
- this.device.handleCapabilitiesUpdate(message);
3917
- }));
3918
- this.cleanupTasks.push(this._router.messageHandlers.register("device_state_update" /* DEVICE_STATE_UPDATE */, (message) => {
3919
- this.device.handleDeviceStateUpdate(message);
3920
3978
  }));
3921
3979
  this.cleanupTasks.push(this._router.messageHandlers.register("app_stopped" /* APP_STOPPED */, (message) => {
3922
3980
  const reason = message.reason ?? "unknown";
@@ -4107,4 +4165,4 @@ export {
4107
4165
  DataStreamRouter
4108
4166
  };
4109
4167
 
4110
- //# debugId=8AE847F1727E65C164756E2164756E21
4168
+ //# debugId=CD897D9F35B061EF64756E2164756E21