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