notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

commit 670ac26aa818826e712fcc708a1dbc09f0bcb237
parent da8c8e643a347ad0719590ec922180e81db40b0b
Author: William Casarin <jb55@jb55.com>
Date:   Wed, 28 Jan 2026 19:27:03 -0800

dave: show compaction result message in chat

Display a "✓ Compacted (N tokens)" message in the chat when conversation
compaction completes, showing how many tokens the conversation had before
compacting.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

Diffstat:
Mcrates/notedeck_dave/src/backend/claude.rs | 5+++--
Mcrates/notedeck_dave/src/lib.rs | 3++-
Mcrates/notedeck_dave/src/messages.rs | 5+++++
Mcrates/notedeck_dave/src/ui/dave.rs | 22+++++++++++++++++++++-
4 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/crates/notedeck_dave/src/backend/claude.rs b/crates/notedeck_dave/src/backend/claude.rs @@ -91,8 +91,9 @@ impl ClaudeBackend { | Message::ToolResponse(_) | Message::Error(_) | Message::PermissionRequest(_) - | Message::ToolResult(_) => { - // Skip tool-related, error, permission, and tool result messages + | Message::ToolResult(_) + | Message::CompactionComplete(_) => { + // Skip tool-related, error, permission, tool result, and compaction messages } } } diff --git a/crates/notedeck_dave/src/lib.rs b/crates/notedeck_dave/src/lib.rs @@ -322,7 +322,8 @@ You are an AI agent for the nostr protocol called Dave, created by Damus. nostr info.pre_tokens ); session.is_compacting = false; - session.last_compaction = Some(info); + session.last_compaction = Some(info.clone()); + session.chat.push(Message::CompactionComplete(info)); } } } diff --git a/crates/notedeck_dave/src/messages.rs b/crates/notedeck_dave/src/messages.rs @@ -160,6 +160,8 @@ pub enum Message { PermissionRequest(PermissionRequest), /// Result metadata from a completed tool execution ToolResult(ToolResult), + /// Conversation was compacted + CompactionComplete(CompactionInfo), } /// Compaction info from compact_boundary system message @@ -254,6 +256,9 @@ impl Message { // Tool results are UI-only, not sent to the API Message::ToolResult(_) => None, + + // Compaction complete is UI-only, not sent to the API + Message::CompactionComplete(_) => None, } } } diff --git a/crates/notedeck_dave/src/ui/dave.rs b/crates/notedeck_dave/src/ui/dave.rs @@ -3,7 +3,7 @@ use crate::{ config::DaveSettings, file_update::FileUpdate, messages::{ - AskUserQuestionInput, Message, PermissionRequest, PermissionResponse, + AskUserQuestionInput, CompactionInfo, Message, PermissionRequest, PermissionResponse, PermissionResponseType, QuestionAnswer, ToolResult, }, session::PermissionMessageState, @@ -292,6 +292,9 @@ impl<'a> DaveUi<'a> { Message::ToolResult(result) => { Self::tool_result_ui(result, ui); } + Message::CompactionComplete(info) => { + Self::compaction_complete_ui(info, ui); + } }; } @@ -616,6 +619,23 @@ impl<'a> DaveUi<'a> { }); } + /// Render compaction complete notification + fn compaction_complete_ui(info: &CompactionInfo, ui: &mut egui::Ui) { + ui.horizontal(|ui| { + ui.add(egui::Label::new( + egui::RichText::new("✓") + .size(11.0) + .color(egui::Color32::from_rgb(100, 180, 100)), + )); + ui.add(egui::Label::new( + egui::RichText::new(format!("Compacted ({} tokens)", info.pre_tokens)) + .size(11.0) + .color(ui.visuals().weak_text_color()) + .italics(), + )); + }); + } + fn search_call_ui(ctx: &mut AppContext, query_call: &QueryCall, ui: &mut egui::Ui) { ui.add(search_icon(16.0, 16.0)); ui.add_space(8.0);