aboutsummaryrefslogtreecommitdiff
path: root/ROADMAP.md
blob: 8a61f17de82026305f3ca4cfcc1ff5d4a9973ce0 (plain)
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
109
110
# 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>`.
   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 <pi>` checks a new pi release against dingger.