@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,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 { ComputerError } from "./target.js";
|
|
6
|
+
/**
|
|
7
|
+
* The computer tools.
|
|
8
|
+
*
|
|
9
|
+
* Built against one conversation's session, the way the browser tools are: a
|
|
10
|
+
* ref means nothing without the tree it came from, and the permission prompt
|
|
11
|
+
* has to name the app a call reaches, which is session state rather than an
|
|
12
|
+
* argument.
|
|
13
|
+
*
|
|
14
|
+
* Shaped like the browser tools the model already knows: read a tree of refs,
|
|
15
|
+
* act on a ref, fall back to pixels from a screenshot, chain with a batch.
|
|
16
|
+
*/
|
|
17
|
+
/** Screenshots are sent at most this wide; the frame maps coordinates back. */
|
|
18
|
+
const SHOT_MAX_WIDTH = 1280;
|
|
19
|
+
/** Nodes in one tree read, so a huge window cannot flood the context. */
|
|
20
|
+
const TREE_MAX_NODES = 400;
|
|
21
|
+
const target = {
|
|
22
|
+
app: z.string().optional().describe("App name or id (bundle id on macOS, exe name on Windows). Uses its front window."),
|
|
23
|
+
window: z.string().optional().describe("Window id from computer_list_apps. Omit to use the app's front window, or the last window used."),
|
|
24
|
+
};
|
|
25
|
+
const modifiersParam = z
|
|
26
|
+
.array(z.enum(["cmd", "ctrl", "alt", "option", "shift", "mod", "win"]))
|
|
27
|
+
.optional()
|
|
28
|
+
.describe("Held while acting. `mod` is cmd on macOS and ctrl on Windows.");
|
|
29
|
+
export function createComputerTools(session) {
|
|
30
|
+
/** Every call is approved per app: `Computer(com.apple.Notes)`, `Computer(excel.exe)`. */
|
|
31
|
+
const principals = (input) => {
|
|
32
|
+
const id = session.appIdFor(input);
|
|
33
|
+
return id ? [`Computer(${id})`] : [];
|
|
34
|
+
};
|
|
35
|
+
const listApps = defineTool({
|
|
36
|
+
name: "computer_list_apps",
|
|
37
|
+
description: "List the apps running on the user's computer and their open windows, with window ids and what each app allows (full, click-only, look-only). Start here.",
|
|
38
|
+
parameters: z.object({}),
|
|
39
|
+
// Names and titles only; reading a window's contents is what asks.
|
|
40
|
+
readOnly: true,
|
|
41
|
+
renderTitle: () => "computer_list_apps",
|
|
42
|
+
async execute(_input, ctx) {
|
|
43
|
+
return run(session, ctx, async () => {
|
|
44
|
+
const [apps, windows] = await Promise.all([session.listApps(), session.listWindows()]);
|
|
45
|
+
const lines = [];
|
|
46
|
+
for (const app of apps) {
|
|
47
|
+
const own = windows.filter((w) => w.pid === app.pid);
|
|
48
|
+
if (!own.length && !app.active)
|
|
49
|
+
continue;
|
|
50
|
+
const tier = session.tierOf({ appId: app.id, app: app.name });
|
|
51
|
+
lines.push(`${app.name} (${app.id})${app.active ? " — frontmost" : ""}${tier === "full" ? "" : ` — ${tier === "read" ? "look only" : tier === "click" ? "click only" : "blocked"}`}`);
|
|
52
|
+
for (const w of own) {
|
|
53
|
+
lines.push(` window ${w.id}: ${w.title || "(untitled)"}${w.minimized ? " [minimized]" : w.onScreen === false ? " [not on screen]" : ""}${w.focused ? " [focused]" : ""}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return toolText(lines.join("\n") || "No apps with windows.");
|
|
57
|
+
});
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
const readApp = defineTool({
|
|
61
|
+
name: "computer_read_app",
|
|
62
|
+
description: "Read a window's accessibility tree: its buttons, fields, menus and text, each with a `ref` to act on. Prefer this to a screenshot; it is exact and costs far fewer tokens.",
|
|
63
|
+
parameters: z.object({
|
|
64
|
+
...target,
|
|
65
|
+
depth: z.number().int().min(1).max(40).optional().describe("How deep to walk. Default 25."),
|
|
66
|
+
}),
|
|
67
|
+
// Looking changes nothing, so plan mode allows it; the first look at an
|
|
68
|
+
// app still asks, because a screenshot shows whatever is in it.
|
|
69
|
+
observes: true,
|
|
70
|
+
principals,
|
|
71
|
+
renderTitle: (input) => `computer_read_app(${input.app ?? input.window ?? ""})`,
|
|
72
|
+
async execute(input, ctx) {
|
|
73
|
+
return run(session, ctx, async () => {
|
|
74
|
+
const t = await session.runtime.target();
|
|
75
|
+
const window = await session.resolveWindow(input);
|
|
76
|
+
session.guard(window, "look");
|
|
77
|
+
const tree = await t.axTree({ window: window.id, depth: input.depth ?? 25, maxNodes: TREE_MAX_NODES });
|
|
78
|
+
session.rememberTree(tree.nodes);
|
|
79
|
+
await session.announce({ kind: "look", window: window.id, app: window.app }, t);
|
|
80
|
+
const header = `${window.app} — window ${window.id}: ${window.title || "(untitled)"}`;
|
|
81
|
+
const body = tree.nodes.map(formatNode).join("\n");
|
|
82
|
+
const tail = tree.truncated ? `\n… truncated at ${TREE_MAX_NODES} nodes; read a smaller depth or take a screenshot.` : "";
|
|
83
|
+
return toolText(`${header}\n${body || "(the accessibility tree is empty — take a screenshot instead)"}${tail}`);
|
|
84
|
+
});
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
const screenshot = defineTool({
|
|
88
|
+
name: "computer_screenshot",
|
|
89
|
+
description: "Take a screenshot of one window (default) or a whole display. Returns the image; x/y in other tools are pixels in the latest screenshot of that window.",
|
|
90
|
+
parameters: z.object({
|
|
91
|
+
...target,
|
|
92
|
+
display: z.string().optional().describe("A display id, to capture a whole screen instead of a window."),
|
|
93
|
+
}),
|
|
94
|
+
// Looking changes nothing, so plan mode allows it; the first look at an
|
|
95
|
+
// app still asks, because a screenshot shows whatever is in it.
|
|
96
|
+
observes: true,
|
|
97
|
+
principals,
|
|
98
|
+
renderTitle: (input) => `computer_screenshot(${input.app ?? input.window ?? input.display ?? ""})`,
|
|
99
|
+
async execute(input, ctx) {
|
|
100
|
+
return run(session, ctx, async () => {
|
|
101
|
+
const t = await session.runtime.target();
|
|
102
|
+
if (input.display) {
|
|
103
|
+
const shot = await t.screenshot({ display: input.display, maxWidth: SHOT_MAX_WIDTH });
|
|
104
|
+
session.rememberShot(`display:${input.display}`, shot);
|
|
105
|
+
return toolImage(shot.mimeType ?? "image/jpeg", shot.data, `Display ${input.display}, ${shot.width}x${shot.height}.`);
|
|
106
|
+
}
|
|
107
|
+
const window = await session.resolveWindow(input);
|
|
108
|
+
session.guard(window, "look");
|
|
109
|
+
const shot = await t.screenshot({ window: window.id, maxWidth: SHOT_MAX_WIDTH });
|
|
110
|
+
session.rememberShot(window.id, shot);
|
|
111
|
+
await session.announce({ kind: "look", window: window.id, app: window.app }, t);
|
|
112
|
+
session.sawWindow(window.id);
|
|
113
|
+
return toolImage(shot.mimeType ?? "image/jpeg", shot.data, `${window.app} — window ${window.id}, ${shot.width}x${shot.height} px.`);
|
|
114
|
+
});
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
const clickParams = z.object({
|
|
118
|
+
...target,
|
|
119
|
+
ref: z.string().optional().describe("Element ref from computer_read_app. Preferred: works without moving the cursor."),
|
|
120
|
+
x: z.number().optional().describe("Pixel x in the latest screenshot of the window."),
|
|
121
|
+
y: z.number().optional(),
|
|
122
|
+
button: z.enum(["left", "right", "middle"]).optional(),
|
|
123
|
+
double: z.boolean().optional(),
|
|
124
|
+
modifiers: modifiersParam,
|
|
125
|
+
});
|
|
126
|
+
const click = defineTool({
|
|
127
|
+
name: "computer_click",
|
|
128
|
+
description: "Click an element by ref, or a point by x/y from a screenshot. Right-click opens a context menu.",
|
|
129
|
+
parameters: clickParams,
|
|
130
|
+
principals,
|
|
131
|
+
renderTitle: (input) => `computer_click(${input.ref ?? `${input.x},${input.y}`})`,
|
|
132
|
+
async execute(input, ctx) {
|
|
133
|
+
return run(session, ctx, () => doClick(session, input, ctx));
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
const typeText = defineTool({
|
|
137
|
+
name: "computer_type",
|
|
138
|
+
description: "Type text. With a ref, into that field (set `replace` to overwrite its value, which works in the background); without, into whatever has focus in the window.",
|
|
139
|
+
parameters: z.object({
|
|
140
|
+
...target,
|
|
141
|
+
text: z.string(),
|
|
142
|
+
ref: z.string().optional(),
|
|
143
|
+
replace: z.boolean().optional().describe("Replace the field's value instead of typing at the caret."),
|
|
144
|
+
}),
|
|
145
|
+
principals,
|
|
146
|
+
renderTitle: (input) => `computer_type(${input.ref ?? input.app ?? ""})`,
|
|
147
|
+
async execute(input, ctx) {
|
|
148
|
+
return run(session, ctx, () => doType(session, input, ctx));
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
const key = defineTool({
|
|
152
|
+
name: "computer_key",
|
|
153
|
+
description: 'Press a key or chord, e.g. "Enter", "Escape", "Tab", "mod+s", "cmd+shift+t", "ctrl+c".',
|
|
154
|
+
parameters: z.object({ ...target, key: z.string() }),
|
|
155
|
+
principals,
|
|
156
|
+
renderTitle: (input) => `computer_key(${input.key})`,
|
|
157
|
+
async execute(input, ctx) {
|
|
158
|
+
return run(session, ctx, () => doKey(session, input, ctx));
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
const scroll = defineTool({
|
|
162
|
+
name: "computer_scroll",
|
|
163
|
+
description: "Scroll inside a window, at a ref or a screenshot point. dy > 0 scrolls down.",
|
|
164
|
+
parameters: z.object({
|
|
165
|
+
...target,
|
|
166
|
+
ref: z.string().optional(),
|
|
167
|
+
x: z.number().optional(),
|
|
168
|
+
y: z.number().optional(),
|
|
169
|
+
dx: z.number().optional(),
|
|
170
|
+
dy: z.number().optional(),
|
|
171
|
+
}),
|
|
172
|
+
principals,
|
|
173
|
+
renderTitle: (input) => `computer_scroll(${input.dy ?? 0})`,
|
|
174
|
+
async execute(input, ctx) {
|
|
175
|
+
return run(session, ctx, () => doScroll(session, input, ctx));
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
const drag = defineTool({
|
|
179
|
+
name: "computer_drag",
|
|
180
|
+
description: "Drag from one screenshot point to another. Usually needs computer_take_control first.",
|
|
181
|
+
parameters: z.object({
|
|
182
|
+
...target,
|
|
183
|
+
from: z.object({ x: z.number(), y: z.number() }),
|
|
184
|
+
to: z.object({ x: z.number(), y: z.number() }),
|
|
185
|
+
modifiers: modifiersParam,
|
|
186
|
+
}),
|
|
187
|
+
principals,
|
|
188
|
+
renderTitle: () => "computer_drag",
|
|
189
|
+
async execute(input, ctx) {
|
|
190
|
+
return run(session, ctx, () => doDrag(session, input, ctx));
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
const menu = defineTool({
|
|
194
|
+
name: "computer_menu",
|
|
195
|
+
description: 'Choose an item from the app\'s menu bar by its path, e.g. ["File", "New Note"] or ["Format", "Font", "Bold"]. Runs in the background through accessibility — prefer it to the item\'s keyboard shortcut, which needs the real keyboard when the app has more than one window.',
|
|
196
|
+
parameters: z.object({
|
|
197
|
+
...target,
|
|
198
|
+
path: z.array(z.string().min(1)).min(1).max(16).describe('Menu titles from the menu bar down, as the app shows them, e.g. ["File", "New Note"].'),
|
|
199
|
+
}),
|
|
200
|
+
principals,
|
|
201
|
+
renderTitle: (input) => `computer_menu(${input.path.join(" › ")})`,
|
|
202
|
+
async execute(input, ctx) {
|
|
203
|
+
return run(session, ctx, async () => {
|
|
204
|
+
const t = await session.runtime.target();
|
|
205
|
+
if (!t.invokeMenu) {
|
|
206
|
+
return toolError("Menus cannot be chosen directly on this machine; use the item's keyboard shortcut with computer_key.");
|
|
207
|
+
}
|
|
208
|
+
const window = await session.resolveWindow(input);
|
|
209
|
+
session.guard(window, "click");
|
|
210
|
+
await session.respectUser(window, t);
|
|
211
|
+
await session.announce({ kind: "click", window: window.id, app: window.app }, t);
|
|
212
|
+
await t.invokeMenu(window.id, input.path);
|
|
213
|
+
return toolText(`Chose ${input.path.join(" › ")} in ${window.app}.`);
|
|
214
|
+
});
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
const openApp = defineTool({
|
|
218
|
+
name: "computer_open_app",
|
|
219
|
+
description: "Launch an app, or bring it up if it is running, by name or id.",
|
|
220
|
+
parameters: z.object({ app: z.string() }),
|
|
221
|
+
principals,
|
|
222
|
+
renderTitle: (input) => `computer_open_app(${input.app})`,
|
|
223
|
+
async execute(input, ctx) {
|
|
224
|
+
return run(session, ctx, async () => {
|
|
225
|
+
const t = await session.runtime.target();
|
|
226
|
+
await t.open(input.app);
|
|
227
|
+
// Give it a moment to put a window up, then report what came up.
|
|
228
|
+
for (let i = 0; i < 20; i++) {
|
|
229
|
+
try {
|
|
230
|
+
const window = await session.resolveWindow({ app: input.app });
|
|
231
|
+
session.guard(window, "look");
|
|
232
|
+
await session.announce({ kind: "look", window: window.id, app: window.app }, t);
|
|
233
|
+
return toolText(`${window.app} is open — window ${window.id}: ${window.title || "(untitled)"}.`);
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
if (err instanceof ComputerError && err.code === "refused")
|
|
237
|
+
throw err;
|
|
238
|
+
await sleep(250, ctx.signal);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return toolText(`Asked ${input.app} to open; no window has appeared yet. Call computer_list_apps shortly.`);
|
|
242
|
+
});
|
|
243
|
+
},
|
|
244
|
+
});
|
|
245
|
+
const takeControl = defineTool({
|
|
246
|
+
name: "computer_take_control",
|
|
247
|
+
description: "Take the real mouse and keyboard, for actions that cannot run in the background. The user is shown that you are in control and can take it back at any time. Keep it short: do the whole sequence in one computer_batch, then call computer_release_control.",
|
|
248
|
+
parameters: z.object({ reason: z.string().describe("One line the user sees, e.g. 'Drag the file into the upload area'.") }),
|
|
249
|
+
principals: () => ["ComputerTakeover"],
|
|
250
|
+
renderTitle: (input) => `computer_take_control(${input.reason})`,
|
|
251
|
+
async execute(input, ctx) {
|
|
252
|
+
return run(session, ctx, async () => {
|
|
253
|
+
if (session.runtime.takeover() === "never") {
|
|
254
|
+
return toolError("Taking over the mouse and keyboard is turned off in Settings › Computer use. Stay with background actions, or ask the user to do this step.");
|
|
255
|
+
}
|
|
256
|
+
const t = await session.runtime.target();
|
|
257
|
+
await session.runtime.arbiter.takeControl(session.holder(), ctx.signal, (holder) => ctx.onProgress({ toolCallId: ctx.toolCallId, toolName: "computer_take_control", message: `Waiting for "${holder.label}" to release the computer…` }));
|
|
258
|
+
const front = await t.frontmost().catch(() => undefined);
|
|
259
|
+
if (front)
|
|
260
|
+
ctx.host.state.set(PREVIOUS_FRONT, front.pid);
|
|
261
|
+
await session.announce({ kind: "control", app: input.reason });
|
|
262
|
+
return toolText("You have control of the mouse and keyboard. Act now, then call computer_release_control. If the user moves the mouse or presses a key, control returns to them and your action stops.");
|
|
263
|
+
});
|
|
264
|
+
},
|
|
265
|
+
});
|
|
266
|
+
const releaseControl = defineTool({
|
|
267
|
+
name: "computer_release_control",
|
|
268
|
+
description: "Give the mouse and keyboard back to the user and return focus to where they were.",
|
|
269
|
+
parameters: z.object({}),
|
|
270
|
+
sessionLocal: true,
|
|
271
|
+
renderTitle: () => "computer_release_control",
|
|
272
|
+
async execute(_input, ctx) {
|
|
273
|
+
return run(session, ctx, async () => {
|
|
274
|
+
const released = session.runtime.arbiter.releaseControl(session.id);
|
|
275
|
+
const previous = ctx.host.state.get(PREVIOUS_FRONT);
|
|
276
|
+
ctx.host.state.delete(PREVIOUS_FRONT);
|
|
277
|
+
if (released && typeof previous === "number") {
|
|
278
|
+
await (await session.runtime.target()).activate(previous).catch(() => { });
|
|
279
|
+
}
|
|
280
|
+
await session.announce({ kind: "release" });
|
|
281
|
+
return toolText(released ? "Control returned to the user." : "You did not have control.");
|
|
282
|
+
});
|
|
283
|
+
},
|
|
284
|
+
});
|
|
285
|
+
const single = {
|
|
286
|
+
click: (input, ctx) => doClick(session, input, ctx).then(textOf),
|
|
287
|
+
type: (input, ctx) => doType(session, input, ctx).then(textOf),
|
|
288
|
+
key: (input, ctx) => doKey(session, input, ctx).then(textOf),
|
|
289
|
+
scroll: (input, ctx) => doScroll(session, input, ctx).then(textOf),
|
|
290
|
+
drag: (input, ctx) => doDrag(session, input, ctx).then(textOf),
|
|
291
|
+
wait: async (input, ctx) => {
|
|
292
|
+
await sleep(Math.min(5_000, input.ms ?? 500), ctx.signal);
|
|
293
|
+
return "waited";
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
/**
|
|
297
|
+
* Each action in a batch, with the fields its single tool takes — spelled
|
|
298
|
+
* out, so the model is shown that a key action needs its `key`. It used to
|
|
299
|
+
* be {action, ...anything}: `{"action":"key"}` went through, and failed
|
|
300
|
+
* deep inside as "Cannot read properties of undefined (reading 'split')",
|
|
301
|
+
* an error nobody could act on.
|
|
302
|
+
*/
|
|
303
|
+
const point = { x: z.number(), y: z.number() };
|
|
304
|
+
const batchAction = z.discriminatedUnion("action", [
|
|
305
|
+
z.object({
|
|
306
|
+
action: z.literal("click"),
|
|
307
|
+
ref: z.string().optional().describe("Element ref from computer_read_app."),
|
|
308
|
+
x: z.number().optional().describe("Pixel x in the latest screenshot of the window."),
|
|
309
|
+
y: z.number().optional(),
|
|
310
|
+
button: z.enum(["left", "right", "middle"]).optional(),
|
|
311
|
+
double: z.boolean().optional(),
|
|
312
|
+
modifiers: modifiersParam,
|
|
313
|
+
}),
|
|
314
|
+
z.object({
|
|
315
|
+
action: z.literal("type"),
|
|
316
|
+
text: z.string(),
|
|
317
|
+
ref: z.string().optional(),
|
|
318
|
+
replace: z.boolean().optional(),
|
|
319
|
+
}),
|
|
320
|
+
z.object({
|
|
321
|
+
action: z.literal("key"),
|
|
322
|
+
key: z.string().min(1).describe('The key or chord, e.g. "Enter", "Tab", "mod+n", "cmd+shift+t".'),
|
|
323
|
+
}),
|
|
324
|
+
z.object({
|
|
325
|
+
action: z.literal("scroll"),
|
|
326
|
+
ref: z.string().optional(),
|
|
327
|
+
x: z.number().optional(),
|
|
328
|
+
y: z.number().optional(),
|
|
329
|
+
dx: z.number().optional(),
|
|
330
|
+
dy: z.number().optional(),
|
|
331
|
+
}),
|
|
332
|
+
z.object({ action: z.literal("drag"), from: z.object(point), to: z.object(point), modifiers: modifiersParam }),
|
|
333
|
+
z.object({ action: z.literal("wait"), ms: z.number().int().min(0).max(5_000).optional() }),
|
|
334
|
+
]);
|
|
335
|
+
const batch = defineTool({
|
|
336
|
+
name: "computer_batch",
|
|
337
|
+
description: 'Run several actions in one window, in order, stopping at the first failure. Each action is one of: {action:"click", ref | x,y, button?, double?, modifiers?}, {action:"type", text, ref?, replace?}, {action:"key", key}, {action:"scroll", ref | x,y, dx?, dy?}, {action:"drag", from:{x,y}, to:{x,y}}, {action:"wait", ms?}. All actions use the batch\'s app/window.',
|
|
338
|
+
parameters: z.object({
|
|
339
|
+
...target,
|
|
340
|
+
actions: z.array(batchAction).min(1).max(30),
|
|
341
|
+
}),
|
|
342
|
+
// One app per batch: a batch naming one approved app must not smuggle in
|
|
343
|
+
// an action on another, since any matching principal allows the call.
|
|
344
|
+
principals: (input) => principals(input),
|
|
345
|
+
renderTitle: (input) => `computer_batch(${input.actions.length} actions)`,
|
|
346
|
+
async execute(input, ctx) {
|
|
347
|
+
return run(session, ctx, async () => {
|
|
348
|
+
const window = await session.resolveWindow(input);
|
|
349
|
+
const out = [];
|
|
350
|
+
for (const [i, raw] of input.actions.entries()) {
|
|
351
|
+
const { action, ...rest } = raw;
|
|
352
|
+
if (typeof rest["ref"] === "string" && rest["ref"] !== "" && !String(rest["ref"]).startsWith(`w${window.id}.`)) {
|
|
353
|
+
out.push(`${i + 1}. ${action}: refused — ref ${String(rest["ref"])} is not in this batch's window`);
|
|
354
|
+
break;
|
|
355
|
+
}
|
|
356
|
+
try {
|
|
357
|
+
out.push(`${i + 1}. ${action}: ${await single[action]({ ...rest, window: window.id }, ctx)}`);
|
|
358
|
+
}
|
|
359
|
+
catch (err) {
|
|
360
|
+
out.push(`${i + 1}. ${action}: failed — ${errorMessage(err)}`);
|
|
361
|
+
return toolError(out.join("\n"));
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return toolText(out.join("\n"));
|
|
365
|
+
});
|
|
366
|
+
},
|
|
367
|
+
});
|
|
368
|
+
return [listApps, readApp, screenshot, click, typeText, key, menu, scroll, drag, openApp, takeControl, releaseControl, batch];
|
|
369
|
+
}
|
|
370
|
+
const PREVIOUS_FRONT = "computer:previousFront";
|
|
371
|
+
async function doClick(session, input, _ctx) {
|
|
372
|
+
const t = await session.runtime.target();
|
|
373
|
+
const window = await session.resolveWindow(input);
|
|
374
|
+
session.guard(window, "click");
|
|
375
|
+
await session.respectUser(window, t);
|
|
376
|
+
const foreground = session.runtime.arbiter.holdsControl(session.id);
|
|
377
|
+
if (input.ref && !input.modifiers?.length && !input.double && (input.button ?? "left") !== "middle") {
|
|
378
|
+
const frame = session.frameOf(input.ref);
|
|
379
|
+
await session.announce({ kind: "click", window: window.id, app: window.app, ...(frame ? { frame, point: centre(frame) } : {}) }, t);
|
|
380
|
+
try {
|
|
381
|
+
await t.axAction(input.ref, input.button === "right" ? "showMenu" : "press");
|
|
382
|
+
return toolText(`Clicked ${input.ref} in ${window.app}.`);
|
|
383
|
+
}
|
|
384
|
+
catch (err) {
|
|
385
|
+
// An element with no press action still has a place on screen.
|
|
386
|
+
if (!(err instanceof ComputerError) || err.code !== "unsupported" || !frame)
|
|
387
|
+
throw err;
|
|
388
|
+
const point = centre(frame);
|
|
389
|
+
await t.input({ type: "click", ...point, button: input.button ?? "left" }, { window: window.id, foreground });
|
|
390
|
+
return toolText(`Clicked ${input.ref} in ${window.app} (by position).`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
const point = input.ref ? refPoint(session, input.ref) : pointFrom(session, window, input);
|
|
394
|
+
await session.announce({ kind: "click", window: window.id, app: window.app, point }, t);
|
|
395
|
+
await t.input({ type: "click", ...point, button: input.button ?? "left", count: input.double ? 2 : 1, ...(input.modifiers ? { modifiers: input.modifiers } : {}) }, { window: window.id, foreground });
|
|
396
|
+
return toolText(`Clicked in ${window.app}.`);
|
|
397
|
+
}
|
|
398
|
+
async function doType(session, input, ctx) {
|
|
399
|
+
const t = await session.runtime.target();
|
|
400
|
+
const window = await session.resolveWindow(input);
|
|
401
|
+
session.guard(window, "type");
|
|
402
|
+
if (input.ref && session.isSecure(input.ref)) {
|
|
403
|
+
throw new ComputerError("refused", "That is a password field. Ask the user to type it themselves.");
|
|
404
|
+
}
|
|
405
|
+
await session.respectUser(window, t);
|
|
406
|
+
const frame = input.ref ? session.frameOf(input.ref) : undefined;
|
|
407
|
+
await session.announce({ kind: "type", window: window.id, app: window.app, ...(frame ? { frame, point: centre(frame) } : {}) }, t);
|
|
408
|
+
if (input.ref && input.replace) {
|
|
409
|
+
await t.axAction(input.ref, "setValue", input.text);
|
|
410
|
+
return toolText(`Set the value of ${input.ref}.`);
|
|
411
|
+
}
|
|
412
|
+
if (input.ref)
|
|
413
|
+
await t.axAction(input.ref, "focus").catch(() => { });
|
|
414
|
+
await session.waitForQuiet(t, ctx.signal);
|
|
415
|
+
await t.input({ type: "text", text: input.text }, { window: window.id, foreground: session.runtime.arbiter.holdsControl(session.id) });
|
|
416
|
+
return toolText(`Typed ${input.text.length} characters into ${window.app}.`);
|
|
417
|
+
}
|
|
418
|
+
async function doKey(session, input, ctx) {
|
|
419
|
+
const t = await session.runtime.target();
|
|
420
|
+
const window = await session.resolveWindow(input);
|
|
421
|
+
session.guard(window, "type");
|
|
422
|
+
await session.respectUser(window, t);
|
|
423
|
+
if (typeof input.key !== "string" || !input.key.trim()) {
|
|
424
|
+
throw new ComputerError("refused", 'Say which key: {key: "Enter"}, {key: "mod+n"}.');
|
|
425
|
+
}
|
|
426
|
+
const { key, modifiers } = parseChord(input.key, (await session.runtime.info()).platform);
|
|
427
|
+
await session.announce({ kind: "key", window: window.id, app: window.app }, t);
|
|
428
|
+
await session.waitForQuiet(t, ctx.signal);
|
|
429
|
+
await t.input({ type: "key", key, modifiers }, { window: window.id, foreground: session.runtime.arbiter.holdsControl(session.id) });
|
|
430
|
+
return toolText(`Pressed ${input.key} in ${window.app}.`);
|
|
431
|
+
}
|
|
432
|
+
async function doScroll(session, input, _ctx) {
|
|
433
|
+
const t = await session.runtime.target();
|
|
434
|
+
const window = await session.resolveWindow(input);
|
|
435
|
+
session.guard(window, "click");
|
|
436
|
+
await session.respectUser(window, t);
|
|
437
|
+
const point = input.ref
|
|
438
|
+
? refPoint(session, input.ref)
|
|
439
|
+
: input.x !== undefined && input.y !== undefined
|
|
440
|
+
? session.toScreen(window, input.x, input.y)
|
|
441
|
+
: centre(window.frame);
|
|
442
|
+
await session.announce({ kind: "scroll", window: window.id, app: window.app, point }, t);
|
|
443
|
+
await t.input({ type: "scroll", ...point, dx: input.dx ?? 0, dy: input.dy ?? 0 }, { window: window.id, foreground: session.runtime.arbiter.holdsControl(session.id) });
|
|
444
|
+
return toolText(`Scrolled in ${window.app}.`);
|
|
445
|
+
}
|
|
446
|
+
async function doDrag(session, input, _ctx) {
|
|
447
|
+
const t = await session.runtime.target();
|
|
448
|
+
const window = await session.resolveWindow(input);
|
|
449
|
+
session.guard(window, "click");
|
|
450
|
+
await session.respectUser(window, t);
|
|
451
|
+
const from = session.toScreen(window, input.from.x, input.from.y);
|
|
452
|
+
const to = session.toScreen(window, input.to.x, input.to.y);
|
|
453
|
+
await session.announce({ kind: "drag", window: window.id, app: window.app, point: to }, t);
|
|
454
|
+
await t.input({ type: "drag", from, to, ...(input.modifiers ? { modifiers: input.modifiers } : {}) }, { window: window.id, foreground: session.runtime.arbiter.holdsControl(session.id) });
|
|
455
|
+
return toolText(`Dragged in ${window.app}.`);
|
|
456
|
+
}
|
|
457
|
+
// ---- helpers ---------------------------------------------------------------
|
|
458
|
+
function pointFrom(session, window, input) {
|
|
459
|
+
if (input.x === undefined || input.y === undefined) {
|
|
460
|
+
throw new ComputerError("refused", "Pass a ref from computer_read_app, or x and y from a screenshot.");
|
|
461
|
+
}
|
|
462
|
+
return session.toScreen(window, input.x, input.y);
|
|
463
|
+
}
|
|
464
|
+
function refPoint(session, ref) {
|
|
465
|
+
const frame = session.frameOf(ref);
|
|
466
|
+
if (!frame)
|
|
467
|
+
throw new ComputerError("stale_ref", `Unknown ref ${ref}. Read the window again with computer_read_app.`);
|
|
468
|
+
return centre(frame);
|
|
469
|
+
}
|
|
470
|
+
function centre(frame) {
|
|
471
|
+
return { x: frame.x + frame.w / 2, y: frame.y + frame.h / 2 };
|
|
472
|
+
}
|
|
473
|
+
/** `mod+shift+s` → key "s" with the platform's command key and shift. */
|
|
474
|
+
export function parseChord(chord, platform) {
|
|
475
|
+
const parts = chord.split("+").map((p) => p.trim()).filter(Boolean);
|
|
476
|
+
const key = parts.pop() ?? chord;
|
|
477
|
+
const modifiers = parts.map((m) => {
|
|
478
|
+
const lower = m.toLowerCase();
|
|
479
|
+
if (lower === "mod")
|
|
480
|
+
return platform === "darwin" ? "cmd" : "ctrl";
|
|
481
|
+
if (lower === "option")
|
|
482
|
+
return "alt";
|
|
483
|
+
if (lower === "control")
|
|
484
|
+
return "ctrl";
|
|
485
|
+
if (lower === "command" || lower === "meta")
|
|
486
|
+
return platform === "darwin" ? "cmd" : "win";
|
|
487
|
+
return lower;
|
|
488
|
+
});
|
|
489
|
+
return { key, modifiers };
|
|
490
|
+
}
|
|
491
|
+
function formatNode(node) {
|
|
492
|
+
const indent = " ".repeat(Math.max(0, node.depth));
|
|
493
|
+
const name = node.name ? ` "${node.name.slice(0, 120)}"` : "";
|
|
494
|
+
const value = node.secure ? " = •••" : node.value ? ` = "${node.value.slice(0, 200)}"` : "";
|
|
495
|
+
const flags = node.disabled ? " (disabled)" : "";
|
|
496
|
+
return `${indent}[${node.ref}] ${node.role}${name}${value}${flags}`;
|
|
497
|
+
}
|
|
498
|
+
function textOf(result) {
|
|
499
|
+
return result.content.map((b) => (b.type === "text" ? b.text : "")).join(" ");
|
|
500
|
+
}
|
|
501
|
+
function sleep(ms, signal) {
|
|
502
|
+
return new Promise((resolve) => {
|
|
503
|
+
const timer = setTimeout(resolve, ms);
|
|
504
|
+
signal?.addEventListener("abort", () => {
|
|
505
|
+
clearTimeout(timer);
|
|
506
|
+
resolve();
|
|
507
|
+
}, { once: true });
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Turn failures into answers the model can act on.
|
|
512
|
+
*
|
|
513
|
+
* A refusal from the policy, the arbiter or the helper becomes a plain
|
|
514
|
+
* sentence; anything else is a crash, and the helper is restarted on the
|
|
515
|
+
* next call rather than left half-alive.
|
|
516
|
+
*/
|
|
517
|
+
async function run(session, ctx, fn) {
|
|
518
|
+
try {
|
|
519
|
+
return await fn();
|
|
520
|
+
}
|
|
521
|
+
catch (err) {
|
|
522
|
+
if (err instanceof ComputerError) {
|
|
523
|
+
if (err.code === "permission") {
|
|
524
|
+
const what = err.grant === "screen" ? "Screen Recording" : "Accessibility";
|
|
525
|
+
return toolError(`${what} permission is not granted to OHarness. Ask the user to allow it; the app shows them how. (${err.message})`);
|
|
526
|
+
}
|
|
527
|
+
if (err.code === "needs_foreground") {
|
|
528
|
+
return toolError(`${err.message} This action needs the real mouse and keyboard: call computer_take_control, act, then computer_release_control.`);
|
|
529
|
+
}
|
|
530
|
+
return toolError(err.message);
|
|
531
|
+
}
|
|
532
|
+
ctx.logger.warn("computer tool failed", { error: errorMessage(err) });
|
|
533
|
+
session.runtime.reset();
|
|
534
|
+
return toolError(`The computer helper failed: ${errorMessage(err)}`);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/computer/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/core/tokens.js
CHANGED
|
@@ -21,6 +21,10 @@ export function estimateBlockTokens(block) {
|
|
|
21
21
|
return estimateStringTokens(block.thinking);
|
|
22
22
|
case "image":
|
|
23
23
|
return IMAGE_TOKENS;
|
|
24
|
+
case "document":
|
|
25
|
+
// A PDF is read page by page, text and a picture of each page, so its
|
|
26
|
+
// size is a fair proxy: ~1.5k tokens a page at ~70 kB a page.
|
|
27
|
+
return Math.max(IMAGE_TOKENS, Math.ceil((block.data.length * 0.75) / 50));
|
|
24
28
|
case "tool_call":
|
|
25
29
|
return MESSAGE_OVERHEAD + estimateStringTokens(block.name) + estimateJsonTokens(block.input);
|
|
26
30
|
case "tool_result":
|
package/dist/core/tokens.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/core/tokens.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,eAAe,GAAG,GAAG,CAAC;AAC5B,mEAAmE;AACnE,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,YAAY,GAAG,KAAK,CAAC;AAE3B,MAAM,UAAU,oBAAoB,CAAC,CAAS;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAmB;IACrD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1C,KAAK,UAAU;YACb,OAAO,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9C,KAAK,OAAO;YACV,OAAO,YAAY,CAAC;QACtB,KAAK,WAAW;YACd,OAAO,gBAAgB,GAAG,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/F,KAAK,aAAa;YAChB,OAAO,CACL,gBAAgB;gBAChB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAClE,CAAC;IACN,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,CAAC;QACH,OAAO,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO,CACL,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CACvF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAmB;IACxD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAmB;IACrD,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CACT,GAAG;QACH,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5B,oBAAoB,CAAC,CAAC,CAAC,WAAW,CAAC;QACnC,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,EACnC,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAIrC;IACC,OAAO,CACL,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,sBAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC;QACtC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACrD,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/core/tokens.ts"],"names":[],"mappings":"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"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -26,6 +26,21 @@ export interface ImageBlock {
|
|
|
26
26
|
/** base64, no data: prefix */
|
|
27
27
|
data: string;
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* A file the person attached, sent to the model whole: a PDF it reads page by
|
|
31
|
+
* page. Only on a user message, and only to a model whose spec says it reads
|
|
32
|
+
* documents (`supportsDocuments`); anything else is saved for the agent to
|
|
33
|
+
* open with its tools instead (see the server's buildMessage).
|
|
34
|
+
*/
|
|
35
|
+
export interface DocumentBlock {
|
|
36
|
+
type: "document";
|
|
37
|
+
/** e.g. "application/pdf" */
|
|
38
|
+
mimeType: string;
|
|
39
|
+
/** base64, no data: prefix */
|
|
40
|
+
data: string;
|
|
41
|
+
/** The file's name, which the model is shown as the document's title. */
|
|
42
|
+
name?: string;
|
|
43
|
+
}
|
|
29
44
|
export interface ToolCallBlock {
|
|
30
45
|
type: "tool_call";
|
|
31
46
|
/** Harness-owned id. Stable across providers for a given session. */
|
|
@@ -44,7 +59,7 @@ export interface ToolResultBlock {
|
|
|
44
59
|
content: Array<TextBlock | ImageBlock>;
|
|
45
60
|
isError?: boolean;
|
|
46
61
|
}
|
|
47
|
-
export type ContentBlock = TextBlock | ThinkingBlock | ImageBlock | ToolCallBlock | ToolResultBlock;
|
|
62
|
+
export type ContentBlock = TextBlock | ThinkingBlock | ImageBlock | DocumentBlock | ToolCallBlock | ToolResultBlock;
|
|
48
63
|
export interface Message {
|
|
49
64
|
role: Role;
|
|
50
65
|
content: ContentBlock[];
|