mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-11-12 22:56:58 +01:00
47 lines
2.6 KiB
TypeScript
47 lines
2.6 KiB
TypeScript
import { spawnSync } from "node:child_process";
|
|
import { randomUUID } from "node:crypto";
|
|
import path from "node:path";
|
|
|
|
const root = path.resolve(import.meta.dirname, "../..");
|
|
export const STOCK_PREFLIGHT_ENV = "PAPERCLIP_RUNNER_E2E_STOCK_PREFLIGHT";
|
|
|
|
// Comparison-ref admission and retry policy. Ordinary PR sources are unchanged.
|
|
export function requiresStockHarnessPrerequisites(suiteId: string) {
|
|
return suiteId === "stock-harness" || suiteId === "hiring-templates";
|
|
}
|
|
export function effectiveAutomaticRetries(suiteId: string, configured: number) {
|
|
return suiteId === "hiring-templates" ? 0 : configured;
|
|
}
|
|
|
|
// An allowlist keeps every provider credential, ambient auth override, and GH
|
|
// token out of the prerequisite subprocess, including secrets added later.
|
|
export function stockPreflightEnvironment(source: NodeJS.ProcessEnv): NodeJS.ProcessEnv {
|
|
return Object.fromEntries([
|
|
"PATH", "HOME", "TMPDIR", "TMP", "TEMP", "SYSTEMROOT", "LANG", "LC_ALL",
|
|
"CARGO_HOME", "RUSTUP_HOME", "CI", "GITHUB_ACTIONS",
|
|
].flatMap(name => source[name] === undefined ? [] : [[name, source[name]]]));
|
|
}
|
|
|
|
export function verifyStockHarnessPreflight(receiptPath: string | undefined) {
|
|
if (!receiptPath) throw new Error("Stock harness has no prerequisite receipt; use the live launcher.");
|
|
const run = spawnSync(process.execPath, [path.join(root, "tests/runner-e2e/stock-harness-checks.mjs"), `--verify=${receiptPath}`], {
|
|
cwd: root, env: stockPreflightEnvironment(process.env), encoding: "utf8", timeout: 30_000,
|
|
});
|
|
if (run.status !== 0) throw new Error(`Stock harness prerequisite verification failed: ${run.stderr || run.error?.message || run.status}`);
|
|
return JSON.parse(run.stdout) as Record<string, unknown>;
|
|
}
|
|
|
|
export function prepareStockHarnessPreflight(campaignDirectory: string) {
|
|
// The trusted artifact selector admits exactly one campaign root. Keep all
|
|
// prerequisite evidence inside that root, including pre-provider failures.
|
|
const output = path.join(campaignDirectory, "stock-harness-prerequisites", randomUUID());
|
|
const receipt = path.join(output, "preflight.json");
|
|
const run = spawnSync(process.execPath, [path.join(root, "tests/runner-e2e/stock-harness-checks.mjs"),
|
|
`--output-dir=${output}`, ...(process.env.GITHUB_ACTIONS === "true" ? ["--allow-rust-network"] : [])], {
|
|
cwd: root, env: stockPreflightEnvironment(process.env), stdio: "inherit", timeout: 50 * 60_000,
|
|
});
|
|
if (run.status !== 0) throw new Error(`Stock harness prerequisites failed before provider execution. Retained receipt: ${receipt}`);
|
|
verifyStockHarnessPreflight(receipt);
|
|
return receipt;
|
|
}
|