node-mac-recorder 2.19.1 โ†’ 2.19.2

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.
@@ -8,7 +8,8 @@
8
8
  "Bash(FORCE_AVFOUNDATION=1 timeout 8 node test-cursor-debug.js)",
9
9
  "Bash(FORCE_AVFOUNDATION=1 timeout 5 node test-cursor-debug.js)",
10
10
  "Bash(FORCE_AVFOUNDATION=1 timeout 8 node test-unified-cursor.js)",
11
- "Bash(FORCE_AVFOUNDATION=1 timeout 5 node test-unified-cursor.js)"
11
+ "Bash(FORCE_AVFOUNDATION=1 timeout 5 node test-unified-cursor.js)",
12
+ "Bash(FORCE_AVFOUNDATION=1 timeout 8 node -e \"\nconst MacRecorder = require(''./index.js'');\nconst recorder = new MacRecorder();\n\nconsole.log(''๐Ÿงช Testing AVFoundation fallback...'');\n\nasync function testFallback() {\n try {\n const outputPath = ''./test-avfoundation-fallback.mov'';\n \n console.log(''Starting AVFoundation recording...'');\n await recorder.startRecording(outputPath, {\n captureCursor: true,\n includeMicrophone: false,\n includeSystemAudio: false\n });\n \n console.log(''โœ… AVFoundation recording started!'');\n \n setTimeout(async () => {\n try {\n console.log(''Stopping recording...'');\n await recorder.stopRecording();\n console.log(''โœ… AVFoundation recording stopped!'');\n process.exit(0);\n } catch (error) {\n console.error(''โŒ Stop failed:'', error.message);\n process.exit(1);\n }\n }, 3000);\n \n } catch (error) {\n console.error(''โŒ AVFoundation recording failed:'', error.message);\n process.exit(1);\n }\n}\n\ntestFallback();\n\")"
12
13
  ],
13
14
  "deny": [],
14
15
  "ask": []
package/CLAUDE.md CHANGED
@@ -131,18 +131,20 @@ The MacRecorder class emits the following events:
131
131
 
132
132
  ### Platform Requirements & Framework Selection
133
133
 
134
- **SCREENCAPTUREKIT-FIRST ARCHITECTURE:**
135
- - **Primary Target**: ScreenCaptureKit for consistent behavior across all environments
136
- - **Support**: Both Electron.js applications and Node.js standalone applications
137
- - macOS 12.3+ only (ScreenCaptureKit requirement)
134
+ **ELECTRON-FIRST ARCHITECTURE:**
135
+ - **Primary Target**: Electron.js applications (full support, no restrictions)
136
+ - **Secondary**: Node.js standalone applications
137
+ - macOS only (enforced in install.js)
138
138
  - Native module compilation required on install
139
- - Requires screen recording permissions
139
+ - Requires screen recording and accessibility permissions
140
140
 
141
- **Framework Selection Logic (ScreenCaptureKit Priority):**
142
- - **macOS 12.3+ + Electron**: ScreenCaptureKit with full capabilities
143
- - **macOS 12.3+ + Node.js**: ScreenCaptureKit with full capabilities
144
- - **macOS < 12.3**: Not supported (requires macOS 12.3+ for ScreenCaptureKit)
145
- - **AVFoundation**: Available only as fallback with FORCE_AVFOUNDATION environment variable
141
+ **Framework Selection Logic (Electron Priority):**
142
+ - **macOS 15+ + Electron**: ScreenCaptureKit with full capabilities
143
+ - **macOS 15+ + Node.js**: ScreenCaptureKit with full capabilities
144
+ - **macOS 14 + Electron**: AVFoundation with full capabilities
145
+ - **macOS 13 + Electron**: AVFoundation with limited features
146
+ - **macOS 14 + Node.js**: AVFoundation with full capabilities
147
+ - **macOS 13 + Node.js**: AVFoundation with limited features
146
148
 
