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.
- package/.claude/settings.local.json +3 -1
- package/CLAUDE.md +20 -23
- package/package.json +1 -1
- package/src/mac_recorder.mm +72 -81
- package/temp_cursor_1758625423860.json +1 -0
|
@@ -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
|
-
**
|
|
135
|
-
- **Primary Target**:
|
|
136
|
-
- **
|
|
137
|
-
- macOS only (
|
|
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
|
|
139
|
+
- Requires screen recording permissions
|
|
140
140
|
|
|
141
|
-
**Framework Selection Logic (
|
|
142
|
-
- **macOS
|
|
143
|
-
- **macOS
|
|
144
|
-
- **macOS
|
|
145
|
-
- **
|
|
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
|
-
**
|
|
183
|
-
1. **
|
|
184
|
-
2. **
|
|
185
|
-
3. **Environment
|
|
186
|
-
4. **macOS Compatibility**:
|
|
187
|
-
- macOS
|
|
188
|
-
- macOS
|
|
189
|
-
|
|
190
|
-
|
|
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
package/src/mac_recorder.mm
CHANGED
|
@@ -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
|
|
196
|
-
|
|
197
|
-
|
|
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 -
|
|
204
|
+
NSLog(@"🔧 FORCE_AVFOUNDATION environment variable detected - will fallback to AVFoundation");
|
|
206
205
|
}
|
|
207
|
-
|
|
208
|
-
//
|
|
209
|
-
//
|
|
210
|
-
|
|
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
|
|
211
|
+
NSLog(@"⚡ ELECTRON: macOS 12.3+ Electron → ScreenCaptureKit with full support");
|
|
214
212
|
} else {
|
|
215
|
-
NSLog(@"✅ macOS
|
|
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
|
|
291
|
-
if (
|
|
292
|
-
|
|
293
|
-
|
|
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
|
-
//
|
|
313
|
-
NSLog(@"⏭️ Using AVFoundation
|
|
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
|
-
//
|
|
348
|
-
|
|
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 (
|
|
905
|
-
BOOL willUseScreenCaptureKit = (
|
|
906
|
-
BOOL willUseAVFoundation = (!willUseScreenCaptureKit &&
|
|
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(@"❌
|
|
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}}]
|