@mentra/bluetooth-sdk 3.2.0-dev.255 → 3.2.0-dev.259

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.
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Normalizes stream start request parameters for the native module bridge.
3
+ * Preserves omission of telemetry when undefined so the glasses use their build default,
4
+ * and forwards explicit true / false.
5
+ */
6
+ export function streamRequestParamsForNative(params) {
7
+ const payload = {
8
+ streamUrl: params.streamUrl,
9
+ };
10
+ if (params.type !== undefined) {
11
+ payload.type = params.type;
12
+ }
13
+ if (params.streamId !== undefined) {
14
+ payload.streamId = params.streamId;
15
+ }
16
+ if (params.sound !== undefined) {
17
+ payload.sound = params.sound;
18
+ }
19
+ if (params.video !== undefined) {
20
+ payload.video = params.video;
21
+ }
22
+ if (params.audio !== undefined) {
23
+ payload.audio = params.audio;
24
+ }
25
+ if (params.ice !== undefined) {
26
+ payload.ice = params.ice;
27
+ }
28
+ if (params.captureAudio !== undefined) {
29
+ payload.captureAudio = params.captureAudio;
30
+ }
31
+ if (params.traceId !== undefined && params.traceId.length > 0) {
32
+ payload.traceId = params.traceId;
33
+ }
34
+ if (params.authToken !== undefined && params.authToken.length > 0) {
35
+ payload.authToken = params.authToken;
36
+ }
37
+ if (params.telemetry !== undefined) {
38
+ payload.telemetry = params.telemetry;
39
+ }
40
+ return payload;
41
+ }
42
+ //# sourceMappingURL=streamRequestPayload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamRequestPayload.js","sourceRoot":"","sources":["../../src/_private/streamRequestPayload.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAAC,MAA0B;IACrE,MAAM,OAAO,GAA4B;QACvC,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAA;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IAC5B,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;IACpC,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;IAC9B,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;IAC9B,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;IAC9B,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA;IAC1B,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAA;IAC5C,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;IAClC,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAA;IACtC,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAA;IACtC,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC","sourcesContent":["import type {StreamStartRequest} from \"../BluetoothSdk.types\"\n\n/**\n * Normalizes stream start request parameters for the native module bridge.\n * Preserves omission of telemetry when undefined so the glasses use their build default,\n * and forwards explicit true / false.\n */\nexport function streamRequestParamsForNative(params: StreamStartRequest): Record<string, unknown> {\n const payload: Record<string, unknown> = {\n streamUrl: params.streamUrl,\n }\n if (params.type !== undefined) {\n payload.type = params.type\n }\n if (params.streamId !== undefined) {\n payload.streamId = params.streamId\n }\n if (params.sound !== undefined) {\n payload.sound = params.sound\n }\n if (params.video !== undefined) {\n payload.video = params.video\n }\n if (params.audio !== undefined) {\n payload.audio = params.audio\n }\n if (params.ice !== undefined) {\n payload.ice = params.ice\n }\n if (params.captureAudio !== undefined) {\n payload.captureAudio = params.captureAudio\n }\n if (params.traceId !== undefined && params.traceId.length > 0) {\n payload.traceId = params.traceId\n }\n if (params.authToken !== undefined && params.authToken.length > 0) {\n payload.authToken = params.authToken\n }\n if (params.telemetry !== undefined) {\n payload.telemetry = params.telemetry\n }\n return payload\n}\n"]}
@@ -1,10 +1,10 @@
1
1
  export const BLUETOOTH_SDK_RELEASE_METADATA = Object.freeze({
2
2
  "schemaVersion": 1,
3
3
  "familyBaseVersion": "3.2.0",
4
- "releaseIdentity": "3.2.0-dev.255",
5
- "releaseSetId": "mentra-3.2.0-dev.255",
6
- "sourceCommit": "95dfa6c4b2f341917b687798ff7b0065365d3115",
7
- "otaManifestUrl": "https://github.com/Mentra-Community/MentraOS/releases/download/mentra-builds-v3.2.0/mentra-live-ota-3.2.0-dev.255.json",
8
- "otaManifestSha256": "9816cf655e30e4306c324469ed5ed3eee73d9b76345bc8c6b24e48edf5215837"
4
+ "releaseIdentity": "3.2.0-dev.259",
5
+ "releaseSetId": "mentra-3.2.0-dev.259",
6
+ "sourceCommit": "a813257666fd73103cf743ec50a4a158ed021d41",
7
+ "otaManifestUrl": "https://github.com/Mentra-Community/MentraOS/releases/download/mentra-builds-v3.2.0/mentra-live-ota-3.2.0-dev.259.json",
8
+ "otaManifestSha256": "b72673f29592ac9357d40b639d093bd50914c8f6f0f4bb02cf0f4fe03fbf0f38"
9
9
  });
