fix: reduce infra feedback CLI friction

This commit is contained in:
Codex
2026-06-15 22:48:02 +00:00
parent be67b4b3ed
commit aca2ca0f9e
5 changed files with 406 additions and 10 deletions
+24 -4
View File
@@ -66,8 +66,20 @@ export async function runSshPlaywrightOperation(
const localDir = resolve(options.localDir);
const submitCommand = builders.buildRouteCommand(invocation.route, ["sh", "-c", remotePlaywrightSubmitScript(remoteDir), "unidesk-playwright-submit"], { stdin: true });
const submit = await executor.runRemoteCommand(submitCommand, userScript);
if (submit.exitCode !== 0) {
throw new Error(`ssh playwright submit failed: exitCode=${submit.exitCode}; stdoutTail=${JSON.stringify(submit.stdout.slice(-1000))}; stderrTail=${JSON.stringify(submit.stderr.slice(-1000))}`);
const submitRecovery = submit.exitCode !== 0 && isRecoverableSubmitTimeout(submit)
? {
recovered: true,
reason: "submit-short-connection-timeout",
remoteDir,
runId,
exitCode: submit.exitCode,
stdoutTail: submit.stdout.slice(-1000),
stderrTail: submit.stderr.slice(-1000),
next: "submit may have been cut by the 60s trans runtime limit after the background job was launched; polling remote status by remoteDir/runId",
}
: null;
if (submit.exitCode !== 0 && submitRecovery === null) {
throw new Error(`ssh playwright submit failed: exitCode=${submit.exitCode}; remoteDir=${remoteDir}; runId=${runId}; stdoutTail=${JSON.stringify(submit.stdout.slice(-1000))}; stderrTail=${JSON.stringify(submit.stderr.slice(-1000))}`);
}
const manifest = await pollRemoteManifest(invocation.route, executor, builders, remoteDir, runId, options);
const artifacts: Array<SshVerifiedDownloadResult & { manifestBytes: number | null; manifestSha256: string | null }> = [];
@@ -124,6 +136,8 @@ export async function runSshPlaywrightOperation(
remoteCommand: {
exitCode: manifest.exitCode,
submitExitCode: submit.exitCode,
submitRecovered: submitRecovery !== null,
submitRecovery,
submitStdoutBytes: Buffer.byteLength(submit.stdout, "utf8"),
submitStderrBytes: Buffer.byteLength(submit.stderr, "utf8"),
},
@@ -272,17 +286,23 @@ async function pollRemoteManifest(
lastStatus = status;
if (status.exitCode === 0 && status.stdout.includes(manifestEnd)) return parseRemoteManifest(status, remoteDir, runId);
if (status.exitCode !== 0 && !/status\t(?:pending|running)/u.test(status.stdout)) {
throw new Error(`ssh playwright status failed: exitCode=${status.exitCode}; stdoutTail=${JSON.stringify(status.stdout.slice(-1000))}; stderrTail=${JSON.stringify(status.stderr.slice(-1000))}`);
throw new Error(`ssh playwright status failed: exitCode=${status.exitCode}; remoteDir=${remoteDir}; runId=${runId}; stdoutTail=${JSON.stringify(status.stdout.slice(-1000))}; stderrTail=${JSON.stringify(status.stderr.slice(-1000))}`);
}
await sleep(options.pollIntervalMs);
}
throw new Error(`ssh playwright timed out waiting for remote job after ${options.waitTimeoutMs}ms; lastStdoutTail=${JSON.stringify(lastStatus?.stdout.slice(-1000) ?? "")}; lastStderrTail=${JSON.stringify(lastStatus?.stderr.slice(-1000) ?? "")}`);
throw new Error(`ssh playwright timed out waiting for remote job after ${options.waitTimeoutMs}ms; remoteDir=${remoteDir}; runId=${runId}; lastStdoutTail=${JSON.stringify(lastStatus?.stdout.slice(-1000) ?? "")}; lastStderrTail=${JSON.stringify(lastStatus?.stderr.slice(-1000) ?? "")}`);
}
function sleep(ms: number): Promise<void> {
return new Promise((resolveSleep) => setTimeout(resolveSleep, ms));
}
function isRecoverableSubmitTimeout(submit: SshCaptureResult): boolean {
if (submit.exitCode === 124) return true;
const combined = `${submit.stdout}\n${submit.stderr}`;
return /(?:timed?\s*out|timeout|60s|exitCode=124|signal\s+TERM|signal\s+KILL)/iu.test(combined);
}
function remotePlaywrightSubmitScript(remoteDir: string): string {
const runner = Buffer.from(remotePlaywrightRunnerScript(remoteDir), "utf8").toString("base64");
return [