@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,128 @@
|
|
|
1
|
+
import { ComputerError } from "./target.js";
|
|
2
|
+
export class ComputerArbiter {
|
|
3
|
+
windows = new Map();
|
|
4
|
+
apps = new Map();
|
|
5
|
+
control;
|
|
6
|
+
queue = [];
|
|
7
|
+
clipboardChain = Promise.resolve();
|
|
8
|
+
leaseMs;
|
|
9
|
+
controlWaitMs;
|
|
10
|
+
now;
|
|
11
|
+
listeners = new Set();
|
|
12
|
+
constructor(opts = {}) {
|
|
13
|
+
this.leaseMs = opts.leaseMs ?? 60_000;
|
|
14
|
+
this.controlWaitMs = opts.controlWaitMs ?? 30_000;
|
|
15
|
+
this.now = opts.now ?? Date.now;
|
|
16
|
+
}
|
|
17
|
+
/** Take or refresh the lease on a window; throws `busy` when someone else holds it. */
|
|
18
|
+
claimWindow(holder, window) {
|
|
19
|
+
this.claim(this.windows, window, holder, "window");
|
|
20
|
+
}
|
|
21
|
+
/** Take or refresh the lease on an app's keyboard focus. */
|
|
22
|
+
claimApp(holder, pid) {
|
|
23
|
+
this.claim(this.apps, pid, holder, "app");
|
|
24
|
+
}
|
|
25
|
+
claim(map, key, holder, what) {
|
|
26
|
+
const now = this.now();
|
|
27
|
+
const lease = map.get(key);
|
|
28
|
+
if (lease && lease.sessionId !== holder.sessionId && lease.until > now) {
|
|
29
|
+
throw new ComputerError("busy", `This ${what} is in use by another conversation ("${lease.label}"). Work on something else, or try again in a minute.`);
|
|
30
|
+
}
|
|
31
|
+
// The foreground holder owns the whole screen while it drives it.
|
|
32
|
+
if (this.control && this.control.sessionId !== holder.sessionId) {
|
|
33
|
+
throw new ComputerError("busy", `Another conversation ("${this.control.label}") is controlling the computer right now. Try again shortly.`);
|
|
34
|
+
}
|
|
35
|
+
map.set(key, { ...holder, until: now + this.leaseMs });
|
|
36
|
+
}
|
|
37
|
+
/** The person started using this window: every lease on it lapses. */
|
|
38
|
+
yieldWindow(window) {
|
|
39
|
+
this.windows.delete(window);
|
|
40
|
+
}
|
|
41
|
+
/** Who holds foreground control, if anyone. */
|
|
42
|
+
controller() {
|
|
43
|
+
return this.control;
|
|
44
|
+
}
|
|
45
|
+
holdsControl(sessionId) {
|
|
46
|
+
return this.control?.sessionId === sessionId;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Take the real cursor and keyboard, waiting in line behind any other
|
|
50
|
+
* conversation that has them. `onWait` fires once when the wait starts, so
|
|
51
|
+
* the page can say "waiting for control".
|
|
52
|
+
*/
|
|
53
|
+
async takeControl(holder, signal, onWait) {
|
|
54
|
+
if (!this.control || this.control.sessionId === holder.sessionId) {
|
|
55
|
+
this.control = holder;
|
|
56
|
+
this.changed();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
onWait?.(this.control);
|
|
60
|
+
await new Promise((resolve, reject) => {
|
|
61
|
+
const entry = {
|
|
62
|
+
holder,
|
|
63
|
+
resolve,
|
|
64
|
+
reject,
|
|
65
|
+
timer: setTimeout(() => {
|
|
66
|
+
this.dequeue(entry);
|
|
67
|
+
reject(new ComputerError("busy", `Another conversation ("${this.control?.label ?? "?"}") kept control of the computer for too long. Try again later.`));
|
|
68
|
+
}, this.controlWaitMs),
|
|
69
|
+
};
|
|
70
|
+
this.queue.push(entry);
|
|
71
|
+
signal?.addEventListener("abort", () => {
|
|
72
|
+
this.dequeue(entry);
|
|
73
|
+
reject(new ComputerError("refused", "stopped while waiting for control"));
|
|
74
|
+
}, { once: true });
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
dequeue(entry) {
|
|
78
|
+
clearTimeout(entry.timer);
|
|
79
|
+
const index = this.queue.indexOf(entry);
|
|
80
|
+
if (index >= 0)
|
|
81
|
+
this.queue.splice(index, 1);
|
|
82
|
+
}
|
|
83
|
+
releaseControl(sessionId) {
|
|
84
|
+
if (this.control?.sessionId !== sessionId)
|
|
85
|
+
return false;
|
|
86
|
+
this.control = undefined;
|
|
87
|
+
const next = this.queue.shift();
|
|
88
|
+
if (next) {
|
|
89
|
+
clearTimeout(next.timer);
|
|
90
|
+
this.control = next.holder;
|
|
91
|
+
next.resolve();
|
|
92
|
+
}
|
|
93
|
+
this.changed();
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
/** Release everything a conversation holds: its turn ended or its tab closed. */
|
|
97
|
+
releaseAll(sessionId) {
|
|
98
|
+
for (const [key, lease] of this.windows)
|
|
99
|
+
if (lease.sessionId === sessionId)
|
|
100
|
+
this.windows.delete(key);
|
|
101
|
+
for (const [key, lease] of this.apps)
|
|
102
|
+
if (lease.sessionId === sessionId)
|
|
103
|
+
this.apps.delete(key);
|
|
104
|
+
for (const entry of [...this.queue]) {
|
|
105
|
+
if (entry.holder.sessionId !== sessionId)
|
|
106
|
+
continue;
|
|
107
|
+
this.dequeue(entry);
|
|
108
|
+
entry.reject(new ComputerError("refused", "the conversation ended"));
|
|
109
|
+
}
|
|
110
|
+
this.releaseControl(sessionId);
|
|
111
|
+
}
|
|
112
|
+
/** Run `fn` with the clipboard to itself: save, use, restore happen as one. */
|
|
113
|
+
withClipboard(fn) {
|
|
114
|
+
const run = this.clipboardChain.then(fn, fn);
|
|
115
|
+
this.clipboardChain = run.catch(() => undefined);
|
|
116
|
+
return run;
|
|
117
|
+
}
|
|
118
|
+
/** Told when foreground control changes hands, for the overlay and the page. */
|
|
119
|
+
onChange(listener) {
|
|
120
|
+
this.listeners.add(listener);
|
|
121
|
+
return () => this.listeners.delete(listener);
|
|
122
|
+
}
|
|
123
|
+
changed() {
|
|
124
|
+
for (const listener of this.listeners)
|
|
125
|
+
listener();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=arbiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arbiter.js","sourceRoot":"","sources":["../../src/computer/arbiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
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 Cua Driver (github.com/trycua/cua, MIT).
|
|
5
|
+
*
|
|
6
|
+
* Cua Driver is the platform layer: ScreenCaptureKit and AX with SkyLight
|
|
7
|
+
* background input on macOS; UIA, MSAA, PostMessage and WGC on Windows. We
|
|
8
|
+
* drive its MCP server over stdio and keep everything above it — the tools
|
|
9
|
+
* the model sees, per-app approval, tiers, the arbiter — our own. The model
|
|
10
|
+
* never talks to Cua Driver directly: only this adapter does, and it calls a
|
|
11
|
+
* fixed handful of its 58 tools.
|
|
12
|
+
*
|
|
13
|
+
* How it is run matters:
|
|
14
|
+
*
|
|
15
|
+
* - Embedded (`CUA_DRIVER_EMBEDDED=1`) and spawned by the app itself, so
|
|
16
|
+
* macOS charges its TCC requests to OHarness and the person grants
|
|
17
|
+
* OHarness, not a second app. The driver never prompts in this mode; the
|
|
18
|
+
* host asks (see `requestPermissions`).
|
|
19
|
+
* - Telemetry and the update check off. Both default on, embedded or not.
|
|
20
|
+
* - `mcp --direct`: no daemon and no Cua cursor. The desktop app draws its
|
|
21
|
+
* own, per conversation, and keeps it out of captures.
|
|
22
|
+
*
|
|
23
|
+
* Coordinates: Cua takes pointer x/y in pixels of the window screenshot it
|
|
24
|
+
* last returned. The engine works in screen units (each screenshot's frame
|
|
25
|
+
* says where its pixels sit), so pointer events are mapped back through the
|
|
26
|
+
* last screenshot of that window here. Element frames already come in screen
|
|
27
|
+
* units.
|
|
28
|
+
*/
|
|
29
|
+
export interface CuaDriverOptions {
|
|
30
|
+
/** The cua-driver executable. */
|
|
31
|
+
path: string;
|
|
32
|
+
/** The host app's bundle id, for Cua's own identity checks. */
|
|
33
|
+
hostBundleId?: string;
|
|
34
|
+
/** Where the driver may keep state; telemetry is off either way. */
|
|
35
|
+
stateDir?: string;
|
|
36
|
+
/**
|
|
37
|
+
* The Rego policy the driver enforces on every call: only the tools this
|
|
38
|
+
* adapter uses, and none that write files (desktop/computer-helper/cua/policy.rego).
|
|
39
|
+
*/
|
|
40
|
+
policyFile?: string;
|
|
41
|
+
logger?: Logger;
|
|
42
|
+
/**
|
|
43
|
+
* Ask the OS for Screen Recording or Accessibility. Embedded, the driver
|
|
44
|
+
* never prompts: the host app has to, as itself.
|
|
45
|
+
*/
|
|
46
|
+
requestPermissions?: (grant?: keyof ComputerPermissions) => Promise<void>;
|
|
47
|
+
/** Milliseconds since the person's last real input, from the host. */
|
|
48
|
+
idle?: () => Promise<number>;
|
|
49
|
+
}
|
|
50
|
+
export declare class CuaDriverTarget implements ComputerTarget {
|
|
51
|
+
private readonly client;
|
|
52
|
+
private readonly opts;
|
|
53
|
+
private readonly pids;
|
|
54
|
+
private readonly shots;
|
|
55
|
+
private readonly refs;
|
|
56
|
+
/** The field typing goes to, per window, set by `axAction focus`. */
|
|
57
|
+
private readonly targets;
|
|
58
|
+
private appIds;
|
|
59
|
+
private version;
|
|
60
|
+
private constructor();
|
|
61
|
+
static start(opts: CuaDriverOptions): Promise<CuaDriverTarget>;
|
|
62
|
+
private call;
|
|
63
|
+
private refusal;
|
|
64
|
+
private pidOf;
|
|
65
|
+
/** Screen point → pixels of the last screenshot of this window, taking one if needed. */
|
|
66
|
+
private toWindowPixels;
|
|
67
|
+
info(): Promise<HelperInfo>;
|
|
68
|
+
permissions(): Promise<ComputerPermissions>;
|
|
69
|
+
requestPermissions(grant?: keyof ComputerPermissions): Promise<void>;
|
|
70
|
+
apps(): Promise<AppInfo[]>;
|
|
71
|
+
windows(opts?: {
|
|
72
|
+
pid?: number;
|
|
73
|
+
}): Promise<WindowInfo[]>;
|
|
74
|
+
screenshot(opts: {
|
|
75
|
+
window?: string;
|
|
76
|
+
display?: string;
|
|
77
|
+
maxWidth?: number;
|
|
78
|
+
}): Promise<Shot>;
|
|
79
|
+
axTree(opts: {
|
|
80
|
+
window: string;
|
|
81
|
+
depth?: number;
|
|
82
|
+
maxNodes?: number;
|
|
83
|
+
}): Promise<{
|
|
84
|
+
nodes: AxNode[];
|
|
85
|
+
truncated: boolean;
|
|
86
|
+
}>;
|
|
87
|
+
private refInfo;
|
|
88
|
+
/**
|
|
89
|
+
* Run an action on a ref, re-finding the element once if its token went
|
|
90
|
+
* stale. Any snapshot of a window — a screenshot included — supersedes the
|
|
91
|
+
* tokens of the one before, and the model reasonably reads the tree, looks
|
|
92
|
+
* at the window, then clicks.
|
|
93
|
+
*/
|
|
94
|
+
private onRef;
|
|
95
|
+
axAction(ref: string, action: AxAction, value?: string): Promise<void>;
|
|
96
|
+
input(event: ComputerInputEvent, opts: {
|
|
97
|
+
window?: string;
|
|
98
|
+
foreground: boolean;
|
|
99
|
+
}): Promise<void>;
|
|
100
|
+
invokeMenu(window: string, path: string[]): Promise<void>;
|
|
101
|
+
open(app: string): Promise<{
|
|
102
|
+
pid?: number;
|
|
103
|
+
}>;
|
|
104
|
+
frontmost(): Promise<{
|
|
105
|
+
pid: number;
|
|
106
|
+
appId: string;
|
|
107
|
+
window?: string;
|
|
108
|
+
}>;
|
|
109
|
+
activate(pid: number): Promise<void>;
|
|
110
|
+
idle(): Promise<number>;
|
|
111
|
+
pointVisible(window: string, x: number, y: number): Promise<boolean>;
|
|
112
|
+
clipboardRead(): Promise<string>;
|
|
113
|
+
clipboardWrite(text: string): Promise<void>;
|
|
114
|
+
close(): Promise<void>;
|
|
115
|
+
}
|