test: remove codex context-engine transcript locators

This commit is contained in:
Peter Steinberger
2026-05-09 16:32:01 +01:00
parent 40c15dea90
commit 24e1fe3bf2

View File

@@ -5,9 +5,7 @@ import type { AgentMessage } from "openclaw/plugin-sdk/agent-core";
import type { EmbeddedRunAttemptParams } from "openclaw/plugin-sdk/agent-harness";
import {
appendSqliteSessionTranscriptEvent,
createSqliteSessionTranscriptLocator,
embeddedAgentLog,
SessionManager,
type HarnessContextEngine as ContextEngine,
} from "openclaw/plugin-sdk/agent-harness-runtime";
import { replaceSqliteSessionTranscriptEvents } from "openclaw/plugin-sdk/session-store-runtime";
@@ -22,12 +20,11 @@ import { createCodexTestModel } from "./test-support.js";
let tempDir: string;
function createParams(transcriptLocator: string, workspaceDir: string): EmbeddedRunAttemptParams {
function createParams(sessionId: string, workspaceDir: string): EmbeddedRunAttemptParams {
return {
prompt: "hello",
sessionId: "session-1",
sessionKey: "agent:main:session-1",
transcriptLocator,
sessionId,
workspaceDir,
runId: "run-1",
provider: "codex",
@@ -70,10 +67,10 @@ function userMessage(text: string, timestamp: number): AgentMessage {
} as AgentMessage;
}
function seedSessionTranscript(transcriptLocator: string, messages: AgentMessage[]): void {
function seedSessionTranscript(sessionId: string, messages: AgentMessage[]): void {
replaceSqliteSessionTranscriptEvents({
agentId: "main",
sessionId: "session-1",
sessionId,
events: [
{
type: "session",
@@ -92,8 +89,8 @@ function seedSessionTranscript(transcriptLocator: string, messages: AgentMessage
});
}
function testTranscriptLocator(sessionId = "session-1"): string {
return createSqliteSessionTranscriptLocator({ agentId: "main", sessionId });
function testSessionId(sessionId = "session-1"): string {
return sessionId;
}
function threadStartResult(threadId = "thread-1") {
@@ -300,13 +297,12 @@ describe("runCodexAppServerAttempt context-engine lifecycle", () => {
});
it("bootstraps and assembles non-legacy context before the Codex turn starts", async () => {
const transcriptLocator = testTranscriptLocator();
const sessionId = testSessionId();
const workspaceDir = path.join(tempDir, "workspace");
seedSessionTranscript(transcriptLocator, [assistantMessage("existing context", Date.now())]);
const openSpy = vi.spyOn(SessionManager, "open");
seedSessionTranscript(sessionId, [assistantMessage("existing context", Date.now())]);
const contextEngine = createContextEngine();
const harness = createStartedThreadHarness();
const params = createParams(transcriptLocator, workspaceDir);
const params = createParams(sessionId, workspaceDir);
params.contextEngine = contextEngine;
params.contextTokenBudget = 321;
params.config = { memory: { citations: "on" } } as EmbeddedRunAttemptParams["config"];
@@ -318,18 +314,18 @@ describe("runCodexAppServerAttempt context-engine lifecycle", () => {
throw new Error("expected bootstrap hook");
}
expect(contextEngine.bootstrap).toHaveBeenCalledTimes(1);
const bootstrapParams = requireFirstCallArg(contextEngine.bootstrap, "bootstrap") as Parameters<
NonNullable<ContextEngine["bootstrap"]>
>[0];
expect(bootstrapParams.sessionId).toBe("session-1");
const bootstrapParams = requireFirstCallArg<
Parameters<NonNullable<ContextEngine["bootstrap"]>>[0]
>(contextEngine.bootstrap, "bootstrap");
expect(bootstrapParams.sessionId).toBe(sessionId);
expect(bootstrapParams.sessionKey).toBe("agent:main:session-1");
expect(bootstrapParams.transcriptLocator).toBe(transcriptLocator);
expect(contextEngine.assemble).toHaveBeenCalledTimes(1);
const assembleParams = requireFirstCallArg(contextEngine.assemble, "assemble") as Parameters<
ContextEngine["assemble"]
>[0];
expect(assembleParams.sessionId).toBe("session-1");
const assembleParams = requireFirstCallArg<Parameters<ContextEngine["assemble"]>[0]>(
contextEngine.assemble,
"assemble",
);
expect(assembleParams.sessionId).toBe(sessionId);
expect(assembleParams.sessionKey).toBe("agent:main:session-1");
expect(assembleParams.tokenBudget).toBe(321);
expect(assembleParams.citationsMode).toBe("on");
@@ -346,7 +342,6 @@ describe("runCodexAppServerAttempt context-engine lifecycle", () => {
await harness.completeTurn();
await run;
expect(openSpy).not.toHaveBeenCalled();
});
it("keeps current-turn context at the front of the Codex context-engine prompt", async () => {
@@ -381,7 +376,7 @@ describe("runCodexAppServerAttempt context-engine lifecycle", () => {
});
it("calls afterTurn with the mirrored transcript and runs turn maintenance", async () => {
const transcriptLocator = testTranscriptLocator();
const sessionId = testSessionId();
const workspaceDir = path.join(tempDir, "workspace");
const afterTurn = vi.fn(
async (_params: Parameters<NonNullable<ContextEngine["afterTurn"]>>[0]) => undefined,
@@ -389,7 +384,7 @@ describe("runCodexAppServerAttempt context-engine lifecycle", () => {
const maintain = vi.fn(async () => ({ changed: false, bytesFreed: 0, rewrittenEntries: 0 }));
const contextEngine = createContextEngine({ afterTurn, maintain, bootstrap: undefined });
const harness = createStartedThreadHarness();
const params = createParams(transcriptLocator, workspaceDir);
const params = createParams(sessionId, workspaceDir);
params.contextEngine = contextEngine;
params.contextTokenBudget = 111;
@@ -399,10 +394,10 @@ describe("runCodexAppServerAttempt context-engine lifecycle", () => {
await run;
expect(afterTurn).toHaveBeenCalledTimes(1);
const afterTurnCall = requireFirstCallArg(afterTurn, "afterTurn") as Parameters<
NonNullable<ContextEngine["afterTurn"]>
>[0];
expect(afterTurnCall.sessionId).toBe("session-1");
const afterTurnCall = requireFirstCallArg<
Parameters<NonNullable<ContextEngine["afterTurn"]>>[0]
>(afterTurn, "afterTurn");
expect(afterTurnCall.sessionId).toBe(sessionId);
expect(afterTurnCall.sessionKey).toBe("agent:main:session-1");
expect(afterTurnCall.prePromptMessageCount).toBe(0);
expect(afterTurnCall.tokenBudget).toBe(111);
@@ -412,9 +407,9 @@ describe("runCodexAppServerAttempt context-engine lifecycle", () => {
});
it("reloads mirrored history after bootstrap mutates the session transcript", async () => {
const transcriptLocator = testTranscriptLocator();
const sessionId = testSessionId();
const workspaceDir = path.join(tempDir, "workspace");
seedSessionTranscript(transcriptLocator, [assistantMessage("existing context", Date.now())]);
seedSessionTranscript(sessionId, [assistantMessage("existing context", Date.now())]);
const afterTurn = vi.fn(
async (_params: Parameters<NonNullable<ContextEngine["afterTurn"]>>[0]) => undefined,
);
@@ -440,7 +435,7 @@ describe("runCodexAppServerAttempt context-engine lifecycle", () => {
maintain: undefined,
});
const harness = createStartedThreadHarness();
const params = createParams(transcriptLocator, workspaceDir);
const params = createParams(sessionId, workspaceDir);
params.contextEngine = contextEngine;
const run = runCodexAppServerAttempt(params);
@@ -463,7 +458,7 @@ describe("runCodexAppServerAttempt context-engine lifecycle", () => {
});
it("logs assemble failures as a formatted message instead of the raw error object", async () => {
const transcriptLocator = testTranscriptLocator();
const sessionId = testSessionId();
const workspaceDir = path.join(tempDir, "workspace");
const rawError = new Error("Authorization: Bearer sk-abcdefghijklmnopqrstuv");
const contextEngine = createContextEngine({
@@ -474,7 +469,7 @@ describe("runCodexAppServerAttempt context-engine lifecycle", () => {
});
const warn = vi.spyOn(embeddedAgentLog, "warn").mockImplementation(() => undefined);
const harness = createStartedThreadHarness();
const params = createParams(transcriptLocator, workspaceDir);
const params = createParams(sessionId, workspaceDir);
params.contextEngine = contextEngine;
const run = runCodexAppServerAttempt(params);
@@ -492,7 +487,7 @@ describe("runCodexAppServerAttempt context-engine lifecycle", () => {
});
it("falls back to ingestBatch and skips turn maintenance on prompt failure", async () => {
const transcriptLocator = testTranscriptLocator();
const sessionId = testSessionId();
const workspaceDir = path.join(tempDir, "workspace");
const ingestBatch = vi.fn(async () => ({ ingestedCount: 2 }));
const maintain = vi.fn(async () => ({ changed: false, bytesFreed: 0, rewrittenEntries: 0 }));
@@ -503,7 +498,7 @@ describe("runCodexAppServerAttempt context-engine lifecycle", () => {
bootstrap: undefined,
});
const harness = createStartedThreadHarness();
const params = createParams(transcriptLocator, workspaceDir);
const params = createParams(sessionId, workspaceDir);
params.contextEngine = contextEngine;
const run = runCodexAppServerAttempt(params);