The saveConfig() function only includes a hardcoded subset of properties when writing the config file. Any property not explicitly listed (like disableResponseStorage) will be dropped. I have added `disableResponseStorage` to the `configToSave` object as the immediate fix. [Linking Issue this fixes.](https://github.com/openai/codex/issues/726)
94 lines
2.8 KiB
TypeScript
94 lines
2.8 KiB
TypeScript
/**
|
|
* codex-cli/tests/disableResponseStorage.agentLoop.test.ts
|
|
*
|
|
* Verifies AgentLoop's request-building logic for both values of
|
|
* disableResponseStorage.
|
|
*/
|
|
|
|
import { describe, it, expect, vi } from "vitest";
|
|
import { AgentLoop } from "../src/utils/agent/agent-loop";
|
|
import type { AppConfig } from "../src/utils/config";
|
|
import { ReviewDecision } from "../src/utils/agent/review";
|
|
|
|
/* ─────────── 1. Spy + module mock ─────────────────────────────── */
|
|
const createSpy = vi.fn().mockResolvedValue({
|
|
data: { id: "resp_123", status: "completed", output: [] },
|
|
});
|
|
|
|
vi.mock("openai", () => ({
|
|
default: class {
|
|
public responses = { create: createSpy };
|
|
},
|
|
APIConnectionTimeoutError: class extends Error {},
|
|
}));
|
|
|
|
/* ─────────── 2. Parametrised tests ─────────────────────────────── */
|
|
describe.each([
|
|
{ flag: true, title: "omits previous_response_id & sets store:false" },
|
|
{ flag: false, title: "sends previous_response_id & allows store:true" },
|
|
])("AgentLoop with disableResponseStorage=%s", ({ flag, title }) => {
|
|
/* build a fresh config for each case */
|
|
const cfg: AppConfig = {
|
|
model: "o4-mini",
|
|
provider: "openai",
|
|
instructions: "",
|
|
disableResponseStorage: flag,
|
|
notify: false,
|
|
};
|
|
|
|
it(title, async () => {
|
|
/* reset spy per iteration */
|
|
createSpy.mockClear();
|
|
|
|
const loop = new AgentLoop({
|
|
model: cfg.model,
|
|
provider: cfg.provider,
|
|
config: cfg,
|
|
instructions: "",
|
|
approvalPolicy: "suggest",
|
|
disableResponseStorage: flag,
|
|
additionalWritableRoots: [],
|
|
onItem() {},
|
|
onLoading() {},
|
|
getCommandConfirmation: async () => ({ review: ReviewDecision.YES }),
|
|
onLastResponseId() {},
|
|
});
|
|
|
|
await loop.run([
|
|
{
|
|
type: "message",
|
|
role: "user",
|
|
content: [{ type: "input_text", text: "hello" }],
|
|
},
|
|
]);
|
|
|
|
expect(createSpy).toHaveBeenCalledTimes(1);
|
|
|
|
const call = createSpy.mock.calls[0];
|
|
if (!call) {
|
|
throw new Error("Expected createSpy to have been called at least once");
|
|
}
|
|
const payload: any = call[0];
|
|
|
|
if (flag) {
|
|
/* behaviour when ZDR is *on* */
|
|
expect(payload).not.toHaveProperty("previous_response_id");
|
|
if (payload.input) {
|
|
payload.input.forEach((m: any) => {
|
|
expect(m.store === undefined ? false : m.store).toBe(false);
|
|
});
|
|
}
|
|
} else {
|
|
/* behaviour when ZDR is *off* */
|
|
expect(payload).toHaveProperty("previous_response_id");
|
|
if (payload.input) {
|
|
payload.input.forEach((m: any) => {
|
|
if ("store" in m) {
|
|
expect(m.store).not.toBe(false);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
});
|
|
});
|