@pcamarajr/scout 0.11.1 → 0.12.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/cli.js +3 -3
- package/dist/cli.js.map +1 -1
- package/dist/config.js +5 -5
- package/dist/config.js.map +1 -1
- package/dist/engine.js +2 -2
- package/dist/engine.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.js +17 -17
- package/dist/mcp/server.js.map +1 -1
- package/dist/report.d.ts +14 -3
- package/dist/report.js +22 -2
- package/dist/report.js.map +1 -1
- package/dist/runner/agent-tools.d.ts +4 -4
- package/dist/runner/agent-tools.js +127 -58
- package/dist/runner/agent-tools.js.map +1 -1
- package/dist/runner/ai-runner.js +32 -31
- package/dist/runner/ai-runner.js.map +1 -1
- package/dist/runner/browser.d.ts +36 -5
- package/dist/runner/browser.js +100 -28
- package/dist/runner/browser.js.map +1 -1
- package/dist/runner/engines/types.js +5 -5
- package/dist/runner/engines/types.js.map +1 -1
- package/dist/runner/network-match.js +0 -0
- package/dist/runner/network-match.js.map +1 -1
- package/dist/runner/script-runner.js +21 -16
- package/dist/runner/script-runner.js.map +1 -1
- package/dist/runner/video.d.ts +1 -1
- package/dist/runner/video.js +6 -6
- package/dist/runner/video.js.map +1 -1
- package/dist/types.d.ts +18 -0
- package/dist/viewports.d.ts +9 -3
- package/dist/viewports.js.map +1 -1
- package/package.json +1 -1
|
@@ -3,14 +3,14 @@ import { resolveEnvValue } from "./browser.js";
|
|
|
3
3
|
import { relativizeUrl } from "./engines/types.js";
|
|
4
4
|
const ok = (text) => ({ text });
|
|
5
5
|
const fail = (error) => ({
|
|
6
|
-
text: `
|
|
6
|
+
text: `ERROR: ${error instanceof Error ? error.message : String(error)}`,
|
|
7
7
|
isError: true,
|
|
8
8
|
});
|
|
9
9
|
/**
|
|
10
|
-
* Builds the browser tools + scout_verdict as engine-neutral definitions.
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
10
|
+
* Builds the browser tools + scout_verdict as engine-neutral definitions. Each
|
|
11
|
+
* tool wraps a BrowserSession action, records the deterministic Step it produced
|
|
12
|
+
* (via `record`), and returns an updated page snapshot so the agent can decide
|
|
13
|
+
* its next move; scout_verdict writes the run's verdict through `setVerdict`.
|
|
14
14
|
*/
|
|
15
15
|
export function createScoutTools(ctx) {
|
|
16
16
|
const { session, config, record, setVerdict } = ctx;
|
|
@@ -25,7 +25,7 @@ export function createScoutTools(ctx) {
|
|
|
25
25
|
handler: (args) => handler(schema.parse(args)),
|
|
26
26
|
});
|
|
27
27
|
return [
|
|
28
|
-
define("browser_navigate", "
|
|
28
|
+
define("browser_navigate", "Navigates to a URL (absolute or relative to the app's baseUrl). For tokens/secrets in the URL use the placeholder $ENV:VAR_NAME — resolved at runtime, never passes through you.", z.object({ url: z.string().describe("E.g. /login, /renew?token=$ENV:TOKEN or https://...") }), async ({ url }) => {
|
|
29
29
|
try {
|
|
30
30
|
await session.navigate(url);
|
|
31
31
|
record({ kind: "navigate", url: relativizeUrl(url, config.baseUrl) });
|
|
@@ -35,7 +35,7 @@ export function createScoutTools(ctx) {
|
|
|
35
35
|
return fail(e);
|
|
36
36
|
}
|
|
37
37
|
}),
|
|
38
|
-
define("browser_snapshot", "
|
|
38
|
+
define("browser_snapshot", "Returns the current page state: URL, title, numbered interactive elements [ref] and visible text. Use it whenever you need to decide the next action.", z.object({}), async () => {
|
|
39
39
|
try {
|
|
40
40
|
return ok(await afterAction());
|
|
41
41
|
}
|
|
@@ -43,59 +43,59 @@ export function createScoutTools(ctx) {
|
|
|
43
43
|
return fail(e);
|
|
44
44
|
}
|
|
45
45
|
}),
|
|
46
|
-
define("browser_click", "
|
|
46
|
+
define("browser_click", "Clicks the element identified by the [ref] from the last snapshot.", z.object({ ref: z.number().int().describe("Numeric ref from the snapshot") }), async ({ ref }) => {
|
|
47
47
|
try {
|
|
48
48
|
const before = session.tabCount();
|
|
49
49
|
const target = await session.click(ref);
|
|
50
50
|
record({ kind: "click", target });
|
|
51
51
|
const opened = session.tabCount() > before
|
|
52
|
-
? "\n\n⚠️
|
|
52
|
+
? "\n\n⚠️ A new tab was opened by this click. Use browser_switch_tab to interact with it before continuing."
|
|
53
53
|
: "";
|
|
54
|
-
return ok(`
|
|
54
|
+
return ok(`Clicked ${target.description}.${opened}\n\n${await afterAction()}`);
|
|
55
55
|
}
|
|
56
56
|
catch (e) {
|
|
57
57
|
return fail(e);
|
|
58
58
|
}
|
|
59
59
|
}),
|
|
60
|
-
define("browser_switch_tab", "
|
|
60
|
+
define("browser_switch_tab", "Switches control to another browser tab (e.g. after a click that opens a popup). Without urlGlob, goes to the most recently opened tab. With urlGlob, goes to the tab whose URL matches the pattern (* within a segment, ** across segments). Waits for the tab to load. Becomes a deterministic step.", z.object({
|
|
61
61
|
urlGlob: z
|
|
62
62
|
.string()
|
|
63
63
|
.optional()
|
|
64
|
-
.describe("Glob
|
|
64
|
+
.describe("Glob of the target tab's URL, e.g. **/booking**. Omitted = most recent tab."),
|
|
65
65
|
}), async ({ urlGlob }) => {
|
|
66
66
|
try {
|
|
67
67
|
await session.switchTab(urlGlob);
|
|
68
68
|
record({ kind: "switchTab", ...(urlGlob ? { urlGlob } : {}) });
|
|
69
|
-
return ok(`
|
|
69
|
+
return ok(`Switched to tab: ${session.page.url()}.\n\n${await afterAction()}`);
|
|
70
70
|
}
|
|
71
71
|
catch (e) {
|
|
72
72
|
return fail(e);
|
|
73
73
|
}
|
|
74
74
|
}),
|
|
75
|
-
define("browser_fill", "
|
|
75
|
+
define("browser_fill", "Fills a field. For credentials/secrets use the placeholder $ENV:VAR_NAME — the real value comes from the environment and never passes through you.", z.object({
|
|
76
76
|
ref: z.number().int(),
|
|
77
|
-
value: z.string().describe("
|
|
77
|
+
value: z.string().describe("Literal text or $ENV:VAR_NAME"),
|
|
78
78
|
}), async ({ ref, value }) => {
|
|
79
79
|
try {
|
|
80
80
|
const target = await session.fill(ref, resolveEnvValue(value));
|
|
81
81
|
record({ kind: "fill", target, value });
|
|
82
|
-
return ok(`
|
|
82
|
+
return ok(`Filled ${target.description}.`);
|
|
83
83
|
}
|
|
84
84
|
catch (e) {
|
|
85
85
|
return fail(e);
|
|
86
86
|
}
|
|
87
87
|
}),
|
|
88
|
-
define("browser_select", "
|
|
88
|
+
define("browser_select", "Selects an option in a <select> by value or label.", z.object({ ref: z.number().int(), value: z.string() }), async ({ ref, value }) => {
|
|
89
89
|
try {
|
|
90
90
|
const target = await session.select(ref, resolveEnvValue(value));
|
|
91
91
|
record({ kind: "select", target, value });
|
|
92
|
-
return ok(`
|
|
92
|
+
return ok(`Selected "${value}" in ${target.description}.\n\n${await afterAction()}`);
|
|
93
93
|
}
|
|
94
94
|
catch (e) {
|
|
95
95
|
return fail(e);
|
|
96
96
|
}
|
|
97
97
|
}),
|
|
98
|
-
define("browser_press", "
|
|
98
|
+
define("browser_press", "Presses a key (Enter, Escape, Tab, ArrowDown...).", z.object({ key: z.string() }), async ({ key }) => {
|
|
99
99
|
try {
|
|
100
100
|
await session.press(key);
|
|
101
101
|
record({ kind: "press", key });
|
|
@@ -105,18 +105,64 @@ export function createScoutTools(ctx) {
|
|
|
105
105
|
return fail(e);
|
|
106
106
|
}
|
|
107
107
|
}),
|
|
108
|
-
define("
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
108
|
+
define("browser_wheel", "Dispatches a scroll gesture (mouse wheel) at position (x, y) — omitted = viewport center. Positive deltaY scrolls down. Use on scroll/gesture-driven UIs (vertical feeds, carousels, swipe pagination) that don't respond to the keyboard.", z.object({
|
|
109
|
+
deltaX: z.number().describe("Horizontal delta in px (positive = right)"),
|
|
110
|
+
deltaY: z.number().describe("Vertical delta in px (positive = down)"),
|
|
111
|
+
x: z.number().int().optional().describe("Gesture X position (omitted = center)"),
|
|
112
|
+
y: z.number().int().optional().describe("Gesture Y position (omitted = center)"),
|
|
113
|
+
}), async ({ deltaX, deltaY, x, y }) => {
|
|
114
|
+
try {
|
|
115
|
+
await session.wheel(deltaX, deltaY, x, y);
|
|
116
|
+
record({
|
|
117
|
+
kind: "wheel",
|
|
118
|
+
deltaX,
|
|
119
|
+
deltaY,
|
|
120
|
+
...(x !== undefined ? { x } : {}),
|
|
121
|
+
...(y !== undefined ? { y } : {}),
|
|
122
|
+
});
|
|
123
|
+
return ok(await afterAction());
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
return fail(e);
|
|
127
|
+
}
|
|
128
|
+
}),
|
|
129
|
+
define("browser_drag", "Drags the mouse from (fromX, fromY) to (toX, toY) — down, movement in intermediate steps, up. Emulates swipe/drag (advancing an item in a feed, closing a bottom-sheet, slider). Coordinates in px relative to the viewport.", z.object({
|
|
130
|
+
fromX: z.number().int(),
|
|
131
|
+
fromY: z.number().int(),
|
|
132
|
+
toX: z.number().int(),
|
|
133
|
+
toY: z.number().int(),
|
|
134
|
+
}), async ({ fromX, fromY, toX, toY }) => {
|
|
135
|
+
try {
|
|
136
|
+
await session.drag(fromX, fromY, toX, toY);
|
|
137
|
+
record({ kind: "drag", fromX, fromY, toX, toY });
|
|
138
|
+
return ok(await afterAction());
|
|
139
|
+
}
|
|
140
|
+
catch (e) {
|
|
141
|
+
return fail(e);
|
|
142
|
+
}
|
|
143
|
+
}),
|
|
144
|
+
define("browser_wait_for", "Waits for text to appear on the page OR the URL to contain a substring. Use after actions that trigger loading.", z.object({
|
|
145
|
+
text: z.string().optional().describe("Text that should become visible"),
|
|
146
|
+
urlContains: z.string().optional().describe("Substring expected in the URL"),
|
|
147
|
+
timeoutMs: z
|
|
148
|
+
.number()
|
|
149
|
+
.int()
|
|
150
|
+
.positive()
|
|
151
|
+
.optional()
|
|
152
|
+
.describe("Timeout in ms for this wait (default 10000)"),
|
|
153
|
+
}), async ({ text, urlContains, timeoutMs }) => {
|
|
112
154
|
try {
|
|
113
155
|
if (text) {
|
|
114
|
-
await session.waitForText(text);
|
|
115
|
-
record({ kind: "waitForText", text });
|
|
156
|
+
await session.waitForText(text, timeoutMs);
|
|
157
|
+
record({ kind: "waitForText", text, ...(timeoutMs ? { timeout: timeoutMs } : {}) });
|
|
116
158
|
}
|
|
117
159
|
if (urlContains) {
|
|
118
|
-
await session.waitForUrl(urlContains);
|
|
119
|
-
record({
|
|
160
|
+
await session.waitForUrl(urlContains, timeoutMs);
|
|
161
|
+
record({
|
|
162
|
+
kind: "waitForUrl",
|
|
163
|
+
pattern: urlContains,
|
|
164
|
+
...(timeoutMs ? { timeout: timeoutMs } : {}),
|
|
165
|
+
});
|
|
120
166
|
}
|
|
121
167
|
return ok(await afterAction());
|
|
122
168
|
}
|
|
@@ -124,31 +170,54 @@ export function createScoutTools(ctx) {
|
|
|
124
170
|
return fail(e);
|
|
125
171
|
}
|
|
126
172
|
}),
|
|
127
|
-
define("browser_assert", "
|
|
128
|
-
visibleText: z.string().optional().describe("
|
|
129
|
-
notVisibleText: z.string().optional().describe("
|
|
130
|
-
urlContains: z.string().optional().describe("
|
|
131
|
-
|
|
173
|
+
define("browser_assert", "Records a check of the expected behavior. Use it for EVERY scenario expectation — these assertions become the deterministic test.", z.object({
|
|
174
|
+
visibleText: z.string().optional().describe("Text that MUST be visible"),
|
|
175
|
+
notVisibleText: z.string().optional().describe("Text that must NOT be visible"),
|
|
176
|
+
urlContains: z.string().optional().describe("Substring the URL must contain"),
|
|
177
|
+
timeoutMs: z
|
|
178
|
+
.number()
|
|
179
|
+
.int()
|
|
180
|
+
.positive()
|
|
181
|
+
.optional()
|
|
182
|
+
.describe("Timeout in ms for these assertions (default 10000)"),
|
|
183
|
+
oneShot: z
|
|
184
|
+
.boolean()
|
|
185
|
+
.optional()
|
|
186
|
+
.describe("For visibleText only: waits for the page to settle (network idle, capped at 2s) and checks ONCE instead of polling the whole timeout. Use only when the text should already be present on the loaded page — content that arrives late (streaming, slow hydration) needs the default poll."),
|
|
187
|
+
}), async ({ visibleText, notVisibleText, urlContains, timeoutMs, oneShot }) => {
|
|
132
188
|
try {
|
|
133
189
|
if (visibleText) {
|
|
134
|
-
await session.assertVisible(visibleText);
|
|
135
|
-
record({
|
|
190
|
+
await session.assertVisible(visibleText, { timeout: timeoutMs, oneShot });
|
|
191
|
+
record({
|
|
192
|
+
kind: "assertVisible",
|
|
193
|
+
text: visibleText,
|
|
194
|
+
...(timeoutMs ? { timeout: timeoutMs } : {}),
|
|
195
|
+
...(oneShot ? { oneShot: true } : {}),
|
|
196
|
+
});
|
|
136
197
|
}
|
|
137
198
|
if (notVisibleText) {
|
|
138
|
-
await session.assertNotVisible(notVisibleText);
|
|
139
|
-
record({
|
|
199
|
+
await session.assertNotVisible(notVisibleText, timeoutMs);
|
|
200
|
+
record({
|
|
201
|
+
kind: "assertNotVisible",
|
|
202
|
+
text: notVisibleText,
|
|
203
|
+
...(timeoutMs ? { timeout: timeoutMs } : {}),
|
|
204
|
+
});
|
|
140
205
|
}
|
|
141
206
|
if (urlContains) {
|
|
142
|
-
await session.assertUrl(urlContains);
|
|
143
|
-
record({
|
|
207
|
+
await session.assertUrl(urlContains, timeoutMs);
|
|
208
|
+
record({
|
|
209
|
+
kind: "assertUrl",
|
|
210
|
+
pattern: urlContains,
|
|
211
|
+
...(timeoutMs ? { timeout: timeoutMs } : {}),
|
|
212
|
+
});
|
|
144
213
|
}
|
|
145
|
-
return ok("
|
|
214
|
+
return ok("Assertion passed.");
|
|
146
215
|
}
|
|
147
216
|
catch (e) {
|
|
148
217
|
return fail(e);
|
|
149
218
|
}
|
|
150
219
|
}),
|
|
151
|
-
define("browser_inspect_logs", "
|
|
220
|
+
define("browser_inspect_logs", "Shows what the ACTIVE tab recorded: network requests (method, status, URL) and console messages — errors/warnings AND others (log/debug/info). Use it BEFORE browser_assert_network / browser_assert_no_console_errors / browser_assert_console_message to see what actually happened and write a tolerant assertion (match by URL pattern + status or by a STABLE part of the message, never by volatile values).", z.object({}), async () => {
|
|
152
221
|
try {
|
|
153
222
|
return ok(session.formatLogs());
|
|
154
223
|
}
|
|
@@ -156,77 +225,77 @@ export function createScoutTools(ctx) {
|
|
|
156
225
|
return fail(e);
|
|
157
226
|
}
|
|
158
227
|
}),
|
|
159
|
-
define("browser_assert_network", '
|
|
160
|
-
urlGlob: z.string().describe("
|
|
161
|
-
method: z.string().optional().describe("GET, POST, ... (
|
|
228
|
+
define("browser_assert_network", 'Verifies that an expected network call happened. Match the request by method + URL pattern (urlGlob with * and **) and, optionally, status. To inspect the response body use responseIncludes with STABLE substrings (field names like "orderId"), never volatile values (ids, timestamps). Becomes a deterministic test.', z.object({
|
|
229
|
+
urlGlob: z.string().describe("URL pattern, e.g. **/api/checkout/**"),
|
|
230
|
+
method: z.string().optional().describe("GET, POST, ... (omitted = any method)"),
|
|
162
231
|
status: z
|
|
163
232
|
.union([z.number().int(), z.enum(["2xx", "3xx", "4xx", "5xx"])])
|
|
164
233
|
.optional()
|
|
165
|
-
.describe("
|
|
234
|
+
.describe("Exact status (200) or class (2xx)"),
|
|
166
235
|
responseIncludes: z
|
|
167
236
|
.array(z.string())
|
|
168
237
|
.optional()
|
|
169
|
-
.describe("
|
|
238
|
+
.describe("Substrings that MUST appear in the response body"),
|
|
170
239
|
}), async ({ urlGlob, method, status, responseIncludes }) => {
|
|
171
240
|
try {
|
|
172
241
|
await session.assertNetwork({ urlGlob, method, status, responseIncludes });
|
|
173
242
|
record({ kind: "assertNetwork", urlGlob, method, status, responseIncludes });
|
|
174
|
-
return ok(`
|
|
243
|
+
return ok(`Network assertion passed: ${method ?? "ANY"} ${urlGlob}${status ? ` (status ${status})` : ""}.`);
|
|
175
244
|
}
|
|
176
245
|
catch (e) {
|
|
177
246
|
return fail(e);
|
|
178
247
|
}
|
|
179
248
|
}),
|
|
180
|
-
define("browser_assert_no_console_errors", "
|
|
249
|
+
define("browser_assert_no_console_errors", "Verifies that there were NO errors in the browser console (console.error + uncaught exceptions) during the flow. Use ignore to tolerate known/expected errors (matched by substring). Becomes a deterministic test.", z.object({
|
|
181
250
|
ignore: z
|
|
182
251
|
.array(z.string())
|
|
183
252
|
.optional()
|
|
184
|
-
.describe("Substrings
|
|
253
|
+
.describe("Substrings of known errors to ignore"),
|
|
185
254
|
}), async ({ ignore }) => {
|
|
186
255
|
try {
|
|
187
256
|
await session.assertNoConsoleErrors(ignore);
|
|
188
257
|
record({ kind: "assertNoConsoleErrors", ignore });
|
|
189
|
-
return ok("
|
|
258
|
+
return ok("No console errors.");
|
|
190
259
|
}
|
|
191
260
|
catch (e) {
|
|
192
261
|
return fail(e);
|
|
193
262
|
}
|
|
194
263
|
}),
|
|
195
|
-
define("browser_assert_console_message", '
|
|
264
|
+
define("browser_assert_console_message", 'Verifies that the ACTIVE tab\'s console logged a message containing ALL of the given substrings, matched within a SINGLE message (not spread across messages). Run browser_inspect_logs first to see the real text and pick STABLE substrings (e.g. the prefix "DEBUG:[FEATURE/...]"), never volatile values. Optionally constrain by type. Becomes a deterministic test.', z.object({
|
|
196
265
|
includes: z
|
|
197
266
|
.array(z.string().min(1))
|
|
198
267
|
.min(1)
|
|
199
|
-
.describe("
|
|
268
|
+
.describe("NON-EMPTY substrings that must ALL appear within a single message"),
|
|
200
269
|
type: z
|
|
201
270
|
.string()
|
|
202
271
|
.optional()
|
|
203
|
-
.describe("
|
|
272
|
+
.describe("Console type: log, debug, info, warning, error (omitted = any)"),
|
|
204
273
|
}), async ({ includes, type }) => {
|
|
205
274
|
try {
|
|
206
275
|
await session.assertConsoleMessage(includes, type);
|
|
207
276
|
record({ kind: "assertConsoleMessage", includes, ...(type ? { type } : {}) });
|
|
208
|
-
return ok(`
|
|
277
|
+
return ok(`Console assertion passed: message containing ${includes.join(" + ")}${type ? ` (type ${type})` : ""}.`);
|
|
209
278
|
}
|
|
210
279
|
catch (e) {
|
|
211
280
|
return fail(e);
|
|
212
281
|
}
|
|
213
282
|
}),
|
|
214
|
-
define("browser_screenshot", "
|
|
283
|
+
define("browser_screenshot", "Captures a screenshot as evidence. Use it at key moments (final state, paywall, error encountered).", z.object({ label: z.string().describe("Short label, e.g. 'paywall-shown'") }), async ({ label }) => {
|
|
215
284
|
try {
|
|
216
285
|
await session.screenshot(label);
|
|
217
286
|
record({ kind: "screenshot", label });
|
|
218
|
-
return ok(`Screenshot "${label}"
|
|
287
|
+
return ok(`Screenshot "${label}" saved.`);
|
|
219
288
|
}
|
|
220
289
|
catch (e) {
|
|
221
290
|
return fail(e);
|
|
222
291
|
}
|
|
223
292
|
}),
|
|
224
|
-
define("scout_verdict", "
|
|
293
|
+
define("scout_verdict", "MANDATORY at the end: records the verification verdict. After calling it, stop.", z.object({
|
|
225
294
|
verdict: z.enum(["verified", "failed", "partial", "blocked"]),
|
|
226
|
-
reason: z.string().describe("
|
|
295
|
+
reason: z.string().describe("Objective justification, citing what was observed"),
|
|
227
296
|
}), async (args) => {
|
|
228
297
|
setVerdict(args);
|
|
229
|
-
return ok("
|
|
298
|
+
return ok("Verdict recorded. Stop now.");
|
|
230
299
|
}),
|
|
231
300
|
];
|
|
232
301
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-tools.js","sourceRoot":"","sources":["../../src/runner/agent-tools.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent-tools.js","sourceRoot":"","sources":["../../src/runner/agent-tools.ts"],"names":[],"mappings":"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"}
|
package/dist/runner/ai-runner.js
CHANGED
|
@@ -28,49 +28,50 @@ export async function runWithAgent(session, scenario, config, viewport) {
|
|
|
28
28
|
},
|
|
29
29
|
});
|
|
30
30
|
const profileInfo = scenario.profile
|
|
31
|
-
? `
|
|
32
|
-
: "
|
|
31
|
+
? `Authenticated session with the profile "${scenario.profile}"${config.profiles[scenario.profile]?.description ? ` (${config.profiles[scenario.profile].description})` : ""}. You are ALREADY logged in — don't log in again unless the scenario asks for it.`
|
|
32
|
+
: "Anonymous session (logged-out).";
|
|
33
33
|
const envVars = scenario.profile ? (config.profiles[scenario.profile]?.env ?? []) : [];
|
|
34
34
|
const envInfo = envVars.length
|
|
35
|
-
? `Env vars
|
|
35
|
+
? `Env vars available via the $ENV:VAR placeholder (in browser_fill and in browser_navigate URLs): ${envVars.map((v) => `$ENV:${v}`).join(", ")}.`
|
|
36
36
|
: "";
|
|
37
37
|
// Cookies are seeded into the context by the runner before the flow. Announce
|
|
38
38
|
// only the NAMES so the agent treats the precondition as satisfied — values
|
|
39
39
|
// may be secrets ($ENV) and must never reach the LLM.
|
|
40
40
|
const presetCookies = resolveCookies(scenario, config);
|
|
41
41
|
const cookieInfo = presetCookies?.length
|
|
42
|
-
? `Cookies
|
|
42
|
+
? `Cookies already set in the browser before the flow (precondition satisfied — do NOT try to set them, you have no tool for that): ${presetCookies.map((c) => c.name).join(", ")}.`
|
|
43
43
|
: "";
|
|
44
|
-
const viewportInfo = `Viewport:
|
|
45
|
-
const systemPrompt = `
|
|
44
|
+
const viewportInfo = `Viewport: running as "${viewport.name}" (${viewport.width}×${viewport.height}${viewport.isMobile ? ", mobile/touch" : ""}). Verify the layout for that size — on mobile expect a hamburger menu/compact nav; on desktop, a horizontal nav.`;
|
|
45
|
+
const systemPrompt = `You are Scout, a QA agent that verifies scenarios in a real browser.
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
Target app: ${config.baseUrl}
|
|
48
48
|
${viewportInfo}
|
|
49
49
|
${profileInfo}
|
|
50
50
|
${envInfo}
|
|
51
51
|
${cookieInfo}
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
1.
|
|
55
|
-
2. Execute
|
|
56
|
-
3.
|
|
57
|
-
4.
|
|
58
|
-
5. Capture browser_screenshot
|
|
59
|
-
6.
|
|
60
|
-
- verified:
|
|
61
|
-
- failed:
|
|
62
|
-
- partial:
|
|
63
|
-
- blocked:
|
|
53
|
+
Working method:
|
|
54
|
+
1. Start with browser_navigate to the flow's starting page (or browser_snapshot if you're already there).
|
|
55
|
+
2. Execute the flow described in the scenario, step by step, always reading the snapshot before acting.
|
|
56
|
+
3. For EVERY scenario expectation, use browser_assert — the recorded assertions become the deterministic test that will run in CI without you.
|
|
57
|
+
4. When the scenario mentions console logs/errors or network/API calls: use browser_inspect_logs to see what happened, then browser_assert_network and/or browser_assert_no_console_errors to record the check.
|
|
58
|
+
5. Capture browser_screenshot as evidence at key moments.
|
|
59
|
+
6. ALWAYS finish with scout_verdict:
|
|
60
|
+
- verified: all the expected behavior was confirmed by assertions
|
|
61
|
+
- failed: expected behavior is broken (describe exactly what)
|
|
62
|
+
- partial: part works, part doesn't, or not everything could be verified
|
|
63
|
+
- blocked: couldn't even reach the flow (app down, broken login, etc.)
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
-
|
|
67
|
-
-
|
|
68
|
-
-
|
|
69
|
-
-
|
|
70
|
-
-
|
|
71
|
-
-
|
|
72
|
-
-
|
|
73
|
-
|
|
65
|
+
Rules:
|
|
66
|
+
- Act like a real user: one step at a time, wait for loads with browser_wait_for.
|
|
67
|
+
- If an element isn't in the snapshot, take a new snapshot or advance the flow another way — don't invent refs.
|
|
68
|
+
- Gesture-driven UIs (vertical feed, carousel, swipe between items) often don't respond to the keyboard: use browser_wheel (scroll at a position) or browser_drag (point-to-point drag) and check the result in the next snapshot.
|
|
69
|
+
- Never use literal secrets: use $ENV:VAR_NAME — it works both in browser_fill and in browser_navigate URLs (e.g. tokens in the query string).
|
|
70
|
+
- Don't re-fill a field you already filled, unless the page cleared the value — each of your actions becomes a step in the recorded script, and duplicate steps are noise that makes replay fragile.
|
|
71
|
+
- Network/console assertions must be TOLERANT: match requests by method + URL pattern + status; only use responseIncludes with stable substrings (field names), never ids/timestamps. An assertion glued to a volatile value breaks on replay.
|
|
72
|
+
- Be economical: don't explore beyond the scenario. Your budget is ${config.maxTurns} actions.
|
|
73
|
+
- If you're repeating attempts without progress (a blocking overlay, an element that won't appear), STOP and call scout_verdict (partial or blocked) explaining the obstacle — a partial verdict is worth more than dying without a verdict.`;
|
|
74
|
+
const userPrompt = `Verify this QA scenario:\n\n## ${scenario.name}\n\n${scenario.scenario}${scenario.notes ? `\n\nNotes: ${scenario.notes}` : ""}`;
|
|
74
75
|
const provider = inferProvider(config.model);
|
|
75
76
|
const engine = selectEngine(provider, config.engine);
|
|
76
77
|
const run = await engine.run({
|
|
@@ -88,21 +89,21 @@ Regras:
|
|
|
88
89
|
// with whatever it observed — a partial verdict beats a silent death.
|
|
89
90
|
const mainCause = verdict ? undefined : describeNoVerdict(endInfo, config.maxTurns);
|
|
90
91
|
if (!verdict) {
|
|
91
|
-
transcript.push(`[scout]
|
|
92
|
+
transcript.push(`[scout] Agent ended without a verdict (${mainCause}) — rescue: demanding scout_verdict with what was observed.`);
|
|
92
93
|
try {
|
|
93
|
-
const rescue = await run.resume("
|
|
94
|
+
const rescue = await run.resume("Your verification hit the action limit. Do NOT run any more browser actions. Call scout_verdict NOW based on what you already observed: 'partial' if the verification was incomplete, 'blocked' if you didn't even reach the flow, 'failed'/'verified' only if you already had enough evidence.", 4);
|
|
94
95
|
transcript.push(...rescue.transcript);
|
|
95
96
|
endInfo = rescue.end;
|
|
96
97
|
}
|
|
97
98
|
catch (error) {
|
|
98
|
-
transcript.push(`[scout]
|
|
99
|
+
transcript.push(`[scout] Verdict rescue failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
99
100
|
}
|
|
100
101
|
}
|
|
101
102
|
if (!verdict) {
|
|
102
103
|
const cause = mainCause ?? describeNoVerdict(endInfo, config.maxTurns);
|
|
103
104
|
return {
|
|
104
105
|
verdict: "blocked",
|
|
105
|
-
reason: `
|
|
106
|
+
reason: `RUNNER failure, not a UI verdict: ${cause}; scout_verdict was not called, even in the verdict rescue.`,
|
|
106
107
|
steps,
|
|
107
108
|
transcript,
|
|
108
109
|
runnerFailure: cause,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-runner.js","sourceRoot":"","sources":["../../src/runner/ai-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAoB,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,iBAAiB,EACjB,aAAa,GAGd,MAAM,oBAAoB,CAAC;AAG5B,gFAAgF;AAChF,0BAA0B;AAC1B,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,CAAC;AAG5C;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAuB,EACvB,QAAkB,EAClB,MAAmB,EACnB,QAA0B;IAE1B,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,OAAyD,CAAC;IAE9D,MAAM,KAAK,GAAG,gBAAgB,CAAC;QAC7B,OAAO;QACP,MAAM;QACN,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAClC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE;YAChB,OAAO,GAAG,CAAC,CAAC;QACd,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO;QAClC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"ai-runner.js","sourceRoot":"","sources":["../../src/runner/ai-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/runner/browser.d.ts
CHANGED
|
@@ -156,11 +156,42 @@ export declare class BrowserSession {
|
|
|
156
156
|
fill(ref: number, value: string): Promise<Target>;
|
|
157
157
|
select(ref: number, value: string): Promise<Target>;
|
|
158
158
|
press(key: string): Promise<void>;
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
159
|
+
/**
|
|
160
|
+
* Dispatches a wheel gesture at (x, y) — viewport center when omitted, since
|
|
161
|
+
* wheel events fire at the current mouse position and (0,0) may sit outside
|
|
162
|
+
* the scroll container the gesture is meant for. The center is derived from
|
|
163
|
+
* the resolved viewport, so a recorded step without coordinates replays at
|
|
164
|
+
* the same spot (viewport is part of the run identity).
|
|
165
|
+
*/
|
|
166
|
+
wheel(deltaX: number, deltaY: number, x?: number, y?: number): Promise<void>;
|
|
167
|
+
/**
|
|
168
|
+
* Drags the mouse from one point to another (down → move → up), emulating a
|
|
169
|
+
* swipe/drag gesture. The move is split into intermediate events so handlers
|
|
170
|
+
* that track movement deltas (drag-to-dismiss, swipe navigation) see a
|
|
171
|
+
* realistic gesture instead of a single jump.
|
|
172
|
+
*/
|
|
173
|
+
drag(fromX: number, fromY: number, toX: number, toY: number): Promise<void>;
|
|
174
|
+
waitForText(text: string, timeout?: number): Promise<void>;
|
|
175
|
+
waitForUrl(pattern: string, timeout?: number): Promise<void>;
|
|
176
|
+
/**
|
|
177
|
+
* Asserts a text is visible. Default is Playwright's polling wait (up to
|
|
178
|
+
* `timeout`, STEP_TIMEOUT when omitted) — right for content that may still
|
|
179
|
+
* be loading. `oneShot` is the fast path for content that should already be
|
|
180
|
+
* on a loaded page: let the page settle (network idle, capped so a chatty
|
|
181
|
+
* app can't stall the check) and probe visibility ONCE, so a definitive miss
|
|
182
|
+
* costs ~1-2s instead of the full poll — mirroring assertNotVisible.
|
|
183
|
+
*/
|
|
184
|
+
assertVisible(text: string, opts?: {
|
|
185
|
+
timeout?: number;
|
|
186
|
+
oneShot?: boolean;
|
|
187
|
+
}): Promise<void>;
|
|
188
|
+
assertNotVisible(text: string, timeout?: number): Promise<void>;
|
|
189
|
+
/**
|
|
190
|
+
* Asserts the current URL contains the pattern. Instant one-shot by default
|
|
191
|
+
* (backward compatible); with `timeout` it tolerates an in-flight redirect
|
|
192
|
+
* by waiting up to that long for the URL to match.
|
|
193
|
+
*/
|
|
194
|
+
assertUrl(pattern: string, timeout?: number): Promise<void>;
|
|
164
195
|
/** Asserts an expected network call was observed. Throws with a reason on miss. */
|
|
165
196
|
assertNetwork(matcher: NetworkMatcher): Promise<void>;
|
|
166
197
|
/** Asserts no console errors (console.error + uncaught) except ignored substrings. */
|