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:
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);