Skip to content

Commit 307a140

Browse files
committed
fix(codex): avoid native compaction on budget triggers
1 parent c14c043 commit 307a140

2 files changed

Lines changed: 53 additions & 0 deletions

File tree

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ function startCompaction(sessionFile: string, options: { currentTokenCount?: num
5454
sessionKey: "agent:main:session-1",
5555
sessionFile,
5656
workspaceDir: tempDir,
57+
trigger: "manual",
5758
...options,
5859
});
5960
}
@@ -123,6 +124,35 @@ describe("maybeCompactCodexAppServerSession", () => {
123124
expect(details.pending).toBe(true);
124125
});
125126

127+
it("skips native app-server compaction for automatic budget triggers", async () => {
128+
const fake = createFakeCodexClient();
129+
setCodexAppServerClientFactoryForTest(async () => fake.client);
130+
const sessionFile = await writeTestBinding();
131+
132+
const result = requireCompactResult(
133+
await maybeCompactCodexAppServerSession({
134+
sessionId: "session-1",
135+
sessionKey: "agent:main:session-1",
136+
sessionFile,
137+
workspaceDir: tempDir,
138+
trigger: "budget",
139+
currentTokenCount: 456,
140+
}),
141+
);
142+
143+
expect(fake.request).not.toHaveBeenCalled();
144+
expect(result.ok).toBe(true);
145+
expect(result.compacted).toBe(false);
146+
expect(result.reason).toBe("codex app-server owns automatic compaction");
147+
expect(result.result?.tokensBefore).toBe(456);
148+
expect(compactDetails(result)).toMatchObject({
149+
backend: "codex-app-server",
150+
skipped: true,
151+
reason: "non_manual_trigger",
152+
trigger: "budget",
153+
});
154+
});
155+
126156
it("blocks native app-server compaction when the current OpenClaw session is sandboxed", async () => {
127157
const fake = createFakeCodexClient();
128158
setCodexAppServerClientFactoryForTest(async () => fake.client);

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,29 @@ async function compactCodexNativeThread(
122122
params: CompactEmbeddedPiSessionParams,
123123
options: { pluginConfig?: unknown; clientFactory?: CodexAppServerClientFactory } = {},
124124
): Promise<EmbeddedPiCompactResult | undefined> {
125+
if (params.trigger && params.trigger !== "manual") {
126+
embeddedAgentLog.info("skipping codex app-server compaction for non-manual trigger", {
127+
sessionId: params.sessionId,
128+
sessionKey: params.sessionKey,
129+
trigger: params.trigger,
130+
});
131+
return {
132+
ok: true,
133+
compacted: false,
134+
reason: "codex app-server owns automatic compaction",
135+
result: {
136+
summary: "",
137+
firstKeptEntryId: "",
138+
tokensBefore: params.currentTokenCount ?? 0,
139+
details: {
140+
backend: "codex-app-server",
141+
skipped: true,
142+
reason: "non_manual_trigger",
143+
trigger: params.trigger ?? "unknown",
144+
},
145+
},
146+
};
147+
}
125148
const nativeExecutionBlock = resolveCodexNativeExecutionBlock({
126149
config: params.config,
127150
sessionKey: params.sandboxSessionKey ?? params.sessionKey,

0 commit comments

Comments
 (0)