trawl-devices-agent 0.3.0 → 0.6.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/archive.js +80 -0
- package/dist/archive.js.map +1 -0
- package/dist/devices.js +11 -0
- package/dist/devices.js.map +1 -1
- package/dist/frames.js +79 -0
- package/dist/frames.js.map +1 -0
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/dist/recorder.js +56 -8
- package/dist/recorder.js.map +1 -1
- package/dist/recorderInject.js +11 -8
- package/dist/recorderInject.js.map +1 -1
- package/dist/routes.js +28 -1
- package/dist/routes.js.map +1 -1
- package/dist/runner.js +65 -5
- package/dist/runner.js.map +1 -1
- package/dist/sessions.js +0 -2
- package/dist/sessions.js.map +1 -1
- package/dist/steps.js +2 -0
- package/dist/steps.js.map +1 -1
- package/dist/version.js +2 -2
- package/package.json +1 -1
- package/skills/writing-device-scripts/SKILL.md +13 -1
package/dist/archive.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { AgentError } from "./types.js";
|
|
4
|
+
import { runDir, runsDir } from "./workspace.js";
|
|
5
|
+
export async function listRuns(workspace, query = {}) {
|
|
6
|
+
const dir = runsDir(workspace);
|
|
7
|
+
let entries;
|
|
8
|
+
try {
|
|
9
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
const reports = [];
|
|
15
|
+
for (const entry of entries) {
|
|
16
|
+
if (!entry.isDirectory())
|
|
17
|
+
continue;
|
|
18
|
+
try {
|
|
19
|
+
const raw = await fs.readFile(path.join(dir, entry.name, "report.json"), "utf8");
|
|
20
|
+
const report = JSON.parse(raw);
|
|
21
|
+
if (query.script && report.script !== query.script)
|
|
22
|
+
continue;
|
|
23
|
+
reports.push(report);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// A run still in flight has no report yet.
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
reports.sort((a, b) => b.startedAt - a.startedAt);
|
|
30
|
+
return reports.slice(0, query.limit ?? 50);
|
|
31
|
+
}
|
|
32
|
+
/** Every file a run produced, as run-relative paths. */
|
|
33
|
+
export async function listArtifacts(workspace, runId) {
|
|
34
|
+
const root = runDir(workspace, runId);
|
|
35
|
+
const out = [];
|
|
36
|
+
const walk = async (dir) => {
|
|
37
|
+
let entries;
|
|
38
|
+
try {
|
|
39
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
for (const entry of entries) {
|
|
45
|
+
const abs = path.join(dir, entry.name);
|
|
46
|
+
if (entry.isDirectory())
|
|
47
|
+
await walk(abs);
|
|
48
|
+
else
|
|
49
|
+
out.push({ path: path.relative(root, abs), size: (await fs.stat(abs)).size });
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
await walk(root);
|
|
53
|
+
out.sort((a, b) => a.path.localeCompare(b.path));
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
const MIME = {
|
|
57
|
+
".png": "image/png",
|
|
58
|
+
".jpg": "image/jpeg",
|
|
59
|
+
".jpeg": "image/jpeg",
|
|
60
|
+
".webm": "video/webm",
|
|
61
|
+
".zip": "application/zip",
|
|
62
|
+
".json": "application/json",
|
|
63
|
+
};
|
|
64
|
+
/** One artifact, base64-encoded: the plugin has no filesystem of its own. */
|
|
65
|
+
export async function readArtifact(workspace, runId, relative) {
|
|
66
|
+
const root = runDir(workspace, runId);
|
|
67
|
+
const abs = path.resolve(root, relative);
|
|
68
|
+
if (abs !== root && !abs.startsWith(root + path.sep)) {
|
|
69
|
+
throw new AgentError("script", `path escapes the run folder: ${relative}`);
|
|
70
|
+
}
|
|
71
|
+
const data = await fs.readFile(abs).catch(() => {
|
|
72
|
+
throw new AgentError("agent", `no such artifact: ${relative}`);
|
|
73
|
+
});
|
|
74
|
+
return {
|
|
75
|
+
mime: MIME[path.extname(abs).toLowerCase()] ?? "application/octet-stream",
|
|
76
|
+
base64: data.toString("base64"),
|
|
77
|
+
size: data.length,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../src/archive.ts"],"names":[],"mappings":"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"}
|
package/dist/devices.js
CHANGED
|
@@ -11,6 +11,9 @@ export const DEVICE_DEFAULTS = {
|
|
|
11
11
|
ignoreHTTPSErrors: true,
|
|
12
12
|
trace: "on-failure",
|
|
13
13
|
video: false,
|
|
14
|
+
stepDelayMs: 0,
|
|
15
|
+
closeAfterRun: true,
|
|
16
|
+
videoFps: 5,
|
|
14
17
|
capabilities: ["record", "run", "live", "traffic"],
|
|
15
18
|
};
|
|
16
19
|
const BROWSERS = ["chromium", "firefox", "webkit"];
|
|
@@ -35,6 +38,14 @@ export function validateDevice(input) {
|
|
|
35
38
|
fail(`proxy.mode must be one of ${PROXY_MODES.join(", ")}`);
|
|
36
39
|
if (merged.proxy.mode === "custom" && !merged.proxy.url)
|
|
37
40
|
fail("proxy.url is required when proxy.mode is custom");
|
|
41
|
+
if (typeof merged.stepDelayMs !== "number" || merged.stepDelayMs < 0 || merged.stepDelayMs > 60_000) {
|
|
42
|
+
fail("stepDelayMs must be between 0 and 60000");
|
|
43
|
+
}
|
|
44
|
+
if (typeof merged.closeAfterRun !== "boolean")
|
|
45
|
+
fail("closeAfterRun must be a boolean");
|
|
46
|
+
if (typeof merged.videoFps !== "number" || merged.videoFps < 1 || merged.videoFps > 30) {
|
|
47
|
+
fail("videoFps must be between 1 and 30");
|
|
48
|
+
}
|
|
38
49
|
merged.type = "browser";
|
|
39
50
|
return merged;
|
|
40
51
|
}
|
package/dist/devices.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devices.js","sourceRoot":"","sources":["../src/devices.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"devices.js","sourceRoot":"","sources":["../src/devices.ts"],"names":[],"mappings":"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"}
|
package/dist/frames.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Playwright's own video is fixed at ~25 fps, cannot be slowed down, and never
|
|
5
|
+
* shows the pointer — a replay recorded that way is heavy and hard to read.
|
|
6
|
+
* So frames are captured here instead, at a chosen rate, over a page that draws
|
|
7
|
+
* its own cursor.
|
|
8
|
+
*/
|
|
9
|
+
export const CURSOR_SOURCE = String.raw `
|
|
10
|
+
(() => {
|
|
11
|
+
if (window.__trawlCursorInstalled) return;
|
|
12
|
+
window.__trawlCursorInstalled = true;
|
|
13
|
+
|
|
14
|
+
const install = () => {
|
|
15
|
+
if (!document.body || document.getElementById('__trawl_cursor')) return;
|
|
16
|
+
const dot = document.createElement('div');
|
|
17
|
+
dot.id = '__trawl_cursor';
|
|
18
|
+
dot.style.cssText =
|
|
19
|
+
'position:fixed;left:0;top:0;width:16px;height:16px;margin:-8px 0 0 -8px;' +
|
|
20
|
+
'border-radius:50%;border:2px solid #fff;background:rgba(255,64,64,.75);' +
|
|
21
|
+
'box-shadow:0 0 0 1px rgba(0,0,0,.5);pointer-events:none;z-index:2147483646;' +
|
|
22
|
+
'transition:transform .05s linear';
|
|
23
|
+
document.body.appendChild(dot);
|
|
24
|
+
|
|
25
|
+
const move = (x, y) => { dot.style.transform = 'translate(' + x + 'px,' + y + 'px)'; };
|
|
26
|
+
document.addEventListener('mousemove', (e) => move(e.clientX, e.clientY), true);
|
|
27
|
+
document.addEventListener('mousedown', () => { dot.style.background = 'rgba(255,64,64,1)'; dot.style.width = '26px'; dot.style.height = '26px'; dot.style.margin = '-13px 0 0 -13px'; }, true);
|
|
28
|
+
document.addEventListener('mouseup', () => { dot.style.background = 'rgba(255,64,64,.75)'; dot.style.width = '16px'; dot.style.height = '16px'; dot.style.margin = '-8px 0 0 -8px'; }, true);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', install);
|
|
32
|
+
else install();
|
|
33
|
+
// Pages replace their body on client-side navigation; keep the cursor alive.
|
|
34
|
+
setInterval(install, 1000);
|
|
35
|
+
})();
|
|
36
|
+
`;
|
|
37
|
+
/** Draw a pointer in every page of the context, current and future. */
|
|
38
|
+
export async function installCursor(context) {
|
|
39
|
+
await context.addInitScript(CURSOR_SOURCE);
|
|
40
|
+
await Promise.all(context.pages().map((p) => p.evaluate(CURSOR_SOURCE).catch(() => { })));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Screenshot `page` into `dir` at `fps` until stopped. Frames are JPEG: a run of
|
|
44
|
+
* a few minutes at 5 fps is then megabytes rather than hundreds of them.
|
|
45
|
+
*/
|
|
46
|
+
export async function captureFrames(page, dir, fps) {
|
|
47
|
+
await fs.mkdir(dir, { recursive: true });
|
|
48
|
+
const interval = Math.max(50, Math.round(1000 / Math.max(1, fps)));
|
|
49
|
+
let index = 0;
|
|
50
|
+
let stopped = false;
|
|
51
|
+
let inFlight = Promise.resolve();
|
|
52
|
+
const timer = setInterval(() => {
|
|
53
|
+
if (stopped)
|
|
54
|
+
return;
|
|
55
|
+
inFlight = inFlight.then(async () => {
|
|
56
|
+
if (stopped || page.isClosed())
|
|
57
|
+
return;
|
|
58
|
+
const file = path.join(dir, `${String(index).padStart(5, "0")}.jpg`);
|
|
59
|
+
try {
|
|
60
|
+
await page.screenshot({ path: file, type: "jpeg", quality: 60, timeout: interval * 4 });
|
|
61
|
+
index += 1;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// A screenshot can fail mid-navigation; the next tick tries again.
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}, interval);
|
|
68
|
+
timer.unref?.();
|
|
69
|
+
return {
|
|
70
|
+
count: () => index,
|
|
71
|
+
stop: async () => {
|
|
72
|
+
stopped = true;
|
|
73
|
+
clearInterval(timer);
|
|
74
|
+
await inFlight;
|
|
75
|
+
return { count: index, fps };
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=frames.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frames.js","sourceRoot":"","sources":["../src/frames.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BtC,CAAC;AAQF,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAuB;IACzD,MAAM,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAC3C,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAU,EAAE,GAAW,EAAE,GAAW;IACtE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACnE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,QAAQ,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEhD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,IAAI,OAAO;YAAE,OAAO;QACpB,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAClC,IAAI,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAAE,OAAO;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YACrE,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC;gBACxF,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,mEAAmE;YACrE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,QAAQ,CAAC,CAAC;IACb,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAEhB,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,OAAO,GAAG,IAAI,CAAC;YACf,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,QAAQ,CAAC;YACf,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QAC/B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,7 @@ import { ensureBrowser } from "./browsers.js";
|
|
|
7
7
|
import { AGENT_VERSION, DSL_VERSION } from "./version.js";
|
|
8
8
|
import { STEP_NAMES } from "./steps.js";
|
|
9
9
|
import { buildRoutes } from "./routes.js";
|
|
10
|
+
import { SessionStore } from "./sessions.js";
|
|
10
11
|
import os from "node:os";
|
|
11
12
|
import path from "node:path";
|
|
12
13
|
const arg = (name, fallback) => {
|
|
@@ -29,12 +30,27 @@ if (process.argv.includes("--ensure-browser")) {
|
|
|
29
30
|
const pruned = await pruneRuns(workspace, Number(arg("keep-runs", "50")));
|
|
30
31
|
if (pruned.length)
|
|
31
32
|
console.log(`pruned ${pruned.length} old run(s)`);
|
|
33
|
+
// Owned here so the shutdown path can close every browser: a killed agent that
|
|
34
|
+
// leaves Chromium behind is exactly what "the browser won't close" looks like.
|
|
35
|
+
const sessions = new SessionStore();
|
|
36
|
+
let shuttingDown = false;
|
|
37
|
+
const shutdown = async (signal) => {
|
|
38
|
+
if (shuttingDown)
|
|
39
|
+
return;
|
|
40
|
+
shuttingDown = true;
|
|
41
|
+
console.log(`[agent] ${signal} — closing browsers`);
|
|
42
|
+
await sessions.stopAll().catch(() => { });
|
|
43
|
+
process.exit(0);
|
|
44
|
+
};
|
|
45
|
+
for (const signal of ["SIGINT", "SIGTERM", "SIGHUP"]) {
|
|
46
|
+
process.on(signal, () => void shutdown(signal));
|
|
47
|
+
}
|
|
32
48
|
let port = -1;
|
|
33
49
|
for (let candidate = wanted; candidate < wanted + 20 && port < 0; candidate++) {
|
|
34
50
|
const server = createServer({
|
|
35
51
|
token,
|
|
36
52
|
getPort: () => port,
|
|
37
|
-
routes: buildRoutes({ workspace, trawlProxyPort }),
|
|
53
|
+
routes: buildRoutes({ workspace, trawlProxyPort, sessions }),
|
|
38
54
|
health: () => ({ dsl: DSL_VERSION, steps: [...STEP_NAMES], workspace, proxyPort: trawlProxyPort }),
|
|
39
55
|
});
|
|
40
56
|
port = await listen(server, candidate);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/recorder.js
CHANGED
|
@@ -4,7 +4,12 @@ import { toLocator } from "./targets.js";
|
|
|
4
4
|
import { generate } from "./codegen.js";
|
|
5
5
|
import { writeScript } from "./workspace.js";
|
|
6
6
|
import { RECORDER_SOURCE } from "./recorderInject.js";
|
|
7
|
+
/** A navigation this soon after a recorded action is that action's consequence. */
|
|
8
|
+
const NAVIGATION_GRACE_MS = 1500;
|
|
9
|
+
const isRecordableUrl = (url) => Boolean(url) && url !== "about:blank" && !url.startsWith("chrome-error://") && !url.startsWith("devtools://");
|
|
7
10
|
const MARK = "data-trawl-rec-el";
|
|
11
|
+
/** Past this, a candidate is too vague to pin down by index. */
|
|
12
|
+
const MAX_AMBIGUOUS_MATCHES = 30;
|
|
8
13
|
export class RecorderStore {
|
|
9
14
|
deps;
|
|
10
15
|
recordings = new Map();
|
|
@@ -25,6 +30,8 @@ export class RecorderStore {
|
|
|
25
30
|
steps: [],
|
|
26
31
|
warnings: [],
|
|
27
32
|
startedAt: Date.now(),
|
|
33
|
+
lastStepAt: 0,
|
|
34
|
+
lastUrl: null,
|
|
28
35
|
};
|
|
29
36
|
await session.context.exposeBinding("__trawlRec", async ({ page }, raw) => {
|
|
30
37
|
try {
|
|
@@ -34,12 +41,29 @@ export class RecorderStore {
|
|
|
34
41
|
action: raw.action,
|
|
35
42
|
args: [target, ...raw.args],
|
|
36
43
|
});
|
|
44
|
+
recording.lastStepAt = Date.now();
|
|
37
45
|
}
|
|
38
46
|
catch (err) {
|
|
39
47
|
recording.warnings.push(`dropped ${raw.action}: ${err.message}`);
|
|
40
48
|
}
|
|
41
49
|
});
|
|
42
50
|
await session.context.addInitScript(RECORDER_SOURCE);
|
|
51
|
+
// Addresses the human opens are steps too: without them a replay has no
|
|
52
|
+
// idea where to start.
|
|
53
|
+
session.page.on("framenavigated", (frame) => {
|
|
54
|
+
if (frame !== session.page.mainFrame())
|
|
55
|
+
return;
|
|
56
|
+
const url = frame.url();
|
|
57
|
+
if (!isRecordableUrl(url) || url === recording.lastUrl)
|
|
58
|
+
return;
|
|
59
|
+
recording.lastUrl = url;
|
|
60
|
+
// A click we already recorded is what caused this navigation — recording
|
|
61
|
+
// a goto as well would replay the click and then jump past its result.
|
|
62
|
+
if (Date.now() - recording.lastStepAt < NAVIGATION_GRACE_MS)
|
|
63
|
+
return;
|
|
64
|
+
recording.steps.push({ index: recording.steps.length, action: "goto", args: [url] });
|
|
65
|
+
recording.lastStepAt = Date.now();
|
|
66
|
+
});
|
|
43
67
|
this.deps.sessions.setState(sessionId, "recording");
|
|
44
68
|
if (url)
|
|
45
69
|
await session.page.goto(url);
|
|
@@ -56,15 +80,23 @@ export class RecorderStore {
|
|
|
56
80
|
for (const candidate of candidates) {
|
|
57
81
|
try {
|
|
58
82
|
const locator = toLocator(page, candidate);
|
|
59
|
-
|
|
83
|
+
const count = await locator.count();
|
|
84
|
+
if (count === 0)
|
|
85
|
+
continue;
|
|
86
|
+
if (count === 1) {
|
|
87
|
+
if (await this.isMarked(locator))
|
|
88
|
+
return candidate;
|
|
60
89
|
continue;
|
|
61
|
-
|
|
62
|
-
|
|
90
|
+
}
|
|
91
|
+
// Ambiguous on its own, but still usable: pin it to the element that was
|
|
92
|
+
// actually clicked. Recording it bare would fail the replay with a
|
|
93
|
+
// strict-mode violation the moment the page has siblings like it.
|
|
94
|
+
if (count > MAX_AMBIGUOUS_MATCHES)
|
|
63
95
|
continue;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
96
|
+
for (let i = 0; i < count; i++) {
|
|
97
|
+
if (await this.isMarked(locator.nth(i)))
|
|
98
|
+
return { ...candidate, nth: i };
|
|
99
|
+
}
|
|
68
100
|
}
|
|
69
101
|
catch {
|
|
70
102
|
// try the next candidate
|
|
@@ -76,6 +108,17 @@ export class RecorderStore {
|
|
|
76
108
|
recording.warnings.push(`no verified target; fell back to ${JSON.stringify(fallback)}`);
|
|
77
109
|
return fallback;
|
|
78
110
|
}
|
|
111
|
+
async isMarked(locator) {
|
|
112
|
+
const handle = (await locator.elementHandle({ timeout: 1000 }));
|
|
113
|
+
if (!handle)
|
|
114
|
+
return false;
|
|
115
|
+
try {
|
|
116
|
+
return await handle.evaluate((el, mark) => el.hasAttribute(mark), MARK);
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
await handle.dispose();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
79
122
|
async stop(id, options) {
|
|
80
123
|
const recording = this.get(id);
|
|
81
124
|
const session = this.deps.sessions.get(recording.sessionId);
|
|
@@ -84,7 +127,12 @@ export class RecorderStore {
|
|
|
84
127
|
.catch(() => { });
|
|
85
128
|
await session.page.waitForTimeout(150);
|
|
86
129
|
this.recordings.delete(id);
|
|
87
|
-
|
|
130
|
+
// The window stays open on purpose: you often want to keep clicking around
|
|
131
|
+
// after stopping, and a run decides for itself whether to close it.
|
|
132
|
+
if (options.closeSession === true)
|
|
133
|
+
await this.deps.sessions.stop(recording.sessionId);
|
|
134
|
+
else
|
|
135
|
+
this.deps.sessions.setState(recording.sessionId, "idle");
|
|
88
136
|
const code = generate(recording.steps, { header: "recorded by trawl-devices-agent" });
|
|
89
137
|
if (options.saveAs)
|
|
90
138
|
await writeScript(this.deps.workspace, options.saveAs, code);
|
package/dist/recorder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recorder.js","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAoC,MAAM,YAAY,CAAC;AAE1E,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"recorder.js","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"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"}
|
package/dist/recorderInject.js
CHANGED
|
@@ -47,17 +47,20 @@ export const RECORDER_SOURCE = String.raw `
|
|
|
47
47
|
return null;
|
|
48
48
|
};
|
|
49
49
|
|
|
50
|
+
// Playwright collapses whitespace when it computes an accessible name; a raw
|
|
51
|
+
// textContent (icons, newlines, double spaces) would never match it.
|
|
52
|
+
const norm = (s) => (s || '').replace(/\s+/g, ' ').trim();
|
|
53
|
+
|
|
50
54
|
const accessibleName = (el) => {
|
|
51
|
-
const aria = el.getAttribute('aria-label');
|
|
52
|
-
if (aria) return aria
|
|
53
|
-
if (el.labels && el.labels[0]) return el.labels[0].textContent
|
|
54
|
-
const text = (el.textContent
|
|
55
|
+
const aria = norm(el.getAttribute('aria-label'));
|
|
56
|
+
if (aria) return aria;
|
|
57
|
+
if (el.labels && el.labels[0]) return norm(el.labels[0].textContent);
|
|
58
|
+
const text = norm(el.textContent);
|
|
55
59
|
if (text && text.length <= 60) return text;
|
|
56
|
-
|
|
57
|
-
return value ? value.trim() : '';
|
|
60
|
+
return norm(el.getAttribute('value'));
|
|
58
61
|
};
|
|
59
62
|
|
|
60
|
-
const labelText = (el) => (el.labels && el.labels[0] ? el.labels[0].textContent
|
|
63
|
+
const labelText = (el) => (el.labels && el.labels[0] ? norm(el.labels[0].textContent) : '');
|
|
61
64
|
|
|
62
65
|
/** Ordered candidate targets, best first. */
|
|
63
66
|
const candidates = (el) => {
|
|
@@ -71,7 +74,7 @@ export const RECORDER_SOURCE = String.raw `
|
|
|
71
74
|
if (label) out.push({ label: label });
|
|
72
75
|
const placeholder = el.getAttribute('placeholder');
|
|
73
76
|
if (placeholder) out.push({ placeholder: placeholder });
|
|
74
|
-
const own = (el.textContent
|
|
77
|
+
const own = norm(el.textContent);
|
|
75
78
|
if (own && own.length <= 40) out.push({ text: own });
|
|
76
79
|
out.push({ css: cssPath(el) });
|
|
77
80
|
return out;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recorderInject.js","sourceRoot":"","sources":["../src/recorderInject.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAA
|
|
1
|
+
{"version":3,"file":"recorderInject.js","sourceRoot":"","sources":["../src/recorderInject.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiKxC,CAAC"}
|
package/dist/routes.js
CHANGED
|
@@ -7,6 +7,7 @@ import { AgentError } from "./types.js";
|
|
|
7
7
|
import { RecorderStore } from "./recorder.js";
|
|
8
8
|
import { performAction, snapshot } from "./control.js";
|
|
9
9
|
import { readGuide } from "./guide.js";
|
|
10
|
+
import { listArtifacts, listRuns, readArtifact } from "./archive.js";
|
|
10
11
|
export function buildRoutes(deps) {
|
|
11
12
|
const workspace = deps.workspace;
|
|
12
13
|
const sessions = deps.sessions ?? new SessionStore();
|
|
@@ -89,10 +90,36 @@ export function buildRoutes(deps) {
|
|
|
89
90
|
secrets: input.secrets ?? {},
|
|
90
91
|
headless: input.headless,
|
|
91
92
|
trawlProxyPort: input.proxyPort,
|
|
93
|
+
stepDelayMs: input.stepDelayMs,
|
|
94
|
+
closeAfterRun: input.closeAfterRun,
|
|
92
95
|
});
|
|
93
96
|
},
|
|
94
97
|
},
|
|
95
|
-
{
|
|
98
|
+
{
|
|
99
|
+
method: "GET",
|
|
100
|
+
path: "/runs",
|
|
101
|
+
handler: async (_r, p) => {
|
|
102
|
+
// Disk first (it outlives the process), then whatever is still running.
|
|
103
|
+
const archived = await listRuns(workspace, {
|
|
104
|
+
script: p.script,
|
|
105
|
+
limit: Number(p.limit ?? 50),
|
|
106
|
+
});
|
|
107
|
+
const live = runner
|
|
108
|
+
.list(50)
|
|
109
|
+
.filter((r) => r.status === "running" && (!p.script || r.script === p.script));
|
|
110
|
+
return { runs: [...live, ...archived.filter((a) => !live.some((l) => l.runId === a.runId))] };
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
method: "GET",
|
|
115
|
+
path: "/runs/:id/artifacts",
|
|
116
|
+
handler: async (_r, p) => ({ artifacts: await listArtifacts(workspace, p.id) }),
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
method: "GET",
|
|
120
|
+
path: "/runs/:id/artifact",
|
|
121
|
+
handler: async (_r, p) => readArtifact(workspace, p.id, p.path),
|
|
122
|
+
},
|
|
96
123
|
{
|
|
97
124
|
method: "GET",
|
|
98
125
|
path: "/runs/:id",
|
package/dist/routes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAoB,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
|
package/dist/runner.js
CHANGED
|
@@ -4,12 +4,14 @@ import path from "node:path";
|
|
|
4
4
|
import { AgentError } from "./types.js";
|
|
5
5
|
import { runInSandbox } from "./sandbox.js";
|
|
6
6
|
import { describeTarget, isRegExp, toLocator, toMatcher } from "./targets.js";
|
|
7
|
-
import { runDir } from "./workspace.js";
|
|
7
|
+
import { readScript, runDir } from "./workspace.js";
|
|
8
8
|
import { TrafficBuffer, describeMatcher, parseMatcher } from "./traffic.js";
|
|
9
9
|
import { interpolate } from "./interpolate.js";
|
|
10
10
|
import { makeMasker } from "./mask.js";
|
|
11
|
+
import { captureFrames, installCursor } from "./frames.js";
|
|
11
12
|
const DEFAULT_TIMEOUT = 15_000;
|
|
12
13
|
const MAX_SCRIPT_MS = 10 * 60_000;
|
|
14
|
+
const MAX_RUN_DEPTH = 10;
|
|
13
15
|
export class Runner {
|
|
14
16
|
deps;
|
|
15
17
|
runs = new Map();
|
|
@@ -71,8 +73,22 @@ export class Runner {
|
|
|
71
73
|
const traceOn = input.device.trace !== "off";
|
|
72
74
|
if (traceOn)
|
|
73
75
|
await session.context.tracing.start({ screenshots: true, snapshots: true });
|
|
76
|
+
// A recorded replay is only useful if you can see where the pointer went.
|
|
77
|
+
let frames = null;
|
|
78
|
+
if (input.device.video) {
|
|
79
|
+
await installCursor(session.context).catch(() => { });
|
|
80
|
+
frames = await captureFrames(page, path.join(dir, "frames"), input.device.videoFps ?? 5).catch(() => null);
|
|
81
|
+
if (!frames)
|
|
82
|
+
report.warnings.push("frame capture failed to start");
|
|
83
|
+
}
|
|
74
84
|
let timeout = DEFAULT_TIMEOUT;
|
|
75
85
|
let baseUrl = "";
|
|
86
|
+
const stepDelayMs = Math.max(0, input.stepDelayMs ?? input.device.stepDelayMs ?? 0);
|
|
87
|
+
// Composition can overlay variables for the script it calls, so the set in
|
|
88
|
+
// force is per-frame rather than fixed for the whole run.
|
|
89
|
+
let currentEnv = { ...input.env };
|
|
90
|
+
const scriptStack = input.scriptPath ? [input.scriptPath] : [];
|
|
91
|
+
const closeAfterRun = input.closeAfterRun ?? input.device.closeAfterRun ?? true;
|
|
76
92
|
let current = null;
|
|
77
93
|
let currentName;
|
|
78
94
|
const traffic = new TrafficBuffer();
|
|
@@ -99,11 +115,15 @@ export class Runner {
|
|
|
99
115
|
};
|
|
100
116
|
/** Wraps a step body: timing, failure classification, screenshot on failure. */
|
|
101
117
|
const tracked = (action, body) => async (...rawArgs) => {
|
|
102
|
-
const args = rawArgs.map((a) => interpolate(a,
|
|
118
|
+
const args = rawArgs.map((a) => interpolate(a, currentEnv));
|
|
103
119
|
const step = beginStep(action, args);
|
|
104
120
|
try {
|
|
105
121
|
const result = await body(...args);
|
|
106
122
|
endStep(step);
|
|
123
|
+
// A deliberate pause makes the replay watchable; it is not a wait —
|
|
124
|
+
// every step already auto-waits for its target.
|
|
125
|
+
if (stepDelayMs)
|
|
126
|
+
await page.waitForTimeout(stepDelayMs);
|
|
107
127
|
return result;
|
|
108
128
|
}
|
|
109
129
|
catch (err) {
|
|
@@ -129,7 +149,12 @@ export class Runner {
|
|
|
129
149
|
throw new AgentError("assertion", message, { expected, actual });
|
|
130
150
|
};
|
|
131
151
|
const scope = {
|
|
132
|
-
env:
|
|
152
|
+
env: new Proxy({}, {
|
|
153
|
+
get: (_t, key) => currentEnv[key],
|
|
154
|
+
has: (_t, key) => key in currentEnv,
|
|
155
|
+
ownKeys: () => Object.keys(currentEnv),
|
|
156
|
+
getOwnPropertyDescriptor: () => ({ enumerable: true, configurable: true }),
|
|
157
|
+
}),
|
|
133
158
|
secret: (name) => {
|
|
134
159
|
const value = input.secrets[name];
|
|
135
160
|
if (value === undefined)
|
|
@@ -294,6 +319,33 @@ export class Runner {
|
|
|
294
319
|
await page.screenshot({ path: path.join(dir, file) });
|
|
295
320
|
}),
|
|
296
321
|
note: tracked("note", async () => { }),
|
|
322
|
+
/** Compose scenarios: record login once, then call it from the rest. */
|
|
323
|
+
run: async (relPath, overlay) => {
|
|
324
|
+
const step = beginStep("run", overlay ? [relPath, overlay] : [relPath]);
|
|
325
|
+
endStep(step);
|
|
326
|
+
if (scriptStack.includes(relPath)) {
|
|
327
|
+
throw new AgentError("script", `run cycle: ${[...scriptStack, relPath].join(" → ")}`);
|
|
328
|
+
}
|
|
329
|
+
if (scriptStack.length >= MAX_RUN_DEPTH) {
|
|
330
|
+
throw new AgentError("script", `run nested deeper than ${MAX_RUN_DEPTH}`);
|
|
331
|
+
}
|
|
332
|
+
const code = await readScript(this.deps.workspace, relPath).catch(() => {
|
|
333
|
+
throw new AgentError("script", `no such script: ${relPath}`);
|
|
334
|
+
});
|
|
335
|
+
const previousEnv = currentEnv;
|
|
336
|
+
const previousName = currentName;
|
|
337
|
+
currentEnv = overlay ? { ...currentEnv, ...overlay } : currentEnv;
|
|
338
|
+
currentName = relPath;
|
|
339
|
+
scriptStack.push(relPath);
|
|
340
|
+
try {
|
|
341
|
+
await runInSandbox(code, scope, MAX_SCRIPT_MS);
|
|
342
|
+
}
|
|
343
|
+
finally {
|
|
344
|
+
scriptStack.pop();
|
|
345
|
+
currentEnv = previousEnv;
|
|
346
|
+
currentName = previousName;
|
|
347
|
+
}
|
|
348
|
+
},
|
|
297
349
|
step: async (name, fn) => {
|
|
298
350
|
const step = beginStep("step", [name]);
|
|
299
351
|
endStep(step);
|
|
@@ -340,6 +392,11 @@ export class Runner {
|
|
|
340
392
|
if (step)
|
|
341
393
|
step.flows.push({ method: observed.method, url: observed.url, status: observed.status });
|
|
342
394
|
}
|
|
395
|
+
if (frames) {
|
|
396
|
+
const { count, fps } = await frames.stop();
|
|
397
|
+
if (count > 0)
|
|
398
|
+
report.artifacts.frames = { dir: "frames", count, fps };
|
|
399
|
+
}
|
|
343
400
|
if (traceOn) {
|
|
344
401
|
const keep = input.device.trace === "always" || finalStatus !== "passed";
|
|
345
402
|
const tracePath = path.join(dir, "trace.zip");
|
|
@@ -348,10 +405,13 @@ export class Runner {
|
|
|
348
405
|
report.artifacts.trace = "trace.zip";
|
|
349
406
|
}
|
|
350
407
|
report.durationMs = Date.now() - report.startedAt;
|
|
351
|
-
if (ownSession)
|
|
408
|
+
if (ownSession && closeAfterRun) {
|
|
352
409
|
await this.deps.sessions.stop(session.sessionId);
|
|
353
|
-
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
354
412
|
this.deps.sessions.setState(session.sessionId, "idle");
|
|
413
|
+
report.sessionId = session.sessionId; // the window is still on screen
|
|
414
|
+
}
|
|
355
415
|
const mask = makeMasker(input.secrets);
|
|
356
416
|
const finished = mask({ ...report, status: finalStatus });
|
|
357
417
|
await fs.writeFile(path.join(dir, "report.json"), JSON.stringify(finished, null, 2), "utf8").catch(() => { });
|
package/dist/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/sessions.js
CHANGED
|
@@ -33,8 +33,6 @@ export class SessionStore {
|
|
|
33
33
|
`Install it with: pnpm exec playwright install ${device.browser}`);
|
|
34
34
|
}
|
|
35
35
|
const contextOptions = contextOptionsFor(device, options.trawlProxyPort ?? 8080);
|
|
36
|
-
if (device.video && options.videoDir)
|
|
37
|
-
contextOptions.recordVideo = { dir: options.videoDir };
|
|
38
36
|
const context = await browser.newContext(contextOptions);
|
|
39
37
|
const page = await context.newPage();
|
|
40
38
|
const live = {
|
package/dist/sessions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,QAAQ,EACR,OAAO,EACP,MAAM,GAKP,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAA6B,MAAM,YAAY,CAAC;AAInE,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAE9C,wDAAwD;AACxD,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,cAAsB;IACtE,MAAM,KAAK,GACT,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO;QAC3B,CAAC,CAAC,EAAE,MAAM,EAAE,oBAAoB,cAAc,EAAE,EAAE;QAClD,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ;YAC9B,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,GAAI,EAAE;YAC/B,CAAC,CAAC,SAAS,CAAC;IAElB,OAAO;QACL,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9E,CAAC;AACJ,CAAC;AAWD,MAAM,OAAO,YAAY;IACN,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE3D,KAAK,CAAC,KAAK,CAAC,MAAc,EAAE,UAAwB,EAAE;QACpD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;QACrD,IAAI,OAAgB,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,UAAU,CAClB,QAAQ,EACR,oBAAoB,MAAM,CAAC,OAAO,KAAM,GAAa,CAAC,OAAO,IAAI;gBAC/D,iDAAiD,MAAM,CAAC,OAAO,EAAE,CACpE,CAAC;QACJ,CAAC;QAED,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"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"}
|
package/dist/steps.js
CHANGED
package/dist/steps.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"steps.js","sourceRoot":"","sources":["../src/steps.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,QAAQ;IACR,QAAQ,EAAE,KAAK;IACf,aAAa;IACb,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ;IACnC,UAAU;IACV,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;IAChE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU;IAC/C,QAAQ;IACR,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,OAAO;IACnD,gBAAgB;IAChB,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa;IAC5D,WAAW,EAAE,aAAa,EAAE,YAAY;IACxC,kBAAkB;IAClB,eAAe,EAAE,gBAAgB,EAAE,iBAAiB;IACpD,QAAQ;IACR,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO;IACnD,OAAO;IACP,MAAM,EAAE,YAAY,EAAE,MAAM;CACpB,CAAC;AAIX,gGAAgG;AAChG,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ;IAC3E,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ;CACrD,CAAC"}
|
|
1
|
+
{"version":3,"file":"steps.js","sourceRoot":"","sources":["../src/steps.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,QAAQ;IACR,QAAQ,EAAE,KAAK;IACf,aAAa;IACb,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ;IACnC,UAAU;IACV,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;IAChE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU;IAC/C,QAAQ;IACR,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,OAAO;IACnD,gBAAgB;IAChB,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa;IAC5D,WAAW,EAAE,aAAa,EAAE,YAAY;IACxC,kBAAkB;IAClB,eAAe,EAAE,gBAAgB,EAAE,iBAAiB;IACpD,QAAQ;IACR,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO;IACnD,cAAc;IACd,KAAK;IACL,OAAO;IACP,MAAM,EAAE,YAAY,EAAE,MAAM;CACpB,CAAC;AAIX,gGAAgG;AAChG,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ;IAC3E,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ;CACrD,CAAC"}
|
package/dist/version.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Package version, reported by /health. */
|
|
2
|
-
export const AGENT_VERSION = "0.
|
|
2
|
+
export const AGENT_VERSION = "0.6.0";
|
|
3
3
|
/** Bumped whenever STEP_NAMES changes, so the plugin can demand an update. */
|
|
4
|
-
export const DSL_VERSION =
|
|
4
|
+
export const DSL_VERSION = 2;
|
|
5
5
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
|
@@ -42,6 +42,7 @@ click({ role: 'row', name: 'Заказ 42', within: { testId: 'orders' } })
|
|
|
42
42
|
`expectUrl`, `expectCount`, `expectAttr`
|
|
43
43
|
- HTTP assertions: `expectRequest`, `expectResponse`, `expectNoRequest`
|
|
44
44
|
- Reads: `getText`, `getValue`, `getAttr`, `getUrl`, `count`
|
|
45
|
+
- Composition: `run('scripts/login.js')`, `run('scripts/login.js', { USER: 'someone@example.com' })`
|
|
45
46
|
- Misc: `step(name, fn)`, `screenshot(name)`, `note(text)`
|
|
46
47
|
|
|
47
48
|
## Rules
|
|
@@ -49,7 +50,8 @@ click({ role: 'row', name: 'Заказ 42', within: { testId: 'orders' } })
|
|
|
49
50
|
1. **No `await`.** The runner inserts it. Reads return real values:
|
|
50
51
|
`const title = getText({ css: 'h1' })`.
|
|
51
52
|
2. **`{{VAR}}`** comes from the Trawl project env; an unknown name fails the run.
|
|
52
|
-
**`secret('NAME')`** reads the
|
|
53
|
+
`env.VAR` reads the same values in code. **`secret('NAME')`** reads the
|
|
54
|
+
Keychain — never paste a literal password.
|
|
53
55
|
3. **Prefer assertions over `sleep`.** Every step already auto-waits.
|
|
54
56
|
4. **Group with `step('name', () => { … })`** — the report shows the group name.
|
|
55
57
|
5. **HTTP matchers are a method plus a URL substring** (`'POST /api/login'`), or
|
|
@@ -57,3 +59,13 @@ click({ role: 'row', name: 'Заказ 42', within: { testId: 'orders' } })
|
|
|
57
59
|
first matching response not yet consumed, waiting up to the timeout.
|
|
58
60
|
6. **A failing step ends the run.** Steps after it never execute, so they do not
|
|
59
61
|
appear in the report.
|
|
62
|
+
7. **Compose instead of repeating.** Record login once and call it:
|
|
63
|
+
|
|
64
|
+
```js
|
|
65
|
+
run('scripts/login.js')
|
|
66
|
+
click({ role: 'link', name: 'Search' })
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The called script runs in the same browser, its steps appear in the report
|
|
70
|
+
under its path, and a second argument overlays variables for that call only
|
|
71
|
+
(`run('scripts/login.js', { USER: '{{ADMIN}}' })`). Cycles are refused.
|