@pcamarajr/scout 0.5.0 → 0.7.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/README.md +1 -0
- package/dist/cli.js +126 -19
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +7 -0
- package/dist/config.js +3 -0
- package/dist/config.js.map +1 -1
- package/dist/credentials.d.ts +73 -0
- package/dist/credentials.js +196 -0
- package/dist/credentials.js.map +1 -0
- package/dist/engine.d.ts +29 -0
- package/dist/engine.js +81 -41
- package/dist/engine.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/init.d.ts +26 -0
- package/dist/init.js +60 -0
- package/dist/init.js.map +1 -0
- package/dist/runner/agent-tools.d.ts +45 -0
- package/dist/runner/agent-tools.js +151 -0
- package/dist/runner/agent-tools.js.map +1 -0
- package/dist/runner/ai-runner.d.ts +11 -35
- package/dist/runner/ai-runner.js +36 -229
- package/dist/runner/ai-runner.js.map +1 -1
- package/dist/runner/engines/ai-sdk.d.ts +58 -0
- package/dist/runner/engines/ai-sdk.js +144 -0
- package/dist/runner/engines/ai-sdk.js.map +1 -0
- package/dist/runner/engines/claude-agent-sdk.d.ts +11 -0
- package/dist/runner/engines/claude-agent-sdk.js +117 -0
- package/dist/runner/engines/claude-agent-sdk.js.map +1 -0
- package/dist/runner/engines/index.d.ts +20 -0
- package/dist/runner/engines/index.js +28 -0
- package/dist/runner/engines/index.js.map +1 -0
- package/dist/runner/engines/types.d.ts +68 -0
- package/dist/runner/engines/types.js +37 -0
- package/dist/runner/engines/types.js.map +1 -0
- package/dist/scaffold.d.ts +31 -0
- package/dist/scaffold.js +82 -0
- package/dist/scaffold.js.map +1 -0
- package/package.json +9 -2
- package/templates/AGENTS.md +100 -0
- package/templates/SKILL.md +25 -0
- package/templates/scout.mdc +21 -0
package/dist/engine.js
CHANGED
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { loadConfig, resolveStorageState } from "./config.js";
|
|
4
|
+
import { detectAiCredentials, inferProvider } from "./credentials.js";
|
|
4
5
|
import { renderRunReport } from "./report.js";
|
|
5
6
|
import { BrowserSession } from "./runner/browser.js";
|
|
6
7
|
import { runWithAgent } from "./runner/ai-runner.js";
|
|
7
8
|
import { describeStep, replayForVideo, replaySteps } from "./runner/script-runner.js";
|
|
8
9
|
import { generateVideo, pacingFor } from "./runner/video.js";
|
|
9
|
-
function aiAvailable() {
|
|
10
|
-
return Boolean(process.env.ANTHROPIC_API_KEY ||
|
|
11
|
-
process.env.CLAUDE_CODE_OAUTH_TOKEN ||
|
|
12
|
-
fs.existsSync(path.join(process.env.HOME ?? "", ".claude")));
|
|
13
|
-
}
|
|
14
10
|
/**
|
|
15
11
|
* Core run logic shared by CLI and MCP server:
|
|
16
12
|
* cached script exists? → replay (no LLM)
|
|
@@ -25,6 +21,7 @@ export async function runScenario(store, scenario, config = loadConfig(), opts =
|
|
|
25
21
|
const runDir = store.newRunDir(scenario.slug);
|
|
26
22
|
const storageState = resolveStorageState(scenario.profile, config);
|
|
27
23
|
const cached = opts.forceAi ? undefined : store.loadSteps(scenario.slug);
|
|
24
|
+
const aiCreds = detectAiCredentials(inferProvider(config.model), { engine: config.engine });
|
|
28
25
|
const launch = () => BrowserSession.launch({
|
|
29
26
|
baseUrl: config.baseUrl,
|
|
30
27
|
headless: opts.headed ? false : config.headless,
|
|
@@ -51,7 +48,7 @@ export async function runScenario(store, scenario, config = loadConfig(), opts =
|
|
|
51
48
|
trace,
|
|
52
49
|
};
|
|
53
50
|
}
|
|
54
|
-
else if (heal &&
|
|
51
|
+
else if (heal && aiCreds.ok) {
|
|
55
52
|
// cached script broke — re-verify with the agent and re-record
|
|
56
53
|
const aiResult = await runAi(scenario, config, store, runDir, storageState, opts);
|
|
57
54
|
result = {
|
|
@@ -79,8 +76,8 @@ export async function runScenario(store, scenario, config = loadConfig(), opts =
|
|
|
79
76
|
}
|
|
80
77
|
}
|
|
81
78
|
else {
|
|
82
|
-
if (!
|
|
83
|
-
throw new Error(
|
|
79
|
+
if (!aiCreds.ok) {
|
|
80
|
+
throw new Error(aiCreds.remediation);
|
|
84
81
|
}
|
|
85
82
|
const aiResult = await runAi(scenario, config, store, runDir, storageState, opts);
|
|
86
83
|
result = { ...aiResult, startedAt, durationMs: Date.now() - start };
|
|
@@ -98,41 +95,26 @@ export async function runScenario(store, scenario, config = loadConfig(), opts =
|
|
|
98
95
|
return result;
|
|
99
96
|
}
|
|
100
97
|
/**
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
98
|
+
* Builds the pacing for the non-paced fallback replay: zero slowMo and zero
|
|
99
|
+
* dwell so it mirrors the authoritative `ai+heal` replay (which passed). The
|
|
100
|
+
* title/verdict card durations are kept so the rendered MP4 still bookends with
|
|
101
|
+
* the scenario name and the VERIFIED card.
|
|
104
102
|
*/
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
recordVideo: true,
|
|
116
|
-
slowMoMs: pacing.slowMoMs,
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
catch {
|
|
120
|
-
console.warn("[scout] vídeo: não foi possível abrir o browser para o replay de preview.");
|
|
121
|
-
return undefined;
|
|
122
|
-
}
|
|
123
|
-
const preview = await replayForVideo(session, steps, pacing.assertDwellMs, pacing.verdictCardMs);
|
|
124
|
-
const { video: webm } = await session.close();
|
|
125
|
-
if (!preview.passed) {
|
|
126
|
-
console.warn("[scout] vídeo: replay de preview falhou — nenhum vídeo gerado (veredito não afetado).");
|
|
127
|
-
if (webm)
|
|
128
|
-
fs.rmSync(webm, { force: true });
|
|
129
|
-
return undefined;
|
|
130
|
-
}
|
|
103
|
+
export function nonPacedPacing(paced) {
|
|
104
|
+
return { ...paced, slowMoMs: 0, assertDwellMs: 0 };
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Renders an MP4 from a recorded WebM, persisting the timeline and degrading to
|
|
108
|
+
* the raw WebM under a stable name when ffmpeg is missing or fails. Returns the
|
|
109
|
+
* artifact path, or undefined when no WebM was produced at all.
|
|
110
|
+
*/
|
|
111
|
+
function renderPreview(recorded, scenario, runDir, pacing) {
|
|
112
|
+
const webm = recorded.webm;
|
|
131
113
|
if (!webm || !fs.existsSync(webm)) {
|
|
132
|
-
console.warn("[scout]
|
|
114
|
+
console.warn("[scout] video: replay produced no WebM file.");
|
|
133
115
|
return undefined;
|
|
134
116
|
}
|
|
135
|
-
fs.writeFileSync(path.join(runDir, "video.timeline.json"), JSON.stringify(
|
|
117
|
+
fs.writeFileSync(path.join(runDir, "video.timeline.json"), JSON.stringify(recorded.timeline, null, 2) + "\n");
|
|
136
118
|
const result = generateVideo({
|
|
137
119
|
webmPath: webm,
|
|
138
120
|
outPath: path.join(runDir, "video.mp4"),
|
|
@@ -140,11 +122,11 @@ async function recordPreviewVideo(scenario, steps, config, storageState, runDir)
|
|
|
140
122
|
height: 844,
|
|
141
123
|
scenarioName: scenario.name,
|
|
142
124
|
verdict: "verified",
|
|
143
|
-
timeline:
|
|
125
|
+
timeline: recorded.timeline,
|
|
144
126
|
pacing,
|
|
145
127
|
});
|
|
146
128
|
if (result.warning)
|
|
147
|
-
console.warn(`[scout]
|
|
129
|
+
console.warn(`[scout] video: ${result.warning}`);
|
|
148
130
|
if (result.output && result.output !== webm) {
|
|
149
131
|
fs.rmSync(webm, { force: true }); // MP4 superseded the intermediate WebM
|
|
150
132
|
return result.output;
|
|
@@ -159,6 +141,64 @@ async function recordPreviewVideo(scenario, steps, config, storageState, runDir)
|
|
|
159
141
|
return webm;
|
|
160
142
|
}
|
|
161
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* Orchestrates preview-video generation, decoupled from the browser so it can be
|
|
146
|
+
* tested: `attempt` performs one recorded replay at a given pacing and returns
|
|
147
|
+
* its outcome + WebM. Best-effort and post-verdict — never touches the verdict.
|
|
148
|
+
*
|
|
149
|
+
* The verified scenario must NEVER yield zero video. The first attempt is paced
|
|
150
|
+
* (slowMo + dwell) for human viewing. If that paced replay fails — the pacing
|
|
151
|
+
* sometimes perturbs timing on flows the authoritative run handled fine (e.g. a
|
|
152
|
+
* cookie banner) — we fall back to a non-paced replay that mirrors the
|
|
153
|
+
* authoritative run, which passed, so a usable clip is still produced. Only if
|
|
154
|
+
* the fallback ALSO fails do we warn and yield no video.
|
|
155
|
+
*/
|
|
156
|
+
export async function recordPreviewVideoFrom(attempt, scenario, runDir, pacing) {
|
|
157
|
+
const paced = await attempt(pacing);
|
|
158
|
+
if (paced.passed)
|
|
159
|
+
return renderPreview(paced, scenario, runDir, pacing);
|
|
160
|
+
if (paced.webm)
|
|
161
|
+
fs.rmSync(paced.webm, { force: true }); // discard the failed paced take
|
|
162
|
+
console.warn("[scout] video: paced preview replay failed; recorded a non-paced fallback clip (verdict unaffected).");
|
|
163
|
+
const fallbackPacing = nonPacedPacing(pacing);
|
|
164
|
+
const fallback = await attempt(fallbackPacing);
|
|
165
|
+
if (fallback.passed)
|
|
166
|
+
return renderPreview(fallback, scenario, runDir, fallbackPacing);
|
|
167
|
+
if (fallback.webm)
|
|
168
|
+
fs.rmSync(fallback.webm, { force: true });
|
|
169
|
+
console.warn("[scout] video: non-paced fallback replay also failed — no video generated (verdict unaffected).");
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Runs one extra, paced replay of the verified script with video recording on,
|
|
174
|
+
* then renders it to a GitHub-ready MP4 with baked step labels + verdict card.
|
|
175
|
+
* On a paced-replay failure it retries without pacing so a verified scenario
|
|
176
|
+
* still yields a clip; the verdict is never affected.
|
|
177
|
+
*/
|
|
178
|
+
async function recordPreviewVideo(scenario, steps, config, storageState, runDir) {
|
|
179
|
+
const attempt = async (pacing) => {
|
|
180
|
+
let session;
|
|
181
|
+
try {
|
|
182
|
+
session = await BrowserSession.launch({
|
|
183
|
+
baseUrl: config.baseUrl,
|
|
184
|
+
headless: config.headless,
|
|
185
|
+
storageState,
|
|
186
|
+
locale: config.locale,
|
|
187
|
+
runDir,
|
|
188
|
+
recordVideo: true,
|
|
189
|
+
slowMoMs: pacing.slowMoMs,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
console.warn("[scout] video: could not open the browser for the preview replay.");
|
|
194
|
+
return { passed: false, timeline: [] };
|
|
195
|
+
}
|
|
196
|
+
const preview = await replayForVideo(session, steps, pacing.assertDwellMs, pacing.verdictCardMs);
|
|
197
|
+
const { video: webm } = await session.close();
|
|
198
|
+
return { passed: preview.passed, webm, timeline: preview.timeline };
|
|
199
|
+
};
|
|
200
|
+
return recordPreviewVideoFrom(attempt, scenario, runDir, pacingFor(config.videoSpeed));
|
|
201
|
+
}
|
|
162
202
|
/**
|
|
163
203
|
* Runs `attempt` until it produces a real verdict, retrying runner failures
|
|
164
204
|
* (agent died without calling scout_verdict) up to maxAttempts total runs.
|
package/dist/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { loadConfig, type ConfigOverrides, type ScoutConfig, type ScoutProfile } from "./config.js";
|
|
2
|
+
export { claudeCredentialsPath, detectAiCredentials, inferProvider, type AiProvider, type CredentialStatus, } from "./credentials.js";
|
|
2
3
|
export { pruneSteps, runAiWithRetry, runScenario, type RunOptions } from "./engine.js";
|
|
3
4
|
export { buildReport, renderRunReport, renderSummary, scenarioStatus, type ReportData, type ReportScenario } from "./report.js";
|
|
4
5
|
export { describeNoVerdict, relativizeUrl, type QueryEndInfo } from "./runner/ai-runner.js";
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { loadConfig } from "./config.js";
|
|
2
|
+
export { claudeCredentialsPath, detectAiCredentials, inferProvider, } from "./credentials.js";
|
|
2
3
|
export { pruneSteps, runAiWithRetry, runScenario } from "./engine.js";
|
|
3
4
|
export { buildReport, renderRunReport, renderSummary, scenarioStatus } from "./report.js";
|
|
4
5
|
export { describeNoVerdict, relativizeUrl } from "./runner/ai-runner.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA6D,MAAM,aAAa,CAAC;AACpG,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAmB,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAwC,MAAM,aAAa,CAAC;AAChI,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAqB,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAyB,MAAM,YAAY,CAAC;AAChH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA6D,MAAM,aAAa,CAAC;AACpG,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,GAGd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAmB,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAwC,MAAM,aAAa,CAAC;AAChI,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAqB,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAyB,MAAM,YAAY,CAAC;AAChH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/init.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const DEFAULT_BASE_URL = "http://localhost:3000";
|
|
2
|
+
export interface InitOptions {
|
|
3
|
+
/** Base URL chosen on the command line (`--base-url`). Wins over any prompt. */
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
/** Non-interactive: never prompt, fall back to the default silently (`--yes`). */
|
|
6
|
+
yes?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface InitDeps {
|
|
9
|
+
cwd?: string;
|
|
10
|
+
/**
|
|
11
|
+
* Resolves the default base URL when it was not passed on the CLI. Returns
|
|
12
|
+
* the chosen URL (possibly the default). Injected in tests; in production it
|
|
13
|
+
* prompts on a TTY or falls back to the default otherwise.
|
|
14
|
+
*/
|
|
15
|
+
resolveBaseUrl?: (defaultUrl: string) => Promise<string>;
|
|
16
|
+
/** Sink for user-facing messages (defaults to console.log). */
|
|
17
|
+
log?: (message: string) => void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Bootstraps `.scout/` and `scout.config.json` in the target project.
|
|
21
|
+
*
|
|
22
|
+
* Base URL precedence: `--base-url` flag > interactive prompt (TTY, not `--yes`)
|
|
23
|
+
* > the localhost default. An existing `scout.config.json` is never overwritten
|
|
24
|
+
* (it may carry secrets), and the prompt is skipped entirely in that case.
|
|
25
|
+
*/
|
|
26
|
+
export declare function runInit(opts?: InitOptions, deps?: InitDeps): Promise<void>;
|
package/dist/init.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import readline from "node:readline/promises";
|
|
4
|
+
import { CONFIG_FILE, SCOUT_DIR } from "./config.js";
|
|
5
|
+
import { scaffoldAgentOnboarding } from "./scaffold.js";
|
|
6
|
+
import { Store } from "./store.js";
|
|
7
|
+
export const DEFAULT_BASE_URL = "http://localhost:3000";
|
|
8
|
+
/** Prompt for the base URL on an interactive TTY; otherwise use the default. */
|
|
9
|
+
async function promptBaseUrl(defaultUrl) {
|
|
10
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY)
|
|
11
|
+
return defaultUrl;
|
|
12
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
13
|
+
try {
|
|
14
|
+
const answer = (await rl.question(`Default base URL (${defaultUrl}): `)).trim();
|
|
15
|
+
return answer || defaultUrl;
|
|
16
|
+
}
|
|
17
|
+
finally {
|
|
18
|
+
rl.close();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Bootstraps `.scout/` and `scout.config.json` in the target project.
|
|
23
|
+
*
|
|
24
|
+
* Base URL precedence: `--base-url` flag > interactive prompt (TTY, not `--yes`)
|
|
25
|
+
* > the localhost default. An existing `scout.config.json` is never overwritten
|
|
26
|
+
* (it may carry secrets), and the prompt is skipped entirely in that case.
|
|
27
|
+
*/
|
|
28
|
+
export async function runInit(opts = {}, deps = {}) {
|
|
29
|
+
const cwd = deps.cwd ?? process.cwd();
|
|
30
|
+
const log = deps.log ?? ((m) => console.log(m));
|
|
31
|
+
const resolveBaseUrl = deps.resolveBaseUrl ?? promptBaseUrl;
|
|
32
|
+
const store = new Store(cwd);
|
|
33
|
+
store.init();
|
|
34
|
+
const configPath = path.join(cwd, CONFIG_FILE);
|
|
35
|
+
if (!fs.existsSync(configPath)) {
|
|
36
|
+
let baseUrl = DEFAULT_BASE_URL;
|
|
37
|
+
if (opts.baseUrl) {
|
|
38
|
+
baseUrl = opts.baseUrl;
|
|
39
|
+
}
|
|
40
|
+
else if (!opts.yes) {
|
|
41
|
+
baseUrl = await resolveBaseUrl(DEFAULT_BASE_URL);
|
|
42
|
+
}
|
|
43
|
+
fs.writeFileSync(configPath, JSON.stringify({
|
|
44
|
+
baseUrl,
|
|
45
|
+
model: "claude-sonnet-4-6",
|
|
46
|
+
headless: true,
|
|
47
|
+
maxTurns: 40,
|
|
48
|
+
locale: "pt-BR",
|
|
49
|
+
profiles: {
|
|
50
|
+
anon: { description: "Logged-out session" },
|
|
51
|
+
},
|
|
52
|
+
}, null, 2) + "\n");
|
|
53
|
+
log(`✓ ${CONFIG_FILE} created (baseUrl: ${baseUrl}) — adjust baseUrl and profiles.`);
|
|
54
|
+
}
|
|
55
|
+
log(`✓ ${SCOUT_DIR}/ initialized.`);
|
|
56
|
+
// Refresh agent-onboarding artifacts (AGENTS.md block, Claude skill, Cursor
|
|
57
|
+
// rule). Idempotent — re-running init is the upgrade path for these files.
|
|
58
|
+
scaffoldAgentOnboarding({ cwd, log });
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=init.js.map
|
package/dist/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,CAAC,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAqBxD,gFAAgF;AAChF,KAAK,UAAU,aAAa,CAAC,UAAkB;IAC7C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,UAAU,CAAC;IACrE,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,UAAU,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChF,OAAO,MAAM,IAAI,UAAU,CAAC;IAC9B,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAoB,EAAE,EAAE,OAAiB,EAAE;IACvE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,aAAa,CAAC;IAE5D,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,KAAK,CAAC,IAAI,EAAE,CAAC;IAEb,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,IAAI,OAAO,GAAG,gBAAgB,CAAC;QAC/B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QACzB,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACrB,OAAO,GAAG,MAAM,cAAc,CAAC,gBAAgB,CAAC,CAAC;QACnD,CAAC;QACD,EAAE,CAAC,aAAa,CACd,UAAU,EACV,IAAI,CAAC,SAAS,CACZ;YACE,OAAO;YACP,KAAK,EAAE,mBAAmB;YAC1B,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,OAAO;YACf,QAAQ,EAAE;gBACR,IAAI,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE;aAC5C;SACF,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CACT,CAAC;QACF,GAAG,CAAC,KAAK,WAAW,sBAAsB,OAAO,kCAAkC,CAAC,CAAC;IACvF,CAAC;IACD,GAAG,CAAC,KAAK,SAAS,gBAAgB,CAAC,CAAC;IAEpC,4EAA4E;IAC5E,2EAA2E;IAC3E,uBAAuB,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ScoutConfig } from "../config.js";
|
|
3
|
+
import type { Step, Verdict } from "../types.js";
|
|
4
|
+
import { BrowserSession } from "./browser.js";
|
|
5
|
+
/** Normalized result every engine adapter maps into its own SDK shape. */
|
|
6
|
+
export interface ToolResult {
|
|
7
|
+
text: string;
|
|
8
|
+
isError?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Engine-neutral tool definition. Both the Agent SDK and the AI SDK engines
|
|
12
|
+
* consume this single source of truth — neither SDK type leaks in here.
|
|
13
|
+
*/
|
|
14
|
+
export interface ScoutTool {
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
/**
|
|
18
|
+
* Zod object input schema. The AI SDK consumes it directly as `inputSchema`;
|
|
19
|
+
* the Agent SDK adapter passes `schema.shape` (its `tool()` wants a raw shape).
|
|
20
|
+
*/
|
|
21
|
+
schema: z.ZodObject;
|
|
22
|
+
handler: (args: unknown) => Promise<ToolResult>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Context the tool factory closes over. `record` collects deterministic Steps,
|
|
26
|
+
* `setVerdict` is the verdict sink (scout_verdict writes here as a side effect,
|
|
27
|
+
* exactly like the original closure-over-`verdict` design), and `session`/
|
|
28
|
+
* `config` drive the actual browser actions.
|
|
29
|
+
*/
|
|
30
|
+
export interface ScoutToolContext {
|
|
31
|
+
session: BrowserSession;
|
|
32
|
+
config: ScoutConfig;
|
|
33
|
+
record: (step: Step) => void;
|
|
34
|
+
setVerdict: (verdict: {
|
|
35
|
+
verdict: Verdict;
|
|
36
|
+
reason: string;
|
|
37
|
+
}) => void;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Builds the 9 browser tools + scout_verdict as engine-neutral definitions.
|
|
41
|
+
* The Portuguese descriptions/messages are intentionally verbatim from the
|
|
42
|
+
* original ai-runner — they are part of the verifier's behavior and are tracked
|
|
43
|
+
* for a separate English-sweep chore, NOT to be translated here.
|
|
44
|
+
*/
|
|
45
|
+
export declare function createScoutTools(ctx: ScoutToolContext): ScoutTool[];
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { resolveEnvValue } from "./browser.js";
|
|
3
|
+
import { relativizeUrl } from "./engines/types.js";
|
|
4
|
+
const ok = (text) => ({ text });
|
|
5
|
+
const fail = (error) => ({
|
|
6
|
+
text: `ERRO: ${error instanceof Error ? error.message : String(error)}`,
|
|
7
|
+
isError: true,
|
|
8
|
+
});
|
|
9
|
+
/**
|
|
10
|
+
* Builds the 9 browser tools + scout_verdict as engine-neutral definitions.
|
|
11
|
+
* The Portuguese descriptions/messages are intentionally verbatim from the
|
|
12
|
+
* original ai-runner — they are part of the verifier's behavior and are tracked
|
|
13
|
+
* for a separate English-sweep chore, NOT to be translated here.
|
|
14
|
+
*/
|
|
15
|
+
export function createScoutTools(ctx) {
|
|
16
|
+
const { session, config, record, setVerdict } = ctx;
|
|
17
|
+
const afterAction = async () => {
|
|
18
|
+
const snap = await session.snapshot();
|
|
19
|
+
return session.formatSnapshot(snap);
|
|
20
|
+
};
|
|
21
|
+
const define = (name, description, schema, handler) => ({
|
|
22
|
+
name,
|
|
23
|
+
description,
|
|
24
|
+
schema,
|
|
25
|
+
handler: (args) => handler(schema.parse(args)),
|
|
26
|
+
});
|
|
27
|
+
return [
|
|
28
|
+
define("browser_navigate", "Navega para uma URL (absoluta ou relativa ao baseUrl do app). Para tokens/segredos na URL use placeholder $ENV:VAR_NAME — resolvido em runtime, nunca passa por você.", z.object({ url: z.string().describe("Ex: /login, /renovar?token=$ENV:TOKEN ou https://...") }), async ({ url }) => {
|
|
29
|
+
try {
|
|
30
|
+
await session.navigate(url);
|
|
31
|
+
record({ kind: "navigate", url: relativizeUrl(url, config.baseUrl) });
|
|
32
|
+
return ok(await afterAction());
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
return fail(e);
|
|
36
|
+
}
|
|
37
|
+
}),
|
|
38
|
+
define("browser_snapshot", "Retorna o estado atual da página: URL, título, elementos interativos numerados [ref] e texto visível. Use sempre que precisar decidir a próxima ação.", z.object({}), async () => {
|
|
39
|
+
try {
|
|
40
|
+
return ok(await afterAction());
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
return fail(e);
|
|
44
|
+
}
|
|
45
|
+
}),
|
|
46
|
+
define("browser_click", "Clica no elemento identificado pelo [ref] do último snapshot.", z.object({ ref: z.number().int().describe("Ref numérico do snapshot") }), async ({ ref }) => {
|
|
47
|
+
try {
|
|
48
|
+
const target = await session.click(ref);
|
|
49
|
+
record({ kind: "click", target });
|
|
50
|
+
return ok(`Cliquei em ${target.description}.\n\n${await afterAction()}`);
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
return fail(e);
|
|
54
|
+
}
|
|
55
|
+
}),
|
|
56
|
+
define("browser_fill", "Preenche um campo. Para credenciais/segredos use placeholder $ENV:VAR_NAME — o valor real vem do ambiente e nunca passa por você.", z.object({
|
|
57
|
+
ref: z.number().int(),
|
|
58
|
+
value: z.string().describe("Texto literal ou $ENV:VAR_NAME"),
|
|
59
|
+
}), async ({ ref, value }) => {
|
|
60
|
+
try {
|
|
61
|
+
const target = await session.fill(ref, resolveEnvValue(value));
|
|
62
|
+
record({ kind: "fill", target, value });
|
|
63
|
+
return ok(`Preenchi ${target.description}.`);
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
return fail(e);
|
|
67
|
+
}
|
|
68
|
+
}),
|
|
69
|
+
define("browser_select", "Seleciona uma opção em um <select> pelo value ou label.", z.object({ ref: z.number().int(), value: z.string() }), async ({ ref, value }) => {
|
|
70
|
+
try {
|
|
71
|
+
const target = await session.select(ref, resolveEnvValue(value));
|
|
72
|
+
record({ kind: "select", target, value });
|
|
73
|
+
return ok(`Selecionei "${value}" em ${target.description}.\n\n${await afterAction()}`);
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
return fail(e);
|
|
77
|
+
}
|
|
78
|
+
}),
|
|
79
|
+
define("browser_press", "Pressiona uma tecla (Enter, Escape, Tab, ArrowDown...).", z.object({ key: z.string() }), async ({ key }) => {
|
|
80
|
+
try {
|
|
81
|
+
await session.press(key);
|
|
82
|
+
record({ kind: "press", key });
|
|
83
|
+
return ok(await afterAction());
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
return fail(e);
|
|
87
|
+
}
|
|
88
|
+
}),
|
|
89
|
+
define("browser_wait_for", "Espera texto aparecer na página OU a URL conter um trecho. Use após ações que disparam carregamento.", z.object({
|
|
90
|
+
text: z.string().optional().describe("Texto que deve ficar visível"),
|
|
91
|
+
urlContains: z.string().optional().describe("Trecho esperado na URL"),
|
|
92
|
+
}), async ({ text, urlContains }) => {
|
|
93
|
+
try {
|
|
94
|
+
if (text) {
|
|
95
|
+
await session.waitForText(text);
|
|
96
|
+
record({ kind: "waitForText", text });
|
|
97
|
+
}
|
|
98
|
+
if (urlContains) {
|
|
99
|
+
await session.waitForUrl(urlContains);
|
|
100
|
+
record({ kind: "waitForUrl", pattern: urlContains });
|
|
101
|
+
}
|
|
102
|
+
return ok(await afterAction());
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
return fail(e);
|
|
106
|
+
}
|
|
107
|
+
}),
|
|
108
|
+
define("browser_assert", "Registra uma verificação do comportamento esperado. Use para CADA expectativa do cenário — essas asserções viram o teste determinístico.", z.object({
|
|
109
|
+
visibleText: z.string().optional().describe("Texto que DEVE estar visível"),
|
|
110
|
+
notVisibleText: z.string().optional().describe("Texto que NÃO deve estar visível"),
|
|
111
|
+
urlContains: z.string().optional().describe("Trecho que a URL deve conter"),
|
|
112
|
+
}), async ({ visibleText, notVisibleText, urlContains }) => {
|
|
113
|
+
try {
|
|
114
|
+
if (visibleText) {
|
|
115
|
+
await session.assertVisible(visibleText);
|
|
116
|
+
record({ kind: "assertVisible", text: visibleText });
|
|
117
|
+
}
|
|
118
|
+
if (notVisibleText) {
|
|
119
|
+
await session.assertNotVisible(notVisibleText);
|
|
120
|
+
record({ kind: "assertNotVisible", text: notVisibleText });
|
|
121
|
+
}
|
|
122
|
+
if (urlContains) {
|
|
123
|
+
await session.assertUrl(urlContains);
|
|
124
|
+
record({ kind: "assertUrl", pattern: urlContains });
|
|
125
|
+
}
|
|
126
|
+
return ok("Asserção passou.");
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
return fail(e);
|
|
130
|
+
}
|
|
131
|
+
}),
|
|
132
|
+
define("browser_screenshot", "Captura screenshot como evidência. Use em momentos-chave (estado final, paywall, erro encontrado).", z.object({ label: z.string().describe("Rótulo curto, ex: 'paywall-exibido'") }), async ({ label }) => {
|
|
133
|
+
try {
|
|
134
|
+
await session.screenshot(label);
|
|
135
|
+
record({ kind: "screenshot", label });
|
|
136
|
+
return ok(`Screenshot "${label}" salvo.`);
|
|
137
|
+
}
|
|
138
|
+
catch (e) {
|
|
139
|
+
return fail(e);
|
|
140
|
+
}
|
|
141
|
+
}),
|
|
142
|
+
define("scout_verdict", "OBRIGATÓRIO ao final: registra o veredito da verificação. Após chamar, encerre.", z.object({
|
|
143
|
+
verdict: z.enum(["verified", "failed", "partial", "blocked"]),
|
|
144
|
+
reason: z.string().describe("Justificativa objetiva, citando o que foi observado"),
|
|
145
|
+
}), async (args) => {
|
|
146
|
+
setVerdict(args);
|
|
147
|
+
return ok("Veredito registrado. Encerre agora.");
|
|
148
|
+
}),
|
|
149
|
+
];
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=agent-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-tools.js","sourceRoot":"","sources":["../../src/runner/agent-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,40 +1,16 @@
|
|
|
1
1
|
import type { ScoutConfig } from "../config.js";
|
|
2
|
-
import type { Scenario
|
|
2
|
+
import type { Scenario } from "../types.js";
|
|
3
|
+
import { describeNoVerdict, relativizeUrl, type AiRunOutcome, type QueryEndInfo } from "./engines/types.js";
|
|
3
4
|
import { BrowserSession } from "./browser.js";
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
reason: string;
|
|
7
|
-
steps: Step[];
|
|
8
|
-
transcript: string[];
|
|
9
|
-
/**
|
|
10
|
-
* Set when the runner itself failed to produce a verdict (agent never called
|
|
11
|
-
* scout_verdict) — NOT a UI judgment. Callers may retry and must report it
|
|
12
|
-
* as an infrastructure failure, never as "the scenario is blocked by the UI".
|
|
13
|
-
*/
|
|
14
|
-
runnerFailure?: string;
|
|
15
|
-
}
|
|
16
|
-
/** How the SDK query ended, for no-verdict diagnostics. */
|
|
17
|
-
export interface QueryEndInfo {
|
|
18
|
-
subtype: string;
|
|
19
|
-
numTurns?: number;
|
|
20
|
-
errors?: string[];
|
|
21
|
-
}
|
|
5
|
+
export { describeNoVerdict, relativizeUrl };
|
|
6
|
+
export type { AiRunOutcome, QueryEndInfo };
|
|
22
7
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
*
|
|
30
|
-
* survive --base-url / SCOUT_BASE_URL pointing at another server. URLs that
|
|
31
|
-
* merely share the prefix (http://localhost:3000x) or live on other hosts
|
|
32
|
-
* stay absolute.
|
|
33
|
-
*/
|
|
34
|
-
export declare function relativizeUrl(url: string, baseUrl: string): string;
|
|
35
|
-
/**
|
|
36
|
-
* AI-driven run: a Claude agent navigates the real browser to verify the
|
|
37
|
-
* scenario. Every successful action is recorded as a deterministic Step so
|
|
38
|
-
* subsequent runs can replay without the LLM.
|
|
8
|
+
* AI-driven run, engine-neutral orchestrator. A Claude agent (via the Agent SDK
|
|
9
|
+
* by default, or the Vercel AI SDK when selected) navigates the real browser to
|
|
10
|
+
* verify the scenario. Every successful action is recorded as a deterministic
|
|
11
|
+
* Step so subsequent runs can replay without the LLM.
|
|
12
|
+
*
|
|
13
|
+
* Verdict capture, the forced-verdict rescue, and outcome assembly live HERE,
|
|
14
|
+
* above both engines, so behavior is identical regardless of engine.
|
|
39
15
|
*/
|
|
40
16
|
export declare function runWithAgent(session: BrowserSession, scenario: Scenario, config: ScoutConfig): Promise<AiRunOutcome>;
|