fix: preserve cancel prompt after event checkpoints (#2154)

Co-authored-by: root <root@lyon.remote>
This commit is contained in:
Lyon
2026-06-25 19:42:10 +08:00
committed by GitHub
parent 5f3b9f7fad
commit 590b662317
2 changed files with 30 additions and 8 deletions
@@ -715,6 +715,20 @@ test("workbench projection writer does not replace prior user prompt with cancel
},
session: { sessionStatus: "running", lastTraceId: traceId }
});
await writeWorkbenchProjectionEvent({
runtimeStore,
event: {
traceId,
sessionId: "ses_writer_canceled_prompt_preserved",
source: "agentrun",
sourceSeq: 1,
type: "backend",
eventType: "backend",
status: "running",
label: "agentrun:request:accepted",
createdAt: "2026-06-20T11:04:10.000Z"
}
});
await writeWorkbenchProjectionSession({
accessController,
runtimeStore,
+16 -8
View File
@@ -677,17 +677,19 @@ function workbenchProjectionUserMessage({ payload = {}, params = {}, traceId = n
}
function preserveTerminalUserMessage(messages = [], { terminal = false, traceId = null, previousCheckpoint = null } = {}) {
if (!terminal || !traceId || !previousCheckpoint?.userMessage) return messages;
const previousUserMessage = previousCheckpoint.userMessage;
const previousText = textValue(previousUserMessage.text ?? previousUserMessage.content ?? previousUserMessage.message);
if (!previousText) return messages;
let replaced = false;
if (!terminal || !traceId) return messages;
const previousUserMessage = previousCheckpoint?.userMessage ?? null;
const previousText = textValue(previousUserMessage?.text ?? previousUserMessage?.content ?? previousUserMessage?.message);
let handledUser = false;
const normalizedTraceId = safeTraceId(traceId) ?? traceId;
const preserved = messages.map((message) => {
const role = textValue(message?.role) || "agent";
const messageTraceId = safeTraceId(message?.traceId ?? message?.turnId ?? normalizedTraceId) ?? normalizedTraceId;
if (role !== "user" || messageTraceId !== normalizedTraceId) return message;
replaced = true;
handledUser = true;
const messageText = textValue(message?.text ?? message?.content ?? message?.message);
if (!previousText && isSyntheticTerminalUserNotice(messageText)) return null;
if (!previousText) return message;
return {
...message,
...previousUserMessage,
@@ -700,11 +702,17 @@ function preserveTerminalUserMessage(messages = [], { terminal = false, traceId
terminal: false,
sealed: false
};
});
if (replaced) return preserved;
}).filter(Boolean);
if (handledUser) return preserved;
if (!previousText) return preserved;
return [previousUserMessage, ...messages];
}
function isSyntheticTerminalUserNotice(text) {
const value = textValue(text);
return /\s*AgentRun\s*||hwlab-user-cancel/u.test(value);
}
function normalizeMessages(messages, context) {
const normalized = Array.isArray(messages) ? messages.map((message, index) => normalizeMessageFact(message, index, context)).filter(Boolean) : [];
if (context?.terminal && context?.finalText && context?.traceId && !normalized.some((message) => message.role !== "user" && message.traceId === context.traceId)) {