@cotal-ai/web 0.17.0 → 0.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.
- package/dist/web/agui-frame.js +210 -0
- package/dist/web/app.js +24 -2
- package/dist/web/graph.html +2 -0
- package/dist/web/graph.js +52 -12
- package/dist/web/index.html +2 -0
- package/dist/web/parts.js +144 -0
- package/dist/web.d.ts +10 -0
- package/dist/web.d.ts.map +1 -1
- package/dist/web.js +86 -18
- package/dist/web.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
// The browser renderer for `ag-ui.frame` parts, the dashboard's half of the AG-UI display path.
|
|
2
|
+
//
|
|
3
|
+
// WHY A SECOND IMPLEMENTATION EXISTS AT ALL, since duplication is what this tree normally refuses.
|
|
4
|
+
// `src/web/*.js` are classic <script> files served to a browser. They cannot import
|
|
5
|
+
// `@cotal-ai/core`, so they cannot reach `extensions/connector-core/src/agui-render.ts`, which is
|
|
6
|
+
// the same renderer for every other surface. There is no seam that makes one implementation serve
|
|
7
|
+
// both: the constraint is the module system, not a design choice. So the two are kept in step by an
|
|
8
|
+
// EQUIVALENCE INSTRUMENT rather than by intent. "We will keep them in sync" was explicitly refused
|
|
9
|
+
// as a plan; a cell that reddens when they diverge is the only version that survives us. That cell
|
|
10
|
+
// is `bin/smoke/agui-render-parity.smoke.ts`, and it earned its place before this file shipped: an
|
|
11
|
+
// earlier draft of this pair used `||` here against `??` there, so an event carrying an EMPTY
|
|
12
|
+
// STRING for `content`, `runId` or `toolCallName` rendered one way in the console and another way
|
|
13
|
+
// in the browser. Every fallback below therefore keys on `undefined` and never on falsiness, which
|
|
14
|
+
// is what `str()` returning `undefined` for a non-string is for.
|
|
15
|
+
//
|
|
16
|
+
// THE OUTPUT MUST MATCH `agui-render.ts` over the same frame. Every glyph, prefix and fallback
|
|
17
|
+
// string below is chosen to match it, not to look right here. If you change one, you are changing a
|
|
18
|
+
// contract that another file also implements.
|
|
19
|
+
//
|
|
20
|
+
// ── THE LINE-START INVARIANT, WHICH IS NOT COSMETIC ─────────────────────────────────────────────
|
|
21
|
+
//
|
|
22
|
+
// Every line this emits begins with a prefix carrying a non-space glyph inside the first three
|
|
23
|
+
// columns, and payload NEVER starts a line. That is load-bearing on this surface specifically:
|
|
24
|
+
// `app.js` pipes body text through `MD.render` (marked, gfm + breaks), so a payload line beginning
|
|
25
|
+
// `- ` or `# ` opens a markdown block. Measured on the shipped pipeline: a tool result whose second
|
|
26
|
+
// line began `- ` opened a list that CAPTURED the frame's own `run finished` terminator into a list
|
|
27
|
+
// item the payload created. Payload restructured scaffolding.
|
|
28
|
+
//
|
|
29
|
+
// Leading spaces do NOT establish a line start: markdown recognises a heading under up to three of
|
|
30
|
+
// them, and four spaces means a code block instead. A non-space glyph is the only prefix that is
|
|
31
|
+
// inert in both directions.
|
|
32
|
+
//
|
|
33
|
+
// ── WHAT IT DOES NOT DO ─────────────────────────────────────────────────────────────────────────
|
|
34
|
+
//
|
|
35
|
+
// It does not validate. The frame arrives over the wire and every field read here is guarded: a
|
|
36
|
+
// malformed event degrades to a named marker rather than throwing. A renderer is the wrong place to
|
|
37
|
+
// discover a producer's bug and a very good place to make one visible.
|
|
38
|
+
//
|
|
39
|
+
// It registers itself rather than being wired in by `parts.js`, so the dispatcher keeps knowing
|
|
40
|
+
// nothing about AG-UI. A failed or absent registration degrades to
|
|
41
|
+
// `[unrenderable part kind "ag-ui.frame" …]`, true and named, which is the honest-refusal property
|
|
42
|
+
// that file exists for and the reason this is not a branch inside it.
|
|
43
|
+
(() => {
|
|
44
|
+
const KIND = "ag-ui.frame";
|
|
45
|
+
|
|
46
|
+
// Created if absent, so this file and `parts.js` may load in either order. Script order is
|
|
47
|
+
// load-bearing on this surface for other reasons; it must not also be load-bearing for this.
|
|
48
|
+
window.COTAL_PART_RENDERERS = window.COTAL_PART_RENDERERS || {};
|
|
49
|
+
|
|
50
|
+
const CONT = " · ";
|
|
51
|
+
const TEXT_PREFIX = "» ";
|
|
52
|
+
const THINK_PREFIX = "(thinking) ";
|
|
53
|
+
const TOOL_PREFIX = "⚙ ";
|
|
54
|
+
const RESULT_PREFIX = " ↳ ";
|
|
55
|
+
|
|
56
|
+
// `undefined` for anything that is not a string, so a caller can tell ABSENT from EMPTY. Every
|
|
57
|
+
// fallback below uses `??` on this, never `||`: an event carrying `content: ""` reported a tool
|
|
58
|
+
// that returned nothing, and printing `(no content)` for it would state something the producer
|
|
59
|
+
// did not. `agui-render.ts` draws exactly this distinction and the parity suite pins it.
|
|
60
|
+
const str = (v) => (typeof v === "string" ? v : undefined);
|
|
61
|
+
|
|
62
|
+
// Prefix EVERY line, not just the first. Payload values are multi-line (a tool result is the
|
|
63
|
+
// common case, but pretty-printed args, a multi-paragraph message and an error body all are) and
|
|
64
|
+
// emitting one as a single string puts its second and later lines at column 0 with nothing of the
|
|
65
|
+
// renderer's in front of them.
|
|
66
|
+
// `body` is a string at every call site (a template literal, a `str() ?? fallback`, or an
|
|
67
|
+
// accumulator concat), so it is NOT coerced here. A `String(body)` would be the only difference
|
|
68
|
+
// between this fold and the node one, and a difference whose whole purpose is to absorb a case that
|
|
69
|
+
// cannot arrive is the kind that survives until the case does arrive and then diverges silently.
|
|
70
|
+
function emit(lines, first, cont, body) {
|
|
71
|
+
const parts = body.split("\n");
|
|
72
|
+
lines.push(first + parts[0]);
|
|
73
|
+
for (let i = 1; i < parts.length; i += 1) lines.push(cont + parts[i]);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function flush(lines, map, id, first, cont, suffix) {
|
|
77
|
+
const acc = map.get(id);
|
|
78
|
+
if (acc !== undefined && acc.length > 0) emit(lines, first, cont, acc + (suffix || ""));
|
|
79
|
+
map.delete(id);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Deltas are ACCUMULATED rather than printed one per line: content arrives as a stream of
|
|
83
|
+
// fragments, and a renderer that printed each would turn a sentence into a column. Keyed by
|
|
84
|
+
// messageId / toolCallId so two interleaved streams do not braid, since the ids exist because
|
|
85
|
+
// interleaving is legal.
|
|
86
|
+
//
|
|
87
|
+
// `Map`, NOT a plain object, and this is the one structural decision in the file that a reader
|
|
88
|
+
// would otherwise "simplify" back into a bug. Ids come off the wire, so they are attacker- and
|
|
89
|
+
// accident-shaped, and a plain object diverges from `agui-render.ts`'s Maps on two of them:
|
|
90
|
+
// - an INTEGER-LIKE id ("2", "10") is an array index to an object, so `Object.keys` returns it
|
|
91
|
+
// in ascending NUMERIC order regardless of insertion, and two unterminated streams flush in
|
|
92
|
+
// the wrong order, on one surface only;
|
|
93
|
+
// - `__proto__` never becomes an own key at all, so that stream is silently DROPPED.
|
|
94
|
+
// Both are invisible in the ordinary case and both are pinned by cells in the parity suite.
|
|
95
|
+
function renderEvents(events) {
|
|
96
|
+
const lines = [];
|
|
97
|
+
const text = new Map();
|
|
98
|
+
const reasoning = new Map();
|
|
99
|
+
const toolName = new Map();
|
|
100
|
+
const toolArgs = new Map();
|
|
101
|
+
|
|
102
|
+
for (const e of events) {
|
|
103
|
+
// THE ELEMENT ITSELF IS UNTRUSTED, not just its fields. `events` is an array off the wire and
|
|
104
|
+
// nothing upstream checks that each element is an object, so `null` reaches here and a bare
|
|
105
|
+
// `e.type` throws on it. `parts.js` would catch that into a named marker, which means one null
|
|
106
|
+
// element would delete every other event in the frame from the reader's view. Named per
|
|
107
|
+
// element instead, matching `agui-render.ts`, so one malformed event costs one line.
|
|
108
|
+
const type = typeof e === "object" && e !== null ? str(e.type) : undefined;
|
|
109
|
+
switch (type) {
|
|
110
|
+
case "RUN_STARTED":
|
|
111
|
+
emit(lines, "▸ ", CONT, `run ${str(e.runId) ?? "?"} started`);
|
|
112
|
+
break;
|
|
113
|
+
case "RUN_FINISHED": {
|
|
114
|
+
// `outcome` is optional by the real schema. A turn that merely ended says nothing more,
|
|
115
|
+
// and manufacturing "success" would assert something the source never said.
|
|
116
|
+
const outcome = str(e.outcome?.type);
|
|
117
|
+
emit(lines, "◂ ", CONT, `run ${str(e.runId) ?? "?"} finished${outcome ? ` (${outcome})` : ""}`);
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
case "RUN_ERROR": {
|
|
121
|
+
const code = str(e.code);
|
|
122
|
+
emit(lines, "✗ ", CONT, `run error${code ? ` [${code}]` : ""}: ${str(e.message) ?? "(no message)"}`);
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
case "TEXT_MESSAGE_START":
|
|
127
|
+
text.set(str(e.messageId) ?? "", "");
|
|
128
|
+
break;
|
|
129
|
+
case "TEXT_MESSAGE_CONTENT": {
|
|
130
|
+
const id = str(e.messageId) ?? "";
|
|
131
|
+
text.set(id, (text.get(id) ?? "") + (str(e.delta) ?? ""));
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
case "TEXT_MESSAGE_END":
|
|
135
|
+
flush(lines, text, str(e.messageId) ?? "", TEXT_PREFIX, TEXT_PREFIX);
|
|
136
|
+
break;
|
|
137
|
+
|
|
138
|
+
case "REASONING_MESSAGE_START":
|
|
139
|
+
reasoning.set(str(e.messageId) ?? "", "");
|
|
140
|
+
break;
|
|
141
|
+
case "REASONING_MESSAGE_CONTENT": {
|
|
142
|
+
const id = str(e.messageId) ?? "";
|
|
143
|
+
reasoning.set(id, (reasoning.get(id) ?? "") + (str(e.delta) ?? ""));
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
case "REASONING_MESSAGE_END":
|
|
147
|
+
flush(lines, reasoning, str(e.messageId) ?? "", THINK_PREFIX, CONT);
|
|
148
|
+
break;
|
|
149
|
+
|
|
150
|
+
case "TOOL_CALL_START": {
|
|
151
|
+
const id = str(e.toolCallId) ?? "";
|
|
152
|
+
toolName.set(id, str(e.toolCallName) ?? "?");
|
|
153
|
+
toolArgs.set(id, "");
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
case "TOOL_CALL_ARGS": {
|
|
157
|
+
const id = str(e.toolCallId) ?? "";
|
|
158
|
+
toolArgs.set(id, (toolArgs.get(id) ?? "") + (str(e.delta) ?? ""));
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
case "TOOL_CALL_END": {
|
|
162
|
+
const id = str(e.toolCallId) ?? "";
|
|
163
|
+
emit(lines, TOOL_PREFIX, CONT, `${toolName.get(id) ?? "?"}(${toolArgs.get(id) ?? ""})`);
|
|
164
|
+
toolName.delete(id);
|
|
165
|
+
toolArgs.delete(id);
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
case "TOOL_CALL_RESULT":
|
|
169
|
+
emit(lines, RESULT_PREFIX, CONT, str(e.content) ?? "(no content)");
|
|
170
|
+
break;
|
|
171
|
+
|
|
172
|
+
case "CUSTOM":
|
|
173
|
+
emit(lines, "• ", CONT, `custom ${str(e.name) ?? "(unnamed)"}`);
|
|
174
|
+
break;
|
|
175
|
+
|
|
176
|
+
// An event whose type this build does not know. NAMED, never skipped: a skipped event is a
|
|
177
|
+
// hole in a transcript that still looks complete.
|
|
178
|
+
default:
|
|
179
|
+
emit(lines, "• ", CONT, `unrecognised event ${JSON.stringify(type === undefined ? null : type)}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// A stream that ended without its END event still has content a reader needs. Dropping it would
|
|
184
|
+
// make a truncated turn indistinguishable from a silent one.
|
|
185
|
+
for (const id of [...text.keys()]) flush(lines, text, id, TEXT_PREFIX, TEXT_PREFIX, " …");
|
|
186
|
+
for (const id of [...reasoning.keys()]) flush(lines, reasoning, id, THINK_PREFIX, CONT, " …");
|
|
187
|
+
for (const id of [...toolName.keys()]) {
|
|
188
|
+
emit(lines, TOOL_PREFIX, CONT, `${toolName.get(id) ?? "?"}(${toolArgs.get(id) ?? ""}) …`);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return lines;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
window.COTAL_PART_RENDERERS[KIND] = function renderAguiFrame(p) {
|
|
195
|
+
// Defensive rather than trusting, mirroring `agui-render.ts`: the dispatcher resolved us BY
|
|
196
|
+
// KIND, so this cannot fire through `parts.js` today, but a renderer is a plain function on a
|
|
197
|
+
// global map and anything can call it. Without this, a non-frame part is told it is a frame
|
|
198
|
+
// "carrying no events", which is a false statement about the part rather than a refusal to draw
|
|
199
|
+
// it. Found by the parity suite, not by reading: node refused and the browser did not.
|
|
200
|
+
if (typeof p !== "object" || p === null || p.kind !== KIND) return "[not an AG-UI frame]";
|
|
201
|
+
const events = p.events;
|
|
202
|
+
if (!Array.isArray(events) || events.length === 0) return "[AG-UI frame carrying no events]";
|
|
203
|
+
const lines = renderEvents(events);
|
|
204
|
+
// Impossible today (every branch pushes), but a future branch returning nothing must not become
|
|
205
|
+
// the silent empty string this whole exercise exists to remove.
|
|
206
|
+
return lines.length > 0
|
|
207
|
+
? lines.join("\n")
|
|
208
|
+
: `[AG-UI frame with ${events.length} event(s) and nothing to show]`;
|
|
209
|
+
};
|
|
210
|
+
})();
|
package/dist/web/app.js
CHANGED
|
@@ -30,8 +30,9 @@ let expandAll = false; // channel-wide: expand every clamped message body (else
|
|
|
30
30
|
const esc = (s) =>
|
|
31
31
|
String(s).replace(/[&<>]/g, (ch) => ({ "&": "&", "<": "<", ">": ">" })[ch]);
|
|
32
32
|
const time = (ts) => new Date(ts).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
// Shared with graph.js via parts.js (loaded before this file). It names a part kind it cannot
|
|
34
|
+
// draw instead of rendering it as the empty string, which read as "nothing arrived".
|
|
35
|
+
const bodyText = (msg) => window.COTAL_PARTS.partsToText(msg.parts);
|
|
35
36
|
function ago(ts) {
|
|
36
37
|
const s = Math.max(0, (Date.now() - ts) / 1000);
|
|
37
38
|
if (s < 45) return "just now";
|
|
@@ -807,12 +808,33 @@ async function refresh() {
|
|
|
807
808
|
select(selected);
|
|
808
809
|
} else {
|
|
809
810
|
activity = await (await fetch("/api/activity?limit=200")).json();
|
|
811
|
+
// Same trust rule as the live feed: the backfill is tagged with the channel the SERVER
|
|
812
|
+
// requested, so the payload claim is overwritten at ingress rather than downstream.
|
|
813
|
+
for (const e of activity) if (e?.msg) e.msg.channel = e.channel;
|
|
810
814
|
renderCenter();
|
|
811
815
|
}
|
|
812
816
|
}
|
|
813
817
|
|
|
814
818
|
function onMessage(entry) {
|
|
815
819
|
const { mode, msg } = entry;
|
|
820
|
+
// TRUST IS DECIDED ONCE, HERE. The server sends the channel it took from the SUBJECT (a publish
|
|
821
|
+
// grant is per-channel, so that token is covered by the minted grant); `msg.channel` is the
|
|
822
|
+
// publisher's own claim and is backed by nothing. Overwrite the claim at this boundary so no
|
|
823
|
+
// downstream reader — the channel list, the counts, the unread badges, the transcript — has to
|
|
824
|
+
// know which of the two it is holding.
|
|
825
|
+
//
|
|
826
|
+
// THE ASSIGNMENT IS UNCONDITIONAL, AND THAT IS THE WHOLE FIX. This first read
|
|
827
|
+
// `if (entry.channel) msg.channel = entry.channel;`, which FAILS OPEN: on `inst` and `svc` there
|
|
828
|
+
// is no authoritative channel, so the guard was false and the publisher's claim SURVIVED. `tap()`
|
|
829
|
+
// only JSON-decodes, so a DM or anycast payload can carry any `channel` string it likes — and
|
|
830
|
+
// `msg.channel` is consumed below with NO MODE GATE, which filed that message into the named
|
|
831
|
+
// channel's transcript and incremented its count. A sender could appear to post into a channel it
|
|
832
|
+
// holds no publish grant for. Assigning unconditionally leaves a non-chat message with
|
|
833
|
+
// `undefined`, which is the truth: it has no channel.
|
|
834
|
+
//
|
|
835
|
+
// A conditional trust rule is not a trust rule. "Overwrite when I have something better" leaves
|
|
836
|
+
// the untrusted value in place exactly when the trusted one is missing.
|
|
837
|
+
msg.channel = entry.channel;
|
|
816
838
|
if (!activity.some((e) => e.msg.id === msg.id)) {
|
|
817
839
|
activity.push(entry);
|
|
818
840
|
if (activity.length > 500) activity.shift();
|
package/dist/web/graph.html
CHANGED
|
@@ -214,6 +214,8 @@
|
|
|
214
214
|
<div class="hint" id="hint">click a node for detail · scroll to zoom · drag to pan</div>
|
|
215
215
|
|
|
216
216
|
<script src="/harness.js"></script>
|
|
217
|
+
<script src="/parts.js"></script>
|
|
218
|
+
<script src="/agui-frame.js"></script>
|
|
217
219
|
<script src="/graph.js"></script>
|
|
218
220
|
</body>
|
|
219
221
|
</html>
|
package/dist/web/graph.js
CHANGED
|
@@ -62,13 +62,18 @@
|
|
|
62
62
|
const particles = [];
|
|
63
63
|
const blooms = [];
|
|
64
64
|
const recent = [];
|
|
65
|
-
|
|
65
|
+
// `available` is "there is a feed and it said something"; `unreadable` is "the last attempt to read
|
|
66
|
+
// it failed". They are independent, and `unreadable` is declared here rather than sprung into
|
|
67
|
+
// existence on first failure so the shape of the state is readable in one place.
|
|
68
|
+
const feed = { asOf: undefined, available: false, unreadable: false }; // membership-feed freshness
|
|
66
69
|
const cam = { x: 0, y: 0, scale: 1, ready: false, user: false };
|
|
67
70
|
const filter = { chat: true, unicast: true, anycast: true, window: 30, paused: false, hideOffline: true, hideEmpty: true };
|
|
68
71
|
let W = 0, H = 0, DPR = 1, hover = null, sel = null, lastT = 0, alpha = 1;
|
|
69
72
|
|
|
70
73
|
// ── utils ──
|
|
71
|
-
|
|
74
|
+
// Shared with app.js via parts.js (loaded before this file). It names a part kind it cannot
|
|
75
|
+
// draw instead of rendering it as the empty string, which read as "nothing arrived".
|
|
76
|
+
const partsText = (m) => window.COTAL_PARTS.partsToText(m.parts);
|
|
72
77
|
const ease = (t) => (t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2);
|
|
73
78
|
const esc = (s) => String(s ?? "").replace(/[&<>"]/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """ }[c]));
|
|
74
79
|
const shortId = (x) => (/^[A-Z2-7]{32,}$/.test(x) ? x.slice(0, 6) + "…" : x);
|
|
@@ -195,8 +200,12 @@
|
|
|
195
200
|
function heatFanOut(channel, from) {
|
|
196
201
|
for (const e of edges.values()) if (e.chan === channel && e.a !== from) e.heat = 1;
|
|
197
202
|
}
|
|
198
|
-
function onMessage({ mode, senderId, msg }) {
|
|
203
|
+
function onMessage({ mode, senderId, channel, msg }) {
|
|
199
204
|
if (!msg) return;
|
|
205
|
+
// Trust decided once (see app.js): the subject-derived channel replaces the payload claim,
|
|
206
|
+
// UNCONDITIONALLY. A guarded overwrite fails open on `inst`/`svc`, where there is no
|
|
207
|
+
// authoritative channel and the publisher's forged one would survive.
|
|
208
|
+
msg.channel = channel;
|
|
200
209
|
const from = ensureAgent(senderId ? { id: senderId, name: msg.from?.name, role: msg.from?.role } : msg.from);
|
|
201
210
|
if (from) { from.ts = now(); from.present = true; } // a live sender is a live presence (roster event may lag)
|
|
202
211
|
// Visual gate: pause chip, mode filter, AND tab visibility. State (heat/recent/roster) always applies.
|
|
@@ -256,8 +265,13 @@
|
|
|
256
265
|
}
|
|
257
266
|
|
|
258
267
|
// ── membership (authoritative spokes) ──
|
|
268
|
+
// The server said it could not read membership. Kept separate from `available` rather than folded
|
|
269
|
+
// into it: they are different facts and the pill has to say which one.
|
|
270
|
+
function membershipUnreadable() { feed.unreadable = true; setFeed(); }
|
|
271
|
+
|
|
259
272
|
function applyMembership(snap) {
|
|
260
273
|
if (!snap) return;
|
|
274
|
+
feed.unreadable = false; // a snapshot arrived, whatever it contains
|
|
261
275
|
feed.asOf = snap.asOf;
|
|
262
276
|
feed.available = snap.asOf !== undefined || (Array.isArray(snap.members) && snap.members.length > 0);
|
|
263
277
|
setFeed();
|
|
@@ -328,13 +342,24 @@
|
|
|
328
342
|
// default) collapses a HUB with no VISIBLE member under the current filters — it reads the cached `h.empty`
|
|
329
343
|
// (kept current by recomputeHubEmpty). So when `hide offline` is ON this
|
|
330
344
|
// means "no ONLINE member"; when it's OFF a channel that still shows offline members keeps its hub — the two
|
|
331
|
-
// toggles don't fight (review-critic R2). Gated on
|
|
332
|
-
// are no membership edges, so every hub would read empty — we can't tell a
|
|
333
|
-
// one, so we don't hide. Reading the cached flag keeps isHidden(hub)
|
|
345
|
+
// toggles don't fight (review-critic R2). Gated on the feed being AUTHORITATIVE: without the
|
|
346
|
+
// authoritative feed there are no membership edges, so every hub would read empty — we can't tell a
|
|
347
|
+
// quiet channel from an unknown one, so we don't hide. Reading the cached flag keeps isHidden(hub)
|
|
348
|
+
// O(1), not an all-edges scan per call.
|
|
334
349
|
// Hiding suppresses node/spoke rendering, hit-testing, camera framing, and physics participation; the node
|
|
335
350
|
// stays in the model, so toggling reveals it instantly.
|
|
351
|
+
//
|
|
352
|
+
// `feedAuthoritative()` rather than `feed.available` alone. Those came apart the moment the feed
|
|
353
|
+
// could report that it could not be READ: the last snapshot is still the last thing we KNEW, but it
|
|
354
|
+
// is no longer what IS, and `hide empty` asserts a hub has no member NOW. That is the gate's own
|
|
355
|
+
// stated reason applied to the case where we hold stale edges rather than none — otherwise the pill
|
|
356
|
+
// says "unreadable" while the page keeps acting on the reading it just disowned.
|
|
357
|
+
//
|
|
358
|
+
// The snapshot itself is deliberately NOT discarded: `asOf` and the spokes remain the honest record
|
|
359
|
+
// of the last successful read, which is true and worth showing. What stops is treating it as current.
|
|
360
|
+
const feedAuthoritative = () => feed.available && !feed.unreadable;
|
|
336
361
|
const isHidden = (n) => n.kind === "hub"
|
|
337
|
-
? filter.hideEmpty &&
|
|
362
|
+
? filter.hideEmpty && feedAuthoritative() && n.empty
|
|
338
363
|
: filter.hideOffline && isOffline(n);
|
|
339
364
|
// Per-CHANNEL visibility of a membership spoke: hidden when `hide offline` is on AND this edge is offline
|
|
340
365
|
// for its channel (durable-only, or the agent is offline) — so "hide offline" holds per channel, not just
|
|
@@ -522,7 +547,12 @@
|
|
|
522
547
|
const el = $("feed"); if (!el) return;
|
|
523
548
|
el.hidden = false;
|
|
524
549
|
let cls, text;
|
|
525
|
-
|
|
550
|
+
// UNREADABLE IS ITS OWN STATE, and it must be checked before `available`. "traffic-only" is a
|
|
551
|
+
// CLAIM ABOUT THE MESH — that no membership feed is being published — and it was being shown for
|
|
552
|
+
// a failed read, which is a claim about US. The operator's own viewer reported traffic-only
|
|
553
|
+
// against a mesh that had a feed, and nothing on the page could have revealed the difference.
|
|
554
|
+
if (feed.unreadable) { cls = "off"; text = "membership: unreadable"; }
|
|
555
|
+
else if (!feed.available) { cls = "off"; text = "membership: traffic-only"; }
|
|
526
556
|
else { const age = feed.asOf ? now() - feed.asOf : Infinity; if (age < FEED_STALE_MS) { cls = ""; text = "membership: live"; } else { cls = "stale"; text = "membership: stale"; } }
|
|
527
557
|
el.className = "pill" + (cls ? " " + cls : "");
|
|
528
558
|
el.querySelector(".t").textContent = text;
|
|
@@ -657,14 +687,24 @@
|
|
|
657
687
|
async function load() {
|
|
658
688
|
const [meta, roster, chans, membership, activity, dmHist] = await Promise.all([
|
|
659
689
|
fetch("/api/meta").then((r) => r.json()), fetch("/api/roster").then((r) => r.json()), fetch("/api/channels").then((r) => r.json()),
|
|
660
|
-
|
|
690
|
+
// `.catch(() => ({members: []}))` here turned a failed fetch into an empty snapshot, which the
|
|
691
|
+
// pill then reported as "traffic-only" — the client half of the same defect the server had.
|
|
692
|
+
// A non-200 is not a snapshot either: `r.json()` on the refusal body would parse fine and
|
|
693
|
+
// arrive as data, so the status is checked before the body is trusted.
|
|
694
|
+
fetch("/api/membership")
|
|
695
|
+
.then((r) => (r.ok ? r.json() : { unreadable: true }))
|
|
696
|
+
.catch(() => ({ unreadable: true })),
|
|
661
697
|
fetch("/api/activity?limit=400").then((r) => r.json()).catch(() => []), fetch("/api/dms?limit=400").then((r) => r.json()).catch(() => []),
|
|
662
698
|
]);
|
|
663
699
|
$("space").textContent = "· " + meta.space;
|
|
664
700
|
for (const c of chans) { const h = ensureHub(c.channel); h.msgs = c.messages || 0; h.desc = c.description || ""; h.deliveryClass = c.deliveryClass; h.replay = c.replay; h.replayWindow = c.replayWindow; }
|
|
665
701
|
updateRoster(roster);
|
|
666
|
-
|
|
667
|
-
|
|
702
|
+
// authoritative spokes BEFORE traffic seeding (no skeleton flicker) — unless the read refused,
|
|
703
|
+
// in which case there are no spokes to draw and the pill has to say so rather than imply a mesh
|
|
704
|
+
// with no feed.
|
|
705
|
+
if (membership && membership.unreadable) membershipUnreadable();
|
|
706
|
+
else applyMembership(membership);
|
|
707
|
+
for (const e of activity) { const m = e.msg; if (m) m.channel = e.channel; const a = m?.from?.id && agents.get(m.from.id); if (e.mode === "chat" && m?.channel && a) chatHit(a, m.channel, m.ts || now()); }
|
|
668
708
|
for (const m of dmHist) { const a = m.from?.id && agents.get(m.from.id), b = typeof m.to === "string" && agents.get(m.to); if (a && b && a !== b) dmHit(a, b, m.ts || now()); }
|
|
669
709
|
// Seed the `recent` buffer from the activity backfill so the channel detail's "recently active" tags +
|
|
670
710
|
// the "recent" section aren't empty until the first live SSE message arrives (norman).
|
|
@@ -678,7 +718,7 @@
|
|
|
678
718
|
alpha = 1; for (let i = 0; i < 200; i++) physics(); // pre-warm to a settled layout
|
|
679
719
|
const f = fitTarget(); cam.x = f.x; cam.y = f.y; cam.scale = f.scale;
|
|
680
720
|
}
|
|
681
|
-
function connect() { const es = new EventSource("/feed"); es.onopen = () => setConn(true); es.onerror = () => setConn(false); es.addEventListener("roster", (e) => updateRoster(JSON.parse(e.data))); es.addEventListener("membership", (e) => applyMembership(JSON.parse(e.data))); es.addEventListener("message", (e) => onMessage(JSON.parse(e.data))); }
|
|
721
|
+
function connect() { const es = new EventSource("/feed"); es.onopen = () => setConn(true); es.onerror = () => setConn(false); es.addEventListener("roster", (e) => updateRoster(JSON.parse(e.data))); es.addEventListener("membership", (e) => applyMembership(JSON.parse(e.data))); es.addEventListener("membership-read-failed", () => membershipUnreadable()); es.addEventListener("message", (e) => onMessage(JSON.parse(e.data))); }
|
|
682
722
|
|
|
683
723
|
resize();
|
|
684
724
|
setInterval(setFeed, 5000); // age "live" → "stale" even without new events
|
package/dist/web/index.html
CHANGED
|
@@ -495,6 +495,8 @@
|
|
|
495
495
|
<script src="/vendor/marked.umd.js"></script>
|
|
496
496
|
<script src="/vendor/purify.min.js"></script>
|
|
497
497
|
<script src="/harness.js"></script>
|
|
498
|
+
<script src="/parts.js"></script>
|
|
499
|
+
<script src="/agui-frame.js"></script>
|
|
498
500
|
<script src="/md.js"></script>
|
|
499
501
|
<script src="/app.js"></script>
|
|
500
502
|
</body>
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// Rendering message parts as the flat text the dashboard displays.
|
|
2
|
+
//
|
|
3
|
+
// WHY THIS FILE EXISTS. `app.js` and `graph.js` each carried their own copy of
|
|
4
|
+
// (msg.parts || []).map((p) => (p.kind === "text" ? p.text : JSON.stringify(p.data))).join(" ")
|
|
5
|
+
// and that expression DELETES any part it cannot draw. `JSON.stringify(undefined)` returns the
|
|
6
|
+
// VALUE `undefined` — not the string "undefined" — and `Array.prototype.join` coerces that to the
|
|
7
|
+
// empty string. So a part with no `data` field — `ag-ui.frame` among them, but NOT every extension
|
|
8
|
+
// kind, since a data-bearing one rendered its JSON perfectly well — vanished: a stray separator
|
|
9
|
+
// between its neighbours, or an empty string when it was the only part. In every case the KIND went
|
|
10
|
+
// unnamed, so a reader could not tell which renderer was missing. Those two are what this file
|
|
11
|
+
// fixes, and they are the claims to hold it to.
|
|
12
|
+
//
|
|
13
|
+
// THE CONSEQUENCE DIFFERS BY SURFACE, AND AN EARLIER VERSION OF THIS COMMENT GOT IT WRONG. It said
|
|
14
|
+
// both surfaces told the operator that nothing arrived. That is true of ONE of them:
|
|
15
|
+
// - `app.js` renders the body through `bodyBlock`, i.e. `MD.render(text || "")`, so an empty
|
|
16
|
+
// rendering really does produce a blank body — absence reported as calm.
|
|
17
|
+
// - `graph.js`'s detail row renders `esc(m.text).slice(0, 160) || "—"`, so an empty rendering
|
|
18
|
+
// became a VISIBLE DASH inside a row still carrying mode, sender and channel/target. The graph
|
|
19
|
+
// showed a message with an unreadable body. It never claimed nothing arrived.
|
|
20
|
+
// Overstating a defect is the same class of error as understating one: it describes a property
|
|
21
|
+
// nothing recomputes, and it makes the fix look like it closes more than it does.
|
|
22
|
+
//
|
|
23
|
+
// A literal "undefined" in a message body would have been reported the day it shipped; a blank one
|
|
24
|
+
// is not, which is part of why this survived. But note the graph placeholder cuts the other way —
|
|
25
|
+
// it was the more visible of the two and still went unfixed, so visibility alone was not enough.
|
|
26
|
+
//
|
|
27
|
+
// ONE renderer for both pages, not two copies, for the reason core's own `partsToText` gives: the
|
|
28
|
+
// duplicated form broke identically everywhere when a new part kind appeared, because each copy had
|
|
29
|
+
// to be found and fixed separately.
|
|
30
|
+
//
|
|
31
|
+
// AND ON THIS SURFACE NOTHING ELSE WOULD HAVE CAUGHT IT. `implementations/web/tsconfig.json` sets
|
|
32
|
+
// `"exclude": ["src/web"]`, so every file in this directory is plain JS that `tsc` never reads. The
|
|
33
|
+
// two copies of the broken expression were the same mistake, in the same words, in two files, and
|
|
34
|
+
// **no compiler in this repo could see either one**. That is not an argument about style; it is why
|
|
35
|
+
// the checks on this directory have to be executable cells that run the shipped file, because they
|
|
36
|
+
// are the only enforcement this surface has. `index.html` and `graph.html` both load this file BEFORE their
|
|
37
|
+
// page script, and `web.ts` serves it from the PAGE allow-list — a file missing from that map is a
|
|
38
|
+
// 404 no matter what the HTML says.
|
|
39
|
+
//
|
|
40
|
+
// IT WAS AHEAD OF CORE, AND CORE HAS SINCE CAUGHT UP. This mirrors the contract of core's
|
|
41
|
+
// `partsToText`. When this file was written, core's copy still had the vanishing
|
|
42
|
+
// `JSON.stringify(p.data)` fallback and printed no marker, so the browser ran ahead on purpose;
|
|
43
|
+
// core now carries the marker and a per-kind renderer seam of its own. The two remain SEPARATE
|
|
44
|
+
// implementations because this surface cannot import core at all, and they are held together by
|
|
45
|
+
// `bin/smoke/agui-render-parity.smoke.ts` rather than by anyone's intention. One difference is
|
|
46
|
+
// deliberate and survives: an extension kind carrying `data` renders its JSON here (see below) and
|
|
47
|
+
// goes straight to the marker in core.
|
|
48
|
+
//
|
|
49
|
+
// SCOPE: this makes an undrawable part SAY SO, preserves everything that was already visible, and
|
|
50
|
+
// CONSULTS a per-kind renderer registry so a surface can be taught to draw a kind without this file
|
|
51
|
+
// learning what the kind is. It does not itself know how to render an AG-UI frame; `agui-frame.js`
|
|
52
|
+
// does, and it registers. An earlier version of this line read "and nothing wider", which was FALSE
|
|
53
|
+
// while the extension branch discarded data: the scope sentence was wider than the code in one
|
|
54
|
+
// direction and narrower in the other. It then read "does not teach either page to RENDER an AG-UI
|
|
55
|
+
// frame", which went false in the other direction the moment the lookup landed, because the page
|
|
56
|
+
// can now draw one via a file this one has never heard of. A scope sentence is only worth having if
|
|
57
|
+
// it is re-read every time the code under it moves.
|
|
58
|
+
//
|
|
59
|
+
// Neither page republishes this text — `graph.js` only issues GETs and `app.js`'s single POST is
|
|
60
|
+
// `/api/channel/delete`, which carries a channel name — so the marker is safe to place in the body
|
|
61
|
+
// itself. If either page ever gains a republish path, the marker must move beside the text rather
|
|
62
|
+
// than inside it, or it will be replayed to the mesh as though an agent had typed it.
|
|
63
|
+
window.COTAL_PARTS = (() => {
|
|
64
|
+
function partText(p) {
|
|
65
|
+
if (p.kind === "text") return p.text;
|
|
66
|
+
// The digest is verbose and not optional: it is the only handle a reader can act on to fetch
|
|
67
|
+
// the bytes. Name and size come from the publisher, so they are shown as its claims.
|
|
68
|
+
if (p.kind === "artifact") return `[artifact ${p.name} (${p.mediaType}, ${p.size} bytes) ${p.digest}]`;
|
|
69
|
+
if (p.kind === "data") {
|
|
70
|
+
const encoded = JSON.stringify(p.data);
|
|
71
|
+
// A `data` part carrying no data hits the same vanishing act as an unknown kind, so it needs
|
|
72
|
+
// its own marker. Named separately from the kind marker below because "a data part with
|
|
73
|
+
// nothing in it" and "a kind this build cannot draw" are different facts, and a reader who
|
|
74
|
+
// sees one must not conclude the other.
|
|
75
|
+
return encoded === undefined ? "[empty data part]" : encoded;
|
|
76
|
+
}
|
|
77
|
+
// An extension kind. A surface may have been TAUGHT to draw one, by registering a function
|
|
78
|
+
// under its kind in `window.COTAL_PART_RENDERERS` (see `agui-frame.js`). Consulted here, first,
|
|
79
|
+
// because a renderer that exists is strictly more specific than either fallback below.
|
|
80
|
+
//
|
|
81
|
+
// READ AT CALL TIME, not when this closure was built, so registration may happen in any script
|
|
82
|
+
// order. That is the whole reason this is a lookup and not an import: this file stays ignorant
|
|
83
|
+
// of every kind anyone teaches it, which is what keeps the dispatcher a dispatcher.
|
|
84
|
+
//
|
|
85
|
+
// A THROWING RENDERER MUST NOT TAKE THE PAGE DOWN, and must not silently become a blank body
|
|
86
|
+
// either, which is precisely the failure this file exists to remove; re-introducing it through
|
|
87
|
+
// the extension seam would be the same bug with a new door. It degrades to a NAMED marker
|
|
88
|
+
// carrying the error, and the data fallback below is not reached: a renderer that registered
|
|
89
|
+
// and then failed is a different fact from no renderer at all, and a reader who saw raw JSON
|
|
90
|
+
// would conclude the second.
|
|
91
|
+
// OWN PROPERTIES ONLY. `p.kind` comes off the wire, and a plain object inherits `toString`,
|
|
92
|
+
// `valueOf` and `constructor` from `Object.prototype` — every one of them a function. A bare
|
|
93
|
+
// `renderers[p.kind]` therefore RESOLVES for a part whose kind is `"toString"`, passes the
|
|
94
|
+
// `typeof === "function"` test, and gets called unbound: the body renders `[object Window]`,
|
|
95
|
+
// which names no kind and reports no failure. Core's dispatcher is keyed by a `Map` and never
|
|
96
|
+
// had this door; a plain object on `window` does, so it is closed explicitly here.
|
|
97
|
+
const renderers = window.COTAL_PART_RENDERERS;
|
|
98
|
+
const render =
|
|
99
|
+
renderers && Object.prototype.hasOwnProperty.call(renderers, p.kind) ? renderers[p.kind] : undefined;
|
|
100
|
+
if (typeof render === "function") {
|
|
101
|
+
let out;
|
|
102
|
+
try {
|
|
103
|
+
out = render(p);
|
|
104
|
+
} catch (err) {
|
|
105
|
+
return `[renderer for part kind ${JSON.stringify(p.kind)} failed: ${err && err.message ? err.message : String(err)}]`;
|
|
106
|
+
}
|
|
107
|
+
// A renderer returning a non-string would put `undefined` or `[object Object]` into the body
|
|
108
|
+
// through the same coercion described at the top of this file. Its contract is a string.
|
|
109
|
+
if (typeof out === "string") return out;
|
|
110
|
+
return `[renderer for part kind ${JSON.stringify(p.kind)} returned ${typeof out}, expected a string]`;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// No renderer for this kind. Not drawable here, and not silently droppable either.
|
|
114
|
+
//
|
|
115
|
+
// BUT DATA-BEARING EXTENSIONS MUST KEEP THEIR DATA. The first version of this file sent every
|
|
116
|
+
// non-core kind straight to the marker, which THREW AWAY content the old expression had been
|
|
117
|
+
// showing: `{kind:"com.acme.snapshot", data:{x:1}}` rendered `{"x":1}` before and the marker
|
|
118
|
+
// after. That is a regression wearing a fix's clothes — it removes information while claiming
|
|
119
|
+
// to add it, and it made this file's own "scope is nothing wider" claim false.
|
|
120
|
+
//
|
|
121
|
+
// THIS IS THE DELIBERATE DIFFERENCE FROM CORE ANNOUNCED AT THE TOP OF THIS FILE, NOT AGREEMENT
|
|
122
|
+
// WITH IT. Core's `partsToText` renders a data-bearing extension kind as the marker alone and
|
|
123
|
+
// keeps nothing (driven, not read: a part `{kind:"com.acme.snapshot", data:{x:1}}` through core
|
|
124
|
+
// returns only the unrenderable marker). The difference is justified by the SURFACE, not by
|
|
125
|
+
// core: this file replaces an expression that was already showing that JSON, and core's
|
|
126
|
+
// equivalent never did, so keeping it is a regression here and would be an addition there.
|
|
127
|
+
//
|
|
128
|
+
// So: name the kind AND keep the data. That is strictly more than either did alone — the old
|
|
129
|
+
// expression showed the data but never said what it was, and the marker alone said what it was
|
|
130
|
+
// while discarding it.
|
|
131
|
+
const encoded = JSON.stringify(p.data);
|
|
132
|
+
if (encoded !== undefined) return `[${p.kind}] ${encoded}`;
|
|
133
|
+
// No data to keep. This is the case the file exists for: name the kind, so a reader knows which
|
|
134
|
+
// renderer is missing instead of seeing a message that looks like it was sent blank.
|
|
135
|
+
return `[unrenderable part kind ${JSON.stringify(p.kind)} — no renderer for it on this surface]`;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** A message's parts as one flat string, space-joined. */
|
|
139
|
+
function partsToText(parts) {
|
|
140
|
+
return (parts || []).map(partText).join(" ");
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return { partsToText };
|
|
144
|
+
})();
|
package/dist/web.d.ts
CHANGED
|
@@ -8,6 +8,16 @@ import { type LocalProcess } from "@cotal-ai/workspace";
|
|
|
8
8
|
export declare const WEB_PORT = 7799;
|
|
9
9
|
export declare const WEB_URL = "http://cotal.localhost:7799/";
|
|
10
10
|
export declare const webProcess: LocalProcess;
|
|
11
|
+
/** The one condition name for "the membership read did not answer", shared by the HTTP body and the
|
|
12
|
+
* SSE event so a browser matches ONE token and a test asserts the same token the server emits.
|
|
13
|
+
* Exported for the same reason `PAGE` is: a test that restates it only agrees with itself. */
|
|
14
|
+
export declare const MEMBERSHIP_READ_FAILED = "membership-read-failed";
|
|
15
|
+
/** Exported so a test can resolve what the browser is actually served, rather than restating the
|
|
16
|
+
* route table in its own source and agreeing with itself. */
|
|
17
|
+
export declare const PAGE: Record<string, {
|
|
18
|
+
path: string;
|
|
19
|
+
type: string;
|
|
20
|
+
}>;
|
|
11
21
|
/** A live observability dashboard for a space, served over HTTP + SSE. A read-only
|
|
12
22
|
* observer endpoint (invisible to peers) feeds the page presence, channel history,
|
|
13
23
|
* and a live message stream — no manager required. Bound to loopback. */
|
package/dist/web.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAK9D,OAAO,EAQL,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAML,KAAK,YAAY,EAElB,MAAM,qBAAqB,CAAC;AAI7B;;;+DAG+D;AAC/D,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,OAAO,iCAAwC,CAAC;AAI7D,eAAO,MAAM,UAAU,EAAE,YASxB,CAAC;
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAK9D,OAAO,EAQL,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAML,KAAK,YAAY,EAElB,MAAM,qBAAqB,CAAC;AAI7B;;;+DAG+D;AAC/D,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,OAAO,iCAAwC,CAAC;AAI7D,eAAO,MAAM,UAAU,EAAE,YASxB,CAAC;AAoDF;;+FAE+F;AAC/F,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAE/D;8DAC8D;AAC9D,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAgB/D,CAAC;AAEF;;0EAE0E;AAC1E,wBAAsB,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA0UzD;AAgDD,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAa5F;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACvE,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY9F;AAgBD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAYpE"}
|
package/dist/web.js
CHANGED
|
@@ -81,9 +81,22 @@ function releasePid(path) {
|
|
|
81
81
|
// OWN files, so a published/seeded copy is self-contained and never reaches into node_modules at
|
|
82
82
|
// runtime — which is what lets web ship as a bundled first-party extension, seeded like the connectors.
|
|
83
83
|
const jsType = "text/javascript; charset=utf-8";
|
|
84
|
-
|
|
84
|
+
/** The one condition name for "the membership read did not answer", shared by the HTTP body and the
|
|
85
|
+
* SSE event so a browser matches ONE token and a test asserts the same token the server emits.
|
|
86
|
+
* Exported for the same reason `PAGE` is: a test that restates it only agrees with itself. */
|
|
87
|
+
export const MEMBERSHIP_READ_FAILED = "membership-read-failed";
|
|
88
|
+
/** Exported so a test can resolve what the browser is actually served, rather than restating the
|
|
89
|
+
* route table in its own source and agreeing with itself. */
|
|
90
|
+
export const PAGE = {
|
|
85
91
|
"/": { path: join(here, "web/index.html"), type: "text/html; charset=utf-8" },
|
|
86
92
|
"/harness.js": { path: join(here, "web/harness.js"), type: jsType },
|
|
93
|
+
// Shared message-part renderer for both pages. This map is an allow-list, so a page script that
|
|
94
|
+
// depends on this file is broken until it has a row here, whatever the HTML requests.
|
|
95
|
+
"/parts.js": { path: join(here, "web/parts.js"), type: jsType },
|
|
96
|
+
// Registers an `ag-ui.frame` renderer into the map `parts.js` consults. Served to both pages: a
|
|
97
|
+
// frame is as likely to arrive on the graph's detail row as in the console body, and a kind that
|
|
98
|
+
// draws on one page and shows a marker on the other is worse than one that shows a marker on both.
|
|
99
|
+
"/agui-frame.js": { path: join(here, "web/agui-frame.js"), type: jsType },
|
|
87
100
|
"/md.js": { path: join(here, "web/md.js"), type: jsType },
|
|
88
101
|
"/app.js": { path: join(here, "web/app.js"), type: jsType },
|
|
89
102
|
"/graph": { path: join(here, "web/graph.html"), type: "text/html; charset=utf-8" },
|
|
@@ -100,9 +113,15 @@ export async function web(args) {
|
|
|
100
113
|
// seed. The dashboard is a loopback HTTP process; holding the space signing seed (`auth` — it can
|
|
101
114
|
// mint ANY identity/role) for the whole session would make a dashboard compromise = full account
|
|
102
115
|
// control. Instead pre-mint ONE scoped `channel-purger` cred for the only write path (channel delete
|
|
103
|
-
// = filtered CHAT purge + a channel-registry key delete)
|
|
104
|
-
//
|
|
105
|
-
// creds carry the purge rights.
|
|
116
|
+
// = filtered CHAT purge + a channel-registry key delete), then EXPLICITLY narrow the `Connection`
|
|
117
|
+
// the request handlers close over so it no longer carries `auth` (see the drop below, just after
|
|
118
|
+
// the mint). `--creds` / open mode have no seed → the connection creds carry the purge rights.
|
|
119
|
+
//
|
|
120
|
+
// This paragraph used to say the seed "falls out of scope here". IT DID NOT: `conn` stayed in
|
|
121
|
+
// scope for the whole function and the delete path referenced it inside the handler, so the seed
|
|
122
|
+
// was reachable from the request handlers for as long as this comment claimed it was not. The
|
|
123
|
+
// mitigation is now performed rather than described — the correction is stated instead of quietly
|
|
124
|
+
// overwritten, because a comment that was wrong once is worth flagging to whoever reads it next.
|
|
106
125
|
//
|
|
107
126
|
// USER MODE: the god view rides an exchange-gated "admin" VIEW bearer (ledger scope "admin",
|
|
108
127
|
// fresh-checked at every mint and every connect) — standing via a bearer SOURCE so the tap
|
|
@@ -129,6 +148,25 @@ export async function web(args) {
|
|
|
129
148
|
process.once("exit", () => releasePid(pidPath));
|
|
130
149
|
}
|
|
131
150
|
const purgeCreds = !user && conn.auth ? await mintCreds(conn.auth, newIdentity(), "channel-purger") : conn.creds;
|
|
151
|
+
// THE SEED IS DROPPED HERE, AND THIS IS THE LINE THAT MAKES THE CLAIM ABOVE TRUE.
|
|
152
|
+
//
|
|
153
|
+
// The header above has always said the account seed "isn't reachable from the request handlers".
|
|
154
|
+
// It was NOT true: `conn` is bound at the top of `web()` and was referenced INSIDE
|
|
155
|
+
// `handleRequest` (the `userViewAuth(conn, …)` call on the delete path), so the handler closed
|
|
156
|
+
// over the whole `Connection` — including `conn.auth`, the `SpaceAuth` carrying the broker
|
|
157
|
+
// operator seed and the account seed/signingSeed that can mint ANY identity or role. The
|
|
158
|
+
// mitigation was described in a comment and never implemented; that gap is what D3 recorded.
|
|
159
|
+
//
|
|
160
|
+
// The last use of `conn.auth` is the line above, so from this point the handler needs a
|
|
161
|
+
// Connection WITHOUT it. `userViewAuth` reads only `bearer`/`userAuth`/`root`/`space` and never
|
|
162
|
+
// touches `auth`, so nothing downstream loses anything. `auth` is optional on `Connection`, so
|
|
163
|
+
// the narrowed value is still a `Connection` and the compiler keeps it that way.
|
|
164
|
+
//
|
|
165
|
+
// HONEST LIMIT, so this is not read as more than it is: this is DEFENSE IN DEPTH, not a claim of
|
|
166
|
+
// unexploitability. An attacker with code execution in this process can reach the heap, where
|
|
167
|
+
// lexical scope means nothing. What it does buy is that the DOCUMENTED mitigation is now real,
|
|
168
|
+
// and that a future edit reaching for `conn` inside the handler has to notice this line first.
|
|
169
|
+
const { auth: _accountSeedIsNotForRequestHandlers, ...connForHandlers } = conn;
|
|
132
170
|
// Observer: never registers presence, never consumes an inbox — invisible to peers.
|
|
133
171
|
const ep = new CotalEndpoint({
|
|
134
172
|
space,
|
|
@@ -171,7 +209,11 @@ export async function web(args) {
|
|
|
171
209
|
// degrades to traffic-only. The admin cred carries the read grant; agents never do.
|
|
172
210
|
let membershipWatch;
|
|
173
211
|
const pushMembership = debounce(() => {
|
|
174
|
-
|
|
212
|
+
// A swallowed rejection here left the graph showing its LAST GOOD snapshot indefinitely, which
|
|
213
|
+
// is worse than the HTTP case: the display was not merely empty, it was stale and confident.
|
|
214
|
+
void ep.readMembership()
|
|
215
|
+
.then((m) => broadcast("membership", m))
|
|
216
|
+
.catch((e) => broadcast(MEMBERSHIP_READ_FAILED, { reason: e.message }));
|
|
175
217
|
}, 150);
|
|
176
218
|
try {
|
|
177
219
|
membershipWatch = await ep.watchMembership(pushMembership);
|
|
@@ -189,8 +231,18 @@ export async function web(args) {
|
|
|
189
231
|
return;
|
|
190
232
|
// senderId is the subject's sender token — the *verified* publisher (the server
|
|
191
233
|
// policed who could publish it), vs the advisory `from` in the payload.
|
|
192
|
-
const
|
|
193
|
-
|
|
234
|
+
const parsed = parseSubject(subject);
|
|
235
|
+
const senderId = parsed?.sender;
|
|
236
|
+
// The channel the broker actually POLICED, taken from the subject rather than the payload: a
|
|
237
|
+
// publish grant is per-channel (`chat.<owner>.<actor>.<ch>`), so this token is covered by the
|
|
238
|
+
// minted grant, while `msg.channel` is publisher-supplied and backed by nothing. The verified
|
|
239
|
+
// value was already parsed on the line above and was being dropped.
|
|
240
|
+
//
|
|
241
|
+
// Gated on kind, and the gate is load-bearing rather than defensive: `rest` is the channel only
|
|
242
|
+
// on the chat plane. On `inst` it is the RECIPIENT (`subjects.ts:599`) and on `svc` the route
|
|
243
|
+
// (`:603`), so forwarding it ungated would label a DM's recipient as a channel.
|
|
244
|
+
const channel = parsed?.kind === "chat" ? parsed.rest : undefined;
|
|
245
|
+
broadcast("message", { mode, senderId, channel, msg });
|
|
194
246
|
};
|
|
195
247
|
for (const plane of ["chat", "inst", "svc"])
|
|
196
248
|
ep.tap(onTap, { subject: `${spacePrefix(space)}.${plane}.>` });
|
|
@@ -207,8 +259,11 @@ export async function web(args) {
|
|
|
207
259
|
send(res, "roster", ep.getRoster());
|
|
208
260
|
// Seed this client's graph with the current membership snapshot (the live tap only carries
|
|
209
261
|
// post-connect traffic; membership is state, so a fresh client needs it explicitly).
|
|
210
|
-
void ep.readMembership()
|
|
211
|
-
|
|
262
|
+
void ep.readMembership()
|
|
263
|
+
.then((m) => { if (!res.writableEnded)
|
|
264
|
+
send(res, "membership", m); })
|
|
265
|
+
.catch((e) => { if (!res.writableEnded)
|
|
266
|
+
send(res, MEMBERSHIP_READ_FAILED, { reason: e.message }); });
|
|
212
267
|
req.on("close", () => clients.delete(res));
|
|
213
268
|
return;
|
|
214
269
|
}
|
|
@@ -218,12 +273,21 @@ export async function web(args) {
|
|
|
218
273
|
return json(res, ep.getRoster());
|
|
219
274
|
if (path === "/api/membership") {
|
|
220
275
|
// Authoritative who-is-subscribed (broker-sourced); {asOf, members:[{id,live,durable,observedAt}]}.
|
|
221
|
-
//
|
|
276
|
+
//
|
|
277
|
+
// A FAILED READ IS NOT AN EMPTY ONE, AND THIS USED TO RETURN THE SAME BYTES FOR BOTH. The catch
|
|
278
|
+
// answered `{asOf: undefined, members: []}` with a 200, which `JSON.stringify` serialises as
|
|
279
|
+
// `{"members":[]}` — byte-identical to a successful read of a space where nobody is subscribed,
|
|
280
|
+
// because a key whose value is `undefined` is DROPPED, so the one field that might have
|
|
281
|
+
// separated them never reached the wire. The browser then had no way to tell "nobody
|
|
282
|
+
// subscribed" from "I could not find out", and the graph asserted the first.
|
|
283
|
+
//
|
|
284
|
+
// The refusal now names its own condition and carries a non-200, so a caller that checks
|
|
285
|
+
// neither still cannot mistake it for data.
|
|
222
286
|
try {
|
|
223
287
|
return json(res, await ep.readMembership());
|
|
224
288
|
}
|
|
225
|
-
catch {
|
|
226
|
-
return json(res, {
|
|
289
|
+
catch (e) {
|
|
290
|
+
return json(res, { error: MEMBERSHIP_READ_FAILED, reason: e.message }, 503);
|
|
227
291
|
}
|
|
228
292
|
}
|
|
229
293
|
if (path === "/api/channels") {
|
|
@@ -258,9 +322,13 @@ export async function web(args) {
|
|
|
258
322
|
// Correctness first: fetch a full page per channel and merge.
|
|
259
323
|
const limit = query.get("limit") ? Number(query.get("limit")) : 200;
|
|
260
324
|
const chans = await ep.listChannels();
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
325
|
+
// Each message is tagged with the channel this server REQUESTED, so the backfill path does
|
|
326
|
+
// not depend on the payload claim either.
|
|
327
|
+
const chat = (await Promise.all(chans.map(async (ch) => (await ep.channelHistory(ch.channel, { limit })).map((msg) => ({
|
|
328
|
+
mode: "chat",
|
|
329
|
+
channel: ch.channel,
|
|
330
|
+
msg,
|
|
331
|
+
}))))).flat();
|
|
264
332
|
const dms = (await ep.dmHistory({ limit })).map((msg) => ({ mode: "unicast", msg }));
|
|
265
333
|
const all = [...chat, ...dms].sort((a, b) => a.msg.ts - b.msg.ts);
|
|
266
334
|
return json(res, all.slice(-limit));
|
|
@@ -291,7 +359,7 @@ export async function web(args) {
|
|
|
291
359
|
// User mode mints a one-shot channel-purger VIEW per delete — the ledger is re-checked at
|
|
292
360
|
// this click, and a mid-session revoke becomes this handler's 400, never a dead dashboard.
|
|
293
361
|
const result = user
|
|
294
|
-
? await userViewAuth(
|
|
362
|
+
? await userViewAuth(connForHandlers, "channel-purger").then((p) => clearChannel({ servers: server, space, channel, bearer: p.bearer, sentinelCreds: p.sentinelCreds }))
|
|
295
363
|
: await clearChannel({ servers: server, space, channel, creds: purgeCreds });
|
|
296
364
|
return json(res, { ok: true, ...result });
|
|
297
365
|
}
|
|
@@ -520,8 +588,8 @@ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
|
520
588
|
function webUrl(port) {
|
|
521
589
|
return port === WEB_PORT ? WEB_URL : `http://127.0.0.1:${port}/`;
|
|
522
590
|
}
|
|
523
|
-
function json(res, data) {
|
|
524
|
-
res.writeHead(
|
|
591
|
+
function json(res, data, status = 200) {
|
|
592
|
+
res.writeHead(status, { "content-type": "application/json" });
|
|
525
593
|
res.end(JSON.stringify(data));
|
|
526
594
|
}
|
|
527
595
|
/** Trailing-edge debounce — coalesces a burst of membership-feed deltas into one push. */
|
package/dist/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cotal-ai/web",
|
|
3
3
|
"description": "Cotal browser observability dashboard: adds the `web` command to the cotal CLI.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.19.0",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"dompurify": "^3.4.12",
|
|
26
26
|
"marked": "^18.0.6",
|
|
27
|
-
"@cotal-ai/core": "0.
|
|
28
|
-
"@cotal-ai/workspace": "0.
|
|
27
|
+
"@cotal-ai/core": "0.19.0",
|
|
28
|
+
"@cotal-ai/workspace": "0.19.0"
|
|
29
29
|
},
|
|
30
30
|
"files": [
|
|
31
31
|
"dist"
|