@oharness/engine 0.7.1 → 0.8.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 +1 -0
- package/dist/agent/agent.js +5 -0
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/permissions.js +8 -0
- package/dist/agent/permissions.js.map +1 -1
- package/dist/browser/cdp.d.ts +75 -0
- package/dist/browser/cdp.js +136 -0
- package/dist/browser/cdp.js.map +1 -0
- package/dist/browser/chrome.d.ts +19 -0
- package/dist/browser/chrome.js +306 -0
- package/dist/browser/chrome.js.map +1 -0
- package/dist/browser/extension.d.ts +35 -0
- package/dist/browser/extension.js +297 -0
- package/dist/browser/extension.js.map +1 -0
- package/dist/browser/host-manifest.d.ts +78 -0
- package/dist/browser/host-manifest.js +166 -0
- package/dist/browser/host-manifest.js.map +1 -0
- package/dist/browser/host.d.ts +27 -0
- package/dist/browser/host.js +311 -0
- package/dist/browser/host.js.map +1 -0
- package/dist/browser/index.d.ts +26 -0
- package/dist/browser/index.js +15 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/login-import.d.ts +98 -0
- package/dist/browser/login-import.js +244 -0
- package/dist/browser/login-import.js.map +1 -0
- package/dist/browser/plugin.d.ts +109 -0
- package/dist/browser/plugin.js +22 -0
- package/dist/browser/plugin.js.map +1 -0
- package/dist/browser/presence.d.ts +29 -0
- package/dist/browser/presence.js +54 -0
- package/dist/browser/presence.js.map +1 -0
- package/dist/browser/provider.d.ts +17 -0
- package/dist/browser/provider.js +13 -0
- package/dist/browser/provider.js.map +1 -0
- package/dist/browser/screencast.d.ts +42 -0
- package/dist/browser/screencast.js +99 -0
- package/dist/browser/screencast.js.map +1 -0
- package/dist/browser/session.d.ts +320 -0
- package/dist/browser/session.js +837 -0
- package/dist/browser/session.js.map +1 -0
- package/dist/browser/snapshot.d.ts +49 -0
- package/dist/browser/snapshot.js +145 -0
- package/dist/browser/snapshot.js.map +1 -0
- package/dist/browser/socket.d.ts +15 -0
- package/dist/browser/socket.js +32 -0
- package/dist/browser/socket.js.map +1 -0
- package/dist/browser/target.d.ts +112 -0
- package/dist/browser/target.js +20 -0
- package/dist/browser/target.js.map +1 -0
- package/dist/browser/tools.d.ts +3 -0
- package/dist/browser/tools.js +537 -0
- package/dist/browser/tools.js.map +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.js.map +1 -1
- package/dist/core/errors.d.ts +12 -0
- package/dist/core/errors.js +14 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/harness.d.ts +49 -0
- package/dist/harness.js +97 -1
- package/dist/harness.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/piai.js +7 -2
- package/dist/providers/piai.js.map +1 -1
- package/dist/tools/define.d.ts +1 -0
- package/dist/tools/define.js +3 -0
- package/dist/tools/define.js.map +1 -1
- package/dist/tools/types.d.ts +11 -0
- package/dist/tools/types.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { defineTool } from "../tools/define.js";
|
|
3
|
+
import { toolError, toolImage, toolText } from "../tools/types.js";
|
|
4
|
+
import { errorMessage } from "../core/errors.js";
|
|
5
|
+
import { originOf } from "./session.js";
|
|
6
|
+
/**
|
|
7
|
+
* The browser tools.
|
|
8
|
+
*
|
|
9
|
+
* Built against a live session rather than exported as constants, the way the
|
|
10
|
+
* task tool is: a ref means nothing without the snapshot it came from, so the
|
|
11
|
+
* tools and the session that holds the ref table have to be the same object
|
|
12
|
+
* graph. It also lets every tool answer the permission engine with the origin
|
|
13
|
+
* the session is currently on, which is what makes one approval per site work.
|
|
14
|
+
*
|
|
15
|
+
* Names are prefixed `browser_` and shaped like the browser tools the model has
|
|
16
|
+
* seen most: `read_page` returning refs, `click` taking either a ref or a
|
|
17
|
+
* coordinate, a `batch` for chaining. Novelty here costs accuracy for nothing.
|
|
18
|
+
*/
|
|
19
|
+
/** Keys worth naming, so the model never has to know a key code. */
|
|
20
|
+
const KEYS = {
|
|
21
|
+
Enter: { key: "Enter", code: "Enter", keyCode: 13, text: "\r" },
|
|
22
|
+
Tab: { key: "Tab", code: "Tab", keyCode: 9 },
|
|
23
|
+
Escape: { key: "Escape", code: "Escape", keyCode: 27 },
|
|
24
|
+
Backspace: { key: "Backspace", code: "Backspace", keyCode: 8 },
|
|
25
|
+
Delete: { key: "Delete", code: "Delete", keyCode: 46 },
|
|
26
|
+
ArrowUp: { key: "ArrowUp", code: "ArrowUp", keyCode: 38 },
|
|
27
|
+
ArrowDown: { key: "ArrowDown", code: "ArrowDown", keyCode: 40 },
|
|
28
|
+
ArrowLeft: { key: "ArrowLeft", code: "ArrowLeft", keyCode: 37 },
|
|
29
|
+
ArrowRight: { key: "ArrowRight", code: "ArrowRight", keyCode: 39 },
|
|
30
|
+
Home: { key: "Home", code: "Home", keyCode: 36 },
|
|
31
|
+
End: { key: "End", code: "End", keyCode: 35 },
|
|
32
|
+
PageUp: { key: "PageUp", code: "PageUp", keyCode: 33 },
|
|
33
|
+
PageDown: { key: "PageDown", code: "PageDown", keyCode: 34 },
|
|
34
|
+
};
|
|
35
|
+
const MODIFIER_BITS = { alt: 1, ctrl: 2, control: 2, meta: 4, cmd: 4, shift: 8 };
|
|
36
|
+
function modifierMask(modifiers) {
|
|
37
|
+
if (!modifiers)
|
|
38
|
+
return 0;
|
|
39
|
+
let mask = 0;
|
|
40
|
+
for (const part of modifiers.toLowerCase().split("+"))
|
|
41
|
+
mask |= MODIFIER_BITS[part.trim()] ?? 0;
|
|
42
|
+
return mask;
|
|
43
|
+
}
|
|
44
|
+
export function createBrowserTools(session) {
|
|
45
|
+
/**
|
|
46
|
+
* What a browser call is asking permission for.
|
|
47
|
+
*
|
|
48
|
+
* The site, not the gesture. Asking per click would train people to approve
|
|
49
|
+
* without reading, and the interesting question — which site is this agent
|
|
50
|
+
* allowed to drive — is one somebody can actually answer.
|
|
51
|
+
*/
|
|
52
|
+
const principals = (input) => {
|
|
53
|
+
const record = (input ?? {});
|
|
54
|
+
const target = typeof record["url"] === "string" ? originOf(normalizeUrl(record["url"])) : undefined;
|
|
55
|
+
const request = record["browser"] === "yours" || record["browser"] === "builtin" ? record["browser"] : undefined;
|
|
56
|
+
// A site in the person's own browser is a different thing to approve from
|
|
57
|
+
// the same site in the built-in one: there it is their accounts. So it is
|
|
58
|
+
// its own subject — approving one never approves the other.
|
|
59
|
+
const side = request || target ? session.sideFor(request) : session.current().side;
|
|
60
|
+
const origin = target ?? (side === session.current().side ? session.origin() : undefined);
|
|
61
|
+
if (!origin)
|
|
62
|
+
return [];
|
|
63
|
+
return [side === "extension" ? `YourBrowser(${origin})` : `Browser(${origin})`];
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Where the call ran, when the model has two browsers to choose between —
|
|
67
|
+
* said on every page-opening result so it never has to guess.
|
|
68
|
+
*/
|
|
69
|
+
const where = () => {
|
|
70
|
+
const { side, policy } = session.current();
|
|
71
|
+
if (policy !== "auto")
|
|
72
|
+
return "";
|
|
73
|
+
return side === "extension" ? " (in the user's own browser)" : " (in the built-in browser)";
|
|
74
|
+
};
|
|
75
|
+
const browserParam = z
|
|
76
|
+
.enum(["yours", "builtin"])
|
|
77
|
+
.optional()
|
|
78
|
+
.describe('Which browser. "yours" is the user\'s own browser, signed in to their accounts, with their tabs open: use it when the task needs their accounts or data (their email, their dashboards, posting as them) or a page they have open. "builtin" is a separate browser of OHarness\'s own with its own sign-ins: use it for research, public pages, local dev servers and anything exploratory. Omit to stay in the browser this conversation is already using.');
|
|
79
|
+
const navigate = defineTool({
|
|
80
|
+
name: "browser_navigate",
|
|
81
|
+
description: "Open a URL in the browser, or move through its history. Returns the URL that ended up loaded. Follow with browser_read_page to see what is on it.",
|
|
82
|
+
parameters: z.object({
|
|
83
|
+
url: z
|
|
84
|
+
.string()
|
|
85
|
+
.optional()
|
|
86
|
+
.describe('URL to open. Omit and set `action` to move in history instead.'),
|
|
87
|
+
action: z.enum(["back", "forward", "reload"]).optional(),
|
|
88
|
+
browser: browserParam,
|
|
89
|
+
}),
|
|
90
|
+
principals,
|
|
91
|
+
renderTitle: (input) => `browser_navigate(${input.url ?? input.action ?? ""})`,
|
|
92
|
+
async execute(input) {
|
|
93
|
+
try {
|
|
94
|
+
if (input.action) {
|
|
95
|
+
const page = await session.page();
|
|
96
|
+
if (input.action === "reload")
|
|
97
|
+
return toolText(`Now at ${(await session.reload()).url}`);
|
|
98
|
+
else {
|
|
99
|
+
const history = await page.send("Page.getNavigationHistory");
|
|
100
|
+
const entries = Array.isArray(history["entries"]) ? history["entries"] : [];
|
|
101
|
+
const index = Number(history["currentIndex"] ?? 0) + (input.action === "back" ? -1 : 1);
|
|
102
|
+
const entry = entries[index];
|
|
103
|
+
if (!entry)
|
|
104
|
+
return toolError(`nothing to go ${input.action} to`);
|
|
105
|
+
await page.send("Page.navigateToHistoryEntry", { entryId: entry["id"] });
|
|
106
|
+
}
|
|
107
|
+
return toolText(`Now at ${await session.url()}`);
|
|
108
|
+
}
|
|
109
|
+
if (!input.url)
|
|
110
|
+
return toolError("pass a url, or an action of back, forward or reload");
|
|
111
|
+
session.use(input.browser);
|
|
112
|
+
const result = await session.navigate(normalizeUrl(input.url));
|
|
113
|
+
// A site the person has open in their own browser, reached in the
|
|
114
|
+
// built-in one: it may be signed out here. Said, not acted on — moving
|
|
115
|
+
// into their browser is the model's call, made with `browser: "yours"`,
|
|
116
|
+
// and the permission that asks for.
|
|
117
|
+
const hint = !input.browser && (await session.openInYourBrowser(result.url))
|
|
118
|
+
? `\nThe user has this site open in their own browser, where they are likely signed in. If this task needs their account, call browser_navigate again with browser: "yours".`
|
|
119
|
+
: "";
|
|
120
|
+
return toolText(`Loaded ${result.url}${where()}${hint}`);
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
return toolError(errorMessage(err));
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
const readPage = defineTool({
|
|
128
|
+
name: "browser_read_page",
|
|
129
|
+
description: "Read the current page as an accessibility outline. Interactive elements are tagged [ref_N] for browser_click, browser_type and browser_form_input. Prefer this over a screenshot: it is far cheaper and says what each control is. Refs are replaced on every call.",
|
|
130
|
+
readOnly: true,
|
|
131
|
+
parameters: z.object({
|
|
132
|
+
filter: z
|
|
133
|
+
.enum(["interactive", "all"])
|
|
134
|
+
.optional()
|
|
135
|
+
.describe("`interactive` (default) keeps controls and landmarks; `all` adds text content"),
|
|
136
|
+
max_chars: z.number().int().positive().optional().describe("Output ceiling; default 25000"),
|
|
137
|
+
}),
|
|
138
|
+
principals,
|
|
139
|
+
renderTitle: () => "browser_read_page",
|
|
140
|
+
async execute(input) {
|
|
141
|
+
try {
|
|
142
|
+
const snapshot = await session.snapshot({
|
|
143
|
+
...(input.filter ? { filter: input.filter } : {}),
|
|
144
|
+
...(input.max_chars ? { maxChars: input.max_chars } : {}),
|
|
145
|
+
});
|
|
146
|
+
const header = `${await session.url()}\n\n`;
|
|
147
|
+
const note = snapshot.truncated ? "\n\n(truncated — raise max_chars or narrow with browser_find)" : "";
|
|
148
|
+
return toolText(header + snapshot.text + note);
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
return toolError(errorMessage(err));
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
const find = defineTool({
|
|
156
|
+
name: "browser_find",
|
|
157
|
+
description: "Search the current page for elements whose role, name or value contains a string, case-insensitively. Returns the matching lines with their refs — cheaper than reading the whole page when you know what you are looking for.",
|
|
158
|
+
readOnly: true,
|
|
159
|
+
parameters: z.object({
|
|
160
|
+
query: z.string().describe('Text to look for, e.g. "Sign in", "email"'),
|
|
161
|
+
}),
|
|
162
|
+
principals,
|
|
163
|
+
renderTitle: (input) => `browser_find(${input.query})`,
|
|
164
|
+
async execute(input) {
|
|
165
|
+
try {
|
|
166
|
+
const snapshot = await session.snapshot({ filter: "all" });
|
|
167
|
+
const needle = input.query.toLowerCase();
|
|
168
|
+
const hits = snapshot.text
|
|
169
|
+
.split("\n")
|
|
170
|
+
.filter((line) => line.toLowerCase().includes(needle))
|
|
171
|
+
.slice(0, 40);
|
|
172
|
+
if (hits.length === 0)
|
|
173
|
+
return toolText(`No element matches "${input.query}"`);
|
|
174
|
+
return toolText(hits.join("\n"));
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
return toolError(errorMessage(err));
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
const click = defineTool({
|
|
182
|
+
name: "browser_click",
|
|
183
|
+
description: "Click an element. Prefer `ref` from browser_read_page; `x`/`y` are viewport coordinates for things the tree does not expose.",
|
|
184
|
+
parameters: z.object({
|
|
185
|
+
ref: z.string().optional().describe("A ref_N from browser_read_page"),
|
|
186
|
+
x: z.number().optional(),
|
|
187
|
+
y: z.number().optional(),
|
|
188
|
+
button: z.enum(["left", "right", "middle"]).optional(),
|
|
189
|
+
click_count: z.number().int().min(1).max(3).optional().describe("2 for a double click"),
|
|
190
|
+
modifiers: z.string().optional().describe('e.g. "shift", "ctrl+shift", "cmd"'),
|
|
191
|
+
}),
|
|
192
|
+
principals,
|
|
193
|
+
renderTitle: (input) => `browser_click(${input.ref ?? `${input.x},${input.y}`})`,
|
|
194
|
+
async execute(input) {
|
|
195
|
+
try {
|
|
196
|
+
const point = await resolvePoint(input);
|
|
197
|
+
const page = await session.page();
|
|
198
|
+
const modifiers = modifierMask(input.modifiers);
|
|
199
|
+
const button = input.button ?? "left";
|
|
200
|
+
const clickCount = input.click_count ?? 1;
|
|
201
|
+
await page.input({ type: "mouse", action: "move", x: point.x, y: point.y, modifiers });
|
|
202
|
+
await page.input({ type: "mouse", action: "down", x: point.x, y: point.y, button, clickCount, modifiers });
|
|
203
|
+
await page.input({ type: "mouse", action: "up", x: point.x, y: point.y, button, clickCount, modifiers });
|
|
204
|
+
return toolText(`Clicked ${input.ref ?? `(${Math.round(point.x)}, ${Math.round(point.y)})`}`);
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
return toolError(errorMessage(err));
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
});
|
|
211
|
+
const type = defineTool({
|
|
212
|
+
name: "browser_type",
|
|
213
|
+
description: "Type into the page. With `ref`, the element is focused first. `key` presses a named key (Enter, Tab, Escape, ArrowDown, …) instead of inserting text.",
|
|
214
|
+
parameters: z.object({
|
|
215
|
+
ref: z.string().optional().describe("Element to focus first"),
|
|
216
|
+
text: z.string().optional(),
|
|
217
|
+
key: z.string().optional().describe("A named key, e.g. Enter"),
|
|
218
|
+
modifiers: z.string().optional(),
|
|
219
|
+
}),
|
|
220
|
+
principals,
|
|
221
|
+
renderTitle: (input) => `browser_type(${input.key ?? truncateTitle(input.text ?? "")})`,
|
|
222
|
+
async execute(input) {
|
|
223
|
+
try {
|
|
224
|
+
const page = await session.page();
|
|
225
|
+
if (input.ref) {
|
|
226
|
+
const point = await session.locate(input.ref);
|
|
227
|
+
await page.input({ type: "mouse", action: "move", x: point.x, y: point.y });
|
|
228
|
+
await page.input({ type: "mouse", action: "down", x: point.x, y: point.y, button: "left", clickCount: 1 });
|
|
229
|
+
await page.input({ type: "mouse", action: "up", x: point.x, y: point.y, button: "left", clickCount: 1 });
|
|
230
|
+
}
|
|
231
|
+
if (input.key) {
|
|
232
|
+
const spec = KEYS[input.key];
|
|
233
|
+
if (!spec)
|
|
234
|
+
return toolError(`unknown key "${input.key}". Known: ${Object.keys(KEYS).join(", ")}`);
|
|
235
|
+
const modifiers = modifierMask(input.modifiers);
|
|
236
|
+
await page.input({ type: "key", action: "down", key: spec.key, code: spec.code, ...(spec.text ? { text: spec.text } : {}), modifiers });
|
|
237
|
+
await page.input({ type: "key", action: "up", key: spec.key, code: spec.code, modifiers });
|
|
238
|
+
return toolText(`Pressed ${input.key}`);
|
|
239
|
+
}
|
|
240
|
+
if (input.text === undefined)
|
|
241
|
+
return toolError("pass text, or a key");
|
|
242
|
+
await page.input({ type: "text", text: input.text });
|
|
243
|
+
return toolText(`Typed ${input.text.length} characters`);
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
return toolError(errorMessage(err));
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
});
|
|
250
|
+
const formInput = defineTool({
|
|
251
|
+
name: "browser_form_input",
|
|
252
|
+
description: "Set a form control's value directly — selects, checkboxes, radios, file-less inputs and contenteditable. More reliable than typing for anything that is not a plain text field.",
|
|
253
|
+
parameters: z.object({
|
|
254
|
+
ref: z.string().describe("A ref_N from browser_read_page"),
|
|
255
|
+
value: z.union([z.string(), z.boolean(), z.number()]).describe("String for inputs and selects, boolean for checkboxes"),
|
|
256
|
+
}),
|
|
257
|
+
principals,
|
|
258
|
+
renderTitle: (input) => `browser_form_input(${input.ref})`,
|
|
259
|
+
async execute(input) {
|
|
260
|
+
try {
|
|
261
|
+
const page = await session.page();
|
|
262
|
+
const objectId = await session.resolveObject(input.ref);
|
|
263
|
+
// Setting `.value` alone leaves every framework unaware it changed, so
|
|
264
|
+
// the events a real edit would have produced are dispatched too.
|
|
265
|
+
const result = await page.send("Runtime.callFunctionOn", {
|
|
266
|
+
objectId,
|
|
267
|
+
functionDeclaration: `function (value) {
|
|
268
|
+
const tag = (this.tagName || "").toLowerCase();
|
|
269
|
+
if (this.isContentEditable) { this.textContent = String(value); }
|
|
270
|
+
else if (tag === "select") {
|
|
271
|
+
const wanted = String(value);
|
|
272
|
+
const option = [...this.options].find((o) => o.value === wanted || o.label === wanted || o.text === wanted);
|
|
273
|
+
if (!option) return "no option matching " + wanted;
|
|
274
|
+
this.value = option.value;
|
|
275
|
+
} else if (this.type === "checkbox" || this.type === "radio") {
|
|
276
|
+
this.checked = value === true || value === "true";
|
|
277
|
+
} else { this.value = String(value); }
|
|
278
|
+
this.dispatchEvent(new Event("input", { bubbles: true }));
|
|
279
|
+
this.dispatchEvent(new Event("change", { bubbles: true }));
|
|
280
|
+
return "ok";
|
|
281
|
+
}`,
|
|
282
|
+
arguments: [{ value: input.value }],
|
|
283
|
+
returnByValue: true,
|
|
284
|
+
});
|
|
285
|
+
const value = (result["result"] ?? {})["value"];
|
|
286
|
+
if (value !== "ok")
|
|
287
|
+
return toolError(String(value ?? "could not set the value"));
|
|
288
|
+
return toolText(`Set ${input.ref} to ${String(input.value)}`);
|
|
289
|
+
}
|
|
290
|
+
catch (err) {
|
|
291
|
+
return toolError(errorMessage(err));
|
|
292
|
+
}
|
|
293
|
+
},
|
|
294
|
+
});
|
|
295
|
+
const screenshot = defineTool({
|
|
296
|
+
name: "browser_screenshot",
|
|
297
|
+
description: "Capture the page as an image. Use for questions only pixels answer — colour, spacing, whether an image rendered. For structure and text, browser_read_page is cheaper and more accurate.",
|
|
298
|
+
readOnly: true,
|
|
299
|
+
parameters: z.object({
|
|
300
|
+
full_page: z.boolean().optional().describe("Capture beyond the viewport"),
|
|
301
|
+
}),
|
|
302
|
+
principals,
|
|
303
|
+
renderTitle: () => "browser_screenshot",
|
|
304
|
+
async execute(input) {
|
|
305
|
+
try {
|
|
306
|
+
const page = await session.page();
|
|
307
|
+
const result = await page.send("Page.captureScreenshot", {
|
|
308
|
+
format: "jpeg",
|
|
309
|
+
quality: 70,
|
|
310
|
+
...(input.full_page ? { captureBeyondViewport: true } : {}),
|
|
311
|
+
});
|
|
312
|
+
const data = result["data"];
|
|
313
|
+
if (typeof data !== "string")
|
|
314
|
+
return toolError("the browser returned no image");
|
|
315
|
+
return toolImage("image/jpeg", data, await session.url());
|
|
316
|
+
}
|
|
317
|
+
catch (err) {
|
|
318
|
+
return toolError(errorMessage(err));
|
|
319
|
+
}
|
|
320
|
+
},
|
|
321
|
+
});
|
|
322
|
+
const evaluate = defineTool({
|
|
323
|
+
name: "browser_evaluate",
|
|
324
|
+
description: "Run JavaScript in the page and return the result. For inspection and debugging — reading computed styles, checking a global, probing state. Not a way to implement behaviour.",
|
|
325
|
+
parameters: z.object({
|
|
326
|
+
expression: z.string().describe("A JavaScript expression; top-level await is allowed"),
|
|
327
|
+
}),
|
|
328
|
+
principals,
|
|
329
|
+
renderTitle: (input) => `browser_evaluate(${truncateTitle(input.expression)})`,
|
|
330
|
+
async execute(input) {
|
|
331
|
+
try {
|
|
332
|
+
const page = await session.page();
|
|
333
|
+
const result = await page.send("Runtime.evaluate", {
|
|
334
|
+
expression: input.expression,
|
|
335
|
+
returnByValue: true,
|
|
336
|
+
awaitPromise: true,
|
|
337
|
+
// Otherwise `$0`-style helpers and bare object literals behave
|
|
338
|
+
// differently here than in the browser's own console, which is the
|
|
339
|
+
// thing anybody writing an expression is comparing against.
|
|
340
|
+
replMode: true,
|
|
341
|
+
});
|
|
342
|
+
const details = result["exceptionDetails"];
|
|
343
|
+
if (details) {
|
|
344
|
+
const thrown = (details["exception"] ?? {});
|
|
345
|
+
return toolError(String(thrown["description"] ?? details["text"] ?? "threw"));
|
|
346
|
+
}
|
|
347
|
+
const value = (result["result"] ?? {})["value"];
|
|
348
|
+
return toolText(value === undefined ? "undefined" : JSON.stringify(value, null, 2).slice(0, 20_000));
|
|
349
|
+
}
|
|
350
|
+
catch (err) {
|
|
351
|
+
return toolError(errorMessage(err));
|
|
352
|
+
}
|
|
353
|
+
},
|
|
354
|
+
});
|
|
355
|
+
const tabs = defineTool({
|
|
356
|
+
name: "browser_tabs",
|
|
357
|
+
description: "List, open, switch between or close browser tabs.",
|
|
358
|
+
parameters: z.object({
|
|
359
|
+
action: z.enum(["list", "create", "select", "close"]),
|
|
360
|
+
url: z.string().optional().describe("For create"),
|
|
361
|
+
browser: browserParam,
|
|
362
|
+
id: z.string().optional().describe("For select and close; from the list"),
|
|
363
|
+
}),
|
|
364
|
+
principals,
|
|
365
|
+
renderTitle: (input) => `browser_tabs(${input.action})`,
|
|
366
|
+
async execute(input) {
|
|
367
|
+
try {
|
|
368
|
+
if (input.action === "create") {
|
|
369
|
+
session.use(input.browser);
|
|
370
|
+
const opened = await session.newTab(input.url ? normalizeUrl(input.url) : undefined);
|
|
371
|
+
return toolText(`Opened tab ${opened.id}${where()}`);
|
|
372
|
+
}
|
|
373
|
+
// Described, not attached: in the person's own browser, attaching every
|
|
374
|
+
// tab to list them would put a debugging banner on all of them.
|
|
375
|
+
const listed = await session.tabList();
|
|
376
|
+
if (input.action === "list") {
|
|
377
|
+
if (listed.length === 0)
|
|
378
|
+
return toolText("No tabs open");
|
|
379
|
+
return toolText(listed
|
|
380
|
+
.map((tab) => `${tab.id} ${tab.url}${tab.title ? ` ${tab.title}` : ""}${tab.active ? " (current)" : ""}${tab.mine ? "" : " (the user's; select to use it)"}`)
|
|
381
|
+
.join("\n"));
|
|
382
|
+
}
|
|
383
|
+
if (!listed.some((tab) => tab.id === input.id)) {
|
|
384
|
+
return toolError(`no tab ${input.id}. Call browser_tabs with action "list".`);
|
|
385
|
+
}
|
|
386
|
+
if (input.action === "select") {
|
|
387
|
+
const { url } = await session.selectPaneTab(input.id);
|
|
388
|
+
return toolText(`Switched to ${url}`);
|
|
389
|
+
}
|
|
390
|
+
const closed = await session.closePaneTab(input.id);
|
|
391
|
+
return toolText(closed.released ? `Stopped using tab ${input.id}; it stays open for the user` : `Closed tab ${input.id}`);
|
|
392
|
+
}
|
|
393
|
+
catch (err) {
|
|
394
|
+
return toolError(errorMessage(err));
|
|
395
|
+
}
|
|
396
|
+
},
|
|
397
|
+
});
|
|
398
|
+
const consoleTool = defineTool({
|
|
399
|
+
name: "browser_console",
|
|
400
|
+
description: "Read console messages and uncaught exceptions from the page, oldest first. The fastest way to find out why a page or dev server is misbehaving.",
|
|
401
|
+
readOnly: true,
|
|
402
|
+
parameters: z.object({
|
|
403
|
+
only_errors: z.boolean().optional(),
|
|
404
|
+
limit: z.number().int().positive().max(200).optional(),
|
|
405
|
+
}),
|
|
406
|
+
principals,
|
|
407
|
+
renderTitle: () => "browser_console",
|
|
408
|
+
async execute(input) {
|
|
409
|
+
const wanted = session
|
|
410
|
+
.consoleEntries()
|
|
411
|
+
.filter((entry) => !input.only_errors || entry.level === "error" || entry.level === "warning");
|
|
412
|
+
const shown = wanted.slice(-(input.limit ?? 50));
|
|
413
|
+
if (shown.length === 0)
|
|
414
|
+
return toolText("Console is empty");
|
|
415
|
+
return toolText(shown.map((entry) => `[${entry.level}] ${entry.text}`).join("\n").slice(0, 20_000));
|
|
416
|
+
},
|
|
417
|
+
});
|
|
418
|
+
const network = defineTool({
|
|
419
|
+
name: "browser_network",
|
|
420
|
+
description: "List network requests the page made, with status codes and failures.",
|
|
421
|
+
readOnly: true,
|
|
422
|
+
parameters: z.object({
|
|
423
|
+
url_contains: z.string().optional(),
|
|
424
|
+
only_failed: z.boolean().optional(),
|
|
425
|
+
limit: z.number().int().positive().max(200).optional(),
|
|
426
|
+
}),
|
|
427
|
+
principals,
|
|
428
|
+
renderTitle: () => "browser_network",
|
|
429
|
+
async execute(input) {
|
|
430
|
+
const wanted = session.networkEntries().filter((entry) => {
|
|
431
|
+
if (input.url_contains && !entry.url.includes(input.url_contains))
|
|
432
|
+
return false;
|
|
433
|
+
if (input.only_failed && !entry.failed && (entry.status ?? 0) < 400)
|
|
434
|
+
return false;
|
|
435
|
+
return true;
|
|
436
|
+
});
|
|
437
|
+
const shown = wanted.slice(-(input.limit ?? 50));
|
|
438
|
+
if (shown.length === 0)
|
|
439
|
+
return toolText("No matching requests");
|
|
440
|
+
return toolText(shown
|
|
441
|
+
.map((entry) => `${entry.status ?? (entry.failed ? "ERR" : "…")} ${entry.method} ${entry.url}${entry.failed ? ` (${entry.failed})` : ""}`)
|
|
442
|
+
.join("\n")
|
|
443
|
+
.slice(0, 20_000));
|
|
444
|
+
},
|
|
445
|
+
});
|
|
446
|
+
const byName = new Map();
|
|
447
|
+
const batch = defineTool({
|
|
448
|
+
name: "browser_batch",
|
|
449
|
+
description: "Run several browser tools in order in one call, stopping at the first error. Use it whenever the next steps are already known — a click then a type then Enter is one call, not three turns.",
|
|
450
|
+
parameters: z.object({
|
|
451
|
+
actions: z
|
|
452
|
+
.array(z.object({
|
|
453
|
+
tool: z.string().describe('A browser tool name, e.g. "browser_click"'),
|
|
454
|
+
input: z.record(z.string(), z.unknown()).optional(),
|
|
455
|
+
}))
|
|
456
|
+
.min(1)
|
|
457
|
+
.max(20),
|
|
458
|
+
}),
|
|
459
|
+
principals,
|
|
460
|
+
renderTitle: (input) => `browser_batch(${input.actions.map((a) => a.tool.replace("browser_", "")).join(" → ")})`,
|
|
461
|
+
async execute(input, ctx) {
|
|
462
|
+
const out = [];
|
|
463
|
+
for (const [index, action] of input.actions.entries()) {
|
|
464
|
+
const tool = byName.get(action.tool);
|
|
465
|
+
if (!tool || tool.name === "browser_batch") {
|
|
466
|
+
out.push(`${index + 1}. ${action.tool}: not a browser tool`);
|
|
467
|
+
return toolError(out.join("\n"));
|
|
468
|
+
}
|
|
469
|
+
const parsed = tool.validate ? tool.validate(action.input ?? {}) : { ok: true, value: action.input ?? {} };
|
|
470
|
+
if (!parsed.ok) {
|
|
471
|
+
out.push(`${index + 1}. ${action.tool}: ${parsed.error}`);
|
|
472
|
+
return toolError(out.join("\n"));
|
|
473
|
+
}
|
|
474
|
+
const result = await tool.execute(parsed.value, ctx);
|
|
475
|
+
const text = result.content
|
|
476
|
+
.map((block) => (block.type === "text" ? block.text : "[image]"))
|
|
477
|
+
.join(" ");
|
|
478
|
+
out.push(`${index + 1}. ${action.tool}: ${text}`);
|
|
479
|
+
if (result.isError)
|
|
480
|
+
return toolError(out.join("\n"));
|
|
481
|
+
// An image is the one result a batch cannot fold into text, so it is
|
|
482
|
+
// returned whole and the batch ends there rather than dropping it.
|
|
483
|
+
const image = result.content.find((block) => block.type === "image");
|
|
484
|
+
if (image && image.type === "image") {
|
|
485
|
+
return { content: [{ type: "text", text: out.join("\n") }, image] };
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
return toolText(out.join("\n"));
|
|
489
|
+
},
|
|
490
|
+
});
|
|
491
|
+
const tools = [navigate, readPage, find, click, type, formInput, screenshot, evaluate, tabs, consoleTool, network, batch].map(withNotices);
|
|
492
|
+
for (const tool of tools)
|
|
493
|
+
byName.set(tool.name, tool);
|
|
494
|
+
return tools;
|
|
495
|
+
/**
|
|
496
|
+
* Hand the model whatever the session has to tell it — a fallback to the
|
|
497
|
+
* other browser, a choice the settings overruled — with the next result,
|
|
498
|
+
* whichever tool that is. Said once, then dropped.
|
|
499
|
+
*/
|
|
500
|
+
function withNotices(tool) {
|
|
501
|
+
const execute = tool.execute.bind(tool);
|
|
502
|
+
return {
|
|
503
|
+
...tool,
|
|
504
|
+
execute: async (input, ctx) => {
|
|
505
|
+
const result = await execute(input, ctx);
|
|
506
|
+
const notes = session.takeNotices();
|
|
507
|
+
if (notes.length === 0)
|
|
508
|
+
return result;
|
|
509
|
+
return { ...result, content: [...result.content, { type: "text", text: notes.join("\n") }] };
|
|
510
|
+
},
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
async function resolvePoint(input) {
|
|
514
|
+
if (input.ref)
|
|
515
|
+
return session.locate(input.ref);
|
|
516
|
+
if (typeof input.x === "number" && typeof input.y === "number")
|
|
517
|
+
return { x: input.x, y: input.y };
|
|
518
|
+
throw new Error("pass a ref, or both x and y");
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Accept what a person would type.
|
|
523
|
+
*
|
|
524
|
+
* A bare `localhost:3000` or `example.com` is what anybody writes, and treating
|
|
525
|
+
* it as a relative path produces a confusing failure rather than a page.
|
|
526
|
+
*/
|
|
527
|
+
function normalizeUrl(input) {
|
|
528
|
+
if (/^[a-z][a-z0-9+.-]*:/i.test(input))
|
|
529
|
+
return input;
|
|
530
|
+
const local = /^(?:localhost|127(?:\.\d{1,3}){3}|\[::1\])(?::|\/|$)/i.test(input);
|
|
531
|
+
return `${local ? "http" : "https"}://${input}`;
|
|
532
|
+
}
|
|
533
|
+
function truncateTitle(value) {
|
|
534
|
+
const flat = value.replace(/\s+/g, " ").trim();
|
|
535
|
+
return flat.length > 40 ? `${flat.slice(0, 39)}…` : flat;
|
|
536
|
+
}
|
|
537
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/browser/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -16,6 +16,20 @@ export interface HarnessConfig {
|
|
|
16
16
|
model?: string;
|
|
17
17
|
/** Model used for compaction and cheap subagents. */
|
|
18
18
|
smallModel?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Which browser the browser tools drive.
|
|
21
|
+
*
|
|
22
|
+
* `auto` (the default) holds both and lets the model choose per task: the
|
|
23
|
+
* person's own browser when the task needs their accounts or a page they
|
|
24
|
+
* have open, the built-in one otherwise, and the built-in one whenever the
|
|
25
|
+
* person's cannot be reached. `builtin` is only a Chrome the harness starts
|
|
26
|
+
* against its own profile — or, in the desktop app, an offscreen window of
|
|
27
|
+
* its own Chromium. `extension` is only the person's real browser, reached
|
|
28
|
+
* through the OHarness extension. `off` leaves the tools unregistered.
|
|
29
|
+
*/
|
|
30
|
+
browser?: {
|
|
31
|
+
mode?: "auto" | "builtin" | "extension" | "off";
|
|
32
|
+
};
|
|
19
33
|
permissionMode?: PermissionMode;
|
|
20
34
|
permissions?: PermissionRules;
|
|
21
35
|
/**
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAU/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAK3C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|