billion-context 0.1.69 → 0.1.70-pr.458.275

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -65,7 +65,8 @@ The proxy runs in one of two modes, and **the mode decides who executes
65
65
  | **Summary carrier on the wire** | **the `compress` tool call** | **an `acp_summary` user message** |
66
66
  | System messages on the wire | always exactly 1 (client + prompt) | always exactly 1 (client + prompt) — summaries ride on user messages |
67
67
  | SGLang "single system" 400 (#377) | cannot happen | cannot happen (summaries are user messages, not system) |
68
- | Proxy-injected tools + nudge | none (agent owns compression) | the 4 context tools + nudge (when enabled) |
68
+ | Proxy-injected `compress` tools | none — the agent registers the 4 ACP tools natively | the 4 context tools (when enabled) |
69
+ | Proxy-injected nudge | **yes** — the agent has no nudge channel of its own, so the proxy-side nudge is the proactive compression trigger (preflight alone only fires at the hard limit; #451) | yes (when enabled) |
69
70
 
70
71
  **Why the carriers differ.** In plugin mode the agent owns compression: the
71
72
  `compress` call + result live in the agent's own history and are re-sent every
package/dist/index.js CHANGED
@@ -51584,6 +51584,20 @@ async function* runCompressLoop(upstream, ctx, requestBody, requestOptions, adap
51584
51584
  coreMessages.push(...hidden.messages);
51585
51585
  }
51586
51586
  }
51587
+ if (ctx.refreshFolded && proxyResults.some((pr2) => pr2.name === "compress" && !pr2.result.includes("FAILED"))) {
51588
+ try {
51589
+ const refreshed = ctx.refreshFolded(coreMessages);
51590
+ if (refreshed.length > 0) {
51591
+ coreMessages.length = 0;
51592
+ coreMessages.push(...refreshed);
51593
+ ctx.session.stats.compressCreditTokens = 0;
51594
+ ctx.log(`[acp-loop] round ${round}: re-request view refreshed to post-compress fold`);
51595
+ }
51596
+ } catch (err2) {
51597
+ ctx.log(`[acp-loop] round ${round}: fold refresh failed (${String(err2)}); keeping pre-compress view`);
51598
+ log("warn", `[acp-loop] fold refresh failed: ${String(err2)}`);
51599
+ }
51600
+ }
51587
51601
  }
51588
51602
  for (const tc of realToolCalls) {
51589
51603
  if (tc.passthrough) continue;
@@ -56584,7 +56598,7 @@ function diagTagSummary(messages, sessionId, strategy) {
56584
56598
  }
56585
56599
  return `[${sessionId}] processTurn: ${messages.length} msgs, renderTags=${strategy}, ${textTagged} text tagged, ${toolTagged} tool tagged (should be 0 with text-only)`;
56586
56600
  }
