@phuetz/code-buddy 0.1.3 → 0.1.5

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 (44) hide show
  1. package/README.md +49 -33
  2. package/dist/agent/tool-handler.js +21 -1
  3. package/dist/agent/tool-handler.js.map +1 -1
  4. package/dist/browser-automation/browser-manager.js +0 -2
  5. package/dist/browser-automation/browser-manager.js.map +1 -1
  6. package/dist/codebuddy/client.js +24 -0
  7. package/dist/codebuddy/client.js.map +1 -1
  8. package/dist/codebuddy/tool-definitions/computer-control-tools.js +2 -0
  9. package/dist/codebuddy/tool-definitions/computer-control-tools.js.map +1 -1
  10. package/dist/desktop-automation/automation-manager.d.ts +8 -0
  11. package/dist/desktop-automation/automation-manager.js +52 -0
  12. package/dist/desktop-automation/automation-manager.js.map +1 -1
  13. package/dist/desktop-automation/base-native-provider.d.ts +72 -0
  14. package/dist/desktop-automation/base-native-provider.js +75 -0
  15. package/dist/desktop-automation/base-native-provider.js.map +1 -0
  16. package/dist/desktop-automation/index.d.ts +4 -0
  17. package/dist/desktop-automation/index.js +5 -0
  18. package/dist/desktop-automation/index.js.map +1 -1
  19. package/dist/desktop-automation/linux-native-provider.d.ts +48 -0
  20. package/dist/desktop-automation/linux-native-provider.js +515 -0
  21. package/dist/desktop-automation/linux-native-provider.js.map +1 -0
  22. package/dist/desktop-automation/macos-native-provider.d.ts +61 -0
  23. package/dist/desktop-automation/macos-native-provider.js +768 -0
  24. package/dist/desktop-automation/macos-native-provider.js.map +1 -0
  25. package/dist/desktop-automation/smart-snapshot.d.ts +21 -2
  26. package/dist/desktop-automation/smart-snapshot.js +237 -12
  27. package/dist/desktop-automation/smart-snapshot.js.map +1 -1
  28. package/dist/desktop-automation/types.d.ts +1 -1
  29. package/dist/desktop-automation/types.js +2 -2
  30. package/dist/desktop-automation/types.js.map +1 -1
  31. package/dist/desktop-automation/windows-native-provider.d.ts +71 -0
  32. package/dist/desktop-automation/windows-native-provider.js +653 -0
  33. package/dist/desktop-automation/windows-native-provider.js.map +1 -0
  34. package/dist/index.js +0 -0
  35. package/dist/tools/computer-control-tool.d.ts +6 -1
  36. package/dist/tools/computer-control-tool.js +97 -1
  37. package/dist/tools/computer-control-tool.js.map +1 -1
  38. package/dist/tools/screenshot-tool.d.ts +23 -0
  39. package/dist/tools/screenshot-tool.js +224 -1
  40. package/dist/tools/screenshot-tool.js.map +1 -1
  41. package/dist/tools/web-search.d.ts +2 -0
  42. package/dist/tools/web-search.js +12 -2
  43. package/dist/tools/web-search.js.map +1 -1
  44. package/package.json +14 -5
