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 +6 -0
- package/package.json +5 -5
- package/src/snapcompact.ts +10 -9
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.
|
|
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.
|
|
35
|
-
"jeopi-natives": "16.2.
|
|
36
|
-
"jeopi-utils": "16.2.
|
|
37
|
-
"jeopi-wire": "16.2.
|
|
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"
|
package/src/snapcompact.ts
CHANGED
|
@@ -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
|
|
795
|
-
// `# Assistant` block
|
|
796
|
-
//
|
|
797
|
-
|
|
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();
|