@mentra/sdk 2.1.31-beta.5 → 3.0.0-alpha.1

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 +208 -70
  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 +113 -93
  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 +8957 -4428
  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 +52 -0
  63. package/dist/session/internal/_V2CameraShim.d.ts.map +1 -0
  64. package/dist/session/internal/_V2EventManagerShim.d.ts +52 -0
  65. package/dist/session/internal/_V2EventManagerShim.d.ts.map +1 -0
  66. package/dist/session/internal/_V2SessionShim.d.ts +169 -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 +198 -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 +348 -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 +116 -0
  79. package/dist/session/managers/LedManager.d.ts.map +1 -0
  80. package/dist/session/managers/LocationManager.d.ts +224 -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 +139 -0
  85. package/dist/session/managers/PermissionsManager.d.ts.map +1 -0
  86. package/dist/session/managers/PhoneManager.d.ts +351 -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 +4110 -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,198 @@
1
+ /**
2
+ * CameraManager — v3 SDK Camera API
3
+ *
4
+ * Covers:
5
+ * - photo capture
6
+ * - externally-triggered photo events
7
+ * - unmanaged RTMP streaming
8
+ * - managed stream orchestration/status
9
+ */
10
+ import { type ManagedStreamStatus, type RestreamDestination, type StreamStatus, type AudioConfig, type StreamConfig, type VideoConfig } from "../../types";
11
+ export interface PhotoOptions {
12
+ size?: "small" | "medium" | "large" | "full";
13
+ compression?: "none" | "medium" | "heavy";
14
+ saveToGallery?: boolean;
15
+ sound?: boolean;
16
+ timeout?: number;
17
+ }
18
+ export interface PhotoData {
19
+ url: string;
20
+ width: number;
21
+ height: number;
22
+ timestamp: number;
23
+ savedToGallery: boolean;
24
+ }
25
+ /**
26
+ * Options for session.camera.startStream().
27
+ *
28
+ * Three modes:
29
+ * - No options → managed relay (default, best for most apps)
30
+ * - `destinations` → managed relay + fan out to external services
31
+ * - `direct` → glasses connect straight to this URL, no relay
32
+ */
33
+ export interface StreamOptions {
34
+ /** Direct stream URL. Glasses connect to this URL directly, bypassing the cloud relay.
35
+ * Supports srt://, rtmp://, rtmps://, and https:// (WHIP) protocols.
36
+ * When set, the cloud relay is not used. No viewer URLs are returned.
37
+ * Most apps should NOT use this — use the default managed relay instead. */
38
+ direct?: string;
39
+ /** Restream destinations. The cloud relay fans out to these URLs.
40
+ * Only works with managed streaming (when `direct` is not set).
41
+ * Each URL is an RTMP or SRT ingest endpoint (YouTube, Twitch, etc.) */
42
+ destinations?: string[];
43
+ /** Stream quality. Only applies to managed streaming. */
44
+ quality?: "720p" | "1080p";
45
+ /** Enable WebRTC playback URL. Only applies to managed streaming. Default: true. */
46
+ enableWebRTC?: boolean;
47
+ /** Video configuration (resolution, bitrate, fps) */
48
+ video?: VideoConfig;
49
+ /** Audio configuration (bitrate, sample rate) */
50
+ audio?: AudioConfig;
51
+ /** Stream transport configuration */
52
+ stream?: StreamConfig;
53
+ /** Controls stream start/stop sounds on the glasses. Default: true. */
54
+ sound?: boolean;
55
+ }
56
+ export interface StreamResult {
57
+ hlsUrl: string;
58
+ dashUrl: string;
59
+ webrtcUrl?: string;
60
+ previewUrl?: string;
61
+ thumbnailUrl?: string;
62
+ streamId: string;
63
+ }
64
+ /** @deprecated Use StreamOptions instead */
65
+ export interface RtmpStreamOptions {
66
+ rtmpUrl: string;
67
+ video?: VideoConfig;
68
+ audio?: AudioConfig;
69
+ stream?: StreamConfig;
70
+ sound?: boolean;
71
+ }
72
+ /** @deprecated Use StreamOptions with destinations instead */
73
+ export interface ManagedStreamOptions {
74
+ quality?: "720p" | "1080p";
75
+ enableWebRTC?: boolean;
76
+ video?: VideoConfig;
77
+ audio?: AudioConfig;
78
+ stream?: StreamConfig;
79
+ restreamDestinations?: RestreamDestination[];
80
+ sound?: boolean;
81
+ }
82
+ /** @deprecated Use StreamResult instead */
83
+ export type ManagedStreamResult = StreamResult;
84
+ export interface ExistingStreamInfo {
85
+ hasActiveStream: boolean;
86
+ streamInfo?: {
87
+ type: "managed" | "unmanaged";
88
+ streamId: string;
89
+ status: string;
90
+ createdAt: Date;
91
+ hlsUrl?: string;
92
+ dashUrl?: string;
93
+ webrtcUrl?: string;
94
+ previewUrl?: string;
95
+ thumbnailUrl?: string;
96
+ activeViewers?: number;
97
+ rtmpUrl?: string;
98
+ requestingAppId?: string;
99
+ };
100
+ }
101
+ export type StreamStatusHandler = (status: StreamStatus) => void;
102
+ export interface CameraManagerDeps {
103
+ router: {
104
+ on(key: string, handler: (streamType: string, data: any, message: any) => void): () => void;
105
+ };
106
+ messageHandlers: {
107
+ register(type: string, handler: (msg: any) => void): () => void;
108
+ };
109
+ addSubscription: (stream: string) => void;
110
+ removeSubscription: (stream: string) => void;
111
+ sendMessage: (message: any) => void;
112
+ logger: {
113
+ debug(...args: any[]): void;
114
+ info(...args: any[]): void;
115
+ warn(...args: any[]): void;
116
+ error(...args: any[]): void;
117
+ };
118
+ getPackageName: () => string;
119
+ getSessionId: () => string;
120
+ }
121
+ export declare class CameraManager {
122
+ private readonly deps;
123
+ private readonly events;
124
+ private readonly handlerCleanups;
125
+ private pendingRequests;
126
+ private pendingStreamChecks;
127
+ private pendingManagedStreamRequest;
128
+ private _hasPermission;
129
+ private isStreaming;
130
+ private currentStreamUrl?;
131
+ private currentStreamState?;
132
+ private isManagedStreaming;
133
+ private currentManagedStreamId?;
134
+ private currentManagedStreamUrls?;
135
+ private managedStreamStatus?;
136
+ constructor(deps: CameraManagerDeps);
137
+ takePhoto(opts?: PhotoOptions): Promise<PhotoData>;
138
+ onPhotoTaken(handler: (photo: PhotoData) => void): () => void;
139
+ /**
140
+ * Start a video stream from the glasses.
141
+ *
142
+ * Three modes:
143
+ * - `startStream()` — managed relay (default). Cloud handles quality, reconnection, viewer URLs.
144
+ * - `startStream({ destinations: [...] })` — managed relay + fan out to YouTube/Twitch/etc.
145
+ * - `startStream({ direct: "srt://..." })` — glasses connect straight to your URL, no relay.
146
+ *
147
+ * @example
148
+ * ```ts
149
+ * // Default — managed relay
150
+ * const stream = await session.camera.startStream();
151
+ * console.log(stream.hlsUrl, stream.webrtcUrl);
152
+ *
153
+ * // Managed relay + restream to YouTube
154
+ * const stream = await session.camera.startStream({
155
+ * destinations: ["rtmp://youtube.com/live/your-key"],
156
+ * });
157
+ *
158
+ * // Direct — glasses → your server, no relay
159
+ * await session.camera.startStream({ direct: "srt://192.168.1.100:4201" });
160
+ * ```
161
+ */
162
+ startStream(options?: StreamOptions): Promise<StreamResult | void>;
163
+ /**
164
+ * Stop any active stream (managed or direct).
165
+ */
166
+ stopStream(): Promise<void>;
167
+ /**
168
+ * Subscribe to stream status updates (works for both managed and direct).
169
+ */
170
+ onStreamStatus(handler: StreamStatusHandler): () => void;
171
+ isCurrentlyStreaming(): boolean;
172
+ getCurrentStreamUrl(): string | undefined;
173
+ getStreamStatus(): StreamStatus | undefined;
174
+ getStreamUrls(): StreamResult | undefined;
175
+ private _startDirectStream;
176
+ private _startManagedStream;
177
+ /** @deprecated Use startStream({ direct: url }) instead */
178
+ startDirectStream(options: RtmpStreamOptions): Promise<void>;
179
+ /** @deprecated Use startStream() or startStream({ destinations: [...] }) instead */
180
+ startManagedStream(options?: ManagedStreamOptions): Promise<StreamResult>;
181
+ /** @deprecated Use stopStream() instead */
182
+ stopManagedStream(): Promise<void>;
183
+ /** @deprecated Use onStreamStatus() instead */
184
+ onManagedStreamStatus(handler: (status: ManagedStreamStatus) => void): () => void;
185
+ /** @deprecated Use isCurrentlyStreaming() instead */
186
+ isManagedStreamActive(): boolean;
187
+ /** @deprecated Use getStreamUrls() instead */
188
+ getManagedStreamUrls(): StreamResult | undefined;
189
+ getManagedStreamStatus(): ManagedStreamStatus | undefined;
190
+ checkExistingStream(): Promise<ExistingStreamInfo>;
191
+ get hasPermission(): boolean;
192
+ handlePhotoResponse(message: any): void;
193
+ private handleStreamStatus;
194
+ private handleManagedStreamStatus;
195
+ private handleStreamCheckResponse;
196
+ destroy(): void;
197
+ }
198
+ //# sourceMappingURL=CameraManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CameraManager.d.ts","sourceRoot":"","sources":["../../../src/session/managers/CameraManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * 📊 DashboardManager — v3 SDK Dashboard Content API
3
+ *
4
+ * Thin wrapper that sends dashboard content updates to the cloud.
5
+ * Provides a simplified two-method API: {@link showText} and {@link clear}.
6
+ *
7
+ * Wire format is identical to v2 DashboardContentManager:
8
+ * ```json
9
+ * {
10
+ * "type": "dashboard_content_update",
11
+ * "packageName": "<packageName>",
12
+ * "sessionId": "<sessionId>-<packageName>",
13
+ * "content": "<text>",
14
+ * "modes": ["main"],
15
+ * "timestamp": "<ISO date>"
16
+ * }
17
+ * ```
18
+ *
19
+ * The `sessionId` field in dashboard messages uses the composite format
20
+ * `"<sessionId>-<packageName>"` to match the v2 wire format exactly.
21
+ *
22
+ * @module
23
+ */
24
+ /**
25
+ * Dependencies injected by MentraSession.
26
+ *
27
+ * Structural type — no concrete imports so the manager stays unit-testable
28
+ * with plain stubs.
29
+ */
30
+ export interface DashboardManagerDeps {
31
+ /** DataStreamRouter — register for DATA_STREAM messages by streamType key. */
32
+ router: {
33
+ on(key: string, handler: (streamType: string, data: any, message: any) => void): () => void;
34
+ };
35
+ /** MessageHandlerRegistry — register for top-level message types. */
36
+ messageHandlers: {
37
+ register(type: string, handler: (msg: any) => void): () => void;
38
+ };
39
+ /** Add a subscription string (triggers SUBSCRIPTION_UPDATE to cloud). */
40
+ addSubscription: (stream: string) => void;
41
+ /** Remove a subscription string. */
42
+ removeSubscription: (stream: string) => void;
43
+ /** Send an arbitrary JSON message over the WebSocket. */
44
+ sendMessage: (message: any) => void;
45
+ /** Structured logger. */
46
+ logger: {
47
+ debug(...args: any[]): void;
48
+ info(...args: any[]): void;
49
+ warn(...args: any[]): void;
50
+ error(...args: any[]): void;
51
+ };
52
+ /** Package name for outgoing messages. */
53
+ getPackageName: () => string;
54
+ /** Current session ID. */
55
+ getSessionId: () => string;
56
+ }
57
+ /**
58
+ * Controls the dashboard content displayed for this app on the user's glasses.
59
+ *
60
+ * Dashboard content is a text overlay shown in the main dashboard view.
61
+ * The {@link showText} method sends content targeting the `MAIN` dashboard
62
+ * mode by default. Use {@link clear} to remove any displayed content.
63
+ *
64
+ * All methods are fire-and-forget — the messages are sent immediately and
65
+ * no response is awaited.
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * const session = await mentra.connect();
70
+ *
71
+ * // Show a single line of text
72
+ * session.dashboard.showText("Meeting in 5 minutes");
73
+ *
74
+ * // Show multiple lines
75
+ * session.dashboard.showText(["Line 1", "Line 2", "Line 3"]);
76
+ *
77
+ * // Clear the dashboard
78
+ * session.dashboard.clear();
79
+ * ```
80
+ */
81
+ export declare class DashboardManager {
82
+ private readonly deps;
83
+ constructor(deps: DashboardManagerDeps);
84
+ /**
85
+ * Show text content on the dashboard.
86
+ *
87
+ * Sends a `dashboard_content_update` message targeting the `MAIN`
88
+ * dashboard mode. Accepts either a single string or an array of
89
+ * pre-wrapped lines — when an array is provided the lines are joined
90
+ * with newlines before sending.
91
+ *
92
+ * @param text - A string or array of strings to display on the dashboard.
93
+ *
94
+ * @example
95
+ * ```ts
96
+ * // Single string
97
+ * session.dashboard.showText("Status: Connected");
98
+ *
99
+ * // Pre-wrapped lines
100
+ * session.dashboard.showText([
101
+ * "Temperature: 72°F",
102
+ * "Humidity: 45%",
103
+ * "Wind: 5 mph",
104
+ * ]);
105
+ * ```
106
+ */
107
+ showText(text: string | string[]): void;
108
+ /**
109
+ * Clear the dashboard content.
110
+ *
111
+ * Sends an empty `dashboard_content_update` message targeting the
112
+ * `MAIN` dashboard mode, which removes any currently displayed content
113
+ * for this app.
114
+ *
115
+ * @example
116
+ * ```ts
117
+ * session.dashboard.clear();
118
+ * ```
119
+ */
120
+ clear(): void;
121
+ /**
122
+ * Clean up resources.
123
+ *
124
+ * Called by MentraSession during disconnect/cleanup. Dashboard commands
125
+ * are fire-and-forget so there is no pending state to drain.
126
+ *
127
+ * @internal
128
+ */
129
+ destroy(): void;
130
+ }
131
+ //# sourceMappingURL=DashboardManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardManager.d.ts","sourceRoot":"","sources":["../../../src/session/managers/DashboardManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAOH;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,8EAA8E;IAC9E,MAAM,EAAE;QACN,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;KAC7F,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;IACF,yEAAyE;IACzE,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,oCAAoC;IACpC,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,yDAAyD;IACzD,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACpC,yBAAyB;IACzB,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,0CAA0C;IAC1C,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,0BAA0B;IAC1B,YAAY,EAAE,MAAM,MAAM,CAAC;CAC5B;AAID;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuB;gBAEhC,IAAI,EAAE,oBAAoB;IAMtC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAiBvC;;;;;;;;;;;OAWG;IACH,KAAK,IAAI,IAAI;IAiBb;;;;;;;OAOG;IACH,OAAO,IAAI,IAAI;CAGhB"}
@@ -0,0 +1,348 @@
1
+ /**
2
+ * DeviceManager — Consolidated Device State, Hardware Events & Capabilities
3
+ *
4
+ * Owns all device-related concerns for a MentraSession:
5
+ *
6
+ * - **Reactive state** — Observable properties for connection, battery, WiFi,
7
+ * hotspot, and case status (mirrors the legacy DeviceState pattern).
8
+ * - **Hardware events** — Button presses, head position, touch gestures,
9
+ * battery updates, and VPS coordinates, all routed from the DataStreamRouter.
10
+ * - **Capabilities** — Device capability profile received at connection time
11
+ * and updated mid-session when the glasses model changes.
12
+ * - **Actions** — Outbound commands like `requestWifiSetup`.
13
+ *
14
+ * All handler registrations return a cleanup function. Subscriptions are
15
+ * managed automatically — `addSubscription` is called when the first handler
16
+ * for a stream is registered, and `removeSubscription` when the last is removed.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * // Reactive state
21
+ * device.state.batteryLevel.onChange((level) => {
22
+ * console.log("Battery:", level, "%");
23
+ * });
24
+ *
25
+ * // Hardware events
26
+ * const stop = device.onButtonPress((e) => {
27
+ * console.log(e.buttonId, e.pressType);
28
+ * });
29
+ *
30
+ * // Filtered touch events
31
+ * device.onTouchEvent("double_tap", (e) => {
32
+ * console.log("Double tap!", e);
33
+ * });
34
+ *
35
+ * // Capabilities
36
+ * device.onCapabilitiesChange((caps) => {
37
+ * console.log("Device supports camera:", !!caps?.camera);
38
+ * });
39
+ *
40
+ * // Actions
41
+ * device.requestWifiSetup("App needs internet for sync");
42
+ *
43
+ * // Cleanup
44
+ * stop();
45
+ * ```
46
+ *
47
+ * @module
48
+ */
49
+ import { Observable } from "../../utils/Observable";
50
+ import type { PermissionsManager } from "./PermissionsManager";
51
+ /**
52
+ * Button press event from the glasses hardware.
53
+ */
54
+ export interface ButtonPressEvent {
55
+ /** Identifier of the button that was pressed. */
56
+ buttonId: string;
57
+ /** Whether the press was short or long. */
58
+ pressType: "short" | "long";
59
+ }
60
+ /**
61
+ * Head position event from the IMU.
62
+ */
63
+ export interface HeadPositionEvent {
64
+ /** Current head position. */
65
+ position: "up" | "down";
66
+ }
67
+ /**
68
+ * Normalised touch/gesture event from the glasses touchpad.
69
+ *
70
+ * Raw wire fields (`gesture_name`, `device_model`) are normalised to
71
+ * `gesture` and `model` for a cleaner developer experience.
72
+ */
73
+ export interface TouchEventData {
74
+ /** Normalised gesture name (e.g. "double_tap", "forward_swipe"). */
75
+ gesture: string;
76
+ /** Normalised device model name. */
77
+ model: string;
78
+ /** Timestamp of the gesture. */
79
+ timestamp: Date | string;
80
+ /** The original raw data, preserved for advanced use cases. */
81
+ [key: string]: any;
82
+ }
83
+ /**
84
+ * Glasses battery update event.
85
+ */
86
+ export interface BatteryUpdateEvent {
87
+ /** Battery level 0–100. */
88
+ level: number;
89
+ /** Whether the glasses are currently charging. */
90
+ charging: boolean;
91
+ /** Estimated minutes remaining (if available). */
92
+ timeRemaining?: number;
93
+ }
94
+ /**
95
+ * Dependencies injected by MentraSession into the DeviceManager.
96
+ */
97
+ export interface DeviceManagerDeps {
98
+ /** DataStreamRouter — register for stream-type events. */
99
+ router: {
100
+ on(key: string, handler: (streamType: string, data: any, message: any) => void): () => void;
101
+ };
102
+ /** MessageHandlerRegistry — register for top-level message types. */
103
+ messageHandlers: {
104
+ register(type: string, handler: (msg: any) => void): () => void;
105
+ };
106
+ /** Subscribe to a data stream (sent to cloud). */
107
+ addSubscription: (stream: string) => void;
108
+ /** Unsubscribe from a data stream. */
109
+ removeSubscription: (stream: string) => void;
110
+ /** Send an arbitrary message to the cloud. */
111
+ sendMessage: (message: any) => void;
112
+ /** Session-scoped logger. */
113
+ logger: {
114
+ debug(...args: any[]): void;
115
+ info(...args: any[]): void;
116
+ warn(...args: any[]): void;
117
+ error(...args: any[]): void;
118
+ };
119
+ /** Returns the current app's package name. */
120
+ getPackageName: () => string;
121
+ /** Returns the active session ID. */
122
+ getSessionId: () => string;
123
+ /** PermissionsManager for gating protected streams. */
124
+ permissions: PermissionsManager;
125
+ }
126
+ /**
127
+ * Read-only reactive device state container.
128
+ *
129
+ * Every property is an {@link Observable} — call `.value` for synchronous
130
+ * reads or `.onChange(cb)` for reactive subscriptions.
131
+ */
132
+ export interface DeviceStateShape {
133
+ readonly connected: Observable<boolean>;
134
+ readonly modelName: Observable<string | null>;
135
+ readonly batteryLevel: Observable<number | null>;
136
+ readonly charging: Observable<boolean | null>;
137
+ readonly caseBatteryLevel: Observable<number | null>;
138
+ readonly caseCharging: Observable<boolean | null>;
139
+ readonly caseOpen: Observable<boolean | null>;
140
+ readonly caseRemoved: Observable<boolean | null>;
141
+ readonly wifiConnected: Observable<boolean>;
142
+ readonly wifiSsid: Observable<string | null>;
143
+ readonly wifiLocalIp: Observable<string | null>;
144
+ readonly hotspotEnabled: Observable<boolean | null>;
145
+ readonly hotspotSsid: Observable<string | null>;
146
+ }
147
+ /**
148
+ * Manages all device-related state, hardware events, capabilities, and actions.
149
+ *
150
+ * Created by MentraSession and exposed as `session.device`.
151
+ */
152
+ export declare class DeviceManager {
153
+ /** Reactive device state observables. */
154
+ readonly state: DeviceStateShape;
155
+ /** Current device capabilities (set from CONNECTION_ACK). */
156
+ capabilities: any;
157
+ private deps;
158
+ private permissions;
159
+ /** Internal mutable references to observables (state exposes them read-only). */
160
+ private readonly _connected;
161
+ private readonly _modelName;
162
+ private readonly _batteryLevel;
163
+ private readonly _charging;
164
+ private readonly _caseBatteryLevel;
165
+ private readonly _caseCharging;
166
+ private readonly _caseOpen;
167
+ private readonly _caseRemoved;
168
+ private readonly _wifiConnected;
169
+ private readonly _wifiSsid;
170
+ private readonly _wifiLocalIp;
171
+ private readonly _hotspotEnabled;
172
+ private readonly _hotspotSsid;
173
+ /** Capabilities-change listeners. */
174
+ private capabilitiesListeners;
175
+ /**
176
+ * Ref-counted handler bookkeeping per stream key.
177
+ *
178
+ * Tracks the number of active handlers for each stream so that
179
+ * `addSubscription` / `removeSubscription` are called exactly once
180
+ * when the first handler is added / last handler is removed.
181
+ */
182
+ private handlerCounts;
183
+ /** Cleanup functions returned by router/messageHandlers registrations. */
184
+ private cleanups;
185
+ constructor(deps: DeviceManagerDeps);
186
+ /**
187
+ * Listen for physical button press events on the glasses.
188
+ *
189
+ * @param handler - Called with {@link ButtonPressEvent} for every press
190
+ * @returns Cleanup function to remove the handler
191
+ *
192
+ * @example
193
+ * ```ts
194
+ * const stop = device.onButtonPress((e) => {
195
+ * if (e.pressType === "long") {
196
+ * console.log("Long press on", e.buttonId);
197
+ * }
198
+ * });
199
+ * ```
200
+ */
201
+ onButtonPress(handler: (event: ButtonPressEvent) => void): () => void;
202
+ /**
203
+ * Listen for head position (up/down) events from the IMU.
204
+ *
205
+ * @param handler - Called with {@link HeadPositionEvent} on position change
206
+ * @returns Cleanup function to remove the handler
207
+ */
208
+ onHeadPosition(handler: (event: HeadPositionEvent) => void): () => void;
209
+ /**
210
+ * Listen for touch/gesture events from the glasses touchpad.
211
+ *
212
+ * Overloaded:
213
+ * - `onTouchEvent(handler)` — all touch events
214
+ * - `onTouchEvent(gesture, handler)` — only events matching the given gesture
215
+ *
216
+ * @param gestureOrHandler - A gesture name string, or a handler for all events
217
+ * @param handler - Handler when the first argument is a gesture name
218
+ * @returns Cleanup function to remove the handler
219
+ *
220
+ * @example
221
+ * ```ts
222
+ * // All gestures
223
+ * device.onTouchEvent((e) => console.log(e.gesture));
224
+ *
225
+ * // Specific gesture
226
+ * device.onTouchEvent("double_tap", (e) => console.log("Double tap!"));
227
+ * ```
228
+ */
229
+ onTouchEvent(handler: (event: TouchEventData) => void): () => void;
230
+ onTouchEvent(gesture: string, handler: (event: TouchEventData) => void): () => void;
231
+ /**
232
+ * Subscribe to multiple touch gestures at once.
233
+ *
234
+ * Registers a handler for each gesture and returns a single cleanup
235
+ * function that removes all of them.
236
+ *
237
+ * @param gestures - Array of gesture names (e.g. `["double_tap", "forward_swipe"]`)
238
+ * @returns Cleanup function that removes all gesture subscriptions
239
+ *
240
+ * @example
241
+ * ```ts
242
+ * const stop = device.subscribeToGestures(["single_tap", "double_tap", "forward_swipe"]);
243
+ * // Later:
244
+ * stop();
245
+ * ```
246
+ */
247
+ subscribeToGestures(gestures: string[]): () => void;
248
+ /**
249
+ * Listen for glasses battery update events.
250
+ *
251
+ * Also updates the reactive `state.batteryLevel` and `state.charging` observables.
252
+ *
253
+ * @param handler - Called with {@link BatteryUpdateEvent} on each update
254
+ * @returns Cleanup function to remove the handler
255
+ */
256
+ onBatteryUpdate(handler: (event: BatteryUpdateEvent) => void): () => void;
257
+ /**
258
+ * Listen for VPS (Visual Positioning System) coordinate updates.
259
+ *
260
+ * @param handler - Called with raw VPS coordinate data
261
+ * @returns Cleanup function to remove the handler
262
+ */
263
+ onVpsCoordinates(handler: (event: any) => void): () => void;
264
+ /**
265
+ * Request the user to set up WiFi on their glasses.
266
+ *
267
+ * Sends a `request_wifi_setup` message to the cloud, which prompts
268
+ * the companion app to display a WiFi configuration flow.
269
+ *
270
+ * @param reason - Optional human-readable reason shown to the user
271
+ *
272
+ * @example
273
+ * ```ts
274
+ * device.requestWifiSetup("This app needs WiFi for real-time sync");
275
+ * ```
276
+ */
277
+ requestWifiSetup(reason?: string): void;
278
+ /**
279
+ * Subscribe to device capability changes.
280
+ *
281
+ * Called when capabilities are first received (CONNECTION_ACK) and
282
+ * whenever the device model or capabilities change mid-session.
283
+ *
284
+ * @param handler - Called with the new capabilities object
285
+ * @returns Cleanup function to remove the handler
286
+ *
287
+ * @example
288
+ * ```ts
289
+ * device.onCapabilitiesChange((caps) => {
290
+ * if (caps?.camera?.photo) {
291
+ * console.log("Camera supports photos");
292
+ * }
293
+ * });
294
+ * ```
295
+ */
296
+ onCapabilitiesChange(handler: (caps: any) => void): () => void;
297
+ /**
298
+ * Handle a `device_state_update` message from the cloud.
299
+ *
300
+ * Updates all matching Observable properties. Only fields present in
301
+ * the message are touched — Observables for absent fields keep their
302
+ * current value.
303
+ *
304
+ * @param message - The raw device_state_update message
305
+ * @internal
306
+ */
307
+ handleDeviceStateUpdate(message: any): void;
308
+ /**
309
+ * Handle a `capabilities_update` message from the cloud.
310
+ *
311
+ * Extracts the capabilities payload and delegates to {@link setCapabilities}.
312
+ *
313
+ * @param message - The raw capabilities_update message
314
+ * @internal
315
+ */
316
+ handleCapabilitiesUpdate(message: any): void;
317
+ /**
318
+ * Directly set the device capabilities.
319
+ *
320
+ * Called by MentraSession from the CONNECTION_ACK payload, or by
321
+ * {@link handleCapabilitiesUpdate} for mid-session updates.
322
+ *
323
+ * @param caps - The capabilities object (or null)
324
+ * @internal
325
+ */
326
+ setCapabilities(caps: any): void;
327
+ /**
328
+ * Remove all tracked handlers and clear listeners.
329
+ *
330
+ * Called by MentraSession during disconnect/cleanup.
331
+ *
332
+ * @internal
333
+ */
334
+ destroy(): void;
335
+ /**
336
+ * Register a handler on the DataStreamRouter for a given stream key,
337
+ * managing subscription lifecycle automatically.
338
+ *
339
+ * - Calls `deps.addSubscription` when the first handler for a key is added.
340
+ * - Calls `deps.removeSubscription` when the last handler for a key is removed.
341
+ *
342
+ * @param streamKey - The stream type or prefixed stream key
343
+ * @param handler - The stream handler function
344
+ * @returns Cleanup function that unregisters the handler and manages subscription
345
+ */
346
+ private addStreamHandler;
347
+ }
348
+ //# sourceMappingURL=DeviceManager.d.ts.map