@2lab.ai/ui 0.0.0-stage → 0.1.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.
- package/README.md +54 -2
- package/dist/agent-inbox.js +1061 -0
- package/dist/agent-inbox.js.map +1 -0
- package/dist/agent-queue.js +1610 -0
- package/dist/agent-queue.js.map +1 -0
- package/dist/agent-run.js +859 -0
- package/dist/agent-run.js.map +1 -0
- package/dist/ai-answer.js +687 -0
- package/dist/ai-answer.js.map +1 -0
- package/dist/components/agent-inbox/agent-inbox.d.ts +158 -0
- package/dist/components/agent-inbox/index.d.ts +2 -0
- package/dist/components/agent-inbox/styles.d.ts +6 -0
- package/dist/components/agent-queue/agent-queue.d.ts +41 -0
- package/dist/components/agent-queue/index.d.ts +6 -0
- package/dist/components/agent-queue/logic.d.ts +261 -0
- package/dist/components/agent-queue/strings.d.ts +473 -0
- package/dist/components/agent-queue/styles.d.ts +8 -0
- package/dist/components/agent-run/agent-run.d.ts +273 -0
- package/dist/components/agent-run/index.d.ts +2 -0
- package/dist/components/agent-run/styles.d.ts +6 -0
- package/dist/components/ai-answer/ai-answer.d.ts +92 -0
- package/dist/components/ai-answer/index.d.ts +2 -0
- package/dist/components/ai-answer/styles.d.ts +2 -0
- package/dist/components/context-window/context-window.d.ts +156 -0
- package/dist/components/context-window/index.d.ts +2 -0
- package/dist/components/context-window/styles.d.ts +2 -0
- package/dist/components/memory-panel/index.d.ts +2 -0
- package/dist/components/memory-panel/memory-panel.d.ts +101 -0
- package/dist/components/memory-panel/styles.d.ts +2 -0
- package/dist/components/model-picker/index.d.ts +2 -0
- package/dist/components/model-picker/model-picker.d.ts +136 -0
- package/dist/components/model-picker/morph.d.ts +9 -0
- package/dist/components/model-picker/styles.d.ts +6 -0
- package/dist/context-window.js +384 -0
- package/dist/context-window.js.map +1 -0
- package/dist/core/element.d.ts +39 -0
- package/dist/core/format.d.ts +14 -0
- package/dist/core/html.d.ts +10 -0
- package/dist/core/tokens.d.ts +14 -0
- package/dist/format-BBGWXPzk.js +51 -0
- package/dist/format-BBGWXPzk.js.map +1 -0
- package/dist/html-DZWnrdcg.js +167 -0
- package/dist/html-DZWnrdcg.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +116 -0
- package/dist/index.js.map +1 -0
- package/dist/memory-panel.js +1255 -0
- package/dist/memory-panel.js.map +1 -0
- package/dist/model-picker.js +858 -0
- package/dist/model-picker.js.map +1 -0
- package/dist/tokens.css +4 -0
- package/package.json +75 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-queue.js","sources":["../src/components/agent-queue/logic.ts","../src/components/agent-queue/strings.ts","../src/components/agent-queue/styles.ts","../src/components/agent-queue/agent-queue.ts"],"sourcesContent":["/**\n * Pure data helpers for `<ui-agent-queue>` — ported from the soma-work dashboard (`aq*`, `cap*`, `cron*` in\n * dash-main.ts, .prd/affectui/re-agent-queue.md D3·D8–D10·D13·D16–D19). No DOM, no clock: every function takes `now`.\n * Every time here is epoch **milliseconds**; seconds are converted once, at the boundary (`normalize`, `toMs`).\n */\n\n// ── Data contract ────────────────────────────────────────────────────────────────────────────\n\n/** Unit of every epoch field in the data (`now`, `fetchedAt`, `measuredAt`, `returnAt`, `refills[].at`, `nextRunAt`, `runs[].at`). */\nexport type TimeUnit = 'ms' | 's';\n\n/** Pool state of a provider. `low` = the primary measure is under {@link LOW_PCT}% of the total. */\nexport type AqPoolState = 'ok' | 'low' | 'empty' | 'unknown';\n\n/**\n * One account (a worker).\n * - `available` — usable now (its dot says which window binds first).\n * - `limited` — counted but blocked by a limit; shows the reason and the time left (`returnAt`).\n * - `paused` — held out of the totals (paused, auth failure …).\n * - `spent` — counted, not blocked, nothing usable now.\n * - `unmeasured` — counted, no 5-hour reading.\n * - `excluded` — not counted (no measurement, unknown tier …).\n */\nexport type AqAccountState = 'available' | 'limited' | 'paused' | 'spent' | 'unmeasured' | 'excluded';\n\n/** Known reason keys (translated). Any other string is shown as given. */\nexport type AqReason =\n | 'weekly'\n | '5h'\n | 'model'\n | 'cooldown'\n | 'paused'\n | 'auth'\n | 'held'\n | 'noMeasure'\n | 'unknownTier';\n\nexport interface AqAccount {\n /** Stable identity (the open card, the roving stop and focus follow it across updates). */\n id: string;\n name: string;\n state: AqAccountState;\n /** Why it is limited / paused / excluded: a known key (translated) or free text. */\n reason?: AqReason | (string & {});\n /** When every block has lifted (epoch, see `timeUnit`). Limited accounts count down to it. */\n returnAt?: number;\n /** Which window binds a usable account first — colours its dot (5h teal, 7d violet). */\n binding?: '5h' | '7d';\n /** Plan label, e.g. `Max x5`. */\n tier?: string;\n /** The tier is assumed (no configured or reported plan). */\n tierAssumed?: boolean;\n /** This account's own 5-hour remaining, 0..1 (account card only). */\n fiveHour?: number;\n /** This account's own weekly remaining, 0..1 (account card only). */\n weekly?: number;\n /** A passed reset decides a number this account contributes. */\n estimated?: boolean;\n}\n\n/** A replayed reset: what comes back, and when. Gains are in accounts' worth. */\nexport interface AqRefill {\n at: number;\n /** `5h` reset (dot), `7d` weekly reset (diamond), or a block lifting. */\n cause: '5h' | '7d' | 'release';\n /** Gain to the 5-hour measure. */\n fiveHour?: number;\n /** Gain to the weekly measure. */\n weekly?: number;\n /** Account name (titles only). */\n account?: string;\n}\n\nexport interface AqProvider {\n id: string;\n name: string;\n /** Where the numbers come from, e.g. `llmux`. */\n source?: string;\n /** Pool size in accounts' worth (tier-weighted). Nothing is computed without it. */\n total: number;\n /** Usable now (5-hour window), accounts' worth. Omit for providers without a 5-hour window. */\n fiveHour?: number;\n /** Left this week, accounts' worth. */\n weekly?: number;\n /** Pool state. Derived from the primary measure when omitted (see {@link poolState}). */\n state?: AqPoolState;\n /** Accounts in the pool (default `accounts.length`). */\n accountCount?: number;\n /** Accounts counted in the totals (default: accounts not paused / excluded). */\n countedAccounts?: number;\n /** Accounts left out of the totals, by reason (default: derived from `accounts`). */\n excluded?: { held?: number; unknownTier?: number; noMeasure?: number };\n /** Accounts whose numbers are estimated (default: derived). */\n estimated?: number;\n /** Accounts without a 5-hour reading (default: derived). */\n unmeasured5h?: number;\n /** Oldest measurement behind the numbers (epoch) — “measured 4h ago”, flagged past a day. */\n measuredAt?: number;\n /** Replayed resets in time order (next 7 days). */\n refills?: AqRefill[];\n accounts?: AqAccount[];\n}\n\n/**\n * A run record. `unknown` = a run whose result is not known — counted apart, never as success.\n * `running` / `waiting` = recorded, and its session is busy now (stacked as “in progress”).\n */\nexport type AqRunStatus = 'ok' | 'running' | 'waiting' | 'failed' | 'unknown';\n\nexport interface AqRun {\n at: number;\n status: AqRunStatus;\n /** Owning job (only needed in `lane.runs24h`). */\n jobId?: string;\n /** What the run was, e.g. a session headline or `Thread reply (no session)`. */\n label?: string;\n /** Error text of a failed run. */\n error?: string;\n}\n\nexport interface AqJob {\n id: string;\n name: string;\n /** Schedule in words. Derived from `expression` for common shapes when omitted. */\n schedule?: string;\n /** Raw cron expression (shown as the schedule's tooltip). */\n expression?: string;\n /** Next fire (epoch). Jobs without one are left out of the up-next queue. */\n nextRunAt?: number;\n /** Kept run records, any order. */\n runs?: AqRun[];\n /** “Past runs N” (default `runs.length`). */\n pastRuns?: number;\n /** Live state now: a running session, or one waiting for a reply. */\n state?: 'running' | 'waiting' | 'idle';\n /** History is FIFO-capped at this many runs: counts in a window it no longer covers become “≥ n”. */\n historyCap?: number;\n}\n\nexport interface AqLane {\n /** Lane title (default `CRON`). */\n title?: string;\n jobs: AqJob[];\n /** Run records of the last 24 hours for the stats and the chart. Default: every job's `runs`. */\n runs24h?: AqRun[];\n}\n\nexport interface AgentQueueData {\n /** Provider capacity. Omit to hide the section. */\n providers?: AqProvider[];\n /** Muted note beside the capacity title, e.g. `account = one top-plan account's worth · llmux`. */\n capacityNote?: string;\n /** When the capacity was read (epoch) — “updated 12s ago”, ticking. */\n fetchedAt?: number;\n /** The capacity could not be read: shown instead of the cards. */\n capacityError?: string;\n /** The scheduled-job lane. Omit to hide the section. */\n lane?: AqLane;\n /** The clock (epoch). Default `Date.now()`; countdowns tick on from it. */\n now?: number;\n /** Unit of every epoch field. Default `ms`. Capacity servers that speak epoch seconds pass `s`. */\n timeUnit?: TimeUnit;\n}\n\n// ── Units ────────────────────────────────────────────────────────────────────────────────────\n\nexport const SEC = 1000;\nexport const HOUR = 3_600_000;\nexport const DAY = 86_400_000;\nexport const H5 = 5 * HOUR;\nexport const D7 = 7 * DAY;\n/** Under this % of the total a pool reads `low` (dashboard CAP_LOW_PCT = capacity-view CAPACITY_LOW_PCT). */\nexport const LOW_PCT = 20;\nconst EPS = 1e-9;\n\n/** An epoch in the given unit as milliseconds; `undefined` for anything not finite. */\nexport function toMs(v: unknown, unit: TimeUnit = 'ms'): number | undefined {\n if (v === undefined || v === null || v === '') return undefined;\n const n = Number(v);\n if (!Number.isFinite(n)) return undefined;\n const ms = unit === 's' ? n * 1000 : n;\n // Outside the Date range (±8.64e15 ms) toISOString() throws and would blank the whole element.\n return Math.abs(ms) <= 8.64e15 ? ms : undefined;\n}\n\n/** A copy of the data with every epoch in milliseconds — the one place units are converted. */\nexport function normalize(d: AgentQueueData): AgentQueueData {\n const u = d.timeUnit ?? 'ms';\n const ms = (v: unknown) => toMs(v, u);\n return {\n ...d,\n timeUnit: 'ms',\n now: ms(d.now),\n fetchedAt: ms(d.fetchedAt),\n providers: d.providers?.map((p) => ({\n ...p,\n measuredAt: ms(p.measuredAt),\n refills: (p.refills ?? [])\n .map((e) => ({ ...e, at: ms(e.at) ?? Number.NaN }))\n .filter((e) => Number.isFinite(e.at))\n .sort((a, b) => a.at - b.at),\n accounts: p.accounts?.map((a) => ({ ...a, state: accountState(a.state), returnAt: ms(a.returnAt) })),\n })),\n lane: d.lane && {\n ...d.lane,\n jobs: (d.lane.jobs ?? []).map((j) => ({\n ...j,\n nextRunAt: ms(j.nextRunAt),\n runs: (j.runs ?? []).map((r) => ({ ...r, at: ms(r.at) ?? Number.NaN })).filter((r) => Number.isFinite(r.at)),\n })),\n runs24h: d.lane.runs24h?.map((r) => ({ ...r, at: ms(r.at) ?? Number.NaN })).filter((r) => Number.isFinite(r.at)),\n },\n };\n}\n\n// ── Text helpers ─────────────────────────────────────────────────────────────────────────────\n\n/** Tool- or user-written text as one plain line for the live region: control chars / whitespace runs → one space, capped. */\nexport function plain(s: unknown, max = 0): string {\n const t = Array.from(String(s ?? ''), (c) => (c.charCodeAt(0) < 32 || c.charCodeAt(0) === 127 ? ' ' : c))\n .join('')\n .replace(/\\s+/g, ' ')\n .trim();\n return max && t.length > max ? `${t.slice(0, max - 1)}…` : t;\n}\n\nconst pad2 = (n: number) => String(n).padStart(2, '0');\n\n/** `HH:MM` today, `M/D HH:MM` on another day (viewer's zone). */\nexport function clockLabel(atMs: number, nowMs: number): string {\n const d = new Date(atMs);\n const n = new Date(nowMs);\n const hm = `${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n return d.toDateString() === n.toDateString() ? hm : `${d.getMonth() + 1}/${d.getDate()} ${hm}`;\n}\n\n/** `HH:MM` (chart bins). */\nexport function hm(ms: number): string {\n const d = new Date(ms);\n return `${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n}\n\n/** Elapsed span, minutes floored: `<1m`, `11m`, `3h 5m`, `1d 6h` (the dashboard's capCountdown). */\nexport function spanShort(secs: number): string {\n const s = Math.max(0, Math.floor(Number(secs) || 0));\n if (s < 60) return '<1m';\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h}h ${m % 60}m`;\n return `${Math.floor(h / 24)}d ${h % 24}h`;\n}\n\n/** One decimal: `3.5`. */\nexport function fmt1(x: number): string {\n return (Math.round((Number(x) || 0) * 10) / 10).toFixed(1);\n}\n\n/** “2.37 / 2.4”, never “2.4 / 2.4 99%”: a value that rounds to the total but is not full keeps two decimals. */\nexport function fmtCount(v: number, total: number): string {\n return fmt1(v) === fmt1(total) && v < total - 0.005 ? (Math.round(v * 100) / 100).toFixed(2) : fmt1(v);\n}\n\n/** % from the raw ratio: 100% only when full; `—` without a total. */\nexport function fmtPct(v: number, total: number): string {\n if (!(total > 0)) return '—';\n const p = (v / total) * 100;\n return `${p >= 99.95 ? 100 : Math.min(99, Math.round(p))}%`;\n}\n\n// ── Capacity ─────────────────────────────────────────────────────────────────────────────────\n\nexport type MeasureKey = 'fiveHour' | 'weekly';\n\nconst gainOf = (e: AqRefill, key: MeasureKey) => Number(e[key]) || 0;\n\n/** The provider has a 5-hour window (two bars) — otherwise the weekly measure is primary. */\nexport function has5h(p: AqProvider): boolean {\n return p.fiveHour !== undefined && p.fiveHour !== null;\n}\n\n/** The measure that decides empty / low: 5-hour when present, else weekly. */\nexport function primaryKey(p: AqProvider): MeasureKey {\n return has5h(p) ? 'fiveHour' : 'weekly';\n}\n\n/** The pool's state: given, else ok / low (< 20%) / empty / unknown from the primary measure. */\nconst POOL_STATES: readonly AqPoolState[] = ['ok', 'low', 'empty', 'unknown'];\nconst ACCOUNT_STATES: readonly AqAccountState[] = ['available', 'limited', 'paused', 'spent', 'unmeasured', 'excluded'];\n\n/** Host-supplied enums are checked at the boundary: an unknown value never reaches markup. */\nexport function accountState(v: unknown): AqAccountState {\n return ACCOUNT_STATES.includes(v as AqAccountState) ? (v as AqAccountState) : 'unmeasured';\n}\n\nexport function poolState(p: AqProvider): AqPoolState {\n if (p.state && POOL_STATES.includes(p.state)) return p.state;\n const total = Number(p.total) || 0;\n const primary = Number(p[primaryKey(p)]) || 0;\n if (total <= EPS) return 'unknown';\n if (primary <= EPS) return 'empty';\n return (primary / total) * 100 < LOW_PCT ? 'low' : 'ok';\n}\n\n/** Refills whose time has come are folded into the measures they moved, so nothing past reads as “to come”. */\nexport function advanceProvider(p: AqProvider, nowMs: number): AqProvider {\n const evs = p.refills ?? [];\n const due = evs.filter((e) => e.at <= nowMs);\n if (!due.length) return p;\n const out: AqProvider = { ...p, refills: evs.filter((e) => e.at > nowMs) };\n if (has5h(p)) out.fiveHour = due.reduce((t, e) => t + gainOf(e, 'fiveHour'), Number(p.fiveHour) || 0);\n if (p.weekly !== undefined) out.weekly = due.reduce((t, e) => t + gainOf(e, 'weekly'), Number(p.weekly) || 0);\n return out;\n}\n\n/** The first gain ≥ 0.05 within 7 days that raises this measure, or null. */\nexport function nextRefill(p: AqProvider, key: MeasureKey, nowMs: number): AqRefill | null {\n for (const e of p.refills ?? []) {\n if (e.at > nowMs + D7) break;\n if (e.at > nowMs && gainOf(e, key) >= 0.05) return e;\n }\n return null;\n}\n\n/** Sum of the gains to this measure within the span (small gains are summed, never dropped). */\nexport function gainWithin(p: AqProvider, key: MeasureKey, nowMs: number, span = D7): number {\n return (p.refills ?? []).filter((e) => e.at > nowMs && e.at <= nowMs + span).reduce((t, e) => t + gainOf(e, key), 0);\n}\n\n/** Accounts that are counted but limited right now. */\nexport function limitedAccounts(p: AqProvider): AqAccount[] {\n return (p.accounts ?? []).filter((a) => a.state === 'limited');\n}\n\n/** The earliest return among the limited accounts (epoch ms), or null. */\nexport function firstReturn(p: AqProvider): number | null {\n let at: number | null = null;\n for (const a of limitedAccounts(p)) if (a.returnAt && (at === null || a.returnAt < at)) at = a.returnAt;\n return at;\n}\n\n/** When an empty pool gets something back: the first return, else the first refill of the primary measure. */\nexport function emptyReturnAt(p: AqProvider, nowMs: number): number | null {\n return firstReturn(p) ?? nextRefill(p, primaryKey(p), nowMs)?.at ?? null;\n}\n\n/** Accounts counted in the totals (not paused, not excluded). */\nexport function countedAccounts(p: AqProvider): number {\n if (p.countedAccounts !== undefined) return p.countedAccounts;\n return (p.accounts ?? []).filter((a) => a.state !== 'paused' && a.state !== 'excluded').length;\n}\n\n/** Exclusions by reason: given, else from the accounts (paused → held; excluded by its reason key). */\nexport function exclusions(p: AqProvider): { held: number; unknownTier: number; noMeasure: number } {\n if (p.excluded)\n return {\n held: p.excluded.held ?? 0,\n unknownTier: p.excluded.unknownTier ?? 0,\n noMeasure: p.excluded.noMeasure ?? 0,\n };\n const out = { held: 0, unknownTier: 0, noMeasure: 0 };\n for (const a of p.accounts ?? []) {\n if (a.state === 'paused') out.held++;\n else if (a.state === 'excluded') {\n if (a.reason === 'unknownTier') out.unknownTier++;\n else out.noMeasure++;\n }\n }\n return out;\n}\n\n/** now → 24h takes 55% of the axis (0·1·3·6·12·24h), then days to 7d. Offset in ms → 0..1. */\nexport function axisPos(offsetMs: number): number {\n const s = (Number(offsetMs) || 0) / 1000;\n if (s <= 0) return 0;\n if (s >= D7 / 1000) return 1;\n if (s <= 86400) {\n const st = [0, 3600, 10800, 21600, 43200, 86400];\n for (let i = 1; i < st.length; i++) {\n if (s <= st[i]) return (i - 1 + (s - st[i - 1]) / (st[i] - st[i - 1])) * 0.11;\n }\n }\n return 0.55 + ((s - 86400) / (6 * 86400)) * 0.45;\n}\n\nexport interface TimelineMark {\n /** `h5` = 5-hour reset (dot, label above), `wk` = weekly reset (diamond, label below). */\n c: 'h5' | 'wk';\n x0: number;\n x1: number;\n gain: number;\n n: number;\n names: string[];\n at: number;\n}\n\n/**\n * The 7-day timeline's marks at width W (px): refills that raise a measure (5h by the 5-hour gain, weekly by the\n * weekly gain); same-type marks closer than a label merge into one with a short span.\n */\nexport function timelineMarks(p: AqProvider, W: number, nowMs: number, pad = 16): TimelineMark[] {\n const X = (at: number) => pad + axisPos(at - nowMs) * (W - 2 * pad);\n const LW = W < 420 ? 46 : 64;\n const out: TimelineMark[] = [];\n for (const e of p.refills ?? []) {\n if (e.at <= nowMs || e.at > nowMs + D7) continue;\n const c = e.cause === '7d' ? 'wk' : 'h5';\n const d = c === 'wk' ? gainOf(e, 'weekly') : gainOf(e, 'fiveHour');\n if (d < 0.05) continue;\n const x = X(e.at);\n let last: TimelineMark | undefined;\n for (const q of out) if (q.c === c) last = q;\n if (last && x - (last.x0 + last.x1) / 2 < LW) {\n last.gain += d;\n last.n++;\n last.x1 = x;\n if (e.account) last.names.push(e.account);\n } else out.push({ c, x0: x, x1: x, gain: d, n: 1, names: e.account ? [e.account] : [], at: e.at });\n }\n return out;\n}\n\n// ── Lane ─────────────────────────────────────────────────────────────────────────────────────\n\nexport type RunKind = 'ok' | 'run' | 'fail' | 'unknown';\n\n/** ok → ok, running / waiting → in progress, failed → fail, anything else → unknown (never ok). */\nexport function runKind(status: unknown): RunKind {\n if (status === 'ok') return 'ok';\n if (status === 'failed') return 'fail';\n if (status === 'running' || status === 'waiting') return 'run';\n return 'unknown';\n}\n\nexport interface DayRuns {\n from: number;\n runs: Array<{ at: number; kind: 'ok' | 'run' | 'fail' }>;\n n: number;\n ok: number;\n fail: number;\n run: number;\n /** Runs with an unknown result: counted apart, never drawn, never success. */\n unknown: number;\n /** Jobs whose capped history starts inside the window: counts are lower bounds from `from`. */\n cut: Array<{ name: string; from: number; cap: number }>;\n cutFrom: number;\n}\n\n/** The last 24 hours of run records: `lane.runs24h` when given, else every job's runs. */\nexport function dayRuns(lane: AqLane, nowMs: number): DayRuns {\n const from = nowMs - DAY;\n const src = lane.runs24h ?? (lane.jobs ?? []).flatMap((j) => j.runs ?? []);\n const runs: DayRuns['runs'] = [];\n let unknown = 0;\n for (const r of src) {\n if (!(r.at >= from) || r.at > nowMs) continue;\n const k = runKind(r.status);\n if (k === 'unknown') unknown++;\n else runs.push({ at: r.at, kind: k });\n }\n const cut: DayRuns['cut'] = [];\n if (!lane.runs24h) {\n for (const j of lane.jobs ?? []) {\n const kept = j.runs ?? [];\n const cap = Number(j.historyCap) || 0;\n if (cap > 0 && kept.length >= cap) {\n const oldest = Math.min(...kept.map((r) => r.at));\n if (oldest > from) cut.push({ name: j.name, from: oldest, cap });\n }\n }\n }\n const count = (k: string) => runs.filter((r) => r.kind === k).length;\n return {\n from,\n runs,\n n: runs.length,\n ok: count('ok'),\n fail: count('fail'),\n run: count('run'),\n unknown,\n cut,\n cutFrom: cut.reduce((t, c) => Math.max(t, c.from), 0),\n };\n}\n\nexport interface RunBin {\n at: number;\n ok: number;\n run: number;\n fail: number;\n}\n\n/** 24 rolling one-hour bins ending now (each labelled by its start). */\nexport function runBins(day: DayRuns, nowMs: number): RunBin[] {\n const start = nowMs - DAY;\n const bins: RunBin[] = [];\n for (let k = 0; k < 24; k++) bins.push({ at: start + k * HOUR, ok: 0, run: 0, fail: 0 });\n for (const r of day.runs) {\n const i = Math.max(0, Math.min(23, Math.floor((r.at - start) / HOUR)));\n bins[i][r.kind]++;\n }\n return bins;\n}\n\nexport const NICE = [\n 4, 6, 8, 10, 12, 16, 20, 24, 30, 40, 50, 60, 80, 100, 120, 160, 200, 300, 400, 500, 600, 800, 1000,\n];\n\n/** Chart y max: max(peak, 4) rounded up to a nice value. */\nexport function niceMax(peak: number): number {\n const top = Math.max(Number(peak) || 0, 4);\n return NICE.find((v) => v >= top) ?? Math.ceil(top / 500) * 500;\n}\n\nconst newest = (j: AqJob) => (j.runs ?? []).reduce((t, r) => Math.max(t, r.at), 0);\n\n/** Lane order: waiting for a reply, then running, then the newest run, then the next fire, then the name. */\nexport function orderJobs(jobs: AqJob[]): AqJob[] {\n return jobs.slice().sort((a, b) => {\n const aw = a.state === 'waiting';\n const bw = b.state === 'waiting';\n if (aw !== bw) return aw ? -1 : 1;\n const ar = a.state === 'running';\n const br = b.state === 'running';\n if (ar !== br) return ar ? -1 : 1;\n const al = newest(a);\n const bl = newest(b);\n if (al !== bl) return bl - al;\n const an = a.nextRunAt ?? Number.POSITIVE_INFINITY;\n const bn = b.nextRunAt ?? Number.POSITIVE_INFINITY;\n if (an !== bn) return an - bn;\n return String(a.name).localeCompare(String(b.name));\n });\n}\n\n/** The up-next queue: jobs with a next fire, soonest first. */\nexport function upNext(jobs: AqJob[]): AqJob[] {\n return jobs\n .filter((j) => j.nextRunAt !== undefined && Number.isFinite(j.nextRunAt))\n .sort((a, b) => (a.nextRunAt as number) - (b.nextRunAt as number));\n}\n\n/** A job's runs, newest first. */\nexport function jobRuns(j: AqJob): AqRun[] {\n return (j.runs ?? []).slice().sort((a, b) => b.at - a.at);\n}\n\n/**\n * Schedule in words for the common cron shapes; anything else stays the raw expression. Clock times read in\n * the viewer's zone from the next fire (the expression is UTC).\n */\nexport function scheduleLabel(\n expr: string | undefined,\n nextRunAt: number | undefined,\n lang: 'en' | 'ko' = 'en',\n): string {\n const raw = String(expr ?? '').trim();\n const f = raw.split(/ +/);\n if (f.length !== 5) return raw;\n const [min, hour, dom, mon, dow] = f;\n const every = /^[*][/]([0-9]+)$/;\n const num = /^[0-9]+$/;\n const ko = lang === 'ko';\n let m: RegExpExecArray | null;\n if (hour === '*' && dom === '*' && mon === '*' && dow === '*') {\n m = every.exec(min);\n if (m) return ko ? `${m[1]}분마다` : `Every ${m[1]} min`;\n if (min === '*') return ko ? '매분' : 'Every minute';\n if (num.test(min))\n return Number(min) === 0\n ? ko\n ? '매시 정각'\n : 'Hourly'\n : ko\n ? `매시 ${Number(min)}분`\n : `Hourly at :${pad2(Number(min))}`;\n }\n if (dom === '*' && mon === '*' && dow === '*' && num.test(min)) {\n m = every.exec(hour);\n if (m) return ko ? `${m[1]}시간마다` : `Every ${m[1]} h`;\n }\n if (dom === '*' && mon === '*' && num.test(min) && num.test(hour) && nextRunAt) {\n const d = new Date(nextRunAt);\n const t = `${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n if (dow === '*') return ko ? `매일 ${t}` : `Daily ${t}`;\n // A weekday set only reads in local words when the zone shift keeps the day.\n if (dow === '1-5' && d.getDay() === d.getUTCDay()) return ko ? `평일 ${t}` : `Weekdays ${t}`;\n }\n return raw;\n}\n","import { spanShort } from './logic';\n\n/** Live time phrases. `at` is the epoch the phrase counts to (or from, for `since` / `fetched`). */\nexport type TimeKind = 'left' | 'in' | 'back' | 'runs' | 'since' | 'fetched';\n\nconst en = {\n /** Time left, floored: 1d 5h · 1h 20m · 24m · 42s. */\n dur: (s: number) => {\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n const h = Math.floor(m / 60);\n if (h >= 24) return `${Math.floor(h / 24)}d ${h % 24}h`;\n if (h) return `${h}h ${m % 60}m`;\n return `${m}m`;\n },\n soon: 'soon',\n in: (x: string) => `in ${x}`,\n back: (x: string) => `back in ${x}`,\n backSoon: 'back soon',\n runs: (x: string) => `runs in ${x}`,\n runsSoon: 'runs soon',\n since: (x: string) => `${x} ago`,\n fetched: (s: number) => (s < 60 ? `updated ${s}s ago` : `updated ${Math.floor(s / 60)}m ago`),\n /** Age of a measurement, first unit only: 12m · 4h · 6d. */\n age: (s: number) => {\n const m = Math.floor(s / 60);\n const h = Math.floor(m / 60);\n return h >= 24 ? `${Math.floor(h / 24)}d` : h ? `${h}h` : `${Math.max(1, m)}m`;\n },\n\n // Capacity\n capTitle: 'LLM capacity',\n capError: (r: string) => `Couldn’t load capacity — ${r}`,\n capNone: 'No accounts in the pool',\n capAria: (n: string) => `${n} capacity`,\n source: (src: string, n: number) => `${src ? `${src} · ` : ''}${n} ${n === 1 ? 'account' : 'accounts'}`,\n pill: {\n unknown: '◌ Can’t compute',\n allLimited: '✗ All limited',\n empty: '✗ Used up',\n limited: (n: number) => `⏸ Limited ${n}`,\n low: '▲ Low',\n ok: '● Available',\n },\n disc: {\n reflected: (c: number, n: number) => `${c}/${n} reflected`,\n blocked: (b: number) => ` (${b} limited incl.)`,\n excluded: (n: number, why: string) => `excluded ${n} (${why})`,\n held: 'held',\n unknownTier: 'no tier',\n noMeasure: 'no measure',\n assumed: (n: number, tier: string) => `no tier ${n} (${tier} assumed)`,\n estimated: (n: number) => `estimated ${n}`,\n unmeasured: (n: number) => `5h unmeasured ${n}`,\n measured: (a: string) => `measured ${a} ago`,\n },\n bar: {\n fiveHour: '5-hour',\n fiveHourSub: 'available now',\n weekly: 'Weekly',\n weeklySub: 'left this week',\n of: (total: string) => `/ ${total} accounts`,\n said: (label: string, v: string, total: string, pct: string) => `${label} ${v} of ${total} accounts, ${pct}`,\n low: (p: number) => `Below ${p}% the pool reads low`,\n next: (gain: string) => `next +${gain} · `,\n heldByWeekly: 'held by the weekly limit · ',\n backWithin: (g: string) => `${g} back within 7 days`,\n nothing: 'nothing returns within 7 days',\n unknown: 'Can’t compute — no countable accounts',\n },\n gain: (x: number, f: (n: number) => string) => (x <= 1e-7 ? '+0' : x < 0.05 ? '< +0.1' : `+${f(x)}`),\n cause: { '5h': '5-hour reset', '7d': 'weekly reset', release: 'block lifted' } as Record<string, string>,\n workers: 'Accounts',\n workersAria: (name: string, r: number, n: number) => `${name} accounts: ${r} of ${n} available`,\n reason: {\n weekly: 'weekly limit',\n '5h': '5-hour limit',\n model: 'model limit',\n cooldown: 'cooldown',\n paused: 'paused',\n auth: 'auth failed',\n held: 'held',\n noMeasure: 'no measure',\n unknownTier: 'no tier',\n } as Record<string, string>,\n stateWord: {\n available: 'available',\n limited: 'limited',\n paused: 'paused',\n spent: 'used up',\n unmeasured: '5h unmeasured',\n excluded: 'excluded',\n } as Record<string, string>,\n noReturn: 'no return time',\n okFold: (n: number) => `● Available ${n}`,\n okFoldAria: (n: number) => `${n} available accounts — show list`,\n tierAssumed: (t: string) => `${t} assumed`,\n noTier: 'no tier',\n card: {\n aria: (n: string) => `${n} details`,\n close: 'Close',\n now: 'Available now',\n week: 'Left this week',\n binds: 'Binds first',\n h5: '5-hour',\n wk: 'Weekly',\n state: 'State',\n returns: 'Returns',\n estimated: 'Estimated',\n estimatedSay: 'last reset counted as full',\n okTitle: 'Available',\n okAria: 'Available accounts',\n okKind: (p: string, n: number) => `${p} · ${n} ${n === 1 ? 'account' : 'accounts'}`,\n okRow: (now: string, wk: string) => `now ${now} · week ${wk}`,\n },\n tl: {\n h5: '5-hour reset',\n wk: 'Weekly reset',\n note: 'Returning over the next 7 days (accounts)',\n none5: ' — nothing within 7 days',\n small5: (g: string) => ` — ${g} within 7 days`,\n aria: 'Accounts returning over the next 7 days',\n axis: ['now', '1h', '6h', '24h', '3d', '5d', '7d'],\n mark: (w: string, gain: string, when: string, names: string) =>\n `${w} +${gain} accounts · ${when}${names ? ` · ${names}` : ''}`,\n lim: (until: string) => `All limited — until ${until}`,\n limNone: 'All limited — no return within 7 days',\n },\n news: {\n allLimited: (n: string, back: string) => `${n}: all accounts limited${back ? ` — ${back}` : ''}`,\n empty: (n: string, back: string) => `${n}: nothing usable${back ? ` — ${back}` : ''}`,\n again: (n: string, r: number, total: number) => `${n} available again — ${r}/${total} accounts`,\n low: (n: string, wk: boolean, p: number, v: string, t: string) =>\n `${n} below ${p}% ${wk ? 'this week' : 'now'} — ${v}/${t} accounts`,\n fail: (n: string, err: string) => `Cron ${n} failed${err ? `: ${err}` : ''}`,\n wait: (n: string) => `Cron ${n} needs a reply`,\n },\n\n // Lane\n laneAria: (t: string) => `${t} lane`,\n running: (n: number) => `● Running ${n}`,\n waiting: (n: number) => `▲ Needs reply ${n}`,\n stat: {\n next: 'Next run',\n running: 'Running',\n runs: 'Runs in 24h',\n fails: 'Failures · 24h',\n nextTitle: (name: string, at: string) => `Soonest next run — ${name} at ${at}`,\n none: 'Nothing scheduled',\n runningTitle: (r: number, n: number) => `${r} of ${n} jobs have a running session now`,\n unknown: (u: number) => `+${u} unknown`,\n runsTitle: (n: number, ok: number, f: number, run: number) =>\n `${n} run records in the last 24 h: ${ok} ok · ${f} failed · ${run} in progress`,\n unknownTitle: (u: number) => ` · ${u} with an unknown result not counted`,\n failsTitle: 'Failed run records in the last 24 h',\n cut: (name: string, cap: number, from: string) => `${name} keeps ${cap} runs, so its history starts at ${from}`,\n },\n queue: {\n head: 'Up next',\n headTitle: 'Jobs with a next run, soonest first',\n aria: 'Next runs in order',\n empty: 'Nothing scheduled',\n said: (name: string, when: string, i: number, n: number) => `${name}, ${when}, ${i} of ${n} — show past runs`,\n },\n job: {\n past: (n: number) => `Past runs ${n}`,\n next: (clock: string) => `next ${clock} (`,\n exprTitle: (e: string) => `${e} — cron expression (UTC)`,\n strip: (name: string, k: number, sum: string) =>\n `${name}: last ${k} runs${sum ? ` (${sum})` : ''} — show past runs`,\n noRuns: 'No runs yet',\n noRecords: 'No run records',\n running: '● Running',\n waiting: '▲ Needs reply',\n },\n run: {\n ok: 'OK',\n running: 'Running',\n waiting: 'Needs reply',\n failed: 'Failed',\n unknown: 'Result unknown',\n } as Record<string, string>,\n runCount: { ok: 'ok', run: 'in progress', fail: 'failed', unknown: 'unknown' } as Record<string, string>,\n runSum: (n: number, word: string) => `${n} ${word}`,\n chart: {\n title: 'Runs · 24 hours',\n ok: 'OK',\n run: 'In progress',\n fail: 'Failed',\n okTitle: 'Success record, session idle',\n runTitle: 'Recorded run whose session is running or waiting now',\n failTitle: 'Failed record',\n axis: ['24h ago', '12h ago', 'now'],\n col: (at: string, ok: number, f: number, r: number) => `1 h from ${at} · ok ${ok} · failed ${f} · in progress ${r}`,\n said: (n: number, ok: number, f: number, r: number) =>\n `${n} cron run records in the last 24 hours: ${ok} ok, ${f} failed, ${r} in progress`,\n peak: (at: string, n: number) => `, busiest hour from ${at} with ${n}`,\n cut: (at: string) => ` Before ${at} some job histories are truncated.`,\n unknown: (u: number) => ` ${u} runs with an unknown result are not counted.`,\n hatch: (names: string) => `${names} history is truncated here — counts may be low`,\n },\n};\n\nexport type Strings = typeof en;\n\nconst ko: Strings = {\n dur: (s: number) => {\n if (s < 60) return `${s}초`;\n const m = Math.floor(s / 60);\n const h = Math.floor(m / 60);\n if (h >= 24) return `${Math.floor(h / 24)}일 ${h % 24}시간`;\n if (h) return `${h}시간 ${m % 60}분`;\n return `${m}분`;\n },\n soon: '곧',\n in: (x) => `${x} 후`,\n back: (x) => `${x} 후 복귀`,\n backSoon: '곧 복귀',\n runs: (x) => `${x} 후 실행`,\n runsSoon: '곧 실행',\n since: (x) => `${x} 전`,\n fetched: (s) => (s < 60 ? `${s}초 전 갱신` : `${Math.floor(s / 60)}분 전 갱신`),\n age: (s) => {\n const m = Math.floor(s / 60);\n const h = Math.floor(m / 60);\n return h >= 24 ? `${Math.floor(h / 24)}일` : h ? `${h}시간` : `${Math.max(1, m)}분`;\n },\n\n capTitle: 'LLM 가용량',\n capError: (r) => `가용량을 불러오지 못했습니다 — ${r}`,\n capNone: '풀에 계정이 없습니다',\n capAria: (n) => `${n} 가용량`,\n source: (src, n) => `${src ? `${src} · ` : ''}계정 ${n}`,\n pill: {\n unknown: '◌ 계산 불가',\n allLimited: '✗ 모두 막힘',\n empty: '✗ 소진',\n limited: (n) => `⏸ 제한 ${n}`,\n low: '▲ 부족',\n ok: '● 사용 가능',\n },\n disc: {\n reflected: (c, n) => `${c}/${n} 반영`,\n blocked: (b) => `(차단 ${b} 포함)`,\n excluded: (n, why) => `제외 ${n}(${why})`,\n held: '보류',\n unknownTier: '티어 미지정',\n noMeasure: '측정 없음',\n assumed: (n, tier) => `티어 미지정 ${n}(${tier} 가정)`,\n estimated: (n) => `추정 ${n}`,\n unmeasured: (n) => `5시간 측정 없음 ${n}`,\n measured: (a) => `측정 ${a} 전`,\n },\n bar: {\n fiveHour: '5시간',\n fiveHourSub: '지금 쓸 수 있음',\n weekly: '일주일',\n weeklySub: '이번 주 남음',\n of: (total) => `/ ${total} 계정`,\n said: (label, v, total, pct) => `${label} ${v} / ${total} 계정, ${pct}`,\n low: (p) => `${p}% 아래면 부족`,\n next: (gain) => `다음 +${gain}계정 · `,\n heldByWeekly: '일주일 한도에 묶임 · ',\n backWithin: (g) => `7일 안 ${g} 회복`,\n nothing: '7일 안에 늘어날 양 없음',\n unknown: '계산 불가 — 셀 수 있는 계정이 없음',\n },\n gain: (x, f) => (x <= 1e-7 ? '+0' : x < 0.05 ? '+0.1계정 미만' : `+${f(x)}계정`),\n cause: { '5h': '5시간 리셋', '7d': '일주일 리셋', release: '차단 해제' },\n workers: '계정',\n workersAria: (name, r, n) => `${name} 계정 ${r}/${n} 사용 가능`,\n reason: {\n weekly: '주간 한도',\n '5h': '5시간 한도',\n model: '모델 한도',\n cooldown: '쿨다운',\n paused: '일시정지',\n auth: '인증 실패',\n held: '보류',\n noMeasure: '측정 없음',\n unknownTier: '티어 미지정',\n },\n stateWord: {\n available: '사용 가능',\n limited: '차단',\n paused: '보류',\n spent: '소진',\n unmeasured: '5시간 미측정',\n excluded: '제외',\n },\n noReturn: '복귀 약속 없음',\n okFold: (n) => `● 사용 가능 ${n}`,\n okFoldAria: (n) => `사용 가능 계정 ${n}개 — 목록 보기`,\n tierAssumed: (t) => `${t} 가정`,\n noTier: '티어 미지정',\n card: {\n aria: (n) => `${n} 세부`,\n close: '닫기',\n now: '지금 쓸 수 있음',\n week: '이번 주 남음',\n binds: '먼저 닿는 창',\n h5: '5시간',\n wk: '일주일',\n state: '상태',\n returns: '복귀',\n estimated: '추정',\n estimatedSay: '지난 리셋을 가득으로 침',\n okTitle: '사용 가능',\n okAria: '사용 가능 계정 세부',\n okKind: (p, n) => `${p} · 계정 ${n}`,\n okRow: (now, wk) => `지금 ${now} · 이번 주 ${wk}`,\n },\n tl: {\n h5: '5시간 리셋',\n wk: '일주일 리셋',\n note: '앞으로 7일 동안 돌아오는 양(계정)',\n none5: ' — 7일 안에 늘어날 양 없음',\n small5: (g) => ` — 7일 안 ${g}`,\n aria: '앞으로 7일 동안 돌아오는 계정',\n axis: ['지금', '1h', '6h', '24h', '3d', '5d', '7d'],\n mark: (w, gain, when, names) => `${w} +${gain}계정 · ${when}부터${names ? ` · ${names}` : ''}`,\n lim: (until) => `모두 막힘 — ${until}까지`,\n limNone: '모두 막힘 — 7일 안에 복귀 없음',\n },\n news: {\n allLimited: (n, back) => `${n} 계정이 모두 막힘${back ? ` — ${back}` : ''}`,\n empty: (n, back) => `${n} 쓸 수 있는 양 없음${back ? ` — ${back}` : ''}`,\n again: (n, r, total) => `${n} 다시 사용 가능 — 계정 ${r}/${total}`,\n low: (n, wk, p, v, t) => `${n} ${wk ? '이번 주' : '지금'} ${p}% 아래 — ${v}/${t} 계정`,\n fail: (n, err) => `크론 ${n} 실패${err ? `: ${err}` : ''}`,\n wait: (n) => `크론 ${n} 응답 필요`,\n },\n\n laneAria: (t) => `${t} 레인`,\n running: (n) => `● 실행 중 ${n}`,\n waiting: (n) => `▲ 응답 필요 ${n}`,\n stat: {\n next: '다음 실행',\n running: '실행 중',\n runs: '24시간 실행 기록',\n fails: '실패 · 24시간',\n nextTitle: (name, at) => `가장 이른 다음 실행 — ${name} ${at}`,\n none: '예정 없음',\n runningTitle: (r, n) => `잡 ${n}개 중 지금 세션이 실행 중인 잡 ${r}개`,\n unknown: (u) => `+미확인 ${u}`,\n runsTitle: (n, ok, f, run) =>\n `지난 24시간 실행 기록 ${n}건: 성공(세션 쉼) ${ok} · 실패 ${f} · 진행 중(세션이 지금 실행 중·응답 대기) ${run}`,\n unknownTitle: (u) => ` · 결과 미확인 ${u}건은 세지 않음`,\n failsTitle: '지난 24시간 실패 기록',\n cut: (name, cap, from) => `${name} 기록은 보관 한도 ${cap}회라 ${from}부터`,\n },\n queue: {\n head: '다음 실행',\n headTitle: '다음 실행이 있는 잡, 이른 순',\n aria: '다음 실행 순서',\n empty: '예정 없음',\n said: (name, when, i, n) => `${name}, ${when}, ${i}/${n} — 지난 실행 보기`,\n },\n job: {\n past: (n) => `지난 실행 ${n}`,\n next: (clock) => `다음 ${clock} (`,\n exprTitle: (e) => `${e} — cron 식은 UTC 기준`,\n strip: (name, k, sum) => `${name} 최근 실행 ${k}회${sum ? `(${sum})` : ''} — 지난 실행 보기`,\n noRuns: '아직 실행 없음',\n noRecords: '실행 기록 없음',\n running: '● 실행 중',\n waiting: '▲ 응답 필요',\n },\n run: { ok: '성공', running: '실행 중', waiting: '응답 필요', failed: '실패', unknown: '결과 미확인' },\n runCount: { ok: '성공', run: '진행 중', fail: '실패', unknown: '미확인' },\n runSum: (n, word) => `${word} ${n}`,\n chart: {\n title: '실행 기록 · 24시간',\n ok: '성공',\n run: '진행 중',\n fail: '실패',\n okTitle: '성공 기록, 세션 쉼',\n runTitle: '실행 기록, 세션이 지금 실행 중·응답 대기',\n failTitle: '실패 기록',\n axis: ['24시간 전', '12시간 전', '지금'],\n col: (at, ok, f, r) => `${at}부터 1시간 · 성공 ${ok} · 실패 ${f} · 진행 중 ${r}`,\n said: (n, ok, f, r) => `지난 24시간 크론 실행 기록 ${n}건: 성공 ${ok}건, 실패 ${f}건, 진행 중 ${r}건`,\n peak: (at, n) => `, 가장 많은 1시간 ${at}부터 ${n}건`,\n cut: (at) => ` ${at} 이전은 일부 잡 기록이 잘림.`,\n unknown: (u) => ` 결과 미확인 ${u}건은 세지 않음.`,\n hatch: (names) => `이 구간은 ${names} 기록이 보관 한도로 잘려 실제보다 적을 수 있음`,\n },\n};\n\nexport const STRINGS = { en, ko };\n\n/**\n * The text of a live time element. Future kinds count down (floored; `soon` at zero — never “in soon”);\n * `since` / `fetched` count up from a past epoch.\n */\nexport function timeText(kind: TimeKind, atMs: number, nowMs: number, t: Strings): string {\n if (kind === 'since') return t.since(spanShort((nowMs - atMs) / 1000));\n if (kind === 'fetched') return t.fetched(Math.max(0, Math.round((nowMs - atMs) / 1000)));\n const s = Math.floor((atMs - nowMs) / 1000);\n if (!(s > 0)) return kind === 'back' ? t.backSoon : kind === 'runs' ? t.runsSoon : t.soon;\n const d = t.dur(s);\n return kind === 'in' ? t.in(d) : kind === 'back' ? t.back(d) : kind === 'runs' ? t.runs(d) : d;\n}\n","/**\n * Ported from the soma-work dashboard: \"CRON badge · lane\", \"LLM capacity v2\" and \"Agent Queue grammar\"\n * (.prd/affectui/re-agent-queue.md D2·D5–D7·D9–D11·D16–D19). The dashboard's dark-first hexes with a light override\n * are folded into tokens: the 5-hour teal is mixed from --green and --accent, the weekly violet is --purple, and\n * warning text is --st-wait pulled toward --text so it holds 4.5:1 in light (light --st-wait alone is 3.5:1 on white).\n * Override with --ui-aq-now / --ui-aq-wk on the page.\n */\nexport const styles = `\n:host {\n --aq-now: var(--ui-aq-now, color-mix(in oklch, var(--green) 55%, var(--accent)));\n --aq-wk: var(--ui-aq-wk, var(--purple));\n --aq-warn: var(--st-wait);\n --aq-warn-text: color-mix(in srgb, var(--st-wait) 75%, var(--text));\n}\n.aq { display: grid; gap: 12px; min-width: 0; }\n\n/* ── Shared grammar: pill, countdown, column head ── */\n.aq-head { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 10px; min-width: 0; }\n.aq-name { font-size: 12px; color: var(--ib-muted); white-space: nowrap; }\n.aq-pill { display: inline-flex; align-items: center; gap: 4px; min-height: 22px; padding: 2px 9px; border-radius: 999px; font-size: 12px; font-weight: 600; line-height: 1.3; white-space: nowrap; font-variant-numeric: tabular-nums; color: var(--aq-pc, var(--ib-text-2)); background: color-mix(in srgb, var(--aq-pc, var(--ib-muted)) 14%, transparent); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--aq-pc, var(--ib-muted)) 45%, transparent); }\n.aq-pill.is-ok { --aq-pc: var(--st-done); }\n.aq-pill.is-run { --aq-pc: var(--st-run); }\n.aq-pill.is-paused, .aq-pill.is-low, .aq-pill.is-wait { --aq-pc: var(--aq-warn); color: var(--aq-warn-text); }\n.aq-pill.is-empty { --aq-pc: var(--st-fail); color: var(--st-fail-text); }\n.aq-pill.is-unknown { --aq-pc: var(--ib-muted); }\n.aq-left, .aq-ago { font-variant-numeric: tabular-nums; }\n.aq-col-head { display: flex; align-items: baseline; gap: 6px; font-size: 12px; color: var(--ib-muted); }\n.aq-col-head b { color: var(--ib-text); font-weight: 600; font-variant-numeric: tabular-nums; }\n\n/* ── LLM capacity: colour is the window (teal = now · 5h, violet = this week · 7d) ── */\n.capacity { background: var(--ib-col); border-radius: 14px; padding: 12px 14px 10px; color: var(--ib-text); min-width: 0; }\n.cap-head { display: flex; align-items: baseline; flex-wrap: wrap; gap: 6px 12px; margin-bottom: 4px; }\n.cap-title { margin: 0; font-size: 12px; font-weight: 500; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ib-muted); }\n.cap-sub { font-size: 12px; color: var(--ib-text-2); }\n.cap-off { font-size: 13px; color: var(--ib-text-2); padding: 8px 0 10px; }\n.cap-prov { container: aqprov / inline-size; position: relative; background: var(--ib-card); border-radius: 12px; padding: 14px 18px 12px; margin-top: 10px; box-shadow: inset 0 0 0 1px var(--ib-card-border); min-width: 0; }\n.cap-prov.is-empty { box-shadow: inset 0 0 0 1px var(--st-fail); }\n.cap-prov.is-low { box-shadow: inset 0 0 0 1px var(--st-wait); }\n.cap-pname { margin: 0; font-size: 16px; font-weight: 700; color: var(--ib-text); }\n.cap-disc { font-size: 12px; color: var(--ib-muted); margin: 2px 0 8px; }\n.cap-disc .cap-stale { color: var(--aq-warn-text); font-weight: 600; }\n/* One bar per window — label | bar | \"x / total accounts %\" — and a \"next …\" line. */\n.cap-bar-row { display: grid; grid-template-columns: 92px minmax(0, 1fr) 200px; align-items: center; gap: 4px 12px; margin: 8px 0; }\n.cap-bar-lbl { font-size: 14px; font-weight: 700; line-height: 1.2; }\n.cap-bar-lbl i { display: block; font-style: normal; font-weight: 400; font-size: 11px; color: var(--ib-muted); }\n.cap-bar-row.is-h5 .cap-bar-lbl { color: var(--aq-now); }\n.cap-bar-row.is-wk .cap-bar-lbl { color: var(--aq-wk); }\n.cap-bar { position: relative; height: 26px; border-radius: 7px; background: var(--ib-pill); overflow: hidden; }\n.cap-bar > span { display: block; height: 100%; border-radius: 7px; transition: width var(--dur-move) var(--ease-out); }\n.cap-bar-row.is-h5 .cap-bar > span { background: var(--aq-now); }\n.cap-bar-row.is-wk .cap-bar > span { background: var(--aq-wk); }\n/* The dashed line is where the pool turns low (the reference's backpressure line). */\n.cap-low { position: absolute; top: 0; bottom: 0; width: 0; border-left: 1px dashed var(--ib-text-2); opacity: 0.7; }\n.cap-bar-val { font-size: 14px; color: var(--ib-text-2); white-space: nowrap; font-variant-numeric: tabular-nums; }\n.cap-bar-val b { font-size: 19px; color: var(--ib-text); }\n.cap-bar-val em { font-style: normal; font-weight: 600; margin-left: 4px; }\n.cap-bar-next { grid-column: 2 / 4; font-size: 12px; color: var(--ib-text-2); }\n.cap-prov.is-empty .cap-bar-row.is-h5 .cap-bar-next { color: var(--st-fail-text); font-weight: 600; }\n.cap-tl-wrap { margin-top: 10px; border-top: 1px solid var(--ib-card-border); padding-top: 8px; }\n.cap-tl-h { display: flex; flex-wrap: wrap; gap: 4px 14px; font-size: 12px; color: var(--ib-text-2); }\n.cap-tl-h i { font-style: normal; }\n.cap-tl-h .is-h5 { color: var(--aq-now); }\n.cap-tl-h .is-wk { color: var(--aq-wk); }\n.cap-tl { display: block; max-width: 100%; height: auto; overflow: visible; }\n.cap-tl text { font-family: inherit; }\n.cap-tl-axis { stroke: var(--ib-muted); stroke-opacity: 0.5; stroke-width: 2; }\n.cap-tl-tick { stroke: var(--ib-card-border); }\n.cap-tl-ax { fill: var(--ib-muted); font-size: 11px; }\n.cap-tl-mk.is-h5 { fill: var(--aq-now); stroke: var(--aq-now); }\n.cap-tl-mk.is-wk { fill: var(--aq-wk); stroke: var(--aq-wk); }\n.cap-tl-mk circle, .cap-tl-mk rect { stroke: var(--ib-card); stroke-width: 1.5; }\n.cap-tl-span { stroke-width: 5; stroke-linecap: round; }\n.cap-tl-mk text { stroke: none; font-size: 12.5px; font-weight: 700; }\n.cap-tl-lim { fill: var(--st-fail); fill-opacity: 0.12; }\n.cap-tl-hatch { stroke: var(--st-fail); stroke-opacity: 0.4; stroke-width: 1.5; }\n/* Narrow card: label and value share the first line, the bar takes the full width, the next line under it. */\n@container aqprov (max-width: 599.98px) {\n .cap-bar-row { grid-template-columns: minmax(0, 1fr) auto; gap: 4px 8px; margin: 10px 0; }\n .cap-bar-lbl { grid-row: 1; grid-column: 1; align-self: baseline; }\n .cap-bar-lbl i { display: inline; margin-left: 6px; }\n .cap-bar-val { grid-row: 1; grid-column: 2; align-self: baseline; }\n .cap-bar { grid-row: 2; grid-column: 1 / -1; height: 20px; }\n .cap-bar-next { grid-row: 3; grid-column: 1 / -1; }\n .cap-bar-val b { font-size: 16px; }\n .cap-tl-h-note { display: none; }\n}\n\n/* ── Accounts as workers: state marks + the pinned account card ── */\n.aq-workers { position: relative; margin-top: 10px; padding-top: 8px; border-top: 1px solid var(--ib-card-border); }\n.aq-marks { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }\n.aq-mark { display: inline-flex; align-items: center; gap: 5px; min-height: 28px; max-width: 100%; padding: 0 9px; border-radius: 8px; border: 1px solid var(--ib-card-border); background: var(--ib-card); color: var(--ib-text); font: inherit; font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; transition: background-color var(--dur-fade) var(--ease-out), color var(--dur-fade) var(--ease-out), border-color var(--dur-fade) var(--ease-out); }\n.aq-mark b { font-weight: 600; }\n.aq-mark .aq-g { font-size: 10px; }\n.aq-mark.is-limited { color: var(--aq-warn-text); background: color-mix(in srgb, var(--aq-warn) 12%, var(--ib-card)); border-color: color-mix(in srgb, var(--aq-warn) 50%, transparent); }\n.aq-mark.is-spent, .aq-mark.is-unmeasured, .aq-mark.is-paused { color: var(--ib-text-2); background: var(--ib-pill); }\n.aq-mark.is-excluded { color: var(--ib-muted); background: transparent; border-style: dashed; }\n.aq-mark[aria-expanded=\"true\"] { border-color: var(--ib-text-2); }\n.aq-mark:focus-visible, .aq-q:focus-visible, .aq-pop-close:focus-visible, .cron-history-btn:focus-visible, .cron-strip:focus-visible { outline: 2px solid var(--border-focus); outline-offset: 2px; }\n@media (hover: hover) and (pointer: fine) { .aq-mark:hover, .aq-q:hover { border-color: var(--ib-muted); } }\n.aq-wdot { flex: none; width: 7px; height: 7px; border-radius: 50%; }\n.aq-wdot.is-h5 { background: var(--aq-now); }\n.aq-wdot.is-wk { background: var(--aq-wk); }\n.aq-pop { position: absolute; z-index: 6; top: 100%; left: 8px; width: min(280px, calc(100% - 16px)); display: grid; gap: 10px; padding: 12px; border-radius: 12px; background: var(--ib-card); color: var(--ib-text); box-shadow: 0 0 0 1px var(--ib-card-border), var(--ib-shadow-raised); animation: aq-open var(--dur-fade) var(--ease-out); }\n.cap-prov.is-narrow .aq-pop { width: calc(100% - 24px); }\n@keyframes aq-open { from { opacity: 0; transform: translateY(-4px) scale(0.97); } to { opacity: 1; transform: none; } }\n.aq-pop-head { display: flex; align-items: center; gap: 8px; min-width: 0; }\n.aq-pop-name { font-size: 14px; font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.aq-pop-kind { flex: 1 1 auto; min-width: 0; font-size: 12px; color: var(--ib-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.aq-pop-close { flex: none; width: 28px; height: 28px; border-radius: 8px; border: 1px solid var(--ib-card-border); background: none; color: var(--ib-text-2); font: inherit; font-size: 16px; line-height: 1; cursor: pointer; }\n.aq-pop-stats { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px 12px; margin: 0; padding: 10px 12px; border-radius: 10px; background: var(--ib-col); }\n.aq-pop-stats dt { font-size: 11px; color: var(--ib-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.aq-pop-stats dd { margin: 0; font-size: 13px; font-weight: 600; font-variant-numeric: tabular-nums; overflow: hidden; text-overflow: ellipsis; }\n.aq-pop-stats .is-wide { grid-column: 1 / -1; }\n\n/* ── CRON lane = the queue ── */\n.aq-lane { container: aqlane / inline-size; background: var(--ib-col); border-radius: 14px; padding: 2px 4px 10px; color: var(--ib-text); min-width: 0; }\n.aq-lane-head { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 8px; padding: 10px 8px 8px 10px; min-height: 40px; }\n.aq-lane-ic { display: inline-flex; color: var(--ib-muted); }\n.aq-lane-ic svg { width: 14px; height: 14px; }\n.aq-lane-title { margin: 0; font-size: 12px; font-weight: 500; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ib-muted); }\n.aq-count { background: var(--ib-pill); color: var(--ib-text-2); border-radius: 6px; padding: 1px 7px; font-size: 12px; font-weight: 500; min-width: 22px; text-align: center; font-variant-numeric: tabular-nums; }\n.aq-lane-top { padding: 0 4px 10px; }\n.aq-stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); margin: 0; padding: 12px 0; border-radius: 12px; background: var(--ib-card); box-shadow: inset 0 0 0 1px var(--ib-card-border); }\n.aq-stat { display: grid; gap: 2px; min-width: 0; padding: 0 16px; }\n.aq-stat + .aq-stat { border-left: 1px solid var(--ib-card-border); }\n.aq-stat dt { font-size: 12px; color: var(--ib-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.aq-stat dd { margin: 0; font-size: 16px; font-weight: 600; color: var(--ib-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-variant-numeric: tabular-nums; }\n.aq-stat[data-kind=\"failed\"] dd { color: var(--st-fail-text); }\n.aq-of { margin-left: 4px; font-size: 13px; font-weight: 500; color: var(--ib-muted); }\n.aq-of.is-n { margin-left: 1px; }\n.aq-lane-body { display: grid; grid-template-columns: clamp(188px, 26%, 236px) minmax(0, 1fr); gap: 10px; align-items: start; padding: 0 4px; }\n.aq-queue { display: flex; flex-direction: column; gap: 6px; min-width: 0; padding: 10px; border-radius: 12px; border: 1px solid var(--ib-card-border); background: color-mix(in srgb, var(--ib-card) 45%, transparent); }\n.aq-q { display: flex; align-items: center; gap: 6px; min-height: 28px; padding: 0 8px; border-radius: 8px; border: 1px solid var(--ib-card-border); background: var(--ib-card); color: var(--ib-text); font: inherit; font-size: 12.5px; text-align: left; cursor: pointer; }\n.aq-q.is-new { animation: aq-in var(--dur-fade) var(--ease-out); }\n.aq-q svg { flex: none; width: 12px; height: 12px; color: var(--ib-muted); }\n.aq-q-name { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.aq-q .aq-left { flex: none; font-size: 11.5px; color: var(--ib-muted); }\n.aq-more { align-self: flex-start; padding: 1px 8px; border-radius: 6px; background: var(--ib-pill); color: var(--ib-text-2); font-size: 11px; font-weight: 600; font-variant-numeric: tabular-nums; }\n.aq-empty { padding: 4px 2px; font-size: 12px; color: var(--ib-muted); }\n@keyframes aq-in { from { opacity: 0; } to { opacity: 1; } }\n\n/* Job cards (CRON tiles) */\n.cron-groups { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 320px), 1fr)); gap: 10px; align-items: start; min-width: 0; }\n.cron-group { position: relative; display: flex; flex-direction: column; gap: 8px; min-width: 0; padding: 10px; border-radius: 12px; border: 1px dashed var(--ib-card-border); background: color-mix(in srgb, var(--ib-card) 45%, transparent); transition: border-color 150ms ease; }\n.cron-group.is-running { border-style: solid; border-color: color-mix(in srgb, var(--st-run) 55%, transparent); }\n.cron-group.is-waiting { border-style: solid; border-color: var(--st-wait); }\n.cron-tile { display: flex; flex-direction: column; gap: 6px; min-width: 0; --st-color: var(--ib-text-2); }\n.cron-group.is-running .cron-tile { --st-color: var(--st-run); }\n.cron-group.is-waiting .cron-tile { --st-color: var(--aq-warn-text); }\n.cron-tile-head { display: flex; align-items: center; gap: 8px; min-width: 0; }\n.cron-badge { flex-shrink: 0; display: inline-flex; align-items: center; gap: 4px; padding: 1px 7px 1px 5px; border-radius: 999px; font-size: 11px; font-weight: 700; letter-spacing: 0.06em; line-height: 1.5; color: var(--st-color, var(--ib-text-2)); background: color-mix(in srgb, var(--st-color, var(--ib-muted)) 14%, transparent); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--st-color, var(--ib-muted)) 45%, transparent); }\n.cron-badge svg { width: 12px; height: 12px; }\n.cron-name { flex: 1 1 auto; min-width: 0; font-size: 14px; font-weight: 600; color: var(--ib-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.cron-history-btn { flex-shrink: 0; margin-left: auto; min-height: 28px; padding: 2px 10px; border-radius: 8px; border: 1px solid var(--ib-card-border); background: var(--ib-card); color: var(--ib-text-2); font: inherit; font-size: 12px; cursor: pointer; transition: transform var(--dur-press) var(--ease-out), border-color 150ms ease; }\n.cron-history-btn:active:not(:focus-visible) { transform: scale(0.97); }\n@media (hover: hover) and (pointer: fine) { .cron-history-btn:hover { border-color: var(--ib-muted); color: var(--ib-text); } }\n.cron-sched { display: flex; flex-wrap: wrap; gap: 2px 10px; font-size: 12px; color: var(--ib-text-2); font-variant-numeric: tabular-nums; }\n.cron-expr { color: var(--ib-text); }\n.cron-strip { display: flex; align-items: flex-end; gap: 3px; height: 22px; padding: 2px 0; border: 0; border-radius: 4px; background: none; cursor: pointer; width: max-content; max-width: 100%; }\n.cron-strip.is-empty { cursor: default; font-size: 12px; color: var(--ib-muted); height: auto; }\n.cr-tick { display: block; flex: none; width: 8px; height: 16px; border-radius: 2px; background: var(--st-done); }\n.cr-tick.is-fail { background: var(--st-fail); height: 18px; }\n.cr-tick.is-none { background: transparent; box-shadow: inset 0 0 0 1.5px var(--ib-muted); }\n.cr-tick.is-run { background: var(--st-run); }\n.cr-tick.is-wait { background: var(--st-wait); }\n@keyframes cr-pulse { 50% { opacity: 0.45; } }\n@media (prefers-reduced-motion: no-preference) { .cr-tick.is-run { animation: cr-pulse 1.6s ease-in-out infinite; } }\n.cron-status { font-size: 12px; color: var(--ib-text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.cron-status.is-run { color: var(--st-run); font-weight: 600; }\n.cron-status.is-wait { color: var(--aq-warn-text); font-weight: 600; }\n.cron-status.is-fail { color: var(--st-fail-text); }\n\n/* 24 hours of runs */\n.aq-chart { margin: 10px 4px 0; padding: 12px 14px 10px; border-radius: 12px; background: var(--ib-card); box-shadow: inset 0 0 0 1px var(--ib-card-border); }\n.aq-chart-head { display: flex; align-items: baseline; flex-wrap: wrap; gap: 4px 8px; margin-bottom: 10px; font-size: 12px; }\n.aq-chart-title { font-weight: 500; color: var(--ib-text); }\n.aq-chart-title + .aq-ch-key { margin-left: auto; }\n.aq-ch-key { display: inline-flex; align-items: center; gap: 4px; font-size: 11px; color: var(--ib-text-2); }\n.aq-ch-key i { width: 8px; height: 8px; border-radius: 2px; }\n.aq-ch-key i.is-ok { background: var(--st-done); }\n.aq-ch-key i.is-run { background: var(--st-run); }\n.aq-ch-key i.is-fail { background: var(--st-fail); }\n.aq-plot { position: relative; height: 112px; margin-left: 26px; display: flex; align-items: stretch; gap: 2px; border-bottom: 1px solid var(--ib-card-border); }\n.aq-ch-grid { position: absolute; left: -26px; right: 0; top: 0; height: 0; border-top: 1px dashed var(--ib-pill); pointer-events: none; }\n.aq-ch-grid.is-zero { top: 100%; border-top: 0; }\n.aq-ch-grid span { position: absolute; left: 0; top: -7px; width: 20px; text-align: right; font-size: 11px; line-height: 14px; color: var(--ib-muted); font-variant-numeric: tabular-nums; }\n.aq-ch-cut { position: absolute; top: 0; bottom: 0; background: repeating-linear-gradient(-45deg, transparent 0 5px, color-mix(in srgb, var(--ib-muted) 22%, transparent) 5px 6px); }\n.aq-ch-col { position: relative; z-index: 1; flex: 1 1 0; min-width: 0; display: flex; flex-direction: column-reverse; }\n.aq-ch-ok, .aq-ch-run, .aq-ch-fail { display: block; transition: height var(--dur-expand) var(--ease-out); }\n.aq-ch-ok { background: var(--st-done); }\n.aq-ch-run { background: var(--st-run); }\n.aq-ch-fail { background: var(--st-fail); border-radius: 2px 2px 0 0; }\n.aq-ch-axis { display: flex; justify-content: space-between; margin: 6px 0 0 26px; font-size: 11px; color: var(--ib-muted); }\n\n@container aqlane (max-width: 599.98px) {\n .aq-lane-body { grid-template-columns: minmax(0, 1fr); }\n .aq-plot { height: 88px; }\n}\n@container aqlane (max-width: 560px) {\n .aq-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); row-gap: 12px; }\n .aq-stat { padding: 0 12px; }\n .aq-stat:nth-child(odd) { border-left: 0; }\n .aq-stat dd { font-size: 15px; }\n}\n@media (pointer: coarse) {\n .aq-mark, .aq-q, .cron-history-btn, .cron-strip { min-height: 44px; }\n .aq-pop-close { width: 44px; height: 44px; }\n}\n@media (prefers-reduced-motion: reduce) {\n .aq-mark, .aq-q, .aq-pop, .cap-bar > span, .aq-ch-ok, .aq-ch-run, .aq-ch-fail, .cr-tick { animation: none; transition: none; }\n}\n`;\n","import { define, UiElement } from '../../core/element';\nimport { esc, escAttr } from '../../core/html';\nimport {\n type AgentQueueData,\n type AqAccount,\n type AqJob,\n type AqLane,\n type AqPoolState,\n type AqProvider,\n type AqRun,\n type AqRunStatus,\n advanceProvider,\n axisPos,\n clockLabel,\n countedAccounts,\n D7,\n DAY,\n type DayRuns,\n dayRuns,\n emptyReturnAt,\n exclusions,\n firstReturn,\n fmt1,\n fmtCount,\n fmtPct,\n gainWithin,\n HOUR,\n has5h,\n hm,\n jobRuns,\n LOW_PCT,\n limitedAccounts,\n type MeasureKey,\n nextRefill,\n niceMax,\n normalize,\n orderJobs,\n plain,\n poolState,\n primaryKey,\n runBins,\n runKind,\n scheduleLabel,\n timelineMarks,\n upNext,\n} from './logic';\nimport { STRINGS, type Strings, type TimeKind, timeText } from './strings';\nimport { styles } from './styles';\n\n/** `ui-job-open` detail: a queue chip, a job's past-runs button or its run strip was activated. */\nexport interface AqJobOpenDetail {\n jobId: string;\n}\n\n/** `ui-account-open` detail: an account mark was opened. Cancel the event to suppress the built-in card. */\nexport interface AqAccountOpenDetail {\n providerId: string;\n accountId: string;\n}\n\nconst CLOCK_SVG =\n '<svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" aria-hidden=\"true\"><circle cx=\"8\" cy=\"8\" r=\"6\"/><path d=\"M8 4.8V8l2.2 1.4\"/></svg>';\n\nconst RUN_STATUSES: AqRunStatus[] = ['ok', 'running', 'waiting', 'failed', 'unknown'];\nconst GLYPH: Record<AqRunStatus, string> = { ok: '✓', running: '●', waiting: '▲', failed: '✗', unknown: '◌' };\nconst TICK: Record<AqRunStatus, string> = {\n ok: 'ok',\n running: 'run',\n waiting: 'wait',\n failed: 'fail',\n unknown: 'none',\n};\nconst COUNTDOWN = new Set<TimeKind>(['left', 'in', 'back', 'runs']);\n\nconst statusOf = (r: AqRun): AqRunStatus => (RUN_STATUSES.includes(r.status) ? r.status : 'unknown');\nconst pill = (tone: string, html: string) => `<span class=\"aq-pill is-${tone}\">${html}</span>`;\n/** FNV-1a, base 36: host ids become selector-safe focus keys (`data-key`) that still follow the id. */\nfunction hashId(s: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < s.length; i++) h = Math.imul(h ^ s.charCodeAt(i), 0x01000193);\n return (h >>> 0).toString(36);\n}\nconst keyOf = (kind: string, ...ids: string[]) =>\n `${kind}-${ids.map((x) => `${hashId(x)}${x.length.toString(36)}`).join('-')}`;\nconst accKey = (pid: string, aid: string | null) => (aid === null ? keyOf('ok', pid) : keyOf('acc', pid, aid));\n\n/** One polite sentence per data update for capacity (all limited > available again > under 20%), or ''. */\nexport function capacityNews(\n prev: AqProvider[] | undefined,\n next: AqProvider[] | undefined,\n nowMs: number,\n t: Strings = STRINGS.en,\n): string {\n if (!prev || !next) return '';\n const said: Array<[rank: number, msg: string]> = [];\n for (const g0 of next) {\n const p0 = prev.find((x) => x.id === g0.id);\n if (!p0) continue;\n const g = advanceProvider(g0, nowMs);\n const ns = poolState(g);\n const ps = poolState(advanceProvider(p0, nowMs));\n if (ns === ps) continue;\n const name = plain(g.name, 40);\n if (ns === 'empty') {\n const at = emptyReturnAt(g, nowMs);\n const back = at ? timeText('back', at, nowMs, t) : '';\n said.push([1, limitedAccounts(g).length ? t.news.allLimited(name, back) : t.news.empty(name, back)]);\n } else if (ps === 'empty' && ns !== 'unknown') {\n const acc = g.accounts ?? [];\n said.push([4, t.news.again(name, acc.filter((a) => a.state === 'available').length, acc.length)]);\n } else if (ps === 'ok' && ns === 'low') {\n const k = primaryKey(g);\n const v = Number(g[k]) || 0;\n said.push([5, t.news.low(name, k === 'weekly', LOW_PCT, fmtCount(v, g.total), fmt1(g.total))]);\n }\n }\n said.sort((a, b) => a[0] - b[0]);\n return said[0]?.[1] ?? '';\n}\n\n/** One polite sentence per data update for the lane (a newer failed run > a job that starts waiting), or ''. */\nexport function laneNews(prev: AqLane | undefined, next: AqLane | undefined, t: Strings = STRINGS.en): string {\n if (!prev || !next) return '';\n let fail = '';\n let wait = '';\n for (const j of next.jobs ?? []) {\n const p = (prev.jobs ?? []).find((x) => x.id === j.id);\n if (!p) continue;\n const nr = jobRuns(j)[0];\n const pr = jobRuns(p)[0];\n if (!fail && nr && nr.status === 'failed' && nr.at > (pr?.at ?? 0))\n fail = t.news.fail(plain(j.name, 60), plain(nr.error, 80));\n if (!wait && j.state === 'waiting' && p.state !== 'waiting') wait = t.news.wait(plain(j.name, 60));\n }\n return fail || wait;\n}\n\n/**\n * `<ui-agent-queue>` — capacity and the scheduled-job lane, the soma-work dashboard's adaptation of affectUI Agent\n * Queue. Provider capacity reads accounts as workers (who is usable, who is limited and when it returns); the lane\n * reads scheduled jobs as a queue (what runs next, how many run now, 24 hours of run records). Countdowns tick once\n * a second in place; state changes are spoken once in a polite live region.\n */\nexport class UiAgentQueue extends UiElement<AgentQueueData> {\n static override styles = [styles];\n static get observedAttributes() {\n return ['lang'];\n }\n\n #dirty = true;\n #m: AgentQueueData | undefined;\n #skew = 0;\n #open: { pid: string; aid: string | null } | null = null;\n #stops = new Map<string, string>();\n #width = 0;\n #ro: ResizeObserver | null = null;\n #rz = 0;\n #seenQ = new Set<string>();\n #tick = 0;\n #say = 0;\n readonly #live: HTMLElement;\n\n constructor() {\n super();\n this.#live = document.createElement('div');\n this.#live.className = 'sr-only';\n this.#live.setAttribute('aria-live', 'polite');\n this.#live.setAttribute('aria-atomic', 'true');\n this.root.append(this.#live);\n this.root.addEventListener('click', (e) => this.#onClick(e));\n this.root.addEventListener('keydown', (e) => this.#onKey(e as KeyboardEvent));\n this.root.addEventListener('focusin', (e) => this.#onFocus(e));\n }\n\n override get data(): AgentQueueData | undefined {\n return super.data;\n }\n\n override set data(value: AgentQueueData | undefined) {\n this.#dirty = true;\n super.data = value;\n }\n\n attributeChangedCallback(): void {\n this.requestRender();\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n clearInterval(this.#tick);\n this.#tick = window.setInterval(() => this.#tickNow(), 1000);\n if (!this.#ro && typeof ResizeObserver !== 'undefined') {\n // Debounced: a width transition re-renders once it settles, not on every frame.\n this.#ro = new ResizeObserver((entries) => {\n const w = entries[0]?.contentRect.width ?? 0;\n if (Math.abs(w - this.#width) < 4) return;\n clearTimeout(this.#rz);\n this.#rz = window.setTimeout(\n () => {\n this.#width = w;\n this.requestRender();\n },\n this.#width > 0 ? 120 : 0,\n );\n });\n }\n this.#ro?.observe(this);\n document.addEventListener('click', this.#onDocClick, true);\n }\n\n override disconnectedCallback(): void {\n clearInterval(this.#tick);\n this.#tick = 0;\n clearTimeout(this.#say);\n clearTimeout(this.#rz);\n this.#ro?.disconnect();\n document.removeEventListener('click', this.#onDocClick, true);\n }\n\n get #lang(): 'en' | 'ko' {\n return this.getAttribute('lang') === 'ko' ? 'ko' : 'en';\n }\n\n get #t(): Strings {\n return STRINGS[this.#lang];\n }\n\n #now(): number {\n return Date.now() + this.#skew;\n }\n\n // ── Data in ───────────────────────────────────────────────────────────────────────────────\n\n #ingest(d: AgentQueueData): void {\n const next = normalize(d);\n this.#skew = next.now !== undefined ? next.now - Date.now() : 0;\n const prev = this.#m;\n this.#m = next;\n // The open card follows its account id; an account that left closes it.\n const o = this.#open;\n if (o) {\n const p = next.providers?.find((x) => x.id === o.pid);\n if (!p || (o.aid !== null && !p.accounts?.some((a) => a.id === o.aid))) this.#open = null;\n }\n // The first data is the baseline: nothing is announced for it.\n if (prev) {\n const now = this.#now();\n const msg = [capacityNews(prev.providers, next.providers, now, this.#t), laneNews(prev.lane, next.lane, this.#t)]\n .filter(Boolean)\n .join(' · ');\n if (msg) this.#announce(msg);\n }\n }\n\n /** Cleared first, written 60 ms later: the same sentence twice is still spoken. textContent only. */\n #announce(msg: string): void {\n clearTimeout(this.#say);\n this.#live.textContent = '';\n this.#say = window.setTimeout(() => {\n this.#live.textContent = msg;\n }, 60);\n }\n\n // ── Render ────────────────────────────────────────────────────────────────────────────────\n\n protected render(): string {\n const d = this.data;\n if (!d) return '';\n if (this.#dirty || !this.#m) {\n this.#dirty = false;\n this.#ingest(d);\n }\n const m = this.#m as AgentQueueData;\n const t = this.#t;\n const now = this.#now();\n let h = '';\n if (m.providers || m.capacityError !== undefined) h += this.#capacity(m, now, t);\n if (m.lane) h += this.#lane(m.lane, now, t);\n return h ? `<div class=\"aq\">${h}</div>` : '';\n }\n\n /** A live time element; the 1 Hz tick rewrites its text in place. */\n #time(kind: TimeKind, at: number | undefined, now: number, t: Strings, cls = 'aq-left'): string {\n if (at === undefined || !Number.isFinite(at)) return '';\n const cd = COUNTDOWN.has(kind);\n return `<time class=\"${cls}\"${cd ? ' role=\"timer\"' : ''} datetime=\"${new Date(at).toISOString()}\" data-at=\"${Math.round(at)}\" data-fmt=\"${kind}\"${\n cd && at <= now ? ' data-due' : ''\n }>${esc(timeText(kind, at, now, t))}</time>`;\n }\n\n // ── Capacity ──────────────────────────────────────────────────────────────────────────────\n\n #capacity(m: AgentQueueData, now: number, t: Strings): string {\n const sub = [m.capacityNote ? esc(m.capacityNote) : '', this.#time('fetched', m.fetchedAt, now, t, 'aq-ago')]\n .filter(Boolean)\n .join(' · ');\n const head = `<div class=\"cap-head\"><h2 class=\"cap-title\">${esc(t.capTitle)}</h2>${sub ? `<span class=\"cap-sub\">${sub}</span>` : ''}</div>`;\n const open = `<section class=\"capacity\" aria-label=\"${escAttr(t.capTitle)}\">${head}`;\n if (m.capacityError !== undefined)\n return `${open}<div class=\"cap-off\">${esc(t.capError(m.capacityError || '—'))}</div></section>`;\n const ps = m.providers ?? [];\n if (!ps.length) return `${open}<div class=\"cap-off\">${esc(t.capNone)}</div></section>`;\n // The section's inner width sizes the timeline (SVG in px, labels unscaled) and folds the marks when narrow.\n const width = this.#width > 0 ? this.#width : this.clientWidth > 0 ? this.clientWidth : 900;\n const W = Math.max(260, Math.round(width) - 28 - 36);\n const narrow = W < 600;\n return `${open}<div class=\"cap-rows\">${ps\n .map((p, i) => this.#provider(advanceProvider(p, now), i, now, t, W, narrow))\n .join('')}</div></section>`;\n }\n\n #provider(p: AqProvider, idx: number, now: number, t: Strings, W: number, narrow: boolean): string {\n const state = poolState(p);\n const n = p.accountCount ?? p.accounts?.length ?? 0;\n const who = p.source || n ? `<span class=\"aq-name\">${esc(t.source(p.source ?? '', n))}</span>` : '';\n let h = `<section class=\"cap-prov is-${state}${narrow ? ' is-narrow' : ''}\" aria-label=\"${escAttr(t.capAria(p.name))}\">`;\n h += `<div class=\"aq-head\"><h3 class=\"cap-pname\">${esc(p.name)}</h3>${who}${this.#provPill(p, state, now, t)}</div>`;\n const disc = this.#disclosure(p, now, t);\n if (disc) h += `<div class=\"cap-disc\">${disc}</div>`;\n const workers = this.#workers(p, now, t, narrow);\n if (!(Number(p.total) > 0)) return `${h}<div class=\"cap-bar-next\">${esc(t.bar.unknown)}</div>${workers}</section>`;\n if (has5h(p)) h += this.#bar(p, 'fiveHour', now, t);\n if (p.weekly !== undefined && p.weekly !== null) h += this.#bar(p, 'weekly', now, t);\n h += workers;\n h += this.#timeline(p, idx, state, W, now, t);\n return `${h}</section>`;\n }\n\n /** The provider pill (D8): can't compute > all limited / used up > limited n > low > available. */\n #provPill(p: AqProvider, state: AqPoolState, now: number, t: Strings): string {\n const lim = limitedAccounts(p).length;\n if (state === 'unknown' || !(Number(p.total) > 0)) return pill('unknown', esc(t.pill.unknown));\n if (state === 'empty') {\n const at = emptyReturnAt(p, now);\n return pill(\n 'empty',\n esc(lim ? t.pill.allLimited : t.pill.empty) + (at ? ` · ${this.#time('back', at, now, t)}` : ''),\n );\n }\n if (lim) {\n const back = firstReturn(p);\n return pill('paused', esc(t.pill.limited(lim)) + (back ? ` · ${this.#time('back', back, now, t)}` : ''));\n }\n if (state === 'low') return pill('low', esc(t.pill.low));\n return pill('ok', esc(t.pill.ok));\n }\n\n /** One muted line, only what is non-zero: reflected / limited, exclusions, estimates, the measurement's age. */\n #disclosure(p: AqProvider, now: number, t: Strings): string {\n const acc = p.accounts ?? [];\n const all = p.accountCount ?? acc.length;\n const lim = limitedAccounts(p).length;\n const parts: string[] = [];\n if (all > 0) parts.push(t.disc.reflected(countedAccounts(p), all) + (lim ? t.disc.blocked(lim) : ''));\n const ex = exclusions(p);\n const why: string[] = [];\n if (ex.held) why.push(t.disc.held);\n if (ex.unknownTier) why.push(t.disc.unknownTier);\n if (ex.noMeasure) why.push(t.disc.noMeasure);\n const exN = ex.held + ex.unknownTier + ex.noMeasure;\n if (exN) parts.push(t.disc.excluded(exN, why.join('·')));\n const assumed = acc.filter((a) => a.tierAssumed && a.tier && a.state !== 'paused' && a.state !== 'excluded');\n if (assumed.length) parts.push(t.disc.assumed(assumed.length, String(assumed[0].tier)));\n const est = p.estimated ?? acc.filter((a) => a.estimated).length;\n if (est) parts.push(t.disc.estimated(est));\n const un = p.unmeasured5h ?? acc.filter((a) => a.state === 'unmeasured').length;\n if (un) parts.push(t.disc.unmeasured(un));\n let html = esc(parts.join(' · '));\n if (p.measuredAt !== undefined) {\n const age = (now - p.measuredAt) / 1000;\n const sep = html ? ' · ' : '';\n // Over a day old, the reading the bars rest on is flagged.\n if (age > 86400) html += `${sep}<b class=\"cap-stale\">${esc(`⚠ ${t.disc.measured(t.age(age))}`)}</b>`;\n else if (age > 3600) html += sep + esc(t.disc.measured(t.age(age)));\n }\n return html;\n }\n\n #bar(p: AqProvider, key: MeasureKey, now: number, t: Strings): string {\n const v = Number(p[key]) || 0;\n const total = Number(p.total) || 0;\n const frac = total > 0 ? Math.max(0, Math.min(1, v / total)) : 0;\n const five = key === 'fiveHour';\n const label = five ? t.bar.fiveHour : t.bar.weekly;\n const sub = five ? t.bar.fiveHourSub : t.bar.weeklySub;\n const vs = fmtCount(v, total);\n const ts = fmt1(total);\n const pct = fmtPct(v, total);\n const e = nextRefill(p, key, now);\n const who = e ? ` title=\"${escAttr([t.cause[e.cause] ?? '', e.account ?? ''].filter(Boolean).join(' · '))}\"` : '';\n // The dashed line is where the pool turns low (the reference's backpressure line).\n return `<div class=\"cap-bar-row is-${five ? 'h5' : 'wk'}\"><div class=\"cap-bar-lbl\">${esc(label)}<i>${esc(sub)}</i></div><div class=\"cap-bar\" role=\"img\" aria-label=\"${escAttr(\n t.bar.said(label, vs, ts, pct),\n )}\"><span style=\"width:${(frac * 100).toFixed(1)}%\"></span><i class=\"cap-low\" style=\"left:${LOW_PCT}%\" title=\"${escAttr(\n t.bar.low(LOW_PCT),\n )}\"></i></div><div class=\"cap-bar-val\"><b>${vs}</b> ${esc(t.bar.of(ts))} <em>${pct}</em></div><div class=\"cap-bar-next\"${who}>${this.#nextLine(\n p,\n key,\n now,\n t,\n )}</div></div>`;\n }\n\n /** “next +0.4 · in 22m”; another cause is named; small gains are summed, never dropped. */\n #nextLine(p: AqProvider, key: MeasureKey, now: number, t: Strings): string {\n const e = nextRefill(p, key, now);\n if (!e) {\n const small = gainWithin(p, key, now);\n return esc(small > 0.0005 ? t.bar.backWithin(t.gain(small, fmt1)) : t.bar.nothing);\n }\n const gain = esc(t.bar.next(fmt1(Number(e[key]) || 0))) + this.#time('in', e.at, now, t);\n // The 5-hour bar rising at a weekly reset is held down by the weekly limit: say so.\n if (key === 'fiveHour' && e.cause === '7d') return esc(t.bar.heldByWeekly) + gain;\n const own = key === 'fiveHour' ? e.cause === '5h' : e.cause === '7d';\n return own ? gain : `${gain} · ${esc(t.cause[e.cause] ?? '')}`;\n }\n\n #reason(a: AqAccount, t: Strings): string {\n if (a.reason) return t.reason[a.reason] ?? String(a.reason);\n return t.stateWord[a.state] ?? '';\n }\n\n #tierLabel(a: AqAccount, t: Strings): string {\n if (!a.tier) return t.noTier;\n return a.tierAssumed ? t.tierAssumed(a.tier) : a.tier;\n }\n\n /** The workers strip (D10): one mark per account in the given order, one tab stop; narrow folds the usable ones. */\n #workers(p: AqProvider, now: number, t: Strings, narrow: boolean): string {\n const acc = p.accounts ?? [];\n if (!acc.length) return '';\n const okN = acc.filter((a) => a.state === 'available').length;\n const rove = keyOf('cap', p.id);\n const items: Array<{ key: string; a: AqAccount | null }> = [];\n let folded = false;\n for (const a of acc) {\n if (narrow && a.state === 'available') {\n if (!folded) items.push({ key: accKey(p.id, null), a: null });\n folded = true;\n continue;\n }\n items.push({ key: accKey(p.id, a.id), a });\n }\n const keys = items.map((i) => i.key);\n const want = this.#stops.get(rove);\n const stop = want && keys.includes(want) ? want : keys[0];\n const o = this.#open;\n const open = o && o.pid === p.id ? accKey(p.id, o.aid) : null;\n const marks = items\n .map((it) => {\n if (it.a) return this.#mark(p, it.a, it.key, now, t, open === it.key, stop === it.key);\n return `<button type=\"button\" class=\"aq-mark is-available\" data-key=\"${escAttr(it.key)}\" data-pid=\"${escAttr(\n p.id,\n )}\" data-rove-item tabindex=\"${it.key === stop ? 0 : -1}\" aria-haspopup=\"dialog\" aria-expanded=\"${\n open === it.key\n }\" aria-label=\"${escAttr(t.okFoldAria(okN))}\">${esc(t.okFold(okN))}</button>`;\n })\n .join('');\n const card = open && o && keys.includes(open) ? this.#card(p, o.aid, open, now, t) : '';\n return `<div class=\"aq-workers\" role=\"group\" aria-label=\"${escAttr(t.workersAria(p.name, okN, acc.length))}\" data-rove=\"${escAttr(\n rove,\n )}\"><div class=\"aq-col-head\"><span>${esc(t.workers)}</span> <b>${okN}/${acc.length}</b></div><div class=\"aq-marks\">${marks}</div>${card}</div>`;\n }\n\n #mark(p: AqProvider, a: AqAccount, key: string, now: number, t: Strings, open: boolean, stop: boolean): string {\n const why = this.#reason(a, t);\n const said = [a.name, a.tier ? this.#tierLabel(a, t) : '', why];\n let body = `<b>${esc(a.name)}</b>`;\n if (a.state === 'available') {\n body = `<i class=\"aq-wdot is-${a.binding === '5h' ? 'h5' : 'wk'}\" aria-hidden=\"true\"></i>${body}`;\n } else if (a.state === 'limited') {\n body = `<span class=\"aq-g\" aria-hidden=\"true\">⏸</span>${body} · ${esc(why)} · ${\n a.returnAt ? this.#time('left', a.returnAt, now, t) : esc(t.noReturn)\n }`;\n said.push(a.returnAt ? timeText('back', a.returnAt, now, t) : t.noReturn);\n } else {\n body += ` · ${esc(why)}`;\n }\n return `<button type=\"button\" class=\"aq-mark is-${a.state}\" data-key=\"${escAttr(key)}\" data-pid=\"${escAttr(\n p.id,\n )}\" data-aid=\"${escAttr(a.id)}\" data-rove-item tabindex=\"${stop ? 0 : -1}\" aria-haspopup=\"dialog\" aria-expanded=\"${open}\" aria-label=\"${escAttr(\n said.filter(Boolean).join(', '),\n )}\">${body}</button>`;\n }\n\n /** The account card (D11): every row from the account's own fields; the folded mark's card lists the usable ones. */\n #card(p: AqProvider, aid: string | null, key: string, now: number, t: Strings): string {\n const close = `<button type=\"button\" class=\"aq-pop-close\" data-key=\"aq-pop-close\" aria-label=\"${escAttr(t.card.close)}\">×</button>`;\n const row = (dt: string, dd: string, wide = false) =>\n `<div${wide ? ' class=\"is-wide\"' : ''}><dt>${esc(dt)}</dt><dd>${dd}</dd></div>`;\n const pct = (x: number | undefined) =>\n x === undefined || x === null ? '—' : `${Math.round((Number(x) || 0) * 100)}%`;\n if (aid === null) {\n const ok = (p.accounts ?? []).filter((a) => a.state === 'available');\n return `<div class=\"aq-pop\" role=\"dialog\" aria-label=\"${escAttr(t.card.okAria)}\" data-for=\"${escAttr(key)}\"><div class=\"aq-pop-head\"><span class=\"aq-pop-name\">${esc(\n t.card.okTitle,\n )}</span><span class=\"aq-pop-kind\">${esc(t.card.okKind(p.name, ok.length))}</span>${close}</div><dl class=\"aq-pop-stats\">${ok\n .map((a) => row(a.name, esc(t.card.okRow(pct(a.fiveHour), pct(a.weekly)))))\n .join('')}</dl></div>`;\n }\n const a = p.accounts?.find((x) => x.id === aid);\n if (!a) return '';\n const counted = a.state !== 'paused' && a.state !== 'excluded';\n const rows = [row(t.card.now, counted ? pct(a.fiveHour) : '—'), row(t.card.week, counted ? pct(a.weekly) : '—')];\n if (a.binding) rows.push(row(t.card.binds, esc(a.binding === '5h' ? t.card.h5 : t.card.wk)));\n rows.push(row(t.card.state, esc(this.#reason(a, t))));\n if (a.returnAt)\n rows.push(\n row(t.card.returns, `${esc(clockLabel(a.returnAt, now))} · ${this.#time('left', a.returnAt, now, t)}`, true),\n );\n if (a.estimated) rows.push(row(t.card.estimated, esc(t.card.estimatedSay)));\n const tone =\n a.state === 'available'\n ? 'ok'\n : a.state === 'limited'\n ? 'paused'\n : a.state === 'paused' || a.state === 'excluded'\n ? 'unknown'\n : 'low';\n return `<div class=\"aq-pop\" role=\"dialog\" aria-label=\"${escAttr(t.card.aria(a.name))}\" data-for=\"${escAttr(key)}\"><div class=\"aq-pop-head\"><span class=\"aq-pop-name\">${esc(\n a.name,\n )}</span><span class=\"aq-pop-kind\">${esc(this.#tierLabel(a, t))}</span>${pill(tone, esc(this.#reason(a, t)))}${close}</div><dl class=\"aq-pop-stats\">${rows.join(\n '',\n )}</dl></div>`;\n }\n\n /** The 7-day timeline: ● 5-hour reset (label above), ◆ weekly reset (label below); all limited shades now → lift. */\n #timeline(p: AqProvider, idx: number, state: AqPoolState, W: number, now: number, t: Strings): string {\n const marks = timelineMarks(p, W, now);\n // An all-limited pool with nothing coming back still gets its axis and its shaded stretch — the blank is the point.\n if (!marks.length && state !== 'empty') return '';\n const pad = 16;\n const y0 = marks.some((b) => b.c === 'h5') ? 46 : 20;\n const h = y0 + 54;\n const X = (at: number) => pad + axisPos(at - now) * (W - 2 * pad);\n let s = `<svg class=\"cap-tl\" width=\"${W}\" height=\"${h}\" viewBox=\"0 0 ${W} ${h}\" role=\"img\" aria-label=\"${escAttr(t.tl.aria)}\">`;\n if (state === 'empty') {\n const k = primaryKey(p);\n const lift = (p.refills ?? []).find((e) => e.at > now && (Number(e[k]) || 0) > 0)?.at ?? null;\n const x1 = lift === null ? W - pad : X(lift);\n const hid = `aqh-${idx}`;\n const span = Math.max(0, x1 - pad).toFixed(1);\n const title = lift === null ? t.tl.limNone : t.tl.lim(clockLabel(lift, now));\n s += `<defs><pattern id=\"${hid}\" width=\"6\" height=\"6\" patternUnits=\"userSpaceOnUse\" patternTransform=\"rotate(45)\"><line class=\"cap-tl-hatch\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"6\"/></pattern></defs>`;\n s += `<rect class=\"cap-tl-lim\" x=\"${pad}\" y=\"0\" width=\"${span}\" height=\"${y0 + 14}\"><title>${esc(title)}</title></rect>`;\n s += `<rect x=\"${pad}\" y=\"0\" width=\"${span}\" height=\"${y0 + 14}\" fill=\"url(#${hid})\" aria-hidden=\"true\"/>`;\n }\n [0, HOUR, 6 * HOUR, DAY, 3 * DAY, 5 * DAY, D7].forEach((off, i) => {\n const x = (pad + axisPos(off) * (W - 2 * pad)).toFixed(1);\n s += `<line class=\"cap-tl-tick\" x1=\"${x}\" x2=\"${x}\" y1=\"${y0 - 6}\" y2=\"${y0 + 6}\"/>`;\n s += `<text class=\"cap-tl-ax\" x=\"${x}\" y=\"${h - 4}\" text-anchor=\"middle\">${esc(t.tl.axis[i])}</text>`;\n });\n s += `<line class=\"cap-tl-axis\" x1=\"${pad}\" x2=\"${W - pad}\" y1=\"${y0}\" y2=\"${y0}\"/>`;\n for (const b of marks) {\n const x = (b.x0 + b.x1) / 2;\n const xs = x.toFixed(1);\n s += `<g class=\"cap-tl-mk is-${b.c}\">`;\n if (b.x1 - b.x0 > 2)\n s += `<line class=\"cap-tl-span\" x1=\"${b.x0.toFixed(1)}\" x2=\"${b.x1.toFixed(1)}\" y1=\"${y0}\" y2=\"${y0}\"/>`;\n if (b.c === 'h5') s += `<circle cx=\"${xs}\" cy=\"${y0}\" r=\"6.5\"/>`;\n else\n s += `<rect x=\"${(x - 6).toFixed(1)}\" y=\"${y0 - 6}\" width=\"12\" height=\"12\" transform=\"rotate(45 ${xs} ${y0})\"/>`;\n const tx = Math.max(pad + 14, Math.min(W - pad - 14, x)).toFixed(1);\n s += `<text x=\"${tx}\" y=\"${b.c === 'h5' ? y0 - 14 : y0 + 24}\" text-anchor=\"middle\">+${fmt1(b.gain)}</text>`;\n s += `<title>${esc(\n t.tl.mark(\n b.c === 'h5' ? t.bar.fiveHour : t.bar.weekly,\n fmt1(b.gain),\n timeText('in', b.at, now, t),\n b.names.join(', '),\n ),\n )}</title></g>`;\n }\n s += '</svg>';\n // With no 5-hour gain in 7 days the ● would never appear — say so instead of a dead key.\n const soon5 = (p.refills ?? []).filter((e) => e.cause !== '7d' && e.at > now && e.at <= now + D7);\n const any5 = soon5.some((e) => (Number(e.fiveHour) || 0) >= 0.05);\n const sum5 = soon5.reduce((a, e) => a + (Number(e.fiveHour) || 0), 0);\n const note5 = any5 ? '' : sum5 > 0.0005 ? t.tl.small5(t.gain(sum5, fmt1)) : t.tl.none5;\n const key5 = has5h(p) ? `<span><i class=\"is-h5\" aria-hidden=\"true\">●</i> ${esc(t.tl.h5 + note5)}</span>` : '';\n return `<div class=\"cap-tl-wrap\"><div class=\"cap-tl-h\">${key5}<span><i class=\"is-wk\" aria-hidden=\"true\">◆</i> ${esc(\n t.tl.wk,\n )}</span><span class=\"cap-tl-h-note\">${esc(t.tl.note)}</span></div>${s}</div>`;\n }\n\n // ── Lane ──────────────────────────────────────────────────────────────────────────────────\n\n #lane(lane: AqLane, now: number, t: Strings): string {\n const jobs = orderJobs(lane.jobs ?? []);\n const title = lane.title || 'CRON';\n const running = jobs.filter((j) => j.state === 'running').length;\n const waiting = jobs.filter((j) => j.state === 'waiting').length;\n const day = dayRuns({ ...lane, jobs }, now);\n const head = `<div class=\"aq-lane-head\"><span class=\"aq-lane-ic\" aria-hidden=\"true\">${CLOCK_SVG}</span><h2 class=\"aq-lane-title\">${esc(\n title,\n )}</h2><span class=\"aq-count\">${jobs.length}</span>${running ? pill('run', esc(t.running(running))) : ''}${\n waiting ? pill('wait', esc(t.waiting(waiting))) : ''\n }</div>`;\n return `<section class=\"aq-lane\" aria-label=\"${escAttr(t.laneAria(title))}\">${head}<div class=\"aq-lane-top\">${this.#stats(\n jobs,\n day,\n now,\n t,\n )}</div><div class=\"aq-lane-body\"><div class=\"aq-queue\" role=\"group\" aria-label=\"${escAttr(t.queue.aria)}\" data-rove=\"queue\">${this.#queue(\n jobs,\n now,\n t,\n )}</div>${jobs.length ? `<div class=\"cron-groups\">${jobs.map((j) => this.#job(j, now, t, title)).join('')}</div>` : ''}</div><div class=\"aq-chart\">${this.#chart(\n day,\n now,\n t,\n )}</div></section>`;\n }\n\n /** Four numbers, each from a named field (D16): the front of the queue, running r/N, 24 h of runs and failures. */\n #stats(jobs: AqJob[], day: DayRuns, now: number, t: Strings): string {\n const front = upNext(jobs)[0];\n const lb = day.cut.length ? '≥' : '';\n const cutNote = day.cut.map((c) => t.stat.cut(c.name, c.cap, clockLabel(c.from, now))).join(' · ');\n const running = jobs.filter((j) => j.state === 'running').length;\n const stat = (label: string, value: string, title: string, kind = '') =>\n `<div class=\"aq-stat\"${kind ? ` data-kind=\"${kind}\"` : ''}><dt>${esc(label)}</dt><dd title=\"${escAttr(title)}\">${value}</dd></div>`;\n const next = front\n ? stat(\n t.stat.next,\n `${this.#time('in', front.nextRunAt, now, t)}<span class=\"aq-of\">${esc(front.name)}</span>`,\n t.stat.nextTitle(front.name, clockLabel(front.nextRunAt as number, now)),\n )\n : stat(t.stat.next, '—', t.stat.none);\n return `<dl class=\"aq-stats\">${next}${stat(\n t.stat.running,\n `${running}<span class=\"aq-of is-n\">/${jobs.length}</span>`,\n t.stat.runningTitle(running, jobs.length),\n )}${stat(\n t.stat.runs,\n `${lb}${day.n}${day.unknown ? `<span class=\"aq-of\">${esc(t.stat.unknown(day.unknown))}</span>` : ''}`,\n t.stat.runsTitle(day.n, day.ok, day.fail, day.run) +\n (day.unknown ? t.stat.unknownTitle(day.unknown) : '') +\n (cutNote ? ` · ${cutNote}` : ''),\n )}${stat(t.stat.fails, `${lb}${day.fail}`, t.stat.failsTitle + (cutNote ? ` · ${cutNote}` : ''), day.fail > 0 ? 'failed' : '')}</dl>`;\n }\n\n /** The up-next column (D17): jobs by their next run, soonest first, four chips then +N, one tab stop. */\n #queue(jobs: AqJob[], now: number, t: Strings): string {\n const list = upNext(jobs);\n const n = list.length;\n const head = `<div class=\"aq-col-head\" title=\"${escAttr(t.queue.headTitle)}\"><span>${esc(t.queue.head)}</span> <b>${n}</b></div>`;\n if (!n) return `${head}<div class=\"aq-empty\">${esc(t.queue.empty)}</div>`;\n const shown = list.slice(0, 4);\n const keys = shown.map((j) => keyOf('q', j.id));\n const want = this.#stops.get('queue');\n const stop = want && keys.includes(want) ? want : keys[0];\n // Only a chip that just joined the front of the queue fades in; a repaint does not replay it.\n const seen = this.#seenQ;\n this.#seenQ = new Set(shown.map((j) => j.id));\n return (\n head +\n shown\n .map((j, i) => {\n const at = j.nextRunAt as number;\n return `<button type=\"button\" class=\"aq-q${seen.has(j.id) ? '' : ' is-new'}\" data-job=\"${escAttr(j.id)}\" data-key=\"${escAttr(keys[i])}\" data-rove-item tabindex=\"${\n keys[i] === stop ? 0 : -1\n }\" aria-label=\"${escAttr(t.queue.said(j.name, timeText('runs', at, now, t), i + 1, n))}\">${CLOCK_SVG}<span class=\"aq-q-name\">${esc(\n j.name,\n )}</span>${this.#time('left', at, now, t)}</button>`;\n })\n .join('') +\n (n > 4 ? `<span class=\"aq-more\">+${n - 4}</span>` : '')\n );\n }\n\n #job(j: AqJob, now: number, t: Strings, badge: string): string {\n const runs = jobRuns(j);\n const sched = j.schedule ?? (j.expression ? scheduleLabel(j.expression, j.nextRunAt, this.#lang) : '');\n const next =\n j.nextRunAt !== undefined\n ? `<span class=\"cron-next\">${esc(t.job.next(clockLabel(j.nextRunAt, now)))}${this.#time('in', j.nextRunAt, now, t)})</span>`\n : '';\n const last = runs[0];\n const ls = last ? statusOf(last) : null;\n const status =\n j.state === 'waiting'\n ? esc(t.job.waiting)\n : j.state === 'running'\n ? esc(t.job.running)\n : last && ls\n ? `${GLYPH[ls]} ${esc(last.label || t.run[ls])} · ${this.#time('since', last.at, now, t)}`\n : esc(t.job.noRuns);\n const tone = j.state === 'waiting' ? 'wait' : j.state === 'running' ? 'run' : ls ? TICK[ls] : 'none';\n const cls = j.state === 'waiting' ? ' is-waiting' : j.state === 'running' ? ' is-running' : '';\n const expr = j.expression ? ` title=\"${escAttr(t.job.exprTitle(j.expression))}\"` : '';\n return `<section class=\"cron-group${cls}\" aria-label=\"${escAttr(j.name)}\"><div class=\"cron-tile\"><div class=\"cron-tile-head\"><span class=\"cron-badge\" aria-hidden=\"true\">${CLOCK_SVG}<span class=\"cron-badge-text\">${esc(\n badge,\n )}</span></span><span class=\"cron-name\" title=\"${escAttr(j.name)}\">${esc(j.name)}</span><button type=\"button\" class=\"cron-history-btn\" data-job=\"${escAttr(\n j.id,\n )}\" data-key=\"${keyOf('runs', j.id)}\">${esc(t.job.past(j.pastRuns ?? runs.length))}</button></div>${\n sched || next\n ? `<div class=\"cron-sched\">${sched ? `<span class=\"cron-expr\"${expr}>${esc(sched)}</span>` : ''}${next}</div>`\n : ''\n }${this.#strip(j, runs, now, t)}<div class=\"cron-status is-${tone}\">${status}</div></div></section>`;\n }\n\n /** The last 12 runs, oldest → newest. Every state has its own mark; the button says the counts. */\n #strip(j: AqJob, runs: AqRun[], now: number, t: Strings): string {\n const last = runs.slice(0, 12).reverse();\n if (!last.length) return `<div class=\"cron-strip is-empty\">${esc(t.job.noRecords)}</div>`;\n const counts: Record<string, number> = {};\n for (const r of last) {\n const k = runKind(r.status);\n counts[k] = (counts[k] ?? 0) + 1;\n }\n const sum = ['ok', 'run', 'fail', 'unknown']\n .filter((k) => counts[k])\n .map((k) => t.runSum(counts[k], t.runCount[k]))\n .join(', ');\n const ticks = last\n .map((r) => {\n const st = statusOf(r);\n const title = `${GLYPH[st]} ${r.label || t.run[st]} · ${clockLabel(r.at, now)} · ${timeText('since', r.at, now, t)}${\n r.error ? ` · ${plain(r.error, 200)}` : ''\n }`;\n return `<i class=\"cr-tick is-${TICK[st]}\" title=\"${escAttr(title)}\"></i>`;\n })\n .join('');\n return `<button type=\"button\" class=\"cron-strip\" data-job=\"${escAttr(j.id)}\" data-key=\"${keyOf('strip', j.id)}\" aria-label=\"${escAttr(\n t.job.strip(j.name, last.length, sum),\n )}\">${ticks}</button>`;\n }\n\n /** 24 hours of run records (D19): rolling one-hour columns ending now, ok · in progress · failed stacked. */\n #chart(day: DayRuns, now: number, t: Strings): string {\n const bins = runBins(day, now);\n let peak = 0;\n let peakAt = 0;\n for (const b of bins) {\n const s = b.ok + b.fail + b.run;\n if (s > peak) {\n peak = s;\n peakAt = b.at;\n }\n }\n const max = niceMax(peak);\n const pct = (v: number) => `${((v / max) * 100).toFixed(1)}%`;\n const start = now - DAY;\n const cut = day.cutFrom > start;\n const said =\n t.chart.said(day.n, day.ok, day.fail, day.run) +\n (peak ? t.chart.peak(hm(peakAt), peak) : '') +\n '.' +\n (cut ? t.chart.cut(clockLabel(day.cutFrom, now)) : '') +\n (day.unknown ? t.chart.unknown(day.unknown) : '');\n const hatch = cut\n ? `<div class=\"aq-ch-cut\" style=\"left:0;width:${(((day.cutFrom - start) / DAY) * 100).toFixed(1)}%\" title=\"${escAttr(\n t.chart.hatch(day.cut.map((c) => c.name).join(', ')),\n )}\"></div>`\n : '';\n const cols = bins\n .map(\n (b) =>\n `<i class=\"aq-ch-col\" title=\"${escAttr(t.chart.col(hm(b.at), b.ok, b.fail, b.run))}\"><i class=\"aq-ch-ok\" style=\"height:${pct(\n b.ok,\n )}\"></i><i class=\"aq-ch-run\" style=\"height:${pct(b.run)}\"></i><i class=\"aq-ch-fail\" style=\"height:${pct(b.fail)}\"></i></i>`,\n )\n .join('');\n const key = (cls: string, label: string, title: string) =>\n `<span class=\"aq-ch-key\" title=\"${escAttr(title)}\"><i class=\"is-${cls}\" aria-hidden=\"true\"></i>${esc(label)}</span>`;\n return `<div class=\"aq-chart-head\"><span class=\"aq-chart-title\">${esc(t.chart.title)}</span>${key('ok', t.chart.ok, t.chart.okTitle)}${key(\n 'run',\n t.chart.run,\n t.chart.runTitle,\n )}${key('fail', t.chart.fail, t.chart.failTitle)}</div><div class=\"aq-plot\" role=\"img\" aria-label=\"${escAttr(said)}\">${hatch}<div class=\"aq-ch-grid\" aria-hidden=\"true\"><span>${max}</span></div><div class=\"aq-ch-grid is-zero\" aria-hidden=\"true\"><span>0</span></div>${cols}</div><div class=\"aq-ch-axis\" aria-hidden=\"true\">${t.chart.axis\n .map((a) => `<span>${esc(a)}</span>`)\n .join('')}</div>`;\n }\n\n // ── After render ──────────────────────────────────────────────────────────────────────────\n\n protected override update(): void {\n const active = this.root.activeElement as HTMLElement | null;\n const rove = active?.closest?.<HTMLElement>('[data-rove]')?.dataset.rove ?? null;\n super.update();\n // The focused item is gone (its account left, the strip folded): its strip's tab stop — never another\n // account at the old place.\n if (rove && !this.root.activeElement) {\n const box = this.$$<HTMLElement>('[data-rove]').find((b) => b.dataset.rove === rove);\n box?.querySelector<HTMLElement>('[data-rove-item][tabindex=\"0\"]')?.focus({ preventScroll: true });\n }\n }\n\n protected override updated(): void {\n // An open key with no card any more is forgotten, so it never reopens on its own.\n if (this.#open && !this.$('.aq-pop')) this.#open = null;\n // The card sits under its mark, its left edge clamped into the strip.\n for (const pop of this.$$<HTMLElement>('.aq-pop[data-for]')) {\n const box = pop.parentElement;\n const mark = box\n ? Array.from(box.querySelectorAll<HTMLElement>('[data-rove-item]')).find(\n (m) => m.dataset.key === pop.dataset.for,\n )\n : undefined;\n if (!box || !mark) continue;\n pop.style.left = `${Math.max(8, Math.min(mark.offsetLeft, box.clientWidth - pop.offsetWidth - 8))}px`;\n pop.style.top = `${mark.offsetTop + mark.offsetHeight + 6}px`;\n }\n }\n\n /** 1 Hz: rewrite each live time's text only when it changed; a countdown reaching zero repaints once. */\n #tickNow(): void {\n if (typeof document !== 'undefined' && document.hidden) return;\n const now = this.#now();\n const t = this.#t;\n let due = false;\n for (const el of this.$$<HTMLElement>('time[data-at]')) {\n const at = Number(el.dataset.at);\n const kind = (el.dataset.fmt ?? 'left') as TimeKind;\n const txt = timeText(kind, at, now, t);\n if (el.textContent !== txt) el.textContent = txt;\n if (COUNTDOWN.has(kind) && at <= now && !el.hasAttribute('data-due')) due = true;\n }\n if (due) this.requestRender();\n }\n\n // ── Events ────────────────────────────────────────────────────────────────────────────────\n\n #focusKey(key: string): void {\n this.$$<HTMLElement>('[data-key]')\n .find((el) => el.dataset.key === key)\n ?.focus({ preventScroll: true });\n }\n\n #toggle(pid: string, aid: string | null): void {\n const key = accKey(pid, aid);\n const o = this.#open;\n if (o && o.pid === pid && o.aid === aid) {\n this.#open = null;\n this.renderNow();\n this.#focusKey(key);\n return;\n }\n if (aid !== null && !this.emit<AqAccountOpenDetail>('ui-account-open', { providerId: pid, accountId: aid })) return;\n this.#open = { pid, aid };\n this.#stops.set(keyOf('cap', pid), key);\n this.renderNow();\n this.#focusKey(key);\n }\n\n #close(refocus: boolean): void {\n const o = this.#open;\n if (!o) return;\n this.#open = null;\n this.renderNow();\n if (refocus) this.#focusKey(accKey(o.pid, o.aid));\n }\n\n #onDocClick = (e: Event): void => {\n if (this.#open && !e.composedPath().includes(this)) this.#close(false);\n };\n\n #onClick(e: Event): void {\n const el = e.target as Element | null;\n if (!el?.closest) return;\n if (el.closest('.aq-pop-close')) {\n this.#close(true);\n return;\n }\n const mark = el.closest<HTMLElement>('.aq-mark[data-pid]');\n if (mark) {\n this.#toggle(mark.dataset.pid ?? '', mark.dataset.aid ?? null);\n return;\n }\n const job = el.closest<HTMLElement>('[data-job]');\n if (job) this.emit<AqJobOpenDetail>('ui-job-open', { jobId: job.dataset.job ?? '' });\n if (this.#open && !el.closest('.aq-pop')) this.#close(false);\n }\n\n #onKey(e: KeyboardEvent): void {\n if (e.key === 'Escape' && this.#open) {\n e.preventDefault();\n e.stopPropagation();\n this.#close(true);\n return;\n }\n const el = e.target as Element | null;\n const item = el?.closest?.<HTMLElement>('[data-rove-item]');\n const box = item?.closest<HTMLElement>('[data-rove]');\n if (!item || !box) return;\n const step = ({ ArrowLeft: -1, ArrowUp: -1, ArrowRight: 1, ArrowDown: 1, Home: 'first', End: 'last' } as const)[\n e.key as 'Home'\n ] as number | 'first' | 'last' | undefined;\n if (step === undefined) return;\n const items = Array.from(box.querySelectorAll<HTMLElement>('[data-rove-item]'));\n const i = items.indexOf(item);\n if (i < 0) return;\n const j =\n step === 'first' ? 0 : step === 'last' ? items.length - 1 : Math.max(0, Math.min(items.length - 1, i + step));\n e.preventDefault();\n items.forEach((it, n) => {\n it.setAttribute('tabindex', n === j ? '0' : '-1');\n });\n items[j].focus();\n this.#stops.set(box.dataset.rove ?? '', items[j].dataset.key ?? '');\n }\n\n #onFocus(e: Event): void {\n const item = (e.target as Element | null)?.closest?.<HTMLElement>('[data-rove-item]');\n const box = item?.closest<HTMLElement>('[data-rove]');\n if (!item || !box) return;\n this.#stops.set(box.dataset.rove ?? '', item.dataset.key ?? '');\n for (const it of Array.from(box.querySelectorAll<HTMLElement>('[data-rove-item]')))\n it.setAttribute('tabindex', it === item ? '0' : '-1');\n }\n}\n\ndefine('ui-agent-queue', UiAgentQueue);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ui-agent-queue': UiAgentQueue;\n }\n}\n"],"names":["hm","ko","a"],"mappings":"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"}
|