Skip to content

Commit a3f06bf

Browse files
committed
fix(codex): adopt compacted context-engine transcripts
1 parent 371851a commit a3f06bf

2 files changed

Lines changed: 69 additions & 3 deletions

File tree

extensions/codex/src/app-server/compact.test.ts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,67 @@ describe("maybeCompactCodexAppServerSession", () => {
513513
);
514514
});
515515

516+
it("adopts successor transcript handles after owning context-engine compaction", async () => {
517+
const sessionFile = await writeTestBinding();
518+
const successorFile = path.join(tempDir, "session.compacted.jsonl");
519+
await writeCodexAppServerBinding(successorFile, {
520+
threadId: "thread-successor",
521+
cwd: tempDir,
522+
});
523+
const compact = vi.fn(async () => ({
524+
ok: true,
525+
compacted: true,
526+
result: {
527+
summary: "engine summary",
528+
firstKeptEntryId: "entry-1",
529+
tokensBefore: 55,
530+
sessionId: "session-1-compacted",
531+
sessionFile: successorFile,
532+
},
533+
}));
534+
const maintain = vi.fn(
535+
async (_params: Parameters<NonNullable<ContextEngine["maintain"]>>[0]) => ({
536+
changed: false,
537+
bytesFreed: 0,
538+
rewrittenEntries: 0,
539+
}),
540+
);
541+
const contextEngine: ContextEngine = {
542+
info: { id: "lossless-claw", name: "Lossless Claw", ownsCompaction: true },
543+
assemble: vi.fn() as never,
544+
ingest: vi.fn() as never,
545+
compact,
546+
maintain,
547+
};
548+
549+
const result = requireCompactResult(
550+
await maybeCompactCodexAppServerSession({
551+
sessionId: "session-1",
552+
sessionKey: "agent:main:session-1",
553+
sessionFile,
554+
workspaceDir: tempDir,
555+
contextEngine,
556+
}),
557+
);
558+
559+
expect(result.ok).toBe(true);
560+
expect(result.compacted).toBe(true);
561+
expect(result.result?.sessionId).toBe("session-1-compacted");
562+
expect(result.result?.sessionFile).toBe(successorFile);
563+
expect(await readCodexAppServerBinding(sessionFile)).toBeUndefined();
564+
expect(await readCodexAppServerBinding(successorFile)).toBeUndefined();
565+
expect(maintain).toHaveBeenCalledTimes(1);
566+
const [maintainCall] = maintain.mock.calls[0] ?? [];
567+
const maintainParams = maintainCall as
568+
| {
569+
sessionId?: string;
570+
sessionFile?: string;
571+
}
572+
| undefined;
573+
expect(maintainParams?.sessionId).toBe("session-1-compacted");
574+
expect(maintainParams?.sessionFile).toBe(successorFile);
575+
});
576+
516577
it("returns context-engine compaction success when maintenance fails", async () => {
517578
const sessionFile = await writeTestBinding();
518579
const compact = vi.fn(async () => ({

extensions/codex/src/app-server/compact.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,24 +105,29 @@ async function compactOwningContextEngine(
105105
}
106106

107107
if (result.ok && result.compacted) {
108+
const compactedSessionId = result.result?.sessionId ?? params.sessionId;
109+
const compactedSessionFile = result.result?.sessionFile ?? params.sessionFile;
108110
try {
109111
await runHarnessContextEngineMaintenance({
110112
contextEngine,
111-
sessionId: params.sessionId,
113+
sessionId: compactedSessionId,
112114
sessionKey: params.sessionKey,
113-
sessionFile: params.sessionFile,
115+
sessionFile: compactedSessionFile,
114116
reason: "compaction",
115117
runtimeContext: params.contextEngineRuntimeContext,
116118
config: params.config,
117119
});
118120
} catch (error) {
119121
embeddedAgentLog.warn("context engine compaction maintenance failed", {
120-
sessionId: params.sessionId,
122+
sessionId: compactedSessionId,
121123
engineId: contextEngine.info.id,
122124
error: formatErrorMessage(error),
123125
});
124126
}
125127
await clearCodexAppServerBinding(params.sessionFile);
128+
if (compactedSessionFile !== params.sessionFile) {
129+
await clearCodexAppServerBinding(compactedSessionFile);
130+
}
126131
}
127132

128133
embeddedAgentLog.info("completed context-engine-owned Codex app-server compaction", {

0 commit comments

Comments
 (0)