diff options
Diffstat (limited to 'crates/dinggerd/src/main.rs')
| -rw-r--r-- | crates/dinggerd/src/main.rs | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/crates/dinggerd/src/main.rs b/crates/dinggerd/src/main.rs index 44db683..99c10a7 100644 --- a/crates/dinggerd/src/main.rs +++ b/crates/dinggerd/src/main.rs @@ -1,5 +1,6 @@ //! dingger: agent state watching for tmux panes. +mod cost; mod hooks; mod importance; mod integrations; @@ -172,6 +173,9 @@ fn main() { no_notifications, } => { integrations::update_pi_extension(); + if let Some(dir) = integrations::pi_agent_dir() { + cost::spawn(dir.join("sessions")); + } if let Err(err) = hooks::spawn_listener() { eprintln!("dingger: {err}"); std::process::exit(1); @@ -444,7 +448,8 @@ fn mark_unread(pane: Option<String>) -> Result<(), String> { /// Every agent pane in herdr's priority order (blocked, done, working, /// idle), oldest-waiting first within a status. ✎ marks a draft left in -/// the agent's input box. +/// the agent's input box. COST is what a pi agent spent today (UTC); the +/// last line totals today, this week, and this month, closed agents included. fn status() -> Result<(), String> { let mut panes: Vec<_> = tmux::list_panes()? .into_iter() @@ -462,7 +467,7 @@ fn status() -> Result<(), String> { }); let place = |pane: &tmux::Pane| pane.display_target.replacen(':', " · ", 1); let width = panes.iter().map(|pane| place(pane).chars().count()).max().unwrap_or(5).max(5); - println!("{:<8} {:<width$} {:<7} NAME", "STATUS", "WHERE", "AGENT"); + println!("{:<8} {:<width$} {:<7} {:>8} NAME", "STATUS", "WHERE", "AGENT", "COST"); for pane in &panes { let state = if pane.written_state.is_empty() { "-" } else { &pane.written_state }; let agent = pane.agent.map(detect_core::agent_label).unwrap_or("-"); @@ -472,7 +477,15 @@ fn status() -> Result<(), String> { importance::Importance::Low => format!("{} (low)", pane.written_name), importance::Importance::Normal => pane.written_name.clone(), }; - println!("{state:<8} {:<width$} {agent:<7} {draft}{}", place(pane), name.trim()); + let cost = if pane.written_cost.is_empty() { String::new() } else { format!("${}", pane.written_cost) }; + println!("{state:<8} {:<width$} {agent:<7} {cost:>8} {draft}{}", place(pane), name.trim()); } + let global = |name: &str| tmux::show_global(name).unwrap_or_default(); + let spent = [("today", "@dingger_cost_today"), ("this week", "@dingger_cost_week"), ("this month", "@dingger_cost_month")] + .map(|(period, name)| { + let value = global(name); + format!("${} {period}", if value.is_empty() { "0.00" } else { &value }) + }); + println!("\nspent: {} (UTC)", spent.join(" · ")); Ok(()) } |
