aboutsummaryrefslogtreecommitdiff
path: root/crates/dinggerd/src
AgeCommit message (Collapse)Author
2026-10-20fix clicks from the menu bar app: find tmux without homebrew on PATHIgor Soarez
launchd starts the menu bar app with PATH=/usr/bin:/bin:/usr/sbin:/sbin, so the `dingger focus` it runs for every click (panel rows, menu rows, the jump shortcut) could not find homebrew's tmux and failed with a misleading "no tmux client attached"; the app discarded the error. dingger now finds tmux on PATH or in the usual install locations (DINGGER_TMUX overrides), reports a missing tmux as such, and the app logs failed jumps. also: panel rows own every click inside them (labels took the clicks and counted as window-drag background). e2e step 14 repeats the menu bar row click and dingger focus under launchd's environment; both fail with the previous binaries.
2026-10-20menu rows lead with the agent's session name; harness and place move belowIgor Soarez
herdr's sidebar shows the session name in place of the harness label (via the user's herdr-session-name extension). dingger reads it from the title pi already sets ("π - <name> - <dir>"); other agents use herdr's terminal_title_stripped rule, and claude's default "Claude Code" title or tmux's host-name title count as no name. the daemon stores it as @agent_name for every surface. menu rows: colored status symbol + name as the title (the harness, dimmed, only when unnamed), and a native subtitle "session · window · harness", plus how long done/blocked agents have been waiting; one separator between agents waiting for you and the rest. dingger status shows the same.
2026-10-20pi extension: identify the pane from TMUX_PANEIgor Soarez
the extension asked tmux for "the current pane", which resolves to the session's active pane, not the pane pi runs in, so agents in background windows reported their state onto another pane. tmux sets TMUX_PANE for every process it starts in a pane; use it. e2e step 12 loads the shipped extension with a fake pi from a pane that is not its session's active pane and asserts the report lands there; it fails against the previous extension. hook reports log at info again.
2026-10-20rebuild the status model as herdr's state machine, event-driven and testedIgor Soarez
the seen logic was inverted: first observations were marked done and real completions idle, so the menu showed teal for agents that did nothing and green for agents that finished, and attending changed nothing visible. - watcher::advance is herdr's apply_pane_state_change + mark_active_tab_seen as a pure function, unit-tested against herdr's own cases; attendance is window-level like herdr's active tab - hook reports are events applied in order, so a turn shorter than a poll is still a completion - event-driven: hook reports, dingger focus, and tmux focus hooks wake the watcher; notifications are delivered off-thread (the macos call blocked ticks for 2+ seconds) after the pane options are written - all per-pane state persists in tmux pane options, so restarts and deploys lose nothing, including the authoritative hook state - every click goes through dingger focus: the menu bar shells out to it and the status-line binding runs it; it picks the right client, skips the window already shown, and activates the terminal app hosting the client - the ready queue is ordered like the menu (blocked first, then oldest done) - menu bar and tmux segment render herdr's symbols in herdr's palette - tests/e2e.sh: 60 assertions against an isolated tmux server with a real client, a 30s poll interval, and a slow fake notifier
2026-10-20write @agent_state on attendance changes, not just transitionsIgor Soarez
the seen demotion (done -> idle when the user focuses the pane) only updated the daemon's internal track; @agent_state stayed done forever, so the menu bar and status line never reflected attendance. the display status is now written whenever it differs from the pane option, regardless of what triggered it.
2026-10-20adopt herdr's five-status model with symbols style and focus detectionIgor Soarez
statuses are now herdr's verbatim: working (yellow), blocked (red), done (teal, finished and unattended), idle (green, attended since its last transition), unknown (gray) - priority blocked > done > working > idle > unknown. the daemon watches tmux focus (pane_active of attached clients) to mark panes attended, which is what separates done from idle. menu bar renders symbols-style glyphs with herdr's colors in priority order; the tmux segment stays after the clock and renders done/blocked/ working counts from numeric options. deployment note: do not strip the binary - it invalidates the ad-hoc signature and macOS kills it on launch.
2026-10-19menu bar: herdr-style colored state glyphs; tmux segment before the clockIgor Soarez
the design panel's monochrome template rendering made every row look alike; restore herdr's agent-panel visual language - green ready, yellow working, red blocked, filled when unseen in the queue. the tmux segment moves left of the clock so it is visible at a glance; the status item logs what it observes for diagnosis.
2026-10-19ready-queue fifo with click-to-focus; redesign presentation per design panelIgor Soarez
daemon tracks when each agent became ready (idle/blocked, unacked) and publishes fifo queue + numeric counts as server-global options; unknown to idle transitions stay out of the queue (restart spam). new dingger focus subcommand jumps to the longest-waiting pane and acks it, bound to status-right clicks in tmux. menu bar redesigned per two-model design panel: monochrome sf-symbol bell + queue depth, queue-ordered rows with state glyphs and right-aligned targets, row clicks ack like focus does. tmux segment renders glyph+count with a single red accent for blocked; fixes unescaped comma in the conditional format that truncated the segment entirely.
2026-10-19menu bar app: live agent states from tmux pane optionsIgor Soarez
single-file appkit status item (menubar/main.swift, LSUIElement) polling @agent/@agent_state pane options every 2s: counts in the bar, per-pane rows with click-to-focus via switch-client. daemon now also writes an @agent label per pane so the menu bar and tmux status-right can render agent names without duplicating identification logic.
2026-10-19wait for tmux at startup, force utf-8 for tmux clients, add launchd packagingIgor Soarez
running under launchd, the tmux client defaults to the c locale, which makes tmux mangle tab-separated -f output into underscores, so every pane parsed as one field and the watcher silently saw nothing; invoke tmux with -u so format output is locale-independent. drop the startup fail-fast: the watcher now waits for a tmux server and attaches when one appears, which is the right shape for a login agent. ship the launchd plist under packaging/launchd.
2026-10-19initial dingger: tmux agent watcher with herdr's detection engineIgor Soarez
extract detect-core from herdr's src/detect (engine + 22 manifests, tests unchanged) and add the dingger binary: tmux capture-pane watcher, process-tree agent identification, herdr's notification policy, embedded notification sounds, @agent_state write-back, and catalog-based manifest refresh. viewer screens are non-observations per the engine contract; reviewed by a three-model panel (opus 5.5, gpt 6.1 sol, kimi k3) with all confirmed findings applied as deletions.