jeopi-snapcompact 16.2.26 → 16.2.28

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/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [16.2.27] - 2026-07-07
6
+
7
+ ### Fixed
8
+
9
+ - `serializeConversation` no longer renders assistant `thinking` blocks as italic prose into the archived conversation text before it gets rasterized into frame images. Those frame images are resent to the model as part of the persisted compaction summary on every later turn, so baking a prior turn's own reasoning into pixels was still a `reasoning_extraction` classifier-refusal trigger on Anthropic targets even though it's not literal text tokens (mirrors the plaintext-drop fix already applied to `packages/agent/src/compaction/utils.ts`). `redactedThinking` blocks were already dropped implicitly and needed no change.
10
+
5
11
  ## [16.2.8] - 2026-06-30
6
12
 
7
13
  ### Fixed
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "jeopi-snapcompact",
4
- "version": "16.2.26",
4
+ "version": "16.2.28",
5
5
  "description": "Bitmap-frame context compression for vision-capable LLMs",
6
6
  "homepage": "https://github.com/akillness/jeopi",
7
7
  "author": "Can Boluk",
@@ -31,10 +31,10 @@
31
31
  "fmt": "biome format --write ."
32
32
  },
33
33
  "dependencies": {
34
- "jeopi-ai": "16.2.26",
35
- "jeopi-natives": "16.2.26",
36
- "jeopi-utils": "16.2.26",
37
- "jeopi-wire": "16.2.26"
34
+ "jeopi-ai": "16.2.28",
35
+ "jeopi-natives": "16.2.28",
36
+ "jeopi-utils": "16.2.28",
37
+ "jeopi-wire": "16.2.28"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/bun": "^1.3.14"
@@ -791,17 +791,21 @@ export function serializeConversation(messages: Message[], options?: SerializeOp
791
791
  .join("");
792
792
  if (content) parts.push(`# User${HEADING_MARKER}\n${stripDimMarkers(content)}`);
793
793
  } else if (msg.role === "assistant") {
794
- // Stream blocks in content order: buffer thinking/text, then flush a
795
- // `# Assistant` block (thinking as italics above the text) right before
796
- // each tool call, so text or thinking after a call stays after it.
797
- let pendingThinking: string[] = [];
794
+ // Stream blocks in content order: buffer text, then flush a
795
+ // `# Assistant` block right before each tool call, so text after a
796
+ // call stays after it. Thinking/redactedThinking blocks are dropped
797
+ // entirely (never buffered, never rasterized into a frame image):
798
+ // this archive gets rendered into ImageContent frames that re-enter
799
+ // the conversation history sent back to the model, and an image
800
+ // depicting a model's own prior natural-language reasoning is a
801
+ // plausible reasoning_extraction refusal trigger even though it's
802
+ // pixels, not text tokens (mirrors the plaintext drop in
803
+ // packages/agent/src/compaction/utils.ts serializeConversation).
798
804
  let pendingText: string[] = [];
799
805
  const flushAssistant = () => {
800
806
  const sections: string[] = [];
801
- if (pendingThinking.length > 0) sections.push(`_${pendingThinking.join("\n")}_`);
802
807
  if (pendingText.length > 0) sections.push(pendingText.join("\n"));
803
808
  if (sections.length > 0) parts.push(`# Assistant${HEADING_MARKER}\n${sections.join("\n\n")}`);
804
- pendingThinking = [];
805
809
  pendingText = [];
806
810
  };
807
811
 
@@ -809,9 +813,6 @@ export function serializeConversation(messages: Message[], options?: SerializeOp
809
813
  if (block.type === "text") {
810
814
  const text = stripDimMarkers(block.text);
811
815
  if (text.trim()) pendingText.push(text);
812
- } else if (block.type === "thinking") {
813
- const thinking = stripDimMarkers(block.thinking);
814
- if (thinking.trim()) pendingThinking.push(thinking);
815
816
  } else if (block.type === "toolCall") {
816
817
  if (uselessCallIds.has(block.id)) continue;
817
818
  flushAssistant();