From 21d61c69d76816fac050eb42c6fc239c03e7f656 Mon Sep 17 00:00:00 2001 From: KooshaPari <42529354+KooshaPari@users.noreply.github.com> Date: Sun, 21 Jun 2026 04:58:49 -0700 Subject: [PATCH] fix(integration): restore codex and memory pipeline contracts (#4474) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks @KooshaPari! Rebased onto release/v3.8.32 (clean cherry-pick — coexists with #4467's specialty changes, 118/118 unit + 12/12 memory-pipeline integration). Codex fingerprint ordering + memory-search contract fixes land. --- open-sse/config/cliFingerprints.ts | 2 +- open-sse/mcp-server/tools/memoryTools.ts | 11 ++++-- tests/integration/memory-pipeline.test.ts | 3 ++ tests/unit/cli-fingerprints.test.ts | 36 +++++++++++++++++++ tests/unit/memory-tools.test.ts | 9 ++--- .../provider-validation-specialty.test.ts | 6 ++-- 6 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 tests/unit/cli-fingerprints.test.ts diff --git a/open-sse/config/cliFingerprints.ts b/open-sse/config/cliFingerprints.ts index c1d2ef442d..38bfacbd34 100644 --- a/open-sse/config/cliFingerprints.ts +++ b/open-sse/config/cliFingerprints.ts @@ -49,11 +49,11 @@ export const CLI_FINGERPRINTS: Record = { "instructions", "store", "reasoning", + "prompt_cache_key", "tools", "tool_choice", "include", "service_tier", - "prompt_cache_key", "client_metadata", "parallel_tool_calls", "metadata", diff --git a/open-sse/mcp-server/tools/memoryTools.ts b/open-sse/mcp-server/tools/memoryTools.ts index a41cdeebcd..908970f2e1 100644 --- a/open-sse/mcp-server/tools/memoryTools.ts +++ b/open-sse/mcp-server/tools/memoryTools.ts @@ -2,7 +2,11 @@ import { z } from "zod"; import { retrieveMemories } from "@/lib/memory/retrieval"; import { createMemory, deleteMemory, listMemories } from "@/lib/memory/store"; import { MemoryType } from "@/lib/memory/types"; -import { getMemorySettings, toMemoryRetrievalConfig, DEFAULT_MEMORY_SETTINGS } from "@/lib/memory/settings"; +import { + getMemorySettings, + toMemoryRetrievalConfig, + DEFAULT_MEMORY_SETTINGS, +} from "@/lib/memory/settings"; export const MemorySearchSchema = z.object({ apiKeyId: z.string(), @@ -44,7 +48,10 @@ export const memoryTools = { const config = { ...baseConfig, - maxTokens: args.maxTokens || (baseConfig.maxTokens ?? DEFAULT_MEMORY_SETTINGS.maxTokens), + enabled: true, + maxTokens: + args.maxTokens ?? + (memorySettings.enabled ? memorySettings.maxTokens : DEFAULT_MEMORY_SETTINGS.maxTokens), }; const memories = await retrieveMemories(args.apiKeyId, config); diff --git a/tests/integration/memory-pipeline.test.ts b/tests/integration/memory-pipeline.test.ts index 998b17c0ec..ac1bfcb09e 100644 --- a/tests/integration/memory-pipeline.test.ts +++ b/tests/integration/memory-pipeline.test.ts @@ -10,6 +10,7 @@ const harness = await createChatPipelineHarness("memory-pipeline"); // The harness sets DATA_DIR before importing DB modules, so these must resolve after that. const { extractFactsFromText } = await import("../../src/lib/memory/extraction.ts"); const { retrieveMemories } = await import("../../src/lib/memory/retrieval.ts"); +const { invalidateMemorySettingsCache } = await import("../../src/lib/memory/settings.ts"); const { injectMemory, formatMemoryContext } = await import("../../src/lib/memory/injection.ts"); const { BaseExecutor, @@ -45,12 +46,14 @@ function dropFts5Artifacts() { test.beforeEach(async () => { BaseExecutor.RETRY_CONFIG.delayMs = 0; await resetStorage(); + invalidateMemorySettingsCache(); dropFts5Artifacts(); }); test.afterEach(async () => { BaseExecutor.RETRY_CONFIG.delayMs = harness.originalRetryDelayMs; await resetStorage(); + invalidateMemorySettingsCache(); }); test.after(async () => { diff --git a/tests/unit/cli-fingerprints.test.ts b/tests/unit/cli-fingerprints.test.ts new file mode 100644 index 0000000000..9728de135e --- /dev/null +++ b/tests/unit/cli-fingerprints.test.ts @@ -0,0 +1,36 @@ +import test from "node:test"; +import assert from "node:assert/strict"; + +const { applyFingerprint } = await import("../../open-sse/config/cliFingerprints.ts"); + +test("Codex CLI fingerprint orders prompt_cache_key before include", () => { + const body = { + model: "gpt-5.5-low", + stream: true, + input: [{ role: "user", content: "hello" }], + instructions: "You are Codex.", + store: false, + reasoning: { effort: "low" }, + tools: [], + tool_choice: "auto", + include: ["reasoning.encrypted_content"], + prompt_cache_key: "conv-codex", + service_tier: "priority", + }; + + const result = applyFingerprint("codex", {}, body); + const orderedKeys = Object.keys(JSON.parse(result.bodyString)); + + assert.deepEqual(orderedKeys.slice(0, 10), [ + "model", + "stream", + "input", + "instructions", + "store", + "reasoning", + "prompt_cache_key", + "tools", + "tool_choice", + "include", + ]); +}); diff --git a/tests/unit/memory-tools.test.ts b/tests/unit/memory-tools.test.ts index 6f3d8623ea..4e021834ce 100644 --- a/tests/unit/memory-tools.test.ts +++ b/tests/unit/memory-tools.test.ts @@ -119,7 +119,7 @@ test("memory search respects a configured zero token budget", async () => { assert.equal(result.data.totalTokens, 0); }); -test("memory search keeps globally disabled memory disabled with explicit maxTokens", async () => { +test("memory search runs explicitly even when global memory injection is disabled", async () => { await settingsDb.updateSettings({ memoryEnabled: false, memoryMaxTokens: 2000 }); invalidateMemorySettingsCache(); @@ -137,9 +137,10 @@ test("memory search keeps globally disabled memory disabled with explicit maxTok }); assert.equal(result.success, true); - assert.equal(result.data.count, 0); - assert.deepEqual(result.data.memories, []); - assert.equal(result.data.totalTokens, 0); + assert.equal(result.data.count, 1); + assert.equal(result.data.memories.length, 1); + assert.match(result.data.memories[0].content, /TypeScript/i); + assert.ok(result.data.totalTokens > 0); }); test("memory clear deletes only older filtered entries and reports the deleted count", async () => { diff --git a/tests/unit/provider-validation-specialty.test.ts b/tests/unit/provider-validation-specialty.test.ts index 8d0faa9ec4..51187247ea 100644 --- a/tests/unit/provider-validation-specialty.test.ts +++ b/tests/unit/provider-validation-specialty.test.ts @@ -372,12 +372,12 @@ test("web-cookie provider validators surface auth and subscription failures", as __setPplxTlsFetchOverride(async () => { return { status: 403, headers: new Headers(), text: null, body: null }; }); + __setGrokTlsFetchOverride(async () => { + return { status: 401, headers: new Headers(), text: "Unauthorized", body: null }; + }); globalThis.fetch = async (url, init = {}) => { const target = String(url); - if (target.includes("grok.com/rest/app-chat/conversations/new")) { - return new Response(JSON.stringify({ error: "unauthorized" }), { status: 401 }); - } if (target.includes("app.blackbox.ai/api/auth/session")) { const cookie = (init.headers as Record)?.Cookie || ""; if (cookie.includes("expired-cookie")) {