@@ -0,0 +1,515 @@
1
+ /**
2
+ * Linux Native Desktop Automation Provider
3
+ *
4
+ * Uses xdotool, xclip, wmctrl, and xrandr for desktop automation on Linux/X11.
5
+ */
6
+ import { spawn, execSync as nodeExecSync } from 'child_process';
7
+ import { BaseNativeProvider } from './base-native-provider.js';
8
+ // Key name translation map for xdotool
9
+ const keyMap = {
10
+ enter: 'Return',
11
+ escape: 'Escape',
12
+ backspace: 'BackSpace',
13
+ tab: 'Tab',
14
+ delete: 'Delete',
15
+ space: 'space',
16
+ up: 'Up',
17
+ down: 'Down',
18
+ left: 'Left',
19
+ right: 'Right',
20
+ home: 'Home',
21
+ end: 'End',
22
+ pageup: 'Prior',
23
+ pagedown: 'Next',
24
+ f1: 'F1',
25
+ f2: 'F2',
26
+ f3: 'F3',
27
+ f4: 'F4',
28
+ f5: 'F5',
29
+ f6: 'F6',
30
+ f7: 'F7',
31
+ f8: 'F8',
32
+ f9: 'F9',
33
+ f10: 'F10',
34
+ f11: 'F11',
35
+ f12: 'F12',
36
+ ctrl: 'ctrl',
37
+ alt: 'alt',
38
+ shift: 'shift',
39
+ meta: 'super',
40
+ command: 'super',
41
+ win: 'super',
42
+ };
43
+ /**
44
+ * Map a mouse button name to xdotool button number
45
+ */
46
+ function buttonNumber(button) {
47
+ switch (button) {
48
+ case 'right': return 3;
49
+ case 'middle': return 2;
50
+ default: return 1; // left
51
+ }
52
+ }
53
+ export class LinuxNativeProvider extends BaseNativeProvider {
54
+ platformName = 'Linux';
55
+ capabilities = {
56
+ mouse: true,
57
+ keyboard: true,
58
+ windows: true,
59
+ apps: true,
60
+ screenshots: true,
61
+ colorPicker: false,
62
+ clipboard: true,
63
+ ocr: false,
64
+ };
65
+ isX11 = true;
66
+ // --------------------------------------------------------------------------
67
+ // Lifecycle
68
+ // --------------------------------------------------------------------------
69
+ async initialize() {
70
+ // Required: xdotool
71
+ const hasXdotool = this.checkTool('xdotool');
72
+ if (!hasXdotool) {
73
+ throw new Error('xdotool is required for Linux native desktop automation. Install with: sudo apt install xdotool');
74
+ }
75
+ // Optional tools
76
+ this.checkTool('xclip');
77
+ this.checkTool('xsel');
78
+ this.checkTool('wmctrl');
79
+ this.checkTool('xrandr');
80
+ // Detect session type
81
+ this.isX11 = process.env.XDG_SESSION_TYPE !== 'wayland';
82
+ this.initialized = true;
83
+ }
84
+ async isAvailable() {
85
+ return this.hasTool('xdotool') && this.isX11;
86
+ }
87
+ async shutdown() {
88
+ this.initialized = false;
89
+ }
90
+ // --------------------------------------------------------------------------
91
+ // Private helpers
92
+ // --------------------------------------------------------------------------
93
+ /**
94
+ * Map a key name to the xdotool equivalent
95
+ */
96
+ mapKey(key) {
97
+ return keyMap[key.toLowerCase()] ?? key;
98
+ }
99
+ // --------------------------------------------------------------------------
100
+ // Mouse
101
+ // --------------------------------------------------------------------------
102
+ async getMousePosition() {
103
+ this.ensureInitialized();
104
+ try {
105
+ const output = await this.exec('xdotool getmouselocation');
106
+ const xMatch = output.match(/x:(\d+)/);
107
+ const yMatch = output.match(/y:(\d+)/);
108
+ const screenMatch = output.match(/screen:(\d+)/);
109
+ return {
110
+ x: xMatch ? parseInt(xMatch[1], 10) : 0,
111
+ y: yMatch ? parseInt(yMatch[1], 10) : 0,
112
+ screen: screenMatch ? parseInt(screenMatch[1], 10) : 0,
113
+ };
114
+ }
115
+ catch {
116
+ return { x: 0, y: 0, screen: 0 };
117
+ }
118
+ }
119
+ async moveMouse(x, y, options) {
120
+ this.ensureInitialized();
121
+ let cmd = 'xdotool mousemove';
122
+ if (options?.smooth && options.steps) {
123
+ cmd += ` --steps ${options.steps}`;
124
+ }
125
+ cmd += ` ${x} ${y}`;
126
+ await this.exec(cmd);
127
+ }
128
+ async click(options) {
129
+ this.ensureInitialized();
130
+ const btn = buttonNumber(options?.button);
131
+ let cmd = `xdotool click`;
132
+ if (options?.clicks && options.clicks > 1) {
133
+ cmd += ` --repeat ${options.clicks} --delay ${options.delay ?? 100}`;
134
+ }
135
+ cmd += ` ${btn}`;
136
+ await this.exec(cmd);
137
+ }
138
+ async doubleClick(button) {
139
+ this.ensureInitialized();
140
+ const btn = buttonNumber(button);
141
+ await this.exec(`xdotool click --repeat 2 --delay 50 ${btn}`);
142
+ }
143
+ async rightClick() {
144
+ this.ensureInitialized();
145
+ await this.exec('xdotool click 3');
146
+ }
147
+ async drag(fromX, fromY, toX, toY, _options) {
148
+ this.ensureInitialized();
149
+ await this.exec(`xdotool mousemove ${fromX} ${fromY} mousedown 1 mousemove ${toX} ${toY} mouseup 1`);
150
+ }
151
+ async scroll(options) {
152
+ this.ensureInitialized();
153
+ const { deltaX = 0, deltaY = 0 } = options;
154
+ // Vertical scroll: button 4 = up, button 5 = down
155
+ if (deltaY !== 0) {
156
+ const btn = deltaY < 0 ? 4 : 5; // negative = scroll up
157
+ const count = Math.abs(Math.round(deltaY));
158
+ if (count > 0) {
159
+ await this.exec(`xdotool click --repeat ${count} ${btn}`);
160
+ }
161
+ }
162
+ // Horizontal scroll: button 6 = left, button 7 = right
163
+ if (deltaX !== 0) {
164
+ const btn = deltaX < 0 ? 6 : 7; // negative = scroll left
165
+ const count = Math.abs(Math.round(deltaX));
166
+ if (count > 0) {
167
+ await this.exec(`xdotool click --repeat ${count} ${btn}`);
168
+ }
169
+ }
170
+ }
171
+ // --------------------------------------------------------------------------
172
+ // Keyboard
173
+ // --------------------------------------------------------------------------
174
+ async keyPress(key, options) {
175
+ this.ensureInitialized();
176
+ const mappedKey = this.mapKey(key);
177
+ let modPrefix = '';
178
+ if (options?.modifiers && options.modifiers.length > 0) {
179
+ modPrefix = options.modifiers.map(m => this.mapKey(m)).join('+') + '+';
180
+ }
181
+ await this.exec(`xdotool key ${modPrefix}${mappedKey}`);
182
+ }
183
+ async keyDown(key) {
184
+ this.ensureInitialized();
185
+ const mappedKey = this.mapKey(key);
186
+ await this.exec(`xdotool keydown ${mappedKey}`);
187
+ }
188
+ async keyUp(key) {
189
+ this.ensureInitialized();
190
+ const mappedKey = this.mapKey(key);
191
+ await this.exec(`xdotool keyup ${mappedKey}`);
192
+ }
193
+ async type(text, options) {
194
+ this.ensureInitialized();
195
+ const delay = options?.delay ?? 30;
196
+ // Escape backslashes and double quotes for shell safety
197
+ const escapedText = text.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
198
+ await this.exec(`xdotool type --delay ${delay} "${escapedText}"`);
199
+ }
200
+ async hotkey(sequence) {
201
+ this.ensureInitialized();
202
+ const parts = [];
203
+ if (sequence.modifiers && sequence.modifiers.length > 0) {
204
+ parts.push(...sequence.modifiers.map(m => this.mapKey(m)));
205
+ }
206
+ parts.push(...sequence.keys.map(k => this.mapKey(k)));
207
+ const combo = parts.join('+');
208
+ await this.exec(`xdotool key ${combo}`);
209
+ }
210
+ // --------------------------------------------------------------------------
211
+ // Window Management
212
+ // --------------------------------------------------------------------------
213
+ async getActiveWindow() {
214
+ this.ensureInitialized();
215
+ try {
216
+ const handle = await this.exec('xdotool getactivewindow');
217
+ if (!handle)
218
+ return null;
219
+ return this.getWindow(handle);
220
+ }
221
+ catch {
222
+ return null;
223
+ }
224
+ }
225
+ async getWindows(options) {
226
+ this.ensureInitialized();
227
+ try {
228
+ const output = await this.exec('xdotool search --onlyvisible --name ""');
229
+ const handles = output.split('\n').filter(h => h.trim().length > 0);
230
+ const windows = [];
231
+ for (const handle of handles) {
232
+ try {
233
+ const win = await this.getWindow(handle);
234
+ if (!win)
235
+ continue;
236
+ // Apply filters
237
+ if (options?.title) {
238
+ const titleMatch = options.title instanceof RegExp
239
+ ? options.title.test(win.title)
240
+ : win.title.includes(options.title);
241
+ if (!titleMatch)
242
+ continue;
243
+ }
244
+ if (options?.processName && win.processName !== options.processName)
245
+ continue;
246
+ if (options?.pid && win.pid !== options.pid)
247
+ continue;
248
+ windows.push(win);
249
+ }
250
+ catch {
251
+ // Skip windows that can't be queried
252
+ }
253
+ }
254
+ return windows;
255
+ }
256
+ catch {
257
+ return [];
258
+ }
259
+ }
260
+ async getWindow(handle) {
261
+ this.ensureInitialized();
262
+ try {
263
+ let title = '';
264
+ try {
265
+ title = await this.exec(`xdotool getwindowname ${handle}`);
266
+ }
267
+ catch {
268
+ // Some windows have no name
269
+ }
270
+ let pid = 0;
271
+ try {
272
+ const pidStr = await this.exec(`xdotool getwindowpid ${handle}`);
273
+ pid = parseInt(pidStr, 10) || 0;
274
+ }
275
+ catch {
276
+ // PID may not be available
277
+ }
278
+ let x = 0, y = 0, width = 0, height = 0;
279
+ try {
280
+ const geom = await this.exec(`xdotool getwindowgeometry ${handle}`);
281
+ const posMatch = geom.match(/Position:\s*(\d+),(\d+)/);
282
+ const sizeMatch = geom.match(/Geometry:\s*(\d+)x(\d+)/);
283
+ if (posMatch) {
284
+ x = parseInt(posMatch[1], 10);
285
+ y = parseInt(posMatch[2], 10);
286
+ }
287
+ if (sizeMatch) {
288
+ width = parseInt(sizeMatch[1], 10);
289
+ height = parseInt(sizeMatch[2], 10);
290
+ }
291
+ }
292
+ catch {
293
+ // Geometry may not be available
294
+ }
295
+ let processName = '';
296
+ if (pid > 0) {
297
+ try {
298
+ processName = await this.exec(`ps -p ${pid} -o comm=`);
299
+ }
300
+ catch {
301
+ // Process may have exited
302
+ }
303
+ }
304
+ let focused = false;
305
+ try {
306
+ const activeHandle = await this.exec('xdotool getactivewindow');
307
+ focused = handle === activeHandle;
308
+ }
309
+ catch {
310
+ // Can't determine focus
311
+ }
312
+ return {
313
+ handle,
314
+ title,
315
+ pid,
316
+ processName,
317
+ bounds: { x, y, width, height },
318
+ focused,
319
+ visible: true,
320
+ minimized: false,
321
+ maximized: false,
322
+ fullscreen: false,
323
+ };
324
+ }
325
+ catch {
326
+ return null;
327
+ }
328
+ }
329
+ async focusWindow(handle) {
330
+ this.ensureInitialized();
331
+ await this.exec(`xdotool windowactivate --sync ${handle}`);
332
+ }
333
+ async minimizeWindow(handle) {
334
+ this.ensureInitialized();
335
+ await this.exec(`xdotool windowminimize ${handle}`);
336
+ }
337
+ async maximizeWindow(handle) {
338
+ this.ensureInitialized();
339
+ if (this.hasTool('wmctrl')) {
340
+ await this.exec(`wmctrl -ir ${handle} -b add,maximized_vert,maximized_horz`);
341
+ }
342
+ }
343
+ async restoreWindow(handle) {
344
+ this.ensureInitialized();
345
+ if (this.hasTool('wmctrl')) {
346
+ await this.exec(`wmctrl -ir ${handle} -b remove,maximized_vert,maximized_horz`);
347
+ }
348
+ }
349
+ async closeWindow(handle) {
350
+ this.ensureInitialized();
351
+ await this.exec(`xdotool windowclose ${handle}`);
352
+ }
353
+ async setWindow(handle, options) {
354
+ this.ensureInitialized();
355
+ if (options.position) {
356
+ await this.exec(`xdotool windowmove ${handle} ${options.position.x} ${options.position.y}`);
357
+ }
358
+ if (options.size) {
359
+ await this.exec(`xdotool windowsize ${handle} ${options.size.width} ${options.size.height}`);
360
+ }
361
+ if (options.focus) {
362
+ await this.focusWindow(handle);
363
+ }
364
+ }
365
+ // --------------------------------------------------------------------------
366
+ // Application Management
367
+ // --------------------------------------------------------------------------
368
+ async getRunningApps() {
369
+ this.ensureInitialized();
370
+ try {
371
+ const output = await this.exec('ps -eo pid,comm');
372
+ const lines = output.split('\n').slice(1); // skip header
373
+ const apps = [];
374
+ for (const line of lines) {
375
+ const trimmed = line.trim();
376
+ if (!trimmed)
377
+ continue;
378
+ const match = trimmed.match(/^\s*(\d+)\s+(.+)$/);
379
+ if (match) {
380
+ const pid = parseInt(match[1], 10);
381
+ const comm = match[2].trim();
382
+ apps.push({
383
+ name: comm,
384
+ path: comm,
385
+ pid,
386
+ running: true,
387
+ });
388
+ }
389
+ }
390
+ return apps;
391
+ }
392
+ catch {
393
+ return [];
394
+ }
395
+ }
396
+ async launchApp(appPath, options) {
397
+ this.ensureInitialized();
398
+ const args = options?.args ?? [];
399
+ const child = spawn(appPath, args, {
400
+ cwd: options?.cwd,
401
+ env: options?.env ? { ...process.env, ...options.env } : undefined,
402
+ detached: true,
403
+ stdio: 'ignore',
404
+ });
405
+ child.unref();
406
+ const appName = appPath.split('/').pop() ?? appPath;
407
+ return {
408
+ name: appName,
409
+ path: appPath,
410
+ pid: child.pid,
411
+ running: true,
412
+ };
413
+ }
414
+ async closeApp(pid) {
415
+ this.ensureInitialized();
416
+ try {
417
+ process.kill(pid, 'SIGTERM');
418
+ }
419
+ catch {
420
+ // Process may already be gone
421
+ }
422
+ }
423
+ // --------------------------------------------------------------------------
424
+ // Screen
425
+ // --------------------------------------------------------------------------
426
+ async getScreens() {
427
+ this.ensureInitialized();
428
+ if (!this.hasTool('xrandr')) {
429
+ return [];
430
+ }
431
+ try {
432
+ const output = await this.exec('xrandr --query');
433
+ const screens = [];
434
+ const lines = output.split('\n');
435
+ let screenId = 0;
436
+ for (const line of lines) {
437
+ // Match lines like: HDMI-1 connected primary 1920x1080+0+0
438
+ // or: eDP-1 connected 1366x768+0+0
439
+ const match = line.match(/^(\S+)\s+connected\s+(primary\s+)?(\d+)x(\d+)\+(\d+)\+(\d+)/);
440
+ if (match) {
441
+ const name = match[1];
442
+ const primary = !!match[2];
443
+ const width = parseInt(match[3], 10);
444
+ const height = parseInt(match[4], 10);
445
+ const x = parseInt(match[5], 10);
446
+ const y = parseInt(match[6], 10);
447
+ screens.push({
448
+ id: screenId++,
449
+ name,
450
+ bounds: { x, y, width, height },
451
+ workArea: { x, y, width, height },
452
+ scaleFactor: 1,
453
+ primary,
454
+ });
455
+ }
456
+ }
457
+ return screens;
458
+ }
459
+ catch {
460
+ return [];
461
+ }
462
+ }
463
+ async getPixelColor(_x, _y) {
464
+ throw new Error('Color picker not supported on Linux native provider');
465
+ }
466
+ // --------------------------------------------------------------------------
467
+ // Clipboard
468
+ // --------------------------------------------------------------------------
469
+ async getClipboard() {
470
+ this.ensureInitialized();
471
+ let text = '';
472
+ try {
473
+ if (this.hasTool('xclip')) {
474
+ text = await this.exec('xclip -selection clipboard -o');
475
+ }
476
+ else if (this.hasTool('xsel')) {
477
+ text = await this.exec('xsel --clipboard --output');
478
+ }
479
+ }
480
+ catch {
481
+ // Clipboard may be empty
482
+ }
483
+ return {
484
+ text: text || undefined,
485
+ formats: text ? ['text'] : [],
486
+ };
487
+ }
488
+ async setClipboard(content) {
489
+ this.ensureInitialized();
490
+ const text = content.text ?? '';
491
+ try {
492
+ if (this.hasTool('xclip')) {
493
+ nodeExecSync('xclip -selection clipboard', {
494
+ input: text,
495
+ encoding: 'utf-8',
496
+ timeout: 5000,
497
+ });
498
+ }
499
+ else if (this.hasTool('xsel')) {
500
+ nodeExecSync('xsel --clipboard --input', {
501
+ input: text,
502
+ encoding: 'utf-8',
503
+ timeout: 5000,
504
+ });
505
+ }
506
+ }
507
+ catch {
508
+ // Clipboard operation failed
509
+ }
510
+ }
511
+ async clearClipboard() {
512
+ await this.setClipboard({ text: '' });
513
+ }
514
+ }
515
+ //# sourceMappingURL=linux-native-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux-native-provider.js","sourceRoot":"","sources":["../../src/desktop-automation/linux-native-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * macOS Native Desktop Automation Provider
3
+ *
4
+ * Uses osascript (AppleScript) and cliclick for desktop automation on macOS.
5
+ * cliclick is optional but recommended for reliable mouse control.
6
+ */
7
+ import { BaseNativeProvider } from './base-native-provider.js';
8
+ import type { ProviderCapabilities, MousePosition, MouseMoveOptions, MouseClickOptions, MouseDragOptions, MouseScrollOptions, MouseButton, KeyCode, KeyPressOptions, TypeOptions, HotkeySequence, WindowInfo, WindowSearchOptions, WindowSetOptions, AppInfo, AppLaunchOptions, ScreenInfo, ColorInfo, ClipboardContent } from './types.js';
9
+ export declare class MacOSNativeProvider extends BaseNativeProvider {
10
+ readonly platformName = "macOS";
11
+ readonly capabilities: ProviderCapabilities;
12
+ private hasCliclick;
13
+ /**
14
+ * Execute an osascript command.
15
+ */
16
+ private osascript;
17
+ /**
18
+ * Execute an AppleScript via System Events.
19
+ */
20
+ private sysEvents;
21
+ /**
22
+ * Map a modifier key to AppleScript modifier syntax.
23
+ */
24
+ private mapModifier;
25
+ /**
26
+ * Build the AppleScript 'using' clause for modifiers.
27
+ */
28
+ private buildModifierClause;
29
+ initialize(): Promise<void>;
30
+ isAvailable(): Promise<boolean>;
31
+ shutdown(): Promise<void>;
32
+ getMousePosition(): Promise<MousePosition>;
33
+ moveMouse(x: number, y: number, _options?: MouseMoveOptions): Promise<void>;
34
+ click(options?: MouseClickOptions): Promise<void>;
35
+ doubleClick(button?: MouseButton): Promise<void>;
36
+ rightClick(): Promise<void>;
37
+ drag(fromX: number, fromY: number, toX: number, toY: number, _options?: MouseDragOptions): Promise<void>;
38
+ scroll(options: MouseScrollOptions): Promise<void>;
39
+ keyPress(key: KeyCode, options?: KeyPressOptions): Promise<void>;
40
+ keyDown(key: KeyCode): Promise<void>;
41
+ keyUp(key: KeyCode): Promise<void>;
42
+ type(text: string, options?: TypeOptions): Promise<void>;
43
+ hotkey(sequence: HotkeySequence): Promise<void>;
44
+ getActiveWindow(): Promise<WindowInfo | null>;
45
+ getWindows(options?: WindowSearchOptions): Promise<WindowInfo[]>;
46
+ getWindow(handle: string): Promise<WindowInfo | null>;
47
+ focusWindow(handle: string): Promise<void>;
48
+ minimizeWindow(handle: string): Promise<void>;
49
+ maximizeWindow(handle: string): Promise<void>;
50
+ restoreWindow(handle: string): Promise<void>;
51
+ closeWindow(handle: string): Promise<void>;
52
+ setWindow(handle: string, options: WindowSetOptions): Promise<void>;
53
+ getRunningApps(): Promise<AppInfo[]>;
54
+ launchApp(appPath: string, options?: AppLaunchOptions): Promise<AppInfo>;
55
+ closeApp(pid: number): Promise<void>;
56
+ getScreens(): Promise<ScreenInfo[]>;
57
+ getPixelColor(_x: number, _y: number): Promise<ColorInfo>;
58
+ getClipboard(): Promise<ClipboardContent>;
59
+ setClipboard(content: Partial<ClipboardContent>): Promise<void>;
60
+ clearClipboard(): Promise<void>;
61
+ }