Skip to content

Commit fcff01c

Browse files
authored
fix: archive role-ordering reset transcripts (#97544)
* fix: archive role-ordering reset transcripts * test: fix session reset archive lint
1 parent 51064bd commit fcff01c

2 files changed

Lines changed: 16 additions & 32 deletions

File tree

src/config/sessions/session-accessor.test.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1358,7 +1358,7 @@ describe("session accessor file-backed seam", () => {
13581358
).toHaveLength(1);
13591359
});
13601360

1361-
it("persists reset lifecycle entry changes with transcript replay and cleanup", async () => {
1361+
it("persists reset lifecycle entry changes with transcript replay and archive", async () => {
13621362
const now = Date.now();
13631363
const sessionKey = "agent:main:main";
13641364
const previousTranscript = path.join(tempDir, "previous-session.jsonl");
@@ -1410,6 +1410,16 @@ describe("session accessor file-backed seam", () => {
14101410
expect(result.replayedMessages).toBe(2);
14111411
expect(loadSessionEntry({ sessionKey, storePath })).toMatchObject(nextEntry);
14121412
expect(fs.existsSync(previousTranscript)).toBe(false);
1413+
const archivedPreviousTranscripts = fs
1414+
.readdirSync(tempDir)
1415+
.filter((file) => file.startsWith("previous-session.jsonl.reset."));
1416+
expect(archivedPreviousTranscripts).toHaveLength(1);
1417+
const [archivedPreviousTranscriptName] = archivedPreviousTranscripts;
1418+
const archivedPreviousTranscript = path.join(tempDir, archivedPreviousTranscriptName);
1419+
expect(fs.readFileSync(archivedPreviousTranscript, "utf-8")).toContain(
1420+
'"id":"previous-session"',
1421+
);
1422+
expect(fs.readFileSync(archivedPreviousTranscript, "utf-8")).toContain('"content":"hi"');
14131423
expect(fs.readFileSync(nextTranscript, "utf-8")).toContain('"content":"hello"');
14141424
});
14151425

src/config/sessions/session-accessor.ts

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1632,10 +1632,12 @@ export async function persistSessionResetLifecycle(params: {
16321632
});
16331633

16341634
if (params.cleanupPreviousTranscript && params.previousSessionId) {
1635-
cleanupPreviousResetTranscripts({
1635+
await archivePreviousSessionTranscript({
16361636
agentId: params.agentId ?? resolveAgentIdFromSessionKey(params.sessionKey),
1637-
previousEntry: params.previousEntry,
1638-
previousSessionId: params.previousSessionId,
1637+
previousEntry:
1638+
params.previousEntry.sessionId === params.previousSessionId
1639+
? params.previousEntry
1640+
: { ...params.previousEntry, sessionId: params.previousSessionId },
16391641
storePath: params.storePath,
16401642
});
16411643
}
@@ -2709,34 +2711,6 @@ async function restoreTemporarySessionMapping(
27092711
}
27102712
}
27112713

2712-
function cleanupPreviousResetTranscripts(params: {
2713-
agentId: string;
2714-
previousEntry: SessionEntry;
2715-
previousSessionId: string;
2716-
storePath: string;
2717-
}): void {
2718-
const transcriptCandidates = new Set<string>();
2719-
const resolved = resolveSessionFilePath(
2720-
params.previousSessionId,
2721-
params.previousEntry,
2722-
resolveSessionFilePathOptions({
2723-
agentId: params.agentId,
2724-
storePath: params.storePath,
2725-
}),
2726-
);
2727-
if (resolved) {
2728-
transcriptCandidates.add(resolved);
2729-
}
2730-
transcriptCandidates.add(resolveSessionTranscriptPath(params.previousSessionId, params.agentId));
2731-
for (const candidate of transcriptCandidates) {
2732-
try {
2733-
fs.unlinkSync(candidate);
2734-
} catch {
2735-
// Best-effort cleanup.
2736-
}
2737-
}
2738-
}
2739-
27402714
async function archivePreviousSessionTranscript(params: {
27412715
agentId: string;
27422716
onArchiveError?: (error: unknown, sourcePath: string) => void;

0 commit comments

Comments
 (0)