notedeck

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

commit 42df0a819e98268548aca5b6e0cab29e7421909c
parent 9a7b2d83ed918fe2f3bb55f4abd023877f30e7e5
Author: William Casarin <jb55@jb55.com>
Date:   Wed, 28 Jan 2026 20:31:04 -0800

dave: add focus queue indicator dots to scene view

Sessions in the focus queue now display a colored dot on their agent
node in the scene view, matching the sidebar indicators. Dot appears
at top-right of agent circle with priority colors (yellow=NeedsInput,
red=Error, blue=Done).

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

Diffstat:
Mcrates/notedeck_dave/src/lib.rs | 7++++++-
Mcrates/notedeck_dave/src/ui/scene.rs | 13+++++++++++++
2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/crates/notedeck_dave/src/lib.rs b/crates/notedeck_dave/src/lib.rs @@ -407,7 +407,12 @@ You are an AI agent for the nostr protocol called Dave, created by Damus. nostr ui.separator(); // Render the scene, passing ctrl_held for keybinding hints - scene_response = Some(self.scene.ui(&self.session_manager, ui, ctrl_held)); + scene_response = Some(self.scene.ui( + &self.session_manager, + &self.focus_queue, + ui, + ctrl_held, + )); }); // Chat side panel diff --git a/crates/notedeck_dave/src/ui/scene.rs b/crates/notedeck_dave/src/ui/scene.rs @@ -1,4 +1,5 @@ use crate::agent_status::AgentStatus; +use crate::focus_queue::{FocusPriority, FocusQueue}; use crate::session::{SessionId, SessionManager}; use crate::ui::paint_keybind_hint; use egui::{Color32, Pos2, Rect, Response, Sense, Vec2}; @@ -105,6 +106,7 @@ impl AgentScene { pub fn ui( &mut self, session_manager: &SessionManager, + focus_queue: &FocusQueue, ui: &mut egui::Ui, ctrl_held: bool, ) -> SceneResponse { @@ -157,6 +159,7 @@ impl AgentScene { let status = session.status(); let title = &session.title; let is_selected = selected_ids.contains(&id); + let queue_priority = focus_queue.get_session_priority(id); let agent_response = Self::draw_agent( ui, @@ -167,6 +170,7 @@ impl AgentScene { title, is_selected, ctrl_held, + queue_priority, ); if agent_response.clicked() { @@ -301,6 +305,7 @@ impl AgentScene { title: &str, is_selected: bool, show_keybinding: bool, + queue_priority: Option<FocusPriority>, ) -> Response { let agent_radius = 30.0; let center = Pos2::new(position.x, position.y); @@ -336,6 +341,14 @@ impl AgentScene { }; painter.circle_filled(center, agent_radius - 2.0, fill_color); + // Focus queue indicator dot (top-right of the agent circle) + if let Some(priority) = queue_priority { + let dot_radius = 6.0; + let dot_offset = Vec2::new(agent_radius * 0.7, -agent_radius * 0.7); + let dot_center = center + dot_offset; + painter.circle_filled(dot_center, dot_radius, priority.color()); + } + // Agent icon in center: show keybind frame when Ctrl held, otherwise first letter if show_keybinding { paint_keybind_hint(ui, center, &keybind_number.to_string(), 24.0);