jeopi-agent-core 16.2.24 → 16.2.26

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.26] - 2026-07-05
6
+
7
+ ### Fixed
8
+
9
+ - `serializeConversation` (compaction / branch-summary transcript rendering) no longer replays assistant `thinking`/`redactedThinking` blocks as plaintext (`<thinking>...</thinking>` via the dialect renderer, or `[Think]: ...` in the legacy no-dialect form) inside the `<conversation>` summarization prompt. Replaying a model's own prior reasoning as plaintext to an Anthropic-dialect summarizer is a `reasoning_extraction` classifier-refusal trigger, and compaction had no refusal-degrade fallback (unlike the coding-agent advisor, which strips thinking after a first refusal). Mirrors the existing intentional thinking-drop in the hindsight/mnemopi transcript extractor.
10
+
5
11
  ## [16.2.14] - 2026-07-02
6
12
 
7
13
  ### Added
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "jeopi-agent-core",
4
- "version": "16.2.24",
4
+ "version": "16.2.26",
5
5
  "description": "General-purpose agent with transport abstraction, state management, and attachment support",
6
6
  "homepage": "https://github.com/akillness/jeopi",
7
7
  "author": "Can Boluk",
@@ -35,12 +35,12 @@
35
35
  "fmt": "biome format --write ."
36
36
  },
37
37
  "dependencies": {
38
- "jeopi-ai": "16.2.24",
39
- "jeopi-catalog": "16.2.24",
40
- "jeopi-natives": "16.2.24",
41
- "jeopi-utils": "16.2.24",
42
- "jeopi-wire": "16.2.24",
43
- "jeopi-snapcompact": "16.2.24",
38
+ "jeopi-ai": "16.2.26",
39
+ "jeopi-catalog": "16.2.26",
40
+ "jeopi-natives": "16.2.26",
41
+ "jeopi-utils": "16.2.26",
42
+ "jeopi-wire": "16.2.26",
43
+ "jeopi-snapcompact": "16.2.26",
44
44
  "@opentelemetry/api": "^1.9.1"
45
45
  },
46
46
  "devDependencies": {
@@ -227,7 +227,16 @@ export function serializeConversation(messages: Message[], dialect?: Dialect): s
227
227
  const processed: Message[] = [];
228
228
  for (const msg of messages) {
229
229
  if (msg.role === "assistant") {
230
- const content = msg.content.filter(block => block.type !== "toolCall" || !uselessCallIds.has(block.id));
230
+ // Thinking/redactedThinking blocks are dropped before serialization: they add
231
+ // little to a summarization prompt and replaying a model's own prior reasoning
232
+ // as plaintext transcript text is a reasoning_extraction refusal trigger on
233
+ // Anthropic targets (mirrors the intentional drop in hindsight/transcript.ts).
234
+ const content = msg.content.filter(
235
+ block =>
236
+ block.type !== "thinking" &&
237
+ block.type !== "redactedThinking" &&
238
+ (block.type !== "toolCall" || !uselessCallIds.has(block.id)),
239
+ );
231
240
  if (content.length > 0) processed.push(content.length === msg.content.length ? msg : { ...msg, content });
232
241
  continue;
233
242
  }
@@ -262,23 +271,19 @@ export function serializeConversation(messages: Message[], dialect?: Dialect): s
262
271
  if (content) parts.push(`[User]: ${content}`);
263
272
  } else if (msg.role === "assistant") {
264
273
  const textParts: string[] = [];
265
- const thinkingParts: string[] = [];
266
274
  const toolCalls: ToolCall[] = [];
267
275
 
268
276
  for (const block of msg.content) {
269
277
  if (block.type === "text") {
270
278
  textParts.push(block.text);
271
- } else if (block.type === "thinking") {
272
- thinkingParts.push(block.thinking);
273
279
  } else if (block.type === "toolCall") {
274
280
  if (uselessCallIds.has(block.id)) continue;
275
281
  toolCalls.push(block);
276
282
  }
283
+ // thinking / redactedThinking blocks are intentionally dropped — see the
284
+ // dialect-branch comment above for why replaying them is unsafe.
277
285
  }
278
286
 
279
- if (thinkingParts.length > 0) {
280
- parts.push(`[Think]: ${thinkingParts.join("\n")}`);
281
- }
282
287
  if (textParts.length > 0) {
283
288
  parts.push(`[Assistant]: ${textParts.join("\n")}`);
284
289
  }