pantheon-opencode 1.5.0-beta.12 → 1.5.0-beta.13

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.
@@ -165,7 +165,7 @@ async function detectVersion(api) {
165
165
  if (ver) return ver;
166
166
  }
167
167
  } catch {}
168
- return "1.5.0-beta.12";
168
+ return "1.5.0-beta.13";
169
169
  }
170
170
  /**
171
171
  * usage-bar — AI subscription usage gauge for the opencode TUI.
@@ -933,22 +933,19 @@ function compareDelegationEntries(a, b) {
933
933
  return (b.updatedAt ?? b.startedAt) - (a.updatedAt ?? a.startedAt);
934
934
  }
935
935
  /** Split the panel list: active jobs (running/retry, stale-marked) first,
936
- * then the most recent terminal reports, then the archived tail (paginated
937
- * in the View). Pure — so the history-only panel (no sessionID) is testable
936
+ * then the most recent terminal reports; the remaining tail is collapsed
937
+ * by the View into a single "… +N more" line. Pure — so the history-only panel (no sessionID) is testable
938
938
  * without the TUI runtime. */
939
939
  function splitDelegationList(all, maxRecent = 8, now = Date.now(), staleThresholdMs = 1800 * 1e3) {
940
940
  const isActiveState = (st) => st === "running" || st === "retry" || st === "stale-running";
941
- const active = all.filter((d) => isActiveState(d.state)).map((d) => markStaleIfRunning(d, now, staleThresholdMs));
942
- const terminal = all.filter((d) => !isActiveState(d.state));
943
941
  return {
944
- active,
945
- recent: terminal.slice(0, maxRecent),
946
- archived: terminal.slice(maxRecent)
942
+ active: all.filter((d) => isActiveState(d.state)).map((d) => markStaleIfRunning(d, now, staleThresholdMs)),
943
+ recent: all.filter((d) => !isActiveState(d.state)).slice(0, maxRecent)
947
944
  };
948
945
  }
949
- /** The list the panel actually renders (kept for the header count and
950
- * existing tests): active jobs first, then the most recent terminal
951
- * reports (capped) — the archived tail is rendered separately. Pure. */
946
+ /** Live-first window used by {@link ceilingDelegationList} (kept for the
947
+ * ceiling helper and existing tests): active jobs first, then the most
948
+ * recent terminal reports (capped). Pure. */
952
949
  function visibleDelegationList(all, maxTerminal = 8, now = Date.now(), staleThresholdMs = 1800 * 1e3) {
953
950
  const { active, recent } = splitDelegationList(all, maxTerminal, now, staleThresholdMs);
954
951
  return [...active, ...recent];
@@ -976,7 +973,7 @@ function markStaleIfRunning(entry, now, thresholdMs = STALE_RUNNING_THRESHOLD_MS
976
973
  state: "stale-running"
977
974
  };
978
975
  }
979
- /** Compact elapsed-time label: "5m 12s", "1h 30m", "2d 4h" — ticks every
976
+ /** Compact elapsed-time label, single unit only: "12s"/"3m"/"1h"/"2d" — ticks every
980
977
  * second for running jobs. */
