From 8298371b356331e01eaa2f736460b1e8d8af35cc Mon Sep 17 00:00:00 2001 From: David Chen Date: Thu, 9 Apr 2026 10:58:24 -0700 Subject: [PATCH] tmux watch notif --- agent-tracker/cmd/agent/tracker_cli.go | 2 +- agent-tracker/cmd/tracker-server/main.go | 15 +++++++++++++++ tmux/scripts/watch_pane.sh | 9 +++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/agent-tracker/cmd/agent/tracker_cli.go b/agent-tracker/cmd/agent/tracker_cli.go index af818d1..3ecb992 100644 --- a/agent-tracker/cmd/agent/tracker_cli.go +++ b/agent-tracker/cmd/agent/tracker_cli.go @@ -67,7 +67,7 @@ func runTrackerCommand(args []string) error { } command := strings.TrimSpace(rest[0]) switch command { - case "start_task", "finish_task", "update_task", "acknowledge", "delete_task": + case "start_task", "finish_task", "update_task", "acknowledge", "delete_task", "notify": ctx, err := resolveTrackerContext(env.Session, env.SessionID, env.Window, env.WindowID, env.Pane) if err != nil { return err diff --git a/agent-tracker/cmd/tracker-server/main.go b/agent-tracker/cmd/tracker-server/main.go index dd21846..49d399f 100644 --- a/agent-tracker/cmd/tracker-server/main.go +++ b/agent-tracker/cmd/tracker-server/main.go @@ -204,6 +204,21 @@ func (s *server) handleCommand(env ipc.Envelope) error { s.broadcastStateAsync() s.statusRefreshAsync() return nil + case "notify": + target, err := requireSessionWindow(env) + if err != nil { + return err + } + message := firstNonEmpty(env.Summary, env.Message) + if message == "" { + return fmt.Errorf("notify requires summary") + } + if s.notificationsAreEnabled() { + if err := sendSystemNotification(notificationTitleForTarget(target), message, notificationActionForTarget(target)); err != nil { + return err + } + } + return nil case "update_task": target, err := requireSessionWindow(env) if err != nil { diff --git a/tmux/scripts/watch_pane.sh b/tmux/scripts/watch_pane.sh index 100ce16..eee4c3e 100755 --- a/tmux/scripts/watch_pane.sh +++ b/tmux/scripts/watch_pane.sh @@ -15,6 +15,14 @@ pane_shell=$(ps -o comm= -p "$pane_pid" 2>/dev/null | sed 's|.*/||; s/^-//') current_cmd=$(tmux display-message -p -t "$pane_id" '#{pane_current_command}' 2>/dev/null || true) [[ -z "$current_cmd" ]] && exit 0 +notify_completion() { + local tracker_bin message + tracker_bin="$HOME/.config/agent-tracker/bin/agent" + [[ -x "$tracker_bin" ]] || return 0 + message="${current_cmd} finished" + "$tracker_bin" tracker command -window-id "$window_id" -pane "$pane_id" -summary "$message" notify >/dev/null 2>&1 || true +} + if [[ "$current_cmd" == "$pane_shell" ]]; then exit 0 fi @@ -35,3 +43,4 @@ done tmux set -wu -t "$window_id" @watching 2>/dev/null || true tmux set -w -t "$window_id" @unread 1 2>/dev/null || true tmux refresh-client -S +notify_completion