agent-dag 3.17.0 → 3.18.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/dist/web/assets/index-DYh8wtpn.js +260 -0
- package/dist/web/assets/{index-BwFExw1D.css → index-Dp5_CD7C.css} +1 -1
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/release-notes.json +6 -0
- package/src/server/lan-engine.mjs +22 -0
- package/dist/web/assets/index-CSpWSOAU.js +0 -260
package/dist/web/index.html
CHANGED
|
@@ -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-
|
|
44
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
43
|
+
<script type="module" crossorigin src="/assets/index-DYh8wtpn.js"></script>
|
|
44
|
+
<link rel="stylesheet" crossorigin href="/assets/index-Dp5_CD7C.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.
|
|
3
|
+
"version": "3.18.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": {
|
package/release-notes.json
CHANGED
|
@@ -31,6 +31,12 @@
|
|
|
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.18.0": [
|
|
35
|
+
{
|
|
36
|
+
"title": "🟢 A deck that is switched off no longer reads as on",
|
|
37
|
+
"body": "A paired deck this one has no address for was drawn **live** on the strength of being paired — a machine closed an hour ago still sat under `1 deck ready`. Every row now leads with whether that machine is actually there, and when it last was: `online · 1 login arrived`, `no answer · last online 20m ago`, `never reached`. The mark beside the name is a traffic light — green for a deck that answered, amber for one that cannot be reached, grey for one nothing has heard from.\n\n**+ add a deck** opens a dialog now instead of unfolding inside the panel. An address, an invite and the firewall note never fitted a 288px column, and unfolded they turned a list of machines into a form."
|
|
38
|
+
}
|
|
39
|
+
],
|
|
34
40
|
"3.17.0": [
|
|
35
41
|
{
|
|
36
42
|
"title": "🔔 Pairing is two presses",
|
|
@@ -161,6 +161,21 @@ export function createEngine({
|
|
|
161
161
|
* reach one peer is that peer's row, not the deck's.
|
|
162
162
|
*/
|
|
163
163
|
let stalled = null;
|
|
164
|
+
/**
|
|
165
|
+
* When each paired deck last SPOKE TO THIS ONE, keyed by fingerprint.
|
|
166
|
+
*
|
|
167
|
+
* The panel had no evidence at all about a deck it does not dial. A deck that
|
|
168
|
+
* calls in has no beacon row here (if it had one it would be dialled), never
|
|
169
|
+
* appears in `lastRound`, and its `lastSeen` was therefore undefined forever
|
|
170
|
+
* — so the row was drawn as live on the strength of being paired, and a
|
|
171
|
+
* Windows deck that had been closed for an hour still read `ready`. Reported
|
|
172
|
+
* from a screenshot of exactly that.
|
|
173
|
+
*
|
|
174
|
+
* Every authenticated frame lands in `serve`, which is the one place that
|
|
175
|
+
* knows a paired deck is on the other end of an open socket right now. That
|
|
176
|
+
* is the evidence, and it is the same kind the beacon gives: a timestamp.
|
|
177
|
+
*/
|
|
178
|
+
const spokeAt = new Map();
|
|
164
179
|
|
|
165
180
|
/** This deck's accounts in the shape the rules want. Read through the same
|
|
166
181
|
* function the panel uses, so a row can never be alive here and dead there. */
|
|
@@ -179,6 +194,9 @@ export function createEngine({
|
|
|
179
194
|
* where the two checks sit. `ctx.key` is this connection's key and no other
|
|
180
195
|
* connection's — see sessionKey. */
|
|
181
196
|
const serve = async (msg, ctx) => {
|
|
197
|
+
// Before the verbs, and for every one of them: something that proved it
|
|
198
|
+
// holds a key this deck accepted is talking, now.
|
|
199
|
+
if (ctx?.peerFp) spokeAt.set(ctx.peerFp, now());
|
|
182
200
|
try {
|
|
183
201
|
if (msg.t === "manifest") {
|
|
184
202
|
const accounts = await localAccounts();
|
|
@@ -727,6 +745,10 @@ export function createEngine({
|
|
|
727
745
|
put({
|
|
728
746
|
id: t.fp, fp: t.fp, peerFp: t.fp, name: t.name || t.fp, addr: "", port: 0,
|
|
729
747
|
paired: true, waiting: true, last: lastRound.get(t.fp) ?? null,
|
|
748
|
+
// What it is to be "here" for a deck nothing dials: it called,
|
|
749
|
+
// and this is when. Undefined until it has, which is a row the
|
|
750
|
+
// panel draws as unknown rather than as live.
|
|
751
|
+
lastSeen: spokeAt.get(t.fp),
|
|
730
752
|
});
|
|
731
753
|
}
|
|
732
754
|
return rows;
|