56587
- function diagNudge(turn, sessionId, tokenCount, limit, model) {
56601
+ function diagNudge(turn, sessionId, tokenCount, limit, model, willInject) {
56588
56602
  const n = turn.nudge;
56589
56603
  if (!n) return `[${sessionId}] nudge: unavailable`;
56590
56604
  const b2 = n.breakdown ?? {};
@@ -56594,7 +56608,7 @@ function diagNudge(turn, sessionId, tokenCount, limit, model) {
56594
56608
  const interval = b2["nudgeGrowthTokens"] ?? 0;
56595
56609
  const pendingT1 = b2["pendingT1"] ?? 0;
56596
56610
  const ref = b2["growthReference"] ?? 0;
56597
- const inject = n.shouldInject ? `INJECT T${n.tier ?? "?"}` : "idle";
56611
+ const inject = !n.shouldInject ? "idle" : willInject ? `INJECT T${n.tier ?? "?"}` : `ARMED-SUPPRESSED T${n.tier ?? "?"}`;
56598
56612
  const modelTag = model ? ` model=${model}` : "";
56599
56613
  return `[${sessionId}] nudge ${inject}: usage=${pct2} (${tokenCount}/${limit}), growth=${growth}/${floor} (ref=${ref}, interval=${interval}), pendingT1=${pendingT1}/${interval}${modelTag}, reason="${n.reason.slice(0, 120)}"`;
56600
56614
  }
@@ -56629,7 +56643,8 @@ function prepareAnthropic(parsed, req, opts, core, config, prompts, log2, sessio
56629
56643
  if (t) session.meta.title = t;
56630
56644
  }
56631
56645
  log2("info", diagTagSummary(turn.messages, sessionId, "text-only"));
56632
- log2("info", diagNudge(turn, sessionId, tokenCount, config.modelContextLimit, parsed.model));
56646
+ const willInjectNudge = opts.compress.injectNudge && !!turn.nudge?.shouldInject;
56647
+ log2("info", diagNudge(turn, sessionId, tokenCount, config.modelContextLimit, parsed.model, willInjectNudge));
56633
56648
  processedMessages = stripKernelSummaries(turn.messages, turn.state);
56634
56649
  reapOrphanBlocks(session, msgs, deactivateBlock);
56635
56650
  rebuiltMessages = coreToAnthropic(processedMessages, cacheControls);
@@ -56637,7 +56652,7 @@ function prepareAnthropic(parsed, req, opts, core, config, prompts, log2, sessio
56637
56652
  if (injectTools) {
56638
56653
  toolsOut = injectTool(parsed.tools);
56639
56654
  }
56640
- if (opts.compress.injectNudge && !pluginMode && turn.nudge?.shouldInject) {
56655
+ if (willInjectNudge && turn.nudge) {
56641
56656
  try {
56642
56657
  const rendered = renderNudgeText(turn.nudge, prompts);
56643
56658
  if (rendered.text) {
@@ -56654,7 +56669,7 @@ function prepareAnthropic(parsed, req, opts, core, config, prompts, log2, sessio
56654
56669
  markDirty(session);
56655
56670
  const rebuilt = { ...parsed, messages: rebuiltMessages, system: systemOut, tools: toolsOut };
56656
56671
  delete rebuilt.prompt_cache_key;
56657
- return { body: JSON.stringify(rebuilt), session, processedMessages, originalMessages, anthropicSystem: parsed.system, protocol: "anthropic", stream: stream2, compressInjected: injectTools, pluginMode, nudge, prompts };
56672
+ return { body: JSON.stringify(rebuilt), session, processedMessages, originalMessages, anthropicSystem: parsed.system, protocol: "anthropic", stream: stream2, compressInjected: injectTools, pluginMode, nudge, prompts, renderTags: "text-only" };
56658
56673
  }
56659
56674
  function prepareOpenai(parsed, req, opts, core, config, prompts, log2, session, pluginMode) {
56660
56675
  const sessionId = session.id;
@@ -56686,7 +56701,8 @@ function prepareOpenai(parsed, req, opts, core, config, prompts, log2, session,
56686
56701
  if (t) session.meta.title = t;
56687
56702
  }
56688
56703
  log2("info", diagTagSummary(turn.messages, sessionId, "text-only"));
56689
- log2("info", diagNudge(turn, sessionId, tokenCount, config.modelContextLimit, parsed.model));
56704
+ const willInjectNudge = opts.compress.injectNudge && !!turn.nudge?.shouldInject && shouldInject;
56705
+ log2("info", diagNudge(turn, sessionId, tokenCount, config.modelContextLimit, parsed.model, willInjectNudge));
56690
56706
  processedMessages = stripKernelSummaries(turn.messages, turn.state);
56691
56707
  reapOrphanBlocks(session, msgs, deactivateBlock);
56692
56708
  rebuiltMessages = systemToUser(coreToOpenai(processedMessages));
@@ -56697,7 +56713,7 @@ function prepareOpenai(parsed, req, opts, core, config, prompts, log2, session,
56697
56713
  if (injectTools) {
56698
56714
  toolsOut = injectOpenaiTool(parsed.tools);
56699
56715
  }
56700
- if (opts.compress.injectNudge && !pluginMode && turn.nudge?.shouldInject && shouldInject) {
56716
+ if (willInjectNudge && turn.nudge) {
56701
56717
  try {
56702
56718
  const rendered = renderNudgeText(turn.nudge, prompts);
56703
56719
  if (rendered.text) {
@@ -56717,7 +56733,7 @@ function prepareOpenai(parsed, req, opts, core, config, prompts, log2, session,
56717
56733
  }
56718
56734
  snapshotMessages(session, originalMessages);
56719
56735
  markDirty(session);
56720
- return { body: JSON.stringify(rebuilt), session, processedMessages, originalMessages, protocol: "openai", stream: stream2, compressInjected: injectTools, pluginMode, nudge, prompts, openaiSystemText };
56736
+ return { body: JSON.stringify(rebuilt), session, processedMessages, originalMessages, protocol: "openai", stream: stream2, compressInjected: injectTools, pluginMode, nudge, prompts, openaiSystemText, renderTags: "text-only" };
56721
56737
  }
56722
56738
  function prepareResponses(parsed, req, opts, core, config, prompts, log2, session, identity, pluginMode, upstreamOrigin) {
56723
56739
  const sessionId = session.id;
@@ -56755,6 +56771,7 @@ function prepareResponses(parsed, req, opts, core, config, prompts, log2, sessio
56755
56771
  const injectTools = shouldInject && !pluginMode;
56756
56772
  const isCompactionTrigger = hasCompactionTrigger(parsed.input);
56757
56773
  const responsesTextProtocol = FORCE_TEXT_PROTOCOL || resolveCompressProtocol(opts.routes, upstreamOrigin) === "marker";
56774
+ const renderTags = process.env.ACP_RENDER_NONE || isCompactionTrigger ? "none" : "text-only";
56758
56775
  try {
56759
56776
  const projection = responsesToCore(parsed);
56760
56777
  responsesProjection = projection;
@@ -56764,7 +56781,7 @@ function prepareResponses(parsed, req, opts, core, config, prompts, log2, sessio
56764
56781
  log2("info", `[${sessionId}] input items: ${Array.isArray(parsed.input) ? parsed.input.map((i) => i.type).join(",") : "(string)"}`);
56765
56782
  }
56766
56783
  const tokenCount = session.stats.lastInputTokens;
56767
- const turn = core.processTurn({ messages: msgs, state: session.state, config, tokenCount, renderTags: process.env.ACP_RENDER_NONE || isCompactionTrigger ? "none" : "text-only" });
56784
+ const turn = core.processTurn({ messages: msgs, state: session.state, config, tokenCount, renderTags });
56768
56785
  session.state = turn.state;
56769
56786
  session.stats.compressCreditTokens = 0;
56770
56787
  if (turn.nudge) turn.nudge.compressibleRanges = viableRanges(turn.nudge.compressibleRanges);
@@ -56775,7 +56792,8 @@ function prepareResponses(parsed, req, opts, core, config, prompts, log2, sessio
56775
56792
  if (t) session.meta.title = t;
56776
56793
  }
56777
56794
  log2("info", diagTagSummary(turn.messages, sessionId, "text-only"));
56778
- log2("info", diagNudge(turn, sessionId, tokenCount, config.modelContextLimit, parsed.model));
56795
+ const willInjectNudge = opts.compress.injectNudge && !!turn.nudge?.shouldInject && shouldInject && !isCompactionTrigger;
56796
+ log2("info", diagNudge(turn, sessionId, tokenCount, config.modelContextLimit, parsed.model, willInjectNudge));
56779
56797
  processedMessages = stripKernelSummaries(turn.messages, turn.state);
56780
56798
  reapOrphanBlocks(session, msgs, deactivateBlock);
56781
56799
  rebuiltInput = patchResponsesInput(projection, processedMessages);
@@ -56791,7 +56809,7 @@ function prepareResponses(parsed, req, opts, core, config, prompts, log2, sessio
56791
56809
  const devContent = [...projection.systemParts, ...forgedSummaries].join("\n\n---\n\n");
56792
56810
  rebuiltInput = injectResponsesDeveloperMessage(rebuiltInput, devContent);
56793
56811
  }
56794
- if (opts.compress.injectNudge && !pluginMode && turn.nudge?.shouldInject && shouldInject && !isCompactionTrigger) {
56812
+ if (willInjectNudge && turn.nudge) {
56795
56813
  try {
56796
56814
  const rendered = renderNudgeText(turn.nudge, prompts);
56797
56815
  if (rendered.text) {
@@ -56858,6 +56876,7 @@ function prepareResponses(parsed, req, opts, core, config, prompts, log2, sessio
56858
56876
  responsesTextProtocol,
56859
56877
  nudge,
56860
56878
  prompts,
56879
+ renderTags,
56861
56880
  resetAfterSuccess: isCompactionTrigger,
56862
56881
  codexForge
56863
56882
  };
@@ -57360,9 +57379,21 @@ ${hdrText}
57360
57379
  const textProtocol = prepared.protocol === "responses" && !!prepared.responsesTextProtocol;
57361
57380
  const systemPrompt = textProtocol ? buildCompressHybridSystemPrompt(prepared.prompts ?? defaultPrompts) : buildCompressSystemPrompt(prepared.prompts ?? defaultPrompts);
57362
57381
  const adapter = pickAdapter(prepared.protocol, parsedReq, textProtocol, prepared.responsesProjection, prepared.anthropicSystem, prepared.openaiSystemText);
57382
+ const refreshFolded = (current) => {
57383
+ const turn = core.processTurn({
57384
+ messages: prepared.originalMessages,
57385
+ state: prepared.session.state,
57386
+ config,
57387
+ tokenCount: prepared.session.stats.lastInputTokens,
57388
+ renderTags: prepared.renderTags ?? "text-only"
57389
+ });
57390
+ prepared.session.state = turn.state;
57391
+ const records = current.filter((m2) => typeof m2.id === "string" && m2.id.startsWith("acp_loop_"));
57392
+ return stripKernelSummaries([...turn.messages, ...records], turn.state);
57393
+ };
57363
57394
  const loop = runCompressLoop(
57364
57395
  streamToRead,
57365
- { 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 },
57396
+ { 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, refreshFolded },
57366
57397
  parsedReq,
57367
57398
  { url: upstreamUrl, headers: reqHeaders },
57368
57399
  adapter,