@mentra/sdk 2.1.31-beta.6 → 3.0.0-alpha.3

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 (169) hide show
  1. package/README.md +54 -9
  2. package/dist/MiniAppServer.d.ts +58 -0
  3. package/dist/MiniAppServer.d.ts.map +1 -0
  4. package/dist/app/server/index.d.ts +143 -88
  5. package/dist/app/server/index.d.ts.map +1 -1
  6. package/dist/app/session/events.d.ts +20 -3
  7. package/dist/app/session/events.d.ts.map +1 -1
  8. package/dist/app/session/index.d.ts +56 -3
  9. package/dist/app/session/index.d.ts.map +1 -1
  10. package/dist/app/session/modules/audio-output-stream.d.ts +108 -0
  11. package/dist/app/session/modules/audio-output-stream.d.ts.map +1 -0
  12. package/dist/app/session/modules/audio.d.ts +36 -1
  13. package/dist/app/session/modules/audio.d.ts.map +1 -1
  14. package/dist/app/session/modules/camera-managed-extension.d.ts +37 -33
  15. package/dist/app/session/modules/camera-managed-extension.d.ts.map +1 -1
  16. package/dist/app/session/modules/camera.d.ts +108 -50
  17. package/dist/app/session/modules/camera.d.ts.map +1 -1
  18. package/dist/app/session/modules/index.d.ts +4 -3
  19. package/dist/app/session/modules/index.d.ts.map +1 -1
  20. package/dist/app/session/modules/led.d.ts.map +1 -1
  21. package/dist/app/session/modules/location.d.ts.map +1 -1
  22. package/dist/app/session/settings.d.ts +5 -1
  23. package/dist/app/session/settings.d.ts.map +1 -1
  24. package/dist/app/webview/index.d.ts +67 -9
  25. package/dist/app/webview/index.d.ts.map +1 -1
  26. package/dist/constants/log-messages/updates.d.ts +32 -9
  27. package/dist/constants/log-messages/updates.d.ts.map +1 -1
  28. package/dist/constants/log-messages/warning.d.ts +12 -0
  29. package/dist/constants/log-messages/warning.d.ts.map +1 -1
  30. package/dist/display-utils.d.ts +3 -1
  31. package/dist/display-utils.d.ts.map +1 -1
  32. package/dist/display-utils.js +443 -26
  33. package/dist/display-utils.js.map +10 -6
  34. package/dist/index.d.ts +22 -14
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +8877 -4236
  37. package/dist/index.js.map +63 -31
  38. package/dist/internal/_SessionManager.d.ts +76 -0
  39. package/dist/internal/_SessionManager.d.ts.map +1 -0
  40. package/dist/logging/clean-transport.d.ts +50 -0
  41. package/dist/logging/clean-transport.d.ts.map +1 -0
  42. package/dist/logging/errors.d.ts +90 -0
  43. package/dist/logging/errors.d.ts.map +1 -0
  44. package/dist/logging/logger.d.ts +72 -1
  45. package/dist/logging/logger.d.ts.map +1 -1
  46. package/dist/logging/telemetry-transport.d.ts +51 -0
  47. package/dist/logging/telemetry-transport.d.ts.map +1 -0
  48. package/dist/session/DataStreamRouter.d.ts +219 -0
  49. package/dist/session/DataStreamRouter.d.ts.map +1 -0
  50. package/dist/session/MentraSession.d.ts +102 -0
  51. package/dist/session/MentraSession.d.ts.map +1 -0
  52. package/dist/session/index.d.ts +2 -0
  53. package/dist/session/index.d.ts.map +1 -0
  54. package/dist/session/internal/_ConnectionManager.d.ts +43 -0
  55. package/dist/session/internal/_ConnectionManager.d.ts.map +1 -0
  56. package/dist/session/internal/_MessageRouter.d.ts +11 -0
  57. package/dist/session/internal/_MessageRouter.d.ts.map +1 -0
  58. package/dist/session/internal/_SubscriptionManager.d.ts +32 -0
  59. package/dist/session/internal/_SubscriptionManager.d.ts.map +1 -0
  60. package/dist/session/internal/_V2AudioStreamShim.d.ts +12 -0
  61. package/dist/session/internal/_V2AudioStreamShim.d.ts.map +1 -0
  62. package/dist/session/internal/_V2CameraShim.d.ts +51 -0
  63. package/dist/session/internal/_V2CameraShim.d.ts.map +1 -0
  64. package/dist/session/internal/_V2EventManagerShim.d.ts +51 -0
  65. package/dist/session/internal/_V2EventManagerShim.d.ts.map +1 -0
  66. package/dist/session/internal/_V2SessionShim.d.ts +165 -0
  67. package/dist/session/internal/_V2SessionShim.d.ts.map +1 -0
  68. package/dist/session/internal/_V2SettingsShim.d.ts +17 -0
  69. package/dist/session/internal/_V2SettingsShim.d.ts.map +1 -0
  70. package/dist/session/managers/CameraManager.d.ts +197 -0
  71. package/dist/session/managers/CameraManager.d.ts.map +1 -0
  72. package/dist/session/managers/DashboardManager.d.ts +131 -0
  73. package/dist/session/managers/DashboardManager.d.ts.map +1 -0
  74. package/dist/session/managers/DeviceManager.d.ts +332 -0
  75. package/dist/session/managers/DeviceManager.d.ts.map +1 -0
  76. package/dist/session/managers/DisplayManager.d.ts +171 -0
  77. package/dist/session/managers/DisplayManager.d.ts.map +1 -0
  78. package/dist/session/managers/LedManager.d.ts +131 -0
  79. package/dist/session/managers/LedManager.d.ts.map +1 -0
  80. package/dist/session/managers/LocationManager.d.ts +255 -0
  81. package/dist/session/managers/LocationManager.d.ts.map +1 -0
  82. package/dist/session/managers/MicManager.d.ts +252 -0
  83. package/dist/session/managers/MicManager.d.ts.map +1 -0
  84. package/dist/session/managers/PermissionsManager.d.ts +182 -0
  85. package/dist/session/managers/PermissionsManager.d.ts.map +1 -0
  86. package/dist/session/managers/PhoneManager.d.ts +295 -0
  87. package/dist/session/managers/PhoneManager.d.ts.map +1 -0
  88. package/dist/session/managers/SpeakerManager.d.ts +285 -0
  89. package/dist/session/managers/SpeakerManager.d.ts.map +1 -0
  90. package/dist/session/managers/StorageManager.d.ts +289 -0
  91. package/dist/session/managers/StorageManager.d.ts.map +1 -0
  92. package/dist/session/managers/TimeUtils.d.ts +175 -0
  93. package/dist/session/managers/TimeUtils.d.ts.map +1 -0
  94. package/dist/session/managers/TranscriptionManager.d.ts +195 -0
  95. package/dist/session/managers/TranscriptionManager.d.ts.map +1 -0
  96. package/dist/session/managers/TranslationManager.d.ts +189 -0
  97. package/dist/session/managers/TranslationManager.d.ts.map +1 -0
  98. package/dist/session.d.ts +41 -0
  99. package/dist/session.d.ts.map +1 -0
  100. package/dist/session.js +4168 -0
  101. package/dist/session.js.map +44 -0
  102. package/dist/transport/Transport.d.ts +119 -0
  103. package/dist/transport/Transport.d.ts.map +1 -0
  104. package/dist/transport/WebSocketTransport.d.ts +73 -0
  105. package/dist/transport/WebSocketTransport.d.ts.map +1 -0
  106. package/dist/types/index.d.ts +31 -5
  107. package/dist/types/index.d.ts.map +1 -1
  108. package/dist/types/message-types.d.ts +25 -9
  109. package/dist/types/message-types.d.ts.map +1 -1
  110. package/dist/types/messages/app-to-cloud.d.ts +113 -16
  111. package/dist/types/messages/app-to-cloud.d.ts.map +1 -1
  112. package/dist/types/messages/cloud-to-app.d.ts +50 -4
  113. package/dist/types/messages/cloud-to-app.d.ts.map +1 -1
  114. package/dist/types/messages/cloud-to-glasses.d.ts +43 -14
  115. package/dist/types/messages/cloud-to-glasses.d.ts.map +1 -1
  116. package/dist/types/messages/glasses-to-cloud.d.ts +5 -5
  117. package/dist/types/messages/glasses-to-cloud.d.ts.map +1 -1
  118. package/dist/types/models.d.ts +17 -0
  119. package/dist/types/models.d.ts.map +1 -1
  120. package/dist/types/rtmp-stream.d.ts +4 -4
  121. package/dist/types/rtmp-stream.d.ts.map +1 -1
  122. package/dist/types/streams.d.ts +6 -1
  123. package/dist/types/streams.d.ts.map +1 -1
  124. package/dist/types/webhooks.d.ts +11 -0
  125. package/dist/types/webhooks.d.ts.map +1 -1
  126. package/dist/utils/error-utils.d.ts +139 -0
  127. package/dist/utils/error-utils.d.ts.map +1 -0
  128. package/dist/utils/permissions-utils.d.ts +30 -7
  129. package/dist/utils/permissions-utils.d.ts.map +1 -1
  130. package/node_modules/@mentra/types/dist/applet.d.ts +5 -1
  131. package/node_modules/@mentra/types/dist/applet.d.ts.map +1 -1
  132. package/node_modules/@mentra/types/dist/capabilities/even-realities-g2.d.ts +12 -0
  133. package/node_modules/@mentra/types/dist/capabilities/even-realities-g2.d.ts.map +1 -0
  134. package/node_modules/@mentra/types/dist/capabilities/even-realities-g2.js +61 -0
  135. package/node_modules/@mentra/types/dist/capabilities/mentra-display.d.ts +12 -0
  136. package/node_modules/@mentra/types/dist/capabilities/mentra-display.d.ts.map +1 -0
  137. package/node_modules/@mentra/types/dist/capabilities/mentra-display.js +54 -0
  138. package/node_modules/@mentra/types/dist/capabilities/none.d.ts +13 -0
  139. package/node_modules/@mentra/types/dist/capabilities/none.d.ts.map +1 -0
  140. package/node_modules/@mentra/types/dist/capabilities/none.js +67 -0
  141. package/node_modules/@mentra/types/dist/enums.d.ts +8 -2
  142. package/node_modules/@mentra/types/dist/enums.d.ts.map +1 -1
  143. package/node_modules/@mentra/types/dist/enums.js +9 -2
  144. package/node_modules/@mentra/types/dist/hardware.d.ts +3 -1
  145. package/node_modules/@mentra/types/dist/hardware.d.ts.map +1 -1
  146. package/node_modules/@mentra/types/dist/hardware.js +12 -2
  147. package/node_modules/@mentra/types/dist/index.d.ts +1 -1
  148. package/node_modules/@mentra/types/dist/index.d.ts.map +1 -1
  149. package/node_modules/@mentra/types/dist/index.js +2 -1
  150. package/node_modules/@mentra/types/package.json +2 -2
  151. package/package.json +24 -12
  152. package/dist/examples/managed-rtmp-streaming-example.d.ts +0 -2
  153. package/dist/examples/managed-rtmp-streaming-example.d.ts.map +0 -1
  154. package/dist/examples/managed-rtmp-streaming-with-restream-example.d.ts +0 -11
  155. package/dist/examples/managed-rtmp-streaming-with-restream-example.d.ts.map +0 -1
  156. package/dist/examples/rtmp-streaming-example.d.ts +0 -2
  157. package/dist/examples/rtmp-streaming-example.d.ts.map +0 -1
  158. package/node_modules/@mentra/types/src/applet.ts +0 -51
  159. package/node_modules/@mentra/types/src/capabilities/even-realities-g1.ts +0 -63
  160. package/node_modules/@mentra/types/src/capabilities/mentra-live.ts +0 -103
  161. package/node_modules/@mentra/types/src/capabilities/simulated-glasses.ts +0 -76
  162. package/node_modules/@mentra/types/src/capabilities/vuzix-z100.ts +0 -60
  163. package/node_modules/@mentra/types/src/cli.ts +0 -169
  164. package/node_modules/@mentra/types/src/device.ts +0 -43
  165. package/node_modules/@mentra/types/src/enums.ts +0 -36
  166. package/node_modules/@mentra/types/src/hardware.ts +0 -172
  167. package/node_modules/@mentra/types/src/index.ts +0 -64
  168. package/node_modules/@mentra/types/tsconfig.json +0 -22
  169. package/node_modules/@mentra/types/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,252 @@
