claude-in-mobile 2.1.2 → 2.3.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/desktop-companion/build/install/desktop-companion/bin/desktop-companion +248 -0
- package/desktop-companion/build/install/desktop-companion/bin/desktop-companion.bat +92 -0
- package/desktop-companion/build/install/desktop-companion/lib/annotations-23.0.0.jar +0 -0
- package/desktop-companion/build/install/desktop-companion/lib/desktop-companion-1.0.0.jar +0 -0
- package/desktop-companion/build/install/desktop-companion/lib/jna-5.14.0.jar +0 -0
- package/desktop-companion/build/install/desktop-companion/lib/jna-platform-5.14.0.jar +0 -0
- package/desktop-companion/build/install/desktop-companion/lib/kotlin-stdlib-1.9.22.jar +0 -0
- package/desktop-companion/build/install/desktop-companion/lib/kotlin-stdlib-jdk7-1.8.20.jar +0 -0
- package/desktop-companion/build/install/desktop-companion/lib/kotlin-stdlib-jdk8-1.8.20.jar +0 -0
- package/desktop-companion/build/install/desktop-companion/lib/kotlinx-coroutines-core-jvm-1.7.3.jar +0 -0
- package/desktop-companion/build/install/desktop-companion/lib/kotlinx-serialization-core-jvm-1.6.2.jar +0 -0
- package/desktop-companion/build/install/desktop-companion/lib/kotlinx-serialization-json-jvm-1.6.2.jar +0 -0
- package/dist/adb/ui-parser.d.ts +63 -0
- package/dist/adb/ui-parser.d.ts.map +1 -1
- package/dist/adb/ui-parser.js +186 -0
- package/dist/adb/ui-parser.js.map +1 -1
- package/dist/desktop/client.d.ts +162 -0
- package/dist/desktop/client.d.ts.map +1 -0
- package/dist/desktop/client.js +485 -0
- package/dist/desktop/client.js.map +1 -0
- package/dist/desktop/gradle.d.ts +45 -0
- package/dist/desktop/gradle.d.ts.map +1 -0
- package/dist/desktop/gradle.js +228 -0
- package/dist/desktop/gradle.js.map +1 -0
- package/dist/desktop/index.d.ts +7 -0
- package/dist/desktop/index.d.ts.map +1 -0
- package/dist/desktop/index.js +7 -0
- package/dist/desktop/index.js.map +1 -0
- package/dist/desktop/types.d.ts +131 -0
- package/dist/desktop/types.d.ts.map +1 -0
- package/dist/desktop/types.js +5 -0
- package/dist/desktop/types.js.map +1 -0
- package/dist/device-manager.d.ts +41 -10
- package/dist/device-manager.d.ts.map +1 -1
- package/dist/device-manager.js +226 -39
- package/dist/device-manager.js.map +1 -1
- package/dist/index.js +318 -19
- package/dist/index.js.map +1 -1
- package/dist/utils/image.d.ts +2 -0
- package/dist/utils/image.d.ts.map +1 -1
- package/dist/utils/image.js +25 -2
- package/dist/utils/image.js.map +1 -1
- package/package.json +7 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-parser.js","sourceRoot":"","sources":["../../src/adb/ui-parser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ui-parser.js","sourceRoot":"","sources":["../../src/adb/ui-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Desktop Client - communicates with Kotlin companion app via JSON-RPC
|
|
3
|
+
*/
|
|
4
|
+
import { EventEmitter } from "events";
|
|
5
|
+
import type { LaunchOptions, ScreenshotOptions, ScreenshotResult, UiHierarchy, WindowInfo, LogEntry, LogOptions, PerformanceMetrics, DesktopState, PermissionStatus } from "./types.js";
|
|
6
|
+
export declare class DesktopClient extends EventEmitter {
|
|
7
|
+
private process;
|
|
8
|
+
private gradleLauncher;
|
|
9
|
+
private requestId;
|
|
10
|
+
private pendingRequests;
|
|
11
|
+
private logs;
|
|
12
|
+
private maxLogs;
|
|
13
|
+
private state;
|
|
14
|
+
private lastLaunchOptions;
|
|
15
|
+
private readline;
|
|
16
|
+
constructor();
|
|
17
|
+
/**
|
|
18
|
+
* Get current state
|
|
19
|
+
*/
|
|
20
|
+
getState(): DesktopState;
|
|
21
|
+
/**
|
|
22
|
+
* Check if running
|
|
23
|
+
*/
|
|
24
|
+
isRunning(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Launch desktop automation (starts companion app, optionally launches user's app via Gradle)
|
|
27
|
+
*/
|
|
28
|
+
launch(options: LaunchOptions): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Wait for the companion app to be ready
|
|
31
|
+
*/
|
|
32
|
+
private waitForReady;
|
|
33
|
+
/**
|
|
34
|
+
* Stop desktop app
|
|
35
|
+
*/
|
|
36
|
+
stop(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Handle incoming line from stdout
|
|
39
|
+
*/
|
|
40
|
+
private handleLine;
|
|
41
|
+
/**
|
|
42
|
+
* Handle JSON-RPC response
|
|
43
|
+
*/
|
|
44
|
+
private handleResponse;
|
|
45
|
+
/**
|
|
46
|
+
* Handle process exit
|
|
47
|
+
*/
|
|
48
|
+
private handleExit;
|
|
49
|
+
/**
|
|
50
|
+
* Handle crash with auto-restart
|
|
51
|
+
*/
|
|
52
|
+
private handleCrash;
|
|
53
|
+
/**
|
|
54
|
+
* Send JSON-RPC request
|
|
55
|
+
*/
|
|
56
|
+
private sendRequest;
|
|
57
|
+
/**
|
|
58
|
+
* Add log entry
|
|
59
|
+
*/
|
|
60
|
+
private addLog;
|
|
61
|
+
/**
|
|
62
|
+
* Take screenshot
|
|
63
|
+
*/
|
|
64
|
+
screenshotRaw(options?: ScreenshotOptions): Promise<Buffer>;
|
|
65
|
+
/**
|
|
66
|
+
* Take screenshot and return base64
|
|
67
|
+
*/
|
|
68
|
+
screenshot(options?: ScreenshotOptions): Promise<string>;
|
|
69
|
+
/**
|
|
70
|
+
* Get screenshot with metadata
|
|
71
|
+
*/
|
|
72
|
+
screenshotWithMeta(options?: ScreenshotOptions): Promise<ScreenshotResult>;
|
|
73
|
+
/**
|
|
74
|
+
* Tap at coordinates
|
|
75
|
+
*/
|
|
76
|
+
tap(x: number, y: number): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Long press at coordinates
|
|
79
|
+
*/
|
|
80
|
+
longPress(x: number, y: number, durationMs?: number): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Swipe gesture
|
|
83
|
+
*/
|
|
84
|
+
swipe(x1: number, y1: number, x2: number, y2: number, durationMs?: number): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* Swipe in direction
|
|
87
|
+
*/
|
|
88
|
+
swipeDirection(direction: "up" | "down" | "left" | "right", distance?: number): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Input text
|
|
91
|
+
*/
|
|
92
|
+
inputText(text: string): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Press key
|
|
95
|
+
*/
|
|
96
|
+
pressKey(key: string, modifiers?: string[]): Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Get UI hierarchy
|
|
99
|
+
*/
|
|
100
|
+
getUiHierarchy(windowId?: string): Promise<UiHierarchy>;
|
|
101
|
+
/**
|
|
102
|
+
* Get UI hierarchy as XML string (for compatibility)
|
|
103
|
+
*/
|
|
104
|
+
getUiHierarchyXml(): string;
|
|
105
|
+
/**
|
|
106
|
+
* Get window information
|
|
107
|
+
*/
|
|
108
|
+
getWindowInfo(): Promise<WindowInfo>;
|
|
109
|
+
/**
|
|
110
|
+
* Focus a window
|
|
111
|
+
*/
|
|
112
|
+
focusWindow(windowId: string): Promise<void>;
|
|
113
|
+
/**
|
|
114
|
+
* Resize a window
|
|
115
|
+
*/
|
|
116
|
+
resizeWindow(width: number, height: number, windowId?: string): Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* Get clipboard content
|
|
119
|
+
*/
|
|
120
|
+
getClipboard(): Promise<string>;
|
|
121
|
+
/**
|
|
122
|
+
* Set clipboard content
|
|
123
|
+
*/
|
|
124
|
+
setClipboard(text: string): Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* Check accessibility permissions
|
|
127
|
+
*/
|
|
128
|
+
checkPermissions(): Promise<PermissionStatus>;
|
|
129
|
+
/**
|
|
130
|
+
* Get logs
|
|
131
|
+
*/
|
|
132
|
+
getLogs(options?: LogOptions): LogEntry[];
|
|
133
|
+
/**
|
|
134
|
+
* Clear logs
|
|
135
|
+
*/
|
|
136
|
+
clearLogs(): void;
|
|
137
|
+
/**
|
|
138
|
+
* Get performance metrics
|
|
139
|
+
*/
|
|
140
|
+
getPerformanceMetrics(): Promise<PerformanceMetrics>;
|
|
141
|
+
/**
|
|
142
|
+
* Get screen size
|
|
143
|
+
*/
|
|
144
|
+
getScreenSize(): Promise<{
|
|
145
|
+
width: number;
|
|
146
|
+
height: number;
|
|
147
|
+
}>;
|
|
148
|
+
/**
|
|
149
|
+
* Launch app (for compatibility with mobile interface)
|
|
150
|
+
*/
|
|
151
|
+
launchApp(packageName: string): string;
|
|
152
|
+
/**
|
|
153
|
+
* Stop app (for compatibility)
|
|
154
|
+
*/
|
|
155
|
+
stopApp(packageName: string): void;
|
|
156
|
+
/**
|
|
157
|
+
* Shell command (not supported)
|
|
158
|
+
*/
|
|
159
|
+
shell(command: string): string;
|
|
160
|
+
}
|
|
161
|
+
export declare const desktopClient: DesktopClient;
|
|
162
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/desktop/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Desktop Client - communicates with Kotlin companion app via JSON-RPC
|
|
3
|
+
*/
|
|
4
|
+
import { spawn, execSync } from "child_process";
|
|
5
|
+
import { EventEmitter } from "events";
|
|
6
|
+
import * as readline from "readline";
|
|
7
|
+
import * as path from "path";
|
|
8
|
+
import * as fs from "fs";
|
|
9
|
+
import { fileURLToPath } from "url";
|
|
10
|
+
import { GradleLauncher } from "./gradle.js";
|
|
11
|
+
const MAX_RESTARTS = 3;
|
|
12
|
+
const REQUEST_TIMEOUT = 30000; // 30 seconds
|
|
13
|
+
// Get the directory of this module
|
|
14
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
15
|
+
const __dirname = path.dirname(__filename);
|
|
16
|
+
/**
|
|
17
|
+
* Find the companion app path
|
|
18
|
+
*/
|
|
19
|
+
function findCompanionAppPath() {
|
|
20
|
+
// Look for companion app relative to this module
|
|
21
|
+
// The installed distribution is at desktop-companion/build/install/desktop-companion/bin/desktop-companion
|
|
22
|
+
const possiblePaths = [
|
|
23
|
+
// From dist/desktop/client.js
|
|
24
|
+
path.join(__dirname, "..", "..", "desktop-companion", "build", "install", "desktop-companion", "bin", "desktop-companion"),
|
|
25
|
+
// From src/desktop/client.ts (when running directly)
|
|
26
|
+
path.join(__dirname, "..", "..", "..", "desktop-companion", "build", "install", "desktop-companion", "bin", "desktop-companion"),
|
|
27
|
+
];
|
|
28
|
+
for (const p of possiblePaths) {
|
|
29
|
+
if (fs.existsSync(p)) {
|
|
30
|
+
return p;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
throw new Error("Desktop companion app not found. Please build it first: cd desktop-companion && ./gradlew installDist");
|
|
34
|
+
}
|
|
35
|
+
export class DesktopClient extends EventEmitter {
|
|
36
|
+
process = null;
|
|
37
|
+
gradleLauncher;
|
|
38
|
+
requestId = 0;
|
|
39
|
+
pendingRequests = new Map();
|
|
40
|
+
logs = [];
|
|
41
|
+
maxLogs = 10000;
|
|
42
|
+
state = {
|
|
43
|
+
status: "stopped",
|
|
44
|
+
crashCount: 0,
|
|
45
|
+
};
|
|
46
|
+
lastLaunchOptions = null;
|
|
47
|
+
readline = null;
|
|
48
|
+
constructor() {
|
|
49
|
+
super();
|
|
50
|
+
this.gradleLauncher = new GradleLauncher();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get current state
|
|
54
|
+
*/
|
|
55
|
+
getState() {
|
|
56
|
+
return { ...this.state };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check if running
|
|
60
|
+
*/
|
|
61
|
+
isRunning() {
|
|
62
|
+
return this.state.status === "running" && this.process !== null && !this.process.killed;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Launch desktop automation (starts companion app, optionally launches user's app via Gradle)
|
|
66
|
+
*/
|
|
67
|
+
async launch(options) {
|
|
68
|
+
if (this.isRunning()) {
|
|
69
|
+
throw new Error("Desktop companion is already running. Stop it first.");
|
|
70
|
+
}
|
|
71
|
+
this.lastLaunchOptions = options;
|
|
72
|
+
this.state = {
|
|
73
|
+
status: "starting",
|
|
74
|
+
projectPath: options.projectPath,
|
|
75
|
+
crashCount: this.state.crashCount,
|
|
76
|
+
};
|
|
77
|
+
try {
|
|
78
|
+
// Find and start the companion app
|
|
79
|
+
const companionPath = findCompanionAppPath();
|
|
80
|
+
this.addLog("stdout", `Starting companion app: ${companionPath}`);
|
|
81
|
+
this.process = spawn(companionPath, [], {
|
|
82
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
83
|
+
env: {
|
|
84
|
+
...process.env,
|
|
85
|
+
JAVA_HOME: process.env.JAVA_HOME || execSync("/usr/libexec/java_home -v 21 2>/dev/null || /usr/libexec/java_home 2>/dev/null || echo ''").toString().trim(),
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
this.state.pid = this.process.pid;
|
|
89
|
+
// If projectPath is provided, also launch the user's app via Gradle (in background)
|
|
90
|
+
if (options.projectPath) {
|
|
91
|
+
this.addLog("stdout", `Launching user app from: ${options.projectPath}`);
|
|
92
|
+
// Launch in background - don't wait for it
|
|
93
|
+
const userAppProcess = this.gradleLauncher.launch(options);
|
|
94
|
+
userAppProcess.stdout?.on("data", (data) => {
|
|
95
|
+
this.addLog("stdout", `[UserApp] ${data.toString()}`);
|
|
96
|
+
});
|
|
97
|
+
userAppProcess.stderr?.on("data", (data) => {
|
|
98
|
+
this.addLog("stderr", `[UserApp] ${data.toString()}`);
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
// Set up stdout for JSON-RPC responses
|
|
102
|
+
if (this.process.stdout) {
|
|
103
|
+
this.readline = readline.createInterface({
|
|
104
|
+
input: this.process.stdout,
|
|
105
|
+
crlfDelay: Infinity,
|
|
106
|
+
});
|
|
107
|
+
this.readline.on("line", (line) => {
|
|
108
|
+
this.handleLine(line);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// Capture stderr for logs
|
|
112
|
+
if (this.process.stderr) {
|
|
113
|
+
this.process.stderr.on("data", (data) => {
|
|
114
|
+
const message = data.toString();
|
|
115
|
+
this.addLog("stderr", message);
|
|
116
|
+
// Check for "ready" signal or specific patterns
|
|
117
|
+
if (message.includes("Desktop companion ready") ||
|
|
118
|
+
message.includes("JsonRpcServer started")) {
|
|
119
|
+
this.state.status = "running";
|
|
120
|
+
this.emit("ready");
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// Handle process exit
|
|
125
|
+
this.process.on("exit", (code, signal) => {
|
|
126
|
+
this.handleExit(code, signal);
|
|
127
|
+
});
|
|
128
|
+
this.process.on("error", (error) => {
|
|
129
|
+
this.addLog("crash", `Process error: ${error.message}`);
|
|
130
|
+
this.handleCrash(error);
|
|
131
|
+
});
|
|
132
|
+
// Wait for ready signal or timeout
|
|
133
|
+
await this.waitForReady(10000);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
this.state.status = "stopped";
|
|
137
|
+
this.state.lastError = error.message;
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Wait for the companion app to be ready
|
|
143
|
+
*/
|
|
144
|
+
waitForReady(timeoutMs) {
|
|
145
|
+
return new Promise((resolve, reject) => {
|
|
146
|
+
const timeout = setTimeout(() => {
|
|
147
|
+
// Consider ready even without explicit signal after timeout
|
|
148
|
+
// The app might not send a ready signal
|
|
149
|
+
if (this.process && !this.process.killed) {
|
|
150
|
+
this.state.status = "running";
|
|
151
|
+
resolve();
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
reject(new Error("Desktop app failed to start"));
|
|
155
|
+
}
|
|
156
|
+
}, timeoutMs);
|
|
157
|
+
this.once("ready", () => {
|
|
158
|
+
clearTimeout(timeout);
|
|
159
|
+
resolve();
|
|
160
|
+
});
|
|
161
|
+
this.process?.once("exit", () => {
|
|
162
|
+
clearTimeout(timeout);
|
|
163
|
+
reject(new Error("Desktop app exited before becoming ready"));
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Stop desktop app
|
|
169
|
+
*/
|
|
170
|
+
async stop() {
|
|
171
|
+
if (!this.process) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
// Clean up readline
|
|
175
|
+
if (this.readline) {
|
|
176
|
+
this.readline.close();
|
|
177
|
+
this.readline = null;
|
|
178
|
+
}
|
|
179
|
+
// Reject all pending requests
|
|
180
|
+
for (const [id, pending] of this.pendingRequests) {
|
|
181
|
+
clearTimeout(pending.timeout);
|
|
182
|
+
pending.reject(new Error("Desktop app stopped"));
|
|
183
|
+
}
|
|
184
|
+
this.pendingRequests.clear();
|
|
185
|
+
// Stop process
|
|
186
|
+
this.gradleLauncher.stop(this.process);
|
|
187
|
+
this.process = null;
|
|
188
|
+
this.state = {
|
|
189
|
+
status: "stopped",
|
|
190
|
+
crashCount: 0,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Handle incoming line from stdout
|
|
195
|
+
*/
|
|
196
|
+
handleLine(line) {
|
|
197
|
+
const trimmed = line.trim();
|
|
198
|
+
if (!trimmed)
|
|
199
|
+
return;
|
|
200
|
+
// Try to parse as JSON-RPC response
|
|
201
|
+
if (trimmed.startsWith("{")) {
|
|
202
|
+
try {
|
|
203
|
+
const response = JSON.parse(trimmed);
|
|
204
|
+
this.handleResponse(response);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// Not JSON, treat as log
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Regular log output
|
|
212
|
+
this.addLog("stdout", trimmed);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Handle JSON-RPC response
|
|
216
|
+
*/
|
|
217
|
+
handleResponse(response) {
|
|
218
|
+
const pending = this.pendingRequests.get(response.id);
|
|
219
|
+
if (!pending) {
|
|
220
|
+
return; // Unknown response
|
|
221
|
+
}
|
|
222
|
+
this.pendingRequests.delete(response.id);
|
|
223
|
+
clearTimeout(pending.timeout);
|
|
224
|
+
if (response.error) {
|
|
225
|
+
pending.reject(new Error(`${response.error.message} (code: ${response.error.code})`));
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
pending.resolve(response.result);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Handle process exit
|
|
233
|
+
*/
|
|
234
|
+
handleExit(code, signal) {
|
|
235
|
+
const wasRunning = this.state.status === "running";
|
|
236
|
+
if (code !== 0 && wasRunning) {
|
|
237
|
+
this.addLog("crash", `Process exited with code ${code}, signal ${signal}`);
|
|
238
|
+
this.handleCrash(new Error(`Exit code: ${code}`));
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
this.state.status = "stopped";
|
|
242
|
+
}
|
|
243
|
+
this.process = null;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Handle crash with auto-restart
|
|
247
|
+
*/
|
|
248
|
+
async handleCrash(error) {
|
|
249
|
+
this.state.status = "crashed";
|
|
250
|
+
this.state.crashCount++;
|
|
251
|
+
this.state.lastError = error.message;
|
|
252
|
+
// Reject all pending requests
|
|
253
|
+
for (const [id, pending] of this.pendingRequests) {
|
|
254
|
+
clearTimeout(pending.timeout);
|
|
255
|
+
pending.reject(new Error("Desktop app crashed"));
|
|
256
|
+
}
|
|
257
|
+
this.pendingRequests.clear();
|
|
258
|
+
// Auto-restart if under limit
|
|
259
|
+
if (this.state.crashCount <= MAX_RESTARTS && this.lastLaunchOptions) {
|
|
260
|
+
console.error(`Desktop app crashed, restarting (${this.state.crashCount}/${MAX_RESTARTS})...`);
|
|
261
|
+
try {
|
|
262
|
+
await new Promise((resolve) => setTimeout(resolve, 1000)); // Wait before restart
|
|
263
|
+
await this.launch(this.lastLaunchOptions);
|
|
264
|
+
}
|
|
265
|
+
catch (restartError) {
|
|
266
|
+
console.error(`Failed to restart: ${restartError.message}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
this.emit("crash", error);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Send JSON-RPC request
|
|
275
|
+
*/
|
|
276
|
+
async sendRequest(method, params) {
|
|
277
|
+
if (!this.isRunning() || !this.process?.stdin) {
|
|
278
|
+
throw new Error("Desktop app is not running");
|
|
279
|
+
}
|
|
280
|
+
const id = ++this.requestId;
|
|
281
|
+
const request = {
|
|
282
|
+
jsonrpc: "2.0",
|
|
283
|
+
id,
|
|
284
|
+
method,
|
|
285
|
+
params,
|
|
286
|
+
};
|
|
287
|
+
return new Promise((resolve, reject) => {
|
|
288
|
+
const timeout = setTimeout(() => {
|
|
289
|
+
this.pendingRequests.delete(id);
|
|
290
|
+
reject(new Error(`Request timeout: ${method}`));
|
|
291
|
+
}, REQUEST_TIMEOUT);
|
|
292
|
+
this.pendingRequests.set(id, {
|
|
293
|
+
resolve: resolve,
|
|
294
|
+
reject,
|
|
295
|
+
timeout,
|
|
296
|
+
});
|
|
297
|
+
const json = JSON.stringify(request);
|
|
298
|
+
this.process.stdin.write(json + "\n");
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Add log entry
|
|
303
|
+
*/
|
|
304
|
+
addLog(type, message) {
|
|
305
|
+
this.logs.push({
|
|
306
|
+
timestamp: Date.now(),
|
|
307
|
+
type,
|
|
308
|
+
message,
|
|
309
|
+
});
|
|
310
|
+
if (this.logs.length > this.maxLogs) {
|
|
311
|
+
this.logs.shift();
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// ============ Public API Methods ============
|
|
315
|
+
/**
|
|
316
|
+
* Take screenshot
|
|
317
|
+
*/
|
|
318
|
+
async screenshotRaw(options) {
|
|
319
|
+
const result = await this.sendRequest("screenshot", options);
|
|
320
|
+
return Buffer.from(result.base64, "base64");
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Take screenshot and return base64
|
|
324
|
+
*/
|
|
325
|
+
async screenshot(options) {
|
|
326
|
+
const result = await this.sendRequest("screenshot", options);
|
|
327
|
+
return result.base64;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Get screenshot with metadata
|
|
331
|
+
*/
|
|
332
|
+
async screenshotWithMeta(options) {
|
|
333
|
+
return this.sendRequest("screenshot", options);
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Tap at coordinates
|
|
337
|
+
*/
|
|
338
|
+
async tap(x, y) {
|
|
339
|
+
await this.sendRequest("tap", { x, y });
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Long press at coordinates
|
|
343
|
+
*/
|
|
344
|
+
async longPress(x, y, durationMs = 1000) {
|
|
345
|
+
await this.sendRequest("long_press", { x, y, durationMs });
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Swipe gesture
|
|
349
|
+
*/
|
|
350
|
+
async swipe(x1, y1, x2, y2, durationMs = 300) {
|
|
351
|
+
await this.sendRequest("swipe", { x1, y1, x2, y2, durationMs });
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Swipe in direction
|
|
355
|
+
*/
|
|
356
|
+
async swipeDirection(direction, distance) {
|
|
357
|
+
await this.sendRequest("swipe_direction", { direction, distance });
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Input text
|
|
361
|
+
*/
|
|
362
|
+
async inputText(text) {
|
|
363
|
+
await this.sendRequest("input_text", { text });
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Press key
|
|
367
|
+
*/
|
|
368
|
+
async pressKey(key, modifiers) {
|
|
369
|
+
await this.sendRequest("key_event", { key, modifiers });
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Get UI hierarchy
|
|
373
|
+
*/
|
|
374
|
+
async getUiHierarchy(windowId) {
|
|
375
|
+
return this.sendRequest("get_ui_hierarchy", { windowId });
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Get UI hierarchy as XML string (for compatibility)
|
|
379
|
+
*/
|
|
380
|
+
getUiHierarchyXml() {
|
|
381
|
+
// Not supported - desktop uses accessibility tree
|
|
382
|
+
throw new Error("XML hierarchy not supported for desktop. Use getUiHierarchy() instead.");
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Get window information
|
|
386
|
+
*/
|
|
387
|
+
async getWindowInfo() {
|
|
388
|
+
return this.sendRequest("get_window_info");
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Focus a window
|
|
392
|
+
*/
|
|
393
|
+
async focusWindow(windowId) {
|
|
394
|
+
await this.sendRequest("focus_window", { windowId });
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Resize a window
|
|
398
|
+
*/
|
|
399
|
+
async resizeWindow(width, height, windowId) {
|
|
400
|
+
await this.sendRequest("resize_window", { windowId, width, height });
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Get clipboard content
|
|
404
|
+
*/
|
|
405
|
+
async getClipboard() {
|
|
406
|
+
const result = await this.sendRequest("get_clipboard");
|
|
407
|
+
return result.text ?? "";
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Set clipboard content
|
|
411
|
+
*/
|
|
412
|
+
async setClipboard(text) {
|
|
413
|
+
await this.sendRequest("set_clipboard", { text });
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Check accessibility permissions
|
|
417
|
+
*/
|
|
418
|
+
async checkPermissions() {
|
|
419
|
+
return this.sendRequest("check_permissions");
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Get logs
|
|
423
|
+
*/
|
|
424
|
+
getLogs(options) {
|
|
425
|
+
let result = [...this.logs];
|
|
426
|
+
if (options?.type) {
|
|
427
|
+
result = result.filter((log) => log.type === options.type);
|
|
428
|
+
}
|
|
429
|
+
if (options?.since) {
|
|
430
|
+
result = result.filter((log) => log.timestamp >= options.since);
|
|
431
|
+
}
|
|
432
|
+
if (options?.limit) {
|
|
433
|
+
result = result.slice(-options.limit);
|
|
434
|
+
}
|
|
435
|
+
return result;
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Clear logs
|
|
439
|
+
*/
|
|
440
|
+
clearLogs() {
|
|
441
|
+
this.logs = [];
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Get performance metrics
|
|
445
|
+
*/
|
|
446
|
+
async getPerformanceMetrics() {
|
|
447
|
+
return this.sendRequest("get_performance_metrics");
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Get screen size
|
|
451
|
+
*/
|
|
452
|
+
async getScreenSize() {
|
|
453
|
+
const info = await this.getWindowInfo();
|
|
454
|
+
if (info.windows.length > 0) {
|
|
455
|
+
const focused = info.windows.find((w) => w.focused) ?? info.windows[0];
|
|
456
|
+
return {
|
|
457
|
+
width: focused.bounds.width,
|
|
458
|
+
height: focused.bounds.height,
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
return { width: 1920, height: 1080 }; // Default
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Launch app (for compatibility with mobile interface)
|
|
465
|
+
*/
|
|
466
|
+
launchApp(packageName) {
|
|
467
|
+
// Desktop doesn't have package-based launch
|
|
468
|
+
return `Desktop platform doesn't support package launch. Use launch_desktop_app to start a Compose Desktop project.`;
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Stop app (for compatibility)
|
|
472
|
+
*/
|
|
473
|
+
stopApp(packageName) {
|
|
474
|
+
// No-op for desktop
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Shell command (not supported)
|
|
478
|
+
*/
|
|
479
|
+
shell(command) {
|
|
480
|
+
throw new Error("Shell commands not supported for desktop. Use native APIs.");
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
// Export singleton instance
|
|
484
|
+
export const desktopClient = new DesktopClient();
|
|
485
|
+
//# sourceMappingURL=client.js.map
|