@zephyrdeng/pi-review 0.8.1 → 0.9.1

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.
Files changed (51) hide show
  1. package/README.md +4 -2
  2. package/README.zh-CN.md +4 -2
  3. package/dist/args.d.ts.map +1 -1
  4. package/dist/args.js +6 -2
  5. package/dist/args.js.map +1 -1
  6. package/dist/args.test.js +6 -0
  7. package/dist/args.test.js.map +1 -1
  8. package/dist/panel-cli-ui.test.js +1 -1
  9. package/dist/panel-cli-ui.test.js.map +1 -1
  10. package/dist/panel-ui.d.ts +7 -0
  11. package/dist/panel-ui.d.ts.map +1 -1
  12. package/dist/panel-ui.js +26 -1
  13. package/dist/panel-ui.js.map +1 -1
  14. package/dist/panel-ui.test.js +7 -0
  15. package/dist/panel-ui.test.js.map +1 -1
  16. package/dist/panel.d.ts.map +1 -1
  17. package/dist/panel.js +1 -0
  18. package/dist/panel.js.map +1 -1
  19. package/dist/types.d.ts +2 -0
  20. package/dist/types.d.ts.map +1 -1
  21. package/dist/types.js.map +1 -1
  22. package/dist/ui-client.d.ts +19 -0
  23. package/dist/ui-client.d.ts.map +1 -1
  24. package/dist/ui-client.js +450 -53
  25. package/dist/ui-client.js.map +1 -1
  26. package/dist/ui-client.test.js +40 -0
  27. package/dist/ui-client.test.js.map +1 -1
  28. package/dist/ui-html.d.ts.map +1 -1
  29. package/dist/ui-html.js +437 -30
  30. package/dist/ui-html.js.map +1 -1
  31. package/dist/ui-markdown.d.ts +49 -0
  32. package/dist/ui-markdown.d.ts.map +1 -0
  33. package/dist/ui-markdown.js +278 -0
  34. package/dist/ui-markdown.js.map +1 -0
  35. package/dist/ui-markdown.test.d.ts +2 -0
  36. package/dist/ui-markdown.test.d.ts.map +1 -0
  37. package/dist/ui-markdown.test.js +59 -0
  38. package/dist/ui-markdown.test.js.map +1 -0
  39. package/dist/ui-server-main.js +10 -1
  40. package/dist/ui-server-main.js.map +1 -1
  41. package/dist/ui-server-main.test.js +27 -0
  42. package/dist/ui-server-main.test.js.map +1 -1
  43. package/dist/ui-server.d.ts +2 -0
  44. package/dist/ui-server.d.ts.map +1 -1
  45. package/dist/ui-server.js +17 -3
  46. package/dist/ui-server.js.map +1 -1
  47. package/dist/ui-server.test.js +54 -0
  48. package/dist/ui-server.test.js.map +1 -1
  49. package/package.json +1 -1
  50. package/skills/pi-review/SKILL.md +1 -1
  51. package/skills/pi-review/references/codex-tools.md +2 -2
package/dist/ui-client.js CHANGED
@@ -1,8 +1,10 @@
1
1
  // Browser renderer for the loopback dashboard (issue #4). Loaded as a plain
2
2
  // ES module; resolves its sibling reducer and events endpoint relative to its
3
3
  // own script URL so the page needs no server-injected config. All dynamic
4
- // content is written through textContent, never innerHTML.
4
+ // content is written through textContent (markdown goes through the safe DOM
5
+ // writer in ui-markdown.ts), never innerHTML.
5
6
  import { createPanelViewState, reducePanelEvent } from "./panel-view.js";
