@abitat_reece/host-daemon 0.1.21 → 0.1.22

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.
@@ -4,7 +4,9 @@ import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
5
  import { promisify } from "node:util";
6
6
  const runExecFile = promisify(execFileCallback);
7
- const CAPTURE_WIDTH = 1170;
7
+ const CAPTURE_WIDTH = 1280;
8
+ const FRAME_JPEG_QUALITY = 22;
9
+ const SCREEN_DIMENSION_PROBE_INTERVAL_FRAMES = 30;
8
10
  const DEFAULT_DISPLAY_WIDTH = 1440;
9
11
  const DEFAULT_DISPLAY_HEIGHT = 900;
10
12
  export function createMacOsRemoteControlDriver(options = {}) {
@@ -23,17 +25,19 @@ export function createMacOsRemoteControlDriver(options = {}) {
23
25
  const framePath = capturePath(session.id, "frame.jpg");
24
26
  try {
25
27
  await execFile("/usr/sbin/screencapture", ["-x", "-C", "-t", "jpg", rawPath]);
26
- const rawDimensions = await execFile("/usr/bin/sips", [
27
- "-g",
28
- "pixelWidth",
29
- "-g",
30
- "pixelHeight",
31
- rawPath
32
- ]);
33
- screenSize = {
34
- height: numberFromSips(rawDimensions.stdout, "pixelHeight") ?? screenSize.height,
35
- width: numberFromSips(rawDimensions.stdout, "pixelWidth") ?? screenSize.width
36
- };
28
+ if (shouldProbeScreenDimensions(sequence)) {
29
+ const rawDimensions = await execFile("/usr/bin/sips", [
30
+ "-g",
31
+ "pixelWidth",
32
+ "-g",
33
+ "pixelHeight",
34
+ rawPath
35
+ ]);
36
+ screenSize = {
37
+ height: numberFromSips(rawDimensions.stdout, "pixelHeight") ?? screenSize.height,
38
+ width: numberFromSips(rawDimensions.stdout, "pixelWidth") ?? screenSize.width
39
+ };
40
+ }
37
41
  await execFile("/usr/bin/sips", [
38
42
  "-Z",
39
43
  String(CAPTURE_WIDTH),
@@ -42,27 +46,21 @@ export function createMacOsRemoteControlDriver(options = {}) {
42
46
  "jpeg",
43
47
  "-s",
44
48
  "formatOptions",
45
- "35",
49
+ String(FRAME_JPEG_QUALITY),
46
50
  rawPath,
47
51
  "--out",
48
52
  framePath
49
53
  ]);
50
- const dimensions = await execFile("/usr/bin/sips", [
51
- "-g",
52
- "pixelWidth",
53
- "-g",
54
- "pixelHeight",
55
- framePath
56
- ]);
57
54
  const image = await readFrameFile(framePath);
55
+ const frameSize = scaledFrameSize(screenSize);
58
56
  sequence += 1;
59
57
  return {
60
58
  capturedAt: now().toISOString(),
61
59
  dataBase64: image.toString("base64"),
62
- height: numberFromSips(dimensions.stdout, "pixelHeight") ?? DEFAULT_DISPLAY_HEIGHT,
60
+ height: frameSize.height,
63
61
  mimeType: "image/jpeg",
64
62
  sequence,
65
- width: numberFromSips(dimensions.stdout, "pixelWidth") ?? CAPTURE_WIDTH
63
+ width: frameSize.width
66
64
  };
67
65
  }
68
66
  catch (error) {
@@ -77,18 +75,51 @@ export function createMacOsRemoteControlDriver(options = {}) {
77
75
  },
78
76
  async applyInput(_session, event) {
79
77
  try {
80
- await execFile("/usr/bin/osascript", osascriptArgsForInput(event, screenSize));
78
+ const result = await execFile("/usr/bin/osascript", osascriptArgsForInput(event, screenSize));
79
+ return (cursorPositionFromStdout(result.stdout, screenSize) ??
80
+ cursorPositionForDeterministicInput(event));
81
81
  }
82
82
  catch (error) {
83
83
  throw normalizeInputError(error);
84
84
  }
85
85
  },
86
- async closeSession() { }
86
+ async closeSession() { },
87
+ async getCursorPosition() {
88
+ const result = await execFile("/usr/bin/osascript", [
89
+ "-l",
90
+ "JavaScript",
91
+ "-e",
92
+ javaScriptForCurrentCursorPosition()
93
+ ]);
94
+ return cursorPositionFromStdout(result.stdout, screenSize)?.cursorPosition ?? null;
95
+ },
96
+ async getTextInputTarget() {
97
+ try {
98
+ const result = await execFile("/usr/bin/osascript", [
99
+ "-e",
100
+ appleScriptForFocusedTextTarget()
101
+ ]);
102
+ return textInputTargetFromStdout(result.stdout);
103
+ }
104
+ catch (error) {
105
+ throw normalizeInputError(error);
106
+ }
107
+ }
87
108
  };
88
109
  }
89
110
  function osascriptArgsForInput(event, screenSize) {
90
111
  if (event.type === "pointer" && event.phase === "move") {
91
- return ["-l", "JavaScript", "-e", javaScriptForPointerMove(event, screenSize)];
112
+ return [
113
+ "-l",
114
+ "JavaScript",
115
+ "-e",
116
+ hasPointerDelta(event)
117
+ ? javaScriptForRelativePointerMove(event)
118
+ : javaScriptForPointerMove(event)
119
+ ];
120
+ }
121
+ if (event.type === "pointer" && event.phase === "up" && hasPointerDelta(event)) {
122
+ return ["-l", "JavaScript", "-e", javaScriptForCurrentPointerClick(event)];
92
123
  }
93
124
  return ["-e", appleScriptForInput(event, screenSize)];
94
125
  }
@@ -97,6 +128,21 @@ function appleScriptForInput(event, screenSize) {
97
128
  return `tell application "System Events" to keystroke ${JSON.stringify(event.value)}`;
98
129
  }
99
130
  if (event.type === "key") {
131
+ if (event.key === "dock") {
132
+ return "tell application \"System Events\" to key code 2 using {command down, option down}";
133
+ }
134
+ if (event.key === "enter") {
135
+ return "tell application \"System Events\" to key code 36";
136
+ }
137
+ if (event.key === "mission-control") {
138
+ return "tell application \"System Events\" to key code 126 using {control down}";
139
+ }
140
+ if (event.key === "mission-control-left") {
141
+ return "tell application \"System Events\" to key code 123 using {control down}";
142
+ }
143
+ if (event.key === "mission-control-right") {
144
+ return "tell application \"System Events\" to key code 124 using {control down}";
145
+ }
100
146
  const modifierPrefix = event.modifiers.length
101
147
  ? ` using {${event.modifiers.map(appleScriptModifier).join(", ")}}`
102
148
  : "";
@@ -113,18 +159,235 @@ function appleScriptForInput(event, screenSize) {
113
159
  }
114
160
  return `tell application "System Events" to delay 0`;
115
161
  }
116
- function javaScriptForPointerMove(event, screenSize) {
117
- const point = screenPoint(event, screenSize);
162
+ function appleScriptForFocusedTextTarget() {
163
+ return [
164
+ 'tell application "System Events"',
165
+ " set frontApp to first application process whose frontmost is true",
166
+ " set appName to name of frontApp",
167
+ " try",
168
+ ' set focusedElement to value of attribute "AXFocusedUIElement" of frontApp',
169
+ " on error errorMessage",
170
+ ' if errorMessage contains "not allowed" or errorMessage contains "not authorized" or errorMessage contains "assistive" or errorMessage contains "permission" then error errorMessage',
171
+ ' return appName & linefeed & "" & linefeed & "" & linefeed & ""',
172
+ " end try",
173
+ ' set roleValue to ""',
174
+ " try",
175
+ ' set roleValue to value of attribute "AXRole" of focusedElement as text',
176
+ " end try",
177
+ ' set subroleValue to ""',
178
+ " try",
179
+ ' set subroleValue to value of attribute "AXSubrole" of focusedElement as text',
180
+ " end try",
181
+ ' set roleDescriptionValue to ""',
182
+ " try",
183
+ ' set roleDescriptionValue to value of attribute "AXRoleDescription" of focusedElement as text',
184
+ " end try",
185
+ " return appName & linefeed & roleValue & linefeed & subroleValue & linefeed & roleDescriptionValue",
186
+ "end tell"
187
+ ].join("\n");
188
+ }
189
+ function javaScriptForPointerMove(event) {
118
190
  return [
119
191
  'ObjC.import("CoreGraphics");',
120
- `$.CGWarpMouseCursorPosition($.CGPointMake(${point.x}, ${point.y}));`,
121
- "$.CGAssociateMouseAndMouseCursorPosition(true);"
192
+ 'ObjC.import("AppKit");',
193
+ javaScriptCursorSnapshotHelpers(),
194
+ `const targetPoint = targetPointFromNormalized(${clamp01(event.x)}, ${clamp01(event.y)});`,
195
+ "$.CGWarpMouseCursorPosition($.CGPointMake(targetPoint.x, targetPoint.y));",
196
+ "$.CGAssociateMouseAndMouseCursorPosition(true);",
197
+ "cursorPositionSnapshot();"
198
+ ].join("\n");
199
+ }
200
+ function javaScriptForRelativePointerMove(event) {
201
+ return [
202
+ 'ObjC.import("CoreGraphics");',
203
+ 'ObjC.import("AppKit");',
204
+ javaScriptCursorSnapshotHelpers(),
205
+ "const bounds = desktopBounds();",
206
+ "const currentEvent = $.CGEventCreate(null);",
207
+ "const point = $.CGEventGetLocation(currentEvent);",
208
+ `const targetX = Math.max(bounds.x, Math.min(bounds.x + bounds.width, point.x + bounds.width * ${event.dx ?? 0}));`,
209
+ `const targetY = Math.max(bounds.y, Math.min(bounds.y + bounds.height, point.y + bounds.height * ${event.dy ?? 0}));`,
210
+ "$.CGWarpMouseCursorPosition($.CGPointMake(targetX, targetY));",
211
+ "$.CGAssociateMouseAndMouseCursorPosition(true);",
212
+ "cursorPositionSnapshot();"
213
+ ].join("\n");
214
+ }
215
+ function javaScriptForCurrentPointerClick(event) {
216
+ const isRightClick = event.buttons === 2;
217
+ const button = isRightClick ? "$.kCGMouseButtonRight" : "$.kCGMouseButtonLeft";
218
+ const downEvent = isRightClick ? "$.kCGEventRightMouseDown" : "$.kCGEventLeftMouseDown";
219
+ const upEvent = isRightClick ? "$.kCGEventRightMouseUp" : "$.kCGEventLeftMouseUp";
220
+ const clickCount = Math.max(1, Math.min(3, Math.trunc(event.clickCount ?? 1)));
221
+ return [
222
+ 'ObjC.import("CoreGraphics");',
223
+ 'ObjC.import("AppKit");',
224
+ javaScriptCursorSnapshotHelpers(),
225
+ "const currentEvent = $.CGEventCreate(null);",
226
+ "const point = $.CGEventGetLocation(currentEvent);",
227
+ `const clickCount = ${clickCount};`,
228
+ "for (let clickIndex = 1; clickIndex <= clickCount; clickIndex += 1) {",
229
+ ` const mouseDown = $.CGEventCreateMouseEvent(null, ${downEvent}, point, ${button});`,
230
+ ` const mouseUp = $.CGEventCreateMouseEvent(null, ${upEvent}, point, ${button});`,
231
+ " $.CGEventSetIntegerValueField(mouseDown, $.kCGMouseEventClickState, clickIndex);",
232
+ " $.CGEventSetIntegerValueField(mouseUp, $.kCGMouseEventClickState, clickIndex);",
233
+ " $.CGEventPost($.kCGHIDEventTap, mouseDown);",
234
+ " $.CGEventPost($.kCGHIDEventTap, mouseUp);",
235
+ "}",
236
+ "cursorPositionSnapshot();"
237
+ ].join("\n");
238
+ }
239
+ function javaScriptForCurrentCursorPosition() {
240
+ return [
241
+ 'ObjC.import("AppKit");',
242
+ javaScriptCursorSnapshotHelpers(),
243
+ "cursorPositionSnapshot();"
244
+ ].join("\n");
245
+ }
246
+ function javaScriptCursorSnapshotHelpers() {
247
+ return [
248
+ "function desktopBounds() {",
249
+ " const screens = $.NSScreen.screens;",
250
+ " const mainScreenHeight = $.NSScreen.mainScreen.frame.size.height;",
251
+ " let minX = Infinity;",
252
+ " let minY = Infinity;",
253
+ " let maxX = -Infinity;",
254
+ " let maxY = -Infinity;",
255
+ " for (let i = 0; i < screens.count; i += 1) {",
256
+ " const frame = screens.objectAtIndex(i).frame;",
257
+ " minX = Math.min(minX, frame.origin.x);",
258
+ " minY = Math.min(minY, frame.origin.y);",
259
+ " maxX = Math.max(maxX, frame.origin.x + frame.size.width);",
260
+ " maxY = Math.max(maxY, frame.origin.y + frame.size.height);",
261
+ " }",
262
+ " return {",
263
+ " x: minX,",
264
+ " y: mainScreenHeight - maxY,",
265
+ " width: maxX - minX,",
266
+ " height: maxY - minY",
267
+ " };",
268
+ "}",
269
+ "function targetPointFromNormalized(x, y) {",
270
+ " const bounds = desktopBounds();",
271
+ " return {",
272
+ " x: bounds.x + Math.max(0, Math.min(1, x)) * bounds.width,",
273
+ " y: bounds.y + Math.max(0, Math.min(1, y)) * bounds.height",
274
+ " };",
275
+ "}",
276
+ "function cursorPositionSnapshot() {",
277
+ " const currentEvent = $.CGEventCreate(null);",
278
+ " const point = $.CGEventGetLocation(currentEvent);",
279
+ " const bounds = desktopBounds();",
280
+ " return JSON.stringify({",
281
+ " x: point.x,",
282
+ " y: point.y,",
283
+ " bounds",
284
+ " });",
285
+ "}"
122
286
  ].join("\n");
123
287
  }
124
- function screenPoint(event, screenSize) {
288
+ function hasPointerDelta(event) {
289
+ return typeof event.dx === "number" || typeof event.dy === "number";
290
+ }
291
+ function cursorPositionForDeterministicInput(event) {
292
+ if (event.type !== "pointer" ||
293
+ (event.phase !== "move" && event.phase !== "up") ||
294
+ hasPointerDelta(event)) {
295
+ return undefined;
296
+ }
125
297
  return {
126
- x: Math.round(event.x * screenSize.width),
127
- y: Math.round(event.y * screenSize.height)
298
+ cursorPosition: {
299
+ x: clamp01(event.x),
300
+ y: clamp01(event.y)
301
+ }
302
+ };
303
+ }
304
+ function cursorPositionFromStdout(stdout, screenSize) {
305
+ const point = parsePoint(stdout);
306
+ if (!point) {
307
+ return undefined;
308
+ }
309
+ return { cursorPosition: normalizedCursorPosition(point, screenSize) };
310
+ }
311
+ function parsePoint(stdout) {
312
+ try {
313
+ const parsed = JSON.parse(stdout.trim());
314
+ return typeof parsed.x === "number" && typeof parsed.y === "number"
315
+ ? {
316
+ bounds: parseBounds(parsed.bounds),
317
+ x: parsed.x,
318
+ y: parsed.y
319
+ }
320
+ : null;
321
+ }
322
+ catch {
323
+ return null;
324
+ }
325
+ }
326
+ function parseBounds(value) {
327
+ if (!value || typeof value !== "object") {
328
+ return null;
329
+ }
330
+ const bounds = value;
331
+ return typeof bounds.x === "number" &&
332
+ typeof bounds.y === "number" &&
333
+ typeof bounds.width === "number" &&
334
+ typeof bounds.height === "number" &&
335
+ bounds.width > 0 &&
336
+ bounds.height > 0
337
+ ? {
338
+ height: bounds.height,
339
+ width: bounds.width,
340
+ x: bounds.x,
341
+ y: bounds.y
342
+ }
343
+ : null;
344
+ }
345
+ function textInputTargetFromStdout(stdout) {
346
+ const [rawAppName = "", rawRole = "", rawSubrole = "", rawRoleDescription = ""] = stdout
347
+ .replace(/\r/gu, "")
348
+ .split("\n");
349
+ const appName = rawAppName.trim();
350
+ const role = rawRole.trim();
351
+ const subrole = rawSubrole.trim();
352
+ const roleDescription = rawRoleDescription.trim();
353
+ if (!appName && !role) {
354
+ return null;
355
+ }
356
+ return {
357
+ appName: appName || "Unknown app",
358
+ isTextInput: isTextInputTarget(role, subrole, roleDescription),
359
+ role,
360
+ ...(roleDescription ? { roleDescription } : {}),
361
+ ...(subrole ? { subrole } : {})
362
+ };
363
+ }
364
+ function isTextInputTarget(role, subrole, roleDescription) {
365
+ if (["AXTextArea", "AXTextField", "AXSearchField", "AXComboBox"].includes(role)) {
366
+ return true;
367
+ }
368
+ const searchableText = `${role} ${subrole} ${roleDescription}`;
369
+ return /\b(text|search|editor|combo box)\b/iu.test(searchableText);
370
+ }
371
+ function normalizedCursorPosition(point, screenSize) {
372
+ if (point.bounds) {
373
+ return {
374
+ x: clamp01((point.x - point.bounds.x) / point.bounds.width),
375
+ y: clamp01((point.y - point.bounds.y) / point.bounds.height)
376
+ };
377
+ }
378
+ return {
379
+ x: clamp01(point.x / Math.max(1, screenSize.width)),
380
+ y: clamp01(point.y / Math.max(1, screenSize.height))
381
+ };
382
+ }
383
+ function clamp01(value) {
384
+ return Math.max(0, Math.min(1, value));
385
+ }
386
+ function scaledFrameSize(screenSize) {
387
+ const scale = Math.min(1, CAPTURE_WIDTH / Math.max(1, screenSize.width));
388
+ return {
389
+ height: Math.max(1, Math.round(screenSize.height * scale)),
390
+ width: Math.max(1, Math.round(screenSize.width * scale))
128
391
  };
129
392
  }
130
393
  function appleScriptModifier(modifier) {
@@ -146,6 +409,9 @@ function numberFromSips(output, key) {
146
409
  const match = output.match(new RegExp(`${key}:\\s*(\\d+)`, "u"));
147
410
  return match ? Number(match[1]) : null;
148
411
  }
412
+ function shouldProbeScreenDimensions(sequence) {
413
+ return sequence % SCREEN_DIMENSION_PROBE_INTERVAL_FRAMES === 0;
414
+ }
149
415
  function normalizeCaptureError(error) {
150
416
  const stderr = errorStderr(error);
151
417
  if (/screen recording|permission|not authorized|denied/iu.test(stderr)) {
@@ -1 +1 @@
1
- {"version":3,"file":"macos-driver.js","sourceRoot":"","sources":["../../../src/local-control/remote-control/macos-driver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"macos-driver.js","sourceRoot":"","sources":["../../../src/local-control/remote-control/macos-driver.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/local-control/remote-control/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAOjE,OAAO,EAAkB,KAAK,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D,UAAU,6BAA6B;IACrC,KAAK,EAAE,iBAAiB,CAAC;IACzB,WAAW,CAAC,EAAE,8BAA8B,CAAC;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,yBAAyB,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;IACzB,YAAY,EAAE,eAAe,CAAC;IAC9B,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;CAC1E;AAED,wBAAsB,6BAA6B,CAAC,KAAK,EAAE,6BAA6B,oBAoHvF"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/local-control/remote-control/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAOjE,OAAO,EAAkB,KAAK,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D,UAAU,6BAA6B;IACrC,KAAK,EAAE,iBAAiB,CAAC;IACzB,WAAW,CAAC,EAAE,8BAA8B,CAAC;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,yBAAyB,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;IACzB,YAAY,EAAE,eAAe,CAAC;IAC9B,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;CAC1E;AAED,wBAAsB,6BAA6B,CAAC,KAAK,EAAE,6BAA6B,oBAiIvF"}
@@ -62,6 +62,13 @@ export async function handleLocalRemoteControlRoute(input) {
62
62
  input.writeJson(input.response, 200, { ok: true, session });
63
63
  return true;
64
64
  }
65
+ const textTargetMatch = input.path.match(/^\/api\/remote-control\/sessions\/([^/]+)\/text-target$/u);
66
+ if (textTargetMatch && input.method === "GET") {
67
+ input.writeJson(input.response, 200, {
68
+ target: await input.manager.getTextInputTarget(decodeURIComponent(textTargetMatch[1]), input.actor.id)
69
+ });
70
+ return true;
71
+ }
65
72
  const signalMatch = input.path.match(/^\/api\/remote-control\/sessions\/([^/]+)\/signals$/u);
66
73
  if (signalMatch && input.method === "GET") {
67
74
  input.manager.getSession(decodeURIComponent(signalMatch[1]), input.actor.id);
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/local-control/remote-control/routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/local-control/remote-control/routes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../../src/local-control/remote-control/session-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAG/B,MAAM,YAAY,CAAC;AAEpB,UAAU,cAAc;IACtB,MAAM,EAAE,wBAAwB,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAWD,YAAY,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEtF,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,cAAc,GACtB,yBAAyB,CA6L3B"}
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../../src/local-control/remote-control/session-manager.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAG/B,MAAM,YAAY,CAAC;AAEpB,UAAU,cAAc;IACtB,MAAM,EAAE,wBAAwB,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAYD,YAAY,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEtF,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,cAAc,GACtB,yBAAyB,CA4Q3B"}
@@ -1,5 +1,5 @@
1
1
  import { randomUUID } from "node:crypto";
2
- const DEFAULT_FRAME_INTERVAL_MS = 300;
2
+ const DEFAULT_FRAME_INTERVAL_MS = 120;
3
3
  const stoppedStatuses = new Set(["ended", "failed"]);
4
4
  export function createLocalRemoteControlManager(options) {
5
5
  const states = new Map();
@@ -12,8 +12,15 @@ export function createLocalRemoteControlManager(options) {
12
12
  if (!state || stoppedStatuses.has(state.session.status)) {
13
13
  return;
14
14
  }
15
+ if (state.isFrameCaptureInFlight) {
16
+ return;
17
+ }
18
+ state.isFrameCaptureInFlight = true;
15
19
  try {
16
20
  const nextFrame = await options.driver.captureFrame(state.session);
21
+ if (stoppedStatuses.has(state.session.status)) {
22
+ return;
23
+ }
17
24
  state.latestFrame = nextFrame;
18
25
  state.session = {
19
26
  ...state.session,
@@ -27,6 +34,9 @@ export function createLocalRemoteControlManager(options) {
27
34
  };
28
35
  }
29
36
  catch (error) {
37
+ if (stoppedStatuses.has(state.session.status)) {
38
+ return;
39
+ }
30
40
  const permission = permissionKind(error);
31
41
  state.session = {
32
42
  ...state.session,
@@ -39,6 +49,9 @@ export function createLocalRemoteControlManager(options) {
39
49
  updatedAt: now().toISOString()
40
50
  };
41
51
  }
52
+ finally {
53
+ state.isFrameCaptureInFlight = false;
54
+ }
42
55
  }
43
56
  function startFrameLoop(state) {
44
57
  if (!state.session.screenEnabled || state.frameTimer) {
@@ -48,6 +61,7 @@ export function createLocalRemoteControlManager(options) {
48
61
  void captureNextFrame(state.session.id);
49
62
  }, frameIntervalMs);
50
63
  state.frameTimer.unref?.();
64
+ void captureNextFrame(state.session.id);
51
65
  }
52
66
  function requireSession(sessionId, clientMachineId) {
53
67
  const state = states.get(sessionId);
@@ -61,6 +75,23 @@ export function createLocalRemoteControlManager(options) {
61
75
  state.session.hostMachineId === input.hostMachineId &&
62
76
  !stoppedStatuses.has(state.session.status));
63
77
  }
78
+ async function readCursorPosition() {
79
+ if (!options.driver.getCursorPosition) {
80
+ return null;
81
+ }
82
+ try {
83
+ return await options.driver.getCursorPosition();
84
+ }
85
+ catch {
86
+ return null;
87
+ }
88
+ }
89
+ async function readTextInputTarget() {
90
+ if (!options.driver.getTextInputTarget) {
91
+ return null;
92
+ }
93
+ return options.driver.getTextInputTarget();
94
+ }
64
95
  return {
65
96
  async applyInput(sessionId, clientMachineId, event) {
66
97
  const state = requireSession(sessionId, clientMachineId);
@@ -75,9 +106,13 @@ export function createLocalRemoteControlManager(options) {
75
106
  });
76
107
  }
77
108
  try {
78
- await options.driver.applyInput(state.session, event);
109
+ const inputResult = await options.driver.applyInput(state.session, event);
110
+ const cursorPosition = inputResult && "cursorPosition" in inputResult
111
+ ? inputResult.cursorPosition
112
+ : state.session.cursorPosition;
79
113
  state.session = {
80
114
  ...state.session,
115
+ cursorPosition,
81
116
  errorMessage: null,
82
117
  permissionState: {
83
118
  ...state.session.permissionState,
@@ -129,6 +164,42 @@ export function createLocalRemoteControlManager(options) {
129
164
  getSession(sessionId, clientMachineId) {
130
165
  return requireSession(sessionId, clientMachineId).session;
131
166
  },
167
+ async getTextInputTarget(sessionId, clientMachineId) {
168
+ const state = requireSession(sessionId, clientMachineId);
169
+ if (stoppedStatuses.has(state.session.status)) {
170
+ throw Object.assign(new Error("Remote-control session is not active"), {
171
+ statusCode: 409
172
+ });
173
+ }
174
+ try {
175
+ const target = await readTextInputTarget();
176
+ state.session = {
177
+ ...state.session,
178
+ errorMessage: null,
179
+ permissionState: {
180
+ ...state.session.permissionState,
181
+ accessibility: options.driver.getTextInputTarget
182
+ ? "granted"
183
+ : state.session.permissionState.accessibility
184
+ },
185
+ updatedAt: now().toISOString()
186
+ };
187
+ return target;
188
+ }
189
+ catch (error) {
190
+ const permission = permissionKind(error);
191
+ state.session = {
192
+ ...state.session,
193
+ errorMessage: error instanceof Error ? error.message : "Unable to inspect Mac text input focus",
194
+ permissionState: {
195
+ ...state.session.permissionState,
196
+ accessibility: permission === "accessibility" ? "needed" : state.session.permissionState.accessibility
197
+ },
198
+ updatedAt: now().toISOString()
199
+ };
200
+ throw error;
201
+ }
202
+ },
132
203
  listSessions(clientMachineId) {
133
204
  return [...states.values()]
134
205
  .map((state) => state.session)
@@ -140,6 +211,7 @@ export function createLocalRemoteControlManager(options) {
140
211
  return existing.session;
141
212
  }
142
213
  const timestamp = now().toISOString();
214
+ const cursorPosition = await readCursorPosition();
143
215
  const session = {
144
216
  id: idGenerator("remote"),
145
217
  status: "connecting",
@@ -151,12 +223,14 @@ export function createLocalRemoteControlManager(options) {
151
223
  accessibility: "unknown",
152
224
  screenRecording: "unknown"
153
225
  },
226
+ cursorPosition,
154
227
  errorMessage: null,
155
228
  createdAt: timestamp,
156
229
  updatedAt: timestamp
157
230
  };
158
231
  const state = {
159
232
  frameTimer: null,
233
+ isFrameCaptureInFlight: false,
160
234
  latestFrame: null,
161
235
  session
162
236
  };