@amaster.ai/pi-computer-use 0.1.2-beta.1 → 0.1.2-beta.3
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/README.md +113 -0
- package/bin/darwin-arm64/cua-driver +0 -0
- package/bin/darwin-x64/cua-driver +0 -0
- package/bin/linux-x64/cua-driver +0 -0
- package/bin/win32-arm64/cua-driver.exe +0 -0
- package/bin/win32-x64/cua-driver.exe +0 -0
- package/dist/config.d.ts +7 -20
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -8
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +107 -79
- package/dist/index.js.map +1 -1
- package/dist/mcp-client.d.ts +22 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +71 -0
- package/dist/mcp-client.js.map +1 -0
- package/package.json +14 -5
- package/dist/__tests__/computer-client.test.d.ts +0 -2
- package/dist/__tests__/computer-client.test.d.ts.map +0 -1
- package/dist/__tests__/computer-client.test.js +0 -174
- package/dist/__tests__/computer-client.test.js.map +0 -1
- package/dist/__tests__/index.test.d.ts +0 -2
- package/dist/__tests__/index.test.d.ts.map +0 -1
- package/dist/__tests__/index.test.js +0 -385
- package/dist/__tests__/index.test.js.map +0 -1
- package/dist/__tests__/server-process.test.d.ts +0 -2
- package/dist/__tests__/server-process.test.d.ts.map +0 -1
- package/dist/__tests__/server-process.test.js +0 -127
- package/dist/__tests__/server-process.test.js.map +0 -1
- package/dist/__tests__/vision.test.d.ts +0 -2
- package/dist/__tests__/vision.test.d.ts.map +0 -1
- package/dist/__tests__/vision.test.js +0 -36
- package/dist/__tests__/vision.test.js.map +0 -1
- package/dist/actions.d.ts +0 -15
- package/dist/actions.d.ts.map +0 -1
- package/dist/actions.js +0 -45
- package/dist/actions.js.map +0 -1
- package/dist/computer-client.d.ts +0 -13
- package/dist/computer-client.d.ts.map +0 -1
- package/dist/computer-client.js +0 -109
- package/dist/computer-client.js.map +0 -1
- package/dist/server-process.d.ts +0 -9
- package/dist/server-process.d.ts.map +0 -1
- package/dist/server-process.js +0 -76
- package/dist/server-process.js.map +0 -1
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, test, vi } from 'vitest';
|
|
2
|
-
const mockKill = vi.fn();
|
|
3
|
-
let processExitHandler = null;
|
|
4
|
-
let _processErrorHandler = null;
|
|
5
|
-
let mockExitCode = null;
|
|
6
|
-
const mockSpawn = vi.fn((_cmd, _args, _opts) => ({
|
|
7
|
-
get exitCode() {
|
|
8
|
-
return mockExitCode;
|
|
9
|
-
},
|
|
10
|
-
stderr: {
|
|
11
|
-
on: vi.fn(),
|
|
12
|
-
},
|
|
13
|
-
on: vi.fn((event, handler) => {
|
|
14
|
-
if (event === 'exit')
|
|
15
|
-
processExitHandler = handler;
|
|
16
|
-
if (event === 'error')
|
|
17
|
-
_processErrorHandler = handler;
|
|
18
|
-
}),
|
|
19
|
-
kill: mockKill,
|
|
20
|
-
}));
|
|
21
|
-
vi.mock('node:child_process', () => ({
|
|
22
|
-
spawn: (cmd, args, opts) => mockSpawn(cmd, args, opts),
|
|
23
|
-
}));
|
|
24
|
-
let wsProbeCallCount = 0;
|
|
25
|
-
let wsProbeSuccess = () => true;
|
|
26
|
-
vi.mock('ws', () => ({
|
|
27
|
-
default: class MockWsProbe {
|
|
28
|
-
static OPEN = 1;
|
|
29
|
-
readyState = 1;
|
|
30
|
-
send = vi.fn();
|
|
31
|
-
close = vi.fn();
|
|
32
|
-
terminate = vi.fn();
|
|
33
|
-
off = vi.fn();
|
|
34
|
-
on;
|
|
35
|
-
constructor() {
|
|
36
|
-
const idx = wsProbeCallCount++;
|
|
37
|
-
const shouldSucceed = wsProbeSuccess(idx);
|
|
38
|
-
this.on = (event, handler) => {
|
|
39
|
-
if (event === 'open' && shouldSucceed) {
|
|
40
|
-
setTimeout(() => handler(), 0);
|
|
41
|
-
}
|
|
42
|
-
if (event === 'error' && !shouldSucceed) {
|
|
43
|
-
setTimeout(() => handler(new Error('ECONNREFUSED')), 0);
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
}));
|
|
49
|
-
const { ComputerServerProcess } = await import('../server-process.js');
|
|
50
|
-
describe('ComputerServerProcess', () => {
|
|
51
|
-
beforeEach(() => {
|
|
52
|
-
mockSpawn.mockClear();
|
|
53
|
-
mockKill.mockClear();
|
|
54
|
-
processExitHandler = null;
|
|
55
|
-
_processErrorHandler = null;
|
|
56
|
-
mockExitCode = null;
|
|
57
|
-
wsProbeCallCount = 0;
|
|
58
|
-
wsProbeSuccess = () => true;
|
|
59
|
-
});
|
|
60
|
-
describe('start()', () => {
|
|
61
|
-
test('spawns subprocess with default args', async () => {
|
|
62
|
-
const server = new ComputerServerProcess();
|
|
63
|
-
await server.start({});
|
|
64
|
-
expect(mockSpawn).toHaveBeenCalledWith('uvx', ['cua-computer-server', '--host', '127.0.0.1', '--port', '8000'], { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
65
|
-
});
|
|
66
|
-
test('uses custom command, package, host, port', async () => {
|
|
67
|
-
const server = new ComputerServerProcess();
|
|
68
|
-
await server.start({
|
|
69
|
-
command: 'pipx',
|
|
70
|
-
package: 'my-server',
|
|
71
|
-
host: '0.0.0.0',
|
|
72
|
-
port: 9090,
|
|
73
|
-
});
|
|
74
|
-
expect(mockSpawn).toHaveBeenCalledWith('pipx', ['my-server', '--host', '0.0.0.0', '--port', '9090'], { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
75
|
-
});
|
|
76
|
-
test('appends extraArgs', async () => {
|
|
77
|
-
const server = new ComputerServerProcess();
|
|
78
|
-
await server.start({ extraArgs: ['--verbose', '--no-sandbox'] });
|
|
79
|
-
expect(mockSpawn).toHaveBeenCalledWith('uvx', [
|
|
80
|
-
'cua-computer-server',
|
|
81
|
-
'--host',
|
|
82
|
-
'127.0.0.1',
|
|
83
|
-
'--port',
|
|
84
|
-
'8000',
|
|
85
|
-
'--verbose',
|
|
86
|
-
'--no-sandbox',
|
|
87
|
-
], { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
88
|
-
});
|
|
89
|
-
test('retries WS probe until success', async () => {
|
|
90
|
-
wsProbeSuccess = (idx) => idx >= 2;
|
|
91
|
-
const server = new ComputerServerProcess();
|
|
92
|
-
await server.start({});
|
|
93
|
-
expect(wsProbeCallCount).toBeGreaterThanOrEqual(3);
|
|
94
|
-
});
|
|
95
|
-
test('throws if process exits before ready', async () => {
|
|
96
|
-
mockExitCode = 1;
|
|
97
|
-
wsProbeSuccess = () => false;
|
|
98
|
-
const server = new ComputerServerProcess();
|
|
99
|
-
await expect(server.start({})).rejects.toThrow('cua-computer-server exited with code 1 before becoming ready');
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
describe('stop()', () => {
|
|
103
|
-
test('sends SIGTERM to subprocess', async () => {
|
|
104
|
-
const server = new ComputerServerProcess();
|
|
105
|
-
await server.start({});
|
|
106
|
-
const stopPromise = server.stop();
|
|
107
|
-
setTimeout(() => processExitHandler?.(0), 10);
|
|
108
|
-
await stopPromise;
|
|
109
|
-
expect(mockKill).toHaveBeenCalledWith('SIGTERM');
|
|
110
|
-
});
|
|
111
|
-
test('no-ops when no process is running', async () => {
|
|
112
|
-
const server = new ComputerServerProcess();
|
|
113
|
-
await server.stop();
|
|
114
|
-
expect(mockKill).not.toHaveBeenCalled();
|
|
115
|
-
});
|
|
116
|
-
test('sends SIGKILL if process does not exit within grace period', async () => {
|
|
117
|
-
const server = new ComputerServerProcess();
|
|
118
|
-
await server.start({});
|
|
119
|
-
const stopPromise = server.stop();
|
|
120
|
-
// Don't call processExitHandler — simulate process not exiting
|
|
121
|
-
await stopPromise;
|
|
122
|
-
expect(mockKill).toHaveBeenCalledWith('SIGTERM');
|
|
123
|
-
expect(mockKill).toHaveBeenCalledWith('SIGKILL');
|
|
124
|
-
}, 10_000);
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
//# sourceMappingURL=server-process.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server-process.test.js","sourceRoot":"","sources":["../../src/__tests__/server-process.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vision.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/vision.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test, vi } from 'vitest';
|
|
2
|
-
import { createPiVisionCaller, VISUAL_SYSTEM_PROMPT } from '../vision.js';
|
|
3
|
-
describe('vision', () => {
|
|
4
|
-
describe('VISUAL_SYSTEM_PROMPT', () => {
|
|
5
|
-
test('contains key instructions for computer-use analysis', () => {
|
|
6
|
-
expect(VISUAL_SYSTEM_PROMPT).toContain('Visual Analysis Agent');
|
|
7
|
-
expect(VISUAL_SYSTEM_PROMPT).toContain('pixel coordinates');
|
|
8
|
-
expect(VISUAL_SYSTEM_PROMPT).toContain('clickable elements');
|
|
9
|
-
expect(VISUAL_SYSTEM_PROMPT).toContain('CENTER point');
|
|
10
|
-
expect(VISUAL_SYSTEM_PROMPT).toContain('Do NOT perform actions');
|
|
11
|
-
});
|
|
12
|
-
});
|
|
13
|
-
describe('createPiVisionCaller()', () => {
|
|
14
|
-
test('throws when model is not found in registry', async () => {
|
|
15
|
-
const mockCtx = {
|
|
16
|
-
modelRegistry: {
|
|
17
|
-
find: vi.fn(() => null),
|
|
18
|
-
getApiKeyAndHeaders: vi.fn(),
|
|
19
|
-
},
|
|
20
|
-
};
|
|
21
|
-
const caller = createPiVisionCaller({ provider: 'openai', model: 'gpt-4o' }, mockCtx);
|
|
22
|
-
await expect(caller('describe', 'base64data', 'image/png')).rejects.toThrow('not found in model registry');
|
|
23
|
-
});
|
|
24
|
-
test('throws when auth fails', async () => {
|
|
25
|
-
const mockCtx = {
|
|
26
|
-
modelRegistry: {
|
|
27
|
-
find: vi.fn(() => ({ id: 'gpt-4o', provider: 'openai' })),
|
|
28
|
-
getApiKeyAndHeaders: vi.fn(() => ({ ok: false, error: 'No API key configured' })),
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
-
const caller = createPiVisionCaller({ provider: 'openai', model: 'gpt-4o' }, mockCtx);
|
|
32
|
-
await expect(caller('describe', 'base64data', 'image/png')).rejects.toThrow('Auth failed for vision model');
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
//# sourceMappingURL=vision.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vision.test.js","sourceRoot":"","sources":["../../src/__tests__/vision.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE1E,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC/D,MAAM,CAAC,oBAAoB,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;YAChE,MAAM,CAAC,oBAAoB,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAC5D,MAAM,CAAC,oBAAoB,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YAC7D,MAAM,CAAC,oBAAoB,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YACvD,MAAM,CAAC,oBAAoB,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,OAAO,GAAG;gBACd,aAAa,EAAE;oBACb,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;oBACvB,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE;iBAC7B;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAc,CAAC,CAAC;YAE7F,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACzE,6BAA6B,CAC9B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,OAAO,GAAG;gBACd,aAAa,EAAE;oBACb,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;oBACzD,mBAAmB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;iBAClF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAc,CAAC,CAAC;YAE7F,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACzE,8BAA8B,CAC/B,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/actions.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { ComputerClient } from './computer-client.js';
|
|
2
|
-
export interface ComputerAction {
|
|
3
|
-
type: string;
|
|
4
|
-
x?: number;
|
|
5
|
-
y?: number;
|
|
6
|
-
button?: string;
|
|
7
|
-
text?: string;
|
|
8
|
-
keys?: string[];
|
|
9
|
-
scroll_x?: number;
|
|
10
|
-
scroll_y?: number;
|
|
11
|
-
path?: Array<[number, number]>;
|
|
12
|
-
command?: string;
|
|
13
|
-
}
|
|
14
|
-
export declare function dispatchAction(client: ComputerClient, action: ComputerAction): Promise<string | undefined>;
|
|
15
|
-
//# sourceMappingURL=actions.d.ts.map
|
package/dist/actions.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAqD7B"}
|
package/dist/actions.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
export async function dispatchAction(client, action) {
|
|
2
|
-
switch (action.type) {
|
|
3
|
-
case 'screenshot':
|
|
4
|
-
return undefined;
|
|
5
|
-
case 'click': {
|
|
6
|
-
const cmd = action.button === 'right' ? 'right_click' : 'left_click';
|
|
7
|
-
await client.sendCommand(cmd, { x: action.x, y: action.y });
|
|
8
|
-
return `Clicked (${action.button ?? 'left'}) at (${action.x}, ${action.y})`;
|
|
9
|
-
}
|
|
10
|
-
case 'double_click':
|
|
11
|
-
await client.sendCommand('double_click', { x: action.x, y: action.y });
|
|
12
|
-
return `Double-clicked at (${action.x}, ${action.y})`;
|
|
13
|
-
case 'type':
|
|
14
|
-
await client.sendCommand('type_text', { text: action.text });
|
|
15
|
-
return `Typed "${action.text}"`;
|
|
16
|
-
case 'keypress':
|
|
17
|
-
await client.sendCommand('hotkey', { keys: action.keys });
|
|
18
|
-
return `Pressed keys: ${action.keys?.join('+')}`;
|
|
19
|
-
case 'scroll':
|
|
20
|
-
await client.sendCommand('scroll', {
|
|
21
|
-
x: action.scroll_x ?? 0,
|
|
22
|
-
y: action.scroll_y ?? 0,
|
|
23
|
-
});
|
|
24
|
-
return `Scrolled (${action.scroll_x ?? 0}, ${action.scroll_y ?? 0})`;
|
|
25
|
-
case 'move':
|
|
26
|
-
await client.sendCommand('move_cursor', { x: action.x, y: action.y });
|
|
27
|
-
return `Moved cursor to (${action.x}, ${action.y})`;
|
|
28
|
-
case 'drag':
|
|
29
|
-
await client.sendCommand('drag', { path: action.path, button: action.button ?? 'left' });
|
|
30
|
-
return `Dragged along ${action.path?.length ?? 0} points`;
|
|
31
|
-
case 'wait':
|
|
32
|
-
await new Promise((r) => setTimeout(r, 1_000));
|
|
33
|
-
return 'Waited 1 second';
|
|
34
|
-
case 'run_command': {
|
|
35
|
-
const result = await client.sendCommand('run_command', { command: action.command });
|
|
36
|
-
const stdout = result.stdout ?? '';
|
|
37
|
-
const stderr = result.stderr ?? '';
|
|
38
|
-
const output = [stdout, stderr].filter(Boolean).join('\n');
|
|
39
|
-
return output || 'Command executed (no output)';
|
|
40
|
-
}
|
|
41
|
-
default:
|
|
42
|
-
throw new Error(`Unknown action type: ${action.type}`);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=actions.js.map
|
package/dist/actions.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { ComputerUseConfig } from './config.js';
|
|
2
|
-
export declare class ComputerClient {
|
|
3
|
-
private ws;
|
|
4
|
-
private commandLock;
|
|
5
|
-
private config;
|
|
6
|
-
constructor(config: ComputerUseConfig);
|
|
7
|
-
connect(): Promise<void>;
|
|
8
|
-
sendCommand(command: string, params?: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
9
|
-
screenshot(): Promise<string>;
|
|
10
|
-
close(): Promise<void>;
|
|
11
|
-
private authenticate;
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=computer-client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"computer-client.d.ts","sourceRoot":"","sources":["../src/computer-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIrD,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,WAAW,CAAuC;IAC1D,OAAO,CAAC,MAAM,CAAoB;gBAEtB,MAAM,EAAE,iBAAiB;IAI/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BxB,WAAW,CACf,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAqC7B,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAS7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,OAAO,CAAC,YAAY;CAyBrB"}
|
package/dist/computer-client.js
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import WebSocket from 'ws';
|
|
2
|
-
const COMMAND_TIMEOUT_MS = 30_000;
|
|
3
|
-
export class ComputerClient {
|
|
4
|
-
ws = null;
|
|
5
|
-
commandLock = Promise.resolve();
|
|
6
|
-
config;
|
|
7
|
-
constructor(config) {
|
|
8
|
-
this.config = config;
|
|
9
|
-
}
|
|
10
|
-
async connect() {
|
|
11
|
-
const host = this.config.host ?? '127.0.0.1';
|
|
12
|
-
const port = this.config.port ?? 8000;
|
|
13
|
-
const protocol = this.config.apiKey ? 'wss' : 'ws';
|
|
14
|
-
const url = `${protocol}://${host}:${port}/ws`;
|
|
15
|
-
const headers = {};
|
|
16
|
-
if (this.config.apiKey)
|
|
17
|
-
headers['X-API-Key'] = this.config.apiKey;
|
|
18
|
-
if (this.config.vmName)
|
|
19
|
-
headers['X-VM-Name'] = this.config.vmName;
|
|
20
|
-
this.ws = await new Promise((resolve, reject) => {
|
|
21
|
-
const ws = new WebSocket(url, { headers });
|
|
22
|
-
ws.on('open', async () => {
|
|
23
|
-
if (this.config.apiKey && this.config.vmName) {
|
|
24
|
-
try {
|
|
25
|
-
await this.authenticate(ws);
|
|
26
|
-
}
|
|
27
|
-
catch (err) {
|
|
28
|
-
ws.close();
|
|
29
|
-
reject(err);
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
resolve(ws);
|
|
34
|
-
});
|
|
35
|
-
ws.on('error', (err) => reject(new Error(`WebSocket connection failed: ${err.message}`)));
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
async sendCommand(command, params = {}) {
|
|
39
|
-
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
|
|
40
|
-
throw new Error('WebSocket not connected');
|
|
41
|
-
}
|
|
42
|
-
const result = await new Promise((resolve, reject) => {
|
|
43
|
-
const execute = () => new Promise((innerResolve, innerReject) => {
|
|
44
|
-
const timer = setTimeout(() => {
|
|
45
|
-
innerReject(new Error(`Command "${command}" timed out after ${COMMAND_TIMEOUT_MS}ms`));
|
|
46
|
-
}, COMMAND_TIMEOUT_MS);
|
|
47
|
-
const handler = (data) => {
|
|
48
|
-
clearTimeout(timer);
|
|
49
|
-
this.ws?.off('message', handler);
|
|
50
|
-
try {
|
|
51
|
-
const response = JSON.parse(data.toString());
|
|
52
|
-
if (response.error) {
|
|
53
|
-
innerReject(new Error(response.error));
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
innerResolve(response);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
catch (err) {
|
|
60
|
-
innerReject(err);
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
this.ws.on('message', handler);
|
|
64
|
-
this.ws.send(JSON.stringify({ command, params }));
|
|
65
|
-
});
|
|
66
|
-
this.commandLock = this.commandLock.then(() => execute().then(resolve, reject));
|
|
67
|
-
});
|
|
68
|
-
return result;
|
|
69
|
-
}
|
|
70
|
-
async screenshot() {
|
|
71
|
-
const response = await this.sendCommand('screenshot', {});
|
|
72
|
-
const imageData = response.image_data;
|
|
73
|
-
if (!imageData) {
|
|
74
|
-
throw new Error('No image_data in screenshot response');
|
|
75
|
-
}
|
|
76
|
-
return imageData;
|
|
77
|
-
}
|
|
78
|
-
async close() {
|
|
79
|
-
if (this.ws) {
|
|
80
|
-
this.ws.close();
|
|
81
|
-
this.ws = null;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
authenticate(ws) {
|
|
85
|
-
return new Promise((resolve, reject) => {
|
|
86
|
-
const handler = (data) => {
|
|
87
|
-
ws.off('message', handler);
|
|
88
|
-
try {
|
|
89
|
-
const response = JSON.parse(data.toString());
|
|
90
|
-
if (response.success) {
|
|
91
|
-
resolve();
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
reject(new Error(`Authentication failed: ${response.error ?? 'unknown error'}`));
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
catch (err) {
|
|
98
|
-
reject(err);
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
ws.on('message', handler);
|
|
102
|
-
ws.send(JSON.stringify({
|
|
103
|
-
command: 'authenticate',
|
|
104
|
-
params: { api_key: this.config.apiKey, container_name: this.config.vmName },
|
|
105
|
-
}));
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=computer-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"computer-client.js","sourceRoot":"","sources":["../src/computer-client.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAG3B,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,MAAM,OAAO,cAAc;IACjB,EAAE,GAAqB,IAAI,CAAC;IAC5B,WAAW,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAClD,MAAM,CAAoB;IAElC,YAAY,MAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACnD,MAAM,GAAG,GAAG,GAAG,QAAQ,MAAM,IAAI,IAAI,IAAI,KAAK,CAAC;QAE/C,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAClE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAElE,IAAI,CAAC,EAAE,GAAG,MAAM,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACzD,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3C,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;gBACvB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;oBAC7C,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;oBAC9B,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,EAAE,CAAC,KAAK,EAAE,CAAC;wBACX,MAAM,CAAC,GAAG,CAAC,CAAC;wBACZ,OAAO;oBACT,CAAC;gBACH,CAAC;gBACD,OAAO,CAAC,EAAE,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CACf,OAAe,EACf,SAAkC,EAAE;QAEpC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC5E,MAAM,OAAO,GAAG,GAAqC,EAAE,CACrD,IAAI,OAAO,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE;gBACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,WAAW,CAAC,IAAI,KAAK,CAAC,YAAY,OAAO,qBAAqB,kBAAkB,IAAI,CAAC,CAAC,CAAC;gBACzF,CAAC,EAAE,kBAAkB,CAAC,CAAC;gBAEvB,MAAM,OAAO,GAAG,CAAC,IAAuB,EAAE,EAAE;oBAC1C,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBACjC,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAA4B,CAAC;wBACxE,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;4BACnB,WAAW,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAe,CAAC,CAAC,CAAC;wBACnD,CAAC;6BAAM,CAAC;4BACN,YAAY,CAAC,QAAQ,CAAC,CAAC;wBACzB,CAAC;oBACH,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,WAAW,CAAC,GAAG,CAAC,CAAC;oBACnB,CAAC;gBACH,CAAC,CAAC;gBAEF,IAAI,CAAC,EAAG,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAChC,IAAI,CAAC,EAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;YAEL,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAgC,CAAC;QAC5D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,EAAa;QAChC,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,MAAM,OAAO,GAAG,CAAC,IAAuB,EAAE,EAAE;gBAC1C,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAA4B,CAAC;oBACxE,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;wBACrB,OAAO,EAAE,CAAC;oBACZ,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC;oBACnF,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;YACH,CAAC,CAAC;YAEF,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC1B,EAAE,CAAC,IAAI,CACL,IAAI,CAAC,SAAS,CAAC;gBACb,OAAO,EAAE,cAAc;gBACvB,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;aAC5E,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
package/dist/server-process.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { ComputerUseConfig } from './config.js';
|
|
2
|
-
export declare class ComputerServerProcess {
|
|
3
|
-
private proc;
|
|
4
|
-
start(config: ComputerUseConfig): Promise<void>;
|
|
5
|
-
stop(): Promise<void>;
|
|
6
|
-
private waitForReady;
|
|
7
|
-
private probeWs;
|
|
8
|
-
}
|
|
9
|
-
//# sourceMappingURL=server-process.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server-process.d.ts","sourceRoot":"","sources":["../src/server-process.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAMrD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,IAAI,CAA6B;IAEnC,KAAK,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB/C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAqBb,YAAY;IAoB1B,OAAO,CAAC,OAAO;CAqBhB"}
|
package/dist/server-process.js
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
import WebSocket from 'ws';
|
|
3
|
-
const READY_TIMEOUT_MS = 30_000;
|
|
4
|
-
const POLL_INTERVAL_MS = 500;
|
|
5
|
-
const KILL_GRACE_MS = 2_000;
|
|
6
|
-
export class ComputerServerProcess {
|
|
7
|
-
proc = null;
|
|
8
|
-
async start(config) {
|
|
9
|
-
const cmd = config.command ?? 'uvx';
|
|
10
|
-
const pkg = config.package ?? 'cua-computer-server';
|
|
11
|
-
const host = config.host ?? '127.0.0.1';
|
|
12
|
-
const port = config.port ?? 8000;
|
|
13
|
-
const args = [pkg, '--host', host, '--port', String(port), ...(config.extraArgs ?? [])];
|
|
14
|
-
this.proc = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
15
|
-
this.proc.stderr?.on('data', (chunk) => {
|
|
16
|
-
const line = chunk.toString().trim();
|
|
17
|
-
if (line)
|
|
18
|
-
console.error(`[pi-computer-use] ${line}`);
|
|
19
|
-
});
|
|
20
|
-
this.proc.on('error', (err) => {
|
|
21
|
-
console.error(`[pi-computer-use] Failed to start ${cmd}: ${err.message}`);
|
|
22
|
-
});
|
|
23
|
-
await this.waitForReady(host, port);
|
|
24
|
-
}
|
|
25
|
-
async stop() {
|
|
26
|
-
if (!this.proc)
|
|
27
|
-
return;
|
|
28
|
-
const proc = this.proc;
|
|
29
|
-
this.proc = null;
|
|
30
|
-
proc.kill('SIGTERM');
|
|
31
|
-
await new Promise((resolve) => {
|
|
32
|
-
const timer = setTimeout(() => {
|
|
33
|
-
proc.kill('SIGKILL');
|
|
34
|
-
resolve();
|
|
35
|
-
}, KILL_GRACE_MS);
|
|
36
|
-
proc.on('exit', () => {
|
|
37
|
-
clearTimeout(timer);
|
|
38
|
-
resolve();
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
async waitForReady(host, port) {
|
|
43
|
-
const wsUrl = `ws://${host}:${port}/ws`;
|
|
44
|
-
const deadline = Date.now() + READY_TIMEOUT_MS;
|
|
45
|
-
while (Date.now() < deadline) {
|
|
46
|
-
if (this.proc?.exitCode !== null && this.proc?.exitCode !== undefined) {
|
|
47
|
-
throw new Error(`cua-computer-server exited with code ${this.proc.exitCode} before becoming ready`);
|
|
48
|
-
}
|
|
49
|
-
const ready = await this.probeWs(wsUrl);
|
|
50
|
-
if (ready)
|
|
51
|
-
return;
|
|
52
|
-
await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
|
|
53
|
-
}
|
|
54
|
-
throw new Error(`cua-computer-server not ready after ${READY_TIMEOUT_MS}ms`);
|
|
55
|
-
}
|
|
56
|
-
probeWs(url) {
|
|
57
|
-
return new Promise((resolve) => {
|
|
58
|
-
const ws = new WebSocket(url);
|
|
59
|
-
const timer = setTimeout(() => {
|
|
60
|
-
ws.terminate();
|
|
61
|
-
resolve(false);
|
|
62
|
-
}, 1_000);
|
|
63
|
-
ws.on('open', () => {
|
|
64
|
-
clearTimeout(timer);
|
|
65
|
-
ws.close();
|
|
66
|
-
resolve(true);
|
|
67
|
-
});
|
|
68
|
-
ws.on('error', () => {
|
|
69
|
-
clearTimeout(timer);
|
|
70
|
-
ws.terminate();
|
|
71
|
-
resolve(false);
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
//# sourceMappingURL=server-process.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server-process.js","sourceRoot":"","sources":["../src/server-process.ts"],"names":[],"mappings":"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"}
|