@denisixnpm/agent-rdp 0.0.1 → 0.7.0
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/CHANGELOG.md +263 -0
- package/README.md +525 -0
- package/bin/cli.js +61 -0
- package/dist/automation.d.ts +199 -0
- package/dist/automation.d.ts.map +1 -0
- package/dist/automation.js +309 -0
- package/dist/automation.js.map +1 -0
- package/dist/client.d.ts +45 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +146 -0
- package/dist/client.js.map +1 -0
- package/dist/daemon.d.ts +32 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +175 -0
- package/dist/daemon.js.map +1 -0
- package/dist/generated/AccessibilityElement.d.ts +47 -0
- package/dist/generated/AccessibilityElement.d.ts.map +1 -0
- package/dist/generated/AccessibilityElement.js +2 -0
- package/dist/generated/AccessibilityElement.js.map +1 -0
- package/dist/generated/AccessibilitySnapshot.d.ts +27 -0
- package/dist/generated/AccessibilitySnapshot.d.ts.map +1 -0
- package/dist/generated/AccessibilitySnapshot.js +2 -0
- package/dist/generated/AccessibilitySnapshot.js.map +1 -0
- package/dist/generated/AutomateRequest.d.ts +192 -0
- package/dist/generated/AutomateRequest.d.ts.map +1 -0
- package/dist/generated/AutomateRequest.js +2 -0
- package/dist/generated/AutomateRequest.js.map +1 -0
- package/dist/generated/AutomationHandshake.d.ts +26 -0
- package/dist/generated/AutomationHandshake.d.ts.map +1 -0
- package/dist/generated/AutomationHandshake.js +3 -0
- package/dist/generated/AutomationHandshake.js.map +1 -0
- package/dist/generated/AutomationScrollDirection.d.ts +5 -0
- package/dist/generated/AutomationScrollDirection.d.ts.map +1 -0
- package/dist/generated/AutomationScrollDirection.js +3 -0
- package/dist/generated/AutomationScrollDirection.js.map +1 -0
- package/dist/generated/AutomationStatus.d.ts +22 -0
- package/dist/generated/AutomationStatus.d.ts.map +1 -0
- package/dist/generated/AutomationStatus.js +3 -0
- package/dist/generated/AutomationStatus.js.map +1 -0
- package/dist/generated/ClickResult.d.ts +22 -0
- package/dist/generated/ClickResult.d.ts.map +1 -0
- package/dist/generated/ClickResult.js +3 -0
- package/dist/generated/ClickResult.js.map +1 -0
- package/dist/generated/ClipboardRequest.d.ts +10 -0
- package/dist/generated/ClipboardRequest.d.ts.map +1 -0
- package/dist/generated/ClipboardRequest.js +3 -0
- package/dist/generated/ClipboardRequest.js.map +1 -0
- package/dist/generated/ConnectRequest.d.ts +68 -0
- package/dist/generated/ConnectRequest.d.ts.map +1 -0
- package/dist/generated/ConnectRequest.js +2 -0
- package/dist/generated/ConnectRequest.js.map +1 -0
- package/dist/generated/ConnectionState.d.ts +5 -0
- package/dist/generated/ConnectionState.d.ts.map +1 -0
- package/dist/generated/ConnectionState.js +3 -0
- package/dist/generated/ConnectionState.js.map +1 -0
- package/dist/generated/DriveMapping.d.ts +14 -0
- package/dist/generated/DriveMapping.d.ts.map +1 -0
- package/dist/generated/DriveMapping.js +3 -0
- package/dist/generated/DriveMapping.js.map +1 -0
- package/dist/generated/DriveRequest.d.ts +9 -0
- package/dist/generated/DriveRequest.d.ts.map +1 -0
- package/dist/generated/DriveRequest.js +3 -0
- package/dist/generated/DriveRequest.js.map +1 -0
- package/dist/generated/ElementBounds.d.ts +10 -0
- package/dist/generated/ElementBounds.d.ts.map +1 -0
- package/dist/generated/ElementBounds.js +3 -0
- package/dist/generated/ElementBounds.js.map +1 -0
- package/dist/generated/ElementValue.d.ts +23 -0
- package/dist/generated/ElementValue.d.ts.map +1 -0
- package/dist/generated/ElementValue.js +2 -0
- package/dist/generated/ElementValue.js.map +1 -0
- package/dist/generated/ErrorCode.d.ts +5 -0
- package/dist/generated/ErrorCode.d.ts.map +1 -0
- package/dist/generated/ErrorCode.js +3 -0
- package/dist/generated/ErrorCode.js.map +1 -0
- package/dist/generated/ErrorInfo.d.ts +15 -0
- package/dist/generated/ErrorInfo.d.ts.map +1 -0
- package/dist/generated/ErrorInfo.js +2 -0
- package/dist/generated/ErrorInfo.js.map +1 -0
- package/dist/generated/FileIpcError.d.ts +14 -0
- package/dist/generated/FileIpcError.d.ts.map +1 -0
- package/dist/generated/FileIpcError.js +3 -0
- package/dist/generated/FileIpcError.js.map +1 -0
- package/dist/generated/FileIpcRequest.d.ts +18 -0
- package/dist/generated/FileIpcRequest.d.ts.map +1 -0
- package/dist/generated/FileIpcRequest.js +3 -0
- package/dist/generated/FileIpcRequest.js.map +1 -0
- package/dist/generated/FileIpcResponse.d.ts +27 -0
- package/dist/generated/FileIpcResponse.d.ts.map +1 -0
- package/dist/generated/FileIpcResponse.js +2 -0
- package/dist/generated/FileIpcResponse.js.map +1 -0
- package/dist/generated/ImageFormat.d.ts +5 -0
- package/dist/generated/ImageFormat.d.ts.map +1 -0
- package/dist/generated/ImageFormat.js +3 -0
- package/dist/generated/ImageFormat.js.map +1 -0
- package/dist/generated/KeyboardRequest.d.ts +17 -0
- package/dist/generated/KeyboardRequest.d.ts.map +1 -0
- package/dist/generated/KeyboardRequest.js +3 -0
- package/dist/generated/KeyboardRequest.js.map +1 -0
- package/dist/generated/LocateRequest.d.ts +23 -0
- package/dist/generated/LocateRequest.d.ts.map +1 -0
- package/dist/generated/LocateRequest.js +3 -0
- package/dist/generated/LocateRequest.js.map +1 -0
- package/dist/generated/LocateResult.d.ts +15 -0
- package/dist/generated/LocateResult.d.ts.map +1 -0
- package/dist/generated/LocateResult.js +2 -0
- package/dist/generated/LocateResult.js.map +1 -0
- package/dist/generated/MappedDrive.d.ts +14 -0
- package/dist/generated/MappedDrive.d.ts.map +1 -0
- package/dist/generated/MappedDrive.js +3 -0
- package/dist/generated/MappedDrive.js.map +1 -0
- package/dist/generated/MouseButton.d.ts +5 -0
- package/dist/generated/MouseButton.d.ts.map +1 -0
- package/dist/generated/MouseButton.js +3 -0
- package/dist/generated/MouseButton.js.map +1 -0
- package/dist/generated/MouseRequest.d.ts +38 -0
- package/dist/generated/MouseRequest.d.ts.map +1 -0
- package/dist/generated/MouseRequest.js +2 -0
- package/dist/generated/MouseRequest.js.map +1 -0
- package/dist/generated/OcrMatch.d.ts +34 -0
- package/dist/generated/OcrMatch.d.ts.map +1 -0
- package/dist/generated/OcrMatch.js +3 -0
- package/dist/generated/OcrMatch.js.map +1 -0
- package/dist/generated/Request.d.ts +40 -0
- package/dist/generated/Request.d.ts.map +1 -0
- package/dist/generated/Request.js +2 -0
- package/dist/generated/Request.js.map +1 -0
- package/dist/generated/Response.d.ts +20 -0
- package/dist/generated/Response.d.ts.map +1 -0
- package/dist/generated/Response.js +2 -0
- package/dist/generated/Response.js.map +1 -0
- package/dist/generated/ResponseData.d.ts +92 -0
- package/dist/generated/ResponseData.d.ts.map +1 -0
- package/dist/generated/ResponseData.js +2 -0
- package/dist/generated/ResponseData.js.map +1 -0
- package/dist/generated/RunPollResult.d.ts +26 -0
- package/dist/generated/RunPollResult.d.ts.map +1 -0
- package/dist/generated/RunPollResult.js +3 -0
- package/dist/generated/RunPollResult.js.map +1 -0
- package/dist/generated/RunResult.d.ts +22 -0
- package/dist/generated/RunResult.d.ts.map +1 -0
- package/dist/generated/RunResult.js +3 -0
- package/dist/generated/RunResult.js.map +1 -0
- package/dist/generated/ScreenshotRequest.d.ts +11 -0
- package/dist/generated/ScreenshotRequest.d.ts.map +1 -0
- package/dist/generated/ScreenshotRequest.js +2 -0
- package/dist/generated/ScreenshotRequest.js.map +1 -0
- package/dist/generated/ScrollDirection.d.ts +5 -0
- package/dist/generated/ScrollDirection.d.ts.map +1 -0
- package/dist/generated/ScrollDirection.js +3 -0
- package/dist/generated/ScrollDirection.js.map +1 -0
- package/dist/generated/ScrollRequest.d.ts +20 -0
- package/dist/generated/ScrollRequest.d.ts.map +1 -0
- package/dist/generated/ScrollRequest.js +2 -0
- package/dist/generated/ScrollRequest.js.map +1 -0
- package/dist/generated/SessionInfo.d.ts +35 -0
- package/dist/generated/SessionInfo.d.ts.map +1 -0
- package/dist/generated/SessionInfo.js +2 -0
- package/dist/generated/SessionInfo.js.map +1 -0
- package/dist/generated/SessionSummary.d.ts +19 -0
- package/dist/generated/SessionSummary.d.ts.map +1 -0
- package/dist/generated/SessionSummary.js +2 -0
- package/dist/generated/SessionSummary.js.map +1 -0
- package/dist/generated/WaitState.d.ts +5 -0
- package/dist/generated/WaitState.d.ts.map +1 -0
- package/dist/generated/WaitState.js +3 -0
- package/dist/generated/WaitState.js.map +1 -0
- package/dist/generated/WindowAction.d.ts +5 -0
- package/dist/generated/WindowAction.d.ts.map +1 -0
- package/dist/generated/WindowAction.js +3 -0
- package/dist/generated/WindowAction.js.map +1 -0
- package/dist/generated/WindowInfo.d.ts +31 -0
- package/dist/generated/WindowInfo.d.ts.map +1 -0
- package/dist/generated/WindowInfo.js +2 -0
- package/dist/generated/WindowInfo.js.map +1 -0
- package/dist/generated/index.d.ts +41 -0
- package/dist/generated/index.d.ts.map +1 -0
- package/dist/generated/index.js +3 -0
- package/dist/generated/index.js.map +1 -0
- package/dist/index.d.ts +211 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +341 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +125 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -0
- package/models/text-detection.rten +0 -0
- package/models/text-recognition.rten +0 -0
- package/package.json +52 -5
package/dist/client.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IPC client for communicating with the agent-rdp daemon.
|
|
3
|
+
*/
|
|
4
|
+
import * as net from 'node:net';
|
|
5
|
+
import * as crypto from 'node:crypto';
|
|
6
|
+
import { RdpError } from './types.js';
|
|
7
|
+
const DEFAULT_TIMEOUT = 30000;
|
|
8
|
+
/**
|
|
9
|
+
* Get the socket path for a session.
|
|
10
|
+
* On Windows, returns a TCP port number instead.
|
|
11
|
+
*/
|
|
12
|
+
export function getSocketPath(session) {
|
|
13
|
+
if (process.platform === 'win32') {
|
|
14
|
+
// Windows: use TCP port derived from session name hash
|
|
15
|
+
const hash = crypto.createHash('sha256').update(session).digest();
|
|
16
|
+
const port = 49152 + (hash.readUInt16LE(0) % 16383); // Range: 49152-65535
|
|
17
|
+
return port;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
// Unix: use socket file
|
|
21
|
+
return `/tmp/agent-rdp/${session}/socket`;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get the temp directory for a session.
|
|
26
|
+
*/
|
|
27
|
+
export function getSessionDir(session) {
|
|
28
|
+
if (process.platform === 'win32') {
|
|
29
|
+
const temp = process.env.TEMP || process.env.TMP || 'C:\\Windows\\Temp';
|
|
30
|
+
return `${temp}\\agent-rdp\\${session}`;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
return `/tmp/agent-rdp/${session}`;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* IPC client for communicating with the daemon.
|
|
38
|
+
*/
|
|
39
|
+
export class IpcClient {
|
|
40
|
+
session;
|
|
41
|
+
socket = null;
|
|
42
|
+
buffer = '';
|
|
43
|
+
pendingResolve = null;
|
|
44
|
+
pendingReject = null;
|
|
45
|
+
constructor(session) {
|
|
46
|
+
this.session = session;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Connect to the daemon socket.
|
|
50
|
+
*/
|
|
51
|
+
async connect() {
|
|
52
|
+
const socketPath = getSocketPath(this.session);
|
|
53
|
+
return new Promise((resolve, reject) => {
|
|
54
|
+
const socket = typeof socketPath === 'number'
|
|
55
|
+
? net.createConnection({ port: socketPath, host: '127.0.0.1' })
|
|
56
|
+
: net.createConnection({ path: socketPath });
|
|
57
|
+
socket.on('connect', () => {
|
|
58
|
+
this.socket = socket;
|
|
59
|
+
resolve();
|
|
60
|
+
});
|
|
61
|
+
socket.on('error', (err) => {
|
|
62
|
+
reject(new RdpError('ipc_error', `Failed to connect to daemon: ${err.message}`));
|
|
63
|
+
});
|
|
64
|
+
socket.on('data', (data) => {
|
|
65
|
+
this.buffer += data.toString();
|
|
66
|
+
this.processBuffer();
|
|
67
|
+
});
|
|
68
|
+
socket.on('close', () => {
|
|
69
|
+
this.socket = null;
|
|
70
|
+
if (this.pendingReject) {
|
|
71
|
+
this.pendingReject(new RdpError('ipc_error', 'Connection closed'));
|
|
72
|
+
this.pendingResolve = null;
|
|
73
|
+
this.pendingReject = null;
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Process buffered data looking for newline-delimited JSON.
|
|
80
|
+
*/
|
|
81
|
+
processBuffer() {
|
|
82
|
+
const newlineIndex = this.buffer.indexOf('\n');
|
|
83
|
+
if (newlineIndex === -1)
|
|
84
|
+
return;
|
|
85
|
+
const line = this.buffer.slice(0, newlineIndex);
|
|
86
|
+
this.buffer = this.buffer.slice(newlineIndex + 1);
|
|
87
|
+
if (this.pendingResolve) {
|
|
88
|
+
try {
|
|
89
|
+
const response = JSON.parse(line);
|
|
90
|
+
this.pendingResolve(response);
|
|
91
|
+
}
|
|
92
|
+
catch (_err) {
|
|
93
|
+
this.pendingReject?.(new RdpError('ipc_error', `Invalid JSON response: ${line}`));
|
|
94
|
+
}
|
|
95
|
+
this.pendingResolve = null;
|
|
96
|
+
this.pendingReject = null;
|
|
97
|
+
}
|
|
98
|
+
// Process any remaining complete messages
|
|
99
|
+
this.processBuffer();
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Send a request and wait for the response.
|
|
103
|
+
*/
|
|
104
|
+
async send(request, timeout = DEFAULT_TIMEOUT) {
|
|
105
|
+
if (!this.socket) {
|
|
106
|
+
throw new RdpError('ipc_error', 'Not connected to daemon');
|
|
107
|
+
}
|
|
108
|
+
return new Promise((resolve, reject) => {
|
|
109
|
+
this.pendingResolve = resolve;
|
|
110
|
+
this.pendingReject = reject;
|
|
111
|
+
const timeoutId = setTimeout(() => {
|
|
112
|
+
this.pendingResolve = null;
|
|
113
|
+
this.pendingReject = null;
|
|
114
|
+
reject(new RdpError('timeout', 'Request timed out'));
|
|
115
|
+
}, timeout);
|
|
116
|
+
const originalResolve = resolve;
|
|
117
|
+
this.pendingResolve = (response) => {
|
|
118
|
+
clearTimeout(timeoutId);
|
|
119
|
+
originalResolve(response);
|
|
120
|
+
};
|
|
121
|
+
const originalReject = reject;
|
|
122
|
+
this.pendingReject = (error) => {
|
|
123
|
+
clearTimeout(timeoutId);
|
|
124
|
+
originalReject(error);
|
|
125
|
+
};
|
|
126
|
+
const json = JSON.stringify(request) + '\n';
|
|
127
|
+
this.socket.write(json);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Close the connection.
|
|
132
|
+
*/
|
|
133
|
+
async close() {
|
|
134
|
+
if (this.socket) {
|
|
135
|
+
this.socket.end();
|
|
136
|
+
this.socket = null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Check if connected.
|
|
141
|
+
*/
|
|
142
|
+
isConnected() {
|
|
143
|
+
return this.socket !== null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon process management for agent-rdp.
|
|
3
|
+
*/
|
|
4
|
+
import { IpcClient } from './client.js';
|
|
5
|
+
/**
|
|
6
|
+
* Manages the daemon lifecycle for a session.
|
|
7
|
+
*/
|
|
8
|
+
export declare class DaemonManager {
|
|
9
|
+
private session;
|
|
10
|
+
private streamPort;
|
|
11
|
+
private sessionDir;
|
|
12
|
+
private pidFile;
|
|
13
|
+
constructor(session: string, streamPort?: number);
|
|
14
|
+
/**
|
|
15
|
+
* Check if the daemon is running.
|
|
16
|
+
*/
|
|
17
|
+
isRunning(): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Ensure the daemon is running, spawning it if necessary.
|
|
20
|
+
* Returns an IpcClient connected to the daemon.
|
|
21
|
+
*/
|
|
22
|
+
ensureRunning(): Promise<IpcClient>;
|
|
23
|
+
/**
|
|
24
|
+
* Spawn the daemon process.
|
|
25
|
+
*/
|
|
26
|
+
private spawn;
|
|
27
|
+
/**
|
|
28
|
+
* Get the socket path for this session.
|
|
29
|
+
*/
|
|
30
|
+
getSocketPath(): string | number;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,EAAE,SAAS,EAAgC,MAAM,aAAa,CAAC;AA4EtE;;GAEG;AACH,qBAAa,aAAa;IAKtB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;IALpB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;gBAGd,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,MAAU;IAMhC;;OAEG;IACH,SAAS,IAAI,OAAO;IAepB;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC;IAUzC;;OAEG;YACW,KAAK;IAuDnB;;OAEG;IACH,aAAa,IAAI,MAAM,GAAG,MAAM;CAGjC"}
|
package/dist/daemon.js
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon process management for agent-rdp.
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import { createRequire } from 'node:module';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
import { spawn } from 'node:child_process';
|
|
9
|
+
import { IpcClient, getSessionDir, getSocketPath } from './client.js';
|
|
10
|
+
import { RdpError } from './types.js';
|
|
11
|
+
const MAX_STARTUP_WAIT_MS = 10000;
|
|
12
|
+
const STARTUP_POLL_INTERVAL_MS = 100;
|
|
13
|
+
// Create require function for resolving platform package paths in ESM
|
|
14
|
+
const require = createRequire(import.meta.url);
|
|
15
|
+
/**
|
|
16
|
+
* Locate the OCR models bundled in this package.
|
|
17
|
+
*
|
|
18
|
+
* Models are architecture-independent, so they ship here once rather than
|
|
19
|
+
* being duplicated into every platform package.
|
|
20
|
+
*/
|
|
21
|
+
function findModelsDir() {
|
|
22
|
+
// dist/daemon.js -> package root
|
|
23
|
+
return path.join(path.dirname(fileURLToPath(import.meta.url)), '..', 'models');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get the platform package name for the current OS/arch.
|
|
27
|
+
*/
|
|
28
|
+
function getPlatformPackage() {
|
|
29
|
+
const platform = process.platform; // 'darwin', 'linux', 'win32'
|
|
30
|
+
const arch = process.arch; // 'arm64', 'x64'
|
|
31
|
+
return `@denisixnpm/agent-rdp-${platform}-${arch}`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Find the agent-rdp binary.
|
|
35
|
+
*/
|
|
36
|
+
function findBinary() {
|
|
37
|
+
const platformPackage = getPlatformPackage();
|
|
38
|
+
const ext = process.platform === 'win32' ? '.exe' : '';
|
|
39
|
+
try {
|
|
40
|
+
// Resolve the platform package's package.json, then find the binary
|
|
41
|
+
const packageJsonPath = require.resolve(`${platformPackage}/package.json`);
|
|
42
|
+
const packageDir = path.dirname(packageJsonPath);
|
|
43
|
+
const binaryPath = path.join(packageDir, 'bin', `agent-rdp${ext}`);
|
|
44
|
+
if (!fs.existsSync(binaryPath)) {
|
|
45
|
+
throw new RdpError('internal_error', `Binary not found at ${binaryPath}. Platform package ${platformPackage} may not be installed correctly.`);
|
|
46
|
+
}
|
|
47
|
+
// npm only guarantees the executable bit for files declared in a package's
|
|
48
|
+
// "bin" field, and dependency install scripts are opt-in as of npm v12, so
|
|
49
|
+
// the platform package's postinstall chmod may never run. Restore it here.
|
|
50
|
+
// Non-fatal: read-only stores (pnpm, Nix, container layers) will throw.
|
|
51
|
+
if (process.platform !== 'win32') {
|
|
52
|
+
try {
|
|
53
|
+
if (!(fs.statSync(binaryPath).mode & 0o111)) {
|
|
54
|
+
fs.chmodSync(binaryPath, 0o755);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Fall through - spawning will surface a clearer error if it really can't run.
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return binaryPath;
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
if (err instanceof RdpError) {
|
|
65
|
+
throw err;
|
|
66
|
+
}
|
|
67
|
+
throw new RdpError('not_supported', `Platform package ${platformPackage} is not installed. ` +
|
|
68
|
+
`Make sure you have the correct optional dependency installed for your platform.`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Manages the daemon lifecycle for a session.
|
|
73
|
+
*/
|
|
74
|
+
export class DaemonManager {
|
|
75
|
+
session;
|
|
76
|
+
streamPort;
|
|
77
|
+
sessionDir;
|
|
78
|
+
pidFile;
|
|
79
|
+
constructor(session, streamPort = 0) {
|
|
80
|
+
this.session = session;
|
|
81
|
+
this.streamPort = streamPort;
|
|
82
|
+
this.sessionDir = getSessionDir(session);
|
|
83
|
+
this.pidFile = path.join(this.sessionDir, 'pid');
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if the daemon is running.
|
|
87
|
+
*/
|
|
88
|
+
isRunning() {
|
|
89
|
+
if (!fs.existsSync(this.pidFile)) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
const pid = parseInt(fs.readFileSync(this.pidFile, 'utf8').trim(), 10);
|
|
94
|
+
// Check if process exists
|
|
95
|
+
process.kill(pid, 0);
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Ensure the daemon is running, spawning it if necessary.
|
|
104
|
+
* Returns an IpcClient connected to the daemon.
|
|
105
|
+
*/
|
|
106
|
+
async ensureRunning() {
|
|
107
|
+
if (!this.isRunning()) {
|
|
108
|
+
await this.spawn();
|
|
109
|
+
}
|
|
110
|
+
const client = new IpcClient(this.session);
|
|
111
|
+
await client.connect();
|
|
112
|
+
return client;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Spawn the daemon process.
|
|
116
|
+
*/
|
|
117
|
+
async spawn() {
|
|
118
|
+
const binary = findBinary();
|
|
119
|
+
// Ensure session directory exists
|
|
120
|
+
fs.mkdirSync(this.sessionDir, { recursive: true });
|
|
121
|
+
// Build daemon arguments
|
|
122
|
+
const args = ['--session', this.session];
|
|
123
|
+
if (this.streamPort > 0) {
|
|
124
|
+
args.push('--stream-port', this.streamPort.toString());
|
|
125
|
+
}
|
|
126
|
+
args.push('session', 'daemon');
|
|
127
|
+
// Spawn daemon in background
|
|
128
|
+
const child = spawn(binary, args, {
|
|
129
|
+
detached: true,
|
|
130
|
+
stdio: 'ignore',
|
|
131
|
+
env: {
|
|
132
|
+
...process.env,
|
|
133
|
+
AGENT_RDP_MODELS_DIR: process.env.AGENT_RDP_MODELS_DIR ?? findModelsDir(),
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
child.unref();
|
|
137
|
+
// Wait for daemon to be ready (socket file exists or TCP port responds)
|
|
138
|
+
const socketPath = getSocketPath(this.session);
|
|
139
|
+
const startTime = Date.now();
|
|
140
|
+
while (Date.now() - startTime < MAX_STARTUP_WAIT_MS) {
|
|
141
|
+
if (typeof socketPath === 'number') {
|
|
142
|
+
// Windows: try TCP connection
|
|
143
|
+
try {
|
|
144
|
+
const client = new IpcClient(this.session);
|
|
145
|
+
await client.connect();
|
|
146
|
+
await client.close();
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Not ready yet
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
// Unix: check if socket file exists
|
|
155
|
+
if (fs.existsSync(socketPath)) {
|
|
156
|
+
// Give it a moment to be ready
|
|
157
|
+
await sleep(50);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
await sleep(STARTUP_POLL_INTERVAL_MS);
|
|
162
|
+
}
|
|
163
|
+
throw new RdpError('daemon_not_running', 'Daemon failed to start within timeout');
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get the socket path for this session.
|
|
167
|
+
*/
|
|
168
|
+
getSocketPath() {
|
|
169
|
+
return getSocketPath(this.session);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function sleep(ms) {
|
|
173
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAClC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAErC,sEAAsE;AACtE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C;;;;;GAKG;AACH,SAAS,aAAa;IACpB,iCAAiC;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AACjF,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB;IACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,6BAA6B;IAChE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,iBAAiB;IAC5C,OAAO,yBAAyB,QAAQ,IAAI,IAAI,EAAE,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,SAAS,UAAU;IACjB,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvD,IAAI,CAAC;QACH,oEAAoE;QACpE,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,eAAe,eAAe,CAAC,CAAC;QAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,YAAY,GAAG,EAAE,CAAC,CAAC;QAEnE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,QAAQ,CAChB,gBAAgB,EAChB,uBAAuB,UAAU,sBAAsB,eAAe,kCAAkC,CACzG,CAAC;QACJ,CAAC;QAED,2EAA2E;QAC3E,2EAA2E;QAC3E,2EAA2E;QAC3E,wEAAwE;QACxE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,IAAI,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;oBAC5C,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,+EAA+E;YACjF,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC5B,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,MAAM,IAAI,QAAQ,CAChB,eAAe,EACf,oBAAoB,eAAe,qBAAqB;YACtD,iFAAiF,CACpF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,aAAa;IAKd;IACA;IALF,UAAU,CAAS;IACnB,OAAO,CAAS;IAExB,YACU,OAAe,EACf,aAAqB,CAAC;QADtB,YAAO,GAAP,OAAO,CAAQ;QACf,eAAU,GAAV,UAAU,CAAY;QAE9B,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,SAAS;QACP,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACvE,0BAA0B;YAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,KAAK;QACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAE5B,kCAAkC;QAClC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnD,yBAAyB;QACzB,MAAM,IAAI,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAE/B,6BAA6B;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE;YAChC,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;YACf,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,oBAAoB,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,aAAa,EAAE;aAC1E;SACF,CAAC,CAAC;QAEH,KAAK,CAAC,KAAK,EAAE,CAAC;QAEd,wEAAwE;QACxE,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,mBAAmB,EAAE,CAAC;YACpD,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;gBACnC,8BAA8B;gBAC9B,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC3C,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;oBACvB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;oBACrB,OAAO;gBACT,CAAC;gBAAC,MAAM,CAAC;oBACP,gBAAgB;gBAClB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,oCAAoC;gBACpC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9B,+BAA+B;oBAC/B,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;oBAChB,OAAO;gBACT,CAAC;YACH,CAAC;YAED,MAAM,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE,uCAAuC,CAAC,CAAC;IACpF,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;CACF;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { ElementBounds } from "./ElementBounds.js";
|
|
2
|
+
/**
|
|
3
|
+
* An element in the accessibility tree.
|
|
4
|
+
*/
|
|
5
|
+
export type AccessibilityElement = {
|
|
6
|
+
/**
|
|
7
|
+
* Reference number (for @ref selectors).
|
|
8
|
+
*/
|
|
9
|
+
ref?: number;
|
|
10
|
+
/**
|
|
11
|
+
* Element role (control type).
|
|
12
|
+
*/
|
|
13
|
+
role: string;
|
|
14
|
+
/**
|
|
15
|
+
* Element name.
|
|
16
|
+
*/
|
|
17
|
+
name?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Automation ID.
|
|
20
|
+
*/
|
|
21
|
+
automation_id?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Win32 class name.
|
|
24
|
+
*/
|
|
25
|
+
class_name?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Bounding rectangle.
|
|
28
|
+
*/
|
|
29
|
+
bounds?: ElementBounds;
|
|
30
|
+
/**
|
|
31
|
+
* Element states.
|
|
32
|
+
*/
|
|
33
|
+
states: Array<string>;
|
|
34
|
+
/**
|
|
35
|
+
* Current value (for editable elements).
|
|
36
|
+
*/
|
|
37
|
+
value?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Supported UI Automation patterns.
|
|
40
|
+
*/
|
|
41
|
+
patterns: Array<string>;
|
|
42
|
+
/**
|
|
43
|
+
* Child elements.
|
|
44
|
+
*/
|
|
45
|
+
children: Array<AccessibilityElement>;
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=AccessibilityElement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccessibilityElement.d.ts","sourceRoot":"","sources":["../../src/generated/AccessibilityElement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACnC;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;OAEG;IACH,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxB;;OAEG;IACH,QAAQ,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAC;CAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccessibilityElement.js","sourceRoot":"","sources":["../../src/generated/AccessibilityElement.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AccessibilityElement } from "./AccessibilityElement.js";
|
|
2
|
+
/**
|
|
3
|
+
* Accessibility tree snapshot.
|
|
4
|
+
*/
|
|
5
|
+
export type AccessibilitySnapshot = {
|
|
6
|
+
/**
|
|
7
|
+
* Unique snapshot ID.
|
|
8
|
+
*/
|
|
9
|
+
snapshot_id: string;
|
|
10
|
+
/**
|
|
11
|
+
* Total number of elements with refs.
|
|
12
|
+
*/
|
|
13
|
+
ref_count: number;
|
|
14
|
+
/**
|
|
15
|
+
* Whether the tree was truncated due to depth limit.
|
|
16
|
+
*/
|
|
17
|
+
truncated: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Maximum depth used for this snapshot.
|
|
20
|
+
*/
|
|
21
|
+
max_depth: number;
|
|
22
|
+
/**
|
|
23
|
+
* Root element of the tree.
|
|
24
|
+
*/
|
|
25
|
+
root: AccessibilityElement;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=AccessibilitySnapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccessibilitySnapshot.d.ts","sourceRoot":"","sources":["../../src/generated/AccessibilitySnapshot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEtE;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IACpC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,IAAI,EAAE,oBAAoB,CAAC;CAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccessibilitySnapshot.js","sourceRoot":"","sources":["../../src/generated/AccessibilitySnapshot.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import type { AutomationScrollDirection } from "./AutomationScrollDirection.js";
|
|
2
|
+
import type { WaitState } from "./WaitState.js";
|
|
3
|
+
import type { WindowAction } from "./WindowAction.js";
|
|
4
|
+
/**
|
|
5
|
+
* Automation request sent from CLI to daemon.
|
|
6
|
+
*/
|
|
7
|
+
export type AutomateRequest = {
|
|
8
|
+
"op": "snapshot";
|
|
9
|
+
/**
|
|
10
|
+
* Filter to interactive elements only (buttons, inputs, links).
|
|
11
|
+
*/
|
|
12
|
+
interactive_only: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Compact mode - remove empty structural elements.
|
|
15
|
+
*/
|
|
16
|
+
compact: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Maximum tree depth to traverse.
|
|
19
|
+
*/
|
|
20
|
+
max_depth: number;
|
|
21
|
+
/**
|
|
22
|
+
* Scope to a specific element (window, panel, etc.) via selector.
|
|
23
|
+
*/
|
|
24
|
+
selector?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Start from the currently focused element.
|
|
27
|
+
*/
|
|
28
|
+
focused: boolean;
|
|
29
|
+
} | {
|
|
30
|
+
"op": "get";
|
|
31
|
+
/**
|
|
32
|
+
* Element selector.
|
|
33
|
+
*/
|
|
34
|
+
selector: string;
|
|
35
|
+
/**
|
|
36
|
+
* Property to retrieve (name, value, states, bounds, or all).
|
|
37
|
+
*/
|
|
38
|
+
property?: string;
|
|
39
|
+
} | {
|
|
40
|
+
"op": "focus";
|
|
41
|
+
/**
|
|
42
|
+
* Element selector.
|
|
43
|
+
*/
|
|
44
|
+
selector: string;
|
|
45
|
+
} | {
|
|
46
|
+
"op": "click";
|
|
47
|
+
/**
|
|
48
|
+
* Element selector.
|
|
49
|
+
*/
|
|
50
|
+
selector: string;
|
|
51
|
+
/**
|
|
52
|
+
* Use double-click instead of single click.
|
|
53
|
+
*/
|
|
54
|
+
double_click: boolean;
|
|
55
|
+
} | {
|
|
56
|
+
"op": "select";
|
|
57
|
+
/**
|
|
58
|
+
* Element selector (container or item directly).
|
|
59
|
+
*/
|
|
60
|
+
selector: string;
|
|
61
|
+
/**
|
|
62
|
+
* Item name to select within container (optional).
|
|
63
|
+
*/
|
|
64
|
+
item?: string;
|
|
65
|
+
} | {
|
|
66
|
+
"op": "toggle";
|
|
67
|
+
/**
|
|
68
|
+
* Element selector.
|
|
69
|
+
*/
|
|
70
|
+
selector: string;
|
|
71
|
+
/**
|
|
72
|
+
* Target state: true=on, false=off, None=toggle.
|
|
73
|
+
*/
|
|
74
|
+
state?: boolean;
|
|
75
|
+
} | {
|
|
76
|
+
"op": "expand";
|
|
77
|
+
/**
|
|
78
|
+
* Element selector.
|
|
79
|
+
*/
|
|
80
|
+
selector: string;
|
|
81
|
+
} | {
|
|
82
|
+
"op": "collapse";
|
|
83
|
+
/**
|
|
84
|
+
* Element selector.
|
|
85
|
+
*/
|
|
86
|
+
selector: string;
|
|
87
|
+
} | {
|
|
88
|
+
"op": "context_menu";
|
|
89
|
+
/**
|
|
90
|
+
* Element selector.
|
|
91
|
+
*/
|
|
92
|
+
selector: string;
|
|
93
|
+
} | {
|
|
94
|
+
"op": "fill";
|
|
95
|
+
/**
|
|
96
|
+
* Element selector.
|
|
97
|
+
*/
|
|
98
|
+
selector: string;
|
|
99
|
+
/**
|
|
100
|
+
* Text to fill.
|
|
101
|
+
*/
|
|
102
|
+
text: string;
|
|
103
|
+
} | {
|
|
104
|
+
"op": "clear";
|
|
105
|
+
/**
|
|
106
|
+
* Element selector.
|
|
107
|
+
*/
|
|
108
|
+
selector: string;
|
|
109
|
+
} | {
|
|
110
|
+
"op": "scroll";
|
|
111
|
+
/**
|
|
112
|
+
* Element selector.
|
|
113
|
+
*/
|
|
114
|
+
selector: string;
|
|
115
|
+
/**
|
|
116
|
+
* Scroll direction.
|
|
117
|
+
*/
|
|
118
|
+
direction?: AutomationScrollDirection;
|
|
119
|
+
/**
|
|
120
|
+
* Scroll amount.
|
|
121
|
+
*/
|
|
122
|
+
amount?: number;
|
|
123
|
+
/**
|
|
124
|
+
* Child element to scroll into view.
|
|
125
|
+
*/
|
|
126
|
+
to_child?: string;
|
|
127
|
+
} | {
|
|
128
|
+
"op": "window";
|
|
129
|
+
/**
|
|
130
|
+
* Window action to perform.
|
|
131
|
+
*/
|
|
132
|
+
action: WindowAction;
|
|
133
|
+
/**
|
|
134
|
+
* Window selector (optional, uses foreground window if not specified).
|
|
135
|
+
*/
|
|
136
|
+
selector?: string;
|
|
137
|
+
} | {
|
|
138
|
+
"op": "run";
|
|
139
|
+
/**
|
|
140
|
+
* Command to run.
|
|
141
|
+
*/
|
|
142
|
+
command: string;
|
|
143
|
+
/**
|
|
144
|
+
* Command arguments.
|
|
145
|
+
*/
|
|
146
|
+
args: Array<string>;
|
|
147
|
+
/**
|
|
148
|
+
* Wait for command to complete.
|
|
149
|
+
*/
|
|
150
|
+
wait: boolean;
|
|
151
|
+
/**
|
|
152
|
+
* Run with hidden window.
|
|
153
|
+
*/
|
|
154
|
+
hidden: boolean;
|
|
155
|
+
/**
|
|
156
|
+
* Timeout in milliseconds when waiting.
|
|
157
|
+
*/
|
|
158
|
+
timeout_ms: number;
|
|
159
|
+
/**
|
|
160
|
+
* Shell executable to run the command through (default: powershell.exe).
|
|
161
|
+
*/
|
|
162
|
+
shell?: string;
|
|
163
|
+
/**
|
|
164
|
+
* Redirect stdout/stderr and keep the process alive for incremental
|
|
165
|
+
* retrieval via `RunPoll`, instead of waiting for exit or discarding
|
|
166
|
+
* output. Ignored if `wait` is also true.
|
|
167
|
+
*/
|
|
168
|
+
stream: boolean;
|
|
169
|
+
} | {
|
|
170
|
+
"op": "run_poll";
|
|
171
|
+
/**
|
|
172
|
+
* Process ID returned by the initial `Run` call.
|
|
173
|
+
*/
|
|
174
|
+
pid: number;
|
|
175
|
+
} | {
|
|
176
|
+
"op": "wait_for";
|
|
177
|
+
/**
|
|
178
|
+
* Element selector.
|
|
179
|
+
*/
|
|
180
|
+
selector: string;
|
|
181
|
+
/**
|
|
182
|
+
* Timeout in milliseconds.
|
|
183
|
+
*/
|
|
184
|
+
timeout_ms: number;
|
|
185
|
+
/**
|
|
186
|
+
* State to wait for.
|
|
187
|
+
*/
|
|
188
|
+
state: WaitState;
|
|
189
|
+
} | {
|
|
190
|
+
"op": "status";
|
|
191
|
+
};
|
|
192
|
+
//# sourceMappingURL=AutomateRequest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutomateRequest.d.ts","sourceRoot":"","sources":["../../src/generated/AutomateRequest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutomateRequest.js","sourceRoot":"","sources":["../../src/generated/AutomateRequest.ts"],"names":[],"mappings":""}
|