From 4de1765a83138aeed54518060d1fd61d17a42f85 Mon Sep 17 00:00:00 2001 From: Sisyphus Date: Sat, 22 Aug 2026 21:17:42 +0800 Subject: [PATCH] fix(loop): run applyCompression over the unpruned view (billion-context-pi#195) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The streaming loop ctx passed processedMessages (pruned view with acp_summary_* stripped) to applyCompression, so active blocks whose raws were pruned had no resolvable anchor — bN promotion failed with the self-contradictory 'already compressed' error. Add a dedicated compressMessages field (unpruned originalMessages) used only by applyCompression; wire rebuilds keep using the pruned view. --- src/loop/core.ts | 2 ++ src/server.ts | 2 +- src/stream.ts | 6 +++++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/loop/core.ts b/src/loop/core.ts index a8e873b..4f50098 100644 --- a/src/loop/core.ts +++ b/src/loop/core.ts @@ -28,6 +28,8 @@ export interface LoopCtx { core: CompressionCore; config: Config; messages: CoreMessage[]; + /** View handed to applyCompression (see RewriteCtx.compressMessages). */ + compressMessages?: CoreMessage[]; session: Session; log: (msg: string) => void; proxyUrl?: string; diff --git a/src/server.ts b/src/server.ts index b40842e..00065c1 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1649,7 +1649,7 @@ async function forward( const adapter = pickAdapter(prepared.protocol, parsedReq, textProtocol, prepared.responsesProjection, prepared.anthropicSystem); const loop = runCompressLoop( streamToRead, - { core, config, messages: prepared.processedMessages.length > 0 ? prepared.processedMessages : prepared.originalMessages, session: prepared.session, log: ctx.log, proxyUrl, protocol: prepared.protocol, textProtocol, debug: opts.debug, nudge: prepared.nudge }, + { core, config, messages: prepared.processedMessages.length > 0 ? prepared.processedMessages : prepared.originalMessages, compressMessages: prepared.originalMessages, session: prepared.session, log: ctx.log, proxyUrl, protocol: prepared.protocol, textProtocol, debug: opts.debug, nudge: prepared.nudge }, parsedReq, { url: upstreamUrl, headers: reqHeaders }, adapter, diff --git a/src/stream.ts b/src/stream.ts index 770722c..3b40aa8 100644 --- a/src/stream.ts +++ b/src/stream.ts @@ -8,6 +8,10 @@ export type RewriteCtx = { core: CompressionCore; config: Config; messages: CoreMessage[]; + /** View handed to applyCompression. Defaults to `messages`; hosts whose + * `messages` view has pruned/hidden content (so block anchors can't + * resolve) pass the unpruned log here (billion-context-pi#195). */ + compressMessages?: CoreMessage[]; session: Session; log: (msg: string) => void; debug?: boolean; @@ -227,7 +231,7 @@ export function applyRanges(ranges: ReturnType, ctx: try { const res = ctx.core.applyCompression({ ranges, - messages: ctx.messages, + messages: ctx.compressMessages ?? ctx.messages, state: ctx.session.state, config: ctx.config, });