147
149
  ### File Outputs
148
150
 
@@ -177,13 +179,14 @@ The module tries loading from `build/Release/` first, then falls back to `build/
177
179
 
178
180
  ### **โšก CRITICAL IMPLEMENTATION NOTES**
179
181
 
180
- **SCREENCAPTUREKIT-FIRST DESIGN:**
181
- 1. **Unified Framework**: ScreenCaptureKit is used for all macOS 12.3+ environments (Electron + Node.js)
182
- 2. **Simplified Architecture**: Single framework reduces complexity and maintenance overhead
183
- 3. **Environment Agnostic**: Both Electron and Node.js use the same ScreenCaptureKit implementation
184
- 4. **macOS Compatibility**:
185
- - macOS 12.3+ (Monterey+): Use ScreenCaptureKit for all features
186
- - macOS < 12.3: Not supported (upgrade required)
187
- 5. **Fallback**: AVFoundation available only with FORCE_AVFOUNDATION environment variable
188
-
189
- **CONSISTENT BEHAVIOR ACROSS ENVIRONMENTS** - Single framework ensures predictable results.
182
+ **ELECTRON.JS IS THE PRIMARY TARGET:**
183
+ 1. **No Electron Restrictions**: All Electron detection logic is for optimization, NOT blocking
184
+ 2. **Framework Support**: Both ScreenCaptureKit and AVFoundation work perfectly in Electron
185
+ 3. **Environment Detection**: Code detects Electron to provide enhanced logging and optimization
186
+ 4. **macOS Compatibility**:
187
+ - macOS 15+ (Sequoia+): Use ScreenCaptureKit for best performance
188
+ - macOS 14 (Sonoma): Use AVFoundation with full feature set
189
+ - macOS 13 (Ventura): Use AVFoundation with basic features
190
+ 5. **Error Handling**: Any "Recording failed to start" errors should trigger fallback logic, never blocking
191
+
192
+ **NEVER BLOCK ELECTRON ENVIRONMENTS** - This is a core design principle.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-mac-recorder",
3
- "version": "2.19.1",
3
+ "version": "2.19.2",
4
4
  "description": "Native macOS screen recording package for Node.js applications",
5
5
  "main": "index.js",
6
6
  "keywords": [
@@ -192,25 +192,27 @@ Napi::Value StartRecording(const Napi::CallbackInfo& info) {
192
192
 
193
193
  // Check macOS version for ScreenCaptureKit compatibility
194
194
  NSOperatingSystemVersion osVersion = [[NSProcessInfo processInfo] operatingSystemVersion];
195
- BOOL isM12_3Plus = (osVersion.majorVersion > 12) ||
196
- (osVersion.majorVersion == 12 && osVersion.minorVersion >= 3);
197
-
198
- NSLog(@"๐Ÿ–ฅ๏ธ macOS Version: %ld.%ld.%ld",
195
+ BOOL isM15Plus = (osVersion.majorVersion >= 15);
196
+ BOOL isM14Plus = (osVersion.majorVersion >= 14);
197
+ BOOL isM13Plus = (osVersion.majorVersion >= 13);
198
+
199
+ NSLog(@"๐Ÿ–ฅ๏ธ macOS Version: %ld.%ld.%ld",
199
200
  (long)osVersion.majorVersion, (long)osVersion.minorVersion, (long)osVersion.patchVersion);
200
-
201
- // Force AVFoundation for debugging/testing (still available but discouraged)
201
+
202
+ // Force AVFoundation for debugging/testing
202
203
  BOOL forceAVFoundation = (getenv("FORCE_AVFOUNDATION") != NULL);
203
204
  if (forceAVFoundation) {
204
- NSLog(@"๐Ÿ”ง FORCE_AVFOUNDATION environment variable detected - will fallback to AVFoundation");
205
+ NSLog(@"๐Ÿ”ง FORCE_AVFOUNDATION environment variable detected - skipping ScreenCaptureKit");
205
206
  }
206
-
207
- // ScreenCaptureKit-first approach: Use ScreenCaptureKit for macOS 12.3+
208
- // This simplifies the codebase and provides consistent behavior
209
- if (isM12_3Plus && !forceAVFoundation) {
207
+
208
+ // Electron-first priority: This application is built for Electron.js
209
+ // macOS 15+ โ†’ ScreenCaptureKit (including Electron)
210
+ // macOS 14/13 โ†’ AVFoundation (including Electron)
211
+ if (isM15Plus && !forceAVFoundation) {
210
212
  if (isElectron) {
211
- NSLog(@"โšก ELECTRON: macOS 12.3+ Electron โ†’ ScreenCaptureKit with full support");
213
+ NSLog(@"โšก ELECTRON PRIORITY: macOS 15+ Electron โ†’ ScreenCaptureKit with full support");
212
214
  } else {
213
- NSLog(@"โœ… macOS 12.3+ Node.js โ†’ ScreenCaptureKit available with full compatibility");
215
+ NSLog(@"โœ… macOS 15+ Node.js โ†’ ScreenCaptureKit available with full compatibility");
214
216
  }
215
217
 
216
218
  // Try ScreenCaptureKit with extensive safety measures
@@ -285,53 +287,65 @@ Napi::Value StartRecording(const Napi::CallbackInfo& info) {
285
287
  // If we reach here, ScreenCaptureKit failed, so fall through to AVFoundation
286
288
  NSLog(@"โญ๏ธ ScreenCaptureKit failed - falling back to AVFoundation");
287
289
  } else {
288
- // macOS < 12.3 or forced AVFoundation โ†’ Use AVFoundation as fallback
289
- if (!isM12_3Plus) {
290
- NSLog(@"โŒ macOS version too old (< 12.3) - ScreenCaptureKit not supported");
291
- NSLog(@"โŒ This version requires macOS 12.3+ for ScreenCaptureKit");
290
+ // macOS 14/13 or forced AVFoundation โ†’ ALWAYS use AVFoundation (Electron supported!)
291
+ if (isElectron) {
292
+ if (isM14Plus) {
293
+ NSLog(@"โšก ELECTRON PRIORITY: macOS 14/13 Electron โ†’ AVFoundation with full support");
294
+ } else if (isM13Plus) {
295
+ NSLog(@"โšก ELECTRON PRIORITY: macOS 13 Electron โ†’ AVFoundation with limited features");
296
+ }
297
+ } else {
298
+ if (isM15Plus) {
299
+ NSLog(@"๐ŸŽฏ macOS 15+ Node.js with FORCE_AVFOUNDATION โ†’ using AVFoundation");
300
+ } else if (isM14Plus) {
301
+ NSLog(@"๐ŸŽฏ macOS 14 Node.js โ†’ using AVFoundation (primary method)");
302
+ } else if (isM13Plus) {
303
+ NSLog(@"๐ŸŽฏ macOS 13 Node.js โ†’ using AVFoundation (limited features)");
304
+ }
305
+ }
306
+
307
+ if (!isM13Plus) {
308
+ NSLog(@"โŒ macOS version too old (< 13.0) - Not supported");
292
309
  return Napi::Boolean::New(env, false);
293
310
  }
294
-
295
- // Only reach here if FORCE_AVFOUNDATION is set
296
- NSLog(@"โญ๏ธ Using AVFoundation fallback (FORCE_AVFOUNDATION enabled)");
297
- }
298
-
299
- // AVFoundation recording (fallback only when FORCE_AVFOUNDATION is set)
300
- if (forceAVFoundation) {
301
- NSLog(@"๐ŸŽฅ Starting AVFoundation recording (forced fallback)...");
302
-
303
- @try {
304
- // Import AVFoundation recording functions (if available)
305
- extern bool startAVFoundationRecording(const std::string& outputPath,
306
- CGDirectDisplayID displayID,
307
- uint32_t windowID,
308
- CGRect captureRect,
309
- bool captureCursor,
310
- bool includeMicrophone,
311
- bool includeSystemAudio,
312
- NSString* audioDeviceId);
313
-
314
- bool avResult = startAVFoundationRecording(outputPath, displayID, windowID, captureRect,
315
- captureCursor, includeMicrophone, includeSystemAudio, audioDeviceId);
316
-
317
- if (avResult) {
318
- NSLog(@"๐ŸŽฅ RECORDING METHOD: AVFoundation (fallback)");
319
- NSLog(@"โœ… AVFoundation recording started successfully");
320
- g_isRecording = true;
321
- return Napi::Boolean::New(env, true);
322
- } else {
323
- NSLog(@"โŒ AVFoundation recording failed to start");
324
- NSLog(@"โŒ Check permissions and output path validity");
325
- }
326
- } @catch (NSException *avException) {
327
- NSLog(@"โŒ Exception during AVFoundation startup: %@", avException.reason);
328
- NSLog(@"โŒ Stack trace: %@", [avException callStackSymbols]);
311
+
312
+ // DIRECT AVFoundation for all environments (Node.js + Electron)
313
+ NSLog(@"โญ๏ธ Using AVFoundation directly - supports both Node.js and Electron");
314
+ }
315
+
316
+ // AVFoundation recording (either fallback from ScreenCaptureKit or direct)
317
+ NSLog(@"๐ŸŽฅ Starting AVFoundation recording...");
318
+
319
+ @try {
320
+ // Import AVFoundation recording functions (if available)
321
+ extern bool startAVFoundationRecording(const std::string& outputPath,
322
+ CGDirectDisplayID displayID,
323
+ uint32_t windowID,
324
+ CGRect captureRect,
325
+ bool captureCursor,
326
+ bool includeMicrophone,
327
+ bool includeSystemAudio,
328
+ NSString* audioDeviceId);
329
+
330
+ bool avResult = startAVFoundationRecording(outputPath, displayID, windowID, captureRect,
331
+ captureCursor, includeMicrophone, includeSystemAudio, audioDeviceId);
332
+
333
+ if (avResult) {
334
+ NSLog(@"๐ŸŽฅ RECORDING METHOD: AVFoundation");
335
+ NSLog(@"โœ… AVFoundation recording started successfully");
336
+ g_isRecording = true;
337
+ return Napi::Boolean::New(env, true);
338
+ } else {
339
+ NSLog(@"โŒ AVFoundation recording failed to start");
340
+ NSLog(@"โŒ Check permissions and output path validity");
329
341
  }
342
+ } @catch (NSException *avException) {
343
+ NSLog(@"โŒ Exception during AVFoundation startup: %@", avException.reason);
344
+ NSLog(@"โŒ Stack trace: %@", [avException callStackSymbols]);
330
345
  }
331
-
332
- // ScreenCaptureKit failed and no fallback available
333
- NSLog(@"โŒ ScreenCaptureKit recording failed - no recording available");
334
- NSLog(@"๐Ÿ’ก Ensure macOS 12.3+ and screen recording permissions are granted");
346
+
347
+ // Both ScreenCaptureKit and AVFoundation failed
348
+ NSLog(@"โŒ All recording methods failed - no recording available");
335
349
  return Napi::Boolean::New(env, false);
336
350
 
337
351
  } @catch (NSException *exception) {
@@ -876,32 +890,27 @@ Napi::Value CheckPermissions(const Napi::CallbackInfo& info) {
876
890
 
877
891
  // Check for force AVFoundation flag
878
892
  BOOL forceAVFoundation = (getenv("FORCE_AVFOUNDATION") != NULL);
879
-
880
- // Check macOS version for ScreenCaptureKit compatibility
881
- BOOL isM12_3Plus = (osVersion.majorVersion > 12) ||
882
- (osVersion.majorVersion == 12 && osVersion.minorVersion >= 3);
883
-
893
+
884
894
  // Electron detection
885
- BOOL isElectron = (NSBundle.mainBundle.bundleIdentifier &&
895
+ BOOL isElectron = (NSBundle.mainBundle.bundleIdentifier &&
886
896
  [NSBundle.mainBundle.bundleIdentifier containsString:@"electron"]) ||
887
- (NSProcessInfo.processInfo.processName &&
897
+ (NSProcessInfo.processInfo.processName &&
888
898
  [NSProcessInfo.processInfo.processName containsString:@"Electron"]) ||
889
899
  (NSProcessInfo.processInfo.environment[@"ELECTRON_RUN_AS_NODE"] != nil);
890
-
891
- NSLog(@"๐Ÿ”’ Permission check for macOS %ld.%ld.%ld",
900
+
901
+ NSLog(@"๐Ÿ”’ Permission check for macOS %ld.%ld.%ld",
892
902
  (long)osVersion.majorVersion, (long)osVersion.minorVersion, (long)osVersion.patchVersion);
893
-
894
- // Determine which framework will be used (ScreenCaptureKit-first approach)
895
- BOOL willUseScreenCaptureKit = (isM12_3Plus && !forceAVFoundation); // ScreenCaptureKit for macOS 12.3+
896
- BOOL willUseAVFoundation = (!willUseScreenCaptureKit && forceAVFoundation);
903
+
904
+ // Determine which framework will be used (Electron fully supported!)
905
+ BOOL willUseScreenCaptureKit = (isM15Plus && !forceAVFoundation); // Electron can use ScreenCaptureKit on macOS 15+
906
+ BOOL willUseAVFoundation = (!willUseScreenCaptureKit && (isM13Plus || isM14Plus));
897
907
 
898
908
  if (willUseScreenCaptureKit) {
899
909
  NSLog(@"๐ŸŽฏ Will use ScreenCaptureKit - checking ScreenCaptureKit permissions");
900
910
  } else if (willUseAVFoundation) {
901
- NSLog(@"๐ŸŽฏ Will use AVFoundation fallback - checking AVFoundation permissions");
911
+ NSLog(@"๐ŸŽฏ Will use AVFoundation - checking AVFoundation permissions");
902
912
  } else {
903
- NSLog(@"โŒ macOS version < 12.3 - ScreenCaptureKit not supported");
904
- NSLog(@"๐Ÿ’ก This version requires macOS 12.3+ for ScreenCaptureKit");
913
+ NSLog(@"โŒ No compatible recording framework available");
905
914
  return Napi::Boolean::New(env, false);
906
915
  }
907
916
 
@@ -0,0 +1 @@
1
+ [{"x":-2420,"y":919,"timestamp":80,"unixTimeMs":1758628587619,"cursorType":"text","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}}]
@@ -1 +0,0 @@
1
- [{"x":-2062,"y":527,"timestamp":217,"unixTimeMs":1758625424081,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2028,"y":513,"timestamp":236,"unixTimeMs":1758625424100,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2025,"y":512,"timestamp":318,"unixTimeMs":1758625424182,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2020,"y":510,"timestamp":336,"unixTimeMs":1758625424200,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2012,"y":508,"timestamp":356,"unixTimeMs":1758625424220,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2009,"y":507,"timestamp":377,"unixTimeMs":1758625424241,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2004,"y":505,"timestamp":398,"unixTimeMs":1758625424262,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2001,"y":504,"timestamp":421,"unixTimeMs":1758625424285,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-1999,"y":504,"timestamp":464,"unixTimeMs":1758625424328,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2010,"y":506,"timestamp":869,"unixTimeMs":1758625424733,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2022,"y":508,"timestamp":894,"unixTimeMs":1758625424758,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2048,"y":508,"timestamp":912,"unixTimeMs":1758625424776,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2103,"y":495,"timestamp":934,"unixTimeMs":1758625424798,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2158,"y":478,"timestamp":954,"unixTimeMs":1758625424818,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2254,"y":432,"timestamp":971,"unixTimeMs":1758625424835,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2293,"y":397,"timestamp":997,"unixTimeMs":1758625424861,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2359,"y":329,"timestamp":1015,"unixTimeMs":1758625424879,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2445,"y":239,"timestamp":1036,"unixTimeMs":1758625424900,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2468,"y":214,"timestamp":1054,"unixTimeMs":1758625424918,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2478,"y":198,"timestamp":1076,"unixTimeMs":1758625424940,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2494,"y":173,"timestamp":1097,"unixTimeMs":1758625424961,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2510,"y":155,"timestamp":1120,"unixTimeMs":1758625424984,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2529,"y":139,"timestamp":1139,"unixTimeMs":1758625425003,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2539,"y":128,"timestamp":1158,"unixTimeMs":1758625425022,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2541,"y":121,"timestamp":1177,"unixTimeMs":1758625425041,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2538,"y":110,"timestamp":1202,"unixTimeMs":1758625425066,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2535,"y":101,"timestamp":1228,"unixTimeMs":1758625425092,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2533,"y":98,"timestamp":1248,"unixTimeMs":1758625425112,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2517,"y":97,"timestamp":1308,"unixTimeMs":1758625425172,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2498,"y":97,"timestamp":1335,"unixTimeMs":1758625425199,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2491,"y":98,"timestamp":1358,"unixTimeMs":1758625425222,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2488,"y":99,"timestamp":1384,"unixTimeMs":1758625425248,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2487,"y":99,"timestamp":1530,"unixTimeMs":1758625425394,"cursorType":"default","type":"mousedown","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2487,"y":99,"timestamp":1547,"unixTimeMs":1758625425411,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2487,"y":99,"timestamp":1588,"unixTimeMs":1758625425452,"cursorType":"default","type":"mouseup","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2487,"y":99,"timestamp":1607,"unixTimeMs":1758625425471,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2487,"y":99,"timestamp":1670,"unixTimeMs":1758625425534,"cursorType":"default","type":"mousedown","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2487,"y":99,"timestamp":1695,"unixTimeMs":1758625425559,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2487,"y":99,"timestamp":1734,"unixTimeMs":1758625425598,"cursorType":"default","type":"mouseup","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2487,"y":99,"timestamp":1754,"unixTimeMs":1758625425618,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2483,"y":101,"timestamp":2675,"unixTimeMs":1758625426539,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2475,"y":105,"timestamp":2694,"unixTimeMs":1758625426558,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2470,"y":108,"timestamp":2715,"unixTimeMs":1758625426579,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2461,"y":113,"timestamp":2737,"unixTimeMs":1758625426601,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2430,"y":127,"timestamp":2765,"unixTimeMs":1758625426629,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2384,"y":148,"timestamp":2808,"unixTimeMs":1758625426672,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2233,"y":201,"timestamp":2839,"unixTimeMs":1758625426703,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-2074,"y":243,"timestamp":2858,"unixTimeMs":1758625426722,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-1985,"y":265,"timestamp":2878,"unixTimeMs":1758625426742,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-1942,"y":282,"timestamp":2899,"unixTimeMs":1758625426763,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-1920,"y":296,"timestamp":2918,"unixTimeMs":1758625426782,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-1916,"y":301,"timestamp":2937,"unixTimeMs":1758625426801,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}},{"x":-1913,"y":303,"timestamp":2958,"unixTimeMs":1758625426822,"cursorType":"default","type":"move","coordinateSystem":"video-relative-outside","recordingType":"display","videoInfo":{"width":2048,"height":1330,"offsetX":0,"offsetY":0},"displayInfo":{"displayId":1,"width":2048,"height":1330}}]