10
10
  //# sourceMappingURL=releaseMetadata.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"releaseMetadata.js","sourceRoot":"","sources":["../../src/generated/releaseMetadata.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,8BAA8B,GAA0C,MAAM,CAAC,MAAM,CAAC;IACjG,eAAe,EAAE,CAAC;IAClB,mBAAmB,EAAE,OAAO;IAC5B,iBAAiB,EAAE,eAAe;IAClC,cAAc,EAAE,sBAAsB;IACtC,cAAc,EAAE,0CAA0C;IAC1D,gBAAgB,EAAE,wHAAwH;IAC1I,mBAAmB,EAAE,kEAAkE;CACxF,CAAC,CAAA","sourcesContent":["/** Generated by release CI. Do not edit in a release checkout. */\nexport interface BluetoothSdkReleaseMetadata {\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 BLUETOOTH_SDK_RELEASE_METADATA: Readonly<BluetoothSdkReleaseMetadata> = Object.freeze({\n \"schemaVersion\": 1,\n \"familyBaseVersion\": \"3.2.0\",\n \"releaseIdentity\": \"3.2.0-dev.255\",\n \"releaseSetId\": \"mentra-3.2.0-dev.255\",\n \"sourceCommit\": \"95dfa6c4b2f341917b687798ff7b0065365d3115\",\n \"otaManifestUrl\": \"https://github.com/Mentra-Community/MentraOS/releases/download/mentra-builds-v3.2.0/mentra-live-ota-3.2.0-dev.255.json\",\n \"otaManifestSha256\": \"9816cf655e30e4306c324469ed5ed3eee73d9b76345bc8c6b24e48edf5215837\"\n})\n"]}
