reeval 0.5.0 → 0.6.1
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/THIRD_PARTY_NOTICES.md +5 -5
- package/assets/package.json +1 -1
- package/assets/pnpm-lock.yaml +61 -66
- package/dist/{agent-Dcnbp_qS.js → agent-BrqDHAx6.js} +5 -5
- package/dist/{agent-Dcnbp_qS.js.map → agent-BrqDHAx6.js.map} +1 -1
- package/dist/{agent-BDPZxZo6.js → agent-bHgHIPVD.js} +4 -4
- package/dist/{agent-BDPZxZo6.js.map → agent-bHgHIPVD.js.map} +1 -1
- package/dist/{analysis-1fqCRQJ5.js → analysis-BV3TCznv.js} +9 -5
- package/dist/analysis-BV3TCznv.js.map +1 -0
- package/dist/{assemble-Br5xWfoJ.js → assemble-BB_dcnfh.js} +37 -11
- package/dist/assemble-BB_dcnfh.js.map +1 -0
- package/dist/assemble-DcLLkwnB.js +2 -0
- package/dist/bridge/index.mjs +1 -1
- package/dist/capture-EvOaSXj_.js +2 -0
- package/dist/capture-tcMRp6ks.js +587 -0
- package/dist/capture-tcMRp6ks.js.map +1 -0
- package/dist/{cli-Ben0kbJt.js → cli-BM-qbqO_.js} +69 -51
- package/dist/cli-BM-qbqO_.js.map +1 -0
- package/dist/cli.js +2 -2
- package/dist/{command-DpR1iz_b.js → command-BT9i1I5S.js} +12 -12
- package/dist/{command-DpR1iz_b.js.map → command-BT9i1I5S.js.map} +1 -1
- package/dist/command-Bn_kbh3B.js +2 -0
- package/dist/{command-zD7IIwQF.js → command-BpoZJVeI.js} +13 -13
- package/dist/{command-zD7IIwQF.js.map → command-BpoZJVeI.js.map} +1 -1
- package/dist/{command-CmFpqrTW.js → command-DATlIXj1.js} +9 -9
- package/dist/{command-CmFpqrTW.js.map → command-DATlIXj1.js.map} +1 -1
- package/dist/{command-BZXB7JbK.js → command-DITkSzxp.js} +59 -17
- package/dist/command-DITkSzxp.js.map +1 -0
- package/dist/{commands-CkfvCaoN.js → commands-C0SFWd1T.js} +6 -6
- package/dist/{commands-CkfvCaoN.js.map → commands-C0SFWd1T.js.map} +1 -1
- package/dist/{commands-8xIhRt-7.js → commands-CDty3r_G.js} +1 -1
- package/dist/{config-kbc7kZz3.js → config-Cy_vLUbw.js} +11 -7
- package/dist/config-Cy_vLUbw.js.map +1 -0
- package/dist/db-4nMvBFNX.js +2 -0
- package/dist/{db-DYPkngEs.js → db-iskAs8Ox.js} +11 -8
- package/dist/db-iskAs8Ox.js.map +1 -0
- package/dist/{dist-D6co5uaT.js → dist-Dmm3bnKA.js} +4 -4
- package/dist/{dist-D6co5uaT.js.map → dist-Dmm3bnKA.js.map} +1 -1
- package/dist/{docker-C4H1eSjN.js → docker-B9wx9-KX.js} +8 -4
- package/dist/{docker-C4H1eSjN.js.map → docker-B9wx9-KX.js.map} +1 -1
- package/dist/{docker-BLqzfYMT.js → docker-Ctnty6xd.js} +2 -2
- package/dist/{docker-BLqzfYMT.js.map → docker-Ctnty6xd.js.map} +1 -1
- package/dist/{docker-CJkJ4-_n.js → docker-Di4o89kZ.js} +1 -1
- package/dist/{doctor-X2ba-e1Y.js → doctor-BMUVi-gC.js} +12 -12
- package/dist/{doctor-X2ba-e1Y.js.map → doctor-BMUVi-gC.js.map} +1 -1
- package/dist/duration-JsJrIWXq.js +26 -0
- package/dist/duration-JsJrIWXq.js.map +1 -0
- package/dist/{egress-CRQ7wCj8.js → egress-3bdvDu1s.js} +85 -23
- package/dist/{egress-CRQ7wCj8.js.map → egress-3bdvDu1s.js.map} +1 -1
- package/dist/{environment-D3sZUybY.js → environment-DiCljXMD.js} +4 -26
- package/dist/environment-DiCljXMD.js.map +1 -0
- package/dist/files-BM78_nnF.js +2 -0
- package/dist/{files-CO4Y4eRS.js → files-CITwkC4O.js} +2 -2
- package/dist/{files-CO4Y4eRS.js.map → files-CITwkC4O.js.map} +1 -1
- package/dist/files-C_CsTMtM.js +2 -0
- package/dist/{files-BLlrhU4-.js → files-Ca0d6Uq3.js} +2 -2
- package/dist/{files-BLlrhU4-.js.map → files-Ca0d6Uq3.js.map} +1 -1
- package/dist/{files-DiGDoSSw.js → files-DGhQZaXT.js} +7 -7
- package/dist/{files-DiGDoSSw.js.map → files-DGhQZaXT.js.map} +1 -1
- package/dist/files-vgLA9tcj.js +2 -0
- package/dist/{git-BZlPo1Rh.js → git-BzyBakoB.js} +2 -2
- package/dist/{git-BZlPo1Rh.js.map → git-BzyBakoB.js.map} +1 -1
- package/dist/harness.d.ts +1 -1
- package/dist/{header-CTTSGpy-.js → header-IE-uIvX0.js} +2 -2
- package/dist/{header-CTTSGpy-.js.map → header-IE-uIvX0.js.map} +1 -1
- package/dist/{images-CPfNRSuK.js → images-QBtOj-_q.js} +6 -6
- package/dist/{images-CPfNRSuK.js.map → images-QBtOj-_q.js.map} +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +24 -64
- package/dist/index.js.map +1 -1
- package/dist/{init-CquBKr3J.js → init-B47uIoHu.js} +5 -5
- package/dist/{init-CquBKr3J.js.map → init-B47uIoHu.js.map} +1 -1
- package/dist/init-DIAJuCs2.js +2 -0
- package/dist/{jiti-DWsGEgxD.js → jiti-BcJHCtrb.js} +2 -2
- package/dist/{jiti-DWsGEgxD.js.map → jiti-BcJHCtrb.js.map} +1 -1
- package/dist/judge.d.ts +1 -1
- package/dist/{model-BAB6ScG7.js → model-BeoRxCcJ.js} +1 -1
- package/dist/model-C_B5JrhL.js +2 -0
- package/dist/{model-CwxodD2e.js → model-Cp6NoAT3.js} +5 -3
- package/dist/model-Cp6NoAT3.js.map +1 -0
- package/dist/{model-DGafiJdy.js → model-CtrJdFi6.js} +41 -3
- package/dist/{model-DGafiJdy.js.map → model-CtrJdFi6.js.map} +1 -1
- package/dist/{node-B72WWfgg.js → node-Co7EXge0.js} +2 -2
- package/dist/{node-B72WWfgg.js.map → node-Co7EXge0.js.map} +1 -1
- package/dist/{options-BBLwgaSz.js → options-DVB78W8X.js} +45 -5
- package/dist/options-DVB78W8X.js.map +1 -0
- package/dist/{patch-CzT5wTZr.js → patch-CGCVipPu.js} +2 -2
- package/dist/{patch-CzT5wTZr.js.map → patch-CGCVipPu.js.map} +1 -1
- package/dist/{paths-CBvm6pap.js → paths-BmR-7tx3.js} +7 -3
- package/dist/{paths-CBvm6pap.js.map → paths-BmR-7tx3.js.map} +1 -1
- package/dist/{plan-4AO_VH20.js → plan-Bsge1_cc.js} +2 -2
- package/dist/{plan-4AO_VH20.js.map → plan-Bsge1_cc.js.map} +1 -1
- package/dist/{preflight-B8XgaXdX.js → preflight-B5ue4TlX.js} +1 -1
- package/dist/{preflight-Cl__EL9Y.js → preflight-BOstyJDX.js} +3 -3
- package/dist/{preflight-Cl__EL9Y.js.map → preflight-BOstyJDX.js.map} +1 -1
- package/dist/{prepare-BgzG6f6h.js → prepare-ChIEi8hP.js} +2 -2
- package/dist/{prepare-jmZNuhe5.js → prepare-jpXfdH-9.js} +6 -5
- package/dist/prepare-jpXfdH-9.js.map +1 -0
- package/dist/{provenance-rP7Unzb4.js → provenance-BTJCjEPg.js} +2 -2
- package/dist/{provenance-rP7Unzb4.js.map → provenance-BTJCjEPg.js.map} +1 -1
- package/dist/{providers-Cs0GAhfO.js → providers-BJCxWIm4.js} +3 -3
- package/dist/{providers-Cs0GAhfO.js.map → providers-BJCxWIm4.js.map} +1 -1
- package/dist/{providers-Dh6hQDI6.js → providers-DxVIaae1.js} +1 -1
- package/dist/query-BtLxk32J.js +2 -0
- package/dist/{query-BOtU7Phq.js → query-Cpe659ni.js} +2 -2
- package/dist/{query-BOtU7Phq.js.map → query-Cpe659ni.js.map} +1 -1
- package/dist/{questions-nUB6aKz_.js → questions-ZdT3JDyQ.js} +3 -3
- package/dist/{questions-nUB6aKz_.js.map → questions-ZdT3JDyQ.js.map} +1 -1
- package/dist/{results-EaWTGQtw.js → results-CiJzkjNI.js} +4 -4
- package/dist/{results-EaWTGQtw.js.map → results-CiJzkjNI.js.map} +1 -1
- package/dist/{root-Zeokqt3-.js → root-CvdRlRZX.js} +3 -3
- package/dist/{root-Zeokqt3-.js.map → root-CvdRlRZX.js.map} +1 -1
- package/dist/{sandbox-DsY0Xa_L.js → sandbox--ZXuscAZ.js} +3 -2
- package/dist/sandbox--ZXuscAZ.js.map +1 -0
- package/dist/sandbox.d.ts +1 -1
- package/dist/sandbox.js +1 -1
- package/dist/server-CN3lGbK-.js +2 -0
- package/dist/{server-DFCcG4kE.js → server-CSSXF89R.js} +9 -9
- package/dist/{server-DFCcG4kE.js.map → server-CSSXF89R.js.map} +1 -1
- package/dist/{source-ybqIFzmB.js → source-BcHShRWU.js} +2 -2
- package/dist/{source-ybqIFzmB.js.map → source-BcHShRWU.js.map} +1 -1
- package/dist/source-CxLRUqU2.js +2 -0
- package/dist/{src-DABrrexp.js → src-B3J1D0nL.js} +45 -45
- package/dist/{src-DABrrexp.js.map → src-B3J1D0nL.js.map} +1 -1
- package/dist/{src-CQXA5zkO.js → src-BRdoxjJS.js} +15 -15
- package/dist/{src-CQXA5zkO.js.map → src-BRdoxjJS.js.map} +1 -1
- package/dist/src-Ba3zMSdv.js +3 -0
- package/dist/{src-D0RdqpNb.js → src-BjVw2K4H.js} +4 -4
- package/dist/{src-D0RdqpNb.js.map → src-BjVw2K4H.js.map} +1 -1
- package/dist/src-BpVFmHqj.js +3 -0
- package/dist/src-CJONyPRm.js +3 -0
- package/dist/src-CLO4dUg7.js +3 -0
- package/dist/{src-DVWhOfrD.js → src-CdwJuMBO.js} +2 -2
- package/dist/{src-DVWhOfrD.js.map → src-CdwJuMBO.js.map} +1 -1
- package/dist/{src-OXjUr5ng.js → src-DQCjANtm.js} +1 -1
- package/dist/{src-Zqi4rheD.js → src-Dk96a9w7.js} +4 -4
- package/dist/{src-Zqi4rheD.js.map → src-Dk96a9w7.js.map} +1 -1
- package/dist/{src-BmBFlEIe.js → src-DyQJdvp2.js} +8 -6
- package/dist/{src-BmBFlEIe.js.map → src-DyQJdvp2.js.map} +1 -1
- package/dist/{src-CQzUdIZj.js → src-a6y9cGkR.js} +1 -1
- package/dist/src-yCDQ7kpQ.js +4 -0
- package/dist/state-CeYoWFWx.js +2 -0
- package/dist/{state-CWs2X2x8.js → state-evRYxV_q.js} +14 -14
- package/dist/{state-CWs2X2x8.js.map → state-evRYxV_q.js.map} +1 -1
- package/dist/studio-app/assets/{index-B1Pf3LAT.css → index-CUx6GoL5.css} +1 -1
- package/dist/studio-app/assets/{index-BYZWo5gl.js → index-WQPq5K3E.js} +9 -9
- package/dist/studio-app/index.html +2 -2
- package/dist/{summary-CxHRN1zB.js → summary-CIw18kb-.js} +6 -6
- package/dist/{summary-CxHRN1zB.js.map → summary-CIw18kb-.js.map} +1 -1
- package/dist/{summary-78yLjokt.js → summary-DTUCNA-v.js} +3 -3
- package/dist/{summary-78yLjokt.js.map → summary-DTUCNA-v.js.map} +1 -1
- package/dist/{tools-DCuVntbR.js → tools-By2WuNxm.js} +3 -3
- package/dist/{tools-DCuVntbR.js.map → tools-By2WuNxm.js.map} +1 -1
- package/dist/{types-BUWwRisO.d.ts → types-C2Gl05_c.d.ts} +101 -5
- package/dist/types-C5vI3g1C.js.map +1 -1
- package/dist/view/index.d.ts +14 -5
- package/dist/view/index.js +5 -5
- package/dist/views-BEurSpHC.js +3 -0
- package/dist/{views-CZDDDj2F.js → views-BJ0i1Iuw.js} +4 -4
- package/dist/{views-CZDDDj2F.js.map → views-BJ0i1Iuw.js.map} +1 -1
- package/dist/{worker-entry-DlriWSAs.js → worker-entry-mCctDzig.js} +2 -2
- package/dist/{worker-entry-DlriWSAs.js.map → worker-entry-mCctDzig.js.map} +1 -1
- package/dist/{workspace-oBK63kWs.js → workspace-Bl1SiRQa.js} +4 -4
- package/dist/{workspace-oBK63kWs.js.map → workspace-Bl1SiRQa.js.map} +1 -1
- package/dist/{workspace-BwKzynEj.js → workspace-CvAPfa8b.js} +1 -1
- package/package.json +4 -4
- package/dist/analysis-1fqCRQJ5.js.map +0 -1
- package/dist/assemble-Br5xWfoJ.js.map +0 -1
- package/dist/assemble-BriNtYfK.js +0 -2
- package/dist/cli-Ben0kbJt.js.map +0 -1
- package/dist/command-BZXB7JbK.js.map +0 -1
- package/dist/command-pIntI3Iq.js +0 -2
- package/dist/config-kbc7kZz3.js.map +0 -1
- package/dist/db-BgmkqBzz.js +0 -2
- package/dist/db-DYPkngEs.js.map +0 -1
- package/dist/environment-D3sZUybY.js.map +0 -1
- package/dist/files-BTF2wg0i.js +0 -2
- package/dist/files-BvHCFWgD.js +0 -2
- package/dist/files-CspMl_3t.js +0 -2
- package/dist/init-C5Kp2CVo.js +0 -2
- package/dist/model-Bip8dx2I.js +0 -2
- package/dist/model-CwxodD2e.js.map +0 -1
- package/dist/options-BBLwgaSz.js.map +0 -1
- package/dist/prepare-jmZNuhe5.js.map +0 -1
- package/dist/query-BjqPXDPV.js +0 -2
- package/dist/sandbox-DsY0Xa_L.js.map +0 -1
- package/dist/server-D62mXUew.js +0 -2
- package/dist/source-Cr87qm1N.js +0 -2
- package/dist/src-B3kHPyvg.js +0 -3
- package/dist/src-Bq2wa7fE.js +0 -3
- package/dist/src-CYBvNARj.js +0 -3
- package/dist/src-D2H8Rz6M.js +0 -4
- package/dist/src-DygwWk6l.js +0 -3
- package/dist/state-BOeZS-Wa.js +0 -2
- package/dist/views-BVu2pD9u.js +0 -3
|
@@ -0,0 +1,587 @@
|
|
|
1
|
+
import { t as parseDuration } from "./duration-JsJrIWXq.js";
|
|
2
|
+
import { s as cacheDir } from "./root-CvdRlRZX.js";
|
|
3
|
+
import { l as sha256 } from "./ids-Bp6ut7ZD.js";
|
|
4
|
+
import { i as debugTrace, r as debugLog } from "./attempt-CGPV3BZY.js";
|
|
5
|
+
import { n as clip, r as formatDuration } from "./text-gEcKjAyp.js";
|
|
6
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { homedir, tmpdir } from "node:os";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { createServer } from "node:net";
|
|
10
|
+
import { createHash } from "node:crypto";
|
|
11
|
+
import { spawn } from "node:child_process";
|
|
12
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
13
|
+
import { crc32, deflateSync, inflateRawSync } from "node:zlib";
|
|
14
|
+
//#region src/capture/zip.ts
|
|
15
|
+
const LOCAL = 67324752;
|
|
16
|
+
/** Extracts a zip (store or deflate) into `files` keyed by posix path. */
|
|
17
|
+
function unzip(bytes) {
|
|
18
|
+
const buf = Buffer.from(bytes);
|
|
19
|
+
const files = /* @__PURE__ */ new Map();
|
|
20
|
+
let i = 0;
|
|
21
|
+
while (i + 30 <= buf.length) {
|
|
22
|
+
if (buf.readUInt32LE(i) !== LOCAL) break;
|
|
23
|
+
const method = buf.readUInt16LE(i + 8);
|
|
24
|
+
const comp = buf.readUInt32LE(i + 18);
|
|
25
|
+
const nameLen = buf.readUInt16LE(i + 26);
|
|
26
|
+
const extra = buf.readUInt16LE(i + 28);
|
|
27
|
+
const name = buf.toString("utf8", i + 30, i + 30 + nameLen);
|
|
28
|
+
const start = i + 30 + nameLen + extra;
|
|
29
|
+
const raw = buf.subarray(start, start + comp);
|
|
30
|
+
if (name.endsWith("/")) {
|
|
31
|
+
i = start + comp;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (method === 0) files.set(name, Buffer.from(raw));
|
|
35
|
+
else if (method === 8) files.set(name, Buffer.from(inflateRawSync(raw)));
|
|
36
|
+
else throw new Error(`zip method ${method} is not supported (${name})`);
|
|
37
|
+
i = start + comp;
|
|
38
|
+
}
|
|
39
|
+
return files;
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
//#region src/capture/browser.ts
|
|
43
|
+
/** Pinned Chrome for Testing `chrome-headless-shell` build. */
|
|
44
|
+
const CHROME_VERSION = "140.0.7339.185";
|
|
45
|
+
const CHROME_NAME = "chrome-headless-shell";
|
|
46
|
+
function chromePlatform() {
|
|
47
|
+
if (process.platform === "darwin") return process.arch === "arm64" ? "mac-arm64" : "mac-x64";
|
|
48
|
+
if (process.platform === "win32") return "win64";
|
|
49
|
+
return "linux64";
|
|
50
|
+
}
|
|
51
|
+
function chromeUrl(platform) {
|
|
52
|
+
return `https://storage.googleapis.com/chrome-for-testing-public/${CHROME_VERSION}/${platform}/${CHROME_NAME}-${platform}.zip`;
|
|
53
|
+
}
|
|
54
|
+
function binaryName() {
|
|
55
|
+
return process.platform === "win32" ? `${CHROME_NAME}.exe` : CHROME_NAME;
|
|
56
|
+
}
|
|
57
|
+
async function downloadZip(url, onProgress, cacheLabel, signal) {
|
|
58
|
+
const res = await fetch(url, { signal });
|
|
59
|
+
if (!res.ok) throw new Error(`download failed: HTTP ${res.status}`);
|
|
60
|
+
const total = Number(res.headers.get("content-length")) || null;
|
|
61
|
+
const report = (received) => onProgress?.({
|
|
62
|
+
name: CHROME_NAME,
|
|
63
|
+
version: CHROME_VERSION,
|
|
64
|
+
bytes: total,
|
|
65
|
+
received,
|
|
66
|
+
cache: cacheLabel
|
|
67
|
+
});
|
|
68
|
+
report(0);
|
|
69
|
+
if (!res.body) return Buffer.from(await res.arrayBuffer());
|
|
70
|
+
const reader = res.body.getReader();
|
|
71
|
+
const chunks = [];
|
|
72
|
+
let received = 0;
|
|
73
|
+
let last = 0;
|
|
74
|
+
for (;;) {
|
|
75
|
+
const { done, value } = await reader.read();
|
|
76
|
+
if (done) break;
|
|
77
|
+
chunks.push(value);
|
|
78
|
+
received += value.length;
|
|
79
|
+
if (received - last >= 262144 || total && received === total) {
|
|
80
|
+
report(received);
|
|
81
|
+
last = received;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (received !== last) report(received);
|
|
85
|
+
return Buffer.concat(chunks);
|
|
86
|
+
}
|
|
87
|
+
function extractBinary(zip, dest, platform) {
|
|
88
|
+
const files = unzip(zip);
|
|
89
|
+
const needle = `/${binaryName()}`;
|
|
90
|
+
const entry = [...files.entries()].find(([name]) => name.endsWith(needle) || name === binaryName() || name.endsWith(`\\${binaryName()}`));
|
|
91
|
+
if (!entry) {
|
|
92
|
+
const names = [...files.keys()].slice(0, 8).join(", ");
|
|
93
|
+
throw new Error(`zip has no ${binaryName()} (saw ${names || "nothing"})`);
|
|
94
|
+
}
|
|
95
|
+
const prefix = entry[0].slice(0, -binaryName().length);
|
|
96
|
+
mkdirSync(dest, { recursive: true });
|
|
97
|
+
for (const [name, data] of files) {
|
|
98
|
+
const rel = prefix && name.startsWith(prefix) ? name.slice(prefix.length) : name;
|
|
99
|
+
if (!rel || rel.endsWith("/")) continue;
|
|
100
|
+
const target = join(dest, ...rel.split("/"));
|
|
101
|
+
mkdirSync(join(target, ".."), { recursive: true });
|
|
102
|
+
writeFileSync(target, data);
|
|
103
|
+
}
|
|
104
|
+
const bin = join(dest, binaryName());
|
|
105
|
+
if (!existsSync(bin)) writeFileSync(bin, entry[1]);
|
|
106
|
+
if (process.platform !== "win32") chmodSync(bin, 493);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Returns the cached binary, downloading on a miss. `onProgress` runs only for a download.
|
|
110
|
+
*/
|
|
111
|
+
async function ensureChrome(cacheRoot, options = { cacheLabel: cacheRoot }) {
|
|
112
|
+
const platform = chromePlatform();
|
|
113
|
+
const dest = join(cacheRoot, CHROME_NAME, CHROME_VERSION, platform);
|
|
114
|
+
const bin = join(dest, binaryName());
|
|
115
|
+
if (existsSync(bin)) return bin;
|
|
116
|
+
mkdirSync(join(cacheRoot, CHROME_NAME, CHROME_VERSION), { recursive: true });
|
|
117
|
+
const partial = `${dest}.${process.pid}.partial`;
|
|
118
|
+
rmSync(partial, {
|
|
119
|
+
recursive: true,
|
|
120
|
+
force: true
|
|
121
|
+
});
|
|
122
|
+
try {
|
|
123
|
+
extractBinary(await downloadZip(chromeUrl(platform), options.onProgress, options.cacheLabel, options.signal), partial, platform);
|
|
124
|
+
try {
|
|
125
|
+
renameSync(partial, dest);
|
|
126
|
+
} catch (error) {
|
|
127
|
+
rmSync(partial, {
|
|
128
|
+
recursive: true,
|
|
129
|
+
force: true
|
|
130
|
+
});
|
|
131
|
+
if (!existsSync(bin)) throw error;
|
|
132
|
+
}
|
|
133
|
+
} catch (error) {
|
|
134
|
+
rmSync(partial, {
|
|
135
|
+
recursive: true,
|
|
136
|
+
force: true
|
|
137
|
+
});
|
|
138
|
+
if (existsSync(bin)) return bin;
|
|
139
|
+
throw error;
|
|
140
|
+
}
|
|
141
|
+
return bin;
|
|
142
|
+
}
|
|
143
|
+
var Cdp = class {
|
|
144
|
+
#ws;
|
|
145
|
+
#next = 0;
|
|
146
|
+
#pending = /* @__PURE__ */ new Map();
|
|
147
|
+
#events = /* @__PURE__ */ new Map();
|
|
148
|
+
constructor(ws) {
|
|
149
|
+
this.#ws = ws;
|
|
150
|
+
ws.addEventListener("message", (ev) => {
|
|
151
|
+
const msg = JSON.parse(String(ev.data));
|
|
152
|
+
if (msg.id !== void 0) {
|
|
153
|
+
const p = this.#pending.get(msg.id);
|
|
154
|
+
if (!p) return;
|
|
155
|
+
this.#pending.delete(msg.id);
|
|
156
|
+
if (msg.error) p.reject(new Error(msg.error.message));
|
|
157
|
+
else p.resolve(msg.result);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (msg.method) for (const fn of this.#events.get(msg.method) ?? []) fn(msg);
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
on(method, fn) {
|
|
164
|
+
const list = this.#events.get(method) ?? [];
|
|
165
|
+
list.push(fn);
|
|
166
|
+
this.#events.set(method, list);
|
|
167
|
+
}
|
|
168
|
+
send(method, params) {
|
|
169
|
+
const id = ++this.#next;
|
|
170
|
+
this.#ws.send(JSON.stringify({
|
|
171
|
+
id,
|
|
172
|
+
method,
|
|
173
|
+
params
|
|
174
|
+
}));
|
|
175
|
+
return new Promise((resolve, reject) => this.#pending.set(id, {
|
|
176
|
+
resolve,
|
|
177
|
+
reject
|
|
178
|
+
}));
|
|
179
|
+
}
|
|
180
|
+
close() {
|
|
181
|
+
this.#ws.close();
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
function waitForPortFile(file, timeoutMs) {
|
|
185
|
+
const deadline = Date.now() + timeoutMs;
|
|
186
|
+
return new Promise((resolve, reject) => {
|
|
187
|
+
const tick = () => {
|
|
188
|
+
if (existsSync(file)) {
|
|
189
|
+
const line = readFileSync(file, "utf8").split(/\r?\n/)[0];
|
|
190
|
+
const port = Number(line);
|
|
191
|
+
if (port > 0) {
|
|
192
|
+
resolve(port);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (Date.now() > deadline) {
|
|
197
|
+
reject(/* @__PURE__ */ new Error("chrome-headless-shell did not open a DevTools port"));
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
setTimeout(tick, 50);
|
|
201
|
+
};
|
|
202
|
+
tick();
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
function pickPageDebuggerUrl(targets) {
|
|
206
|
+
return targets.find((t) => t.webSocketDebuggerUrl && t.type !== "browser")?.webSocketDebuggerUrl;
|
|
207
|
+
}
|
|
208
|
+
async function pageDebuggerUrl(port, timeoutMs) {
|
|
209
|
+
const deadline = Date.now() + timeoutMs;
|
|
210
|
+
const listPages = async () => {
|
|
211
|
+
const res = await fetch(`http://127.0.0.1:${port}/json/list`);
|
|
212
|
+
if (!res.ok) return void 0;
|
|
213
|
+
return pickPageDebuggerUrl(await res.json());
|
|
214
|
+
};
|
|
215
|
+
for (;;) {
|
|
216
|
+
const url = await listPages();
|
|
217
|
+
if (url) return url;
|
|
218
|
+
if (Date.now() > deadline) break;
|
|
219
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
220
|
+
}
|
|
221
|
+
const version = await (await fetch(`http://127.0.0.1:${port}/json/version`)).json();
|
|
222
|
+
if (!version.webSocketDebuggerUrl) throw new Error("chrome-headless-shell reported no DevTools URL");
|
|
223
|
+
const browser = await cdpConnect(version.webSocketDebuggerUrl, timeoutMs);
|
|
224
|
+
try {
|
|
225
|
+
await browser.send("Target.createTarget", { url: "about:blank" });
|
|
226
|
+
} finally {
|
|
227
|
+
browser.close();
|
|
228
|
+
}
|
|
229
|
+
const created = await listPages();
|
|
230
|
+
if (!created) throw new Error("chrome-headless-shell reported no page target");
|
|
231
|
+
return created;
|
|
232
|
+
}
|
|
233
|
+
async function cdpConnect(url, timeoutMs) {
|
|
234
|
+
const ws = new WebSocket(url);
|
|
235
|
+
await new Promise((resolve, reject) => {
|
|
236
|
+
const t = setTimeout(() => reject(/* @__PURE__ */ new Error("CDP websocket timed out")), timeoutMs);
|
|
237
|
+
ws.addEventListener("open", () => {
|
|
238
|
+
clearTimeout(t);
|
|
239
|
+
resolve();
|
|
240
|
+
});
|
|
241
|
+
ws.addEventListener("error", () => {
|
|
242
|
+
clearTimeout(t);
|
|
243
|
+
reject(/* @__PURE__ */ new Error("CDP websocket failed"));
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
return new Cdp(ws);
|
|
247
|
+
}
|
|
248
|
+
/** Navigate `url` and return a PNG from `Page.captureScreenshot`. */
|
|
249
|
+
async function screenshotWithChrome(bin, url, viewport, timeoutMs) {
|
|
250
|
+
const userData = join(tmpdir(), `reeval-chrome-${process.pid}-${Date.now()}`);
|
|
251
|
+
mkdirSync(userData, { recursive: true });
|
|
252
|
+
const child = spawn(bin, [
|
|
253
|
+
"--headless",
|
|
254
|
+
"--disable-gpu",
|
|
255
|
+
"--no-sandbox",
|
|
256
|
+
"--disable-dev-shm-usage",
|
|
257
|
+
"--hide-scrollbars",
|
|
258
|
+
"--remote-allow-origins=*",
|
|
259
|
+
`--window-size=${viewport.width},${viewport.height}`,
|
|
260
|
+
`--user-data-dir=${userData}`,
|
|
261
|
+
"--remote-debugging-port=0",
|
|
262
|
+
"about:blank"
|
|
263
|
+
], { stdio: [
|
|
264
|
+
"ignore",
|
|
265
|
+
"ignore",
|
|
266
|
+
"pipe"
|
|
267
|
+
] });
|
|
268
|
+
try {
|
|
269
|
+
const cdp = await cdpConnect(await pageDebuggerUrl(await waitForPortFile(join(userData, "DevToolsActivePort"), timeoutMs), timeoutMs), timeoutMs);
|
|
270
|
+
try {
|
|
271
|
+
await cdp.send("Page.enable");
|
|
272
|
+
await cdp.send("Emulation.setDeviceMetricsOverride", {
|
|
273
|
+
width: viewport.width,
|
|
274
|
+
height: viewport.height,
|
|
275
|
+
deviceScaleFactor: 1,
|
|
276
|
+
mobile: false
|
|
277
|
+
});
|
|
278
|
+
const loaded = new Promise((resolve) => {
|
|
279
|
+
cdp.on("Page.loadEventFired", () => resolve());
|
|
280
|
+
});
|
|
281
|
+
await cdp.send("Page.navigate", { url });
|
|
282
|
+
await Promise.race([loaded, new Promise((_, reject) => setTimeout(() => reject(/* @__PURE__ */ new Error("page load timed out")), timeoutMs))]);
|
|
283
|
+
const shot = await cdp.send("Page.captureScreenshot", { format: "png" });
|
|
284
|
+
if (!shot.data) throw new Error("Page.captureScreenshot returned no data");
|
|
285
|
+
return Buffer.from(shot.data, "base64");
|
|
286
|
+
} finally {
|
|
287
|
+
cdp.close();
|
|
288
|
+
}
|
|
289
|
+
} finally {
|
|
290
|
+
child.kill("SIGKILL");
|
|
291
|
+
rmSync(userData, {
|
|
292
|
+
recursive: true,
|
|
293
|
+
force: true
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
//#endregion
|
|
298
|
+
//#region src/capture/poll.ts
|
|
299
|
+
/** Any HTTP response, including 404, means something accepted the connection. */
|
|
300
|
+
async function pollHttp(url, timeoutMs, signal) {
|
|
301
|
+
const deadline = Date.now() + timeoutMs;
|
|
302
|
+
let last;
|
|
303
|
+
while (Date.now() < deadline) {
|
|
304
|
+
signal?.throwIfAborted();
|
|
305
|
+
const left = Math.max(1, deadline - Date.now());
|
|
306
|
+
try {
|
|
307
|
+
await fetch(url, { signal: AbortSignal.any([AbortSignal.timeout(Math.min(1e3, left)), ...signal ? [signal] : []]) });
|
|
308
|
+
return;
|
|
309
|
+
} catch (error) {
|
|
310
|
+
last = error;
|
|
311
|
+
if (signal?.aborted) throw error;
|
|
312
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
throw last instanceof Error ? last : /* @__PURE__ */ new Error("poll timed out");
|
|
316
|
+
}
|
|
317
|
+
//#endregion
|
|
318
|
+
//#region src/capture/stub.ts
|
|
319
|
+
const PNG_SIG = Buffer.from([
|
|
320
|
+
137,
|
|
321
|
+
80,
|
|
322
|
+
78,
|
|
323
|
+
71,
|
|
324
|
+
13,
|
|
325
|
+
10,
|
|
326
|
+
26,
|
|
327
|
+
10
|
|
328
|
+
]);
|
|
329
|
+
function chunk(type, data) {
|
|
330
|
+
const body = Buffer.concat([Buffer.from(type, "ascii"), data]);
|
|
331
|
+
const out = Buffer.alloc(12 + data.length);
|
|
332
|
+
out.writeUInt32BE(data.length, 0);
|
|
333
|
+
body.copy(out, 4);
|
|
334
|
+
out.writeUInt32BE(crc32(body), 8 + data.length);
|
|
335
|
+
return out;
|
|
336
|
+
}
|
|
337
|
+
/** A valid 1×1 PNG whose bytes are unique for `(name, port, path, viewport)`. */
|
|
338
|
+
function stubPng(name, port, path, viewport) {
|
|
339
|
+
const digest = createHash("sha256").update(`${name}\0${port}\0${path}\0${viewport.width}x${viewport.height}`).digest();
|
|
340
|
+
const ihdr = Buffer.alloc(13);
|
|
341
|
+
ihdr.writeUInt32BE(1, 0);
|
|
342
|
+
ihdr.writeUInt32BE(1, 4);
|
|
343
|
+
ihdr[8] = 8;
|
|
344
|
+
ihdr[9] = 2;
|
|
345
|
+
const scanline = Buffer.from([
|
|
346
|
+
0,
|
|
347
|
+
digest[0] ?? 0,
|
|
348
|
+
digest[1] ?? 0,
|
|
349
|
+
digest[2] ?? 0
|
|
350
|
+
]);
|
|
351
|
+
const idat = deflateSync(scanline);
|
|
352
|
+
const text = Buffer.concat([Buffer.from("Comment\0", "ascii"), Buffer.from(digest.toString("hex"), "ascii")]);
|
|
353
|
+
return Buffer.concat([
|
|
354
|
+
PNG_SIG,
|
|
355
|
+
chunk("IHDR", ihdr),
|
|
356
|
+
chunk("tEXt", text),
|
|
357
|
+
chunk("IDAT", idat),
|
|
358
|
+
chunk("IEND", Buffer.alloc(0))
|
|
359
|
+
]);
|
|
360
|
+
}
|
|
361
|
+
//#endregion
|
|
362
|
+
//#region src/capture/index.ts
|
|
363
|
+
/** Default CSS pixels when the call and cascade omit `viewport`. */
|
|
364
|
+
const DEFAULT_VIEWPORT = {
|
|
365
|
+
width: 1280,
|
|
366
|
+
height: 720
|
|
367
|
+
};
|
|
368
|
+
const CAPTURE_NAME = /^[a-z0-9_-]+$/;
|
|
369
|
+
/** `~/.cache/reeval` when that's the resolved dir; otherwise the absolute path. */
|
|
370
|
+
function cacheLabel(dir = cacheDir()) {
|
|
371
|
+
const home = homedir();
|
|
372
|
+
if (dir.replaceAll("\\", "/") === join(home, ".cache", "reeval").replaceAll("\\", "/")) return "~/.cache/reeval";
|
|
373
|
+
return dir;
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Env is named first when both refuse. `undefined` means the host binary is allowed
|
|
377
|
+
* (the fake tier still never downloads).
|
|
378
|
+
*/
|
|
379
|
+
function refusedBrowser(capture) {
|
|
380
|
+
if (process.env.REEVAL_CAPTURE_BROWSER === "0") return "c.capture() is refused: REEVAL_CAPTURE_BROWSER=0";
|
|
381
|
+
if (capture.browser === false) return "c.capture() is refused: capture.browser is false";
|
|
382
|
+
}
|
|
383
|
+
function resolveCaptureTarget(target) {
|
|
384
|
+
if (typeof target === "number") {
|
|
385
|
+
if (!(Number.isInteger(target) && target >= 1 && target <= 65535)) throw new Error(`c.capture() port is a container port from 1 to 65535 (got ${String(target)})`);
|
|
386
|
+
return target;
|
|
387
|
+
}
|
|
388
|
+
if (target !== null && typeof target === "object" && typeof target.port === "number" && typeof target.kill === "function") return resolveCaptureTarget(target.port);
|
|
389
|
+
throw new Error("c.capture() needs a port or a ServeHandle as the first argument");
|
|
390
|
+
}
|
|
391
|
+
/** Artifact name from a path: `/login` → `login`, `/foo/bar` → `foo-bar`, `/` → `root`. */
|
|
392
|
+
function nameFromPath(path) {
|
|
393
|
+
return (path.split(/[?#]/, 1)[0] ?? "").replaceAll("\\", "/").split("/").filter(Boolean).join("-").toLowerCase().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "") || "root";
|
|
394
|
+
}
|
|
395
|
+
function resolveCaptureCall(target, call, cascade) {
|
|
396
|
+
if (call && Object.hasOwn(call, "port")) throw new Error("c.capture() takes the port as the first argument, not in the options");
|
|
397
|
+
const port = resolveCaptureTarget(target);
|
|
398
|
+
const path = call?.path || "/";
|
|
399
|
+
const name = call?.name ?? nameFromPath(path);
|
|
400
|
+
checkCaptureName(name);
|
|
401
|
+
return {
|
|
402
|
+
port,
|
|
403
|
+
name,
|
|
404
|
+
path,
|
|
405
|
+
viewport: call?.viewport ?? cascade.viewport ?? DEFAULT_VIEWPORT,
|
|
406
|
+
timeoutMs: parseDuration(call?.timeout ?? cascade.timeout ?? "60s")
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
function checkCaptureName(name) {
|
|
410
|
+
if (!CAPTURE_NAME.test(name)) throw new Error(`c.capture() name must match [a-z0-9_-]+ (got ${JSON.stringify(name)})`);
|
|
411
|
+
}
|
|
412
|
+
/** A free host port. Closed before the promise resolves, so the caller can bind it. */
|
|
413
|
+
function allocatePort() {
|
|
414
|
+
return new Promise((resolve, reject) => {
|
|
415
|
+
const server = createServer();
|
|
416
|
+
server.once("error", reject);
|
|
417
|
+
server.listen(0, "127.0.0.1", () => {
|
|
418
|
+
const addr = server.address();
|
|
419
|
+
const port = typeof addr === "object" && addr ? addr.port : 0;
|
|
420
|
+
server.close((error) => error ? reject(error) : resolve(port));
|
|
421
|
+
});
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
/** Origin plus a path (`/login`), without a doubled slash. */
|
|
425
|
+
function pageUrl(origin, path) {
|
|
426
|
+
const base = origin.endsWith("/") ? origin : `${origin}/`;
|
|
427
|
+
const rel = path.startsWith("/") ? path.slice(1) : path;
|
|
428
|
+
return new URL(rel, base).href;
|
|
429
|
+
}
|
|
430
|
+
//#endregion
|
|
431
|
+
//#region src/attempt/checks.ts
|
|
432
|
+
/** Runs a check or setup step with the checks' brokered secrets swapped in (see brokerPhases). */
|
|
433
|
+
const asCheck = (a, fn) => a.phases ? a.phases.checks(fn) : fn();
|
|
434
|
+
function requireSandbox(a, who = "c.exec() or c.readFile()") {
|
|
435
|
+
if (!a.sandbox) throw new Error(`No sandbox yet: call c.send() or await c.sandbox() before ${who}`);
|
|
436
|
+
return a.sandbox;
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Phase 4, checks: `c.exec` runs with the checks' variables and secrets, each run recorded and
|
|
440
|
+
* timed; `c.readFile` reads the sandbox as is.
|
|
441
|
+
*/
|
|
442
|
+
function createChecks(a) {
|
|
443
|
+
const checkEnv = () => a.env?.checkVars ?? {};
|
|
444
|
+
const execForeground = async (command) => {
|
|
445
|
+
const box = requireSandbox(a);
|
|
446
|
+
const start = performance.now();
|
|
447
|
+
a.report({
|
|
448
|
+
kind: "check-start",
|
|
449
|
+
command
|
|
450
|
+
});
|
|
451
|
+
const r = await a.timed("checksMs", () => asCheck(a, () => box.exec(command, {
|
|
452
|
+
signal: a.signal,
|
|
453
|
+
env: checkEnv()
|
|
454
|
+
})));
|
|
455
|
+
const durationMs = Math.round(performance.now() - start);
|
|
456
|
+
a.record.checks.push({
|
|
457
|
+
command,
|
|
458
|
+
...r,
|
|
459
|
+
durationMs
|
|
460
|
+
});
|
|
461
|
+
debugLog("check", `$ ${clip(command, 160)} → exit ${r.exitCode} · ${formatDuration(durationMs)}`);
|
|
462
|
+
debugTrace("check", "output", {
|
|
463
|
+
command,
|
|
464
|
+
...r,
|
|
465
|
+
durationMs
|
|
466
|
+
}, `check output: ${clip(command, 80)}`);
|
|
467
|
+
a.report({
|
|
468
|
+
kind: "check-end",
|
|
469
|
+
command,
|
|
470
|
+
exitCode: r.exitCode,
|
|
471
|
+
ms: durationMs
|
|
472
|
+
});
|
|
473
|
+
return r;
|
|
474
|
+
};
|
|
475
|
+
async function exec(command, options) {
|
|
476
|
+
if (options?.background) {
|
|
477
|
+
const { startBackground } = await import("./capture-EvOaSXj_.js");
|
|
478
|
+
return startBackground(a, command);
|
|
479
|
+
}
|
|
480
|
+
return execForeground(command);
|
|
481
|
+
}
|
|
482
|
+
const readFile = (path) => requireSandbox(a).readFile(path);
|
|
483
|
+
return {
|
|
484
|
+
exec,
|
|
485
|
+
readFile
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
//#endregion
|
|
489
|
+
//#region src/attempt/capture.ts
|
|
490
|
+
const BG_LOG = "/tmp/reeval-bg.log";
|
|
491
|
+
/** Starts `command` without waiting for exit. Teardown kills it if the eval didn't. */
|
|
492
|
+
async function startBackground(a, command, extraEnv = {}) {
|
|
493
|
+
const box = requireSandbox(a);
|
|
494
|
+
const wrapped = `${command} >${BG_LOG} 2>&1 & echo $!`;
|
|
495
|
+
const r = await asCheck(a, () => box.exec(wrapped, {
|
|
496
|
+
signal: a.signal,
|
|
497
|
+
env: {
|
|
498
|
+
...a.env?.checkVars ?? {},
|
|
499
|
+
...extraEnv
|
|
500
|
+
}
|
|
501
|
+
}));
|
|
502
|
+
const pid = r.stdout.trim().split(/\s+/).at(-1) ?? "";
|
|
503
|
+
if (!/^\d+$/.test(pid)) throw new Error(`c.exec({ background: true }) did not start (no pid):\n${(r.stderr || r.stdout).trim()}`);
|
|
504
|
+
let killed = false;
|
|
505
|
+
const handle = { async kill() {
|
|
506
|
+
if (killed) return;
|
|
507
|
+
killed = true;
|
|
508
|
+
const win = a.spec.sandbox.kind === "fake" && process.platform === "win32" ? `; wp=$(tr -d '\\r\\n' < /proc/${pid}/winpid 2>/dev/null) && taskkill /F /PID "$wp" >/dev/null 2>&1 || true` : "";
|
|
509
|
+
await box.exec(`kill -9 ${pid} 2>/dev/null || true${win}`).catch(() => {});
|
|
510
|
+
} };
|
|
511
|
+
a.backgrounds.push(handle);
|
|
512
|
+
return handle;
|
|
513
|
+
}
|
|
514
|
+
async function serveCommand(a, command, port) {
|
|
515
|
+
const bound = port ?? await allocatePort();
|
|
516
|
+
return {
|
|
517
|
+
...await startBackground(a, command, { PORT: String(bound) }),
|
|
518
|
+
port: bound
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
async function capturePage(a, target, call) {
|
|
522
|
+
const refused = refusedBrowser(a.spec.capture);
|
|
523
|
+
if (refused) throw new Error(refused);
|
|
524
|
+
const resolved = resolveCaptureCall(target, call, a.spec.capture);
|
|
525
|
+
if (a.captureNames.has(resolved.name)) throw new Error(`c.capture() reused the name "${resolved.name}"`);
|
|
526
|
+
const box = requireSandbox(a, "c.capture()");
|
|
527
|
+
if (!box.getPortEndpoint) throw new Error("c.capture() needs a sandbox that can tunnel a port");
|
|
528
|
+
const { url: origin } = await box.getPortEndpoint({
|
|
529
|
+
port: resolved.port,
|
|
530
|
+
protocol: "http"
|
|
531
|
+
});
|
|
532
|
+
try {
|
|
533
|
+
await pollHttp(pageUrl(origin, "/"), resolved.timeoutMs, a.signal);
|
|
534
|
+
} catch {
|
|
535
|
+
throw new Error(`nothing listening on port ${resolved.port}`);
|
|
536
|
+
}
|
|
537
|
+
a.captureNames.add(resolved.name);
|
|
538
|
+
const png = a.spec.sandbox.kind === "fake" ? stubPng(resolved.name, resolved.port, resolved.path, resolved.viewport) : await shot(a, pageUrl(origin, resolved.path), resolved.viewport, resolved.timeoutMs);
|
|
539
|
+
const digest = sha256(png);
|
|
540
|
+
const file = {
|
|
541
|
+
path: `artifacts/${resolved.name}.png`,
|
|
542
|
+
sha256: digest,
|
|
543
|
+
bytes: png.length
|
|
544
|
+
};
|
|
545
|
+
a.record.artifacts = a.record.artifacts ?? [];
|
|
546
|
+
a.record.artifacts.push({
|
|
547
|
+
name: resolved.name,
|
|
548
|
+
mediaType: "image/png",
|
|
549
|
+
sha256: digest,
|
|
550
|
+
bytes: png.length,
|
|
551
|
+
capture: {
|
|
552
|
+
port: resolved.port,
|
|
553
|
+
path: resolved.path,
|
|
554
|
+
viewport: resolved.viewport
|
|
555
|
+
}
|
|
556
|
+
});
|
|
557
|
+
a.artifactBlobs.set(resolved.name, png);
|
|
558
|
+
return {
|
|
559
|
+
name: resolved.name,
|
|
560
|
+
port: resolved.port,
|
|
561
|
+
path: resolved.path,
|
|
562
|
+
viewport: resolved.viewport,
|
|
563
|
+
file
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
async function shot(a, url, viewport, timeoutMs) {
|
|
567
|
+
const cache = cacheDir();
|
|
568
|
+
return screenshotWithChrome(await ensureChrome(cache, {
|
|
569
|
+
cacheLabel: cacheLabel(cache),
|
|
570
|
+
signal: a.signal,
|
|
571
|
+
onProgress: (p) => a.report({
|
|
572
|
+
kind: "browser-download",
|
|
573
|
+
...p
|
|
574
|
+
})
|
|
575
|
+
}), url, viewport, timeoutMs);
|
|
576
|
+
}
|
|
577
|
+
/** Writes PNG sidecars next to the staging eval JSON so redact never sees the bytes. */
|
|
578
|
+
async function writeCaptureSidecars(stagingDir, recordFile, blobs) {
|
|
579
|
+
if (blobs.size === 0) return;
|
|
580
|
+
const dir = join(stagingDir, "evals", recordFile.replace(/\.json$/, ".artifacts"));
|
|
581
|
+
await mkdir(dir, { recursive: true });
|
|
582
|
+
for (const [name, png] of blobs) await writeFile(join(dir, `${name}.png`), png);
|
|
583
|
+
}
|
|
584
|
+
//#endregion
|
|
585
|
+
export { asCheck as a, writeCaptureSidecars as i, serveCommand as n, createChecks as o, startBackground as r, capturePage as t };
|
|
586
|
+
|
|
587
|
+
//# sourceMappingURL=capture-tcMRp6ks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-tcMRp6ks.js","names":[],"sources":["../src/capture/zip.ts","../src/capture/browser.ts","../src/capture/poll.ts","../src/capture/stub.ts","../src/capture/index.ts","../src/attempt/checks.ts","../src/attempt/capture.ts"],"mappings":"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"}
|