@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-inbox.js","sources":["../src/components/agent-inbox/styles.ts","../src/components/agent-inbox/agent-inbox.ts"],"sourcesContent":["/**\n * Ported from the soma-work dashboard board (`.kanban` / `.card` / BOARD RESPONSIVE, .prd/10 §3–§5 and\n * .prd/affectui/re-agent-inbox.md D1–D10). The status-tag tints are derived from the status tokens with\n * color-mix, so one rule holds in light and dark (text on its tint ≥ 4.5:1 in both).\n */\nexport const styles = `\n:host {\n --ib-run-bg: color-mix(in srgb, var(--st-run) 16%, var(--ib-card));\n --ib-run-fg: color-mix(in srgb, var(--st-run) 70%, var(--ib-text));\n --ib-wait-bg: color-mix(in srgb, var(--st-wait) 16%, var(--ib-card));\n --ib-wait-fg: color-mix(in srgb, var(--st-wait) 70%, var(--ib-text));\n --ib-done-bg: color-mix(in srgb, var(--st-done) 16%, var(--ib-card));\n --ib-done-fg: color-mix(in srgb, var(--st-done) 70%, var(--ib-text));\n --ib-fail-bg: color-mix(in srgb, var(--st-fail) 16%, var(--ib-card));\n --ib-fail-fg: color-mix(in srgb, var(--st-fail-text) 70%, var(--ib-text));\n --ib-rest-bg: var(--ib-pill);\n --ib-rest-fg: var(--ib-text-2);\n}\n.ib { container: ib / inline-size; position: relative; }\n\n/* Board = equal columns. No overflow clip on columns: a card flying between columns stays visible. */\n.ib-board { display: grid; grid-template-columns: repeat(var(--ib-cols, 3), minmax(0, 1fr)); gap: 12px; align-items: start; }\n.ib-col { position: relative; background: var(--ib-col); border-radius: 14px; padding: 2px 4px 4px; min-width: 0; display: flex; flex-direction: column; }\n.ib-col-head { display: flex; align-items: center; gap: 8px; padding: 10px 8px 8px 10px; min-height: 40px; }\n.ib-col-spark { color: var(--ib-spark); display: inline-flex; flex-shrink: 0; }\n.ib-col-spark svg, .ib-spark svg { width: 14px; height: 14px; }\n.ib-col-name { flex: 1; min-width: 0; margin: 0; text-align: center; font-size: 12px; font-weight: 500; line-height: 1.4; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ib-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n:host([lang=\"ko\"]) .ib-col-name { letter-spacing: 0.04em; }\n.ib-count { flex-shrink: 0; 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.ib-cards { position: relative; display: flex; flex-direction: column; gap: 8px; list-style: none; margin: 0; padding: 0; }\n.ib-empty { margin: 0; text-align: center; color: var(--ib-muted); font-size: 13px; padding: 14px 8px 18px; }\n.ib-empty[hidden] { display: none; }\n\n/* List = the same columns stacked full width (same DOM). Forced with view=\"list\"; automatic below 640px. */\n:host([view=\"list\"]) .ib-board { grid-template-columns: minmax(0, 1fr); }\n:host([view=\"list\"]) .ib-col-name { flex: 0 1 auto; text-align: left; }\n:host([view=\"list\"]) .ib-summary { -webkit-line-clamp: 1; }\n:host([view=\"list\"]) .ib-empty { padding: 10px 8px 16px; }\n/* Narrow board: the columns scroll sideways inside the board (the page never scrolls sideways). */\n@container ib (max-width: 839px) {\n :host(:not([view=\"list\"])) .ib-board {\n grid-template-columns: repeat(var(--ib-cols, 3), minmax(min(300px, 84cqi), 1fr));\n overflow-x: auto; scroll-snap-type: x mandatory; overscroll-behavior-x: contain; padding-bottom: 8px;\n }\n :host(:not([view=\"list\"])) .ib-col { scroll-snap-align: start; }\n}\n@container ib (max-width: 639px) {\n :host(:not([view=\"board\"])) .ib-board { grid-template-columns: minmax(0, 1fr); overflow-x: visible; scroll-snap-type: none; padding-bottom: 0; }\n :host(:not([view=\"board\"])) .ib-col-name { flex: 0 1 auto; text-align: left; }\n :host(:not([view=\"board\"])) .ib-summary { -webkit-line-clamp: 1; }\n :host(:not([view=\"board\"])) .ib-empty { padding: 10px 8px 16px; }\n}\n\n/* ── CARD — collapsed face + in-place expansion ── */\n.ib-card {\n position: relative; background: var(--ib-card); border: 1px solid var(--ib-card-border); border-radius: 12px;\n box-shadow: var(--ib-shadow); color: var(--ib-text); transition: border-color 150ms ease, box-shadow 150ms ease;\n --st-color: var(--ib-muted);\n}\n.ib-card[data-status=\"waiting\"] { --st-color: var(--st-wait); }\n.ib-card[data-status=\"running\"] { --st-color: var(--st-run); }\n.ib-card[data-status=\"done\"] { --st-color: var(--st-done); }\n.ib-card[data-status=\"failed\"] { --st-color: var(--st-fail); }\n/* Parked cards are dimmed with colour, not opacity (opacity would fight the enter / exit fades). */\n.ib-card[data-status=\"idle\"] { background: var(--ib-card-dim); box-shadow: none; }\n.ib-card[data-status=\"idle\"] .ib-title { color: var(--ib-text-2); font-weight: 500; }\n.ib-card[data-status=\"idle\"] .ib-summary { color: var(--ib-muted); }\n.ib-card.is-flying { z-index: 5; box-shadow: var(--ib-shadow-raised); }\n.ib-card.is-exiting { position: absolute; z-index: 1; pointer-events: none; }\n.ib-face { display: block; padding: 12px 14px; border-radius: 11px; container: ibface / inline-size; }\n.ib-face[role=\"button\"] { cursor: pointer; }\n.ib-face:focus-visible { outline: 2px solid var(--border-focus); outline-offset: 2px; }\n.ib-head { display: flex; align-items: center; gap: 8px; min-width: 0; }\n.ib-spark { flex-shrink: 0; display: inline-flex; color: var(--st-color); }\n.ib-title { flex: 1 1 auto; font-size: 15px; font-weight: 600; line-height: 1.3; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ib-summary {\n margin-top: 6px; font-size: 13.5px; line-height: 1.45; color: var(--ib-text-2);\n display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; overflow-wrap: anywhere;\n}\n/* The task in progress. */\n.ib-task { margin-top: 8px; display: flex; align-items: center; gap: 6px; min-width: 0; font-size: 13px; color: var(--ib-text); background: var(--ib-pill); border-radius: 8px; padding: 5px 9px; }\n.ib-task-id { flex-shrink: 0; color: var(--ib-muted); font-variant-numeric: tabular-nums; font-size: 12px; }\n.ib-task-name { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ib-task-time { flex-shrink: 0; color: var(--ib-text-2); font-variant-numeric: tabular-nums; }\n/* Sub-agents: status dots + counts. */\n.ib-agents { margin-top: 8px; display: flex; align-items: center; gap: 7px; min-width: 0; font-size: 12.5px; color: var(--ib-text-2); }\n.ib-agents > svg { width: 14px; height: 14px; flex-shrink: 0; color: var(--ib-muted); }\n.ib-dots { display: inline-flex; align-items: center; gap: 3px; flex-shrink: 0; }\n.ib-adot { width: 7px; height: 7px; border-radius: 50%; background: var(--ib-muted); display: inline-block; }\n.ib-adot.is-running { background: var(--st-run); animation: ib-pulse 1.6s ease-in-out infinite; }\n.ib-adot.is-done { background: var(--st-done); }\n.ib-adot.is-failed { background: var(--st-fail); }\n.ib-adot.is-unknown { background: transparent; box-shadow: inset 0 0 0 1.5px var(--ib-muted); }\n.ib-dots-more { font-size: 11px; color: var(--ib-muted); margin-left: 2px; font-variant-numeric: tabular-nums; }\n.ib-agents-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-variant-numeric: tabular-nums; }\n.ib-agents-text b { color: var(--ib-text); font-weight: 600; }\n.ib-agents-text .ib-fail { color: var(--st-fail-text); font-weight: 600; }\n/* Tokens · cost. */\n.ib-usage { margin-top: 8px; display: flex; align-items: baseline; gap: 6px; flex-wrap: wrap; font-size: 13px; color: var(--ib-text-2); font-variant-numeric: tabular-nums; }\n.ib-cnt { color: var(--ib-text); font-weight: 600; }\n.ib-unit { margin-left: 3px; color: var(--ib-muted); }\n.ib-sep { color: var(--ib-muted); }\n/* Files the run made: count, newest chips, +N. */\n.ib-arts { display: flex; align-items: center; gap: 5px; margin-top: 8px; min-width: 0; overflow: hidden; }\n.ib-arts-n { display: inline-flex; align-items: center; gap: 3px; flex-shrink: 0; font-size: 11px; font-weight: 600; color: var(--ib-text-2); font-variant-numeric: tabular-nums; }\n.ib-glyph { width: 14px; height: 14px; flex-shrink: 0; }\n.ib-chip {\n display: inline-flex; align-items: center; gap: 5px; flex: 1 1 0; min-width: 0; max-width: 160px; height: 24px; padding: 0 8px;\n border: 1px solid var(--ib-card-border); border-radius: 999px; background: var(--ib-pill); color: var(--ib-text); font-size: 11.5px; line-height: 1;\n --tint: var(--text-secondary);\n}\n.ib-chip .ib-glyph { color: var(--tint); }\n.ib-chip.is-image { --tint: var(--green); }\n.ib-chip.is-html { --tint: var(--orange); }\n.ib-chip.is-audio { --tint: var(--purple); }\n.ib-chip.is-video, .ib-chip.is-pdf { --tint: var(--red); }\n.ib-chip.is-markdown { --tint: var(--accent); }\n.ib-chip-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.ib-arts-more { flex-shrink: 0; font-size: 11px; color: var(--ib-muted); }\n/* Foot: the status tag, then the metrics on the right (a narrow foot wraps them below). */\n.ib-foot { margin-top: 10px; display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; font-size: 13px; color: var(--ib-text-2); min-width: 0; }\n.ib-tag {\n display: inline-flex; align-items: center; gap: 6px; min-width: 0; max-width: 100%; flex: 0 1 auto; height: 24px; padding: 0 10px 0 8px;\n border-radius: 999px; font-size: 12.5px; font-weight: 500; white-space: nowrap; overflow: hidden; font-variant-numeric: tabular-nums;\n}\n.ib-tag[data-tone=\"run\"] { background: var(--ib-run-bg); color: var(--ib-run-fg); }\n.ib-tag[data-tone=\"wait\"] { background: var(--ib-wait-bg); color: var(--ib-wait-fg); }\n.ib-tag[data-tone=\"done\"] { background: var(--ib-done-bg); color: var(--ib-done-fg); }\n.ib-tag[data-tone=\"fail\"] { background: var(--ib-fail-bg); color: var(--ib-fail-fg); }\n.ib-tag[data-tone=\"rest\"] { background: var(--ib-rest-bg); color: var(--ib-rest-fg); }\n.ib-tag-text { overflow: hidden; text-overflow: ellipsis; }\n.ib-tag-icon { flex-shrink: 0; display: inline-flex; align-items: center; color: currentColor; }\n.ib-tag-icon svg { width: 12px; height: 12px; }\n.ib-ago { color: inherit; }\n.ib-ago::before { content: \"·\"; margin: 0 6px; }\n/* The state word (\"Running · \", \"Done in \") goes only when the face has 300px of content or less. */\n@container ibface (max-width: 300px) { .ib-tag .ib-pre { display: none; } }\n.ib-dot { width: 8px; height: 8px; border-radius: 50%; background: currentColor; display: inline-block; }\n.ib-dot.is-hollow { background: transparent; box-shadow: inset 0 0 0 1.5px currentColor; }\n/* The running ring: its track follows the tag colour, so it reads on the tint. */\n.ib-spin {\n width: 12px; height: 12px; border-radius: 50%; display: inline-block;\n border: 2px solid color-mix(in srgb, currentColor 25%, transparent); border-top-color: currentColor; border-right-color: currentColor;\n animation: ib-spin 0.9s linear infinite;\n}\n.ib-metrics { display: inline-flex; flex-wrap: wrap; justify-content: flex-end; align-items: center; row-gap: 4px; max-width: 100%; color: var(--ib-muted); flex-shrink: 0; margin-left: auto; font-variant-numeric: tabular-nums; }\n.ib-metric { display: inline-flex; align-items: center; gap: 5px; padding: 0 9px; }\n.ib-metric + .ib-metric { border-left: 1px solid var(--ib-card-border); }\n.ib-metric:last-child { padding-right: 0; }\n.ib-metric svg { width: 13px; height: 13px; }\n.ib-metric.is-warn svg { color: var(--st-wait); }\n.ib-metric.is-danger { color: var(--st-fail-text); font-weight: 600; }\n\n/* Expansion — grid row 0fr → 1fr; cards below ride the animated row. */\n.ib-expand { display: grid; grid-template-rows: 0fr; transition: grid-template-rows var(--dur-expand) var(--ease-out); }\n.ib-card.is-open .ib-expand { grid-template-rows: 1fr; }\n.ib-expand-inner { min-height: 0; overflow: hidden; opacity: 0; transition: opacity var(--dur-expand) var(--ease-out); }\n.ib-card.is-open .ib-expand-inner { opacity: 1; }\n.ib-card.no-motion .ib-expand, .ib-card.no-motion .ib-expand-inner { transition: none; }\n.ib-body { margin: 0 14px; padding: 12px 0 14px; border-top: 1px solid var(--ib-card-border); font-size: 13px; color: var(--ib-text-2); }\n/* Steps: dot + connector, the current step's dot in ink. */\n.ib-more { font-size: 12px; color: var(--ib-muted); padding: 0 0 6px 16px; }\n.ib-steps { list-style: none; margin: 0; padding: 0; }\n.ib-step { position: relative; display: flex; gap: 10px; padding: 0 0 8px 16px; line-height: 1.4; color: var(--ib-text-2); }\n.ib-step::before { content: ''; position: absolute; left: 2px; top: 6px; width: 6px; height: 6px; border-radius: 50%; background: var(--ib-muted); opacity: 0.55; }\n.ib-step::after { content: ''; position: absolute; left: 4.5px; top: 15px; bottom: 1px; width: 1px; background: var(--ib-card-border); }\n.ib-step:last-child { padding-bottom: 0; }\n.ib-step:last-child::after { display: none; }\n.ib-step.is-current { color: var(--ib-text); }\n.ib-step.is-current::before { background: var(--ib-text); opacity: 1; }\n.ib-step.is-pending { color: var(--ib-muted); }\n.ib-step-text { flex: 1; min-width: 0; overflow-wrap: anywhere; }\n.ib-step-meta { flex-shrink: 0; color: var(--ib-muted); font-size: 12.5px; font-variant-numeric: tabular-nums; }\n/* Button row: model on the left, secondary outline buttons, one ink primary last. */\n.ib-bar { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin-top: 12px; padding-top: 10px; border-top: 1px dashed var(--ib-card-border); }\n.ib-bar:first-child { margin-top: 0; padding-top: 0; border-top: 0; }\n.ib-model { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--ib-muted); font-size: 13px; }\n.ib-actions { display: flex; flex-wrap: wrap; gap: 6px; justify-content: flex-end; margin-left: auto; }\n.ib-btn {\n display: inline-flex; align-items: center; justify-content: center; background: var(--ib-card); border: 1px solid var(--ib-card-border);\n border-radius: 8px; color: var(--ib-text); font: inherit; font-size: 13px; font-weight: 500; padding: 5px 12px; min-height: 32px;\n white-space: nowrap; cursor: pointer;\n transition: background-color 150ms ease, border-color 150ms ease, color 150ms ease, opacity 150ms ease, transform var(--dur-press) var(--ease-out);\n}\n.ib-btn.is-primary { background: var(--ib-text); border-color: var(--ib-text); color: var(--ib-card); }\n.ib-btn[aria-disabled=\"true\"] { opacity: 0.5; cursor: not-allowed; }\n.ib-btn:active:not([aria-disabled=\"true\"]):not(:focus-visible) { transform: scale(0.97); }\n\n@keyframes ib-spin { to { transform: rotate(360deg); } }\n@keyframes ib-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.35; } }\n\n/* Hover — pointer devices only; colour / border, never movement. */\n@media (hover: hover) and (pointer: fine) {\n .ib-card:hover { border-color: var(--ib-muted); }\n .ib-card[data-status=\"idle\"]:hover { border-color: var(--ib-card-border); }\n .ib-btn:hover:not([aria-disabled=\"true\"]) { border-color: var(--ib-muted); }\n .ib-btn.is-primary:hover:not([aria-disabled=\"true\"]) { border-color: var(--ib-text); opacity: 0.88; }\n}\n/* 44px targets on touch and narrow screens. */\n@media (pointer: coarse), (max-width: 639px) {\n .ib-btn { min-height: 44px; padding: 8px 14px; }\n}\n/* Reduced motion: the global rule only shortens durations, so infinite loops stop here; the ring stays whole. */\n@media (prefers-reduced-motion: reduce) {\n .ib-spin { animation: none; border-color: currentColor; }\n .ib-adot.is-running { animation: none; }\n}\n`;\n","import { define, prefersReducedMotion, UiElement } from '../../core/element';\nimport { fmtAgo, fmtDuration, fmtInt, fmtUsd } from '../../core/format';\nimport { esc, escAttr } from '../../core/html';\nimport { styles } from './styles';\n\n/** Where a run stands. `waiting` = it needs the person; `idle` = parked (sleeping, archived, never started). */\nexport type InboxStatus = 'waiting' | 'running' | 'done' | 'failed' | 'idle';\n\n/** A button in an open card. A string `disabled` keeps it visible and says why it cannot be pressed. */\nexport interface InboxAction {\n id: string;\n label: string;\n disabled?: boolean | string;\n}\n\n/** One line of an open card's step list. Plain strings are steps; the last one is drawn as the current step. */\nexport interface InboxDetail {\n label: string;\n /** Right-aligned meta (time, tool calls…). */\n meta?: string;\n state?: 'done' | 'current' | 'pending';\n}\n\nexport interface InboxCard {\n id: string;\n title: string;\n /** One or two sentences: why the card is here / where it stands (clamped to two lines). */\n summary?: string;\n status: InboxStatus;\n /** Replaces the status word (e.g. `Sleeping`, `Archived`, `Retrying`). */\n statusText?: string;\n /**\n * Epoch ms the current status began. `running`: the live clock runs from here (plus `elapsedMs`);\n * every other status shows it as recency (`· 6m ago`). Without it no clock and no age are shown.\n */\n since?: number;\n /** Active time in ms: `done` shows `Done in …`; `running` adds it to the live clock (time before `since`). */\n elapsedMs?: number;\n /** The task in progress: `#id label · 3m 12s` (live from `startedAt`, else the static `elapsedMs`). */\n task?: { id?: string; label: string; startedAt?: number; elapsedMs?: number };\n /** Sub-agent counts. Dots are drawn from these counts only; the rest of `total` is drawn hollow (unknown). */\n agents?: { total: number; running?: number; done?: number; failed?: number };\n /** Total tokens (all kinds). Shown only when given. */\n tokens?: number;\n /** API-equivalent cost in USD. Shown only when given. */\n costUsd?: number;\n /** Names of the files the run made (newest first). Up to four chips + `+N`. */\n artifacts?: string[];\n /** Tasks / steps done of total, shown in the card foot. */\n steps?: { done: number; total: number };\n /** Context window used, 0–100. Above 60 warns, above 80 is danger. */\n contextPct?: number;\n /** Model (agent) name, shown at the left of the open card's button row. */\n model?: string;\n /** The one decision this viewer can make here — the card's single ink button. */\n primary?: InboxAction;\n /** Secondary buttons (outline), left of the primary. */\n actions?: InboxAction[];\n /** The open card's step list, oldest first. Over five, the earliest fold into `+N earlier`. */\n details?: Array<string | InboxDetail>;\n}\n\nexport interface InboxColumn {\n id: string;\n label: string;\n /** Shown while the column draws no cards. Default `Nothing here`. */\n emptyText?: string;\n /** Cards in display order. A card id listed twice renders once (first wins). */\n cards: InboxCard[];\n}\n\nexport interface AgentInboxData {\n columns: InboxColumn[];\n /** Card ids that start open the first time they appear. Afterwards the person's toggles rule. */\n expanded?: string[];\n /** Label of the open card's Open button (`ui-open`). `false` hides it. Default `Open` / `열기`. */\n openLabel?: string | false;\n}\n\nexport type InboxTone = 'wait' | 'run' | 'done' | 'fail' | 'rest';\n\n/** A card held in the column it is drawn in while its new status shows. */\nexport interface LaneHold {\n from: string;\n to: string;\n until: number;\n}\n\n/** How long a card whose column changed shows its new status in place before it moves. */\nexport const BOARD_HOLD_MS = 900;\n/** A burst of announcements within this window is said once. */\nexport const ANNOUNCE_MS = 1000;\nconst MAX_DOTS = 6;\nconst MAX_CHIPS = 4;\nconst MAX_DETAILS = 5;\nconst COUNT_MS = 900;\n\nconst STATUSES: readonly InboxStatus[] = ['waiting', 'running', 'done', 'failed', 'idle'];\n\nfunction agoKo(at: number, now: number = Date.now()): string {\n const s = Math.max(0, Math.floor((now - at) / 1000));\n if (s < 45) return '방금';\n const m = Math.floor(s / 60);\n if (m < 60) return `${Math.max(1, m)}분 전`;\n const h = Math.floor(m / 60);\n if (h < 48) return `${h}시간 전`;\n return `${Math.floor(h / 24)}일 전`;\n}\n\nconst STRINGS = {\n en: {\n status: {\n waiting: 'Waiting for you',\n running: 'Running',\n done: 'Done',\n failed: 'Failed',\n idle: 'Idle',\n } as Record<InboxStatus, string>,\n doneIn: 'Done in ',\n empty: 'Nothing here',\n open: 'Open',\n columns: { needs: 'Needs you', running: 'Running', done: 'Done' },\n agents: 'Sub-agents',\n agentsRunning: (n: number) => `running ${n}`,\n agentsFailed: (n: number) => `failed ${n}`,\n tok: 'tok',\n tokTitle: 'Total tokens',\n costTitle: 'API-equivalent cost',\n steps: 'Tasks done / total',\n ctx: (p: number) => `Context window used — ${p}%`,\n arts: 'Files the run made',\n earlier: (n: number) => `+${n} earlier`,\n announce: (w: number, r: number) => `${w} need${w === 1 ? 's' : ''} you, ${r} running`,\n changed: (title: string, word: string) => `${title}: ${word}.`,\n ago: (at: number, now?: number) => fmtAgo(at, now),\n },\n ko: {\n status: {\n waiting: '입력 대기',\n running: '실행 중',\n done: '완료',\n failed: '실패',\n idle: '대기',\n } as Record<InboxStatus, string>,\n doneIn: '완료 · ',\n empty: '비어 있음',\n open: '열기',\n columns: { needs: '응답 필요', running: '실행 중', done: '완료' },\n agents: '서브에이전트',\n agentsRunning: (n: number) => `실행 ${n}`,\n agentsFailed: (n: number) => `실패 ${n}`,\n tok: 'tok',\n tokTitle: '총 토큰',\n costTitle: 'API 환산 비용',\n steps: '완료한 task / 전체',\n ctx: (p: number) => `컨텍스트 ${p}% 사용`,\n arts: '모델이 만든 산출물',\n earlier: (n: number) => `이전 ${n}개 더`,\n announce: (w: number, r: number) => `응답이 필요한 세션 ${w}개, 실행 중 ${r}개`,\n changed: (title: string, word: string) => `${title}: ${word}.`,\n ago: agoKo,\n },\n};\ntype Strings = (typeof STRINGS)['en'];\n\nconst SPARK_SVG =\n '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M7 1.5c.5 3.3 2.2 5 5.5 5.5-3.3.5-5 2.2-5.5 5.5C6.5 9.2 4.8 7.5 1.5 7c3.3-.5 5-2.2 5.5-5.5z\"/><circle cx=\"13\" cy=\"12.6\" r=\"1.3\"/></svg>';\nconst WAIT_SVG = '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M8 1.8 15 14H1z\"/></svg>';\nconst FAIL_SVG =\n '<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M8 1.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13zm-.8 3h1.6v4.8H7.2zM8 12.3a1 1 0 1 1 0-2 1 1 0 0 1 0 2z\"/></svg>';\nconst TASKS_SVG =\n '<svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2.5 4.2l1.4 1.4 2.4-2.6M2.5 10.2l1.4 1.4 2.4-2.6M9 4.5h4.5M9 10.5h4.5\"/></svg>';\nconst CTX_SVG =\n '<svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" aria-hidden=\"true\"><circle cx=\"8\" cy=\"8\" r=\"5.6\"/><path d=\"M8 8V2.4A5.6 5.6 0 0 1 13.6 8z\" fill=\"currentColor\" stroke=\"none\"/></svg>';\nconst AGENTS_SVG =\n '<svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"4\" cy=\"3.5\" r=\"1.8\"/><circle cx=\"12\" cy=\"8\" r=\"1.8\"/><circle cx=\"12\" cy=\"13\" r=\"1.8\"/><path d=\"M4 5.3v5.2c0 1.4 1.1 2.5 2.5 2.5h3.7M4 8h6.2\"/></svg>';\n\nexport type ArtifactKind = 'image' | 'html' | 'markdown' | 'pdf' | 'audio' | 'video' | 'text' | 'file';\nconst ART_GLYPH: Record<ArtifactKind, string> = {\n image:\n '<rect x=\"2\" y=\"3\" width=\"12\" height=\"10\" rx=\"1.5\"/><circle cx=\"6\" cy=\"6.5\" r=\"1.2\"/><path d=\"M14 11l-3.5-3.5L4 13\"/>',\n audio: '<path d=\"M2.5 7.5v1M5 5.5v5M7.5 3v10M10 5v6M12.5 6.5v3\"/>',\n video: '<rect x=\"2\" y=\"4\" width=\"9\" height=\"8\" rx=\"1.5\"/><path d=\"M11 7l3-2v6l-3-2z\"/>',\n html: '<path d=\"M5.5 5L2.5 8l3 3M10.5 5l3 3-3 3M9 3.5l-2 9\"/>',\n markdown: '<path d=\"M4 2h5l3 3v9H4z\"/><path d=\"M6 8h4M6 10.5h4M6 5.5h1.5\"/>',\n pdf: '<path d=\"M4 2h5l3 3v9H4z\"/><path d=\"M9 2v3h3M6 10h4\"/>',\n text: '<path d=\"M3 4h10M3 7h10M3 10h7M3 13h5\"/>',\n file: '<path d=\"M4 2h5l3 3v9H4z\"/><path d=\"M9 2v3h3\"/>',\n};\nconst glyph = (k: ArtifactKind) =>\n `<svg class=\"ib-glyph\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">${ART_GLYPH[k]}</svg>`;\n\nconst num = (v: unknown): number => {\n const n = Number(v);\n return Number.isFinite(n) && n > 0 ? n : 0;\n};\nconst finite = (v: unknown): v is number => typeof v === 'number' && Number.isFinite(v);\n\n// ── Pure helpers ───────────────────────────────────────────────────────────\n\n/** The status a card is drawn with (anything unknown reads as idle). */\nexport function statusOf(card: Pick<InboxCard, 'status'>): InboxStatus {\n return STATUSES.includes(card?.status) ? card.status : 'idle';\n}\n\n/** Status → tag tone: waiting amber, running blue, done green, failed red, idle grey. */\nexport function statusTone(status: InboxStatus): InboxTone {\n return status === 'waiting'\n ? 'wait'\n : status === 'running'\n ? 'run'\n : status === 'done'\n ? 'done'\n : status === 'failed'\n ? 'fail'\n : 'rest';\n}\n\n/** Glyph kind from a file name's extension. */\nexport function artifactKind(name: string): ArtifactKind {\n const m = /\\.([a-z0-9]{1,6})$/i.exec(String(name ?? '').trim());\n const ext = m ? m[1].toLowerCase() : '';\n if (/^(png|jpe?g|gif|webp|svg|avif|bmp)$/.test(ext)) return 'image';\n if (/^html?$/.test(ext)) return 'html';\n if (/^(md|mdx|markdown)$/.test(ext)) return 'markdown';\n if (ext === 'pdf') return 'pdf';\n if (/^(mp3|wav|m4a|ogg|flac|aac)$/.test(ext)) return 'audio';\n if (/^(mp4|mov|webm|mkv)$/.test(ext)) return 'video';\n if (/^(txt|log|csv|json|ya?ml|xml)$/.test(ext)) return 'text';\n return 'file';\n}\n\n/**\n * Sub-agent dots from counts: running, failed, done, then unknown (hollow) — at most `max`, the rest as `more`.\n * Only what the counts say is drawn; nothing is invented.\n */\nexport function agentDots(\n a: InboxCard['agents'],\n max = MAX_DOTS,\n): { dots: Array<'running' | 'failed' | 'done' | 'unknown'>; more: number } {\n const total = Math.floor(num(a?.total));\n if (!total) return { dots: [], more: 0 };\n const running = Math.min(total, Math.floor(num(a?.running)));\n const failed = Math.min(total - running, Math.floor(num(a?.failed)));\n const done = Math.min(total - running - failed, Math.floor(num(a?.done)));\n const all: Array<'running' | 'failed' | 'done' | 'unknown'> = [\n ...Array<'running'>(running).fill('running'),\n ...Array<'failed'>(failed).fill('failed'),\n ...Array<'done'>(done).fill('done'),\n ...Array<'unknown'>(total - running - failed - done).fill('unknown'),\n ];\n return { dots: all.slice(0, max), more: Math.max(0, total - max) };\n}\n\n/** How many cards need the person (waiting + failed) and how many run — what the live region says. */\nexport function boardCounts(columns: InboxColumn[]): { needs: number; running: number } {\n const seen = new Set<string>();\n let needs = 0;\n let running = 0;\n for (const col of Array.isArray(columns) ? columns : []) {\n for (const c of Array.isArray(col?.cards) ? col.cards : []) {\n if (!c || seen.has(String(c.id))) continue;\n seen.add(String(c.id));\n const s = statusOf(c);\n if (s === 'waiting' || s === 'failed') needs++;\n else if (s === 'running') running++;\n }\n }\n return { needs, running };\n}\n\n/** The reference board's three columns from a flat list: Needs you (waiting, failed) · Running · Done (done, idle). */\nexport function columnsByStatus(cards: InboxCard[], lang: 'en' | 'ko' = 'en'): InboxColumn[] {\n const L = STRINGS[lang === 'ko' ? 'ko' : 'en'].columns;\n const list = Array.isArray(cards) ? cards : [];\n const of = (...s: InboxStatus[]) => list.filter((c) => c && s.includes(statusOf(c)));\n return [\n { id: 'needs-you', label: L.needs, cards: of('waiting', 'failed') },\n { id: 'running', label: L.running, cards: of('running') },\n { id: 'done', label: L.done, cards: of('done', 'idle') },\n ];\n}\n\n/**\n * The column each card is drawn in this render. `want` = the column its data puts it in; `drawn` = the column\n * it is drawn in now (cards on screen only); `holds` = the running holds. A card whose column changed stays where\n * it is drawn until its deadline (`now + BOARD_HOLD_MS` when the change is first seen). Data that returns to the\n * drawn column drops the hold; a new target keeps the first deadline. `on = false` (reduced motion, first paint,\n * hidden tab) moves every card at once. Returns the columns, the holds still running and the earliest deadline.\n */\nexport function holdLanes(\n want: Record<string, string>,\n drawn: Record<string, string>,\n holds: Record<string, LaneHold>,\n now: number,\n on: boolean,\n): { lanes: Record<string, string>; holds: Record<string, LaneHold>; wakeAt: number } {\n const lanes: Record<string, string> = Object.create(null);\n const next: Record<string, LaneHold> = Object.create(null);\n let wakeAt = 0;\n for (const key of Object.keys(want)) {\n const to = want[key];\n const from = drawn[key];\n lanes[key] = to;\n if (!on || !from || from === to) continue;\n const h = holds[key];\n const until = h && h.from === from ? h.until : now + BOARD_HOLD_MS;\n if (now >= until) continue;\n lanes[key] = from;\n next[key] = { from, to, until };\n if (!wakeAt || until < wakeAt) wakeAt = until;\n }\n return { lanes, holds: next, wakeAt };\n}\n\n/**\n * Put held cards back where they are drawn: each leaves its new column and returns to `lanes[id]` at its place\n * in that column's previous order (`drawnOrder`). Held cards are taken out first and put back in ascending\n * place, so cards leaving one column together keep their order there. A hold whose column is gone is dropped.\n */\nexport function placeHolds(\n slots: Record<string, string[]>,\n lanes: Record<string, string>,\n drawnOrder: Record<string, string[]>,\n): { slots: Record<string, string[]>; dropped: string[] } {\n const out: Record<string, string[]> = Object.create(null);\n for (const k of Object.keys(slots)) out[k] = slots[k].slice();\n const moves: Array<{ id: string; home: string; at: number }> = [];\n const dropped: string[] = [];\n for (const col of Object.keys(out)) {\n const list = out[col];\n for (let i = list.length - 1; i >= 0; i--) {\n const id = list[i];\n const lane = lanes[id];\n if (!lane || lane === col) continue;\n if (!out[lane]) {\n dropped.push(id);\n continue;\n }\n list.splice(i, 1);\n moves.push({ id, home: lane, at: Math.max(0, (drawnOrder[lane] ?? []).indexOf(id)) });\n }\n }\n moves.sort((a, b) => a.at - b.at);\n for (const m of moves) {\n const l = out[m.home];\n l.splice(Math.min(m.at, l.length), 0, m.id);\n }\n return { slots: out, dropped };\n}\n\n// ── Markup ─────────────────────────────────────────────────────────────────\n\nfunction fmtCount(kind: string, v: number): string {\n return kind === 'usd' ? fmtUsd(v) : fmtInt(v);\n}\n\nfunction statusWord(c: InboxCard, t: Strings): string {\n const own = typeof c.statusText === 'string' ? c.statusText.trim() : '';\n return own || t.status[statusOf(c)];\n}\n\n/** The status tag's inside: icon · word · clock / age. Clocks and ages are filled by the 1 Hz tick. */\nfunction renderStatus(c: InboxCard, t: Strings): string {\n const s = statusOf(c);\n const word = statusWord(c, t);\n const since = num(c.since);\n const acc = num(c.elapsedMs);\n const ago = since ? `<span class=\"ib-ago\" data-at=\"${since}\"></span>` : '';\n const icon = (inner: string) => `<span class=\"ib-tag-icon\" aria-hidden=\"true\">${inner}</span>`;\n if (s === 'running') {\n const text =\n since || acc\n ? `<span class=\"ib-pre\">${esc(word)} · </span><span class=\"ib-clock\" data-clock data-from=\"${since}\" data-acc=\"${acc}\"></span>`\n : esc(word);\n return `${icon('<span class=\"ib-spin\"></span>')}<span class=\"ib-tag-text\">${text}</span>`;\n }\n if (s === 'waiting') return `${icon(WAIT_SVG)}<span class=\"ib-tag-text\">${esc(word)}${ago}</span>`;\n if (s === 'failed') return `${icon(FAIL_SVG)}<span class=\"ib-tag-text\">${esc(word)}${ago}</span>`;\n if (s === 'done') {\n const pre = c.statusText?.trim() ? `${esc(word)} · ` : esc(t.doneIn);\n const text = acc ? `<span class=\"ib-pre\">${pre}</span>${esc(fmtDuration(acc))}` : esc(word);\n return `${icon('<span class=\"ib-dot\"></span>')}<span class=\"ib-tag-text\">${text}${ago}</span>`;\n }\n return `${icon('<span class=\"ib-dot is-hollow\"></span>')}<span class=\"ib-tag-text\">${esc(word)}${ago}</span>`;\n}\n\nfunction renderTask(c: InboxCard): string {\n const task = c.task;\n if (!task || typeof task.label !== 'string' || !task.label) return '';\n const from = num(task.startedAt);\n const fixed = num(task.elapsedMs);\n const time = from\n ? `<span class=\"ib-task-time\" data-clock data-from=\"${from}\" data-acc=\"0\"></span>`\n : fixed\n ? `<span class=\"ib-task-time\">${esc(fmtDuration(fixed))}</span>`\n : '';\n return `<div class=\"ib-task\" title=\"${escAttr(task.label)}\">${\n task.id ? `<span class=\"ib-task-id\">#${esc(task.id)}</span>` : ''\n }<span class=\"ib-task-name\">${esc(task.label)}</span>${time}</div>`;\n}\n\nfunction renderAgents(c: InboxCard, t: Strings): string {\n const { dots, more } = agentDots(c.agents);\n if (!dots.length) return '';\n const total = Math.floor(num(c.agents?.total));\n const running = Math.min(total, Math.floor(num(c.agents?.running)));\n const failed = Math.floor(num(c.agents?.failed));\n const parts = [`${esc(t.agents)} <b>${total}</b>`];\n if (running) parts.push(esc(t.agentsRunning(running)));\n if (failed) parts.push(`<span class=\"ib-fail\">${esc(t.agentsFailed(failed))}</span>`);\n const words = [`${t.agents} ${total}`, running ? t.agentsRunning(running) : '', failed ? t.agentsFailed(failed) : '']\n .filter(Boolean)\n .join(', ');\n return `<div class=\"ib-agents\" title=\"${escAttr(words)}\">${AGENTS_SVG}<span class=\"ib-dots\" aria-hidden=\"true\">${dots\n .map((d) => `<i class=\"ib-adot is-${d}\"></i>`)\n .join(\n '',\n )}${more ? `<span class=\"ib-dots-more\">+${more}</span>` : ''}</span><span class=\"ib-agents-text\">${parts.join(' · ')}</span></div>`;\n}\n\nfunction renderUsage(c: InboxCard, t: Strings): string {\n const parts: string[] = [];\n if (finite(c.tokens) && c.tokens >= 0)\n parts.push(\n `<span class=\"ib-use\" title=\"${escAttr(t.tokTitle)}\"><span class=\"ib-cnt\" data-cnt=\"tok\" data-to=\"${c.tokens}\">${fmtInt(c.tokens)}</span><span class=\"ib-unit\">${esc(t.tok)}</span></span>`,\n );\n if (finite(c.costUsd) && c.costUsd >= 0)\n parts.push(\n `<span class=\"ib-use\" title=\"${escAttr(t.costTitle)}\"><span class=\"ib-cnt\" data-cnt=\"usd\" data-to=\"${c.costUsd}\">${fmtUsd(c.costUsd)}</span></span>`,\n );\n return parts.length\n ? `<div class=\"ib-usage\">${parts.join('<span class=\"ib-sep\" aria-hidden=\"true\">·</span>')}</div>`\n : '';\n}\n\nfunction renderArtifacts(c: InboxCard, t: Strings): string {\n const names = (Array.isArray(c.artifacts) ? c.artifacts : []).filter((n) => typeof n === 'string' && n);\n if (!names.length) return '';\n const shown = names.slice(0, MAX_CHIPS);\n const more = names.length - shown.length;\n return `<div class=\"ib-arts\"><span class=\"ib-arts-n\" title=\"${escAttr(t.arts)}\">${glyph('file')}${names.length}</span>${shown\n .map((n) => {\n const k = artifactKind(n);\n return `<span class=\"ib-chip is-${k}\" title=\"${escAttr(n)}\">${glyph(k)}<span class=\"ib-chip-name\">${esc(n)}</span></span>`;\n })\n .join('')}${more > 0 ? `<span class=\"ib-arts-more\">+${more}</span>` : ''}</div>`;\n}\n\nfunction renderMetrics(c: InboxCard, t: Strings): string {\n const out: string[] = [];\n const total = Math.floor(num(c.steps?.total));\n if (total) {\n const done = Math.min(total, Math.floor(num(c.steps?.done)));\n out.push(`<span class=\"ib-metric\" title=\"${escAttr(t.steps)}\">${TASKS_SVG}${done}/${total}</span>`);\n }\n const pct = num(c.contextPct);\n if (pct) {\n const p = Math.round(Math.min(pct, 100));\n const lv = pct > 80 ? ' is-danger' : pct > 60 ? ' is-warn' : '';\n out.push(`<span class=\"ib-metric${lv}\" title=\"${escAttr(t.ctx(p))}\">${CTX_SVG}${p}%</span>`);\n }\n return out.length ? `<span class=\"ib-metrics\">${out.join('')}</span>` : '';\n}\n\n/** The collapsed face: spark + title / summary / task / sub-agents / tokens · cost / files / status tag · metrics. */\nfunction renderFace(c: InboxCard, t: Strings = STRINGS.en): string {\n return `<div class=\"ib-head\"><span class=\"ib-spark\" aria-hidden=\"true\">${SPARK_SVG}</span><span class=\"ib-title\">${esc(c.title)}</span></div>${\n c.summary ? `<div class=\"ib-summary\">${esc(c.summary)}</div>` : ''\n }${renderTask(c)}${renderAgents(c, t)}${renderUsage(c, t)}${renderArtifacts(c, t)}<div class=\"ib-foot\"><span class=\"ib-tag\" data-tone=\"${statusTone(\n statusOf(c),\n )}\">${renderStatus(c, t)}</span>${renderMetrics(c, t)}</div>`;\n}\n\nfunction renderButton(cardId: string, a: InboxAction, primary: boolean): string {\n const why = typeof a.disabled === 'string' ? a.disabled : '';\n const off = !!a.disabled;\n return `<button type=\"button\" class=\"ib-btn${primary ? ' is-primary' : ''}\" data-act=\"${escAttr(a.id)}\" data-key=\"${escAttr(\n `a:${cardId}:${a.id}`,\n )}\"${off ? ' aria-disabled=\"true\"' : ''}${why ? ` title=\"${escAttr(why)}\"` : ''}>${esc(a.label)}${\n why ? `<span class=\"sr-only\"> — ${esc(why)}</span>` : ''\n }</button>`;\n}\n\n/** The open card: step list (oldest first, the earliest folded past five) and the button row with one ink button. */\nfunction renderBody(c: InboxCard, t: Strings = STRINGS.en, openLabel: string | false = t.open): string {\n const id = String(c.id);\n const raw = (Array.isArray(c.details) ? c.details : [])\n .map((d) => (typeof d === 'string' ? { label: d } : d))\n .filter((d): d is InboxDetail => !!d && typeof d.label === 'string' && d.label !== '');\n let steps = '';\n if (raw.length) {\n const folded = Math.max(0, raw.length - MAX_DETAILS);\n const shown = raw.slice(folded);\n steps = `<div class=\"ib-steps-wrap\">${folded ? `<div class=\"ib-more\">${esc(t.earlier(folded))}</div>` : ''}<ol class=\"ib-steps\">${shown\n .map((d, i) => {\n const state = d.state ?? (i === shown.length - 1 ? 'current' : 'done');\n return `<li class=\"ib-step is-${state === 'current' || state === 'pending' ? state : 'done'}\"><span class=\"ib-step-text\">${esc(\n d.label,\n )}</span>${d.meta ? `<span class=\"ib-step-meta\">${esc(d.meta)}</span>` : ''}</li>`;\n })\n .join('')}</ol></div>`;\n }\n const primary = c.primary && c.primary.id != null && c.primary.label ? c.primary : null;\n const decides = !!primary && !primary.disabled;\n const btns: string[] = [];\n for (const a of Array.isArray(c.actions) ? c.actions : [])\n if (a && a.id != null && a.label) btns.push(renderButton(id, a, false));\n if (openLabel)\n btns.push(\n `<button type=\"button\" class=\"ib-btn${decides ? '' : ' is-primary'}\" data-open data-key=\"${escAttr(`o:${id}`)}\">${esc(openLabel)}</button>`,\n );\n if (primary) btns.push(renderButton(id, primary, decides));\n const model = c.model ? `<span class=\"ib-model\">${esc(c.model)}</span>` : '';\n const bar =\n btns.length || model ? `<div class=\"ib-bar\">${model}<span class=\"ib-actions\">${btns.join('')}</span></div>` : '';\n return steps || bar ? `<div class=\"ib-body\">${steps}${bar}</div>` : '';\n}\n\n// ── Element ────────────────────────────────────────────────────────────────\n\ninterface Shell {\n el: HTMLLIElement;\n face: HTMLElement;\n expand: HTMLElement;\n body: HTMLElement;\n faceHtml: string | null;\n bodyHtml: string | null;\n col: string;\n status: InboxStatus | '';\n flip: Animation | null;\n}\ninterface ColShell {\n el: HTMLElement;\n name: HTMLElement;\n count: HTMLElement;\n list: HTMLElement;\n empty: HTMLElement;\n}\ntype Timer = ReturnType<typeof setTimeout>;\ninterface Motion {\n move: number;\n fade: number;\n easeOut: string;\n easeInOut: string;\n}\n\n/**\n * `<ui-agent-inbox>` — a calm kanban of agent runs: labelled columns with counts, cards with a tinted status tag\n * (Waiting for you · Running · Done · Failed), the task in progress, sub-agents, tokens · cost, files, and a card\n * that opens in place to its steps and one ink decision. A card whose column changes shows its new status where it\n * is for 900 ms, then glides over (FLIP). Cards keep their DOM node for their whole life.\n */\nexport class UiAgentInbox extends UiElement<AgentInboxData> {\n static override styles = [styles];\n static get observedAttributes() {\n return ['lang'];\n }\n\n #wrap: HTMLElement | null = null;\n #board: HTMLElement | null = null;\n #live: HTMLElement | null = null;\n #cards = new Map<string, Shell>();\n #cols = new Map<string, ColShell>();\n #order: Record<string, string[]> = Object.create(null);\n #open = new Set<string>();\n #holds: Record<string, LaneHold> = Object.create(null);\n #lastStatus = new Map<string, InboxStatus>();\n #seq = 0;\n #painted = false;\n #holdTimer: Timer | undefined;\n #tickTimer: ReturnType<typeof setInterval> | undefined;\n #announceTimer: Timer | undefined;\n #announcePending = '';\n #lastCounts = '';\n #shown = new Map<string, number>();\n #counting = new Map<string, { el: HTMLElement; kind: string; from: number; to: number; t0: number }>();\n #raf = 0;\n\n attributeChangedCallback(): void {\n this.requestRender();\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 constructor() {\n super();\n this.root.addEventListener('click', (e) => this.#onClick(e as MouseEvent));\n this.root.addEventListener('keydown', (e) => this.#onKey(e as KeyboardEvent));\n }\n\n override disconnectedCallback(): void {\n clearTimeout(this.#holdTimer);\n clearTimeout(this.#announceTimer);\n clearInterval(this.#tickTimer);\n if (this.#raf && typeof cancelAnimationFrame === 'function') cancelAnimationFrame(this.#raf);\n this.#holdTimer = this.#announceTimer = this.#tickTimer = undefined;\n this.#raf = 0;\n for (const [key, c] of this.#counting) {\n c.el.textContent = fmtCount(c.kind, c.to);\n this.#shown.set(key, c.to);\n }\n this.#counting.clear();\n // A hold cannot outlive the element: on reconnect every card is drawn where its data puts it.\n this.#holds = Object.create(null);\n }\n\n /** The board is reconciled by `update()` (keyed, persistent nodes); there is no single markup string. */\n protected render(): string {\n return '';\n }\n\n // ── Events ──\n\n #cardOf(el: Element | null): string | null {\n const li = el?.closest?.('li.ib-card[data-card]');\n return li ? (li.getAttribute('data-card') ?? null) : null;\n }\n\n #onClick(e: MouseEvent): void {\n const target = e.target as Element | null;\n const act = target?.closest?.('[data-act]');\n if (act) {\n const id = this.#cardOf(act);\n if (id === null || act.getAttribute('aria-disabled') === 'true') return;\n this.emit('ui-action', { cardId: id, actionId: act.getAttribute('data-act') ?? '' });\n return;\n }\n const open = target?.closest?.('[data-open]');\n if (open) {\n const id = this.#cardOf(open);\n if (id !== null) this.emit('ui-open', { cardId: id });\n return;\n }\n const face = target?.closest?.('.ib-face[role=\"button\"]');\n if (face) {\n const id = this.#cardOf(face);\n if (id !== null) this.#toggle(id, false);\n }\n }\n\n #onKey(e: KeyboardEvent): void {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n if ((e.key === 'Enter' || e.key === ' ') && target.matches?.('.ib-face[role=\"button\"]')) {\n e.preventDefault();\n if (e.repeat) return;\n const id = this.#cardOf(target);\n if (id !== null) this.#toggle(id, true);\n return;\n }\n if (e.key !== 'Escape') return;\n // A text field, a select or an editable region keeps its own Escape (clear, cancel, IME).\n const tag = String(target.tagName || '').toUpperCase();\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || target.isContentEditable) return;\n const li = target.closest?.('li.ib-card.is-open');\n const id = li ? li.getAttribute('data-card') : null;\n if (id === null || !this.#open.has(id)) return;\n e.stopPropagation();\n if (this.#toggle(id, true)) this.#cards.get(id)?.face.focus({ preventScroll: true });\n }\n\n /** Open / close one card in place. Keyboard toggles skip the transition. Returns false when the host prevented it. */\n #toggle(id: string, instant: boolean): boolean {\n const sh = this.#cards.get(id);\n if (!sh || !sh.face.hasAttribute('aria-controls')) return false;\n const open = !this.#open.has(id);\n if (!this.emit('ui-toggle', { cardId: id, expanded: open })) return false;\n if (open) this.#open.add(id);\n else this.#open.delete(id);\n if (instant) sh.el.classList.add('no-motion');\n this.#applyOpen(sh, open);\n if (instant) {\n void sh.el.offsetHeight;\n sh.el.classList.remove('no-motion');\n }\n return true;\n }\n\n #applyOpen(sh: Shell, open: boolean): void {\n if (sh.el.classList.contains('is-open') !== open) sh.el.classList.toggle('is-open', open);\n if (sh.face.hasAttribute('aria-controls')) sh.face.setAttribute('aria-expanded', String(open));\n sh.expand.toggleAttribute('inert', !open);\n }\n\n // ── Reconciler ──\n\n #skeleton(): void {\n if (this.#wrap) return;\n const wrap = document.createElement('div');\n wrap.className = 'ib';\n const live = document.createElement('p');\n live.className = 'sr-only';\n live.setAttribute('role', 'status');\n live.setAttribute('aria-live', 'polite');\n live.setAttribute('aria-atomic', 'true');\n const board = document.createElement('div');\n board.className = 'ib-board';\n wrap.append(live, board);\n this.content.append(wrap);\n this.#wrap = wrap;\n this.#live = live;\n this.#board = board;\n }\n\n #colShell(id: string): ColShell {\n const n = ++this.#seq;\n const el = document.createElement('section');\n el.className = 'ib-col';\n el.setAttribute('data-col', id);\n const head = document.createElement('div');\n head.className = 'ib-col-head';\n head.innerHTML = `<span class=\"ib-col-spark\" aria-hidden=\"true\">${SPARK_SVG}</span>`;\n const name = document.createElement('h3');\n name.className = 'ib-col-name';\n name.id = `ib-c${n}-name`;\n const count = document.createElement('span');\n count.className = 'ib-count';\n count.id = `ib-c${n}-count`;\n head.append(name, count);\n const list = document.createElement('ul');\n list.className = 'ib-cards';\n list.setAttribute('role', 'list');\n const empty = document.createElement('p');\n empty.className = 'ib-empty';\n el.setAttribute('aria-labelledby', `${name.id} ${count.id}`);\n el.append(head, list, empty);\n return { el, name, count, list, empty };\n }\n\n #shell(id: string): Shell {\n const el = document.createElement('li');\n el.className = 'ib-card';\n el.setAttribute('data-card', id);\n const face = document.createElement('div');\n face.className = 'ib-face';\n face.setAttribute('data-key', `f:${id}`);\n const expand = document.createElement('div');\n expand.className = 'ib-expand';\n expand.id = `ib-x${++this.#seq}`;\n expand.setAttribute('inert', '');\n const body = document.createElement('div');\n body.className = 'ib-expand-inner';\n expand.append(body);\n el.append(face, expand);\n return { el, face, expand, body, faceHtml: null, bodyHtml: null, col: '', status: '', flip: null };\n }\n\n #motion(): Motion {\n const cs = typeof getComputedStyle === 'function' ? getComputedStyle(this) : null;\n const ms = (name: string, fallback: number) => {\n const raw = cs?.getPropertyValue(name).trim() ?? '';\n const v = Number.parseFloat(raw);\n if (!Number.isFinite(v)) return fallback;\n return /[^m]s$/.test(raw) ? v * 1000 : v;\n };\n const str = (name: string, fallback: string) => cs?.getPropertyValue(name).trim() || fallback;\n return {\n move: ms('--dur-move', 320),\n fade: ms('--dur-fade', 180),\n easeOut: str('--ease-out', 'cubic-bezier(0.23, 1, 0.32, 1)'),\n easeInOut: str('--ease-in-out', 'cubic-bezier(0.77, 0, 0.175, 1)'),\n };\n }\n\n /** Top-left of the card's full-size box as drawn (a move in flight included, an entrance scale not). */\n #boxOf(el: HTMLElement): { x: number; y: number } {\n const r = el.getBoundingClientRect();\n return { x: r.left + r.width / 2 - el.offsetWidth / 2, y: r.top + r.height / 2 - el.offsetHeight / 2 };\n }\n\n protected override update(): void {\n this.#skeleton();\n const board = this.#board!;\n const t = this.#t;\n const d = this.data;\n const now = Date.now();\n const activeKey = (this.root.activeElement as HTMLElement | null)?.dataset?.key;\n const hidden = typeof document !== 'undefined' && document.hidden;\n const reduced = prefersReducedMotion();\n const live = this.#painted && !hidden;\n const canAnimate = live && typeof HTMLElement.prototype.animate === 'function';\n const openLabel = d?.openLabel === false ? false : typeof d?.openLabel === 'string' ? d.openLabel : t.open;\n const startOpen = new Set((Array.isArray(d?.expanded) ? d.expanded : []).map(String));\n\n // 1. Columns and cards as the data puts them (first column id / card id wins).\n const cols: Array<{ id: string; col: InboxColumn }> = [];\n const cardById = new Map<string, InboxCard>();\n const slots: Record<string, string[]> = Object.create(null);\n const want: Record<string, string> = Object.create(null);\n for (const col of Array.isArray(d?.columns) ? d.columns : []) {\n if (!col || col.id == null) continue;\n const cid = String(col.id);\n if (slots[cid]) continue;\n slots[cid] = [];\n cols.push({ id: cid, col });\n for (const card of Array.isArray(col.cards) ? col.cards : []) {\n if (!card || card.id == null) continue;\n const id = String(card.id);\n if (cardById.has(id)) continue;\n cardById.set(id, card);\n slots[cid].push(id);\n want[id] = cid;\n }\n }\n\n // 2. Status changes since the last data — said once, before any hold.\n const changes: InboxCard[] = [];\n const nextStatus = new Map<string, InboxStatus>();\n for (const [id, card] of cardById) {\n const s = statusOf(card);\n const prev = this.#lastStatus.get(id);\n if (prev && prev !== s) changes.push(card);\n nextStatus.set(id, s);\n }\n this.#lastStatus = nextStatus;\n\n // 3. Status first, move later: a card whose column changed stays where it is drawn for BOARD_HOLD_MS.\n const drawn: Record<string, string> = Object.create(null);\n for (const [id, sh] of this.#cards) if (want[id] && slots[sh.col]) drawn[id] = sh.col;\n const held = holdLanes(want, drawn, this.#holds, now, live && !reduced);\n const placed = placeHolds(slots, held.lanes, this.#order);\n for (const id of placed.dropped) delete held.holds[id];\n this.#holds = held.holds;\n clearTimeout(this.#holdTimer);\n this.#holdTimer = undefined;\n if (held.wakeAt)\n this.#holdTimer = setTimeout(\n () => {\n this.#holdTimer = undefined;\n this.requestRender();\n },\n Math.max(0, held.wakeAt - now) + 20,\n );\n\n // 4. FLIP — first boxes.\n const first = new Map<string, { x: number; y: number }>();\n const firstCol = new Map<string, string>();\n const firstStatus = new Map<string, string>();\n for (const [id, sh] of this.#cards) {\n firstCol.set(id, sh.col);\n firstStatus.set(id, sh.status);\n if (canAnimate) first.set(id, this.#boxOf(sh.el));\n }\n\n // 5. Columns, in order.\n board.style.setProperty('--ib-cols', String(Math.max(1, cols.length)));\n cols.forEach(({ id }, i) => {\n let c = this.#cols.get(id);\n if (!c) {\n c = this.#colShell(id);\n this.#cols.set(id, c);\n }\n if (board.children[i] !== c.el) board.insertBefore(c.el, board.children[i] ?? null);\n });\n\n // 6. Cards, in order, each patched only where its markup changed.\n const fresh = new Set<string>();\n const order: Record<string, string[]> = Object.create(null);\n for (const { id: colId, col } of cols) {\n const c = this.#cols.get(colId)!;\n const ids = placed.slots[colId];\n order[colId] = ids;\n ids.forEach((id, i) => {\n let sh = this.#cards.get(id);\n if (!sh) {\n sh = this.#shell(id);\n this.#cards.set(id, sh);\n fresh.add(id);\n if (startOpen.has(id)) this.#open.add(id);\n }\n this.#patch(sh, id, cardById.get(id)!, t, openLabel, live && !reduced);\n sh.col = colId;\n if (c.list.children[i] !== sh.el) c.list.insertBefore(sh.el, c.list.children[i] ?? null);\n });\n const name = String(col.label ?? '');\n if (c.name.textContent !== name) c.name.textContent = name;\n const count = String(ids.length);\n if (c.count.textContent !== count) c.count.textContent = count;\n const empty = typeof col.emptyText === 'string' && col.emptyText ? col.emptyText : t.empty;\n if (c.empty.textContent !== empty) c.empty.textContent = empty;\n if (c.empty.hidden !== ids.length > 0) c.empty.hidden = ids.length > 0;\n }\n this.#order = order;\n\n // 7. Cards that left fade out where they were; then columns that left go.\n const motion = canAnimate ? this.#motion() : null;\n for (const [id, sh] of this.#cards) {\n if (cardById.has(id)) continue;\n this.#cards.delete(id);\n this.#open.delete(id);\n this.#shown.delete(`${id}\\u0000tok`);\n this.#shown.delete(`${id}\\u0000usd`);\n this.#exit(sh, first.get(id), slots[firstCol.get(id) ?? ''] ? motion : null);\n }\n for (const [id, c] of this.#cols) {\n if (slots[id]) continue;\n c.el.remove();\n this.#cols.delete(id);\n }\n\n // 8. Enter, move (FLIP), and the status icon's pop where the status changed on screen.\n if (motion) {\n for (const [id, sh] of this.#cards) {\n if (fresh.has(id)) {\n sh.el.animate(\n reduced\n ? [{ opacity: 0 }, { opacity: 1 }]\n : [\n { opacity: 0, transform: 'scale(0.97)' },\n { opacity: 1, transform: 'scale(1)' },\n ],\n { duration: motion.fade, easing: motion.easeOut },\n );\n continue;\n }\n const prev = firstStatus.get(id);\n if (!reduced && prev && prev !== sh.status)\n sh.face.querySelector('.ib-tag-icon')?.animate(\n [\n { opacity: 0, transform: 'scale(0.6)' },\n { opacity: 1, transform: 'scale(1)' },\n ],\n { duration: motion.move, easing: motion.easeOut },\n );\n const a = first.get(id);\n if (!a) continue;\n const wasFlying = sh.el.classList.contains('is-flying');\n if (sh.flip) {\n sh.flip.cancel();\n sh.flip = null;\n }\n if (wasFlying) sh.el.classList.remove('is-flying');\n const b = this.#boxOf(sh.el);\n const dx = a.x - b.x;\n const dy = a.y - b.y;\n if (Math.abs(dx) < 0.5 && Math.abs(dy) < 0.5) continue;\n this.#flip(sh, dx, dy, wasFlying || firstCol.get(id) !== sh.col, motion, reduced);\n }\n }\n\n // 9. Announce (once there is data), keep focus, start the clocks.\n if (d)\n this.#announce(\n cols.map((c) => c.col),\n changes,\n t,\n );\n if (activeKey && (this.root.activeElement as HTMLElement | null)?.dataset?.key !== activeKey) {\n const next = this.$$<HTMLElement>('[data-key]').find((el) => el.dataset.key === activeKey);\n next?.focus({ preventScroll: true });\n }\n this.#tickIn(this.content);\n this.#syncTick();\n // The first paint with data never animates (a render before any data does not count).\n if (d) this.#painted = true;\n }\n\n #patch(sh: Shell, id: string, card: InboxCard, t: Strings, openLabel: string | false, countUp: boolean): void {\n const status = statusOf(card);\n if (sh.status !== status) {\n sh.status = status;\n sh.el.setAttribute('data-status', status);\n }\n const face = renderFace(card, t);\n if (sh.faceHtml !== face) {\n sh.face.innerHTML = face;\n sh.faceHtml = face;\n // Spinners share one phase, so a rewritten face never makes its ring jump.\n const phase = `-${Math.round((typeof performance !== 'undefined' ? performance.now() : Date.now()) % 900)}ms`;\n for (const s of Array.from(sh.face.querySelectorAll<HTMLElement>('.ib-spin'))) s.style.animationDelay = phase;\n this.#countUp(id, sh.face, countUp);\n }\n const body = renderBody(card, t, openLabel);\n if (sh.bodyHtml !== body) {\n sh.body.innerHTML = body;\n sh.bodyHtml = body;\n }\n if (body) {\n if (sh.face.getAttribute('role') !== 'button') {\n sh.face.setAttribute('role', 'button');\n sh.face.setAttribute('tabindex', '0');\n sh.face.setAttribute('aria-controls', sh.expand.id);\n }\n } else if (sh.face.hasAttribute('role')) {\n for (const a of ['role', 'tabindex', 'aria-controls', 'aria-expanded']) sh.face.removeAttribute(a);\n this.#open.delete(id);\n }\n this.#applyOpen(sh, this.#open.has(id));\n }\n\n /** Move = translate only, raised while it changes column. Reduced motion: no travel, a fade where it landed. */\n #flip(sh: Shell, dx: number, dy: number, raise: boolean, m: Motion, reduced: boolean): void {\n if (reduced) {\n if (raise) sh.el.animate([{ opacity: 0 }, { opacity: 1 }], { duration: m.fade, easing: 'linear' });\n return;\n }\n if (raise) sh.el.classList.add('is-flying');\n const anim = sh.el.animate([{ transform: `translate(${dx}px, ${dy}px)` }, { transform: 'translate(0, 0)' }], {\n duration: m.move,\n easing: m.easeInOut,\n composite: 'add',\n });\n sh.flip = anim;\n anim.onfinish = () => {\n if (sh.flip !== anim) return;\n sh.flip = null;\n sh.el.classList.remove('is-flying');\n };\n }\n\n /** Exit = opacity only, absolutely placed in its column where it was drawn, so the rest FLIP into the gap. */\n #exit(sh: Shell, box: { x: number; y: number } | undefined, m: Motion | null): void {\n if (sh.flip) {\n sh.flip.cancel();\n sh.flip = null;\n }\n const section = sh.el.closest<HTMLElement>('.ib-col');\n if (!box || !section || !m) {\n sh.el.remove();\n return;\n }\n const hr = section.getBoundingClientRect();\n const width = sh.el.offsetWidth;\n sh.el.removeAttribute('data-card');\n sh.el.setAttribute('aria-hidden', 'true');\n sh.el.setAttribute('inert', '');\n sh.el.classList.add('is-exiting');\n sh.el.style.left = `${box.x - hr.left}px`;\n sh.el.style.top = `${box.y - hr.top}px`;\n sh.el.style.width = `${width}px`;\n section.append(sh.el);\n const anim = sh.el.animate([{ opacity: 1 }, { opacity: 0 }], {\n duration: m.fade,\n easing: m.easeOut,\n fill: 'forwards',\n });\n anim.onfinish = anim.oncancel = () => sh.el.remove();\n }\n\n /**\n * The polite region says \"N need you, M running\" — the first sentence at once, then only real changes; a burst\n * within ANNOUNCE_MS is said once (the last text). One card changing status is named first.\n */\n #announce(columns: InboxColumn[], changes: InboxCard[], t: Strings): void {\n const live = this.#live;\n if (!live) return;\n const c = boardCounts(columns);\n const counts = t.announce(c.needs, c.running);\n if (!changes.length && counts === this.#lastCounts) return;\n this.#lastCounts = counts;\n const text =\n changes.length === 1\n ? `${t.changed(String(changes[0].title ?? ''), statusWord(changes[0], t))} ${counts}`\n : counts;\n this.#announcePending = text;\n if (!live.textContent && !this.#announceTimer) {\n live.textContent = text;\n return;\n }\n if (this.#announceTimer || live.textContent === text) return;\n this.#announceTimer = setTimeout(() => {\n this.#announceTimer = undefined;\n if (live.textContent !== this.#announcePending) live.textContent = this.#announcePending;\n }, ANNOUNCE_MS);\n }\n\n /** Clocks and ages are written in place (never by a re-render), once a second while any is on the board. */\n #tickIn(root: ParentNode): void {\n const now = Date.now();\n const t = this.#t;\n for (const el of Array.from(root.querySelectorAll<HTMLElement>('[data-clock]'))) {\n const from = Number(el.dataset.from) || 0;\n const acc = Number(el.dataset.acc) || 0;\n const text = fmtDuration(acc + (from ? Math.max(0, now - from) : 0));\n if (el.textContent !== text) el.textContent = text;\n }\n for (const el of Array.from(root.querySelectorAll<HTMLElement>('[data-at]'))) {\n const text = t.ago(Number(el.dataset.at) || 0, now);\n if (el.textContent !== text) el.textContent = text;\n }\n }\n\n #syncTick(): void {\n const need = !!this.content.querySelector('[data-clock], [data-at]');\n if (need && !this.#tickTimer) this.#tickTimer = setInterval(() => this.#tickIn(this.content), 1000);\n else if (!need && this.#tickTimer) {\n clearInterval(this.#tickTimer);\n this.#tickTimer = undefined;\n }\n }\n\n /** Tokens and cost count up (900 ms, ease-out cubic) when they grow on a card on screen; else they are set. */\n #countUp(id: string, root: HTMLElement, animate: boolean): void {\n const now = typeof performance !== 'undefined' ? performance.now() : Date.now();\n for (const el of Array.from(root.querySelectorAll<HTMLElement>('[data-cnt]'))) {\n const kind = el.dataset.cnt ?? 'tok';\n const key = `${id}\\u0000${kind}`;\n const to = Number(el.dataset.to) || 0;\n const shown = this.#shown.get(key);\n if (shown === undefined || !(to > shown) || !animate || typeof requestAnimationFrame !== 'function') {\n this.#shown.set(key, to);\n this.#counting.delete(key);\n continue;\n }\n el.textContent = fmtCount(kind, shown);\n this.#counting.set(key, { el, kind, from: shown, to, t0: now });\n }\n if (this.#counting.size && !this.#raf && typeof requestAnimationFrame === 'function')\n this.#raf = requestAnimationFrame(this.#step);\n }\n\n #step = (now: number): void => {\n for (const [key, c] of this.#counting) {\n const p = Math.min(1, Math.max(0, (now - c.t0) / COUNT_MS));\n const v = p >= 1 ? c.to : c.from + (c.to - c.from) * (1 - (1 - p) ** 3);\n const text = fmtCount(c.kind, v);\n if (c.el.textContent !== text) c.el.textContent = text;\n this.#shown.set(key, v);\n if (p >= 1) this.#counting.delete(key);\n }\n this.#raf = this.#counting.size ? requestAnimationFrame(this.#step) : 0;\n };\n}\n\ndefine('ui-agent-inbox', UiAgentInbox);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ui-agent-inbox': UiAgentInbox;\n }\n}\n"],"names":["id"],"mappings":"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"}
|