From 8ffe9e32495ec120680dfd0d598b67e86b3b6e54 Mon Sep 17 00:00:00 2001 From: Lyon <88232613+pikasTech@users.noreply.github.com> Date: Mon, 22 Jun 2026 14:49:33 +0800 Subject: [PATCH] fix: render web probe observe start summary (#659) Co-authored-by: Codex --- scripts/src/hwlab-node-impl.ts | 66 ++++++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 3 deletions(-) diff --git a/scripts/src/hwlab-node-impl.ts b/scripts/src/hwlab-node-impl.ts index ae06f68b..c18d7bcb 100644 --- a/scripts/src/hwlab-node-impl.ts +++ b/scripts/src/hwlab-node-impl.ts @@ -7204,7 +7204,7 @@ function runNodeWebProbeObserveStart( secretSpec: RuntimeSecretSpec, material: BootstrapAdminPasswordMaterial, credential: Record, -): Record { +): Record | RenderedCliResult { const jobId = `webobs-${Date.now().toString(36)}-${randomBytes(3).toString("hex")}`; const timestamp = new Date().toISOString().replace(/[-:]/gu, "").replace(/[.]\d{3}Z$/u, "Z"); const day = timestamp.slice(0, 8); @@ -7256,7 +7256,7 @@ function runNodeWebProbeObserveStart( updatedAt: new Date().toISOString(), }) : null; - return { + return renderWebObserveStartResult({ ok: result.exitCode === 0 && started?.ok === true, status: result.exitCode === 0 && started?.ok === true ? "started" : "blocked", command: `hwlab nodes web-probe observe start --node ${options.node} --lane ${options.lane}`, @@ -7273,7 +7273,7 @@ function runNodeWebProbeObserveStart( next: webObserveNextCommands(observerId), result: compactCommandResultRedacted(result, [material.password ?? ""]), valuesRedacted: true, - }; + }); } function runNodeWebProbeObserveStatus(options: NodeWebProbeObserveOptions, spec: HwlabRuntimeLaneSpec): Record | RenderedCliResult { @@ -8447,6 +8447,66 @@ function withWebObserveRendered(result: Record, renderedText: s }; } +function renderWebObserveStartResult(result: Record): Record { + const observer = record(result.observer); + const heartbeat = record(observer.heartbeat); + const manifest = record(observer.manifest); + const commandResult = record(result.result); + const credential = record(result.credential); + const id = result.id ?? observer.id ?? observer.jobId ?? manifest.jobId ?? "-"; + const status = result.status ?? manifest.status ?? heartbeat.status ?? "-"; + const stateDir = observer.stateDir ?? manifest.stateDir ?? "-"; + const blockedRows = result.ok === true ? [] : [ + "", + "Blocked detail:", + webObserveTable( + ["EXIT", "TIMEOUT", "STDOUT", "STDERR"], + [[ + webObserveText(commandResult.exitCode), + webObserveText(commandResult.timedOut), + webObserveShort(webObserveText(commandResult.stdoutTail ?? commandResult.stdout), 160), + webObserveShort(webObserveText(commandResult.stderrTail ?? commandResult.stderr), 300), + ]], + ), + ]; + const renderedText = [ + webObserveTable( + ["OBSERVER", "NODE", "LANE", "STATUS", "PID", "SAMPLE", "UPDATED"], + [[ + id, + result.node, + result.lane, + status, + observer.pid ?? heartbeat.pid, + heartbeat.sampleSeq, + heartbeat.updatedAt, + ]], + ), + "", + webObserveTable( + ["URL", "TARGET_PATH", "STATE_DIR"], + [[result.url, result.targetPath, webObserveShort(webObserveText(stateDir), 96)]], + ), + "", + webObserveTable( + ["CREDENTIAL", "SOURCE", "VALUES"], + [[ + credential.username ?? "-", + credential.sourceRef ?? "-", + credential.valuesRedacted === true ? "redacted" : "unknown", + ]], + ), + ...blockedRows, + "", + "NEXT", + ` status: bun scripts/cli.ts hwlab nodes web-probe observe status ${id}`, + ` analyze: bun scripts/cli.ts hwlab nodes web-probe observe analyze ${id}`, + ` command: bun scripts/cli.ts hwlab nodes web-probe observe command ${id} --type mark --label checkpoint`, + ` stop: bun scripts/cli.ts hwlab nodes web-probe observe stop ${id}`, + ].join("\n"); + return withWebObserveRendered(result, renderedText); +} + function renderWebObserveStatusResult(result: Record): Record { const observer = record(result.observer); const commandResult = record(result.result);