# 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=`. 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.**~~ Done for pi (see the README): today, this week and this month in the menu, each agent's today on its line, UTC periods, forks counted once, closed agents included. No limits or warnings, by choice. 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.**~~ Done for pi (see the README): marked where you are not looking, first among idle agents, counted in the compact panel, found by search, and kept across a crash or restore. Claude Code would need screen matching of its 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 ` checks a new pi release against dingger.