fix(replay): preserve invalid state across compaction retries

This commit is contained in:
Eva
2026-04-11 05:09:45 +07:00
committed by Peter Steinberger
parent eb185f4a03
commit 7f54cf73e2
2 changed files with 36 additions and 1 deletions

View File

@@ -549,4 +549,39 @@ describe("subscribeEmbeddedPiSession", () => {
expect(lifecycleError).toBeDefined();
expect(lifecycleError?.data?.error).toContain("API rate limit reached");
});
it("preserves replay-invalid lifecycle truth across compaction retries after mutating tools", () => {
const { session, emit } = createStubSessionHarness();
const onAgentEvent = vi.fn();
subscribeEmbeddedPiSession({
session,
runId: "run-replay-invalid-compaction",
onAgentEvent,
sessionKey: "test-session",
});
emitToolRun({
emit,
toolName: "edit",
toolCallId: "edit-1",
args: {
file_path: "/tmp/demo.txt",
old_string: "before",
new_string: "after",
},
isError: false,
result: { ok: true },
});
emit({ type: "auto_compaction_end", willRetry: true, result: { summary: "compacted" } });
emit({ type: "agent_end" });
const payloads = extractAgentEventPayloads(onAgentEvent.mock.calls);
expect(payloads).toContainEqual(
expect.objectContaining({
phase: "end",
replayInvalid: true,
}),
);
});
});

View File

@@ -694,7 +694,7 @@ export function subscribeEmbeddedPiSession(params: SubscribeEmbeddedPiSessionPar
state.pendingToolAudioAsVoice = false;
state.deterministicApprovalPromptPending = false;
state.deterministicApprovalPromptSent = false;
state.replayInvalid = params.initialReplayInvalid === true;
state.replayInvalid = state.replayInvalid || params.initialReplayInvalid === true;
state.livenessState = "working";
resetAssistantMessageState(0);
};