fix(workbench): do not derive final response while running (#2024)

This commit is contained in:
Lyon
2026-06-24 06:36:49 +08:00
committed by GitHub
parent 1cfb09cc08
commit 9e094a6697
2 changed files with 12 additions and 17 deletions
+9 -14
View File
@@ -976,7 +976,7 @@ test("workbench read model projects completed current turn for idle session summ
lastTraceId: traceId,
messages: [
{ role: "user", text: "reply OK", traceId, status: "sent" },
{ role: "agent", text: "", traceId, status: "running" }
{ role: "agent", text: "partial assistant text", traceId, status: "running" }
]
}
};
@@ -1434,34 +1434,28 @@ test("workbench read model keeps non-terminal durable tool completed events out
session,
events: durableEvents,
status: "running",
assistantText: "partial assistant text",
runId: "run_workbench_nonterminal_tool_completed",
commandId: "cmd_workbench_nonterminal_tool_completed",
projectionStatus: "projecting",
lastProjectedSeq: 2
}]
});
const server = createCloudApiServer({ accessController, traceStore, runtimeStore, codeAgentChatResults: results });
const workbenchRuntime = {
async queryWorkbenchFacts(query) { return runtimeStore.queryWorkbenchFacts(query); }
};
const server = createCloudApiServer({ accessController, traceStore, runtimeStore, workbenchRuntime, codeAgentChatResults: results });
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
try {
const { port } = server.address();
const sessions = await getJson(port, `/v1/workbench/sessions?includeSessionId=${encodeURIComponent(session.id)}`);
assert.equal(sessions.status, 200);
assert.equal(sessions.body.sessions[0].status, "running");
assert.equal(sessions.body.sessions[0].running, true);
assert.equal(sessions.body.sessions[0].terminal, false);
const messages = await getJson(port, `/v1/workbench/sessions/${encodeURIComponent(session.id)}/messages?limit=10`);
assert.equal(messages.status, 200);
assert.equal(messages.body.messages[1].status, "running");
assert.equal(messages.body.messages[1].text, "");
const turn = await getJson(port, `/v1/workbench/turns/${encodeURIComponent(traceId)}`);
assert.equal(turn.status, 200);
assert.equal(turn.body.status, "running");
assert.equal(turn.body.turn.status, "running");
assert.equal(turn.body.turn.running, true);
assert.equal(turn.body.turn.terminal, false);
assert.equal(turn.body.turn.assistantText, "partial assistant text");
assert.equal(turn.body.turn.finalResponse, null);
assert.equal(turn.body.projectionStatus, "projecting");
@@ -1750,7 +1744,7 @@ function createDurableFactsRuntimeStore({ sessions = [], queryError = null, quer
};
}
function buildDurableFactsForSession({ session, events = [], status = null, finalText = null, runId = null, commandId = null, projectionStatus = null, projectionHealth = "healthy", lastProjectedSeq = null, omitSessions = false } = {}) {
function buildDurableFactsForSession({ session, events = [], status = null, finalText = null, assistantText = null, runId = null, commandId = null, projectionStatus = null, projectionHealth = "healthy", lastProjectedSeq = null, omitSessions = false } = {}) {
const traceId = session.lastTraceId ?? session.session?.lastTraceId;
const projectedStatus = normalizeTestStatus(status ?? session.status);
const terminal = testTerminalStatuses.has(projectedStatus);
@@ -1816,6 +1810,7 @@ function buildDurableFactsForSession({ session, events = [], status = null, fina
sourceEventId: traceId,
terminal,
sealed: terminal,
assistantText: assistantText ?? null,
finalResponse: finalText ? { text: finalText, status: projectedStatus, traceId, valuesPrinted: false } : null,
diagnostic: { projectionStatus: checkpointStatus, projectionHealth, valuesRedacted: true },
timing,
+3 -3
View File
@@ -1013,7 +1013,7 @@ function factTurnSnapshot({ turn = null, session = null, facts = {}, traceId, tu
const checkpointStatus = normalizeTerminalStatus(checkpoint?.status);
const traceStatus = normalizeTerminalStatus(trace.status);
const status = normalizeStatus(checkpointStatus ?? traceStatus ?? turn?.status ?? session?.status);
const finalText = projectionText(turn?.finalResponse, turn?.assistantText, turn?.text, assistantMessage?.text);
const assistantText = projectionText(turn?.finalResponse, turn?.assistantText, turn?.text, assistantMessage?.text);
const timing = factCombinedTimingProjection(status, checkpoint, turn, trace);
return {
turnId: resolvedTurnId,
@@ -1025,8 +1025,8 @@ function factTurnSnapshot({ turn = null, session = null, facts = {}, traceId, tu
threadId: safeOpaqueId(session?.threadId) ?? (textValue(session?.threadId) || null),
userMessageId: userMessage?.messageId ?? null,
assistantMessageId: assistantMessage?.messageId ?? turn?.messageId ?? null,
assistantText: finalText ?? null,
finalResponse: turn?.finalResponse ?? (finalText ? { text: finalText, status, traceId: safeTrace, valuesPrinted: false } : null),
assistantText: assistantText ?? null,
finalResponse: turn?.finalResponse ?? null,
timing,
startedAt: timing.startedAt,
lastEventAt: timing.lastEventAt,