@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.
Files changed (119) hide show
  1. package/dist/agent/agent.d.ts +207 -1
  2. package/dist/agent/agent.js +691 -55
  3. package/dist/agent/agent.js.map +1 -1
  4. package/dist/agent/background.d.ts +135 -0
  5. package/dist/agent/background.js +307 -0
  6. package/dist/agent/background.js.map +1 -0
  7. package/dist/agent/compaction.d.ts +7 -0
  8. package/dist/agent/compaction.js +11 -3
  9. package/dist/agent/compaction.js.map +1 -1
  10. package/dist/agent/goal.d.ts +36 -0
  11. package/dist/agent/goal.js +71 -0
  12. package/dist/agent/goal.js.map +1 -0
  13. package/dist/agent/permissions.d.ts +6 -0
  14. package/dist/agent/permissions.js +2 -1
  15. package/dist/agent/permissions.js.map +1 -1
  16. package/dist/agent/session.d.ts +36 -0
  17. package/dist/agent/session.js +72 -0
  18. package/dist/agent/session.js.map +1 -1
  19. package/dist/agent/store.d.ts +25 -0
  20. package/dist/agent/store.js +21 -0
  21. package/dist/agent/store.js.map +1 -1
  22. package/dist/agent/subagent.d.ts +12 -0
  23. package/dist/agent/subagent.js +11 -1
  24. package/dist/agent/subagent.js.map +1 -1
  25. package/dist/agent/workspace.d.ts +9 -0
  26. package/dist/agent/workspace.js +59 -5
  27. package/dist/agent/workspace.js.map +1 -1
  28. package/dist/auth/manager.d.ts +9 -0
  29. package/dist/auth/manager.js +67 -6
  30. package/dist/auth/manager.js.map +1 -1
  31. package/dist/auth/providers/account.js +5 -4
  32. package/dist/auth/providers/account.js.map +1 -1
  33. package/dist/browser/tools.js +3 -0
  34. package/dist/browser/tools.js.map +1 -1
  35. package/dist/computer/arbiter.d.ts +69 -0
  36. package/dist/computer/arbiter.js +128 -0
  37. package/dist/computer/arbiter.js.map +1 -0
  38. package/dist/computer/cua-driver.d.ts +115 -0
  39. package/dist/computer/cua-driver.js +453 -0
  40. package/dist/computer/cua-driver.js.map +1 -0
  41. package/dist/computer/helper-client.d.ts +78 -0
  42. package/dist/computer/helper-client.js +163 -0
  43. package/dist/computer/helper-client.js.map +1 -0
  44. package/dist/computer/index.d.ts +15 -0
  45. package/dist/computer/index.js +9 -0
  46. package/dist/computer/index.js.map +1 -0
  47. package/dist/computer/mode.d.ts +19 -0
  48. package/dist/computer/mode.js +42 -0
  49. package/dist/computer/mode.js.map +1 -0
  50. package/dist/computer/plugin.d.ts +24 -0
  51. package/dist/computer/plugin.js +17 -0
  52. package/dist/computer/plugin.js.map +1 -0
  53. package/dist/computer/policy.d.ts +29 -0
  54. package/dist/computer/policy.js +127 -0
  55. package/dist/computer/policy.js.map +1 -0
  56. package/dist/computer/session.d.ts +199 -0
  57. package/dist/computer/session.js +392 -0
  58. package/dist/computer/session.js.map +1 -0
  59. package/dist/computer/target.d.ts +187 -0
  60. package/dist/computer/target.js +31 -0
  61. package/dist/computer/target.js.map +1 -0
  62. package/dist/computer/tools.d.ts +8 -0
  63. package/dist/computer/tools.js +537 -0
  64. package/dist/computer/tools.js.map +1 -0
  65. package/dist/core/tokens.js +4 -0
  66. package/dist/core/tokens.js.map +1 -1
  67. package/dist/core/types.d.ts +16 -1
  68. package/dist/core/types.js.map +1 -1
  69. package/dist/harness.d.ts +76 -1
  70. package/dist/harness.js +178 -22
  71. package/dist/harness.js.map +1 -1
  72. package/dist/index.d.ts +3 -0
  73. package/dist/index.js +2 -0
  74. package/dist/index.js.map +1 -1
  75. package/dist/mcp/transport.js +3 -0
  76. package/dist/mcp/transport.js.map +1 -1
  77. package/dist/providers/catalog.js +6 -0
  78. package/dist/providers/catalog.js.map +1 -1
  79. package/dist/providers/discovery.js +10 -2
  80. package/dist/providers/discovery.js.map +1 -1
  81. package/dist/providers/models-dev.js +1 -0
  82. package/dist/providers/models-dev.js.map +1 -1
  83. package/dist/providers/models-dev.json +114 -102
  84. package/dist/providers/piai.d.ts +16 -1
  85. package/dist/providers/piai.js +84 -7
  86. package/dist/providers/piai.js.map +1 -1
  87. package/dist/providers/types.d.ts +6 -0
  88. package/dist/providers/types.js.map +1 -1
  89. package/dist/runtime-plugins/cloud-connector.js +5 -0
  90. package/dist/runtime-plugins/cloud-connector.js.map +1 -1
  91. package/dist/schedule/scheduler.d.ts +38 -0
  92. package/dist/schedule/scheduler.js +101 -1
  93. package/dist/schedule/scheduler.js.map +1 -1
  94. package/dist/tools/builtin/bash.d.ts +6 -0
  95. package/dist/tools/builtin/bash.js +2 -1
  96. package/dist/tools/builtin/bash.js.map +1 -1
  97. package/dist/tools/builtin/recall.js +4 -0
  98. package/dist/tools/builtin/recall.js.map +1 -1
  99. package/dist/tools/builtin/routine.d.ts +9 -0
  100. package/dist/tools/builtin/routine.js +23 -2
  101. package/dist/tools/builtin/routine.js.map +1 -1
  102. package/dist/tools/builtin/task-control.d.ts +21 -0
  103. package/dist/tools/builtin/task-control.js +120 -0
  104. package/dist/tools/builtin/task-control.js.map +1 -0
  105. package/dist/tools/builtin/task.js +50 -9
  106. package/dist/tools/builtin/task.js.map +1 -1
  107. package/dist/tools/builtin/todo.d.ts +1 -1
  108. package/dist/tools/builtin/worktree.d.ts +10 -0
  109. package/dist/tools/builtin/worktree.js +52 -0
  110. package/dist/tools/builtin/worktree.js.map +1 -0
  111. package/dist/tools/define.d.ts +4 -1
  112. package/dist/tools/define.js +2 -0
  113. package/dist/tools/define.js.map +1 -1
  114. package/dist/tools/types.d.ts +112 -0
  115. package/dist/tools/types.js.map +1 -1
  116. package/dist/worktree/index.d.ts +109 -0
  117. package/dist/worktree/index.js +463 -0
  118. package/dist/worktree/index.js.map +1 -0
  119. 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
+ }