


























@@ -3,12 +3,35 @@ import os from "node:os";
33import path from "node:path";
44import type { HarnessContextEngine as ContextEngine } from "openclaw/plugin-sdk/agent-harness-runtime";
55import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6+import type { CodexAppServerClientFactory } from "./client-factory.js";
67import type { CodexAppServerClient } from "./client.js";
7-import { maybeCompactCodexAppServerSession, __testing } from "./compact.js";
8+import { maybeCompactCodexAppServerSession as maybeCompactCodexAppServerSessionImpl } from "./compact.js";
89import type { CodexServerNotification } from "./protocol.js";
910import { writeCodexAppServerBinding } from "./session-binding.js";
10111112let tempDir: string;
13+let codexAppServerClientFactoryForTest: CodexAppServerClientFactory | undefined;
14+15+type MaybeCompactOptions = NonNullable<Parameters<typeof maybeCompactCodexAppServerSessionImpl>[1]>;
16+17+function setCodexAppServerClientFactoryForTest(factory: CodexAppServerClientFactory): void {
18+codexAppServerClientFactoryForTest = factory;
19+}
20+21+function resetCodexAppServerClientFactoryForTest(): void {
22+codexAppServerClientFactoryForTest = undefined;
23+}
24+25+function maybeCompactCodexAppServerSession(
26+params: Parameters<typeof maybeCompactCodexAppServerSessionImpl>[0],
27+options: MaybeCompactOptions = {},
28+) {
29+const clientFactory = options.clientFactory ?? codexAppServerClientFactoryForTest;
30+return maybeCompactCodexAppServerSessionImpl(
31+params,
32+clientFactory ? { ...options, clientFactory } : options,
33+);
34+}
12351336async function writeTestBinding(options: { authProfileId?: string } = {}): Promise<string> {
1437const sessionFile = path.join(tempDir, "session.jsonl");
@@ -49,13 +72,13 @@ describe("maybeCompactCodexAppServerSession", () => {
4972});
50735174afterEach(async () => {
52-__testing.resetCodexAppServerClientFactoryForTests();
75+resetCodexAppServerClientFactoryForTest();
5376await fs.rm(tempDir, { recursive: true, force: true });
5477});
55785679it("waits for native app-server compaction before reporting success", async () => {
5780const fake = createFakeCodexClient();
58-__testing.setCodexAppServerClientFactoryForTests(async () => fake.client);
81+setCodexAppServerClientFactoryForTest(async () => fake.client);
5982const sessionFile = await writeTestBinding();
60836184const pendingResult = startCompaction(sessionFile, { currentTokenCount: 123 });
@@ -88,7 +111,7 @@ describe("maybeCompactCodexAppServerSession", () => {
8811189112it("accepts native context-compaction item completion as success", async () => {
90113const fake = createFakeCodexClient();
91-__testing.setCodexAppServerClientFactoryForTests(async () => fake.client);
114+setCodexAppServerClientFactoryForTest(async () => fake.client);
92115const sessionFile = await writeTestBinding();
9311694117const pendingResult = startCompaction(sessionFile);
@@ -115,7 +138,7 @@ describe("maybeCompactCodexAppServerSession", () => {
115138it("reuses the bound auth profile for native compaction", async () => {
116139const fake = createFakeCodexClient();
117140let seenAuthProfileId: string | undefined;
118-__testing.setCodexAppServerClientFactoryForTests(async (_startOptions, authProfileId) => {
141+setCodexAppServerClientFactoryForTest(async (_startOptions, authProfileId) => {
119142seenAuthProfileId = authProfileId;
120143return fake.client;
121144});
@@ -137,7 +160,7 @@ describe("maybeCompactCodexAppServerSession", () => {
137160it("fails closed when the persisted binding auth profile disagrees with the runtime request", async () => {
138161const fake = createFakeCodexClient();
139162const factory = vi.fn(async () => fake.client);
140-__testing.setCodexAppServerClientFactoryForTests(factory);
163+setCodexAppServerClientFactoryForTest(factory);
141164const sessionFile = path.join(tempDir, "session.jsonl");
142165await writeCodexAppServerBinding(sessionFile, {
143166threadId: "thread-1",
@@ -163,7 +186,7 @@ describe("maybeCompactCodexAppServerSession", () => {
163186164187it("prefers owning context-engine compaction and records native status separately", async () => {
165188const fake = createFakeCodexClient();
166-__testing.setCodexAppServerClientFactoryForTests(async () => fake.client);
189+setCodexAppServerClientFactoryForTest(async () => fake.client);
167190const sessionFile = await writeTestBinding();
168191const compact = vi.fn(async (_params: unknown) => ({
169192ok: true,
@@ -260,7 +283,7 @@ describe("maybeCompactCodexAppServerSession", () => {
260283261284it("still runs native compaction when context-engine maintenance fails", async () => {
262285const fake = createFakeCodexClient();
263-__testing.setCodexAppServerClientFactoryForTests(async () => fake.client);
286+setCodexAppServerClientFactoryForTest(async () => fake.client);
264287const sessionFile = await writeTestBinding();
265288const contextEngine: ContextEngine = {
266289info: { id: "lossless-claw", name: "Lossless Claw", ownsCompaction: true },
@@ -307,7 +330,7 @@ describe("maybeCompactCodexAppServerSession", () => {
307330308331it("records native compaction status when primary compaction has no result payload", async () => {
309332const fake = createFakeCodexClient();
310-__testing.setCodexAppServerClientFactoryForTests(async () => fake.client);
333+setCodexAppServerClientFactoryForTest(async () => fake.client);
311334const sessionFile = await writeTestBinding();
312335const contextEngine: ContextEngine = {
313336info: { id: "lossless-claw", name: "Lossless Claw", ownsCompaction: true },
@@ -350,7 +373,7 @@ describe("maybeCompactCodexAppServerSession", () => {
350373351374it("reports context-engine compaction errors without skipping native compaction", async () => {
352375const fake = createFakeCodexClient();
353-__testing.setCodexAppServerClientFactoryForTests(async () => fake.client);
376+setCodexAppServerClientFactoryForTest(async () => fake.client);
354377const sessionFile = await writeTestBinding();
355378const contextEngine: ContextEngine = {
356379info: { id: "lossless-claw", name: "Lossless Claw", ownsCompaction: true },
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。