# 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=`. Items 4 and 5 no longer need it (pi 1.4's extension events cover both); it could still replace the extension's state reports, and carries errors for item 6. 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.**~~ Done (see the README): pi 1.4 tells extensions when a dialog opens and closes (`ui_prompt_start`/`_end`). A dialog during a run is blocked; one opened while idle is not. Next, with item 9: the dialog's title in the notification and panel. 5. ~~**Cancelled runs are not done.**~~ Done (see the README): the extension reports `aborted` with the idle that ends a cancelled run, and the daemon keeps it idle, with no "finished" alert. 6. ~~**Failed runs.**~~ Done for pi (see the README): still done, but the alert says "failed" and why, with the "needs attention" sound, and the second line shows it in red until seen. In 30 days, 88 of 3,959 runs (2.2%) failed: network errors, timeouts, and keys or gateway policies. 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.