@amaster.ai/pi-computer-use 0.1.2-beta.2 → 0.1.2-beta.4

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 (46) hide show
  1. package/README.md +120 -0
  2. package/bin/darwin-arm64/cua-driver +0 -0
  3. package/bin/darwin-x64/cua-driver +0 -0
  4. package/bin/linux-x64/cua-driver +0 -0
  5. package/bin/win32-arm64/cua-driver.exe +0 -0
  6. package/bin/win32-x64/cua-driver.exe +0 -0
  7. package/dist/config.d.ts +5 -19
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +1 -6
  10. package/dist/config.js.map +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +162 -78
  13. package/dist/index.js.map +1 -1
  14. package/dist/mcp-client.d.ts +22 -0
  15. package/dist/mcp-client.d.ts.map +1 -0
  16. package/dist/mcp-client.js +71 -0
  17. package/dist/mcp-client.js.map +1 -0
  18. package/package.json +15 -5
  19. package/dist/__tests__/computer-client.test.d.ts +0 -2
  20. package/dist/__tests__/computer-client.test.d.ts.map +0 -1
  21. package/dist/__tests__/computer-client.test.js +0 -174
  22. package/dist/__tests__/computer-client.test.js.map +0 -1
  23. package/dist/__tests__/index.test.d.ts +0 -2
  24. package/dist/__tests__/index.test.d.ts.map +0 -1
  25. package/dist/__tests__/index.test.js +0 -385
  26. package/dist/__tests__/index.test.js.map +0 -1
  27. package/dist/__tests__/server-process.test.d.ts +0 -2
  28. package/dist/__tests__/server-process.test.d.ts.map +0 -1
  29. package/dist/__tests__/server-process.test.js +0 -127
  30. package/dist/__tests__/server-process.test.js.map +0 -1
  31. package/dist/__tests__/vision.test.d.ts +0 -2
  32. package/dist/__tests__/vision.test.d.ts.map +0 -1
  33. package/dist/__tests__/vision.test.js +0 -36
  34. package/dist/__tests__/vision.test.js.map +0 -1
  35. package/dist/actions.d.ts +0 -15
  36. package/dist/actions.d.ts.map +0 -1
  37. package/dist/actions.js +0 -45
  38. package/dist/actions.js.map +0 -1
  39. package/dist/computer-client.d.ts +0 -13
  40. package/dist/computer-client.d.ts.map +0 -1
  41. package/dist/computer-client.js +0 -109
  42. package/dist/computer-client.js.map +0 -1
  43. package/dist/server-process.d.ts +0 -9
  44. package/dist/server-process.d.ts.map +0 -1
  45. package/dist/server-process.js +0 -76
  46. package/dist/server-process.js.map +0 -1
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=server-process.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-process.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/server-process.test.ts"],"names":[],"mappings":""}
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=vision.test.d.ts.map
@@ -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
@@ -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
@@ -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"}
@@ -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":"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"}
@@ -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"}
@@ -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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"}