fix: seal restored workbench terminal turns

This commit is contained in:
UniDesk Codex
2026-07-01 01:16:45 +08:00
parent 303a839ae5
commit 1fdd50b7bb
3 changed files with 95 additions and 2 deletions
@@ -5,7 +5,7 @@ import assert from "node:assert/strict";
import test from "node:test";
import type { AgentChatResultResponse, ChatMessage } from "../src/types/index.ts";
import { clearRunnerTraceTransientDiagnostics, mergeTerminalResultTrace, messageStatusPatchForTerminalMerge, messageTimingPatchForMerge, nonBlockingProjection, normalizeAgentError, projectionFromResult, shouldClearCompletedTurnDiagnostics, terminalMessageTimingPatchForNormalize } from "../src/stores/workbench-message-projection-runtime.ts";
import { clearRunnerTraceTransientDiagnostics, mergeTerminalResultTrace, messageStatusPatchForTerminalMerge, messageTimingPatchForMerge, nonBlockingProjection, normalizeAgentError, projectionFromResult, shouldClearCompletedTurnDiagnostics, terminalMessagePatchFromTurnResult, terminalMessageTimingPatchForNormalize } from "../src/stores/workbench-message-projection-runtime.ts";
test("terminal result merge preserves runner trace evidence and timing", () => {
const previous: ChatMessage["runnerTrace"] = {
@@ -82,3 +82,39 @@ test("message timing and terminal status patches stay independent from store sta
const terminalPatch = terminalMessageTimingPatchForNormalize(result);
assert.equal(terminalPatch.durationMs, 3500);
});
test("terminal seal blocks stale running snapshots after session restore", () => {
const sealed = {
role: "agent",
status: "failed",
text: "provider stream disconnected",
traceAutoLifecycle: "terminal",
runnerTrace: { traceId: "trc_1", status: "failed" },
timing: { startedAt: "2026-01-01T00:00:00.000Z", finishedAt: "2026-01-01T00:00:05.000Z", durationMs: 5000, valuesRedacted: true }
} as ChatMessage;
assert.deepEqual(messageStatusPatchForTerminalMerge(sealed, "running", false), { status: "failed", traceAutoLifecycle: "terminal" });
const restored = {
role: "agent",
status: "running",
traceAutoLifecycle: "running",
traceId: "trc_1",
runnerTrace: { traceId: "trc_1", status: "running" },
timing: { startedAt: "2026-01-01T00:00:00.000Z", valuesRedacted: true }
} as ChatMessage;
const terminal = terminalMessagePatchFromTurnResult(restored, {
traceId: "trc_1",
status: "failed",
terminal: true,
startedAt: "2026-01-01T00:00:00.000Z",
finishedAt: "2026-01-01T00:00:04.000Z",
durationMs: 4000,
error: { message: "provider stream disconnected" }
} as AgentChatResultResponse);
assert.equal(terminal?.status, "failed");
assert.equal(terminal?.traceAutoLifecycle, "terminal");
assert.equal(terminal?.durationMs, 4000);
assert.equal(terminal?.error?.message, "provider stream disconnected");
});