1
+ {"version":3,"file":"releaseMetadata.js","sourceRoot":"","sources":["../../src/generated/releaseMetadata.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,8BAA8B,GAA0C,MAAM,CAAC,MAAM,CAAC;IACjG,eAAe,EAAE,CAAC;IAClB,mBAAmB,EAAE,OAAO;IAC5B,iBAAiB,EAAE,eAAe;IAClC,cAAc,EAAE,sBAAsB;IACtC,cAAc,EAAE,0CAA0C;IAC1D,gBAAgB,EAAE,wHAAwH;IAC1I,mBAAmB,EAAE,kEAAkE;CACxF,CAAC,CAAA","sourcesContent":["/** Generated by release CI. Do not edit in a release checkout. */\nexport interface BluetoothSdkReleaseMetadata {\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 BLUETOOTH_SDK_RELEASE_METADATA: Readonly<BluetoothSdkReleaseMetadata> = Object.freeze({\n \"schemaVersion\": 1,\n \"familyBaseVersion\": \"3.2.0\",\n \"releaseIdentity\": \"3.2.0-dev.259\",\n \"releaseSetId\": \"mentra-3.2.0-dev.259\",\n \"sourceCommit\": \"a813257666fd73103cf743ec50a4a158ed021d41\",\n \"otaManifestUrl\": \"https://github.com/Mentra-Community/MentraOS/releases/download/mentra-builds-v3.2.0/mentra-live-ota-3.2.0-dev.259.json\",\n \"otaManifestSha256\": \"b72673f29592ac9357d40b639d093bd50914c8f6f0f4bb02cf0f4fe03fbf0f38\"\n})\n"]}
@@ -11,7 +11,7 @@ enum BluetoothSdkDefaults {
11
11
  static let voiceActivityDetectionEnabled = false
12
12
  static let loudnessGateEnabled = false
13
13
  private static let infoSdkVersionKey = "MentraBluetoothSdkVersion"
14
- private static let swiftPackageSdkVersion = "3.2.0-dev.255"
14
+ private static let swiftPackageSdkVersion = "3.2.0-dev.259"
15
15
  private static let swiftPackageSdkVersionPlaceholder = "__MENTRA" + "_BLUETOOTH_SDK_VERSION__"
16
16
 
17
17
  private static func normalizedSdkVersion(_ value: String?) -> String? {
@@ -3,9 +3,9 @@ import Foundation
3
3
  /// Generated by release CI. Do not edit in a release checkout.
4
4
  enum GeneratedReleaseMetadata {
5
5
  static let familyBaseVersion = "3.2.0"
6
- static let releaseIdentity = "3.2.0-dev.255"
7
- static let releaseSetId = "mentra-3.2.0-dev.255"
8
- static let sourceCommit = "95dfa6c4b2f341917b687798ff7b0065365d3115"
9
- static let otaManifestUrl = "https://github.com/Mentra-Community/MentraOS/releases/download/mentra-builds-v3.2.0/mentra-live-ota-3.2.0-dev.255.json"
10
- static let otaManifestSha256 = "9816cf655e30e4306c324469ed5ed3eee73d9b76345bc8c6b24e48edf5215837"
6
+ static let releaseIdentity = "3.2.0-dev.259"
7
+ static let releaseSetId = "mentra-3.2.0-dev.259"
8
+ static let sourceCommit = "a813257666fd73103cf743ec50a4a158ed021d41"
9
+ static let otaManifestUrl = "https://github.com/Mentra-Community/MentraOS/releases/download/mentra-builds-v3.2.0/mentra-live-ota-3.2.0-dev.259.json"
10
+ static let otaManifestSha256 = "b72673f29592ac9357d40b639d093bd50914c8f6f0f4bb02cf0f4fe03fbf0f38"
11
11
  }
@@ -330,6 +330,7 @@ public struct StreamRequest {
330
330
  /// Correlation id the glasses echo in every SOFTAP_TRACE line, so phone and glasses logs can
331
331
  /// be joined despite unsynchronised clocks.
332
332
  public let traceId: String?
333
+ public let telemetry: Bool?
333
334
 
334
335
  public init(
335
336
  streamUrl: String,
@@ -340,7 +341,8 @@ public struct StreamRequest {
340
341
  authToken: String? = nil,
341
342
  captureAudio: Bool = true,
342
343
  ice: StreamIceConfig? = nil,
343
- traceId: String? = nil
344
+ traceId: String? = nil,
345
+ telemetry: Bool? = nil
344
346
  ) {
345
347
  self.streamUrl = streamUrl
346
348
  self.streamId = streamId
@@ -351,9 +353,19 @@ public struct StreamRequest {
351
353
  self.captureAudio = captureAudio
352
354
  self.ice = ice
353
355
  self.traceId = traceId
356
+ self.telemetry = telemetry
354
357
  }
355
358
 
356
359
  init(values: [String: Any]) {
360
+ let telemetryValue: Bool?
361
+ if let telemetry = values["telemetry"] as? Bool {
362
+ telemetryValue = telemetry
363
+ } else if let tl = values["tl"] as? Bool {
364
+ telemetryValue = tl
365
+ } else {
366
+ telemetryValue = nil
367
+ }
368
+
357
369
  self.init(
358
370
  streamUrl: values["streamUrl"] as? String
359
371
  ?? values["rtmpUrl"] as? String
@@ -369,7 +381,8 @@ public struct StreamRequest {
369
381
  ice: StreamIceConfig(
370
382
  values: (values["ice"] as? [String: Any]) ?? (values["i"] as? [String: Any])
371
383
  ),
372
- traceId: values["traceId"] as? String
384
+ traceId: values["traceId"] as? String,
385
+ telemetry: telemetryValue
373
386
  )
374
387
  }
375
388
 
@@ -397,6 +410,9 @@ public struct StreamRequest {
397
410
  if let traceId, !traceId.isEmpty {
398
411
  values["traceId"] = traceId
399
412
  }
413
+ if let telemetry {
414
+ values["telemetry"] = telemetry
415
+ }
400
416
  return values
401
417
  }
402
418
  }
@@ -0,0 +1,113 @@
1
+ @testable import MentraBluetoothSDK
2
+ import XCTest
3
+
4
+ final class StreamRequestTests: XCTestCase {
5
+
6
+ func testOmissionPreservesBuildDefaultInValues() {
7
+ let request = StreamRequest(
8
+ streamUrl: "https://example.com/whip",
9
+ streamId: "s-1"
10
+ )
11
+
12
+ XCTAssertNil(request.telemetry)
13
+ XCTAssertNil(request.values["telemetry"])
14
+ XCTAssertNil(request.values["tl"])
15
+ }
16
+
17
+ func testInitFromValuesPreservesOmissionWhenKeyAbsent() {
18
+ let request = StreamRequest(values: [
19
+ "streamUrl": "https://example.com/whip",
20
+ "streamId": "s-1"
21
+ ])
22
+
23
+ XCTAssertNil(request.telemetry)
24
+ XCTAssertNil(request.values["telemetry"])
25
+ }
26
+
27
+ func testForwardsExplicitTrueInValues() {
28
+ let request = StreamRequest(
29
+ streamUrl: "https://example.com/whip",
30
+ streamId: "s-1",
31
+ telemetry: true
32
+ )
33
+
34
+ XCTAssertEqual(request.telemetry, true)
35
+ XCTAssertEqual(request.values["telemetry"] as? Bool, true)
36
+ }
37
+
38
+ func testInitFromValuesForwardsExplicitTrue() {
39
+ let request = StreamRequest(values: [
40
+ "streamUrl": "https://example.com/whip",
41
+ "streamId": "s-1",
42
+ "telemetry": true
43
+ ])
44
+
45
+ XCTAssertEqual(request.telemetry, true)
46
+ XCTAssertEqual(request.values["telemetry"] as? Bool, true)
47
+ }
48
+
49
+ func testForwardsExplicitFalseInValues() {
50
+ let request = StreamRequest(
51
+ streamUrl: "https://example.com/whip",
52
+ streamId: "s-1",
53
+ telemetry: false
54
+ )
55
+
56
+ XCTAssertEqual(request.telemetry, false)
57
+ XCTAssertEqual(request.values["telemetry"] as? Bool, false)
58
+ }
59
+
60
+ func testInitFromValuesForwardsExplicitFalse() {
61
+ let request = StreamRequest(values: [
62
+ "streamUrl": "https://example.com/whip",
63
+ "streamId": "s-1",
64
+ "telemetry": false
65
+ ])
66
+
67
+ XCTAssertEqual(request.telemetry, false)
68
+ XCTAssertEqual(request.values["telemetry"] as? Bool, false)
69
+ }
70
+
71
+ func testInitFromValuesAcceptsCompactTlKeyWhenTelemetryAbsent() {
72
+ let request = StreamRequest(values: [
73
+ "streamUrl": "https://example.com/whip",
74
+ "tl": true
75
+ ])
76
+
77
+ XCTAssertEqual(request.telemetry, true)
78
+ XCTAssertEqual(request.values["telemetry"] as? Bool, true)
79
+ }
80
+
81
+ func testInitFromValuesGivesTelemetryPrecedenceOverCompactTl() {
82
+ let request = StreamRequest(values: [
83
+ "streamUrl": "https://example.com/whip",
84
+ "telemetry": false,
85
+ "tl": true
86
+ ])
87
+
88
+ XCTAssertEqual(request.telemetry, false)
89
+ XCTAssertEqual(request.values["telemetry"] as? Bool, false)
90
+ }
91
+
92
+ func testFullStreamRequestSerializesAllFields() {
93
+ let request = StreamRequest(
94
+ streamUrl: "https://example.com/whip",
95
+ streamId: "stream-123",
96
+ sound: false,
97
+ video: StreamVideoConfig(width: 1280, height: 720, bitrate: 2_000_000, fps: 15),
98
+ audio: StreamAudioConfig(bitrate: 64000, sampleRate: 48000, echoCancellation: true),
99
+ authToken: "bearer-token",
100
+ telemetry: true
101
+ )
102
+
103
+ let values = request.values
104
+ XCTAssertEqual(values["type"] as? String, "start_stream")
105
+ XCTAssertEqual(values["streamUrl"] as? String, "https://example.com/whip")
106
+ XCTAssertEqual(values["streamId"] as? String, "stream-123")
107
+ XCTAssertEqual(values["sound"] as? Bool, false)
108
+ XCTAssertEqual(values["authToken"] as? String, "bearer-token")
109
+ XCTAssertEqual(values["telemetry"] as? Bool, true)
110
+ XCTAssertNotNil(values["video"])
111
+ XCTAssertNotNil(values["audio"])
112
+ }
113
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mentra/bluetooth-sdk",
3
- "version": "3.2.0-dev.255",
3
+ "version": "3.2.0-dev.259",
4
4
  "description": "SDK for communicating with smart glasses",
5
5
  "main": "build/index.js",
6
6
  "react-native": "src/index.ts",
@@ -114,7 +114,7 @@
114
114
  "registry": "https://registry.npmjs.org/"
115
115
  },
116
116
  "dependencies": {
117
- "@mentra/cloud-protocol": "3.2.0-dev.255"
117
+ "@mentra/cloud-protocol": "3.2.0-dev.259"
118
118
  },
119
119
  "devDependencies": {
120
120
  "@types/node": "^25.9.3",
@@ -760,6 +760,8 @@ export type StreamStartRequest = {
760
760
  * TEMPORARY: part of the SoftAP diagnostic trace layer.
761
761
  */
762
762
  traceId?: string
763
+ authToken?: string
764
+ telemetry?: boolean
763
765
  }
764
766
 
765
767
  export type StreamKeepAliveRequest = {
@@ -61,6 +61,7 @@ import {
61
61
  } from "../BluetoothSdk.types"
62
62
  import {warmUpCameraParamsForNative} from "./cameraRequestPayload"
63
63
  import {photoRequestParamsForNative} from "./photoRequestPayload"
64
+ import {streamRequestParamsForNative} from "./streamRequestPayload"
64
65
 
65
66
  /**
66
67
  * Private React Native native-module facade.
@@ -669,5 +670,13 @@ NativeBluetoothSdkModule.warmUpCamera = function (params: WarmUpCameraParams) {
669
670
  return nativeWarmUpCamera(warmUpCameraParamsForNative(params) as unknown as WarmUpCameraParams)
670
671
  }
671
672
 
673
+ const nativeStartStream = bindNativeMethod<(params: StreamStartRequest) => Promise<StreamStatusEvent>>(
674
+ NativeBluetoothSdkModule as unknown as Record<string, unknown>,
675
+ "startStream",
676
+ )
677
+ NativeBluetoothSdkModule.startStream = function (params: StreamStartRequest) {
678
+ return nativeStartStream(streamRequestParamsForNative(params) as unknown as StreamStartRequest)
679
+ }
680
+
672
681
  export default NativeBluetoothSdkModule
673
682
  export const BluetoothSdk = NativeBluetoothSdkModule as BluetoothSdkInternalModule
@@ -0,0 +1,43 @@
1
+ import type {StreamStartRequest} from "../BluetoothSdk.types"
2
+
3
+ /**
4
+ * Normalizes stream start request parameters for the native module bridge.
5
+ * Preserves omission of telemetry when undefined so the glasses use their build default,
6
+ * and forwards explicit true / false.
7
+ */
8
+ export function streamRequestParamsForNative(params: StreamStartRequest): Record<string, unknown> {
9
+ const payload: Record<string, unknown> = {
10
+ streamUrl: params.streamUrl,
11
+ }
12
+ if (params.type !== undefined) {
13
+ payload.type = params.type
14
+ }
15
+ if (params.streamId !== undefined) {
16
+ payload.streamId = params.streamId
17
+ }
18
+ if (params.sound !== undefined) {
19
+ payload.sound = params.sound
20
+ }
21
+ if (params.video !== undefined) {
22
+ payload.video = params.video
23
+ }
24
+ if (params.audio !== undefined) {
25
+ payload.audio = params.audio
26
+ }
27
+ if (params.ice !== undefined) {
28
+ payload.ice = params.ice
29
+ }
30
+ if (params.captureAudio !== undefined) {
31
+ payload.captureAudio = params.captureAudio
32
+ }
33
+ if (params.traceId !== undefined && params.traceId.length > 0) {
34
+ payload.traceId = params.traceId
35
+ }
36
+ if (params.authToken !== undefined && params.authToken.length > 0) {
37
+ payload.authToken = params.authToken
38
+ }
39
+ if (params.telemetry !== undefined) {
40
+ payload.telemetry = params.telemetry
41
+ }
42
+ return payload
43
+ }
@@ -12,9 +12,9 @@ export interface BluetoothSdkReleaseMetadata {
12
12
  export const BLUETOOTH_SDK_RELEASE_METADATA: Readonly<BluetoothSdkReleaseMetadata> = Object.freeze({
13
13
  "schemaVersion": 1,
14
14
  "familyBaseVersion": "3.2.0",
15
- "releaseIdentity": "3.2.0-dev.255",
16
- "releaseSetId": "mentra-3.2.0-dev.255",
17
- "sourceCommit": "95dfa6c4b2f341917b687798ff7b0065365d3115",
18
- "otaManifestUrl": "https://github.com/Mentra-Community/MentraOS/releases/download/mentra-builds-v3.2.0/mentra-live-ota-3.2.0-dev.255.json",
19
- "otaManifestSha256": "9816cf655e30e4306c324469ed5ed3eee73d9b76345bc8c6b24e48edf5215837"
15
+ "releaseIdentity": "3.2.0-dev.259",
16
+ "releaseSetId": "mentra-3.2.0-dev.259",
17
+ "sourceCommit": "a813257666fd73103cf743ec50a4a158ed021d41",
18
+ "otaManifestUrl": "https://github.com/Mentra-Community/MentraOS/releases/download/mentra-builds-v3.2.0/mentra-live-ota-3.2.0-dev.259.json",
19
+ "otaManifestSha256": "b72673f29592ac9357d40b639d093bd50914c8f6f0f4bb02cf0f4fe03fbf0f38"
20
20
  })