@recallai/desktop-sdk 1.3.6 → 2.0.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/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
1
+ ### 2.0.1 [patch] (MacOS+Windows) - 2025-12-15
2
+
3
+ - Several crash fixes across macOS + windows
4
+ - Fixed an error when shutting down the sdk
5
+ - Fixed an issue capturing google meet meetings on windows when there are multiple windows
6
+ - Fixed an issue capturing teams on windows when using virtual desktops
7
+ - Streaming upload stability fixes
8
+
9
+ ### 2.0.0 [major] (MacOS+Windows) 2025-12-03
10
+
11
+ - Captured data now is streamed to the Recall API backend rather than uploading after call
12
+ - Numerous crash fixes
13
+ - URL detection improvements for Google Meet and Teams
14
+ - Fix bug in Slack detection where changing microphones would prematurely end recording
15
+ - Fix bug where switching virtual desktops could prematurely end recordings on Safari
16
+ - Fix bug where Teams pre-join room was detected as a meeting
17
+ - Fix false positive Meet detections
18
+ - Don't prompt for permission to access Teams URL database if the app doesn't have permission
19
+ - Handle audio device errors more gracefully on Windows
20
+ - Support for Speechmatics realtime transcription
21
+ - Mitigation for cases when ScreenCaptureKit locks up
22
+
1
23
  ### 1.3.6 [patch] (Windows) - 2025-11-18
2
24
 
3
25
  - Fixed an issue that would cause audio to not process properly depending on recording config.
@@ -105,4 +127,4 @@
105
127
 
106
128
  ### 1.0.0 [major] (MacOS+Windows) - 2025-07-24 (deprecated)
107
129
 
