fix: scope observation to current turn

Require assistant natural language after the latest user message so a completed prompt cannot reuse historical replies when queuing the observation snapshot.
This commit is contained in:
2026-08-24 12:55:01 +08:00
parent 7a15b1b49c
commit 16f5c57f17
3 changed files with 65 additions and 7 deletions

View File

@@ -363,8 +363,22 @@ export function queueAgentSessionSync(
/** Queue the final product Conversation snapshot after a completed prompt turn. */
export function queueCodingConversationSessionSync(snapshot: ConversationSnapshot): void {
const messages: RawMessage[] = snapshot.nodes.flatMap((node) => {
if (node.kind !== 'message') return [];
const messageNodes = snapshot.nodes.filter((node) => node.kind === 'message');
let lastUserIndex = -1;
for (let index = messageNodes.length - 1; index >= 0; index -= 1) {
if (messageNodes[index].role === 'user') {
lastUserIndex = index;
break;
}
}
if (lastUserIndex < 0) return;
const currentTurnAssistantIds = new Set(messageNodes
.slice(lastUserIndex + 1)
.filter((node) => node.role === 'assistant')
.map((node) => node.id));
if (currentTurnAssistantIds.size === 0) return;
const messages: RawMessage[] = messageNodes.flatMap((node) => {
return [{
id: node.id,
role: node.role,
@@ -384,7 +398,11 @@ export function queueCodingConversationSessionSync(snapshot: ConversationSnapsho
messages,
updatedAt,
);
if (!data?.messages.some((message) => message.role === 'assistant')) return;
if (!data?.messages.some((message) => (
message.role === 'assistant'
&& typeof message.id === 'string'
&& currentTurnAssistantIds.has(message.id)
))) return;
queueAgentSessionData(data);
}