node-mac-recorder 2.19.0 → 2.19.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.
@@ -6,7 +6,9 @@
6
6
  "Bash(jq:*)",
7
7
  "Bash(FORCE_AVFOUNDATION=1 timeout 15 node test-cursor-position.js)",
8
8
  "Bash(FORCE_AVFOUNDATION=1 timeout 8 node test-cursor-debug.js)",
9
- "Bash(FORCE_AVFOUNDATION=1 timeout 5 node test-cursor-debug.js)"
9
+ "Bash(FORCE_AVFOUNDATION=1 timeout 5 node test-cursor-debug.js)",
10
+ "Bash(FORCE_AVFOUNDATION=1 timeout 8 node test-unified-cursor.js)",
11
+ "Bash(FORCE_AVFOUNDATION=1 timeout 5 node test-unified-cursor.js)"
10
12
  ],
11
13
  "deny": [],
12
14
  "ask": []
package/CLAUDE.md CHANGED
@@ -131,20 +131,18 @@ The MacRecorder class emits the following events:
131
131
 
132
132
  ### Platform Requirements & Framework Selection
133
133
 
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)
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)
138
138
  - Native module compilation required on install
139
- - Requires screen recording and accessibility permissions
139
+ - Requires screen recording permissions
140
140
 
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
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
148
146
 
149
147
  ### File Outputs
150
148
 
@@ -179,14 +177,13 @@ The module tries loading from `build/Release/` first, then falls back to `build/
179
177
 
180
178
  ### **⚡ CRITICAL IMPLEMENTATION NOTES**
181
179
 
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.
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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-mac-recorder",
3
- "version": "2.19.0",
3
+ "version": "2.19.1",
4
4
  "description": "Native macOS screen recording package for Node.js applications",
5
5
  "main": "index.js",
6
6
  "keywords": [
@@ -192,27 +192,25 @@ 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 isM15Plus = (osVersion.majorVersion >= 15);
196
- BOOL isM14Plus = (osVersion.majorVersion >= 14);
197
- BOOL isM13Plus = (osVersion.majorVersion >= 13);
198
-
199
- NSLog(@"🖥️ macOS Version: %ld.%ld.%ld",
195
+ BOOL isM12_3Plus = (osVersion.majorVersion > 12) ||
196
+ (osVersion.majorVersion == 12 && osVersion.minorVersion >= 3);
197
+
198
+ NSLog(@"🖥️ macOS Version: %ld.%ld.%ld",
200
199
  (long)osVersion.majorVersion, (long)osVersion.minorVersion, (long)osVersion.patchVersion);
201
-
202
- // Force AVFoundation for debugging/testing
200
+
201
+ // Force AVFoundation for debugging/testing (still available but discouraged)
203
202
  BOOL forceAVFoundation = (getenv("FORCE_AVFOUNDATION") != NULL);
204
203
  if (forceAVFoundation) {
205
- NSLog(@"🔧 FORCE_AVFOUNDATION environment variable detected - skipping ScreenCaptureKit");
204
+ NSLog(@"🔧 FORCE_AVFOUNDATION environment variable detected - will fallback to AVFoundation");
206
205
  }
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) {
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) {
212
210
  if (isElectron) {
213
- NSLog(@"⚡ ELECTRON PRIORITY: macOS 15+ Electron → ScreenCaptureKit with full support");
211
+ NSLog(@"⚡ ELECTRON: macOS 12.3+ Electron → ScreenCaptureKit with full support");
214
212
  } else {
215
- NSLog(@"✅ macOS 15+ Node.js → ScreenCaptureKit available with full compatibility");
213
+ NSLog(@"✅ macOS 12.3+ Node.js → ScreenCaptureKit available with full compatibility");
216
214
  }
217
215
 
218
216
  // Try ScreenCaptureKit with extensive safety measures
@@ -287,65 +285,53 @@ Napi::Value StartRecording(const Napi::CallbackInfo& info) {
287
285
  // If we reach here, ScreenCaptureKit failed, so fall through to AVFoundation
288
286
  NSLog(@"⏭️ ScreenCaptureKit failed - falling back to AVFoundation");
289
287
  } else {
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");
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");
309
292
  return Napi::Boolean::New(env, false);
310
293
  }
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");
341
- }
342
- } @catch (NSException *avException) {
343
- NSLog(@"❌ Exception during AVFoundation startup: %@", avException.reason);
344
- NSLog(@"❌ Stack trace: %@", [avException callStackSymbols]);
294
+
295
+ // Only reach here if FORCE_AVFOUNDATION is set
296
+ NSLog(@"⏭️ Using AVFoundation fallback (FORCE_AVFOUNDATION enabled)");
345
297
  }
346
298
 
347
- // Both ScreenCaptureKit and AVFoundation failed
348
- NSLog(@"❌ All recording methods failed - no recording available");
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]);
329
+ }
330
+ }
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");
349
335
  return Napi::Boolean::New(env, false);
350
336
 
351
337
  } @catch (NSException *exception) {
@@ -890,27 +876,32 @@ Napi::Value CheckPermissions(const Napi::CallbackInfo& info) {
890
876
 
891
877
  // Check for force AVFoundation flag
892
878
  BOOL forceAVFoundation = (getenv("FORCE_AVFOUNDATION") != NULL);
893
-
879
+
880
+ // Check macOS version for ScreenCaptureKit compatibility
881
+ BOOL isM12_3Plus = (osVersion.majorVersion > 12) ||
882
+ (osVersion.majorVersion == 12 && osVersion.minorVersion >= 3);
883
+
894
884
  // Electron detection
895
- BOOL isElectron = (NSBundle.mainBundle.bundleIdentifier &&
885
+ BOOL isElectron = (NSBundle.mainBundle.bundleIdentifier &&
896
886
  [NSBundle.mainBundle.bundleIdentifier containsString:@"electron"]) ||
897
- (NSProcessInfo.processInfo.processName &&
887
+ (NSProcessInfo.processInfo.processName &&
898
888
  [NSProcessInfo.processInfo.processName containsString:@"Electron"]) ||
899
889
  (NSProcessInfo.processInfo.environment[@"ELECTRON_RUN_AS_NODE"] != nil);
900
-
901
- NSLog(@"🔒 Permission check for macOS %ld.%ld.%ld",
890
+
891
+ NSLog(@"🔒 Permission check for macOS %ld.%ld.%ld",
902
892
  (long)osVersion.majorVersion, (long)osVersion.minorVersion, (long)osVersion.patchVersion);
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));
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);
907
897
 
908
898
  if (willUseScreenCaptureKit) {
909
899
  NSLog(@"🎯 Will use ScreenCaptureKit - checking ScreenCaptureKit permissions");
910
900
  } else if (willUseAVFoundation) {
911
- NSLog(@"🎯 Will use AVFoundation - checking AVFoundation permissions");
901
+ NSLog(@"🎯 Will use AVFoundation fallback - checking AVFoundation permissions");
912
902
  } else {
913
- NSLog(@"❌ No compatible recording framework available");
903
+ NSLog(@"❌ macOS version < 12.3 - ScreenCaptureKit not supported");
904
+ NSLog(@"💡 This version requires macOS 12.3+ for ScreenCaptureKit");
914
905
  return Napi::Boolean::New(env, false);
915
906
  }
916
907
 
@@ -0,0 +1 @@
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}}]