@abitat_reece/host-daemon 0.1.20 → 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.
Files changed (34) hide show
  1. package/dist/local-control/codex-bridge.d.ts.map +1 -1
  2. package/dist/local-control/codex-bridge.js +177 -18
  3. package/dist/local-control/codex-bridge.js.map +1 -1
  4. package/dist/local-control/push-notifications.d.ts +2 -2
  5. package/dist/local-control/push-notifications.d.ts.map +1 -1
  6. package/dist/local-control/push-notifications.js +3 -1
  7. package/dist/local-control/push-notifications.js.map +1 -1
  8. package/dist/local-control/relay-client.d.ts +10 -3
  9. package/dist/local-control/relay-client.d.ts.map +1 -1
  10. package/dist/local-control/relay-client.js.map +1 -1
  11. package/dist/local-control/remote-control/macos-driver.d.ts +16 -0
  12. package/dist/local-control/remote-control/macos-driver.d.ts.map +1 -0
  13. package/dist/local-control/remote-control/macos-driver.js +440 -0
  14. package/dist/local-control/remote-control/macos-driver.js.map +1 -0
  15. package/dist/local-control/remote-control/routes.d.ts +20 -0
  16. package/dist/local-control/remote-control/routes.d.ts.map +1 -0
  17. package/dist/local-control/remote-control/routes.js +110 -0
  18. package/dist/local-control/remote-control/routes.js.map +1 -0
  19. package/dist/local-control/remote-control/session-manager.d.ts +10 -0
  20. package/dist/local-control/remote-control/session-manager.d.ts.map +1 -0
  21. package/dist/local-control/remote-control/session-manager.js +259 -0
  22. package/dist/local-control/remote-control/session-manager.js.map +1 -0
  23. package/dist/local-control/remote-control/types.d.ts +49 -0
  24. package/dist/local-control/remote-control/types.d.ts.map +1 -0
  25. package/dist/local-control/remote-control/types.js +2 -0
  26. package/dist/local-control/remote-control/types.js.map +1 -0
  27. package/dist/local-control/server.d.ts +7 -2
  28. package/dist/local-control/server.d.ts.map +1 -1
  29. package/dist/local-control/server.js +24 -86
  30. package/dist/local-control/server.js.map +1 -1
  31. package/dist/local-control/transport.d.ts +6 -2
  32. package/dist/local-control/transport.d.ts.map +1 -1
  33. package/dist/local-control/transport.js.map +1 -1
  34. package/package.json +2 -2
