Skip to content

Commit 487951f

Browse files
authored
fix(compaction): route codex oauth compaction natively (#95831)
Signed-off-by: sallyom <[email protected]>
1 parent 89b2db7 commit 487951f

4 files changed

Lines changed: 66 additions & 12 deletions

File tree

src/agents/embedded-agent-runner/compact.hooks.test.ts

Lines changed: 54 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1846,7 +1846,7 @@ describe("compactEmbeddedAgentSession hooks (ownsCompaction engine)", () => {
18461846
});
18471847
});
18481848

1849-
it("keeps selected Codex harness queued compaction on canonical OpenAI context", async () => {
1849+
it("runs selected Codex harness queued compaction on canonical OpenAI context", async () => {
18501850
resolveAgentHarnessPolicyMock.mockReturnValue({ runtime: "codex" });
18511851
maybeCompactAgentHarnessSessionMock.mockResolvedValueOnce({
18521852
ok: true,
@@ -1874,7 +1874,16 @@ describe("compactEmbeddedAgentSession hooks (ownsCompaction engine)", () => {
18741874
);
18751875

18761876
expect(result.ok).toBe(true);
1877-
expect(maybeCompactAgentHarnessSessionMock).not.toHaveBeenCalled();
1877+
expect(contextEngineCompactMock).toHaveBeenCalledTimes(1);
1878+
expect(maybeCompactAgentHarnessSessionMock).toHaveBeenCalledTimes(1);
1879+
expect(maybeCompactAgentHarnessSessionMock).toHaveBeenCalledWith(
1880+
expect.objectContaining({
1881+
provider: "openai",
1882+
model: "gpt-5.5",
1883+
agentHarnessId: "codex",
1884+
}),
1885+
{ nativeCompactionRequest: "after_context_engine" },
1886+
);
18781887
const compactArg = mockCallArg(contextEngineCompactMock) as {
18791888
runtimeContext?: Record<string, unknown>;
18801889
};
@@ -1915,7 +1924,15 @@ describe("compactEmbeddedAgentSession hooks (ownsCompaction engine)", () => {
19151924
);
19161925

19171926
expect(result.ok).toBe(true);
1918-
expect(maybeCompactAgentHarnessSessionMock).not.toHaveBeenCalled();
1927+
expect(contextEngineCompactMock).toHaveBeenCalledTimes(1);
1928+
expect(maybeCompactAgentHarnessSessionMock).toHaveBeenCalledTimes(1);
1929+
expect(maybeCompactAgentHarnessSessionMock).toHaveBeenCalledWith(
1930+
expect.objectContaining({
1931+
provider: "openai",
1932+
model: "gpt-5.5",
1933+
}),
1934+
{ nativeCompactionRequest: "after_context_engine" },
1935+
);
19191936
const compactArg = mockCallArg(contextEngineCompactMock) as {
19201937
runtimeContext?: Record<string, unknown>;
19211938
};
@@ -1968,7 +1985,7 @@ describe("compactEmbeddedAgentSession hooks (ownsCompaction engine)", () => {
19681985
});
19691986
});
19701987

1971-
it("keeps concrete Codex pins on canonical OpenAI for queued compaction", async () => {
1988+
it("uses concrete Codex pins on canonical OpenAI for queued compaction", async () => {
19721989
resolveAgentHarnessPolicyMock.mockReturnValue({
19731990
runtime: "auto",
19741991
runtimeSource: "model",
@@ -1999,7 +2016,16 @@ describe("compactEmbeddedAgentSession hooks (ownsCompaction engine)", () => {
19992016
);
20002017

20012018
expect(result.ok).toBe(true);
2002-
expect(maybeCompactAgentHarnessSessionMock).not.toHaveBeenCalled();
2019+
expect(contextEngineCompactMock).toHaveBeenCalledTimes(1);
2020+
expect(maybeCompactAgentHarnessSessionMock).toHaveBeenCalledTimes(1);
2021+
expect(maybeCompactAgentHarnessSessionMock).toHaveBeenCalledWith(
2022+
expect.objectContaining({
2023+
provider: "openai",
2024+
model: "gpt-5.5",
2025+
agentHarnessId: "codex",
2026+
}),
2027+
{ nativeCompactionRequest: "after_context_engine" },
2028+
);
20032029
const compactArg = mockCallArg(contextEngineCompactMock) as {
20042030
runtimeContext?: Record<string, unknown>;
20052031
};
@@ -2068,7 +2094,10 @@ describe("compactEmbeddedAgentSession hooks (ownsCompaction engine)", () => {
20682094
config: {
20692095
models: {
20702096
providers: {
2071-
openai: { models: [{ id: "gpt-5.5", contextWindow: 350_000 }] },
2097+
openai: {
2098+
baseUrl: "https://example.test/v1",
2099+
models: [{ id: "gpt-5.5", contextWindow: 350_000 }],
2100+
},
20722101
},
20732102
},
20742103
},
@@ -2125,7 +2154,7 @@ describe("compactEmbeddedAgentSession hooks (ownsCompaction engine)", () => {
21252154
expect(contextEngineCompactMock).not.toHaveBeenCalled();
21262155
});
21272156

2128-
it("uses context-engine compaction when no Codex native binding is selected", async () => {
2157+
it("keeps context-engine compaction successful when Codex native binding is missing", async () => {
21292158
resolveAgentHarnessPolicyMock.mockReturnValue({ runtime: "codex" });
21302159
maybeCompactAgentHarnessSessionMock.mockResolvedValueOnce({
21312160
ok: false,
@@ -2146,8 +2175,25 @@ describe("compactEmbeddedAgentSession hooks (ownsCompaction engine)", () => {
21462175
expect(result.ok).toBe(true);
21472176
expect(result.compacted).toBe(true);
21482177
expect(result.result?.summary).toBe("engine-summary");
2149-
expect(maybeCompactAgentHarnessSessionMock).not.toHaveBeenCalled();
21502178
expect(contextEngineCompactMock).toHaveBeenCalledTimes(1);
2179+
expect(maybeCompactAgentHarnessSessionMock).toHaveBeenCalledTimes(1);
2180+
expect(maybeCompactAgentHarnessSessionMock).toHaveBeenCalledWith(
2181+
expect.objectContaining({
2182+
provider: "openai",
2183+
model: "gpt-5.4",
2184+
agentHarnessId: "codex",
2185+
}),
2186+
{ nativeCompactionRequest: "after_context_engine" },
2187+
);
2188+
const details = result.result?.details as
2189+
| { codexNativeCompaction?: Record<string, unknown> }
2190+
| undefined;
2191+
expect(details?.codexNativeCompaction).toMatchObject({
2192+
ok: false,
2193+
compacted: false,
2194+
reason: "no codex app-server thread binding",
2195+
failure: { reason: "missing_thread_binding" },
2196+
});
21512197
});
21522198

21532199
it("keeps owning context-engine compaction primary for legacy Codex native sessions", async () => {

src/agents/embedded-agent-runner/compact.queued.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ export async function compactEmbeddedAgentSession(
252252
const ceModelId = resolvedCompactionTarget.model ?? DEFAULT_MODEL;
253253
const attemptNativeHarnessCompaction = shouldAttemptNativeHarnessCompaction({
254254
provider: ceProvider,
255-
contextProvider: resolvedCompactionTarget.contextProvider,
255+
nativeHarnessCompaction: resolvedCompactionTarget.nativeHarnessCompaction,
256256
selectedHarnessRuntime,
257257
});
258258
if (attemptNativeHarnessCompaction) {
@@ -630,14 +630,14 @@ export async function compactEmbeddedAgentSession(
630630

631631
function shouldAttemptNativeHarnessCompaction(params: {
632632
provider: string;
633-
contextProvider?: string;
633+
nativeHarnessCompaction?: boolean;
634634
selectedHarnessRuntime?: string | null;
635635
}): boolean {
636636
const selectedRuntime = normalizeOptionalAgentRuntimeId(params.selectedHarnessRuntime);
637637
if (!selectedRuntime || selectedRuntime === "auto" || selectedRuntime === "openclaw") {
638638
return false;
639639
}
640-
return isOpenAIProvider(params.provider) ? params.contextProvider !== undefined : true;
640+
return isOpenAIProvider(params.provider) ? params.nativeHarnessCompaction === true : true;
641641
}
642642

643643
function buildCompactionContextEngineRuntimeContext(params: {

src/agents/embedded-agent-runner/compaction-runtime-context.test.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ describe("buildEmbeddedCompactionRuntimeContext", () => {
271271
expect(result.provider).toBe("openai");
272272
expect(result.runtimeProvider).toBeUndefined();
273273
expect(result.contextProvider).toBeUndefined();
274+
expect(result.nativeHarnessCompaction).toBe(true);
274275
expect(result.model).toBe("gpt-5.5");
275276
expect(result.authProfileId).toBeUndefined();
276277
});
@@ -315,7 +316,10 @@ describe("buildEmbeddedCompactionRuntimeContext", () => {
315316
config: {
316317
models: {
317318
providers: {
318-
openai: { models: [{ id: "gpt-5.5" }] },
319+
openai: {
320+
baseUrl: "https://example.test/v1",
321+
models: [{ id: "gpt-5.5" }],
322+
},
319323
},
320324
},
321325
} as unknown as OpenClawConfig,
@@ -328,6 +332,7 @@ describe("buildEmbeddedCompactionRuntimeContext", () => {
328332
expect(result.provider).toBe("openai");
329333
expect(result.runtimeProvider).toBeUndefined();
330334
expect(result.contextProvider).toBeUndefined();
335+
expect(result.nativeHarnessCompaction).toBeUndefined();
331336
expect(result.model).toBe("gpt-5.5");
332337
expect(result.authProfileId).toBeUndefined();
333338
});
@@ -387,6 +392,7 @@ describe("buildEmbeddedCompactionRuntimeContext", () => {
387392
expect(result.provider).toBe("openai");
388393
expect(result.runtimeProvider).toBeUndefined();
389394
expect(result.contextProvider).toBeUndefined();
395+
expect(result.nativeHarnessCompaction).toBe(true);
390396
expect(result.model).toBe("gpt-5.4-mini");
391397
expect(result.authProfileId).toBeUndefined();
392398
});

src/agents/embedded-agent-runner/compaction-runtime-context.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ export function resolveEmbeddedCompactionTarget(params: {
7070
provider: string | undefined;
7171
runtimeProvider?: string;
7272
contextProvider?: string;
73+
nativeHarnessCompaction?: boolean;
7374
model: string | undefined;
7475
authProfileId: string | undefined;
7576
} {
@@ -99,6 +100,7 @@ export function resolveEmbeddedCompactionTarget(params: {
99100
return {
100101
runtimeProvider: routedRuntimeProvider,
101102
contextProvider: useCodexHarnessRuntime ? routedRuntimeProvider : undefined,
103+
...(useCodexHarnessRuntime ? { nativeHarnessCompaction: true } : {}),
102104
};
103105
};
104106
if (!override) {

0 commit comments

Comments
 (0)