





















@@ -237,14 +237,18 @@ function expectRequestInputTextContains(
237237harness: ReturnType<typeof createStartedThreadHarness>,
238238expected: string,
239239): void {
240+expect(getRequestInputText(harness)).toContain(expected);
241+}
242+243+function getRequestInputText(harness: ReturnType<typeof createStartedThreadHarness>): string {
240244const params = requireRequestParams(harness, "turn/start");
241245const input = requireArray(params.input, "turn/start input");
242-expect(
243-input.some((entry) => {
246+return input
247+.map((entry) => {
244248const item = requireRecord(entry, "turn/start input entry");
245-return item.type === "text" && optionalString(item.text).includes(expected);
246-}),
247-).toBe(true);
249+return item.type === "text" ? optionalString(item.text) : "";
250+})
251+ .join("\n");
248252}
249253250254describe("runCodexAppServerAttempt context-engine lifecycle", () => {
@@ -310,6 +314,37 @@ describe("runCodexAppServerAttempt context-engine lifecycle", () => {
310314expect(openSpy).not.toHaveBeenCalled();
311315});
312316317+it("keeps current-turn context at the front of the Codex context-engine prompt", async () => {
318+const sessionFile = path.join(tempDir, "session.jsonl");
319+const workspaceDir = path.join(tempDir, "workspace");
320+SessionManager.open(sessionFile).appendMessage(
321+assistantMessage("older context", Date.now()) as never,
322+);
323+const contextEngine = createContextEngine();
324+const harness = createStartedThreadHarness();
325+const params = createParams(sessionFile, workspaceDir);
326+params.contextEngine = contextEngine;
327+params.currentTurnContext = {
328+text: [
329+"Conversation context (untrusted, chronological, selected for current message):",
330+"#6474 Sun 2026-05-10 22:22 GMT+5:30 [reply target] OpenClaw: anchor REPLYCTX this is the old message",
331+"#6498 Sun 2026-05-10 22:22 GMT+5:30 OpenClaw: filler REPLYCTX 23",
332+].join("\n"),
333+};
334+335+const run = runCodexAppServerAttempt(params);
336+await harness.waitForMethod("turn/start");
337+338+const inputText = getRequestInputText(harness);
339+expect(inputText).toContain("OpenClaw assembled context for this turn:");
340+expect(inputText).toContain("Current user request:\nhello");
341+expect(inputText).toContain("[reply target] OpenClaw: anchor REPLYCTX");
342+expect(inputText.trim().startsWith("Conversation context (untrusted")).toBe(true);
343+344+await harness.completeTurn();
345+await run;
346+});
347+313348it("calls afterTurn with the mirrored transcript and runs turn maintenance", async () => {
314349const sessionFile = path.join(tempDir, "session.jsonl");
315350const workspaceDir = path.join(tempDir, "workspace");
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。