7
+ import { renderInlineMarkdownInto, renderMarkdownInto } from "./ui-markdown.js";
6
8
  export function formatDuration(ms) {
7
9
  if (ms === undefined || ms < 0)
8
10
  return "–";
@@ -18,6 +20,19 @@ export function formatUsage(usage) {
18
20
  return "– tokens";
19
21
  return `${usage.totalTokens.toLocaleString("en-US")} tokens`;
20
22
  }
23
+ /** Compact token counter: 950 → "950", 12_345 → "12.3K", 1_234_567 → "1.23M". */
24
+ export function formatCompact(n) {
25
+ if (!Number.isFinite(n) || n < 0)
26
+ return "0";
27
+ if (n < 1000)
28
+ return String(Math.round(n));
29
+ if (n < 1_000_000) {
30
+ const k = n / 1000;
31
+ return `${k >= 100 ? Math.round(k) : k.toFixed(1)}K`;
32
+ }
33
+ const m = n / 1_000_000;
34
+ return `${m >= 100 ? Math.round(m) : m.toFixed(2)}M`;
35
+ }
21
36
  export function statusClass(status) {
22
37
  return `status status-${status}`;
23
38
  }
@@ -62,9 +77,67 @@ export function resultsSummary(meta) {
62
77
  return "";
63
78
  return `Result: ${meta.status} (${meta.panelHealth})`;
64
79
  }
80
+ export function createClientExtras() {
81
+ return { toolCalls: {}, fullText: {} };
82
+ }
83
+ export function reduceClientExtras(extras, event) {
84
+ if (event.type === "reviewer.tool.started") {
85
+ return {
86
+ ...extras,
87
+ toolCalls: { ...extras.toolCalls, [event.reviewerId]: (extras.toolCalls[event.reviewerId] ?? 0) + 1 },
88
+ };
89
+ }
90
+ if (event.type === "reviewer.text.delta") {
91
+ return {
92
+ ...extras,
93
+ fullText: { ...extras.fullText, [event.reviewerId]: (extras.fullText[event.reviewerId] ?? "") + event.text },
94
+ };
95
+ }
96
+ return extras;
97
+ }
98
+ export function totalToolCalls(extras) {
99
+ return Object.values(extras.toolCalls).reduce((sum, n) => sum + n, 0);
100
+ }
101
+ /** The big masthead word: run phase while working, gate status once completed. */
102
+ export function statusHeadline(state, connection) {
103
+ if (state.phase === "completed" && state.meta) {
104
+ switch (state.meta.status) {
105
+ case "clean":
106
+ return { text: "Clean", tone: "ok" };
107
+ case "has_findings":
108
+ return { text: "Has findings", tone: "danger" };
109
+ case "needs_human":
110
+ return { text: "Needs human", tone: "danger" };
111
+ default:
112
+ return { text: "Blocked", tone: "danger" };
113
+ }
114
+ }
115
+ if (state.phase === "aggregating")
116
+ return { text: "Aggregating", tone: "" };
117
+ if (state.phase === "running")
118
+ return { text: "Reviewing", tone: "" };
119
+ return { text: connection === "connecting" ? "Connecting" : "Waiting for run", tone: "" };
120
+ }
121
+ const CHIP_LABELS = {
122
+ queued: "queued",
123
+ running: "running",
124
+ completed: "done",
125
+ failed: "failed",
126
+ cancelled: "cancelled",
127
+ };
128
+ function severityChipClass(severity) {
129
+ const s = (severity ?? "").toLowerCase();
130
+ if (s === "critical" || s === "high")
131
+ return "chip chip-failed";
132
+ if (s === "medium")
133
+ return "chip chip-warn";
134
+ return "chip chip-neutral";
135
+ }
65
136
  // ---------------------------------------------------------------------------
66
137
  // DOM glue — only executed inside a real browser.
67
138
  // ---------------------------------------------------------------------------
139
+ const COUNTDOWN_SECONDS = 60;
140
+ const TWEEN_MS = 600;
68
141
  function el(tag, opts = {}) {
69
142
  const node = document.createElement(tag);
70
143
  if (opts.className)
@@ -73,72 +146,393 @@ function el(tag, opts = {}) {
73
146
  node.textContent = opts.text;
74
147
  return node;
75
148
  }
76
- function renderReviewerCard(reviewer, now) {
77
- const card = el("article", { className: "reviewer-card" });
78
- if (reviewer.status === "queued" || reviewer.status === "running") {
79
- card.classList.add("is-loading");
80
- }
81
- const heading = el("h2");
82
- const statusLabel = reviewer.status === "queued" ? "loading"
83
- : reviewer.status === "running" ? "running"
84
- : reviewer.status;
85
- heading.append(`${reviewer.role} `, el("span", { className: statusClass(reviewer.status), text: statusLabel }));
86
- card.append(heading, el("div", { className: "reviewer-detail", text: reviewerDetailLine(reviewer, now) }));
87
- if (reviewer.recentActivity.length > 0) {
88
- card.append(el("div", { className: "activity", text: reviewer.recentActivity.join("\n") }));
149
+ function prefersReducedMotion() {
150
+ return typeof matchMedia === "function" && matchMedia("(prefers-reduced-motion: reduce)").matches;
151
+ }
152
+ function easeOutExpo(t) {
153
+ return t >= 1 ? 1 : 1 - Math.pow(2, -10 * t);
154
+ }
155
+ /** Animated numeric text: rAF count-up toward the latest target, formatted per frame. */
156
+ class NumberTicker {
157
+ node;
158
+ fmt;
159
+ shown = 0;
160
+ target = 0;
161
+ from = 0;
162
+ startedAt = 0;
163
+ raf;
164
+ constructor(node, fmt) {
165
+ this.node = node;
166
+ this.fmt = fmt;
167
+ this.node.textContent = this.fmt(0);
89
168
  }
90
- else if (reviewer.status === "queued") {
91
- card.append(el("div", { className: "activity loading-line", text: "waiting to start…" }));
169
+ set(target) {
170
+ if (target === this.target)
171
+ return;
172
+ this.target = target;
173
+ if (prefersReducedMotion()) {
174
+ this.shown = target;
175
+ this.node.textContent = this.fmt(target);
176
+ return;
177
+ }
178
+ this.from = this.shown;
179
+ this.startedAt = performance.now();
180
+ if (this.raf === undefined)
181
+ this.raf = requestAnimationFrame(this.step);
92
182
  }
93
- else if (reviewer.status === "running") {
94
- card.append(el("div", { className: "activity loading-line", text: "working…" }));
183
+ step = (now) => {
184
+ const t = Math.min(1, (now - this.startedAt) / TWEEN_MS);
185
+ this.shown = this.from + (this.target - this.from) * easeOutExpo(t);
186
+ this.node.textContent = this.fmt(this.shown);
187
+ this.raf = t < 1 ? requestAnimationFrame(this.step) : undefined;
188
+ if (this.raf === undefined) {
189
+ this.shown = this.target;
190
+ this.node.textContent = this.fmt(this.target);
191
+ }
192
+ };
193
+ }
194
+ function buildStat(label) {
195
+ const wrap = el("div", { className: "stat" });
196
+ const value = el("div", { className: "stat-value", text: "–" });
197
+ wrap.append(value, el("div", { className: "stat-label", text: label }));
198
+ return { wrap, value };
199
+ }
200
+ function buildStatStrip(container) {
201
+ const reviewers = buildStat("Reviewers");
202
+ const elapsed = buildStat("Elapsed");
203
+ const tokens = buildStat("Tokens");
204
+ const tools = buildStat("Tool calls");
205
+ container.replaceChildren(reviewers.wrap, elapsed.wrap, tokens.wrap, tools.wrap);
206
+ return {
207
+ reviewers: reviewers.value,
208
+ elapsed: elapsed.value,
209
+ tokens: new NumberTicker(tokens.value, formatCompact),
210
+ tools: new NumberTicker(tools.value, (n) => String(Math.round(n))),
211
+ };
212
+ }
213
+ function buildCard(reviewer) {
214
+ const root = el("article", { className: "card" });
215
+ const head = el("div", { className: "card-head" });
216
+ const id = el("div", { className: "card-id" });
217
+ const role = el("h2", { className: "card-role", text: reviewer.role });
218
+ const model = el("div", { className: "card-model" });
219
+ id.append(role, model);
220
+ const chip = el("span", { className: "chip chip-queued" });
221
+ const chipDot = el("span", { className: "chip-dot" });
222
+ const chipLabel = document.createTextNode(CHIP_LABELS.queued);
223
+ chip.append(chipDot, chipLabel);
224
+ head.append(id, chip);
225
+ const stats = el("div", { className: "card-stats" });
226
+ const duration = el("span", { text: "–" });
227
+ const tokensNode = el("span");
228
+ const toolsNode = el("span");
229
+ const turn = el("span", { className: "dim" });
230
+ stats.append(duration, tokensNode, toolsNode, turn);
231
+ const tool = el("div", { className: "card-tool" });
232
+ const log = el("pre", { className: "card-log" });
233
+ const error = el("div", { className: "card-error" });
234
+ error.hidden = true;
235
+ const verdict = el("div", { className: "card-verdict" });
236
+ verdict.hidden = true;
237
+ root.append(head, stats, tool, log, error, verdict);
238
+ const tokensValue = el("span");
239
+ tokensNode.append(tokensValue, document.createTextNode(" tok"));
240
+ const toolsValue = el("span");
241
+ toolsNode.append(toolsValue, document.createTextNode(" tools"));
242
+ return {
243
+ root,
244
+ chip,
245
+ chipLabel,
246
+ role,
247
+ model,
248
+ duration,
249
+ tokens: new NumberTicker(tokensValue, formatCompact),
250
+ tools: new NumberTicker(toolsValue, (n) => String(Math.round(n))),
251
+ turn,
252
+ tool,
253
+ log,
254
+ error,
255
+ verdict,
256
+ };
257
+ }
258
+ function updateCard(refs, reviewer, toolCalls, now) {
259
+ refs.role.textContent = reviewer.role;
260
+ refs.model.textContent = [reviewer.model ?? "default model", reviewer.thinking]
261
+ .filter((part) => Boolean(part))
262
+ .join(" · ");
263
+ if (refs.lastStatus !== reviewer.status) {
264
+ refs.lastStatus = reviewer.status;
265
+ refs.chip.className = `chip chip-${reviewer.status}`;
266
+ refs.chipLabel.textContent = CHIP_LABELS[reviewer.status];
267
+ refs.root.classList.toggle("is-running", reviewer.status === "running");
268
+ refs.root.classList.toggle("is-done", reviewer.status === "completed");
95
269
  }
96
- if (reviewer.error) {
97
- card.append(el("div", { className: "activity", text: `error: ${reviewer.error}` }));
270
+ const durationMs = reviewer.startedAt !== undefined ? (reviewer.completedAt ?? now) - reviewer.startedAt : undefined;
271
+ refs.duration.textContent = durationMs !== undefined ? formatDuration(durationMs) : "–";
272
+ refs.tokens.set(reviewer.usage?.totalTokens ?? 0);
273
+ refs.tools.set(toolCalls);
274
+ refs.turn.textContent = reviewer.turns > 0 ? `turn ${reviewer.turns}` : "";
275
+ const toolText = reviewer.activeTool
276
+ ? `${reviewer.activeTool}${reviewer.activeToolSummary ? `: ${reviewer.activeToolSummary}` : ""}`
277
+ : "";
278
+ refs.tool.textContent = toolText;
279
+ refs.tool.classList.toggle("has-tool", toolText.length > 0);
280
+ const logText = reviewer.recentActivity.length > 0
281
+ ? reviewer.recentActivity.join("\n")
282
+ : reviewer.status === "queued"
283
+ ? "waiting to start…"
284
+ : reviewer.status === "running"
285
+ ? "working…"
286
+ : "";
287
+ if (refs.log.textContent !== logText)
288
+ refs.log.textContent = logText;
289
+ refs.error.hidden = !reviewer.error;
290
+ if (reviewer.error)
291
+ refs.error.textContent = reviewer.error;
292
+ if (reviewer.status === "completed" && reviewer.submission && refs.verdict.hidden) {
293
+ refs.verdict.hidden = false;
294
+ const verdict = reviewer.submission.result.verdict;
295
+ const chip = el("span", {
296
+ className: verdict === "approve" ? "chip chip-completed" : "chip chip-warn",
297
+ text: verdict.replace(/_/g, " "),
298
+ });
299
+ const findings = reviewer.submission.result.findings.length;
300
+ const actionable = reviewer.submission.result.actionableCount;
301
+ refs.verdict.replaceChildren(chip, el("span", { text: `${findings} findings · ${actionable} actionable` }));
98
302
  }
99
- return card;
100
303
  }
101
304
  function renderFindingCluster(cluster, advisory) {
102
305
  const wrapper = el("div", { className: advisory ? "finding advisory" : "finding" });
103
- wrapper.append(el("strong", { text: cluster.summary }), el("div", { text: findingDetailLine(cluster) }));
306
+ const head = el("div", { className: "finding-head" });
307
+ head.append(el("span", { className: severityChipClass(cluster.severity), text: cluster.severity ?? "advisory" }));
308
+ if (cluster.path)
309
+ head.append(el("span", { className: "finding-path", text: cluster.path }));
310
+ const summary = el("div", { className: "finding-summary" });
311
+ renderInlineMarkdownInto(summary, cluster.summary);
312
+ const support = el("div", {
313
+ className: "finding-support",
314
+ text: cluster.supportingReviewerIds.length > 0
315
+ ? `${cluster.supportCount} reviewer(s): ${cluster.supportingReviewerIds.join(", ")}`
316
+ : `${cluster.supportCount} reviewer(s)`,
317
+ });
318
+ wrapper.append(head, summary, support);
104
319
  return wrapper;
105
320
  }
106
- function render(state) {
107
- const now = Date.now();
108
- const title = document.getElementById("run-title");
109
- const meta = document.getElementById("run-meta");
110
- if (title)
111
- title.textContent = headerTitle(state);
112
- if (meta)
113
- meta.textContent = headerSummary(state, now);
114
- const reviewers = document.getElementById("reviewers");
115
- if (reviewers) {
116
- reviewers.replaceChildren(...Object.values(state.reviewers).map((reviewer) => renderReviewerCard(reviewer, now)));
117
- }
321
+ function renderResults(state, extras) {
118
322
  const results = document.getElementById("results");
119
- if (results) {
120
- results.replaceChildren();
121
- if (state.meta) {
122
- results.append(el("h2", { text: resultsSummary(state.meta) }));
123
- if (state.meta.confirmedClusters.length > 0) {
124
- results.append(el("h3", { text: "Confirmed findings" }));
125
- results.append(...state.meta.confirmedClusters.map((cluster) => renderFindingCluster(cluster, false)));
126
- }
127
- if (state.meta.advisories.length > 0) {
128
- results.append(el("h3", { text: "Advisories" }));
129
- results.append(...state.meta.advisories.map((cluster) => renderFindingCluster(cluster, true)));
130
- }
131
- if (state.meta.confirmedClusters.length === 0 && state.meta.advisories.length === 0) {
132
- results.append(el("p", { text: "No findings reported." }));
323
+ const meta = state.meta;
324
+ if (!results || !meta)
325
+ return;
326
+ results.replaceChildren();
327
+ const clean = meta.status === "clean";
328
+ const gate = el("div", { className: clean ? "gate gate-clean" : "gate gate-findings" });
329
+ // The masthead already carries the gate word; the banner adds the count.
330
+ const confirmedCount = meta.confirmedClusters.length;
331
+ const gateText = clean
332
+ ? "No confirmed findings"
333
+ : `${confirmedCount} confirmed finding${confirmedCount === 1 ? "" : "s"}`;
334
+ gate.append(el("div", { className: "gate-status", text: gateText }));
335
+ const subParts = [
336
+ meta.panelHealth,
337
+ `${meta.confirmedClusters.length} confirmed`,
338
+ `${meta.advisories.length} advisories`,
339
+ state.startedAt !== undefined && state.completedAt !== undefined
340
+ ? formatDuration(state.completedAt - state.startedAt)
341
+ : undefined,
342
+ meta.usage ? `${formatCompact(meta.usage.totalTokens)} tokens` : undefined,
343
+ ].filter((part) => Boolean(part));
344
+ gate.append(el("div", { className: "gate-sub", text: subParts.join(" · ") }));
345
+ results.append(gate);
346
+ if (meta.confirmedClusters.length > 0) {
347
+ const heading = el("h2", { className: "results-heading", text: "Confirmed findings " });
348
+ heading.append(el("span", { className: "count", text: String(meta.confirmedClusters.length) }));
349
+ results.append(heading, ...meta.confirmedClusters.map((cluster) => renderFindingCluster(cluster, false)));
350
+ }
351
+ if (meta.advisories.length > 0) {
352
+ const heading = el("h2", { className: "results-heading", text: "Advisories " });
353
+ heading.append(el("span", { className: "count", text: String(meta.advisories.length) }));
354
+ results.append(heading, ...meta.advisories.map((cluster) => renderFindingCluster(cluster, true)));
355
+ }
356
+ const reports = Object.values(state.reviewers).filter((reviewer) => (extras.fullText[reviewer.reviewerId] ?? "").trim().length > 0);
357
+ if (reports.length > 0) {
358
+ results.append(el("h2", { className: "results-heading", text: "Reviewer reports" }));
359
+ for (const reviewer of reports) {
360
+ const details = el("details", { className: "review-full" });
361
+ const summary = el("summary");
362
+ summary.append(el("span", { text: reviewer.role }), el("span", { className: "finding-path", text: reviewer.model ?? "" }));
363
+ const prose = el("div", { className: "prose" });
364
+ renderMarkdownInto(prose, extras.fullText[reviewer.reviewerId]);
365
+ details.append(summary, prose);
366
+ results.append(details);
367
+ }
368
+ }
369
+ }
370
+ // ---------------------------------------------------------------------------
371
+ // Countdown closer: shutdown + close once the run completes.
372
+ // ---------------------------------------------------------------------------
373
+ const RING_CIRCUMFERENCE = 2 * Math.PI * 10.5;
374
+ class Closer {
375
+ shutdownUrl;
376
+ cancelled = false;
377
+ started = false;
378
+ deadline = 0;
379
+ timer;
380
+ root = document.getElementById("closer");
381
+ text = document.getElementById("closer-text");
382
+ ring = this.root?.querySelector(".ring-fill") ?? null;
383
+ constructor(shutdownUrl) {
384
+ this.shutdownUrl = shutdownUrl;
385
+ const keep = document.getElementById("closer-keep");
386
+ keep?.addEventListener("click", (event) => {
387
+ event.stopPropagation();
388
+ this.cancel();
389
+ });
390
+ }
391
+ start() {
392
+ if (this.started || !this.root || !this.text)
393
+ return;
394
+ this.started = true;
395
+ this.deadline = performance.now() + COUNTDOWN_SECONDS * 1000;
396
+ this.root.classList.add("is-visible");
397
+ if (this.ring) {
398
+ this.ring.style.strokeDasharray = String(RING_CIRCUMFERENCE);
399
+ }
400
+ const onInteract = () => this.cancel();
401
+ for (const type of ["pointerdown", "keydown", "wheel", "touchstart"]) {
402
+ window.addEventListener(type, onInteract, { once: true, passive: true });
403
+ }
404
+ this.tick();
405
+ this.timer = setInterval(() => this.tick(), 200);
406
+ }
407
+ tick() {
408
+ if (this.cancelled || !this.text)
409
+ return;
410
+ const remainingMs = this.deadline - performance.now();
411
+ if (remainingMs <= 0) {
412
+ this.finish();
413
+ return;
414
+ }
415
+ const seconds = Math.ceil(remainingMs / 1000);
416
+ this.text.replaceChildren(document.createTextNode("Review complete · closing in "), el("span", { className: "num", text: `${seconds}s` }));
417
+ if (this.ring) {
418
+ this.ring.style.strokeDashoffset = String(RING_CIRCUMFERENCE * (1 - remainingMs / (COUNTDOWN_SECONDS * 1000)));
419
+ }
420
+ }
421
+ cancel() {
422
+ if (this.cancelled || !this.started)
423
+ return;
424
+ this.cancelled = true;
425
+ if (this.timer !== undefined)
426
+ clearInterval(this.timer);
427
+ if (this.text)
428
+ this.text.textContent = "Staying open · you can close this tab any time";
429
+ const root = this.root;
430
+ if (root) {
431
+ root.querySelector("#closer-ring")?.remove();
432
+ root.querySelector("#closer-keep")?.remove();
433
+ setTimeout(() => root.classList.remove("is-visible"), 4000);
434
+ }
435
+ }
436
+ requestShutdown() {
437
+ try {
438
+ if (typeof navigator.sendBeacon === "function") {
439
+ navigator.sendBeacon(this.shutdownUrl);
440
+ return;
133
441
  }
134
442
  }
443
+ catch {
444
+ /* fall through to fetch */
445
+ }
446
+ void fetch(this.shutdownUrl, { method: "POST", keepalive: true }).catch(() => { });
447
+ }
448
+ finish() {
449
+ if (this.timer !== undefined)
450
+ clearInterval(this.timer);
451
+ this.requestShutdown();
452
+ setTimeout(() => {
453
+ window.close();
454
+ // window.close() is a no-op when the browser refuses (e.g. user navigated);
455
+ // fall back to an honest final message.
456
+ setTimeout(() => {
457
+ if (this.text)
458
+ this.text.textContent = "Server stopped · you can close this tab";
459
+ this.root?.querySelector("#closer-ring")?.remove();
460
+ this.root?.querySelector("#closer-keep")?.remove();
461
+ }, 400);
462
+ }, 120);
135
463
  }
136
464
  }
465
+ // ---------------------------------------------------------------------------
466
+ // Bootstrap
467
+ // ---------------------------------------------------------------------------
137
468
  function bootstrap() {
138
469
  let state = createPanelViewState();
139
- render(state);
470
+ let extras = createClientExtras();
471
+ let connection = "connecting";
472
+ const runTitle = document.getElementById("run-title");
473
+ const runTarget = document.getElementById("run-target");
474
+ const runMeta = document.getElementById("run-meta");
475
+ const reviewersRoot = document.getElementById("reviewers");
476
+ const stats = runMeta ? buildStatStrip(runMeta) : undefined;
477
+ const cards = new Map();
140
478
  const eventsUrl = new URL("../events", import.meta.url).toString();
479
+ const shutdownUrl = new URL("../shutdown", import.meta.url).toString();
480
+ const closer = new Closer(shutdownUrl);
481
+ let resultsRendered = false;
482
+ const waiting = el("div", { className: "waiting" });
483
+ waiting.append(document.createTextNode("Waiting for reviewers"));
484
+ const ellipsis = el("span", { className: "ellipsis" });
485
+ ellipsis.append(el("span", { text: "." }), el("span", { text: "." }), el("span", { text: "." }));
486
+ waiting.append(ellipsis);
487
+ reviewersRoot?.append(waiting);
488
+ const render = () => {
489
+ const now = Date.now();
490
+ document.title = headerTitle(state);
491
+ if (runTitle) {
492
+ const headline = statusHeadline(state, connection);
493
+ if (runTitle.textContent !== headline.text)
494
+ runTitle.textContent = headline.text;
495
+ runTitle.className = headline.tone ? `tone-${headline.tone}` : "";
496
+ }
497
+ if (runTarget && state.target && runTarget.textContent !== state.target)
498
+ runTarget.textContent = state.target;
499
+ if (stats) {
500
+ stats.reviewers.textContent = state.aggregate.total > 0 ? `${state.aggregate.completed}/${state.aggregate.total}` : "–";
501
+ stats.elapsed.textContent =
502
+ state.startedAt !== undefined ? formatDuration((state.completedAt ?? now) - state.startedAt) : "–";
503
+ stats.tokens.set(state.aggregate.usage?.totalTokens ?? 0);
504
+ stats.tools.set(totalToolCalls(extras));
505
+ }
506
+ const reviewers = Object.values(state.reviewers);
507
+ if (reviewers.length > 0 && waiting.isConnected)
508
+ waiting.remove();
509
+ for (const reviewer of reviewers) {
510
+ let refs = cards.get(reviewer.reviewerId);
511
+ if (!refs) {
512
+ refs = buildCard(reviewer);
513
+ cards.set(reviewer.reviewerId, refs);
514
+ reviewersRoot?.append(refs.root);
515
+ }
516
+ updateCard(refs, reviewer, extras.toolCalls[reviewer.reviewerId] ?? 0, now);
517
+ }
518
+ if (state.phase === "completed" && state.meta && !resultsRendered) {
519
+ resultsRendered = true;
520
+ renderResults(state, extras);
521
+ closer.start();
522
+ }
523
+ };
524
+ // Wall-clock tick keeps elapsed/durations moving between SSE events.
525
+ setInterval(() => {
526
+ if (state.phase === "running" || state.phase === "aggregating")
527
+ render();
528
+ }, 1000);
141
529
  const source = new EventSource(eventsUrl);
530
+ source.onopen = () => {
531
+ connection = "live";
532
+ document.body.classList.add("is-live");
533
+ document.body.classList.remove("is-reconnecting");
534
+ render();
535
+ };
142
536
  source.onmessage = (message) => {
143
537
  let event;
144
538
  try {
@@ -148,13 +542,16 @@ function bootstrap() {
148
542
  return;
149
543
  }
150
544
  state = reducePanelEvent(state, event);
151
- render(state);
545
+ extras = reduceClientExtras(extras, event);
546
+ render();
152
547
  };
153
548
  source.onerror = () => {
154
- const meta = document.getElementById("run-meta");
155
- if (meta)
156
- meta.textContent = "reconnecting…";
549
+ connection = "reconnecting";
550
+ document.body.classList.add("is-reconnecting");
551
+ document.body.classList.remove("is-live");
552
+ render();
157
553
  };
554
+ render();
158
555
  }
159
556
  if (typeof document !== "undefined")
160
557
  bootstrap();
@@ -1 +1 @@
1
- {"version":3,"file":"ui-client.js","sourceRoot":"","sources":["../src/ui-client.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,8EAA8E;AAC9E,0EAA0E;AAC1E,2DAA2D;AAE3D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAKzE,MAAM,UAAU,cAAc,CAAC,EAAsB;IACnD,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAC3C,IAAI,YAAY,GAAG,EAAE;QAAE,OAAO,GAAG,YAAY,GAAG,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAClC,OAAO,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAA6B;IACvD,IAAI,CAAC,KAAK;QAAE,OAAO,UAAU,CAAC;IAC9B,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAA0B;IACpD,OAAO,iBAAiB,MAAM,EAAE,CAAC;AACnC,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,aAAa,CAAC,KAAqB,EAAE,GAAW;IAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,WAAW,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACnH,MAAM,KAAK,GAAG;QACZ,KAAK,CAAC,IAAI;QACV,KAAK,CAAC,KAAK;QACX,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,YAAY;QACjE,OAAO;QACP,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;KACnC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAqB;IAC/C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC;AAChF,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,kBAAkB,CAAC,QAA2B,EAAE,GAAW;IACzE,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACrH,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IACjI,OAAO;QACL,QAAQ,CAAC,KAAK,IAAI,eAAe;QACjC,QAAQ,CAAC,QAAQ;QACjB,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS;QAChE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;QACjE,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC3B,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KACxF;SACE,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC/C,IAAI,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAuB;IACvD,MAAM,OAAO,GAAG,OAAO,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC;QACtD,CAAC,CAAC,GAAG,OAAO,CAAC,YAAY,iBAAiB,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACpF,CAAC,CAAC,GAAG,OAAO,CAAC,YAAY,cAAc,CAAC;IAC1C,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC/G,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAA4B;IACzD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,WAAW,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,WAAW,GAAG,CAAC;AACxD,CAAC;AAED,8EAA8E;AAC9E,kDAAkD;AAClD,8EAA8E;AAE9E,SAAS,EAAE,CACT,GAAM,EACN,OAA8C,EAAE;IAEhD,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,IAAI,CAAC,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACpD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;IAC1D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,kBAAkB,CAAC,QAA2B,EAAE,GAAW;IAClE,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;IAC3D,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAClE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,WAAW,GACf,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS;QACtC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS;YACzC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxB,OAAO,CAAC,MAAM,CACZ,GAAG,QAAQ,CAAC,IAAI,GAAG,EACnB,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAC3E,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,kBAAkB,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3G,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9F,CAAC;SAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,uBAAuB,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;IAC5F,CAAC;SAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,uBAAuB,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAuB,EAAE,QAAiB;IACtE,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACpF,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACzG,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,MAAM,CAAC,KAAqB;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,KAAK;QAAE,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,IAAI;QAAE,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEvD,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IACvD,IAAI,SAAS,EAAE,CAAC;QACd,SAAS,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,kBAAkB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACpH,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACnD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,eAAe,EAAE,CAAC;QAC1B,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/D,IAAI,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5C,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC;gBACzD,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YACzG,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;gBACjD,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YACjG,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpF,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,KAAK,GAAG,oBAAoB,EAAE,CAAC;IACnC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEd,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IACnE,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,CAAC,SAAS,GAAG,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,KAAkB,CAAC;QACvB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,GAAG,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC;IACF,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE;QACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,IAAI;YAAE,IAAI,CAAC,WAAW,GAAG,eAAe,CAAC;IAC/C,CAAC,CAAC;AACJ,CAAC;AAED,IAAI,OAAO,QAAQ,KAAK,WAAW;IAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"ui-client.js","sourceRoot":"","sources":["../src/ui-client.ts"],"names":[],"mappings":"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"}