agent-dag 3.20.0 → 3.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +113 -5
- package/dist/web/assets/{index-DVj_M279.css → index-BYMVIG6f.css} +1 -1
- package/dist/web/assets/index-G0ntHhBn.js +266 -0
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/release-notes.json +6 -0
- package/src/server/activity.mjs +52 -0
- package/src/server/auto-update.mjs +79 -0
- package/src/server/claude-accounts.mjs +32 -0
- package/src/server/cswap-admin.mjs +87 -11
- package/src/server/deck-prefs.mjs +51 -1
- package/src/server/index.mjs +150 -2
- package/src/server/lan-about.mjs +119 -0
- package/src/server/lan-engine.mjs +90 -7
- package/src/server/lan-sync.mjs +5 -1
- package/src/server/presence.mjs +40 -0
- package/dist/web/assets/index-Dr-bVaHM.js +0 -266
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
# ccdeck
|
|
3
|
+
# ccdeck — a live dashboard for Claude Code and Codex
|
|
4
4
|
|
|
5
5
|
**Know which agent is waiting on you, and for how long.**
|
|
6
6
|
|
|
@@ -22,7 +22,7 @@ npx ccdeck
|
|
|
22
22
|
|
|
23
23
|
who is blocked on you · tool calls · one canvas · cost · quota · local · no telemetry
|
|
24
24
|
|
|
25
|
-
[What you get](#what-you-get) · [Quick start](#quick-start) · [How it works](#how-it-works) · [What it touches](#what-it-touches) · [Accounts](#accounts) · [Options](#options)
|
|
25
|
+
[What you get](#what-you-get) · [Quick start](#quick-start) · [How it works](#how-it-works) · [What it touches](#what-it-touches) · [Accounts](#accounts) · [Local network](#local-network) · [Options](#options) · [FAQ](#questions-people-ask)
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
</div>
|
|
@@ -43,6 +43,43 @@ ccdeck draws the tree instead. It is local and needs no configuration: it regist
|
|
|
43
43
|
|
|
44
44
|
One canvas. No tabs. No kanban.
|
|
45
45
|
|
|
46
|
+
The deck opens on these eight pictures the first time it runs — they are the whole tour, and `Take the tour` on an empty canvas brings them back.
|
|
47
|
+
|
|
48
|
+
<table>
|
|
49
|
+
<tr>
|
|
50
|
+
<td><img src="assets/guide/welcome-1.svg" width="440" alt="Sessions waiting on you rise to the top, longest wait first."></td>
|
|
51
|
+
<td><img src="assets/guide/welcome-2.svg" width="440" alt="Every agent and subagent is a node. Tool calls light up as they run."></td>
|
|
52
|
+
</tr>
|
|
53
|
+
<tr>
|
|
54
|
+
<td align="center"><sub>Sessions waiting on you rise to the top, longest wait first.</sub></td>
|
|
55
|
+
<td align="center"><sub>Every agent and subagent is a node. Tool calls light up as they run.</sub></td>
|
|
56
|
+
</tr>
|
|
57
|
+
<tr>
|
|
58
|
+
<td><img src="assets/guide/welcome-3.svg" width="440" alt="Click any node: its prompt, every tool call, tokens and timing."></td>
|
|
59
|
+
<td><img src="assets/guide/welcome-4.svg" width="440" alt="What each session costs, and how much quota is left."></td>
|
|
60
|
+
</tr>
|
|
61
|
+
<tr>
|
|
62
|
+
<td align="center"><sub>Click any node: its prompt, every tool call, tokens and timing.</sub></td>
|
|
63
|
+
<td align="center"><sub>What each session costs, and how much quota is left.</sub></td>
|
|
64
|
+
</tr>
|
|
65
|
+
<tr>
|
|
66
|
+
<td><img src="assets/guide/welcome-5.svg" width="440" alt="Cores, memory and heat while the agents run, and what is hogging them."></td>
|
|
67
|
+
<td><img src="assets/guide/welcome-6.svg" width="440" alt="Several Claude accounts: switch, add one, share one to another machine."></td>
|
|
68
|
+
</tr>
|
|
69
|
+
<tr>
|
|
70
|
+
<td align="center"><sub>Cores, memory and heat while the agents run, and what is hogging them.</sub></td>
|
|
71
|
+
<td align="center"><sub>Several Claude accounts: switch, add one, share one to another machine.</sub></td>
|
|
72
|
+
</tr>
|
|
73
|
+
<tr>
|
|
74
|
+
<td><img src="assets/guide/welcome-7.svg" width="440" alt="Your machines repair each other's expired logins over the local network."></td>
|
|
75
|
+
<td><img src="assets/guide/welcome-8.svg" width="440" alt="Run claude or codex in any folder. It shows up here on its own."></td>
|
|
76
|
+
</tr>
|
|
77
|
+
<tr>
|
|
78
|
+
<td align="center"><sub>Your machines repair each other's expired logins over the local network.</sub></td>
|
|
79
|
+
<td align="center"><sub>Run <code>claude</code> or <code>codex</code> in any folder. It shows up here on its own.</sub></td>
|
|
80
|
+
</tr>
|
|
81
|
+
</table>
|
|
82
|
+
|
|
46
83
|
| | |
|
|
47
84
|
|---|---|
|
|
48
85
|
| **Blocked on you** | A permission prompt, or a finished turn waiting for your next instruction, sorts that session to the top of the sidebar with how long it has been stuck — longest wait first, so the oldest block is the first row. A permission prompt also puts a count in the topbar that jumps straight to it. Claude Code only — Codex emits no such signal. |
|
|
@@ -52,6 +89,7 @@ One canvas. No tabs. No kanban.
|
|
|
52
89
|
| **Click to inspect** | Any node opens its prompt, tool calls, token usage and timing. |
|
|
53
90
|
| **Survives restarts** | Events are appended to `~/.claude/agent-dag/events.jsonl` and replayed on open. |
|
|
54
91
|
| **Accounts without a terminal** | Sign a new Claude account in, move one or your whole set to another machine, rename, reorder, remove — from the panel. |
|
|
92
|
+
| **Logins that repair each other** | A Claude login that expires on one of your machines is copied back from another machine on the same network that still has it — see [Local network](#local-network). |
|
|
55
93
|
| **Knows when it is stale** | Node caches modules at startup, so an upgraded-while-running deck keeps executing old code. This one says so, and can restart itself when nothing is running. |
|
|
56
94
|
| **Workspace scoping** | `--scope` for the current directory, `--workspace <path>` for any subtree — for Claude Code and Codex alike. |
|
|
57
95
|
|
|
@@ -61,7 +99,12 @@ One canvas. No tabs. No kanban.
|
|
|
61
99
|
npx ccdeck # or: npx agents-deck · npx agent-dag — same deck
|
|
62
100
|
```
|
|
63
101
|
|
|
64
|
-
Opens **http://127.0.0.1:4317
|
|
102
|
+
Opens **http://127.0.0.1:4317**, shows an eight-picture tour the first time, and registers the Claude Code hook on first run. If something else already holds 4317, the deck takes a port between 4318 and 4400 instead and prints the address it ended up on — that line in the terminal is the one to trust. Start any Claude Code or Codex session and the graph fills in live.
|
|
103
|
+
|
|
104
|
+
The deck keeps running after you close the terminal, and starts again when you
|
|
105
|
+
log in. **`ccdeck --stop` is the off switch**; `Ctrl+C` only cancels a start that
|
|
106
|
+
is still printing. `ccdeck --status` says what is running, and `--foreground`
|
|
107
|
+
holds the terminal the way every version before 3.20 did.
|
|
65
108
|
|
|
66
109
|
No config file. No account. No telemetry — nothing about your sessions is reported anywhere.
|
|
67
110
|
|
|
@@ -158,6 +201,37 @@ An import adds what is missing and leaves a working account exactly as it is. Th
|
|
|
158
201
|
|
|
159
202
|
Renaming, reordering and removing are on the same row menu. Removal takes two clicks and cannot be undone.
|
|
160
203
|
|
|
204
|
+
## Local network
|
|
205
|
+
|
|
206
|
+
A Claude login expires on the machine that has not used it for a while, and stays alive on the one that has. With two or three machines that is a `claude login` a week, each time on the machine you are not sitting at. **Local network** is the last section of the Claude accounts panel, and it is that chore done for you: decks on one network find each other, pair, and a login that has expired on one is copied back from another that still has it.
|
|
207
|
+
|
|
208
|
+
Four pictures, which are also the guide the section opens from `See how it works`:
|
|
209
|
+
|
|
210
|
+
<table>
|
|
211
|
+
<tr>
|
|
212
|
+
<td><img src="assets/guide/lan-1.svg" width="440" alt="A login can expire on one machine while it still works on another."></td>
|
|
213
|
+
<td><img src="assets/guide/lan-2.svg" width="440" alt="Turn this on, on both machines. They find each other and pair."></td>
|
|
214
|
+
</tr>
|
|
215
|
+
<tr>
|
|
216
|
+
<td align="center"><sub><b>1.</b> A login can expire on one machine while it still works on another.</sub></td>
|
|
217
|
+
<td align="center"><sub><b>2.</b> Turn this on, on both machines. They find each other and pair.</sub></td>
|
|
218
|
+
</tr>
|
|
219
|
+
<tr>
|
|
220
|
+
<td><img src="assets/guide/lan-3.svg" width="440" alt="Tick which logins this machine may hand out. Nothing is shared until you do."></td>
|
|
221
|
+
<td><img src="assets/guide/lan-4.svg" width="440" alt="An expired login is copied from a paired machine within a minute."></td>
|
|
222
|
+
</tr>
|
|
223
|
+
<tr>
|
|
224
|
+
<td align="center"><sub><b>3.</b> Tick which logins this machine may hand out. Nothing is shared until you do.</sub></td>
|
|
225
|
+
<td align="center"><sub><b>4.</b> An expired login is copied from a paired machine within a minute.</sub></td>
|
|
226
|
+
</tr>
|
|
227
|
+
</table>
|
|
228
|
+
|
|
229
|
+
**On each machine, in order:** open the Claude accounts panel (`A`), switch **Local network** on, and in the dialog that opens tick the logins this machine may hand out. That is all — the two decks find each other over a UDP beacon on port 45317, pair on their own, and from then on every paired deck is asked once a minute for anything this deck's expired logins need.
|
|
230
|
+
|
|
231
|
+
**When they do not find each other** — a VPN, a guest network, two subnets — `+` at the top of the section reaches a deck by address, or with an invite the other deck minted. An invite is the route when the machine that cannot be seen is this one.
|
|
232
|
+
|
|
233
|
+
**What is shared, and with whom.** Nothing until you tick a login, and then only that login, and only with decks somebody at this machine accepted — the deck asks the machines it finds and says yes to the ones that ask, and both switches are in the same dialog if you would rather press `accept` yourself. A paired deck can fill an *expired* slot of this deck's and nothing else: it cannot overwrite a login that still works here. What crosses the wire is the same live credential a share carries, sealed to the deck it is addressed to, so treat the pairing decision as the moment that matters. Unpairing stops future rounds; a login already copied stays where it went.
|
|
234
|
+
|
|
161
235
|
## Options
|
|
162
236
|
|
|
163
237
|
```
|
|
@@ -287,7 +361,7 @@ Being told to restart after an upgrade is local only — no network involved —
|
|
|
287
361
|
npx ccdeck --uninstall
|
|
288
362
|
```
|
|
289
363
|
|
|
290
|
-
Removes every hook entry ccdeck injected from `~/.claude/settings.json`, and `~/.codex/hooks.json` if present.
|
|
364
|
+
Removes every hook entry ccdeck injected from `~/.claude/settings.json`, and `~/.codex/hooks.json` if present — and the login item, if this machine had one. That one exception to the narrowness below is deliberate: a login item left behind would keep starting a deck whose hooks had just been removed.
|
|
291
365
|
|
|
292
366
|
It removes the hook entries and nothing else. The forwarder script
|
|
293
367
|
(`~/.claude/agent-dag/hook.js`), the discovery directory around it, the events
|
|
@@ -315,7 +389,7 @@ Nothing is ever installed unless you click, the argument vector is fixed in the
|
|
|
315
389
|
|
|
316
390
|
### Restarting
|
|
317
391
|
|
|
318
|
-
ccdeck runs as a two-process pair: a supervisor that owns nothing but the lifecycle, and the deck itself. When newer code is found, the deck exits with code 75 and the supervisor brings it back **on the port it actually bound**, which is not always the one it asked for.
|
|
392
|
+
ccdeck runs as a two-process pair: a supervisor that owns nothing but the lifecycle, and the deck itself. When newer code is found, the deck exits with code 75 and the supervisor brings it back **on the port it actually bound**, which is not always the one it asked for. Both live in their own process group since 3.20, so stdout goes to `deck.log` rather than to the terminal you started from — `ccdeck --logs` reads it back. The supervisor also puts the deck back after a crash, five times in ten minutes with the wait doubling, and then stops and says why rather than spinning.
|
|
319
393
|
|
|
320
394
|
It restarts on its own only after 30 seconds with nothing running, because hook events are fire-and-forget and anything fired during the gap is lost. The toggle in the banner turns that off; the preference is per-browser. Under `--no-persist` a restart is refused outright — with no event log there is nothing to replay, and the canvas would be gone.
|
|
321
395
|
|
|
@@ -349,6 +423,40 @@ It is now the same build as the other two.
|
|
|
349
423
|
The repository was previously named `agents-deck`; the old URL redirects here,
|
|
350
424
|
so existing clones, links and bookmarks keep working.
|
|
351
425
|
|
|
426
|
+
## Questions people ask
|
|
427
|
+
|
|
428
|
+
**Does it work with Codex, or only Claude Code?**
|
|
429
|
+
Both, on one canvas. Claude Code arrives through a hook, Codex through its
|
|
430
|
+
rollout log, and the model chip tells them apart. The *blocked on you* queue is
|
|
431
|
+
Claude Code only — Codex emits no signal for it.
|
|
432
|
+
|
|
433
|
+
**Does anything leave my machine?**
|
|
434
|
+
Your sessions, never. The deck binds `127.0.0.1` and has no telemetry. The only
|
|
435
|
+
outbound requests are a ~20-byte version check to the npm registry at most once
|
|
436
|
+
an hour, and whatever the usage panels ask Anthropic and OpenAI for about your
|
|
437
|
+
own quota. [What it touches](#what-it-touches) lists all of it.
|
|
438
|
+
|
|
439
|
+
**Can it interfere with what my agent does?**
|
|
440
|
+
No. The hook it installs is a one-way forwarder: it POSTs the event, exits `0`,
|
|
441
|
+
and writes nothing to stdout — the two channels Claude Code's hook protocol
|
|
442
|
+
gives a hook for allowing, denying or rewriting a tool call. It uses neither, so
|
|
443
|
+
it has no way to answer at all, and a test pins both halves.
|
|
444
|
+
|
|
445
|
+
**Does it need an account, an API key or a config file?**
|
|
446
|
+
None of the three. `npx ccdeck` and it runs.
|
|
447
|
+
|
|
448
|
+
**macOS, Linux, Windows?**
|
|
449
|
+
All three, and each release is tested on all three.
|
|
450
|
+
|
|
451
|
+
**What is the difference between `ccdeck`, `agents-deck` and `agent-dag`?**
|
|
452
|
+
One deck, three names on npm. `ccdeck` is the one to use; the other two are the
|
|
453
|
+
names it shipped under before, kept working so nobody's command breaks. See
|
|
454
|
+
[Names](#names).
|
|
455
|
+
|
|
456
|
+
**Do I have to keep a terminal open?**
|
|
457
|
+
No. Since 3.20 the deck runs in the background, survives the terminal closing,
|
|
458
|
+
and starts again when you log in. `ccdeck --stop` ends it.
|
|
459
|
+
|
|
352
460
|
## License
|
|
353
461
|
|
|
354
462
|
MIT © [Bargan Constantin](https://github.com/BarganConstantin)
|