From 1a3057dc1f585babcafb8fcd7f47f5338f27acbd Mon Sep 17 00:00:00 2001 From: Lukas <103962359+L4XB@users.noreply.github.com> Date: Sat, 24 Oct 2026 14:54:29 +0200 Subject: [PATCH] fix(sessions): skip local command output when titling Claude sessions (#8799) --- .../src/session_manager/providers/claude.rs | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/session_manager/providers/claude.rs b/src-tauri/src/session_manager/providers/claude.rs index 9583cdf42..1df0840cb 100644 --- a/src-tauri/src/session_manager/providers/claude.rs +++ b/src-tauri/src/session_manager/providers/claude.rs @@ -176,8 +176,8 @@ fn parse_session_lines( let text = message.get("content").map(extract_text).unwrap_or_default(); let trimmed = text.trim(); if !trimmed.is_empty() - && !trimmed.contains("") && !trimmed.starts_with("") + && !is_injected_text(trimmed) { first_user_message = Some(trimmed.to_string()); } @@ -222,7 +222,12 @@ fn parse_session_lines( } if let Some(message) = value.get("message") { let text = message.get("content").map(extract_text).unwrap_or_default(); - if !text.trim().is_empty() { + let trimmed = text.trim(); + // A local command run last, such as `/model`, ends the file with its command and output. + if !trimmed.is_empty() + && !trimmed.starts_with("") + && !is_injected_text(trimmed) + { summary = Some(text); } } @@ -2072,6 +2077,32 @@ mod tests { assert_eq!(meta.title.as_deref(), Some("帮我看看工作区的改动")); } + #[test] + fn parse_session_skips_local_command_output_in_title_and_summary() { + let temp = tempdir().expect("tempdir"); + let path = temp.path().join("session-model.jsonl"); + std::fs::write( + &path, + concat!( + "{\"type\":\"user\",\"isMeta\":true,\"message\":{\"role\":\"user\",\"content\":\"Caveat: The messages below were generated by the user while running local commands.\"},\"sessionId\":\"session-model\",\"timestamp\":\"2026-03-06T10:00:00Z\",\"cwd\":\"/tmp/project\"}\n", + "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":\"/model\\nmodel\\nopus\"},\"sessionId\":\"session-model\",\"timestamp\":\"2026-03-06T10:00:01Z\",\"cwd\":\"/tmp/project\"}\n", + "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":\"Set model to opus\"},\"sessionId\":\"session-model\",\"timestamp\":\"2026-03-06T10:00:02Z\",\"cwd\":\"/tmp/project\"}\n", + "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":\"Fix the login redirect\"},\"sessionId\":\"session-model\",\"timestamp\":\"2026-03-06T10:01:00Z\",\"cwd\":\"/tmp/project\"}\n", + "{\"type\":\"assistant\",\"message\":{\"role\":\"assistant\",\"content\":\"The redirect now keeps the return URL.\"},\"timestamp\":\"2026-03-06T10:02:00Z\",\"cwd\":\"/tmp/project\"}\n", + "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":\"/model\\nmodel\\nsonnet\"},\"sessionId\":\"session-model\",\"timestamp\":\"2026-03-06T10:03:00Z\",\"cwd\":\"/tmp/project\"}\n", + "{\"type\":\"user\",\"message\":{\"role\":\"user\",\"content\":\"Set model to sonnet\"},\"sessionId\":\"session-model\",\"timestamp\":\"2026-03-06T10:03:01Z\",\"cwd\":\"/tmp/project\"}\n", + ), + ) + .expect("write"); + + let meta = parse_session(&path).unwrap(); + assert_eq!(meta.title.as_deref(), Some("Fix the login redirect")); + assert_eq!( + meta.summary.as_deref(), + Some("The redirect now keeps the return URL.") + ); + } + #[test] fn workflow_journal_log_is_excluded_from_sessions() { let temp = tempdir().expect("tempdir");