all repos — dingger @ b0cfd10b80443d3f67d263ff4db177bb53cc90ed

Watches the AI coding agents in your tmux panes on macOS and tells you which need you, from the menu bar, a floating panel, the status line and notifications; jumps to them, and restores tmux sessions and agents after a crash

ROADMAP.md (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
# Roadmap

In priority order.

1. ~~**Restore after a crash or shutdown.**~~ Done for pi and Claude Code
   (see the README). Next, when used: other agents' session references
   (codex, ...).
2. ~~**Raise the right window.**~~ Done for Ghostty (see the README),
   tested live with several windows, one of them full screen on its own
   Space, and from other apps. Next, when used: Alacritty with several
   windows in one process.
3. **pi's own status reports (OSC 7501, pi 1.1+).** pi reports `working`,
   `blocked` (a dialog or login, with its kind and title), `done`, `error`
   (with the error's first line) and `idle`, with the session name. tmux
   drops these, but `tmux pipe-pane -O` sees them when pi runs with
   `PI_PROGRAM_STATUS=1`. A first try showed every report, including a
   confirm dialog's `state=blocked:kind=permission:msg=<base64 title>`. It
   would fix item 4 and could replace the extension's state reports. It is
   not specific to pi, so any agent that adopts the protocol would work
   too. Open questions:
   - A pipe for each agent pane is one process each, and tmux allows only
     one pipe per pane.
   - A pipe started after pi misses the reports sent before it.
   - How to set `PI_PROGRAM_STATUS=1` for pi: the tmux global environment,
     or the shell profile.
4. **Blocked on a pi dialog.** While a pi confirm or select dialog waits
   for you, dingger shows the agent as done, not blocked: pi tells
   extensions nothing about its dialogs. Item 3 fixes this. Without it,
   screen detection could match the dialog's key hint line ("enter select
   ยท escape cancel").
5. **Cancelled runs are not done.** Since pi 1.1, `agent_settled` says
   whether the run was `aborted`. A run you cancel and then leave shows
   as done, and dingger notifies you. The extension could report idle
   for it, as pi's own reports do.
6. **Failed runs.** pi 1.1 tells a run that ended with an error from one
   that finished, and gives the error's first line. dingger shows both as
   done. Design question: herdr has no such status; should a failure get
   its own mark, its own sound, and the error in the panel and
   notification?
7. ~~**The extended-keys warning.**~~ Gone: the tmux config turns on
   `extended-keys` (format `csi-u`), which is all pi checks for. dingger's
   snippet leaves it to the tmux config.
8. **Preview in agent search.** Show the last lines of the selected agent's
   pane (`tmux capture-pane`) beside the results. Not yet.

Ideas, not yet prioritized:

9. **Say what happened, not just that it happened.** A notification says
   "pi finished" and where; the panel shows the name and the wait. The pi
   extension already sends what a blocked agent waits on (dingger drops
   it), and could send the first line of the final reply when a turn
   ends. Shown in the notification, the panel, and search, it would let
   you decide which agent to visit first without visiting each. Caveat:
   notifications can show on the lock screen. Parked after a mockup from
   real agents: the summary under the name, wrapping to two lines, the
   location line last; a question or a blocked agent's request brighter,
   a statement dimmer. The rule: the reply's closing question if it ends
   with one, else its first paragraph (skipping headings); about one in
   six came out weak. Open: idle agents keep it?, menu line or tooltip?,
   search matches it?, a Claude Stop hook, the notification's title.
10. **Clicking a notification jumps to the agent.** Notifications come from
    the daemon with no click action. The menu bar app could post them and
    jump on click (it would then ask for the notification permission).
11. **Stale agents.** 25 of the agent panes have been idle for over two
    days (pi agents hold about 4.1 GB between them); they lengthen the
    full panel, the menu, and search. Group them in a collapsed "older"
    section, and offer to close them (restore can bring one back from its
    session file).
12. **Reply without switching.** A text field in search sends a message to
    the selected pi agent through its extension (not keystrokes into the
    pane), for short replies like "yes, go ahead". Not for pi's dialogs
    (item 3). Needs care so a message never reaches the wrong agent.
13. **Stuck agents.** Flag an agent that has been working for N minutes
    with nothing changing on screen (a hung tool, network retries). Only
    if it happens often enough.
14. **Reach you away from the Mac.** While the screen is locked or you are
    idle, send blocked agents to your phone (a push service such as ntfy
    or Pushover). Sends data off the machine: needs explicit setup.

15. **What each agent costs.** pi records each reply's cost in its
    session file. Show today's spend per agent (panel, menu, search) and
    a total in the menu; optionally warn when one agent passes a limit.
    One day's sample: $37.44 across 9 agents, 77% from two of them.
16. ~~**Keep agents on the current extension.**~~ Done (see the README):
    the daemon updates the installed extension, and reloads agents on an
    old one over a control socket, from the menu or `dingger
    reload-agents`. The socket is also the way to items 11 (closing an
    agent) and 12 (replying to one).
17. **Find an agent by what it discussed.** Search also matches the
    conversation text in session files (needs an index).
18. **Warn about uncommitted work.** Mark agents whose directory has
    uncommitted git changes; mainly a safety check before closing a stale
    agent (item 11).
19. **Forgotten drafts.** Mark agents with a half-typed message in their
    input box.

Known gaps, left for now:

- **Mark as unread from inside Claude Code.** `! dingger unread` starts a
  model turn (Claude 2.1.311 answers `!` commands), so the agent is working
  and the mark is refused; the panel and search work. A fix: a
  `UserPromptSubmit` hook that catches a typed `/unread`, marks the agent,
  and drops the prompt before it reaches the model.

The rest of pi 1.0.4 to 1.4.0 (models, codemode, configuration schemas,
clipboard, `/share`) does not touch dingger. pi 1.3's resumed sessions
keep their active tools, so a restore brings those back too.
`tests/pi-live.sh <pi>` checks a new pi release against dingger.