feat(cli): migrate child json recovery callers

This commit is contained in:
Codex
2026-07-02 19:25:27 +00:00
parent 51512f3d7b
commit 146ecc5e82
9 changed files with 254 additions and 142 deletions
+18 -6
View File
@@ -10,6 +10,7 @@ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "
import { dirname, join } from "node:path";
import { repoRoot, rootPath, type Config } from "../config";
import { runCommand, type CommandResult } from "../command";
import { resolveCliChildJsonCommandResult } from "../cli-child-json-recovery";
import { startJob } from "../jobs";
import { classifySshTcpPoolFailure } from "../ssh";
import { HWLAB_NODE_CONTROL_PLANE_CONFIG_PATH, hwlabNodeControlPlaneInfraHelp, runHwlabNodeControlPlaneInfra } from "../hwlab-node-control-plane";
@@ -30,7 +31,7 @@ import type { RenderedCliResult } from "../output";
import type { NodeWebProbeObserveAction, NodeWebProbeObserveOptions, WebObserveIndexEntry } from "./entry";
import { runTransWorkspaceStdinScript } from "./public-exposure";
import { parseJsonObject, record, shellQuote } from "./utils";
import { record, shellQuote } from "./utils";
import { isSafeWebObserveJobId, isSafeWebObserveStateDir, safeWebObserveSegment } from "./web-observe-scripts";
import { webObserveShort, webObserveText } from "./web-probe-observe";
@@ -68,9 +69,14 @@ export function recoverWebObserveAnalyzeTurnDetails(options: NodeWebProbeObserve
"console.log(JSON.stringify({ ok: true, rounds, turnColumns }));",
"UNIDESK_WEB_OBSERVE_RECOVER_TURN_DETAILS",
].join("\n");
const recovered = parseJsonObject(runTransWorkspaceStdinScript(options.node, spec.workspace, recoverScript, Math.min(options.commandTimeoutSeconds, 30)).stdout);
const recoveredRounds = Array.isArray(recovered.rounds) ? recovered.rounds : [];
const recoveredColumns = Array.isArray(recovered.turnColumns) ? recovered.turnColumns : [];
const recoverResult = runTransWorkspaceStdinScript(options.node, spec.workspace, recoverScript, Math.min(options.commandTimeoutSeconds, 30));
const recovered = resolveCliChildJsonCommandResult({
result: recoverResult,
requestedStdoutType: "web-probe observe analyze turn-detail recovery JSON",
acceptParsed: (value) => value.ok === true && (Array.isArray(value.rounds) || Array.isArray(value.turnColumns)),
}).parsed;
const recoveredRounds = Array.isArray(recovered?.rounds) ? recovered.rounds : [];
const recoveredColumns = Array.isArray(recovered?.turnColumns) ? recovered.turnColumns : [];
if (recoveredRounds.length === 0 && recoveredColumns.length === 0) return analysis;
const nextMetrics = { ...(sampleMetrics ?? {}) };
if (!hasRounds && recoveredRounds.length > 0) {
@@ -1083,10 +1089,16 @@ export function discoverWebObserveIndexEntryOnTarget(id: string, node: string, l
"NODE",
].join("\n");
const result = runTransWorkspaceStdinScript(node, spec.workspace, script, 55);
const payload = parseJsonObject(result.stdout);
const discovery = resolveCliChildJsonCommandResult({
result,
requestedStdoutType: "web-probe observe index discovery JSON",
acceptParsed: (value) => value.ok === true && (value.found === true || value.found === false || value.ambiguous === true),
});
const payload = discovery.parsed;
if (result.exitCode !== 0 || result.timedOut || payload?.ok !== true) {
const reason = result.timedOut ? "timeout" : payload?.ambiguous === true ? "ambiguous" : `exit=${result.exitCode}`;
throw new Error(`observer discovery failed (${reason}): ${result.stderr.trim().slice(-240) || result.stdout.trim().slice(-240)}`);
const recovery = JSON.stringify(discovery.diagnostics).slice(0, 360);
throw new Error(`observer discovery failed (${reason}): ${result.stderr.trim().slice(-240) || result.stdout.trim().slice(-240)} recovery=${recovery}`);
}
if (payload.found !== true) return null;
const entry = record(payload.entry);