agent-dag 3.18.1 → 3.19.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.
@@ -40,8 +40,8 @@
40
40
  document.documentElement.setAttribute("data-theme", stored === "light" ? "light" : "dark");
41
41
  })();
42
42
  </script>
43
- <script type="module" crossorigin src="/assets/index-BLZ602Di.js"></script>
44
- <link rel="stylesheet" crossorigin href="/assets/index-Ba2dbqwU.css">
43
+ <script type="module" crossorigin src="/assets/index-DTbVC1d9.js"></script>
44
+ <link rel="stylesheet" crossorigin href="/assets/index-CE-8EKi6.css">
45
45
  </head>
46
46
  <body>
47
47
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-dag",
3
- "version": "3.18.1",
3
+ "version": "3.19.0",
4
4
  "description": "Live deck of Claude Code and Codex agents — watch tool calls, token spend and every Claude Code subagent on one calm canvas. Run it with npx ccdeck.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -31,6 +31,18 @@
31
31
  "about a defect in the type, and the suite refuses both it and no space at",
32
32
  "all."
33
33
  ],
34
+ "3.19.0": [
35
+ {
36
+ "title": "🟢 Local network: fixes and improvements",
37
+ "body": "The list of decks is quiet now. A deck that is **on**, with nothing to repair, is a name and a green mark — no sentence under it. Every healthy row used to carry the same words, so the one row worth reading looked like all the others. A failure, a login that arrived, a machine that is away, still say so, and they are now the only rows with anything written on them.\n\n`unpair` arrives when you point at a row rather than sitting on every one of them, two machines that share a name show their addresses, and the ↻ turns while a round is out.\n\n**Add a deck** is two ways in — by address, or with an invite — with `make one to send` beside the invite heading instead of under the paste field, where it read as that field's button. A refused address now says which mistake it was, and an invite that will not work says whether it ran out, was not an invite, or reached nothing.\n\nSwitching **Local network** on opens your name and shared logins, every time, so nothing goes on the network without you having just seen what goes with it."
38
+ }
39
+ ],
40
+ "3.18.3": [
41
+ {
42
+ "title": "🟢 The list shows what is on, and folds the rest",
43
+ "body": "A machine that is off, or nearby and unpaired, or one you said no to, is context rather than an answer to \"who can I use right now\" — so the decks that are **on** lead the list and everything else is one line: `2 more`. Nothing worrying is hidden by it: a deck that cannot be reached is counted in that line, in the warning colour, so the fold says whether it is worth opening.\n\nThe round moved to a **↻ beside the switch**, where the accounts header has kept the same act since it was written, and the line under the state now says when it last ran — `checked 2m ago`, or `not checked yet`. A list that refreshes itself and a list that has stopped used to look identical, and pressing the button to find out was the only way to tell."
44
+ }
45
+ ],
34
46
  "3.18.1": [
35
47
  {
36
48
  "title": "🔁 A deck stops asking to pair over and over",
@@ -163,6 +163,11 @@ export function createEngine({
163
163
  /** What the last round did, for the panel. Not a log: one line per peer, most
164
164
  * recent only, because "what happened" is a question about now. */
165
165
  const lastRound = new Map();
166
+ /** When the last round FINISHED, whatever it did or failed to do. The panel's
167
+ * `↻` fires one on demand and the loop fires one on its own; a reader who
168
+ * pressed it wants to know it happened, and a reader who did not wants to
169
+ * know the list is not a photograph of an hour ago. */
170
+ let roundAt = null;
166
171
  /**
167
172
  * Why this deck is not listening, when it is switched on and is not.
168
173
  *
@@ -385,6 +390,7 @@ export function createEngine({
385
390
  // max+1 without a lock of its own.
386
391
  all.push(...await roundWith(peer));
387
392
  }
393
+ roundAt = now();
388
394
  return all;
389
395
  };
390
396
 
@@ -702,6 +708,9 @@ export function createEngine({
702
708
  // Said only while it is true, and it is only ever true of a deck that
703
709
  // is switched on and has no listener.
704
710
  stalled: cfg.enabled && !beacon ? stalled : null,
711
+ // When every paired deck was last asked. Null until the first round,
712
+ // which on a deck that has just started is the honest answer.
713
+ checkedAt: roundAt,
705
714
  name: cfg.name,
706
715
  fp: identity?.fp ?? null,
707
716
  // The address and port a person on another subnet types into the other