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.** 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 <pi>` checks a new pi release against dingger.
|