981
978
  function fmtElapsed(ms) {
982
979
  const total = Math.max(0, Math.floor(ms / 1e3));
@@ -984,9 +981,9 @@ function fmtElapsed(ms) {
984
981
  const hours = Math.floor(total % 86400 / 3600);
985
982
  const minutes = Math.floor(total % 3600 / 60);
986
983
  const seconds = total % 60;
987
- if (days > 0) return `${days}d ${hours}h`;
988
- if (hours > 0) return `${hours}h ${minutes}m`;
989
- if (minutes > 0) return `${minutes}m ${seconds}s`;
984
+ if (days > 0) return `${days}d`;
985
+ if (hours > 0) return `${hours}h`;
986
+ if (minutes > 0) return `${minutes}m`;
990
987
  return `${seconds}s`;
991
988
  }
992
989
  /** Elapsed label for one entry: an ACTIVE entry (running/retry/stale-running)
@@ -1040,32 +1037,12 @@ function delegationSpinnerFrame(now) {
1040
1037
  * (`retry`, `stale-running`). Fase 1 deliberately omits speculative
1041
1038
  * blocked/paused/scheduled/skipped. There is no `pending` display state: a
1042
1039
  * pre-dispatch tool part maps to `running` in {@link reduceDelegationToolPart}. */
1043
- /** Static glyph per display state. `running` shows its base spinner frame;
1044
- * callers that animate must prefer {@link delegationStateMarker}. Unicode
1045
- * geometric shapes only (no Nerd Font) — shape is an independent channel
1046
- * from color, so rows stay legible without color. */
1047
- const DELEGATION_STATE_GLYPHS = {
1048
- running: "⠋",
1049
- retry: "⟳",
1050
- "stale-running": "⚠",
1051
- completed: "✓",
1052
- error: "✕",
1053
- cancelled: "−",
1054
- startup_failed: "⚠",
1055
- startup_unknown: "⚠"
1056
- };
1057
- function delegationStateGlyph(state) {
1058
- return DELEGATION_STATE_GLYPHS[state];
1059
- }
1060
- /** Row marker (`<glyph> `) — the state channel. `running` animates through
1061
- * {@link delegationSpinnerFrame} for the given tick; every other state is
1062
- * static. Pure. */
1063
- function delegationStateMarker(state, now = Date.now()) {
1064
- return `${state === "running" ? delegationSpinnerFrame(now) : delegationStateGlyph(state)} `;
1065
- }
1066
1040
  /** Semantic tone mapped to the TUI theme at the row ({@link DelegationRow}).
1067
1041
  * Kept separate + pure so the color channel is testable without booting the
1068
1042
  * renderer. */
1043
+ /** Color is the ONLY channel separating `stale-running` from a live `running`
1044
+ * row — the 4-glyph row design has no dedicated stale shape. Display-only;
1045
+ * no behavior change. */
1069
1046
  function delegationStateTone(state) {
1070
1047
  switch (state) {
1071
1048
  case "running":
@@ -1082,9 +1059,6 @@ function delegationStateTone(state) {
1082
1059
  const latestToolActivity = /* @__PURE__ */ new Map();
1083
1060
  const MAX_TOOL_ACTIVITY_ENTRIES = 200;
1084
1061
  const TOOL_ACTIVITY_TTL_MS = 300 * 1e3;
1085
- /** Archived-section pagination state — module-level so it survives sidebar
1086
- * remounts (route changes) without leaking into the component tree. */
1087
- const archivedUiState = { page: 0 };
1088
1062
  /** First usable summary string from common tool input fields. */
1089
1063
  function summarizeToolInput(input) {
1090
1064
  if (!input) return "";
@@ -1155,6 +1129,11 @@ function mergeChildDelegationSources(children, live) {
1155
1129
  for (const liveEntry of live) {
1156
1130
  if (liveEntry.alias === null && liveEntry.taskID === null && Date.now() - liveEntry.startedAt > 3e4) continue;
1157
1131
  const incoming = toDelegationEntry(liveEntry);
1132
+ const isNativeLive = liveEntry.tool === "task" && liveEntry.alias === null;
1133
+ if (isNativeLive) {
1134
+ incoming.source = "children-only";
1135
+ incoming.alias = "native-task";
1136
+ }
1158
1137
  const index = (incoming.taskID !== void 0 ? byTask.get(incoming.taskID) : void 0) ?? (incoming.alias !== "" ? bySessionAlias.get(key(incoming.sessionID, incoming.alias)) : void 0);
1159
1138
  if (index === void 0) {
1160
1139
  result.push(incoming);
@@ -1182,7 +1161,7 @@ function mergeChildDelegationSources(children, live) {
1182
1161
  startedAt: Math.min(existing.startedAt, incoming.startedAt),
1183
1162
  updatedAt: incoming.updatedAt,
1184
1163
  read: incoming.read,
1185
- source: "live"
1164
+ source: isNativeLive ? existing.source : "live"
1186
1165
  };
1187
1166
  }
1188
1167
  result.sort(compareDelegationEntries);
@@ -1366,7 +1345,7 @@ function removeDelegationEntry(map, partIDOrCallID) {
1366
1345
  * SDK exposes `api.state.part(messageID)`). The native `task` tool spawns a
1367
1346
  * child session with parentID = caller — the same mechanism as
1368
1347
  * pantheon_delegate — so its parts feed the live-map as the native signal
1369
- * (rows render `nat:` via the children channel). Pure w.r.t. I/O — used
1348
+ * (rows come from the children channel). Pure w.r.t. I/O — used
1370
1349
  * by the mount re-scan to re-seed the live map after compaction/attach. */
1371
1350
  function collectDelegationToolParts(messages, getParts) {
1372
1351
  const out = [];
@@ -1499,44 +1478,14 @@ function mergeBoardDelegationSources(base, board) {
1499
1478
  bySessionAlias.set(key(incoming.sessionID, incoming.alias), next);
1500
1479
  continue;
1501
1480
  }
1502
- out[index] = incoming;
1481
+ out[index] = {
1482
+ ...incoming,
1483
+ sessionID: incoming.sessionID !== "" ? incoming.sessionID : out[index]?.sessionID ?? ""
1484
+ };
1503
1485
  }
1504
1486
  out.sort(compareDelegationEntries);
1505
1487
  return out;
1506
1488
  }
1507
- /** 'session' = focused session only (default); 'all' = every session the
1508
- * board knows about. */
1509
- /** api.kv key holding the persisted scope (defaults to 'session'). */
1510
- const DELEGATION_SCOPE_KV_KEY = "delegations.scope";
1511
- /** Structural subset of TuiKV — kept local so the pure helpers are testable
1512
- * without the TUI runtime. */
1513
- /** Read the persisted scope; anything malformed/absent → 'session'. */
1514
- function readDelegationScope(kv) {
1515
- try {
1516
- return kv?.get?.("delegations.scope", "session") === "all" ? "all" : "session";
1517
- } catch {
1518
- return "session";
1519
- }
1520
- }
1521
- /** Persist the scope. Failure is non-fatal — the signal keeps it in memory. */
1522
- function writeDelegationScope(kv, scope) {
1523
- try {
1524
- kv?.set?.(DELEGATION_SCOPE_KV_KEY, scope);
1525
- } catch {}
1526
- }
1527
- /** Keyboard/click toggle target. Pure. */
1528
- function nextDelegationScope(scope) {
1529
- return scope === "session" ? "all" : "session";
1530
- }
1531
- /** Keep only the focused session's jobs ('session') or all of them ('all').
1532
- * An empty sessionID marks a current-session child (the children channel is
1533
- * session-scoped and only fills sessionID from a matching md report), so it
1534
- * counts as the current session. With no resolved session there is nothing
1535
- * to scope against — fail-open to the full list. Pure. */
1536
- function filterDelegationsByScope(entries, scope, sessionID) {
1537
- if (scope === "all" || sessionID === null) return [...entries];
1538
- return entries.filter((entry) => entry.sessionID === sessionID || entry.sessionID === "");
1539
- }
1540
1489
  /** Server-aligned session id validity: opencode rejects anything not starting
1541
1490
  * with "ses" (SchemaError). This deliberately mirrors that exact contract —
1542
1491
  * nothing stricter, nothing looser — so a template placeholder ("{sessionID}"),
@@ -1593,33 +1542,59 @@ function childStatusToState(status) {
1593
1542
  if (status === "retry") return "retry";
1594
1543
  return "running";
1595
1544
  }
1596
- /** Short row prefix for a delegation entry (one of the two visual channels
1597
- * that split native task() work from pantheon_delegate jobs — the other is
1598
- * {@link delegationIcon}):
1545
+ /** Status-only row model: ONE glyph + ONE identity per row.
1599
1546
  *
1600
- * - `nat:<agent>` — a native task() child (source 'children-only', no board
1601
- * report). The child session carries no board alias, so the agent IS the
1602
- * identity.
1603
- * - `pan:<alias>` — a pantheon_delegate board row (`pan:apo-1`), the same
1604
- * alias the manager prints in pantheon_delegation_list.
1605
- *
1606
- * Short prefixes keep the narrow sidebar readable (the old
1607
- * `pan:apo-1`/`nat:` tags ate the row width). */
1608
- function delegationTag(entry) {
1609
- return entry.source === "children-only" ? `nat:${entry.agent}` : `pan:${entry.alias}`;
1610
- }
1611
- /** Row glyph: hollow diamond `◇` for native task() children (info color,
1612
- * outline) vs filled diamond `◆` for pantheon_delegate rows (state color).
1613
- * Shape + color are independent channels, so the split stays legible even
1614
- * without color. */
1615
- function delegationIcon(entry) {
1616
- return entry.source === "children-only" ? "◇" : "◆";
1617
- }
1618
- /** Row identity after the status marker + glyph. Pantheon rows append the
1619
- * agent (`pan:apo-1 apollo`); native rows already carry it inside the tag
1620
- * (`nat:apollo`) and must not duplicate it. */
1621
- function formatDelegationIdentity(entry) {
1622
- return entry.source === "children-only" ? delegationTag(entry) : `${delegationTag(entry)} ${entry.agent}`;
1547
+ * A row is
1548
+ * `{glyph} {alias:7} {elapsed:>5}` plus a muted description line. The short
1549
+ * alias (`apo-1`) is the single identity; rows without a board alias show
1550
+ * the agent instead (never both). */
1551
+ /** Map every FSM/display state to one of the 4 row kinds. reconciled never
1552
+ * reaches the panel (the board parser drops it) but reads as done;
1553
+ * cancelled reads as done; startup_failed reads as failed while
1554
+ * startup_unknown (no error known) reads as retry. Pure. */
1555
+ function delegationRowStatus(state) {
1556
+ switch (state) {
1557
+ case "running":
1558
+ case "stale-running": return "active";
1559
+ case "retry":
1560
+ case "startup_unknown": return "retry";
1561
+ case "completed":
1562
+ case "cancelled": return "done";
1563
+ case "error":
1564
+ case "startup_failed": return "failed";
1565
+ }
1566
+ }
1567
+ /** The only 4 glyphs a row may show: animated active, done, failed, retry.
1568
+ * Shape is redundant with color (never the only signal). Pure. */
1569
+ const DELEGATION_ROW_GLYPHS = {
1570
+ active: "⠋",
1571
+ done: "✓",
1572
+ failed: "✕",
1573
+ retry: "⟳"
1574
+ };
1575
+ function delegationRowGlyph(status) {
1576
+ return DELEGATION_ROW_GLYPHS[status];
1577
+ }
1578
+ /** Row marker (`<glyph> `) — the single state channel. `active` animates
1579
+ * through the 1s spinner for the given tick; every other kind is static.
1580
+ * Pure. */
1581
+ function delegationRowMarker(state, now = Date.now()) {
1582
+ const status = delegationRowStatus(state);
1583
+ return `${status === "active" ? delegationSpinnerFrame(now) : delegationRowGlyph(status)} `;
1584
+ }
1585
+ /** ONE identity per row: the short board alias (`apo-1`); a row without a
1586
+ * board alias (native task() child, alias `native-task`) shows the agent
1587
+ * instead — never alias + agent stacked. Pure. */
1588
+ function delegationRowIdentity(entry) {
1589
+ if (entry.alias === "native-task" && entry.agent !== "") return entry.agent;
1590
+ return entry.alias;
1591
+ }
1592
+ /** Fixed alias cell, pad-right + hard-truncate to `width` (default 7) so
1593
+ * identities line up across rows. Pure. */
1594
+ const DELEGATION_ALIAS_WIDTH = 7;
1595
+ function formatDelegationAlias(identity, width = 7) {
1596
+ if (identity.length >= width) return identity.slice(0, width);
1597
+ return `${identity}${" ".repeat(width - identity.length)}`;
1623
1598
  }
1624
1599
  /** Max description width on the row detail line — the old 180-char slice
1625
1600
  * wrapped the sidebar; 44 keeps one readable line. */
@@ -1645,33 +1620,61 @@ function truncateDelegationDescription(text, max = 44) {
1645
1620
  if (graphemes.length <= max) return text;
1646
1621
  return `${graphemes.slice(0, Math.max(0, max - 1)).join("")}\u2026`;
1647
1622
  }
1648
- /** Fixed elapsed-time box: right-aligned to `width` (default 8) so elapsed
1649
- * values line up across rows, e.g. ` 12s`. A label that already fills
1623
+ /** Fixed elapsed-time box: right-aligned to `width` (default 5) so elapsed
1624
+ * values line up across rows, e.g. ` 12s`. A label that already fills
1650
1625
  * the box is returned untouched. Pure. */
1651
- const DELEGATION_ELAPSED_WIDTH = 8;
1652
- function formatDelegationElapsed(entry, now, width = 8) {
1626
+ const DELEGATION_ELAPSED_WIDTH = 5;
1627
+ function formatDelegationElapsed(entry, now, width = 5) {
1653
1628
  const label = delegationElapsed(entry, now);
1654
1629
  if (label.length >= width) return label;
1655
1630
  return `${" ".repeat(width - label.length)}${label}`;
1656
1631
  }
1657
- /** First row line: `<marker><glyph> <identity>`. The marker already carries
1658
- * its trailing space. Pure — the row renders the returned string verbatim. */
1659
- function formatDelegationRow(entry, marker) {
1660
- return `${marker}${delegationIcon(entry)} ${formatDelegationIdentity(entry)}`;
1661
- }
1662
- /** Header summary: `(N active · M done · nat:K pan:M)`. Active counts
1663
- * running/retry AND display-only stale-running (a stale row is still a live
1664
- * job — it must never read as done). Pure. */
1632
+ /** Colored left half of a row line: `<marker><alias:7> ` — the state glyph
1633
+ * plus the single identity, padded so the muted elapsed column aligns. The
1634
+ * row renders this colored lead separately from the muted elapsed tail. Pure. */
1635
+ function formatDelegationRowLead(entry, marker) {
1636
+ return `${marker}${formatDelegationAlias(delegationRowIdentity(entry))} `;
1637
+ }
1638
+ /** Visible-row ceiling for the panel: the remainder collapses into a single
1639
+ * "… +N more" line. Live rows render first, so a running job is never hidden
1640
+ * by the cap. */
1641
+ const DELEGATION_VISIBLE_CEILING = 8;
1642
+ /** Header summary: `(N active · M done)` plus `· K failed` only when K > 0.
1643
+ * Active counts running/retry AND display-only stale-running (a stale row is
1644
+ * still a live job — it must never read as done); failed counts
1645
+ * error/startup_failed; cancelled reads as done. Pure. */
1665
1646
  function formatDelegationHeader(entries) {
1666
1647
  let active = 0;
1667
- for (const e of entries) if (e.state === "running" || e.state === "retry" || e.state === "stale-running") active++;
1668
- const done = entries.length - active;
1669
- const counts = countDelegationSources(entries);
1670
- return `(${active} active \u00b7 ${done} done \u00b7 nat:${counts.native} pan:${counts.pantheon})`;
1648
+ let done = 0;
1649
+ let failed = 0;
1650
+ for (const e of entries) switch (delegationRowStatus(e.state)) {
1651
+ case "active":
1652
+ case "retry":
1653
+ active++;
1654
+ break;
1655
+ case "failed":
1656
+ failed++;
1657
+ break;
1658
+ case "done":
1659
+ done++;
1660
+ break;
1661
+ }
1662
+ const tail = failed > 0 ? ` · ${failed} failed` : "";
1663
+ return `(${active} active · ${done} done${tail})`;
1664
+ }
1665
+ /** Cap the panel: live rows first, then most-recent terminal rows, at most
1666
+ * `maxVisible` total. `hidden` is how many were dropped (rendered as
1667
+ * "… +N more"). Pure. */
1668
+ function ceilingDelegationList(all, maxVisible = 8, now = Date.now()) {
1669
+ const visible = visibleDelegationList(all, maxVisible, now).slice(0, maxVisible);
1670
+ return {
1671
+ visible,
1672
+ hidden: Math.max(0, all.length - visible.length)
1673
+ };
1671
1674
  }
1672
1675
  /** Split a display list into native task() rows vs pantheon_delegate rows.
1673
1676
  * Native = source 'children-only' (no board report); everything else counts
1674
- * as pantheon. Pure — powers the header breakdown + the hooks.log line. */
1677
+ * as pantheon. Pure — powers the hooks.log line. */
1675
1678
  function countDelegationSources(entries) {
1676
1679
  let native = 0;
1677
1680
  for (const e of entries) if (e.source === "children-only") native++;
@@ -1696,15 +1699,18 @@ function formatPanelLogLine(children, pantheon, native, md, events) {
1696
1699
  * time.created. A report-less child is a NATIVE task() child (every
1697
1700
  * child of the current session — pantheon_delegate OR the native `task()`
1698
1701
  * tool — carries parentID = caller), so it gets source 'children-only',
1699
- * the internal alias 'native-task' and the `nat:` tag instead of a
1702
+ * the internal alias 'native-task' instead of a
1700
1703
  * board alias. The 'task nativa' description fallback keeps the row
1701
1704
  * non-empty when the child carries no title.
1702
1705
  * Terminal md state wins over the derived state; a running md defers to
1703
1706
  * the child's live status. A running child is NEVER archived — it always
1704
1707
  * lands in the active split (splitDelegationList active = running/retry).
1708
+ * `parentSessionID` (the focused session id) is stamped on report-less
1709
+ * children so the row carries its origin session; omit it and they stay
1710
+ * unscoped ('').
1705
1711
  * Sorted running-first (compareDelegationEntries).
1706
1712
  * Pure — no I/O. */
1707
- function childrenToDelegationEntries(children, md, now = Date.now()) {
1713
+ function childrenToDelegationEntries(children, md, now = Date.now(), parentSessionID = "") {
1708
1714
  const byTaskID = /* @__PURE__ */ new Map();
1709
1715
  for (const m of md) if (m.taskID !== void 0 && !byTaskID.has(m.taskID)) byTaskID.set(m.taskID, m);
1710
1716
  const out = [];
@@ -1716,7 +1722,7 @@ function childrenToDelegationEntries(children, md, now = Date.now()) {
1716
1722
  const state = mdEntry !== void 0 && mdEntry.state !== "running" ? mdEntry.state : childStatusToState(child.status);
1717
1723
  out.push({
1718
1724
  alias: mdEntry?.alias ?? "native-task",
1719
- sessionID: mdEntry?.sessionID ?? "",
1725
+ sessionID: mdEntry?.sessionID ?? parentSessionID,
1720
1726
  taskID: child.id,
1721
1727
  agent: mdEntry?.agent ?? child.agent ?? "agent",
1722
1728
  state,
@@ -1802,7 +1808,7 @@ function SessionRow(props) {
1802
1808
  }
1803
1809
  function DelegationRow(props) {
1804
1810
  const theme = () => props.api.theme.current;
1805
- const color = createMemo(() => {
1811
+ const tone = createMemo(() => {
1806
1812
  const t = theme();
1807
1813
  switch (delegationStateTone(props.job.state)) {
1808
1814
  case "warning": return t.warning;
@@ -1811,57 +1817,54 @@ function DelegationRow(props) {
1811
1817
  default: return t.textMuted;
1812
1818
  }
1813
1819
  });
1814
- const marker = createMemo(() => delegationStateMarker(props.job.state, props.animationNow));
1815
- const tagColor = createMemo(() => props.job.source === "children-only" ? theme().info : color());
1816
- const description = createMemo(() => truncateDelegationDescription(props.job.description));
1820
+ const marker = createMemo(() => delegationRowMarker(props.job.state, props.animationNow));
1821
+ const lead = createMemo(() => formatDelegationRowLead(props.job, marker()));
1817
1822
  const elapsed = createMemo(() => formatDelegationElapsed(props.job, props.now));
1823
+ const description = createMemo(() => truncateDelegationDescription(props.job.description));
1818
1824
  const activity = createMemo(() => latestToolActivityFor(latestToolActivity, props.job.taskID, props.now));
1819
1825
  const open = () => {
1820
1826
  navigateToDelegationSession(props.api.route, props.job.taskID);
1821
1827
  };
1822
1828
  return (() => {
1823
- var _el$13 = createElement("box"), _el$14 = createElement("box"), _el$15 = createElement("text"), _el$16 = createElement("box"), _el$18 = createElement("text");
1829
+ var _el$13 = createElement("box"), _el$14 = createElement("box"), _el$15 = createElement("text"), _el$16 = createElement("span"), _el$17 = createElement("span");
1824
1830
  insertNode(_el$13, _el$14);
1825
- insertNode(_el$13, _el$16);
1826
1831
  setProp(_el$13, "onMouseDown", open);
1827
1832
  insertNode(_el$14, _el$15);
1828
1833
  setProp(_el$14, "flexDirection", "row");
1829
- insert(_el$15, () => formatDelegationRow(props.job, marker()));
1830
- insertNode(_el$16, _el$18);
1831
- setProp(_el$16, "flexDirection", "row");
1832
- insert(_el$16, createComponent(Show, {
1834
+ insertNode(_el$15, _el$16);
1835
+ insertNode(_el$15, _el$17);
1836
+ insert(_el$16, lead);
1837
+ insert(_el$17, elapsed);
1838
+ insert(_el$13, createComponent(Show, {
1833
1839
  get when() {
1834
1840
  return description() !== "";
1835
1841
  },
1836
1842
  get children() {
1837
- var _el$17 = createElement("text");
1838
- insert(_el$17, description);
1839
- effect((_$p) => setProp(_el$17, "fg", theme().textMuted, _$p));
1840
- return _el$17;
1843
+ var _el$18 = createElement("text");
1844
+ insert(_el$18, () => ` ${description()}`);
1845
+ effect((_$p) => setProp(_el$18, "fg", theme().textMuted, _$p));
1846
+ return _el$18;
1841
1847
  }
1842
- }), _el$18);
1843
- insert(_el$18, elapsed);
1848
+ }), null);
1844
1849
  insert(_el$13, createComponent(Show, {
1845
1850
  get when() {
1846
1851
  return activity();
1847
1852
  },
1848
1853
  children: (a) => (() => {
1849
1854
  var _el$19 = createElement("text");
1850
- insert(_el$19, () => ` \u21b3 ${truncateDelegationDescription(`${a().tool}${a().summary !== "" ? ` ${a().summary}` : ""}`)}`);
1855
+ insert(_el$19, () => ` ↳ ${truncateDelegationDescription(`${a().tool}${a().summary !== "" ? ` ${a().summary}` : ""}`)}`);
1851
1856
  effect((_$p) => setProp(_el$19, "fg", theme().textMuted, _$p));
1852
1857
  return _el$19;
1853
1858
  })()
1854
1859
  }), null);
1855
1860
  effect((_p$) => {
1856
- var _v$5 = tagColor(), _v$6 = description() !== "" ? "space-between" : "flex-end", _v$7 = theme().textMuted;
1857
- _v$5 !== _p$.e && (_p$.e = setProp(_el$15, "fg", _v$5, _p$.e));
1858
- _v$6 !== _p$.t && (_p$.t = setProp(_el$16, "justifyContent", _v$6, _p$.t));
1859
- _v$7 !== _p$.a && (_p$.a = setProp(_el$18, "fg", _v$7, _p$.a));
1861
+ var _v$5 = tone(), _v$6 = theme().textMuted;
1862
+ _v$5 !== _p$.e && (_p$.e = setProp(_el$16, "fg", _v$5, _p$.e));
1863
+ _v$6 !== _p$.t && (_p$.t = setProp(_el$17, "fg", _v$6, _p$.t));
1860
1864
  return _p$;
1861
1865
  }, {
1862
1866
  e: void 0,
1863
- t: void 0,
1864
- a: void 0
1867
+ t: void 0
1865
1868
  });
1866
1869
  return _el$13;
1867
1870
  })();
@@ -1921,11 +1924,6 @@ function View(props) {
1921
1924
  });
1922
1925
  const projectRoot = createMemo(() => resolvePantheonRoot(props.api.state.path));
1923
1926
  const panelLog = createTuiLogger(projectRoot());
1924
- const [delegationScope, setDelegationScope] = createSignal(readDelegationScope(props.api.kv));
1925
- const applyDelegationScope = (scope) => {
1926
- setDelegationScope(scope);
1927
- writeDelegationScope(props.api.kv, scope);
1928
- };
1929
1927
  const [childDelegations, setChildDelegations] = createSignal([]);
1930
1928
  const [now, setNow] = createSignal(Date.now());
1931
1929
  const [animationNow, setAnimationNow] = createSignal(Date.now());
@@ -1977,8 +1975,7 @@ function View(props) {
1977
1975
  const childEntries = childrenToDelegationEntries(children.map((c) => ({
1978
1976
  ...c,
1979
1977
  status: resolveStatus(c.id)
1980
- })), md, now());
1981
- for (const entry of childEntries) if (entry.sessionID === "") entry.sessionID = sessionID;
1978
+ })), md, now(), sessionID);
1982
1979
  for (const [k, v] of props.liveStore.map) if (v.alias === null && v.taskID === null && Date.now() - v.startedAt > 3e4) props.liveStore.map.delete(k);
1983
1980
  const liveEntries = [...props.liveStore.map.values()].filter((entry) => entry.sessionID === sessionID);
1984
1981
  setChildDelegations(mergeBoardDelegationSources(mergeChildDelegationSources(childEntries, liveEntries), board));
@@ -1990,19 +1987,8 @@ function View(props) {
1990
1987
  })();
1991
1988
  return delegationsInflight;
1992
1989
  };
1993
- const scopedDelegations = createMemo(() => filterDelegationsByScope(childDelegations(), delegationScope(), resolveCurrentSessionID({
1994
- sessionID: props.sessionID,
1995
- api: props.api
1996
- })));
1997
- const delegationSplit = createMemo(() => splitDelegationList(scopedDelegations()));
1998
- const visibleDelegations = createMemo(() => [...delegationSplit().active, ...delegationSplit().recent]);
1999
- const delegationHeader = createMemo(() => formatDelegationHeader(scopedDelegations()));
2000
- const [archivedPage, setArchivedPage] = createSignal(archivedUiState.page);
2001
- const clampArchivedPage = (page, pages) => {
2002
- const clamped = Math.max(0, Math.min(page, Math.max(0, pages - 1)));
2003
- archivedUiState.page = clamped;
2004
- setArchivedPage(clamped);
2005
- };
1990
+ const delegationCeiling = createMemo(() => ceilingDelegationList(childDelegations(), 8, now()));
1991
+ const delegationHeader = createMemo(() => formatDelegationHeader(childDelegations()));
2006
1992
  onMount(() => {
2007
1993
  const cleanup = [];
2008
1994
  try {
@@ -2046,23 +2032,6 @@ function View(props) {
2046
2032
  if (parts.length > 0 && seedLiveDelegationMap(props.liveStore.map, parts) > 0) props.liveStore.bump();
2047
2033
  }
2048
2034
  } catch {}
2049
- try {
2050
- const keymap = props.api?.keymap;
2051
- if (typeof keymap?.registerLayer === "function") {
2052
- const off = keymap.registerLayer({
2053
- priority: 1e3,
2054
- commands: [{
2055
- name: "pantheon.delegations.toggleScope",
2056
- run: () => applyDelegationScope(nextDelegationScope(delegationScope()))
2057
- }],
2058
- bindings: [{
2059
- key: "ctrl+shift+d",
2060
- cmd: "pantheon.delegations.toggleScope"
2061
- }]
2062
- });
2063
- if (typeof off === "function") cleanup.push(off);
2064
- }
2065
- } catch {}
2066
2035
  onCleanup(() => cleanup.forEach((fn) => {
2067
2036
  fn();
2068
2037
  }));
@@ -2074,7 +2043,7 @@ function View(props) {
2074
2043
  return _el$20;
2075
2044
  })();
2076
2045
  return (() => {
2077
- var _el$22 = createElement("box"), _el$23 = createElement("text"), _el$24 = createElement("box"), _el$25 = createElement("text"), _el$26 = createElement("text"), _el$28 = createElement("box"), _el$29 = createElement("text"), _el$30 = createElement("text"), _el$31 = createElement("text"), _el$33 = createElement("text"), _el$35 = createElement("text"), _el$37 = createElement("text");
2046
+ var _el$22 = createElement("box"), _el$23 = createElement("text"), _el$24 = createElement("box"), _el$25 = createElement("text"), _el$26 = createElement("text"), _el$28 = createElement("box"), _el$29 = createElement("text"), _el$30 = createElement("text");
2078
2047
  insertNode(_el$22, _el$23);
2079
2048
  insertNode(_el$22, _el$24);
2080
2049
  insertNode(_el$22, _el$28);
@@ -2087,10 +2056,10 @@ function View(props) {
2087
2056
  return branch();
2088
2057
  },
2089
2058
  children: (b) => (() => {
2090
- var _el$40 = createElement("text");
2091
- insert(_el$40, b);
2092
- effect((_$p) => setProp(_el$40, "fg", theme().textMuted, _$p));
2093
- return _el$40;
2059
+ var _el$33 = createElement("text");
2060
+ insert(_el$33, b);
2061
+ effect((_$p) => setProp(_el$33, "fg", theme().textMuted, _$p));
2062
+ return _el$33;
2094
2063
  })()
2095
2064
  }), _el$24);
2096
2065
  insert(_el$22, createComponent(Show, {
@@ -2099,37 +2068,37 @@ function View(props) {
2099
2068
  },
2100
2069
  get fallback() {
2101
2070
  return (() => {
2102
- var _el$41 = createElement("box"), _el$42 = createElement("text");
2103
- insertNode(_el$41, _el$42);
2104
- setProp(_el$41, "flexDirection", "row");
2105
- setProp(_el$41, "gap", 1);
2106
- insertNode(_el$42, createTextNode(`Preset: default`));
2107
- effect((_$p) => setProp(_el$42, "fg", theme().textMuted, _$p));
2108
- return _el$41;
2071
+ var _el$34 = createElement("box"), _el$35 = createElement("text");
2072
+ insertNode(_el$34, _el$35);
2073
+ setProp(_el$34, "flexDirection", "row");
2074
+ setProp(_el$34, "gap", 1);
2075
+ insertNode(_el$35, createTextNode(`Preset: default`));
2076
+ effect((_$p) => setProp(_el$35, "fg", theme().textMuted, _$p));
2077
+ return _el$34;
2109
2078
  })();
2110
2079
  },
2111
2080
  children: (name) => (() => {
2112
- var _el$44 = createElement("box"), _el$45 = createElement("text"), _el$47 = createElement("text"), _el$48 = createElement("text");
2113
- insertNode(_el$44, _el$45);
2114
- insertNode(_el$44, _el$47);
2115
- insertNode(_el$44, _el$48);
2116
- setProp(_el$44, "flexDirection", "row");
2117
- setProp(_el$44, "gap", 1);
2118
- insertNode(_el$45, createTextNode(`⚡ Preset:`));
2119
- insert(_el$47, name);
2120
- insert(_el$48, () => `(${preset().source ?? ""})`);
2081
+ var _el$37 = createElement("box"), _el$38 = createElement("text"), _el$40 = createElement("text"), _el$41 = createElement("text");
2082
+ insertNode(_el$37, _el$38);
2083
+ insertNode(_el$37, _el$40);
2084
+ insertNode(_el$37, _el$41);
2085
+ setProp(_el$37, "flexDirection", "row");
2086
+ setProp(_el$37, "gap", 1);
2087
+ insertNode(_el$38, createTextNode(`⚡ Preset:`));
2088
+ insert(_el$40, name);
2089
+ insert(_el$41, () => `(${preset().source ?? ""})`);
2121
2090
  effect((_p$) => {
2122
- var _v$17 = theme().textMuted, _v$18 = theme().accent, _v$19 = theme().textMuted;
2123
- _v$17 !== _p$.e && (_p$.e = setProp(_el$45, "fg", _v$17, _p$.e));
2124
- _v$18 !== _p$.t && (_p$.t = setProp(_el$47, "fg", _v$18, _p$.t));
2125
- _v$19 !== _p$.a && (_p$.a = setProp(_el$48, "fg", _v$19, _p$.a));
2091
+ var _v$10 = theme().textMuted, _v$11 = theme().accent, _v$12 = theme().textMuted;
2092
+ _v$10 !== _p$.e && (_p$.e = setProp(_el$38, "fg", _v$10, _p$.e));
2093
+ _v$11 !== _p$.t && (_p$.t = setProp(_el$40, "fg", _v$11, _p$.t));
2094
+ _v$12 !== _p$.a && (_p$.a = setProp(_el$41, "fg", _v$12, _p$.a));
2126
2095
  return _p$;
2127
2096
  }, {
2128
2097
  e: void 0,
2129
2098
  t: void 0,
2130
2099
  a: void 0
2131
2100
  });
2132
- return _el$44;
2101
+ return _el$37;
2133
2102
  })()
2134
2103
  }), _el$24);
2135
2104
  insert(_el$22, createComponent(HR, {}), _el$24);
@@ -2150,12 +2119,12 @@ function View(props) {
2150
2119
  },
2151
2120
  get fallback() {
2152
2121
  return (() => {
2153
- var _el$49 = createElement("box"), _el$50 = createElement("text");
2154
- insertNode(_el$49, _el$50);
2155
- setProp(_el$49, "marginLeft", 1);
2156
- insertNode(_el$50, createTextNode(`No recent sessions`));
2157
- effect((_$p) => setProp(_el$50, "fg", theme().textMuted, _$p));
2158
- return _el$49;
2122
+ var _el$42 = createElement("box"), _el$43 = createElement("text");
2123
+ insertNode(_el$42, _el$43);
2124
+ setProp(_el$42, "marginLeft", 1);
2125
+ insertNode(_el$43, createTextNode(`No recent sessions`));
2126
+ effect((_$p) => setProp(_el$43, "fg", theme().textMuted, _$p));
2127
+ return _el$42;
2159
2128
  })();
2160
2129
  },
2161
2130
  get children() {
@@ -2180,26 +2149,13 @@ function View(props) {
2180
2149
  }), _el$28);
2181
2150
  insertNode(_el$28, _el$29);
2182
2151
  insertNode(_el$28, _el$30);
2183
- insertNode(_el$28, _el$31);
2184
- insertNode(_el$28, _el$33);
2185
- insertNode(_el$28, _el$35);
2186
- insertNode(_el$28, _el$37);
2187
2152
  setProp(_el$28, "onMouseDown", () => setShowDelegations((x) => !x));
2188
2153
  setProp(_el$29, "attributes", 1);
2189
2154
  insert(_el$29, () => `${showDelegations() ? "▼" : "▶"} Delegations`);
2190
- insert(_el$30, () => ` ${delegationHeader()}`);
2191
- insertNode(_el$31, createTextNode(` `));
2192
- insertNode(_el$33, createTextNode(`[Sessão]`));
2193
- setProp(_el$33, "onMouseDown", (e) => {
2194
- if (typeof e === "object" && e !== null && "stopPropagation" in e) e.stopPropagation();
2195
- applyDelegationScope("session");
2196
- });
2197
- insertNode(_el$35, createTextNode(`/`));
2198
- insertNode(_el$37, createTextNode(`[Tudo]`));
2199
- setProp(_el$37, "onMouseDown", (e) => {
2200
- if (typeof e === "object" && e !== null && "stopPropagation" in e) e.stopPropagation();
2201
- applyDelegationScope("all");
2202
- });
2155
+ insert(_el$30, (() => {
2156
+ var _c$ = memo(() => childDelegations().length > 0);
2157
+ return () => _c$() ? ` ${delegationHeader()}` : " — idle";
2158
+ })());
2203
2159
  insert(_el$22, createComponent(Show, {
2204
2160
  get when() {
2205
2161
  return showDelegations();
@@ -2207,25 +2163,25 @@ function View(props) {
2207
2163
  get children() {
2208
2164
  return createComponent(Show, {
2209
2165
  get when() {
2210
- return visibleDelegations().length > 0;
2166
+ return delegationCeiling().visible.length > 0;
2211
2167
  },
2212
2168
  get fallback() {
2213
2169
  return (() => {
2214
- var _el$52 = createElement("box"), _el$53 = createElement("text");
2215
- insertNode(_el$52, _el$53);
2216
- setProp(_el$52, "marginLeft", 1);
2217
- insertNode(_el$53, createTextNode(`No delegations`));
2218
- effect((_$p) => setProp(_el$53, "fg", theme().textMuted, _$p));
2219
- return _el$52;
2170
+ var _el$45 = createElement("box"), _el$46 = createElement("text");
2171
+ insertNode(_el$45, _el$46);
2172
+ setProp(_el$45, "marginLeft", 1);
2173
+ insertNode(_el$46, createTextNode(`No delegations`));
2174
+ effect((_$p) => setProp(_el$46, "fg", theme().textMuted, _$p));
2175
+ return _el$45;
2220
2176
  })();
2221
2177
  },
2222
2178
  get children() {
2223
- var _el$39 = createElement("box");
2224
- setProp(_el$39, "marginLeft", 1);
2225
- setProp(_el$39, "flexDirection", "column");
2226
- insert(_el$39, createComponent(For, {
2179
+ var _el$31 = createElement("box");
2180
+ setProp(_el$31, "marginLeft", 1);
2181
+ setProp(_el$31, "flexDirection", "column");
2182
+ insert(_el$31, createComponent(For, {
2227
2183
  get each() {
2228
- return visibleDelegations();
2184
+ return delegationCeiling().visible;
2229
2185
  },
2230
2186
  children: (job) => createComponent(DelegationRow, {
2231
2187
  get api() {
@@ -2240,97 +2196,36 @@ function View(props) {
2240
2196
  }
2241
2197
  })
2242
2198
  }), null);
2243
- insert(_el$39, createComponent(Show, {
2199
+ insert(_el$31, createComponent(Show, {
2244
2200
  get when() {
2245
- return delegationSplit().archived.length > 0;
2201
+ return delegationCeiling().hidden > 0;
2246
2202
  },
2247
2203
  get children() {
2248
- return (() => {
2249
- const archived = delegationSplit().archived;
2250
- const pageSize = 8;
2251
- const pages = Math.ceil(archived.length / pageSize);
2252
- const page = Math.min(archivedPage(), pages - 1);
2253
- const slice = archived.slice(page * pageSize, page * pageSize + pageSize);
2254
- return (() => {
2255
- var _el$55 = createElement("box"), _el$56 = createElement("box"), _el$57 = createElement("text"), _el$59 = createElement("text"), _el$60 = createElement("text"), _el$61 = createElement("text");
2256
- insertNode(_el$55, _el$56);
2257
- setProp(_el$55, "flexDirection", "column");
2258
- insertNode(_el$56, _el$57);
2259
- insertNode(_el$56, _el$59);
2260
- insertNode(_el$56, _el$60);
2261
- insertNode(_el$56, _el$61);
2262
- setProp(_el$56, "flexDirection", "row");
2263
- setProp(_el$56, "marginLeft", 0);
2264
- insertNode(_el$57, createTextNode(`‹ `));
2265
- setProp(_el$57, "onMouseDown", () => clampArchivedPage(page - 1, pages));
2266
- insert(_el$59, () => `Archived (${archived.length}) `);
2267
- insert(_el$60, `${page + 1}/${pages}`);
2268
- insertNode(_el$61, createTextNode(` ›`));
2269
- setProp(_el$61, "onMouseDown", () => clampArchivedPage(page + 1, pages));
2270
- insert(_el$55, createComponent(For, {
2271
- each: slice,
2272
- children: (job) => createComponent(DelegationRow, {
2273
- get api() {
2274
- return props.api;
2275
- },
2276
- job,
2277
- get now() {
2278
- return now();
2279
- },
2280
- get animationNow() {
2281
- return animationNow();
2282
- }
2283
- })
2284
- }), null);
2285
- effect((_p$) => {
2286
- var _v$20 = theme().textMuted, _v$21 = theme().textMuted, _v$22 = theme().textMuted, _v$23 = theme().textMuted;
2287
- _v$20 !== _p$.e && (_p$.e = setProp(_el$57, "fg", _v$20, _p$.e));
2288
- _v$21 !== _p$.t && (_p$.t = setProp(_el$59, "fg", _v$21, _p$.t));
2289
- _v$22 !== _p$.a && (_p$.a = setProp(_el$60, "fg", _v$22, _p$.a));
2290
- _v$23 !== _p$.o && (_p$.o = setProp(_el$61, "fg", _v$23, _p$.o));
2291
- return _p$;
2292
- }, {
2293
- e: void 0,
2294
- t: void 0,
2295
- a: void 0,
2296
- o: void 0
2297
- });
2298
- return _el$55;
2299
- })();
2300
- })();
2204
+ var _el$32 = createElement("text");
2205
+ insert(_el$32, () => `… +${delegationCeiling().hidden} more`);
2206
+ effect((_$p) => setProp(_el$32, "fg", theme().textMuted, _$p));
2207
+ return _el$32;
2301
2208
  }
2302
2209
  }), null);
2303
- return _el$39;
2210
+ return _el$31;
2304
2211
  }
2305
2212
  });
2306
2213
  }
2307
2214
  }), null);
2308
2215
  effect((_p$) => {
2309
- var _v$8 = theme().accent, _v$9 = theme().text, _v$0 = theme().textMuted, _v$1 = theme().text, _v$10 = theme().textMuted, _v$11 = theme().textMuted, _v$12 = delegationScope() === "session" ? theme().accent : theme().textMuted, _v$13 = delegationScope() === "session" ? 1 : void 0, _v$14 = theme().textMuted, _v$15 = delegationScope() === "all" ? theme().accent : theme().textMuted, _v$16 = delegationScope() === "all" ? 1 : void 0;
2310
- _v$8 !== _p$.e && (_p$.e = setProp(_el$23, "fg", _v$8, _p$.e));
2311
- _v$9 !== _p$.t && (_p$.t = setProp(_el$25, "fg", _v$9, _p$.t));
2312
- _v$0 !== _p$.a && (_p$.a = setProp(_el$26, "fg", _v$0, _p$.a));
2313
- _v$1 !== _p$.o && (_p$.o = setProp(_el$29, "fg", _v$1, _p$.o));
2314
- _v$10 !== _p$.i && (_p$.i = setProp(_el$30, "fg", _v$10, _p$.i));
2315
- _v$11 !== _p$.n && (_p$.n = setProp(_el$31, "fg", _v$11, _p$.n));
2316
- _v$12 !== _p$.s && (_p$.s = setProp(_el$33, "fg", _v$12, _p$.s));
2317
- _v$13 !== _p$.h && (_p$.h = setProp(_el$33, "attributes", _v$13, _p$.h));
2318
- _v$14 !== _p$.r && (_p$.r = setProp(_el$35, "fg", _v$14, _p$.r));
2319
- _v$15 !== _p$.d && (_p$.d = setProp(_el$37, "fg", _v$15, _p$.d));
2320
- _v$16 !== _p$.l && (_p$.l = setProp(_el$37, "attributes", _v$16, _p$.l));
2216
+ var _v$7 = theme().accent, _v$8 = theme().text, _v$9 = theme().textMuted, _v$0 = theme().text, _v$1 = theme().textMuted;
2217
+ _v$7 !== _p$.e && (_p$.e = setProp(_el$23, "fg", _v$7, _p$.e));
2218
+ _v$8 !== _p$.t && (_p$.t = setProp(_el$25, "fg", _v$8, _p$.t));
2219
+ _v$9 !== _p$.a && (_p$.a = setProp(_el$26, "fg", _v$9, _p$.a));
2220
+ _v$0 !== _p$.o && (_p$.o = setProp(_el$29, "fg", _v$0, _p$.o));
2221
+ _v$1 !== _p$.i && (_p$.i = setProp(_el$30, "fg", _v$1, _p$.i));
2321
2222
  return _p$;
2322
2223
  }, {
2323
2224
  e: void 0,
2324
2225
  t: void 0,
2325
2226
  a: void 0,
2326
2227
  o: void 0,
2327
- i: void 0,
2328
- n: void 0,
2329
- s: void 0,
2330
- h: void 0,
2331
- r: void 0,
2332
- d: void 0,
2333
- l: void 0
2228
+ i: void 0
2334
2229
  });
2335
2230
  return _el$22;
2336
2231
  })();
@@ -2392,6 +2287,6 @@ const plugin = {
2392
2287
  setup: async () => {}
2393
2288
  };
2394
2289
  //#endregion
2395
- export { DELEGATION_DESCRIPTION_MAX, DELEGATION_ELAPSED_WIDTH, DELEGATION_SCOPE_KV_KEY, DELEGATION_STATE_GLYPHS, IDLE_SILENCE_MS, STALE_RUNNING_THRESHOLD_MS, boardRecordToDelegationEntry, boardRecordsToDelegationEntries, boardStatePath, buildChildrenPath, childStatusToState, childrenToDelegationEntries, collectDelegationToolParts, compareDelegationEntries, countDelegationSources, plugin as default, delegationActivity, delegationActivityLabel, delegationElapsed, delegationIcon, delegationSpinnerFrame, delegationStateGlyph, delegationStateMarker, delegationStateTone, delegationTag, extractToolActivity, filterDelegationsByScope, fmtElapsed, formatDelegationElapsed, formatDelegationHeader, formatDelegationIdentity, formatDelegationRow, formatPanelLogLine, isValidSessionId, latestToolActivityFor, markStaleIfRunning, mergeBoardDelegationSources, mergeChildDelegationSources, mergeDelegationSources, navigateToDelegationSession, nextDelegationScope, panelLogDir, parseDelegationMarkdown, parseDelegationToolPart, readAllDelegationEntries, readBoardState, readDelegationEntries, readDelegationScope, reduceDelegationToolPart, removeDelegationEntry, resolveCurrentSessionID, resolveDelegationsDir, resolvePantheonRoot, safeSessionPath, seedLiveDelegationMap, splitDelegationList, toDelegationEntry, trackToolActivity, truncateDelegationDescription, tuiLogPath, visibleDelegationList, writeDelegationScope };
2290
+ export { DELEGATION_ALIAS_WIDTH, DELEGATION_DESCRIPTION_MAX, DELEGATION_ELAPSED_WIDTH, DELEGATION_ROW_GLYPHS, DELEGATION_VISIBLE_CEILING, IDLE_SILENCE_MS, STALE_RUNNING_THRESHOLD_MS, boardRecordToDelegationEntry, boardRecordsToDelegationEntries, boardStatePath, buildChildrenPath, ceilingDelegationList, childStatusToState, childrenToDelegationEntries, collectDelegationToolParts, compareDelegationEntries, countDelegationSources, plugin as default, delegationActivity, delegationActivityLabel, delegationElapsed, delegationRowGlyph, delegationRowIdentity, delegationRowMarker, delegationRowStatus, delegationSpinnerFrame, delegationStateTone, extractToolActivity, fmtElapsed, formatDelegationAlias, formatDelegationElapsed, formatDelegationHeader, formatDelegationRowLead, formatPanelLogLine, isValidSessionId, latestToolActivityFor, markStaleIfRunning, mergeBoardDelegationSources, mergeChildDelegationSources, mergeDelegationSources, navigateToDelegationSession, panelLogDir, parseDelegationMarkdown, parseDelegationToolPart, readAllDelegationEntries, readBoardState, readDelegationEntries, reduceDelegationToolPart, removeDelegationEntry, resolveCurrentSessionID, resolveDelegationsDir, resolvePantheonRoot, safeSessionPath, seedLiveDelegationMap, splitDelegationList, toDelegationEntry, trackToolActivity, truncateDelegationDescription, tuiLogPath, visibleDelegationList };
2396
2291
 
2397
2292
  //# sourceMappingURL=tui.js.map