mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-26 20:35:39 -06:00
fix: keep exact assistant idempotency locked
This commit is contained in:
@@ -736,6 +736,46 @@ describe("appendAssistantMessageToSessionTranscript", () => {
|
||||
}
|
||||
});
|
||||
|
||||
it("dedupes concurrent exact assistant appends by idempotency key", async () => {
|
||||
writeTranscriptStore();
|
||||
const idempotencyKey = "mirror:concurrent-assistant";
|
||||
|
||||
const results = await Promise.all(
|
||||
Array.from({ length: 8 }, () =>
|
||||
appendExactAssistantMessageToSessionTranscript({
|
||||
sessionKey,
|
||||
storePath: fixture.storePath(),
|
||||
idempotencyKey,
|
||||
updateMode: "none",
|
||||
message: createExactAssistantMessage({
|
||||
text: "Mirrored reply",
|
||||
provider: "openclaw",
|
||||
model: "delivery-mirror",
|
||||
}),
|
||||
}),
|
||||
),
|
||||
);
|
||||
|
||||
expect(results.every((result) => result.ok)).toBe(true);
|
||||
const messageIds = results.map((result) => (result.ok ? result.messageId : ""));
|
||||
expect(new Set(messageIds).size).toBe(1);
|
||||
|
||||
const firstOk = results.find((result) => result.ok);
|
||||
if (!firstOk?.ok) {
|
||||
throw new Error("expected exact assistant append to succeed");
|
||||
}
|
||||
const records = fs
|
||||
.readFileSync(firstOk.sessionFile, "utf-8")
|
||||
.trim()
|
||||
.split("\n")
|
||||
.map((line) => JSON.parse(line) as { message?: { role?: string; idempotencyKey?: string } })
|
||||
.filter(
|
||||
(record) =>
|
||||
record.message?.role === "assistant" && record.message.idempotencyKey === idempotencyKey,
|
||||
);
|
||||
expect(records).toHaveLength(1);
|
||||
});
|
||||
|
||||
it("can emit file-only transcript refresh events for exact assistant appends", async () => {
|
||||
writeTranscriptStore();
|
||||
const emitSpy = vi.spyOn(transcriptEvents, "emitSessionTranscriptUpdate");
|
||||
|
||||
@@ -353,7 +353,6 @@ export async function appendExactAssistantMessageToSessionTranscript(params: {
|
||||
return await appendSessionTranscriptMessage({
|
||||
transcriptPath: sessionFile,
|
||||
message,
|
||||
idempotencyLookup: explicitIdempotencyKey ? "caller-checked" : "scan",
|
||||
config: params.config,
|
||||
});
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user