@oharness/engine 0.9.2 → 0.10.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/dist/agent/agent.d.ts +207 -1
- package/dist/agent/agent.js +691 -55
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/background.d.ts +135 -0
- package/dist/agent/background.js +307 -0
- package/dist/agent/background.js.map +1 -0
- package/dist/agent/compaction.d.ts +7 -0
- package/dist/agent/compaction.js +11 -3
- package/dist/agent/compaction.js.map +1 -1
- package/dist/agent/goal.d.ts +36 -0
- package/dist/agent/goal.js +71 -0
- package/dist/agent/goal.js.map +1 -0
- package/dist/agent/permissions.d.ts +6 -0
- package/dist/agent/permissions.js +2 -1
- package/dist/agent/permissions.js.map +1 -1
- package/dist/agent/session.d.ts +36 -0
- package/dist/agent/session.js +72 -0
- package/dist/agent/session.js.map +1 -1
- package/dist/agent/store.d.ts +25 -0
- package/dist/agent/store.js +21 -0
- package/dist/agent/store.js.map +1 -1
- package/dist/agent/subagent.d.ts +12 -0
- package/dist/agent/subagent.js +11 -1
- package/dist/agent/subagent.js.map +1 -1
- package/dist/agent/workspace.d.ts +9 -0
- package/dist/agent/workspace.js +59 -5
- package/dist/agent/workspace.js.map +1 -1
- package/dist/auth/manager.d.ts +9 -0
- package/dist/auth/manager.js +67 -6
- package/dist/auth/manager.js.map +1 -1
- package/dist/auth/providers/account.js +5 -4
- package/dist/auth/providers/account.js.map +1 -1
- package/dist/browser/tools.js +3 -0
- package/dist/browser/tools.js.map +1 -1
- package/dist/computer/arbiter.d.ts +69 -0
- package/dist/computer/arbiter.js +128 -0
- package/dist/computer/arbiter.js.map +1 -0
- package/dist/computer/cua-driver.d.ts +115 -0
- package/dist/computer/cua-driver.js +453 -0
- package/dist/computer/cua-driver.js.map +1 -0
- package/dist/computer/helper-client.d.ts +78 -0
- package/dist/computer/helper-client.js +163 -0
- package/dist/computer/helper-client.js.map +1 -0
- package/dist/computer/index.d.ts +15 -0
- package/dist/computer/index.js +9 -0
- package/dist/computer/index.js.map +1 -0
- package/dist/computer/mode.d.ts +19 -0
- package/dist/computer/mode.js +42 -0
- package/dist/computer/mode.js.map +1 -0
- package/dist/computer/plugin.d.ts +24 -0
- package/dist/computer/plugin.js +17 -0
- package/dist/computer/plugin.js.map +1 -0
- package/dist/computer/policy.d.ts +29 -0
- package/dist/computer/policy.js +127 -0
- package/dist/computer/policy.js.map +1 -0
- package/dist/computer/session.d.ts +199 -0
- package/dist/computer/session.js +392 -0
- package/dist/computer/session.js.map +1 -0
- package/dist/computer/target.d.ts +187 -0
- package/dist/computer/target.js +31 -0
- package/dist/computer/target.js.map +1 -0
- package/dist/computer/tools.d.ts +8 -0
- package/dist/computer/tools.js +537 -0
- package/dist/computer/tools.js.map +1 -0
- package/dist/core/tokens.js +4 -0
- package/dist/core/tokens.js.map +1 -1
- package/dist/core/types.d.ts +16 -1
- package/dist/core/types.js.map +1 -1
- package/dist/harness.d.ts +76 -1
- package/dist/harness.js +178 -22
- package/dist/harness.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/transport.js +3 -0
- package/dist/mcp/transport.js.map +1 -1
- package/dist/providers/catalog.js +6 -0
- package/dist/providers/catalog.js.map +1 -1
- package/dist/providers/discovery.js +10 -2
- package/dist/providers/discovery.js.map +1 -1
- package/dist/providers/models-dev.js +1 -0
- package/dist/providers/models-dev.js.map +1 -1
- package/dist/providers/models-dev.json +114 -102
- package/dist/providers/piai.d.ts +16 -1
- package/dist/providers/piai.js +84 -7
- package/dist/providers/piai.js.map +1 -1
- package/dist/providers/types.d.ts +6 -0
- package/dist/providers/types.js.map +1 -1
- package/dist/runtime-plugins/cloud-connector.js +5 -0
- package/dist/runtime-plugins/cloud-connector.js.map +1 -1
- package/dist/schedule/scheduler.d.ts +38 -0
- package/dist/schedule/scheduler.js +101 -1
- package/dist/schedule/scheduler.js.map +1 -1
- package/dist/tools/builtin/bash.d.ts +6 -0
- package/dist/tools/builtin/bash.js +2 -1
- package/dist/tools/builtin/bash.js.map +1 -1
- package/dist/tools/builtin/recall.js +4 -0
- package/dist/tools/builtin/recall.js.map +1 -1
- package/dist/tools/builtin/routine.d.ts +9 -0
- package/dist/tools/builtin/routine.js +23 -2
- package/dist/tools/builtin/routine.js.map +1 -1
- package/dist/tools/builtin/task-control.d.ts +21 -0
- package/dist/tools/builtin/task-control.js +120 -0
- package/dist/tools/builtin/task-control.js.map +1 -0
- package/dist/tools/builtin/task.js +50 -9
- package/dist/tools/builtin/task.js.map +1 -1
- package/dist/tools/builtin/todo.d.ts +1 -1
- package/dist/tools/builtin/worktree.d.ts +10 -0
- package/dist/tools/builtin/worktree.js +52 -0
- package/dist/tools/builtin/worktree.js.map +1 -0
- package/dist/tools/define.d.ts +4 -1
- package/dist/tools/define.js +2 -0
- package/dist/tools/define.js.map +1 -1
- package/dist/tools/types.d.ts +112 -0
- package/dist/tools/types.js.map +1 -1
- package/dist/worktree/index.d.ts +109 -0
- package/dist/worktree/index.js +463 -0
- package/dist/worktree/index.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { McpClient } from "../mcp/client.js";
|
|
3
|
+
import { ComputerError } from "./target.js";
|
|
4
|
+
/** Cua's refusals that mean "only with the real mouse and keyboard". */
|
|
5
|
+
const FOREGROUND_CODES = /^background_|foreground_required|needs_foreground/;
|
|
6
|
+
export class CuaDriverTarget {
|
|
7
|
+
client;
|
|
8
|
+
opts;
|
|
9
|
+
pids = new Map();
|
|
10
|
+
shots = new Map();
|
|
11
|
+
refs = new Map();
|
|
12
|
+
/** The field typing goes to, per window, set by `axAction focus`. */
|
|
13
|
+
targets = new Map();
|
|
14
|
+
appIds = new Map();
|
|
15
|
+
version = "";
|
|
16
|
+
constructor(client, opts) {
|
|
17
|
+
this.client = client;
|
|
18
|
+
this.opts = opts;
|
|
19
|
+
}
|
|
20
|
+
static async start(opts) {
|
|
21
|
+
const env = {
|
|
22
|
+
CUA_DRIVER_EMBEDDED: "1",
|
|
23
|
+
CUA_DRIVER_RS_TELEMETRY_ENABLED: "0",
|
|
24
|
+
CUA_TELEMETRY_ENABLED: "0",
|
|
25
|
+
CUA_DRIVER_RS_UPDATE_CHECK: "0",
|
|
26
|
+
...(opts.hostBundleId ? { CUA_DRIVER_HOST_BUNDLE_ID: opts.hostBundleId } : {}),
|
|
27
|
+
...(opts.stateDir ? { CUA_DRIVER_TELEMETRY_HOME: opts.stateDir } : {}),
|
|
28
|
+
...(opts.policyFile ? { CUA_DRIVER_POLICY_FILE: opts.policyFile } : {}),
|
|
29
|
+
};
|
|
30
|
+
const client = new McpClient("cua-driver", { type: "stdio", command: opts.path, args: ["mcp", "--direct"], env, timeoutMs: 45_000 }, opts.logger);
|
|
31
|
+
const init = await client.connect();
|
|
32
|
+
const target = new CuaDriverTarget(client, opts);
|
|
33
|
+
target.version = init.serverInfo?.version ?? "";
|
|
34
|
+
return target;
|
|
35
|
+
}
|
|
36
|
+
// ---- plumbing --------------------------------------------------------------
|
|
37
|
+
async call(name, args) {
|
|
38
|
+
let result;
|
|
39
|
+
try {
|
|
40
|
+
result = await this.client.callTool(name, args);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
throw new ComputerError("failed", `cua-driver ${name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
44
|
+
}
|
|
45
|
+
const structured = (result.structuredContent ?? {});
|
|
46
|
+
const refused = structured["effect"] === "refused";
|
|
47
|
+
if (result.isError || refused)
|
|
48
|
+
throw this.refusal(name, result, structured);
|
|
49
|
+
return { ...structured, __content: result.content };
|
|
50
|
+
}
|
|
51
|
+
refusal(name, result, structured) {
|
|
52
|
+
const nested = structured["refusal"];
|
|
53
|
+
const raw = String(structured["code"] ?? nested?.["code"] ?? "");
|
|
54
|
+
const text = result.content
|
|
55
|
+
.map((block) => ("text" in block && typeof block.text === "string" ? block.text : ""))
|
|
56
|
+
.filter(Boolean)
|
|
57
|
+
.join(" ") || String(structured["message"] ?? nested?.["message"] ?? `${name} failed`);
|
|
58
|
+
let code = "failed";
|
|
59
|
+
// Our own policy file said no. Not an OS grant, and not something the
|
|
60
|
+
// person can fix by allowing anything.
|
|
61
|
+
if (raw === "permission_denied" || /policy/i.test(text))
|
|
62
|
+
return new ComputerError("refused", text.slice(0, 600));
|
|
63
|
+
if (FOREGROUND_CODES.test(raw))
|
|
64
|
+
code = raw === "background_uipi_blocked" ? "elevated" : "needs_foreground";
|
|
65
|
+
else if (raw === "background_desktop_refused")
|
|
66
|
+
code = "secure_desktop";
|
|
67
|
+
else if (/stale|superseded|invalidated/.test(raw) || /element_token.*stale/i.test(text))
|
|
68
|
+
code = "stale_ref";
|
|
69
|
+
else if (/not_found|no_such|unknown_window|window_gone/.test(raw))
|
|
70
|
+
code = "not_found";
|
|
71
|
+
else if (/permission|tcc|not_granted/.test(raw)) {
|
|
72
|
+
const grant = /screen/i.test(raw + text) ? "screen" : "accessibility";
|
|
73
|
+
return new ComputerError("permission", text, grant);
|
|
74
|
+
}
|
|
75
|
+
else if (/unsupported|not_supported|no_action/.test(raw))
|
|
76
|
+
code = "unsupported";
|
|
77
|
+
return new ComputerError(code, text.slice(0, 600));
|
|
78
|
+
}
|
|
79
|
+
async pidOf(window) {
|
|
80
|
+
const known = this.pids.get(window);
|
|
81
|
+
if (known)
|
|
82
|
+
return known;
|
|
83
|
+
await this.windows();
|
|
84
|
+
const found = this.pids.get(window);
|
|
85
|
+
if (!found)
|
|
86
|
+
throw new ComputerError("not_found", `no window ${window}`);
|
|
87
|
+
return found;
|
|
88
|
+
}
|
|
89
|
+
/** Screen point → pixels of the last screenshot of this window, taking one if needed. */
|
|
90
|
+
async toWindowPixels(window, x, y) {
|
|
91
|
+
let geometry = this.shots.get(window);
|
|
92
|
+
if (!geometry) {
|
|
93
|
+
await this.screenshot({ window, maxWidth: 1280 });
|
|
94
|
+
geometry = this.shots.get(window);
|
|
95
|
+
}
|
|
96
|
+
const { bounds, width, height } = geometry;
|
|
97
|
+
return {
|
|
98
|
+
x: Math.round(((x - bounds.x) * width) / bounds.w),
|
|
99
|
+
y: Math.round(((y - bounds.y) * height) / bounds.h),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
// ---- ComputerTarget --------------------------------------------------------
|
|
103
|
+
async info() {
|
|
104
|
+
return { platform: process.platform === "win32" ? "win32" : "darwin", version: `cua-driver ${this.version}`, background: true };
|
|
105
|
+
}
|
|
106
|
+
async permissions() {
|
|
107
|
+
if (process.platform === "win32")
|
|
108
|
+
return { screen: true, accessibility: true };
|
|
109
|
+
const state = await this.call("check_permissions", { prompt: false });
|
|
110
|
+
return { screen: state["screen_recording"] === true, accessibility: state["accessibility"] === true };
|
|
111
|
+
}
|
|
112
|
+
async requestPermissions(grant) {
|
|
113
|
+
await this.opts.requestPermissions?.(grant);
|
|
114
|
+
}
|
|
115
|
+
async apps() {
|
|
116
|
+
const state = await this.call("list_apps", {});
|
|
117
|
+
const apps = (state["apps"] ?? [])
|
|
118
|
+
.filter((app) => app["running"] === true && Number(app["pid"]) > 0)
|
|
119
|
+
.map((app) => {
|
|
120
|
+
const launch = typeof app["launch_path"] === "string" ? app["launch_path"] : "";
|
|
121
|
+
const id = typeof app["bundle_id"] === "string" && app["bundle_id"]
|
|
122
|
+
? app["bundle_id"]
|
|
123
|
+
: (process.platform === "win32" ? path.win32.basename(launch) : path.basename(launch)).toLowerCase() || String(app["name"]);
|
|
124
|
+
return { name: String(app["name"] ?? id), id, pid: Number(app["pid"]), active: app["active"] === true };
|
|
125
|
+
});
|
|
126
|
+
this.appIds = new Map(apps.map((app) => [app.pid, app]));
|
|
127
|
+
return apps;
|
|
128
|
+
}
|
|
129
|
+
async windows(opts = {}) {
|
|
130
|
+
if (!this.appIds.size)
|
|
131
|
+
await this.apps();
|
|
132
|
+
const state = await this.call("list_windows", opts.pid === undefined ? {} : { pid: opts.pid });
|
|
133
|
+
const list = (state["windows"] ?? []).filter((w) => {
|
|
134
|
+
const b = w["bounds"];
|
|
135
|
+
// Menu bar strips, tooltips and other slivers are not windows to work in.
|
|
136
|
+
return Number(w["layer"] ?? 0) === 0 && b && b["width"] >= 40 && b["height"] >= 40;
|
|
137
|
+
});
|
|
138
|
+
// Frontmost per app: the highest z-order among its on-screen windows.
|
|
139
|
+
const front = new Map();
|
|
140
|
+
for (const w of list) {
|
|
141
|
+
if (w["is_on_screen"] !== true)
|
|
142
|
+
continue;
|
|
143
|
+
const pid = Number(w["pid"]);
|
|
144
|
+
front.set(pid, Math.max(front.get(pid) ?? -Infinity, Number(w["z_index"] ?? 0)));
|
|
145
|
+
}
|
|
146
|
+
return list.map((w) => {
|
|
147
|
+
const id = String(w["window_id"]);
|
|
148
|
+
const pid = Number(w["pid"]);
|
|
149
|
+
this.pids.set(id, pid);
|
|
150
|
+
const b = w["bounds"];
|
|
151
|
+
const app = this.appIds.get(pid);
|
|
152
|
+
const title = typeof w["title"] === "string" && w["title"] ? w["title"] : undefined;
|
|
153
|
+
return {
|
|
154
|
+
id,
|
|
155
|
+
pid,
|
|
156
|
+
app: app?.name ?? String(w["app_name"] ?? ""),
|
|
157
|
+
appId: app?.id ?? String(w["app_name"] ?? "").toLowerCase(),
|
|
158
|
+
...(title ? { title } : {}),
|
|
159
|
+
frame: { x: b["x"], y: b["y"], w: b["width"], h: b["height"] },
|
|
160
|
+
minimized: w["is_minimized"] === true,
|
|
161
|
+
onScreen: w["is_on_screen"] === true,
|
|
162
|
+
focused: w["is_on_screen"] === true && Number(w["z_index"] ?? 0) === front.get(pid),
|
|
163
|
+
};
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
async screenshot(opts) {
|
|
167
|
+
if (!opts.window) {
|
|
168
|
+
const state = await this.call("get_desktop_state", { max_image_dimension: opts.maxWidth ?? 1280 });
|
|
169
|
+
const image = imageOf(state);
|
|
170
|
+
const width = Number(state["screenshot_width"] ?? state["width"] ?? 0);
|
|
171
|
+
const height = Number(state["screenshot_height"] ?? state["height"] ?? 0);
|
|
172
|
+
const scale = Number(state["screenshot_scale"] ?? state["scale"] ?? 1) || 1;
|
|
173
|
+
return { data: image.data, mimeType: image.mimeType, width, height, frame: { x: 0, y: 0, w: width / scale, h: height / scale } };
|
|
174
|
+
}
|
|
175
|
+
const window = opts.window;
|
|
176
|
+
const state = await this.call("get_window_state", {
|
|
177
|
+
pid: await this.pidOf(window),
|
|
178
|
+
window_id: Number(window),
|
|
179
|
+
include_accessibility_tree: false,
|
|
180
|
+
max_image_dimension: opts.maxWidth ?? 1280,
|
|
181
|
+
});
|
|
182
|
+
const image = imageOf(state);
|
|
183
|
+
const b = state["window_bounds"];
|
|
184
|
+
const bounds = { x: b["x"], y: b["y"], w: b["width"], h: b["height"] };
|
|
185
|
+
const width = Number(state["screenshot_width"]);
|
|
186
|
+
const height = Number(state["screenshot_height"]);
|
|
187
|
+
this.shots.set(window, { bounds, width, height });
|
|
188
|
+
return { data: image.data, mimeType: image.mimeType, width, height, frame: bounds };
|
|
189
|
+
}
|
|
190
|
+
async axTree(opts) {
|
|
191
|
+
const state = await this.call("get_window_state", {
|
|
192
|
+
pid: await this.pidOf(opts.window),
|
|
193
|
+
window_id: Number(opts.window),
|
|
194
|
+
include_screenshot: false,
|
|
195
|
+
max_elements: opts.maxNodes ?? 400,
|
|
196
|
+
max_depth: opts.depth ?? 25,
|
|
197
|
+
});
|
|
198
|
+
const elements = state["elements"] ?? [];
|
|
199
|
+
const infos = [];
|
|
200
|
+
const nodes = [];
|
|
201
|
+
for (const element of elements) {
|
|
202
|
+
const token = typeof element["element_token"] === "string" ? element["element_token"] : undefined;
|
|
203
|
+
if (!token)
|
|
204
|
+
continue;
|
|
205
|
+
const role = String(element["role"] ?? "unknown");
|
|
206
|
+
const label = typeof element["label"] === "string" ? element["label"] : undefined;
|
|
207
|
+
const f = element["frame"];
|
|
208
|
+
const frame = f ? { x: f["x"], y: f["y"], w: f["w"], h: f["h"] } : undefined;
|
|
209
|
+
infos.push({ token, role, ...(label ? { label } : {}), ...(frame ? { frame } : {}) });
|
|
210
|
+
const secure = isSecure(role, label);
|
|
211
|
+
const value = typeof element["value"] === "string" && !secure ? element["value"] : undefined;
|
|
212
|
+
nodes.push({
|
|
213
|
+
ref: `w${opts.window}.${infos.length}`,
|
|
214
|
+
role: role.replace(/^AX/, "").toLowerCase(),
|
|
215
|
+
...(label ? { name: label } : {}),
|
|
216
|
+
...(value && value !== label ? { value } : {}),
|
|
217
|
+
...(frame ? { frame } : {}),
|
|
218
|
+
...(Array.isArray(element["actions"]) ? { actions: element["actions"].map((a) => a.replace(/^AX/, "").toLowerCase()) } : {}),
|
|
219
|
+
depth: Number(element["depth"] ?? 0),
|
|
220
|
+
...(secure ? { secure: true } : {}),
|
|
221
|
+
...(element["enabled"] === false ? { disabled: true } : {}),
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
// Without Accessibility Cua hands back an empty tree, which reads as "this
|
|
225
|
+
// window has nothing in it". Say what is actually wrong.
|
|
226
|
+
if (!nodes.length && process.platform === "darwin" && !(await this.permissions()).accessibility) {
|
|
227
|
+
throw new ComputerError("permission", "Accessibility is not allowed for OHarness", "accessibility");
|
|
228
|
+
}
|
|
229
|
+
this.refs.set(opts.window, infos);
|
|
230
|
+
this.targets.delete(opts.window);
|
|
231
|
+
return { nodes, truncated: state["elements_complete"] === false && nodes.length >= (opts.maxNodes ?? 400) };
|
|
232
|
+
}
|
|
233
|
+
refInfo(ref) {
|
|
234
|
+
const match = /^w(.+)\.(\d+)$/.exec(ref);
|
|
235
|
+
const info = match ? this.refs.get(match[1])?.[Number(match[2]) - 1] : undefined;
|
|
236
|
+
if (!match || !info)
|
|
237
|
+
throw new ComputerError("stale_ref", `Unknown ref ${ref}. Read the window again with computer_read_app.`);
|
|
238
|
+
return { window: match[1], info };
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Run an action on a ref, re-finding the element once if its token went
|
|
242
|
+
* stale. Any snapshot of a window — a screenshot included — supersedes the
|
|
243
|
+
* tokens of the one before, and the model reasonably reads the tree, looks
|
|
244
|
+
* at the window, then clicks.
|
|
245
|
+
*/
|
|
246
|
+
async onRef(ref, act) {
|
|
247
|
+
const { window, info } = this.refInfo(ref);
|
|
248
|
+
try {
|
|
249
|
+
await act(info.token);
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
if (!(err instanceof ComputerError) || err.code !== "stale_ref")
|
|
253
|
+
throw err;
|
|
254
|
+
const previous = this.refs.get(window) ?? [];
|
|
255
|
+
await this.axTree({ window });
|
|
256
|
+
const fresh = this.refs.get(window) ?? [];
|
|
257
|
+
const same = fresh.find((candidate) => candidate.role === info.role && candidate.label === info.label && near(candidate.frame, info.frame));
|
|
258
|
+
if (!same)
|
|
259
|
+
throw new ComputerError("stale_ref", `${ref} is no longer there. Read the window again with computer_read_app.`);
|
|
260
|
+
// Keep the model's numbering: its ref now points at the re-found element.
|
|
261
|
+
const index = previous.indexOf(info);
|
|
262
|
+
if (index >= 0) {
|
|
263
|
+
previous[index] = same;
|
|
264
|
+
this.refs.set(window, previous);
|
|
265
|
+
}
|
|
266
|
+
await act(same.token);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
async axAction(ref, action, value) {
|
|
270
|
+
const { window } = this.refInfo(ref);
|
|
271
|
+
switch (action) {
|
|
272
|
+
case "press":
|
|
273
|
+
case "expand":
|
|
274
|
+
case "collapse":
|
|
275
|
+
return this.onRef(ref, (token) => this.call("click", { element_token: token }));
|
|
276
|
+
case "showMenu":
|
|
277
|
+
return this.onRef(ref, (token) => this.call("click", { element_token: token, button: "right" }));
|
|
278
|
+
case "setValue":
|
|
279
|
+
return this.onRef(ref, (token) => this.call("set_value", { element_token: token, value: value ?? "" }));
|
|
280
|
+
case "focus":
|
|
281
|
+
// Remembered, not performed: type_text on the element focuses it
|
|
282
|
+
// itself, in the background.
|
|
283
|
+
this.targets.set(window, ref);
|
|
284
|
+
return;
|
|
285
|
+
default:
|
|
286
|
+
throw new ComputerError("unsupported", `${action} is not supported here`);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
async input(event, opts) {
|
|
290
|
+
const delivery_mode = opts.foreground ? "foreground" : "background";
|
|
291
|
+
const window = opts.window;
|
|
292
|
+
if (!window)
|
|
293
|
+
throw new ComputerError("needs_foreground", "no window named");
|
|
294
|
+
const pid = await this.pidOf(window);
|
|
295
|
+
const where = { pid, window_id: Number(window), delivery_mode };
|
|
296
|
+
switch (event.type) {
|
|
297
|
+
case "move":
|
|
298
|
+
return;
|
|
299
|
+
case "click": {
|
|
300
|
+
const at = await this.toWindowPixels(window, event.x, event.y);
|
|
301
|
+
await this.call("click", {
|
|
302
|
+
...where,
|
|
303
|
+
...at,
|
|
304
|
+
...(event.button ? { button: event.button } : {}),
|
|
305
|
+
...(event.count && event.count > 1 ? { count: event.count } : {}),
|
|
306
|
+
...(event.modifiers?.length ? { modifier: event.modifiers.map(modifierName) } : {}),
|
|
307
|
+
});
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
case "scroll": {
|
|
311
|
+
const at = await this.toWindowPixels(window, event.x, event.y);
|
|
312
|
+
const vertical = Math.abs(event.dy) >= Math.abs(event.dx);
|
|
313
|
+
const amount = Math.max(1, Math.min(50, Math.round(Math.abs(vertical ? event.dy : event.dx)) || 3));
|
|
314
|
+
const direction = vertical ? (event.dy >= 0 ? "down" : "up") : event.dx >= 0 ? "right" : "left";
|
|
315
|
+
await this.call("scroll", { ...where, ...at, direction, amount });
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
case "drag": {
|
|
319
|
+
const from = await this.toWindowPixels(window, event.from.x, event.from.y);
|
|
320
|
+
const to = await this.toWindowPixels(window, event.to.x, event.to.y);
|
|
321
|
+
await this.call("drag", {
|
|
322
|
+
...where,
|
|
323
|
+
from_x: from.x,
|
|
324
|
+
from_y: from.y,
|
|
325
|
+
to_x: to.x,
|
|
326
|
+
to_y: to.y,
|
|
327
|
+
...(event.modifiers?.length ? { modifier: event.modifiers.map(modifierName) } : {}),
|
|
328
|
+
});
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
case "text": {
|
|
332
|
+
const ref = this.targets.get(window);
|
|
333
|
+
if (ref) {
|
|
334
|
+
await this.onRef(ref, (token) => this.call("type_text", { element_token: token, text: event.text, delivery_mode }));
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
await this.call("type_text", { ...where, text: event.text });
|
|
338
|
+
}
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
case "key": {
|
|
342
|
+
const key = keyName(event.key);
|
|
343
|
+
const mods = (event.modifiers ?? []).map(modifierName);
|
|
344
|
+
if (mods.length)
|
|
345
|
+
await this.call("hotkey", { ...where, keys: [...mods, key] });
|
|
346
|
+
else
|
|
347
|
+
await this.call("press_key", { ...where, key });
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
async invokeMenu(window, path) {
|
|
353
|
+
await this.call("invoke_menu", { pid: await this.pidOf(window), window_id: Number(window), path });
|
|
354
|
+
}
|
|
355
|
+
async open(app) {
|
|
356
|
+
const byId = /^[\w-]+(\.[\w-]+)+$/.test(app) && !/\.exe$/i.test(app);
|
|
357
|
+
const state = await this.call("launch_app", byId ? { bundle_id: app } : { name: app });
|
|
358
|
+
const pid = Number(state["pid"]);
|
|
359
|
+
return Number.isFinite(pid) && pid > 0 ? { pid } : {};
|
|
360
|
+
}
|
|
361
|
+
async frontmost() {
|
|
362
|
+
const apps = await this.apps();
|
|
363
|
+
const front = apps.find((app) => app.active);
|
|
364
|
+
if (!front)
|
|
365
|
+
return { pid: 0, appId: "" };
|
|
366
|
+
const window = (await this.windows({ pid: front.pid })).find((w) => w.focused);
|
|
367
|
+
return { pid: front.pid, appId: front.id, ...(window ? { window: window.id } : {}) };
|
|
368
|
+
}
|
|
369
|
+
async activate(pid) {
|
|
370
|
+
await this.call("bring_to_front", { pid });
|
|
371
|
+
}
|
|
372
|
+
async idle() {
|
|
373
|
+
return this.opts.idle ? this.opts.idle() : Number.POSITIVE_INFINITY;
|
|
374
|
+
}
|
|
375
|
+
async pointVisible(window, x, y) {
|
|
376
|
+
const state = await this.call("list_windows", { on_screen_only: true });
|
|
377
|
+
const list = (state["windows"] ?? [])
|
|
378
|
+
.filter((w) => Number(w["layer"] ?? 0) === 0)
|
|
379
|
+
.sort((a, b) => Number(b["z_index"] ?? 0) - Number(a["z_index"] ?? 0));
|
|
380
|
+
for (const w of list) {
|
|
381
|
+
const b = w["bounds"];
|
|
382
|
+
if (x >= b["x"] && x < b["x"] + b["width"] && y >= b["y"] && y < b["y"] + b["height"]) {
|
|
383
|
+
return String(w["window_id"]) === window;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return false;
|
|
387
|
+
}
|
|
388
|
+
async clipboardRead() {
|
|
389
|
+
const state = await this.call("clipboard_read", { include_text: true });
|
|
390
|
+
return typeof state["text"] === "string" ? state["text"] : "";
|
|
391
|
+
}
|
|
392
|
+
async clipboardWrite(text) {
|
|
393
|
+
await this.call("clipboard_write", { text });
|
|
394
|
+
}
|
|
395
|
+
async close() {
|
|
396
|
+
await this.client.close().catch(() => { });
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
function imageOf(state) {
|
|
400
|
+
const content = state["__content"] ?? [];
|
|
401
|
+
const image = content.find((block) => block["type"] === "image");
|
|
402
|
+
if (!image || typeof image["data"] !== "string")
|
|
403
|
+
throw new ComputerError("failed", "cua-driver returned no image");
|
|
404
|
+
return { data: image["data"], mimeType: typeof image["mimeType"] === "string" ? image["mimeType"] : "image/png" };
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Cua does not flag password fields, so they are recognised here: a secure
|
|
408
|
+
* role, or a field named like one. A false positive refuses typing into a
|
|
409
|
+
* field the person can fill; a false negative types a secret.
|
|
410
|
+
*/
|
|
411
|
+
function isSecure(role, label) {
|
|
412
|
+
if (/secure/i.test(role))
|
|
413
|
+
return true;
|
|
414
|
+
return /text|edit|field/i.test(role) && !!label && /pass(word|code|phrase)|密码|口令|pin\b/i.test(label);
|
|
415
|
+
}
|
|
416
|
+
function near(a, b) {
|
|
417
|
+
if (!a || !b)
|
|
418
|
+
return !a && !b;
|
|
419
|
+
return Math.abs(a.x - b.x) < 24 && Math.abs(a.y - b.y) < 24 && Math.abs(a.w - b.w) < 24 && Math.abs(a.h - b.h) < 24;
|
|
420
|
+
}
|
|
421
|
+
function modifierName(modifier) {
|
|
422
|
+
const m = modifier.toLowerCase();
|
|
423
|
+
if (m === "alt")
|
|
424
|
+
return process.platform === "darwin" ? "option" : "alt";
|
|
425
|
+
if (m === "win")
|
|
426
|
+
return process.platform === "darwin" ? "cmd" : "win";
|
|
427
|
+
return m;
|
|
428
|
+
}
|
|
429
|
+
/** Our key names (DOM-style) to Cua's. */
|
|
430
|
+
function keyName(key) {
|
|
431
|
+
const table = {
|
|
432
|
+
enter: "return",
|
|
433
|
+
return: "return",
|
|
434
|
+
escape: "escape",
|
|
435
|
+
esc: "escape",
|
|
436
|
+
tab: "tab",
|
|
437
|
+
backspace: "backspace",
|
|
438
|
+
// Cua names the Mac's forward delete apart from backspace; Windows calls it delete.
|
|
439
|
+
delete: process.platform === "darwin" ? "forward_delete" : "delete",
|
|
440
|
+
arrowup: "up",
|
|
441
|
+
arrowdown: "down",
|
|
442
|
+
arrowleft: "left",
|
|
443
|
+
arrowright: "right",
|
|
444
|
+
pageup: "pageup",
|
|
445
|
+
pagedown: "pagedown",
|
|
446
|
+
home: "home",
|
|
447
|
+
end: "end",
|
|
448
|
+
space: "space",
|
|
449
|
+
" ": "space",
|
|
450
|
+
};
|
|
451
|
+
return table[key.toLowerCase()] ?? key.toLowerCase();
|
|
452
|
+
}
|
|
453
|
+
//# sourceMappingURL=cua-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cua-driver.js","sourceRoot":"","sources":["../../src/computer/cua-driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { Logger } from "../util/logger.ts";
|
|
2
|
+
import type { AppInfo, AxAction, AxNode, ComputerInputEvent, ComputerPermissions, ComputerTarget, HelperInfo, Shot, WindowInfo } from "./target.ts";
|
|
3
|
+
/**
|
|
4
|
+
* A `ComputerTarget` backed by the native helper, over JSON lines on stdio.
|
|
5
|
+
*
|
|
6
|
+
* The helper is a separate executable shipped inside the app — Swift on
|
|
7
|
+
* macOS, Rust on Windows — and both speak the protocol in
|
|
8
|
+
* `desktop/computer-helper/protocol.md`:
|
|
9
|
+
*
|
|
10
|
+
* → {"id": 1, "method": "apps", "params": {}}
|
|
11
|
+
* ← {"id": 1, "result": [...]}
|
|
12
|
+
* ← {"id": 2, "error": {"code": "permission", "message": "...", "grant": "screen"}}
|
|
13
|
+
*
|
|
14
|
+
* It must be spawned by the app itself (never through `open` or a launcher):
|
|
15
|
+
* macOS charges a child's TCC requests to its responsible process, so the
|
|
16
|
+
* person grants Screen Recording and Accessibility to OHarness once and the
|
|
17
|
+
* helper is covered by it.
|
|
18
|
+
*/
|
|
19
|
+
export interface HelperClientOptions {
|
|
20
|
+
/** Path to the helper executable. */
|
|
21
|
+
path: string;
|
|
22
|
+
args?: string[];
|
|
23
|
+
logger?: Logger;
|
|
24
|
+
/** Per-request timeout. Screenshots and tree walks can take a while. */
|
|
25
|
+
timeoutMs?: number;
|
|
26
|
+
}
|
|
27
|
+
export declare class HelperClient implements ComputerTarget {
|
|
28
|
+
private readonly child;
|
|
29
|
+
private readonly pending;
|
|
30
|
+
private nextId;
|
|
31
|
+
private exited?;
|
|
32
|
+
private readonly timeoutMs;
|
|
33
|
+
private readonly logger?;
|
|
34
|
+
private constructor();
|
|
35
|
+
static start(opts: HelperClientOptions): Promise<HelperClient>;
|
|
36
|
+
private onLine;
|
|
37
|
+
private fail;
|
|
38
|
+
call<T>(method: string, params?: Record<string, unknown>, timeoutMs?: number): Promise<T>;
|
|
39
|
+
info(): Promise<HelperInfo>;
|
|
40
|
+
permissions(): Promise<ComputerPermissions>;
|
|
41
|
+
requestPermissions(grant?: keyof ComputerPermissions): Promise<void>;
|
|
42
|
+
apps(): Promise<AppInfo[]>;
|
|
43
|
+
windows(opts?: {
|
|
44
|
+
pid?: number;
|
|
45
|
+
}): Promise<WindowInfo[]>;
|
|
46
|
+
screenshot(opts: {
|
|
47
|
+
window?: string;
|
|
48
|
+
display?: string;
|
|
49
|
+
maxWidth?: number;
|
|
50
|
+
}): Promise<Shot>;
|
|
51
|
+
axTree(opts: {
|
|
52
|
+
window: string;
|
|
53
|
+
depth?: number;
|
|
54
|
+
maxNodes?: number;
|
|
55
|
+
}): Promise<{
|
|
56
|
+
nodes: AxNode[];
|
|
57
|
+
truncated: boolean;
|
|
58
|
+
}>;
|
|
59
|
+
axAction(ref: string, action: AxAction, value?: string): Promise<void>;
|
|
60
|
+
input(event: ComputerInputEvent, opts: {
|
|
61
|
+
window?: string;
|
|
62
|
+
foreground: boolean;
|
|
63
|
+
}): Promise<void>;
|
|
64
|
+
open(app: string): Promise<{
|
|
65
|
+
pid?: number;
|
|
66
|
+
}>;
|
|
67
|
+
frontmost(): Promise<{
|
|
68
|
+
pid: number;
|
|
69
|
+
appId: string;
|
|
70
|
+
window?: string;
|
|
71
|
+
}>;
|
|
72
|
+
activate(pid: number): Promise<void>;
|
|
73
|
+
idle(): Promise<number>;
|
|
74
|
+
pointVisible(window: string, x: number, y: number): Promise<boolean>;
|
|
75
|
+
clipboardRead(): Promise<string>;
|
|
76
|
+
clipboardWrite(text: string): Promise<void>;
|
|
77
|
+
close(): Promise<void>;
|
|
78
|
+
}
|