From e83d0184eacb5bea2b7715defe5bf1c758fc6368 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Sun, 22 Mar 2026 03:32:59 -0400 Subject: [PATCH] TailMessages: skip serde parse for non-message objects Use memchr::memmem to check for "type":"user" or "type":"assistant" in raw bytes before parsing. Avoids deserializing large tool_result and system objects entirely. Co-Authored-By: Claude Opus 4.6 (1M context) --- poc-memory/src/transcript.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/poc-memory/src/transcript.rs b/poc-memory/src/transcript.rs index 01a1fc6..beaf08a 100644 --- a/poc-memory/src/transcript.rs +++ b/poc-memory/src/transcript.rs @@ -203,13 +203,19 @@ impl Iterator for TailMessages { let obj_bytes = &self.mmap[open..=close]; + // Quick byte check: skip objects that aren't user/assistant + // messages. Avoids serde-parsing megabyte tool_result objects. + let is_user = memchr::memmem::find(obj_bytes, b"\"type\":\"user\"").is_some(); + let is_assistant = !is_user + && memchr::memmem::find(obj_bytes, b"\"type\":\"assistant\"").is_some(); + if !is_user && !is_assistant { continue; } + let obj: Value = match serde_json::from_slice(obj_bytes) { Ok(v) => v, Err(_) => continue, }; - let msg_type = obj.get("type").and_then(|v| v.as_str()).unwrap_or(""); - if msg_type != "user" && msg_type != "assistant" { continue; } + let msg_type = if is_user { "user" } else { "assistant" }; let msg = obj.get("message").unwrap_or(&obj); let text = match msg.get("content") {