1
+ /**
2
+ * 🎤 MicManager — Microphone Input Control
3
+ *
4
+ * v3 manager that handles audio input from the user's glasses microphone.
5
+ * Provides subscriptions for raw PCM audio chunks and voice activity
6
+ * detection (VAD) events.
7
+ *
8
+ * Audio chunks arrive as binary WebSocket frames — MentraSession calls
9
+ * `handleBinaryAudio()` when it receives a binary frame that isn't
10
+ * destined for an output stream. VAD events arrive as JSON DATA_STREAM
11
+ * messages routed through the DataStreamRouter.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * const mic = new MicManager(deps);
16
+ *
17
+ * // Listen for raw audio
18
+ * const stopChunks = mic.onChunk((chunk) => {
19
+ * console.log(`Got ${chunk.data.byteLength} bytes at ${chunk.sampleRate}Hz`);
20
+ * });
21
+ *
22
+ * // Listen for voice activity
23
+ * const stopVad = mic.onVoiceActivity((vad) => {
24
+ * console.log(vad.isSpeaking ? "Speech started" : "Speech ended");
25
+ * });
26
+ *
27
+ * // Check state
28
+ * console.log("Speaking:", mic.isSpeaking);
29
+ * console.log("Active:", mic.isActive);
30
+ *
31
+ * // Cleanup
32
+ * mic.stop();
33
+ * ```
34
+ */
35
+ /**
36
+ * Shared dependency bag injected by MentraSession.
37
+ * Keeps managers decoupled from the session implementation.
38
+ */
39
+ export interface ManagerDeps {
40
+ /** DataStreamRouter — register for DATA_STREAM messages by streamType key. */
41
+ router: {
42
+ on(key: string, handler: (streamType: string, data: any, message: any) => void): () => void;
43
+ };
44
+ /** MessageHandlerRegistry — register for top-level message types. */
45
+ messageHandlers: {
46
+ register(type: string, handler: (msg: any) => void): () => void;
47
+ };
48
+ addSubscription: (stream: string) => void;
49
+ removeSubscription: (stream: string) => void;
50
+ sendMessage: (message: any) => void;
51
+ sendBinary: (data: ArrayBuffer | Uint8Array) => void;
52
+ logger: {
53
+ debug(...args: any[]): void;
54
+ info(...args: any[]): void;
55
+ warn(...args: any[]): void;
56
+ error(...args: any[]): void;
57
+ };
58
+ getPackageName: () => string;
59
+ getSessionId: () => string;
60
+ }
61
+ /**
62
+ * A chunk of raw PCM audio data from the glasses microphone.
63
+ *
64
+ * Audio is always 16 kHz mono 16-bit signed PCM — the native format
65
+ * of the glasses microphone hardware.
66
+ */
67
+ export interface AudioChunk {
68
+ /** Raw PCM audio data */
69
+ data: ArrayBuffer;
70
+ /** Sample rate in Hz (always 16000) */
71
+ sampleRate: number;
72
+ /** Number of audio channels (always 1 — mono) */
73
+ channels: number;
74
+ /** Timestamp when this chunk was received (ms since epoch) */
75
+ timestamp: number;
76
+ }
77
+ /**
78
+ * Voice activity detection event.
79
+ *
80
+ * Indicates whether the user is currently speaking. The glasses run
81
+ * on-device VAD and send status updates as the speech state changes.
82
+ */
83
+ export interface VadEvent {
84
+ /** Whether speech is currently detected */
85
+ isSpeaking: boolean;
86
+ /** Timestamp when this event was received (ms since epoch) */
87
+ timestamp: number;
88
+ }
89
+ /**
90
+ * Manages microphone input from the user's glasses.
91
+ *
92
+ * Handles two types of incoming data:
93
+ *
94
+ * 1. **Raw PCM audio chunks** — arrive as binary WebSocket frames.
95
+ * MentraSession calls `handleBinaryAudio()` for each binary frame
96
+ * that isn't part of an output stream. Subscribers receive wrapped
97
+ * `AudioChunk` objects with metadata.
98
+ *
99
+ * 2. **Voice Activity Detection (VAD)** — arrives as JSON DATA_STREAM
100
+ * messages with `streamType: "VAD"`. The glasses send `status: true`
101
+ * when speech starts and `status: false` when it stops. The raw
102
+ * `status` field may be a boolean or string ("true"/"false") — this
103
+ * manager normalizes it to a clean boolean.
104
+ *
105
+ * Subscription lifecycle:
106
+ * - `onChunk()` adds an "audio_chunk" subscription when the first handler
107
+ * is registered, and removes it when the last handler unsubscribes.
108
+ * - `onVoiceActivity()` does the same for the "VAD" subscription.
109
+ * - `stop()` removes all handlers and unsubscribes from both streams.
110
+ */
111
+ export declare class MicManager {
112
+ private readonly deps;
113
+ /** Registered handlers for audio chunk data */
114
+ private chunkHandlers;
115
+ /** Registered handlers for VAD events */
116
+ private vadHandlers;
117
+ /** Cleanup function for the VAD router subscription */
118
+ private vadRouterCleanup;
119
+ /** Cached latest VAD state — true when speech is detected */
120
+ private _isSpeaking;
121
+ /** Cached permission state */
122
+ private _hasPermission;
123
+ constructor(deps: ManagerDeps);
124
+ /**
125
+ * Whether speech is currently detected.
126
+ *
127
+ * This value is cached from the most recent VAD event. It is only
128
+ * updated while there is at least one `onVoiceActivity` subscriber.
129
+ *
130
+ * @example
131
+ * ```ts
132
+ * if (mic.isSpeaking) {
133
+ * // User is talking — maybe pause TTS
134
+ * }
135
+ * ```
136
+ */
137
+ get isSpeaking(): boolean;
138
+ /**
139
+ * Whether this app has an active `onChunk` subscription.
140
+ *
141
+ * Returns true when at least one audio chunk handler is registered,
142
+ * meaning the microphone stream is subscribed and binary audio data
143
+ * is being delivered.
144
+ */
145
+ get isActive(): boolean;
146
+ /**
147
+ * Whether the app has microphone permission.
148
+ *
149
+ * Updated when the cloud sends permission state changes. Apps that
150
+ * require microphone access should declare `MICROPHONE` in their
151
+ * hardware requirements.
152
+ */
153
+ get hasPermission(): boolean;
154
+ /**
155
+ * 🎤 Subscribe to raw PCM audio chunks from the microphone.
156
+ *
157
+ * Audio is always 16 kHz mono 16-bit signed PCM. The first subscriber
158
+ * triggers an "audio_chunk" subscription to the cloud; the subscription
159
+ * is removed when the last handler unsubscribes.
160
+ *
161
+ * @param handler - Called with each audio chunk as it arrives
162
+ * @returns Cleanup function that removes this handler
163
+ *
164
+ * @example
165
+ * ```ts
166
+ * const stop = mic.onChunk((chunk) => {
167
+ * // chunk.data is an ArrayBuffer of PCM16 samples
168
+ * const samples = new Int16Array(chunk.data);
169
+ * processAudio(samples);
170
+ * });
171
+ *
172
+ * // Later: unsubscribe
173
+ * stop();
174
+ * ```
175
+ */
176
+ onChunk(handler: (chunk: AudioChunk) => void): () => void;
177
+ /**
178
+ * 🗣️ Subscribe to voice activity detection events.
179
+ *
180
+ * VAD events indicate when the user starts or stops speaking. The
181
+ * `status` field from the glasses may be a boolean or a string
182
+ * ("true"/"false") — this manager normalizes it to a clean boolean.
183
+ *
184
+ * The first subscriber triggers a "VAD" subscription to the cloud and
185
+ * registers a handler on the DataStreamRouter. The subscription is
186
+ * removed when the last handler unsubscribes.
187
+ *
188
+ * @param handler - Called with each VAD event
189
+ * @returns Cleanup function that removes this handler
190
+ *
191
+ * @example
192
+ * ```ts
193
+ * const stop = mic.onVoiceActivity((vad) => {
194
+ * if (vad.isSpeaking) {
195
+ * console.log("User started speaking");
196
+ * } else {
197
+ * console.log("User stopped speaking");
198
+ * }
199
+ * });
200
+ *
201
+ * // Later: unsubscribe
202
+ * stop();
203
+ * ```
204
+ */
205
+ onVoiceActivity(handler: (vad: VadEvent) => void): () => void;
206
+ /**
207
+ * 🛑 Stop all microphone subscriptions.
208
+ *
209
+ * Removes all registered chunk and VAD handlers, unsubscribes from
210
+ * both streams, and resets internal state. After calling `stop()`,
211
+ * `isActive` will be false and no more callbacks will fire.
212
+ *
213
+ * @example
214
+ * ```ts
215
+ * mic.onChunk(handleChunk);
216
+ * mic.onVoiceActivity(handleVad);
217
+ *
218
+ * // Later: clean up everything
219
+ * mic.stop();
220
+ * ```
221
+ */
222
+ stop(): void;
223
+ /**
224
+ * Handle an incoming binary audio frame from the WebSocket transport.
225
+ *
226
+ * MentraSession calls this method when it receives a binary WebSocket
227
+ * frame that is identified as microphone audio (not part of an output
228
+ * stream). The raw bytes are wrapped with metadata and dispatched to
229
+ * all registered `onChunk` handlers.
230
+ *
231
+ * @param data - Raw binary audio data (PCM16, 16 kHz, mono)
232
+ *
233
+ * @remarks
234
+ * This is a public method so MentraSession can call it, but it is not
235
+ * intended to be called by app developers.
236
+ *
237
+ * @internal
238
+ */
239
+ handleBinaryAudio(data: ArrayBuffer): void;
240
+ /**
241
+ * Process an incoming VAD DATA_STREAM message.
242
+ *
243
+ * The glasses send VAD with `status` that can be:
244
+ * - `true` / `false` (boolean)
245
+ * - `"true"` / `"false"` (string)
246
+ *
247
+ * This method normalizes the value to a clean boolean and caches it
248
+ * for the `isSpeaking` getter.
249
+ */
250
+ private handleVadMessage;
251
+ }
252
+ //# sourceMappingURL=MicManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MicManager.d.ts","sourceRoot":"","sources":["../../../src/session/managers/MicManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * PermissionsManager — App Permission State
3
+ *
4
+ * Tracks which permissions the current app has been granted based on
5
+ * the app's manifest/registration on the developer console. Permissions
6
+ * are populated when the session connects (from CONNECTION_ACK settings)
7
+ * and can be queried synchronously by other managers.
8
+ *
9
+ * This manager is read-only from the app's perspective — permissions are
10
+ * controlled by the platform, not the app.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * // Check a single permission
15
+ * if (permissions.has("camera")) {
16
+ * // Safe to use camera APIs
17
+ * }
18
+ *
19
+ * // Get all permissions
20
+ * const all = permissions.getAll();
21
+ * console.log("Notifications allowed:", all.notifications);
22
+ *
23
+ * // React to permission changes
24
+ * const cleanup = permissions.onUpdate((perms) => {
25
+ * console.log("Permissions updated:", perms);
26
+ * });
27
+ * ```
28
+ *
29
+ * @module
30
+ */
31
+ /**
32
+ * Permission types supported by the MentraOS platform.
33
+ *
34
+ * These correspond to capabilities and data streams that require
35
+ * explicit opt-in via the developer console app manifest.
36
+ */
37
+ export type PermissionType = "location" | "microphone" | "camera" | "notifications" | "calendar";
38
+ /**
39
+ * Complete permission record mapping every permission type to its grant status.
40
+ */
41
+ export type PermissionRecord = Record<PermissionType, boolean>;
42
+ /**
43
+ * Dependencies injected by MentraSession.
44
+ */
45
+ export interface PermissionsManagerDeps {
46
+ /** Logger instance scoped to the session. */
47
+ logger: {
48
+ debug(...args: any[]): void;
49
+ info(...args: any[]): void;
50
+ warn(...args: any[]): void;
51
+ error(...args: any[]): void;
52
+ };
53
+ /** MessageHandlerRegistry — register for top-level message types. */
54
+ messageHandlers: {
55
+ register(type: string, handler: (msg: any) => void): () => void;
56
+ };
57
+ }
58
+ /**
59
+ * Manages the permission state for the current app session.
60
+ *
61
+ * Permissions are populated from the CONNECTION_ACK payload when the
62
+ * session is established. Other managers (DeviceManager, PhoneManager)
63
+ * query this manager to gate access to protected streams.
64
+ *
65
+ * The manager emits updates whenever the permission set changes, allowing
66
+ * UI or logic to react to permission grants/revocations in real time.
67
+ */
68
+ export declare class PermissionsManager {
69
+ /** Current permission state. */
70
+ private permissions;
71
+ /** Registered update listeners. */
72
+ private listeners;
73
+ /** Logger instance. */
74
+ private logger;
75
+ /** Message handler registry for cloud message subscriptions. */
76
+ private messageHandlers;
77
+ constructor(deps: PermissionsManagerDeps);
78
+ /**
79
+ * Check whether the app has been granted a specific permission.
80
+ *
81
+ * @param permission - The permission type to check
82
+ * @returns `true` if the permission is granted, `false` otherwise
83
+ *
84
+ * @example
85
+ * ```ts
86
+ * if (permissions.has("microphone")) {
87
+ * session.events.onTranscription(handler);
88
+ * }
89
+ * ```
90
+ */
91
+ has(permission: PermissionType): boolean;
92
+ /**
93
+ * Get a snapshot of all permissions as a record.
94
+ *
95
+ * The returned object is a copy — mutations do not affect internal state.
96
+ *
97
+ * @returns A record mapping every {@link PermissionType} to its grant status
98
+ *
99
+ * @example
100
+ * ```ts
101
+ * const perms = permissions.getAll();
102
+ * console.log("Camera:", perms.camera);
103
+ * console.log("Location:", perms.location);
104
+ * ```
105
+ */
106
+ getAll(): PermissionRecord;
107
+ /**
108
+ * Subscribe to permission updates.
109
+ *
110
+ * The handler is called whenever the permission set changes (e.g., on
111
+ * CONNECTION_ACK or a mid-session settings update). It receives a
112
+ * snapshot copy of the full permission record.
113
+ *
114
+ * @param handler - Callback invoked with the updated permission record
115
+ * @returns Cleanup function that removes the listener
116
+ *
117
+ * @example
118
+ * ```ts
119
+ * const cleanup = permissions.onUpdate((perms) => {
120
+ * if (!perms.camera) {
121
+ * console.warn("Camera permission revoked");
122
+ * }
123
+ * });
124
+ *
125
+ * // Later: stop listening
126
+ * cleanup();
127
+ * ```
128
+ */
129
+ onUpdate(handler: (permissions: PermissionRecord) => void): () => void;
130
+ /**
131
+ * Listen for permission error events from the cloud.
132
+ * Fires when a bulk subscription is rejected due to missing permissions.
133
+ *
134
+ * @param handler - Callback invoked with the error details
135
+ * @returns Cleanup function that removes the listener
136
+ *
137
+ * @example
138
+ * ```ts
139
+ * const cleanup = permissions.onPermissionError((err) => {
140
+ * console.error("Permission error:", err.message, err.deniedPermissions);
141
+ * });
142
+ * ```
143
+ */
144
+ onPermissionError(handler: (error: {
145
+ message: string;
146
+ deniedPermissions?: string[];
147
+ }) => void): () => void;
148
+ /**
149
+ * Listen for permission denied events from the cloud.
150
+ * Fires when an individual stream subscription is rejected.
151
+ *
152
+ * @param handler - Callback invoked with the denial details
153
+ * @returns Cleanup function that removes the listener
154
+ *
155
+ * @example
156
+ * ```ts
157
+ * const cleanup = permissions.onPermissionDenied((err) => {
158
+ * console.warn("Denied:", err.permission, err.streamType);
159
+ * });
160
+ * ```
161
+ */
162
+ onPermissionDenied(handler: (error: {
163
+ message: string;
164
+ permission?: string;
165
+ streamType?: string;
166
+ }) => void): () => void;
167
+ /**
168
+ * Update permissions from connection settings or a settings update payload.
169
+ *
170
+ * Called internally by MentraSession when:
171
+ * - A CONNECTION_ACK is received with initial settings/permissions
172
+ * - A mid-session settings update includes permission changes
173
+ *
174
+ * Accepts flexible input — extracts permissions from nested structures
175
+ * commonly found in CONNECTION_ACK and settings_update payloads.
176
+ *
177
+ * @param settings - The raw settings object from the cloud message
178
+ * @internal
179
+ */
180
+ updateFromSettings(settings: any): void;
181
+ }
182
+ //# sourceMappingURL=PermissionsManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionsManager.d.ts","sourceRoot":"","sources":["../../../src/session/managers/PermissionsManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAIH;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,GAAG,eAAe,GAAG,UAAU,CAAC;AAEjG;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,6CAA6C;IAC7C,MAAM,EAAE;QACN,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC3B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;KAC7B,CAAC;IACF,qEAAqE;IACrE,eAAe,EAAE;QACf,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;KACjE,CAAC;CACH;AA4BD;;;;;;;;;GASG;AACH,qBAAa,kBAAkB;IAC7B,gCAAgC;IAChC,OAAO,CAAC,WAAW,CAAmB;IAEtC,mCAAmC;IACnC,OAAO,CAAC,SAAS,CAA2D;IAE5E,uBAAuB;IACvB,OAAO,CAAC,MAAM,CAAmC;IAEjD,gEAAgE;IAChE,OAAO,CAAC,eAAe,CAA4C;gBAEvD,IAAI,EAAE,sBAAsB;IAQxC;;;;;;;;;;;;OAYG;IACH,GAAG,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO;IAIxC;;;;;;;;;;;;;OAaG;IACH,MAAM,IAAI,gBAAgB;IAI1B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,QAAQ,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI;IAOtE;;;;;;;;;;;;;OAaG;IACH,iBAAiB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,GAAG,MAAM,IAAI;IAW1G;;;;;;;;;;;;;OAaG;IACH,kBAAkB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,MAAM,IAAI;IAavH;;;;;;;;;;;;OAYG;IACH,kBAAkB,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;CAqDxC"}