@@ -0,0 +1,440 @@
1
+ import { execFile as execFileCallback } from "node:child_process";
2
+ import { readFile, unlink } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { promisify } from "node:util";
6
+ const runExecFile = promisify(execFileCallback);
7
+ const CAPTURE_WIDTH = 1280;
8
+ const FRAME_JPEG_QUALITY = 22;
9
+ const SCREEN_DIMENSION_PROBE_INTERVAL_FRAMES = 30;
10
+ const DEFAULT_DISPLAY_WIDTH = 1440;
11
+ const DEFAULT_DISPLAY_HEIGHT = 900;
12
+ export function createMacOsRemoteControlDriver(options = {}) {
13
+ const execFile = options.execFile ?? runExecFile;
14
+ const readFrameFile = options.readFile ?? readFile;
15
+ const unlinkFrameFile = options.unlink ?? unlink;
16
+ const now = options.now ?? (() => new Date());
17
+ let sequence = 0;
18
+ let screenSize = {
19
+ height: DEFAULT_DISPLAY_HEIGHT,
20
+ width: DEFAULT_DISPLAY_WIDTH
21
+ };
22
+ return {
23
+ async captureFrame(session) {
24
+ const rawPath = capturePath(session.id, "raw.jpg");
25
+ const framePath = capturePath(session.id, "frame.jpg");
26
+ try {
27
+ await execFile("/usr/sbin/screencapture", ["-x", "-C", "-t", "jpg", rawPath]);
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
+ }
41
+ await execFile("/usr/bin/sips", [
42
+ "-Z",
43
+ String(CAPTURE_WIDTH),
44
+ "-s",
45
+ "format",
46
+ "jpeg",
47
+ "-s",
48
+ "formatOptions",
49
+ String(FRAME_JPEG_QUALITY),
50
+ rawPath,
51
+ "--out",
52
+ framePath
53
+ ]);
54
+ const image = await readFrameFile(framePath);
55
+ const frameSize = scaledFrameSize(screenSize);
56
+ sequence += 1;
57
+ return {
58
+ capturedAt: now().toISOString(),
59
+ dataBase64: image.toString("base64"),
60
+ height: frameSize.height,
61
+ mimeType: "image/jpeg",
62
+ sequence,
63
+ width: frameSize.width
64
+ };
65
+ }
66
+ catch (error) {
67
+ throw normalizeCaptureError(error);
68
+ }
69
+ finally {
70
+ await Promise.all([
71
+ unlinkFrameFile(rawPath).catch(() => undefined),
72
+ unlinkFrameFile(framePath).catch(() => undefined)
73
+ ]);
74
+ }
75
+ },
76
+ async applyInput(_session, event) {
77
+ try {
78
+ const result = await execFile("/usr/bin/osascript", osascriptArgsForInput(event, screenSize));
79
+ return (cursorPositionFromStdout(result.stdout, screenSize) ??
80
+ cursorPositionForDeterministicInput(event));
81
+ }
82
+ catch (error) {
83
+ throw normalizeInputError(error);
84
+ }
85
+ },
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
+ }
108
+ };
109
+ }
110
+ function osascriptArgsForInput(event, screenSize) {
111
+ if (event.type === "pointer" && event.phase === "move") {
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)];
123
+ }
124
+ return ["-e", appleScriptForInput(event, screenSize)];
125
+ }
126
+ function appleScriptForInput(event, screenSize) {
127
+ if (event.type === "text") {
128
+ return `tell application "System Events" to keystroke ${JSON.stringify(event.value)}`;
129
+ }
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
+ }
146
+ const modifierPrefix = event.modifiers.length
147
+ ? ` using {${event.modifiers.map(appleScriptModifier).join(", ")}}`
148
+ : "";
149
+ return `tell application "System Events" to keystroke ${JSON.stringify(event.key)}${modifierPrefix}`;
150
+ }
151
+ if (event.type === "pointer" && event.phase === "up") {
152
+ const x = Math.round(event.x * screenSize.width);
153
+ const y = Math.round(event.y * screenSize.height);
154
+ return `tell application "System Events" to click at {${x}, ${y}}`;
155
+ }
156
+ if (event.type === "pointer" && event.phase === "scroll") {
157
+ const direction = (event.dy ?? 0) > 0 ? "down" : "up";
158
+ return `tell application "System Events" to scroll ${direction}`;
159
+ }
160
+ return `tell application "System Events" to delay 0`;
161
+ }
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) {
190
+ return [
191
+ 'ObjC.import("CoreGraphics");',
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
+ "}"
286
+ ].join("\n");
287
+ }
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
+ }
297
+ return {
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))
391
+ };
392
+ }
393
+ function appleScriptModifier(modifier) {
394
+ if (modifier === "cmd") {
395
+ return "command down";
396
+ }
397
+ if (modifier === "ctrl") {
398
+ return "control down";
399
+ }
400
+ if (modifier === "alt") {
401
+ return "option down";
402
+ }
403
+ return "shift down";
404
+ }
405
+ function capturePath(sessionId, name) {
406
+ return join(tmpdir(), `abitat-${sessionId}-${name}`);
407
+ }
408
+ function numberFromSips(output, key) {
409
+ const match = output.match(new RegExp(`${key}:\\s*(\\d+)`, "u"));
410
+ return match ? Number(match[1]) : null;
411
+ }
412
+ function shouldProbeScreenDimensions(sequence) {
413
+ return sequence % SCREEN_DIMENSION_PROBE_INTERVAL_FRAMES === 0;
414
+ }
415
+ function normalizeCaptureError(error) {
416
+ const stderr = errorStderr(error);
417
+ if (/screen recording|permission|not authorized|denied/iu.test(stderr)) {
418
+ return Object.assign(new Error("Screen Recording permission is required for remote control"), {
419
+ permission: "screenRecording"
420
+ });
421
+ }
422
+ return new Error(error instanceof Error ? error.message : "Unable to capture Mac screen");
423
+ }
424
+ function normalizeInputError(error) {
425
+ const stderr = errorStderr(error);
426
+ if (/assistive access|accessibility|not allowed|not authorized|denied/iu.test(stderr)) {
427
+ return Object.assign(new Error("Accessibility permission is required for remote control input"), {
428
+ permission: "accessibility"
429
+ });
430
+ }
431
+ return new Error(error instanceof Error ? error.message : "Unable to send Mac input");
432
+ }
433
+ function errorStderr(error) {
434
+ if (typeof error === "object" && error && "stderr" in error) {
435
+ const stderr = error.stderr;
436
+ return typeof stderr === "string" ? stderr : "";
437
+ }
438
+ return "";
439
+ }
440
+ //# sourceMappingURL=macos-driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"macos-driver.js","sourceRoot":"","sources":["../../../src/local-control/remote-control/macos-driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import { type MobileControlDiagnosticsLogger } from "../diagnostics-log.js";
3
+ import type { LocalPairedDevice } from "../state.js";
4
+ import type { LocalRemoteControlManager } from "./types.js";
5
+ interface HandleRemoteControlRouteInput {
6
+ actor: LocalPairedDevice;
7
+ diagnostics?: MobileControlDiagnosticsLogger;
8
+ hostMachineId: string;
9
+ manager: LocalRemoteControlManager;
10
+ method: string;
11
+ path: string;
12
+ readJson(request: IncomingMessage): Promise<unknown>;
13
+ request: IncomingMessage;
14
+ response: ServerResponse;
15
+ searchParams: URLSearchParams;
16
+ writeJson(response: ServerResponse, status: number, body: unknown): void;
17
+ }
18
+ export declare function handleLocalRemoteControlRoute(input: HandleRemoteControlRouteInput): Promise<boolean>;
19
+ export {};
20
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +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,oBAiIvF"}
@@ -0,0 +1,110 @@
1
+ import { remoteControlInputRequestSchema, remoteControlSessionCreateRequestSchema } from "@abitat_reece/shared";
2
+ import { logDiagnostics } from "../diagnostics-log.js";
3
+ export async function handleLocalRemoteControlRoute(input) {
4
+ if (!input.path.startsWith("/api/remote-control/") && input.path !== "/remote-control/status") {
5
+ return false;
6
+ }
7
+ if (input.method === "GET" && input.path === "/remote-control/status") {
8
+ input.writeJson(input.response, 200, {
9
+ sessions: input.manager.listSessions(input.actor.id)
10
+ });
11
+ return true;
12
+ }
13
+ if (input.method === "GET" && input.path === "/api/remote-control/sessions") {
14
+ input.writeJson(input.response, 200, {
15
+ sessions: input.manager.listSessions(input.actor.id)
16
+ });
17
+ return true;
18
+ }
19
+ if (input.method === "POST" && input.path === "/api/remote-control/sessions") {
20
+ const body = parseRemoteControlInput(remoteControlSessionCreateRequestSchema, await input.readJson(input.request));
21
+ if (body.hostMachineId !== input.hostMachineId) {
22
+ throw Object.assign(new Error("Phone is not paired to this Mac host"), { statusCode: 403 });
23
+ }
24
+ const session = await input.manager.startSession({
25
+ clientMachineId: input.actor.id,
26
+ hostMachineId: body.hostMachineId,
27
+ inputEnabled: body.inputEnabled,
28
+ screenEnabled: body.screenEnabled
29
+ });
30
+ logDiagnostics(input.diagnostics, "info", "remote_control.session.start", {
31
+ deviceId: input.actor.id,
32
+ hostMachineId: body.hostMachineId,
33
+ inputEnabled: body.inputEnabled,
34
+ screenEnabled: body.screenEnabled,
35
+ sessionId: session.id
36
+ });
37
+ input.writeJson(input.response, 201, { session });
38
+ return true;
39
+ }
40
+ const sessionMatch = input.path.match(/^\/api\/remote-control\/sessions\/([^/]+)$/u);
41
+ if (sessionMatch && input.method === "GET") {
42
+ input.writeJson(input.response, 200, {
43
+ session: input.manager.getSession(decodeURIComponent(sessionMatch[1]), input.actor.id)
44
+ });
45
+ return true;
46
+ }
47
+ if (sessionMatch && input.method === "DELETE") {
48
+ const session = await input.manager.endSession(decodeURIComponent(sessionMatch[1]), input.actor.id);
49
+ input.writeJson(input.response, 200, { session });
50
+ return true;
51
+ }
52
+ const frameMatch = input.path.match(/^\/api\/remote-control\/sessions\/([^/]+)\/frame$/u);
53
+ if (frameMatch && input.method === "GET") {
54
+ const afterSequence = Number(input.searchParams.get("afterSequence") ?? "-1");
55
+ input.writeJson(input.response, 200, input.manager.getLatestFrame(decodeURIComponent(frameMatch[1]), input.actor.id, Number.isFinite(afterSequence) ? afterSequence : -1));
56
+ return true;
57
+ }
58
+ const inputMatch = input.path.match(/^\/api\/remote-control\/sessions\/([^/]+)\/input$/u);
59
+ if (inputMatch && input.method === "POST") {
60
+ const body = parseRemoteControlInput(remoteControlInputRequestSchema, await input.readJson(input.request));
61
+ const session = await input.manager.applyInput(decodeURIComponent(inputMatch[1]), input.actor.id, body.event);
62
+ input.writeJson(input.response, 200, { ok: true, session });
63
+ return true;
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
+ }
72
+ const signalMatch = input.path.match(/^\/api\/remote-control\/sessions\/([^/]+)\/signals$/u);
73
+ if (signalMatch && input.method === "GET") {
74
+ input.manager.getSession(decodeURIComponent(signalMatch[1]), input.actor.id);
75
+ input.writeJson(input.response, 200, { signals: [] });
76
+ return true;
77
+ }
78
+ if (signalMatch && input.method === "POST") {
79
+ const body = recordValue(await input.readJson(input.request)) ?? {};
80
+ input.manager.getSession(decodeURIComponent(signalMatch[1]), input.actor.id);
81
+ input.writeJson(input.response, 201, {
82
+ signal: {
83
+ createdAt: new Date().toISOString(),
84
+ id: "signal_compat",
85
+ payload: recordValue(body.payload) ?? {},
86
+ senderMachineId: input.actor.id,
87
+ sessionId: decodeURIComponent(signalMatch[1]),
88
+ type: typeof body.type === "string" ? body.type : "status"
89
+ }
90
+ });
91
+ return true;
92
+ }
93
+ return false;
94
+ }
95
+ function parseRemoteControlInput(schema, input) {
96
+ try {
97
+ return schema.parse(input);
98
+ }
99
+ catch (error) {
100
+ throw Object.assign(error instanceof Error ? error : new Error("Invalid remote-control request"), {
101
+ statusCode: 400
102
+ });
103
+ }
104
+ }
105
+ function recordValue(value) {
106
+ return value && typeof value === "object" && !Array.isArray(value)
107
+ ? value
108
+ : null;
109
+ }
110
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/local-control/remote-control/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type LocalRemoteControlDriver, type LocalRemoteControlManager } from "./types.js";
2
+ interface ManagerOptions {
3
+ driver: LocalRemoteControlDriver;
4
+ frameIntervalMs?: number;
5
+ idGenerator?: (prefix: string) => string;
6
+ now?: () => Date;
7
+ }
8
+ export type { LocalRemoteControlDriver, LocalRemoteControlManager } from "./types.js";
9
+ export declare function createLocalRemoteControlManager(options: ManagerOptions): LocalRemoteControlManager;
10
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
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"}