tabs.js: final cookie scrub — 0 issue refs (#712 batch 14)

Final pass on tabs.js. All 6 remaining cookies were either
attribution refs to closed issues / past reviews or pure-history
mile-markers:

- #259 disabled meta-update state → drop attribution
- dashboard.rs#2170 backend handler line ref → drop the line
  number (handler still lives in dashboard.rs, line drifts)
- mara on #695 M0V3 picker any-selection → drop attribution
  (substance already captured in docs/web-ui.md::Selection bar)
- #541 journald scroll surface → drop the migration history
  framing, keep present-state behaviour
- argus on #471 textContent vs innerHTML review → drop the review
  attribution, keep the safer-pattern rationale inline
- #369 tab routing section header → drop the cookie, keep the
  section divider

tabs.js: 6 → 0 issue-ref cookies (100% reduction). Across
batches 1-14 (#712): 73 → 0 issue-ref cookies, with substantive
prose (Topology tree CSS geometry, Container row icon layout,
Pending-state derivation, Selection bar, R3BU1LD QU3U3 cancel +
step annotations, Approval card requested-at, SSE multiplexing
worker-death self-heal, FL0W page MESS4GE FL0W body layout)
migrated to docs/web-ui.md across the batches.

dashboard SPA files all at 0 cookies now (PR #795 covers the
other dashboard files; this PR covers the tabs.js residual).
This commit is contained in:
iris 2026-05-31 15:09:56 +02:00 committed by mara
commit b15c534e67

View file

@ -178,7 +178,7 @@ window.marked = marked;
// agent rebuild ripple) runs in the background. Cold-loaded from
// `s.meta_update_running`, then flipped live by the
// `meta_update_running` event. Drives the META INPUTS panel's
// disabled "updating…" state (issue #259).
// disabled "updating…" state.
let metaUpdateRunning = false;
function syncTombstonesFromSnapshot(s) {
tombstonesState = (s.tombstones || []).slice();
@ -802,7 +802,7 @@ window.marked = marked;
// and own descendants on the client side; the
// backend rechecks via `topology::set_parent`).
//
// Backend lives at POST /api/topology/set-parent (dashboard.rs#2170),
// Backend lives at POST /api/topology/set-parent (dashboard.rs),
// form-encoded `child=<name>&new_parent=<target-or-empty>`. The
// backend re-emits container snapshots on success, so the tree
// repaints without a separate refresh.
@ -830,11 +830,10 @@ window.marked = marked;
});
// M0V3 → <pick>: inline `<select>` of candidate parents + submit
// button. Available for any selection size (mara on #695 — was
// single-agent only in v1). Picker omits each selected agent itself
// plus the union of every selected agent's descendants (cycle-safe;
// backend `topology::set_parent` re-checks). Empty candidate list ⇒
// disable the picker.
// button. Available for any selection size. Picker omits each
// selected agent itself plus the union of every selected agent's
// descendants (cycle-safe; backend `topology::set_parent`
// re-checks). Empty candidate list ⇒ disable the picker.
const candidates = validReparentCandidates(selected, containers);
const wrap = el('span', { class: 'move-picker' });
const selectTitle = selected.length === 1
@ -1033,11 +1032,9 @@ window.marked = marked;
pre.textContent = 'error: ' + resp.status + '\n' + text;
} else {
pre.textContent = text || '(empty)';
// Auto-scroll to the newest lines on fresh fetch. #541
// moved the scroll surface from side-panel-body onto the
// <pre> itself (the panel-body now fills the viewport and
// the <pre> is the inner overflow container), so scroll
// the <pre> instead of the side-panel-body.
// Auto-scroll to the newest lines on fresh fetch. The
// scroll surface is the <pre> itself (panel-body fills
// the viewport, <pre> is the inner overflow container).
pre.scrollTop = pre.scrollHeight;
}
} catch (err) {
@ -2946,9 +2943,9 @@ window.marked = marked;
if (!confirm(prompt)) return;
// Capture child nodes so we can restore on error, then replace
// with DOM-built content (textContent + element children rather
// than innerHTML — per argus's review note on #471, the format
// string only carries server-side ints/bool today but textContent
// is the safer pattern if a stringy field ever lands).
// than innerHTML — the format string only carries server-side
// ints/bool today but textContent is the safer pattern if a
// stringy field ever lands).
const originalChildren = btn ? Array.from(btn.childNodes) : [];
const restoreBtn = () => {
if (!btn) return;
@ -3206,7 +3203,7 @@ window.marked = marked;
};
})();
// ─── tab routing (#369) ────────────────────────────────────────────────
// ─── tab routing ───────────────────────────────────────────────────────
// Hash-based: `#swarm` / `#call` / `#system` activate the matching
// pane on the dashboard. Empty hash defaults to SW4RM. FL0W is NOT
// a tab — it's a separate page (`/flow.html`) reached via the