108
- - Initial Changelog Entry
130
+ - Initial Changelog Entry
package/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type RecallAiSdkEvent = RecordingStartEvent | RecordingStopEvent | UploadProgressEvent | MeetingDetectedEvent | MeetingUpdatedEvent | MeetingClosedEvent | SdkStateChangeEvent | ErrorEvent | MediaCaptureStatusEvent | ParticipantCaptureStatusEvent | PermissionsGrantedEvent | RealtimeEvent | ShutdownEvent;
1
+ export type RecallAiSdkEvent = RecordingStartEvent | RecordingStopEvent | UploadProgressEvent | MeetingDetectedEvent | MeetingUpdatedEvent | MeetingClosedEvent | SdkStateChangeEvent | ErrorEvent | MediaCaptureStatusEvent | ParticipantCaptureStatusEvent | PermissionsGrantedEvent | RealtimeEvent | ShutdownEvent | LogEvent;
2
2
  export type EventTypeToPayloadMap = {
3
3
  'recording-started': RecordingStartEvent;
4
4
  'recording-ended': RecordingStopEvent;
@@ -14,13 +14,14 @@ export type EventTypeToPayloadMap = {
14
14
  'permission-status': PermissionStatusEvent;
15
15
  'realtime-event': RealtimeEvent;
16
16
  'shutdown': ShutdownEvent;
17
+ 'log': LogEvent;
17
18
  };
18
19
  export type Permission = 'accessibility' | 'screen-capture' | 'microphone' | 'system-audio' | 'full-disk-access';
19
20
  export interface RecallAiSdkWindow {
20
21
  id: string;
21
22
  title?: string;
22
23
  url?: string;
23
- platform: string;
24
+ platform?: string;
24
25
  }
25
26
  export interface RecallAiSdkConfig {
26
27
  api_url?: string;
@@ -103,6 +104,13 @@ export interface ShutdownEvent {
103
104
  code: number;
104
105
  signal: string;
105
106
  }
107
+ export interface LogEvent {
108
+ level: 'debug' | 'info' | 'warning' | 'error';
109
+ message: string;
110
+ subsystem: string;
111
+ category: string;
112
+ window_id: string;
113
+ }
106
114
  export declare function init(options: RecallAiSdkConfig): Promise<null>;
107
115
  export declare function shutdown(): Promise<null>;
108
116
  export declare function dumpAXTree(procName: string): Promise<any>;
package/index.js CHANGED
@@ -74,8 +74,16 @@ const pendingCommands = {};
74
74
  let lastOptions;
75
75
  let remainingAutomaticRestarts = 10;
76
76
  let unexpectedShutdown = false;
77
+ let exiting = false;
77
78
  let logBuffer = [];
78
79
  let logIndex = 0;
80
+ process.on("exit", () => {
81
+ exiting = true;
82
+ if (proc && !proc.killed) {
83
+ proc.kill();
84
+ proc = null;
85
+ }
86
+ });
79
87
  function appendError(error) {
80
88
  lastErrorOut.push(error);
81
89
  if (lastErrorOut.length > 100) {
@@ -172,7 +180,7 @@ function logError(...log) {
172
180
  doLog("error", log);
173
181
  }
174
182
  function emitEvent(type, payload) {
175
- if (type !== "upload-progress" && type !== "realtime-event") {
183
+ if (type !== "upload-progress" && type !== "realtime-event" && type !== "log") {
176
184
  doLog("info", ["Receiving event: " + type + " | " + sortedStringify(payload)], false);
177
185
  }
178
186
  for (const listener of listeners) {
@@ -204,6 +212,16 @@ function startProcess() {
204
212
  if (process.platform === "win32" && process.env.GLOBAL_GST_RECALL !== "1") {
205
213
  envExtra["GST_PLUGIN_PATH"] = path.join(path.dirname(exe_path), "gstreamer-1.0");
206
214
  }
215
+ if (process.platform === "darwin") {
216
+ try {
217
+ const electron = require('electron');
218
+ envExtra["EXE_NAME"] = electron?.app?.getBundleID?.();
219
+ }
220
+ catch { }
221
+ }
222
+ if (!envExtra["EXE_NAME"]) {
223
+ envExtra["EXE_NAME"] = path.basename(process.execPath);
224
+ }
207
225
  const gst_dump_dir = process.env.RECALLAI_DESKTOP_SDK_DEV ? path.join(os.tmpdir(), "gst.nocommit") : os.tmpdir();
208
226
  if (!fs.existsSync(gst_dump_dir)) {
209
227
  try {
@@ -216,7 +234,7 @@ function startProcess() {
216
234
  proc = (0, child_process_1.spawn)(exe_path, {
217
235
  stdio: (process.platform === "darwin" ? ["pipe", "pipe", "pipe", "pipe"] : "pipe"),
218
236
  env: {
219
- GST_DEBUG: "2",
237
+ GST_DEBUG: "2,transcriber:4,rtewebsocketsink:4,rtewebhooksink:4,audiomixer:4,galleryview:4,dsdks3sink:5",
220
238
  GST_DEBUG_DUMP_DOT_DIR: gst_dump_dir,
221
239
  RUST_BACKTRACE: "1",
222
240
  // "DYLD_INSERT_LIBRARIES":"/opt/homebrew/lib/libjemalloc.dylib",
@@ -291,7 +309,7 @@ function startProcess() {
291
309
  rlStderr?.close();
292
310
  rlStdout = null;
293
311
  rlStderr = null;
294
- if (code === 0 || signal === 'SIGINT') {
312
+ if (code === 0 || signal === 'SIGINT' || exiting) {
295
313
  return;
296
314
  }
297
315
  logError(`Desktop SDK: Process exited with code ${code}, signal ${signal}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@recallai/desktop-sdk",
3
- "version": "1.3.6",
3
+ "version": "2.0.1",
4
4
  "description": "Recall Desktop SDK",
5
5
  "main": "./index.js",
6
6
  "types": "./index.d.ts",
@@ -20,5 +20,5 @@
20
20
  "@types/node": "^24.2.0",
21
21
  "typescript": "^5.3.3"
22
22
  },
23
- "commit_sha": "9cbe3a761e402d2dbfd2cb8e43749a76d776e51f"
23
+ "commit_sha": "4cedfc8f22df6b62dbb38dec3c21983ff3bf383c"
24
24
  }