@phuetz/code-buddy 0.1.4 → 0.1.6
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/.codebuddy/README.md +52 -0
- package/README.md +17 -17
- package/dist/browser-automation/browser-manager.js +0 -2
- package/dist/browser-automation/browser-manager.js.map +1 -1
- package/dist/codebuddy/tool-definitions/computer-control-tools.js +2 -0
- package/dist/codebuddy/tool-definitions/computer-control-tools.js.map +1 -1
- package/dist/commands/cli/daemon-commands.js +25 -0
- package/dist/commands/cli/daemon-commands.js.map +1 -1
- package/dist/daemon/daemon-manager.js +3 -1
- package/dist/daemon/daemon-manager.js.map +1 -1
- package/dist/desktop-automation/automation-manager.d.ts +8 -0
- package/dist/desktop-automation/automation-manager.js +52 -0
- package/dist/desktop-automation/automation-manager.js.map +1 -1
- package/dist/desktop-automation/base-native-provider.d.ts +72 -0
- package/dist/desktop-automation/base-native-provider.js +75 -0
- package/dist/desktop-automation/base-native-provider.js.map +1 -0
- package/dist/desktop-automation/index.d.ts +4 -0
- package/dist/desktop-automation/index.js +5 -0
- package/dist/desktop-automation/index.js.map +1 -1
- package/dist/desktop-automation/linux-native-provider.d.ts +48 -0
- package/dist/desktop-automation/linux-native-provider.js +515 -0
- package/dist/desktop-automation/linux-native-provider.js.map +1 -0
- package/dist/desktop-automation/macos-native-provider.d.ts +61 -0
- package/dist/desktop-automation/macos-native-provider.js +768 -0
- package/dist/desktop-automation/macos-native-provider.js.map +1 -0
- package/dist/desktop-automation/smart-snapshot.d.ts +21 -2
- package/dist/desktop-automation/smart-snapshot.js +237 -12
- package/dist/desktop-automation/smart-snapshot.js.map +1 -1
- package/dist/desktop-automation/types.d.ts +1 -1
- package/dist/desktop-automation/types.js +2 -2
- package/dist/desktop-automation/types.js.map +1 -1
- package/dist/desktop-automation/windows-native-provider.d.ts +71 -0
- package/dist/desktop-automation/windows-native-provider.js +653 -0
- package/dist/desktop-automation/windows-native-provider.js.map +1 -0
- package/dist/index.js +31 -38
- package/dist/index.js.map +1 -1
- package/dist/server/index.js +26 -10
- package/dist/server/index.js.map +1 -1
- package/dist/server/routes/chat.js +12 -1
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/websocket/handler.js +10 -1
- package/dist/server/websocket/handler.js.map +1 -1
- package/dist/tools/computer-control-tool.d.ts +6 -1
- package/dist/tools/computer-control-tool.js +97 -1
- package/dist/tools/computer-control-tool.js.map +1 -1
- package/dist/tools/screenshot-tool.d.ts +23 -0
- package/dist/tools/screenshot-tool.js +224 -1
- package/dist/tools/screenshot-tool.js.map +1 -1
- 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
|
+
}
|