From 80beef6ff73643de49b9fc39b26625cde1e8b205 Mon Sep 17 00:00:00 2001 From: Marvinthebored Date: Sat, 22 Aug 2026 13:02:48 +0800 Subject: [PATCH] fix(codex): accept bounded upstream prompt provenance (#127730) Allow exact upstream prompt provenance to use the existing 512 KiB settled-projection budget while preserving ordinary text bounds and aggregate accounting. Co-authored-by: Marvinthebored --- .../settled-turn-projection.test.ts | 48 +++++++++++++++++++ .../src/app-server/settled-turn-projection.ts | 5 +- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/extensions/codex/src/app-server/settled-turn-projection.test.ts b/extensions/codex/src/app-server/settled-turn-projection.test.ts index cadd038bd8f3..5cb3ad0fd8d7 100644 --- a/extensions/codex/src/app-server/settled-turn-projection.test.ts +++ b/extensions/codex/src/app-server/settled-turn-projection.test.ts @@ -1,6 +1,7 @@ import type { AgentMessage } from "openclaw/plugin-sdk/agent-harness-runtime"; import { describe, expect, it } from "vitest"; import { projectSettledCodexMessages } from "./settled-turn-projection.js"; +import { attachUpstreamUserText } from "./upstream-prompt-provenance.js"; function message(value: unknown): AgentMessage { return value as AgentMessage; @@ -196,6 +197,53 @@ describe("projectSettledCodexMessages", () => { }); }); + it("preserves upstream user text above the ordinary message limit", () => { + const upstreamUserText = "x".repeat(64 * 1024 + 1); + + expect( + projectSettledCodexMessages([ + attachUpstreamUserText( + message({ role: "user", content: "[Telegram metadata] decorated prompt" }), + upstreamUserText, + ), + toolCall(), + toolResult(), + ])[0], + ).toEqual({ + type: "message", + role: "user", + content: [{ type: "input_text", text: upstreamUserText }], + }); + }); + + it("rejects upstream user text above the projection limit", () => { + expect(() => + projectSettledCodexMessages([ + attachUpstreamUserText( + message({ role: "user", content: "[Telegram metadata] decorated prompt" }), + "x".repeat(512 * 1024 + 1), + ), + toolCall(), + toolResult(), + ]), + ).toThrow("oversized upstream user text"); + }); + + it("charges upstream user text against the aggregate byte limit", () => { + expect(() => + projectSettledCodexMessages([ + attachUpstreamUserText( + message({ role: "user", content: "decorated" }), + "x".repeat(400 * 1024), + ), + message({ role: "user", content: "x".repeat(60 * 1024) }), + message({ role: "user", content: "x".repeat(60 * 1024) }), + toolCall(), + toolResult(), + ]), + ).toThrow("exceeds the byte limit"); + }); + it("does not let provenance hide non-text user content", () => { expect(() => projectSettledCodexMessages([ diff --git a/extensions/codex/src/app-server/settled-turn-projection.ts b/extensions/codex/src/app-server/settled-turn-projection.ts index 5cf8f27720e9..6da6c25f7e3c 100644 --- a/extensions/codex/src/app-server/settled-turn-projection.ts +++ b/extensions/codex/src/app-server/settled-turn-projection.ts @@ -93,7 +93,10 @@ function projectUserMessage(message: Extract): J type: "message", role: "user", content: [ - { type: "input_text", text: requireBoundedText(upstreamUserText, "upstream user text") }, + { + type: "input_text", + text: requireBoundedText(upstreamUserText, "upstream user text", MAX_PROJECTION_BYTES), + }, ], }, ];