aboutsummaryrefslogtreecommitdiff
path: root/crates/dinggerd/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/dinggerd/src/main.rs')
-rw-r--r--crates/dinggerd/src/main.rs19
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(())
}