agent-dag 3.8.9 → 3.10.0
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 +1 -1
- package/dist/web/assets/index-BBEG2BX8.js +217 -0
- package/dist/web/assets/index-BJsEM-0j.css +1 -0
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/release-notes.json +12 -0
- package/src/server/browser-profiles.mjs +13 -1
- package/src/server/browser-watch.mjs +109 -1
- package/src/server/index.mjs +8 -19
- package/src/server/open-url.mjs +7 -12
- package/src/server/relay-guard.mjs +5 -0
- package/src/server/system-metrics.mjs +17 -0
- package/dist/web/assets/index-ByAgTqB8.css +0 -1
- package/dist/web/assets/index-Dq0gpZ5v.js +0 -217
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.react-flow{direction:ltr}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1;cursor:-webkit-grab;cursor:grab}.react-flow__pane.selection{cursor:pointer}.react-flow__pane.dragging{cursor:-webkit-grabbing;cursor:grabbing}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow .react-flow__edges{pointer-events:none;overflow:visible}.react-flow__edge-path,.react-flow__connection-path{stroke:#b1b1b7;stroke-width:1;fill:none}.react-flow__edge{pointer-events:visibleStroke;cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;-webkit-animation:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge:focus .react-flow__edge-path,.react-flow__edge:focus-visible .react-flow__edge-path{stroke:#555}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge-textbg{fill:#fff}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__connectionline{z-index:1001}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:-webkit-grab;cursor:grab}.react-flow__node.dragging{cursor:-webkit-grabbing;cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:-webkit-grab;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background:#1a192b;border:1px solid white;border-radius:100%}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:-4px;transform:translate(-50%)}.react-flow__handle-top{left:50%;top:-4px;transform:translate(-50%)}.react-flow__handle-left{top:50%;left:-4px;transform:translateY(-50%)}.react-flow__handle-right{right:-4px;top:50%;transform:translateY(-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.center{left:50%;transform:translate(-50%)}.react-flow__attribution{font-size:10px;background:#ffffff80;padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@-webkit-keyframes dashdraw{0%{stroke-dashoffset:10}}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-default,.react-flow__node-input,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:3px;width:150px;font-size:12px;color:#222;text-align:center;border-width:1px;border-style:solid;border-color:#1a192b;background-color:#fff}.react-flow__node-default.selectable:hover,.react-flow__node-input.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:0 1px 4px 1px #00000014}.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:0 0 0 .5px #1a192b}.react-flow__node-group{background-color:#f0f0f040}.react-flow__nodesselection-rect,.react-flow__selection{background:#0059dc14;border:1px dotted rgba(0,89,220,.8)}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls{box-shadow:0 0 2px 1px #00000014}.react-flow__controls-button{border:none;background:#fefefe;border-bottom:1px solid #eee;box-sizing:content-box;display:flex;justify-content:center;align-items:center;width:16px;height:16px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;padding:5px}.react-flow__controls-button:hover{background:#f4f4f4}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__minimap{background-color:#fff}.react-flow__minimap svg{display:block}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:4px;height:4px;border:1px solid #fff;border-radius:1px;background-color:#3367d9;transform:translate(-50%,-50%)}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:#3367d9;border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}:root,:root[data-theme=dark]{--bg: #0b0c10;--bg-soft: #0f1116;--panel: #14161b;--line: #1f2229;--line-soft: #1a1c22;--text: #d8dae0;--text-secondary: #9aa0ab;--ctl-fill: color-mix(in srgb, var(--text) 7%, transparent);--ctl-edge: color-mix(in srgb, var(--text) 50%, transparent);--muted: #7e828c;--muted-dim: #50535b;--text-dim: #7e828c;--accent: #7dd3fc;--accent-dim: #38bdf850;--ok: #86efac;--warn: #fcd34d;--err: #fca5a5;--inflight: #f0abfc;--shadow-1: 0 6px 18px rgba(0,0,0,.25);--shadow-2: 0 10px 24px rgba(0,0,0,.32);--node-grad: linear-gradient(180deg, var(--panel), var(--bg-soft));--topbar-grad: linear-gradient(to bottom, var(--panel), var(--bg-soft));--bg-grid-1: rgba(125,211,252,.06);--bg-grid-2: rgba(240,171,252,.05);--grid-line: #1a1d24;--minimap-mask: rgba(11,12,16,.85);--session-label-l: 78%;--session-accent-l: 60%;--session-rim-l: 55%;--session-edge-l: 72%;--session-edge-idle-l: 55%;--mcp-dot-l: 65%;--usage-purple: #c4b5fd;--usage-blue: #7dd3fc;--usage-green: #86efac;--usage-amber: #fcd34d;--usage-red: #fca5a5;--usage-indigo: #a5b4fc;--usage-orange: #fdba74;--usage-zinc: #94a3b8;color-scheme:dark}:root[data-theme=light]{--bg: #eef1f6;--bg-soft: #ffffff;--panel: #ffffff;--line: #c8cdd6;--line-soft: #dde1e8;--text: #0d1117;--text-secondary: #303845;--muted: #4a5260;--muted-dim: #7c8493;--text-dim: #5f6673;--ctl-fill: color-mix(in srgb, var(--text) 7%, transparent);--ctl-edge: color-mix(in srgb, var(--text) 50%, transparent);--accent: #0369a1;--accent-dim: rgba(3,105,161,.22);--ok: #157a3a;--warn: #ad4e08;--err: #b91c1c;--inflight: #7e22ce;--shadow-1: 0 4px 14px rgba(15,23,42,.1);--shadow-2: 0 10px 28px rgba(15,23,42,.16);--node-grad: linear-gradient(180deg, #ffffff, #f2f5fa);--topbar-grad: linear-gradient(to bottom, #ffffff, #eef1f6);--bg-grid-1: rgba(3,105,161,.1);--bg-grid-2: rgba(126,34,206,.08);--grid-line: #d0d5dd;--minimap-mask: rgba(238,241,246,.85);--session-label-l: 26%;--session-accent-l: 26%;--session-rim-l: 38%;--session-edge-l: 30%;--session-edge-idle-l: 36%;--mcp-dot-l: 32%;--usage-purple: #7e22ce;--usage-blue: #0369a1;--usage-green: #157a3a;--usage-amber: #7a5c00;--usage-red: #be123c;--usage-indigo: #3730a3;--usage-orange: #b0490c;--usage-zinc: #4a5260;color-scheme:light}:root{--panel-inset: 14px;--ctl-h: 30px}:root{--dim-off: .6;--dim-stale: .45}:root{--edge-transition: opacity .5s ease, stroke-width .2s ease;--ctx-arc-transition: stroke-dasharray .4s ease}@media(prefers-reduced-motion:reduce){:root{--edge-transition: opacity .5s ease;--ctx-arc-transition: none}}:root{--pulse-live: 1.2s ease-in-out}*{box-sizing:border-box}html,body,#root{margin:0;height:100%;background:var(--bg);color:var(--text);font:13px/1.45 -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;-webkit-font-smoothing:antialiased;overscroll-behavior:none}*::-webkit-scrollbar{width:10px;height:10px}*::-webkit-scrollbar-track{background:transparent}*::-webkit-scrollbar-thumb{background:var(--line);border:2px solid var(--bg);border-radius:999px}*::-webkit-scrollbar-thumb:hover{background:var(--muted-dim)}*{scrollbar-color:var(--line) transparent;scrollbar-width:thin}:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:4px}button:focus-visible{outline-offset:1px}.app{display:grid;grid-template-columns:1fr 360px;grid-template-rows:52px auto 1fr;height:100vh}.app:has(.session-list){grid-template-columns:240px 1fr 360px}.app:has(.accounts-panel){grid-template-columns:288px 1fr 360px}.app:has(.session-list) .canvas-wrap,.app:has(.accounts-panel) .canvas-wrap{grid-column:2}.app:has(.session-list) .conn-banner,.app:has(.accounts-panel) .conn-banner,.app:has(.session-list) .ver-banner,.app:has(.accounts-panel) .ver-banner{grid-column:2}.canvas-wrap{grid-column:1;grid-row:3}.detail{grid-column:2;grid-row:2 / -1}.app:has(.session-list) .detail{grid-column:3}.vis-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.skip-link{position:fixed;top:8px;left:8px;z-index:100;padding:8px 14px;border-radius:8px;background:var(--panel);border:1px solid var(--accent);color:var(--text);font-size:12px;font-weight:600;text-decoration:none;transform:translateY(calc(-100% - 16px))}.skip-link:focus{transform:none}.canvas-wrap:focus-visible{outline-offset:-3px}.topbar{grid-column:1 / -1;display:flex;align-items:center;justify-content:space-between;gap:24px;padding:0 18px;background:var(--topbar-grad);border-bottom:1px solid var(--line);-webkit-user-select:none;user-select:none}.topbar .readout{display:flex;align-items:center;gap:24px}.topbar .brand{font-weight:600;letter-spacing:.02em;color:var(--text);display:flex;align-items:center;gap:10px;font-size:14px;white-space:nowrap;flex:none}.topbar .brand h1{font:inherit;margin:0}.topbar .brand .logo{width:14px;height:14px;border-radius:4px;background:conic-gradient(from 220deg,#7dd3fc,#f0abfc,#86efac,#7dd3fc);box-shadow:0 0 12px #7dd3fc73}.topbar .brand .v{color:var(--muted);font-weight:400;font-size:11px;margin-left:2px}.topbar .brand button.v{display:inline-flex;align-items:center;flex:none;gap:5px;min-height:24px;padding:2px 7px;border:1px solid transparent;border-radius:999px;background:none;font:inherit;font-size:11px;font-weight:500;cursor:pointer;transition:background .13s,border-color .13s,color .13s,transform .14s cubic-bezier(.23,1,.32,1)}.topbar .brand button.v:active{transform:scale(.97)}.topbar .brand button.v:not(.stale){color:var(--muted);font-weight:400;border-color:var(--ctl-edge)}.topbar .brand button.v:not(.stale):hover{color:var(--text);border-color:var(--text);background:var(--ctl-fill)}.topbar .brand button.v.checking{cursor:progress;opacity:var(--dim-off)}.topbar .brand button.v.stale{color:var(--warn);border-color:color-mix(in srgb,var(--warn) 85%,transparent);background:color-mix(in srgb,var(--warn) 10%,transparent)}.topbar .brand button.v.stale:hover{border-color:var(--warn);background:color-mix(in srgb,var(--warn) 18%,transparent)}.topbar .brand button.v .v-dot{width:5px;height:5px;border-radius:50%;background:var(--warn);box-shadow:0 0 7px var(--warn);animation:pulse 2.4s infinite}.topbar .actions{display:flex;gap:18px;align-items:center;flex:none}.topbar .action-run{display:flex;align-items:center;gap:8px}.sound-slot{position:relative;display:flex}.sound-menu{position:absolute;top:calc(100% + 8px);right:0;z-index:40;width:268px;padding:12px;display:flex;flex-direction:column;gap:12px;background:var(--panel);border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow-2);animation:popIn .14s cubic-bezier(.22,1,.36,1);text-align:left}button.btn.sm-switch{justify-content:space-between;gap:12px}.sm-switch-label{font-weight:600}.sm-switch-state{color:var(--muted);font-variant-numeric:tabular-nums}.sm-switch[aria-pressed=true] .sm-switch-state{color:var(--accent)}button.btn.sm-notice{justify-content:space-between;gap:12px;margin-top:-4px;font-size:11px;color:var(--text-dim)}.sm-notice-text{text-align:left}.sm-notice-act{color:var(--accent);white-space:nowrap}.sm-notice-note{margin-top:-2px}.sm-tone{display:flex;flex-direction:column;gap:8px}.sm-tone-head{display:flex;align-items:center;justify-content:space-between;gap:12px}.sm-tone-name{margin:0;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);font-weight:600}button.btn.sm-hear{padding:0 8px;gap:5px;font-size:11px}.sm-row{display:flex;align-items:center;gap:10px}.sm-row label{font-size:12px;color:var(--muted);min-width:48px}.sm-row input[type=range]{flex:1;min-width:0;margin:0;height:20px;accent-color:var(--accent)}.sm-read{min-width:34px;text-align:right;font-variant-numeric:tabular-nums;font-size:11px;color:var(--text)}.sm-select{flex:1;min-width:0;min-height:24px;padding:0 6px;background:var(--bg);color:var(--text);border:1px solid var(--ctl-edge);border-radius:6px;font:inherit;font-size:12px;accent-color:var(--accent)}.sm-select:hover{border-color:var(--accent)}.sm-note{margin:0;font-size:11px;line-height:1.45;color:var(--text-dim)}.sm-foot{margin:0;padding-top:10px;border-top:1px solid var(--line);font-size:11px;color:var(--text-dim)}.selected-ribbon{display:inline-flex;align-items:center;gap:8px;padding:4px 6px 4px 10px;background:var(--bg-soft);border:1px solid var(--ctl-edge);border-radius:999px;color:var(--text);font:inherit;font-size:12px;cursor:pointer;max-width:min(380px,26vw);min-width:0;transition:border-color .12s,background .12s,transform .14s cubic-bezier(.23,1,.32,1)}.selected-ribbon:hover{border-color:var(--accent);background:var(--bg)}.selected-ribbon:active:not(:has(.selected-close:active)){transform:scale(.97)}.selected-ribbon:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.selected-ribbon .selected-label{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;flex:0 1 auto}.selected-ribbon .selected-cost{color:var(--ok);font-variant-numeric:tabular-nums;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;white-space:nowrap}.selected-ribbon .selected-rate{color:var(--muted);font-size:10px;white-space:nowrap}.selected-ribbon .selected-extra{display:inline-flex;align-items:center;padding:1px 6px;border-radius:999px;background:var(--accent-dim);color:var(--text);font-size:10px;font-weight:600;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.selected-ribbon .selected-close{position:relative;display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;flex:none;border-radius:999px;color:var(--muted);font-size:14px;line-height:1;cursor:pointer;transition:background .12s,color .12s,transform .14s cubic-bezier(.23,1,.32,1)}.selected-ribbon .selected-close:after{content:"";position:absolute;top:-3px;right:-3px;bottom:-3px;left:-3px;border-radius:inherit}.selected-ribbon .selected-close:hover{background:var(--line);color:var(--text)}.selected-ribbon .selected-close:active{transform:scale(.94)}.topbar .status{color:var(--muted);font-size:12px;display:inline-flex;align-items:center;gap:14px}.topbar .status .sysmeter-wrap{position:relative;display:inline-flex;align-items:center}.topbar .status .sysmeter{display:inline-flex;align-items:center;background:none;border:0;color:inherit;font:inherit;cursor:pointer;padding:5px 7px;margin:-5px -7px;border-radius:6px;transition:background .12s,box-shadow .12s,transform .14s cubic-bezier(.23,1,.32,1)}.topbar .status .sysmeter:hover{background:var(--line)}.topbar .status .sysmeter[aria-expanded=true]{box-shadow:inset 0 0 0 1px var(--accent)}.sysmeter .sm-box{position:relative;width:36px;height:14px}.sysmeter.idle .sm-box{cursor:default}.sysmeter .sm-graphic,.sysmeter .sm-read{position:absolute;top:0;right:0;bottom:0;left:0;transition:opacity .14s ease}.sysmeter .sm-graphic{display:flex;flex-direction:column;justify-content:space-between}.sysmeter .sm-spark{display:block}.sysmeter .sm-ram{display:block;height:3px;border-radius:999px;background:var(--line);overflow:hidden}.sysmeter .sm-ram-fill{display:block;width:100%;height:100%;border-radius:999px;background:var(--accent);transform-origin:left center;transition:transform .42s cubic-bezier(.22,1,.36,1),background .2s ease}.sysmeter .sm-ram-fill.warn{background:var(--warn)}.sysmeter .sm-read{opacity:0;display:flex;align-items:center;justify-content:center;gap:1px;font-size:10px;line-height:1;font-variant-numeric:tabular-nums;color:var(--text);letter-spacing:-.02em}.sysmeter .sm-read b{font-weight:600}.sysmeter .sm-read i{font-style:normal;color:var(--muted);opacity:.7}.sysmeter:hover .sm-graphic{opacity:0}.sysmeter:hover .sm-read{opacity:1}.sysmeter.idle .sm-graphic,.sysmeter.idle:hover .sm-graphic{opacity:.45}.sysmeter .sm-sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}@media(prefers-reduced-motion:reduce){.sysmeter .sm-graphic,.sysmeter .sm-read,.sysmeter .sm-ram-fill{transition:none}}.sysdetail{position:fixed;top:60px;right:var(--rail-r);z-index:20;width:280px;max-height:calc(100vh - 76px);overflow-y:auto;--pad-x: 14px;padding:12px var(--pad-x) 14px;background:var(--panel);border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow-2);font-size:11px;color:var(--text);text-align:left;cursor:default;animation:sdIn .16s cubic-bezier(.22,1,.36,1)}.app{--rail-r: 368px}.app:not(:has(.detail)){--rail-r: 8px}.sysdetail.shifted{right:calc(var(--rail-r) + 280px + 20px)}@keyframes sdIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}.sd-head{display:flex;align-items:baseline;gap:8px;margin-bottom:12px}.sd-title{font-size:12px;font-weight:600}.sd-sub{color:var(--muted);font-variant-numeric:tabular-nums}.sd-close{margin-left:auto}.topbar .status .sysmeter:active{transform:scale(.97)}@media(prefers-reduced-motion:reduce){.topbar .status .sysmeter:active{transform:none}}.sd-section+.sd-section{margin-top:13px}.sd-h{margin:0 0 6px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--muted)}.sd-cores{display:grid;grid-template-columns:repeat(var(--n),1fr);gap:2px;height:26px}.sd-core{display:flex;align-items:flex-end;background:var(--line);border-radius:2px;overflow:hidden}.sysdetail .sd-core-fill{width:100%;height:100%;background:var(--accent);border-radius:2px;transform-origin:bottom;transition:transform .32s cubic-bezier(.22,1,.36,1)}.sd-row+.sd-row{margin-top:9px}.sysdetail .sd-open{display:block;width:calc(100% + var(--pad-x) * 2);padding:4px var(--pad-x);margin:-4px calc(var(--pad-x) * -1);border:0;background:none;font:inherit;color:inherit;text-align:left;cursor:pointer;transition:background .14s ease,transform .14s ease}.sysdetail .sd-open:hover{background:color-mix(in srgb,var(--text) 6%,transparent)}.sysdetail .sd-open:active{transform:scale(.97)}.sd-row-more{font-style:normal;font-size:11px;color:var(--text-dim);transition:color .14s ease}.sysdetail .sd-open:hover .sd-row-more{color:var(--text)}.sd-row-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:4px}.sd-row-label{color:var(--muted)}.sd-row-val{font-variant-numeric:tabular-nums;color:var(--muted)}.sd-row-val b{color:var(--text);font-weight:600}.sd-track{display:block;height:4px;border-radius:999px;background:var(--line);overflow:hidden}.sysdetail .sd-fill{display:block;width:100%;height:100%;border-radius:999px;background:var(--accent);transform-origin:left center;transition:transform .42s cubic-bezier(.22,1,.36,1),background .2s ease}.sd-fill.warn{background:var(--warn)}.sd-fill.hot{background:var(--err)}.sd-load{display:flex;gap:14px}.sd-load-item{display:flex;flex-direction:column;gap:1px;font-variant-numeric:tabular-nums}.sd-load-item b{font-size:13px;font-weight:600}.sd-load-item span{color:var(--muted);font-size:10px}.sd-load-item.over b{color:var(--warn)}.sd-note{margin-top:5px;color:var(--muted);font-size:10px}:is(.sysdetail,.pl-body) .sd-procs{width:100%;border-collapse:collapse;font-variant-numeric:tabular-nums}.sd-hrow{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.sd-all{position:relative;padding:0 0 6px;border:0;background:none;font:inherit;font-size:10px;color:var(--text-dim);cursor:pointer;transition:color .14s ease,transform .14s ease}.sd-all:after{content:"";position:absolute;top:50%;left:50%;width:100%;min-width:24px;height:24px;margin:-12px 0 0 -50%}.sd-all:hover{color:var(--text)}.sd-all:active{transform:scale(.97)}:is(.sysdetail,.pl-body) .sd-procs th{padding:0 0 3px}:is(.sysdetail,.pl-body) .sd-procs th:first-child,:is(.sysdetail,.pl-body) .sd-procs th:nth-child(2){width:40px}:is(.sysdetail,.pl-body) .sd-sort{display:flex;align-items:center;gap:3px;width:100%;min-height:24px;padding:0;border:0;border-radius:4px;background:none;font:inherit;font-size:10px;font-weight:500;line-height:1;color:var(--muted);cursor:pointer;transition:color .14s ease,background .14s ease,transform .14s ease}:is(.sysdetail,.pl-body) .sd-procs th:first-child .sd-sort,:is(.sysdetail,.pl-body) .sd-procs th:nth-child(2) .sd-sort{flex-direction:row-reverse;justify-content:flex-start;padding-right:8px}:is(.sysdetail,.pl-body) .sd-sort:hover{background:var(--line);color:var(--text)}:is(.sysdetail,.pl-body) .sd-sort:active{transform:scale(.97)}:is(.sysdetail,.pl-body) .sd-procs th:not([aria-sort=none]) .sd-sort{color:var(--text)}.sd-sort-dir{display:inline-block;width:8px;text-align:center}:is(.sysdetail,.pl-body) .sd-procs td{padding:2px 0}.sd-num{text-align:right;padding-right:8px!important;font-weight:600}.sd-dim{color:var(--muted);font-weight:400}:is(.sysdetail,.pl-body) .sd-proc-name{padding-left:2px;max-width:0;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted)}@media(prefers-reduced-motion:reduce){.sysdetail{animation:none}.sysdetail .sd-core-fill,.sysdetail .sd-fill{transition:none}:is(.sysdetail,.pl-body) .sd-sort:active{transform:none}.sd-all:active,.sysdetail .sd-open:active{transform:none}}.topbar .status .pill{display:inline-flex;align-items:center;gap:6px;padding:3px 8px;border-radius:999px;background:var(--bg-soft);border:1px solid var(--line);font-size:11px;font-weight:600;transition:color .2s ease,background-color .2s ease,border-color .2s ease}.topbar .status .pill:before{transition:background-color .2s ease,box-shadow .2s ease}.topbar .status .pill .pill-box{display:inline-grid;grid-template-areas:"pill-label";align-items:center;justify-items:start;font-variant-numeric:tabular-nums}.topbar .status .pill .pill-widest,.topbar .status .pill .pill-label{grid-area:pill-label;white-space:nowrap}.topbar .status .pill .pill-widest{visibility:hidden}.topbar .status .pill.live{color:var(--ok);border-color:#86efac59;background:#86efac0f}.topbar .status .pill.live:before{content:"";display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--ok);box-shadow:0 0 8px var(--ok);animation:pulse 1.6s ease-in-out infinite}.topbar .status .pill.paused{color:var(--warn);border-color:#fcd34d59;background:#fcd34d0f}.topbar .status .pill.paused:before{content:"";display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--warn);box-shadow:0 0 8px var(--warn)}.topbar .status .pill.dead{color:var(--err);border-color:#fca5a559;background:#fca5a50f}.topbar .status .pill.dead:before{content:"";display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--err);box-shadow:0 0 8px var(--err)}.topbar .notify-ask{display:inline-flex;align-items:center;min-height:24px;margin-left:6px;padding:3px 9px;border-radius:999px;background:transparent;border:1px dashed var(--ctl-edge);color:var(--muted);font:inherit;font-size:11px;cursor:pointer;white-space:nowrap;transition:border-color .12s,color .12s,transform .14s cubic-bezier(.23,1,.32,1)}.topbar .notify-ask:hover{border-color:color-mix(in srgb,var(--warn) 85%,transparent);color:var(--warn)}.topbar .notify-ask:active{transform:scale(.97)}@media(prefers-reduced-motion:reduce){.topbar .notify-ask:active{transform:none}}.topbar .notify-said{display:inline-flex;align-items:center;min-height:24px;margin-left:6px;padding:3px 2px;font-size:11px;white-space:nowrap;color:var(--muted)}.topbar .notify-said-blocked{color:var(--warn)}.topbar .waiting-stat{display:inline-flex;align-items:center;gap:6px;min-height:24px;padding:3px 9px;border-radius:999px;background:transparent;border:1px solid color-mix(in srgb,var(--warn) 85%,transparent);color:var(--warn);font:inherit;font-size:11px;cursor:pointer;white-space:nowrap;transition:border-color .12s,background .12s,transform .14s cubic-bezier(.23,1,.32,1)}.topbar .waiting-stat b{font-weight:700;font-variant-numeric:tabular-nums}.topbar .waiting-stat:hover{border-color:var(--warn);background:color-mix(in srgb,var(--warn) 12%,transparent)}.topbar .waiting-stat:active{transform:scale(.97)}@media(prefers-reduced-motion:reduce){.topbar .waiting-stat:active{transform:none}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.35}}button.btn{background:transparent;color:var(--text);border:1px solid var(--ctl-edge);min-height:var(--ctl-h);padding:0 12px;border-radius:6px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font:inherit;font-size:12px;transition:border-color .12s,color .12s,background .12s,transform .14s cubic-bezier(.23,1,.32,1)}button.btn:hover{border-color:var(--accent);color:var(--accent)}button.btn:active:not(:disabled){transform:scale(.97)}button.btn:disabled{opacity:var(--dim-off);cursor:default}button.btn.primary{background:var(--accent-dim);color:var(--text);border-color:var(--accent)}button.btn.danger{color:var(--err);border-color:color-mix(in srgb,var(--err) 65%,transparent)}button.btn.danger:hover{border-color:var(--err);color:var(--err);background:color-mix(in srgb,var(--err) 12%,transparent)}button.btn.icon-btn{width:var(--ctl-h);height:var(--ctl-h);padding:0;font-size:14px;line-height:1}button.btn.icon-btn[aria-pressed=true],button.btn.icon-btn[aria-expanded=true]{background:var(--accent);border-color:var(--accent);color:var(--bg)}button.btn.icon-btn[aria-pressed=true]:hover,button.btn.icon-btn[aria-expanded=true]:hover{box-shadow:0 0 0 2px var(--accent-dim)}.glyph-btn{display:inline-flex;align-items:center;justify-content:center;min-width:24px;min-height:24px;padding:4px;margin-top:-4px;margin-bottom:-4px;background:none;border:0;border-radius:50%;color:var(--muted);font:inherit;font-size:16px;line-height:1;cursor:pointer;transition:color .12s,transform .14s cubic-bezier(.23,1,.32,1)}.glyph-btn:focus-visible{outline-offset:1px}.glyph-btn:hover{color:var(--text)}.glyph-btn:active:not(:disabled){transform:scale(.94)}.conn-banner{grid-column:1;grid-row:2;display:flex;align-items:center;gap:10px;padding:8px 18px;background:linear-gradient(90deg,rgba(252,165,165,.12),transparent);border-bottom:1px solid rgba(252,165,165,.3);color:var(--err);font-size:12px;font-weight:500;animation:fadeIn .2s ease}.conn-banner .conn-dot{width:7px;height:7px;border-radius:50%;background:var(--err);box-shadow:0 0 8px var(--err);animation:pulse 1.2s infinite}.conn-banner .conn-sub{color:var(--text);font-weight:400}.ver-banner{grid-column:1;grid-row:2;display:flex;align-items:center;gap:10px;padding:8px 18px;background:linear-gradient(90deg,color-mix(in srgb,var(--warn) 13%,transparent),transparent);border-bottom:1px solid color-mix(in srgb,var(--warn) 30%,transparent);color:var(--text);font-size:12px;font-weight:500;animation:fadeIn .2s ease}.ver-banner .ver-dot{flex:none;width:7px;height:7px;border-radius:50%;background:var(--warn);box-shadow:0 0 8px var(--warn);animation:pulse 2.4s infinite}.ver-banner strong{font-weight:600}.ver-banner strong,.ver-banner .ver-sub{white-space:nowrap}.ver-banner .ver-sub{color:var(--muted);font-weight:400;min-width:0;overflow:hidden;text-overflow:ellipsis}.ver-banner .ver-cmd{display:inline-flex;align-items:center;gap:8px;padding:3px 5px 3px 9px;border:1px solid var(--ctl-edge);border-radius:999px;background:var(--ctl-fill);color:var(--text);cursor:pointer;transition:border-color .13s,background .13s,transform .14s cubic-bezier(.23,1,.32,1)}.ver-banner .ver-cmd:hover{border-color:var(--accent);background:var(--panel)}.ver-banner .ver-cmd:active{transform:scale(.97)}.ver-banner .ver-cmd code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;-webkit-user-select:text;user-select:text}.ver-banner .ver-cmd-hint{font-size:10px;letter-spacing:.04em;text-transform:uppercase;color:var(--text);background:var(--line);border-radius:999px;padding:2px 7px}.ver-banner.done{background:linear-gradient(90deg,color-mix(in srgb,var(--ok) 13%,transparent),transparent);border-bottom-color:color-mix(in srgb,var(--ok) 30%,transparent)}.ver-banner.done .ver-dot{background:var(--ok);box-shadow:0 0 8px var(--ok);animation:none}.ver-banner .ver-act{padding:3px 11px;border:1px solid color-mix(in srgb,var(--warn) 85%,transparent);border-radius:999px;background:color-mix(in srgb,var(--warn) 16%,transparent);color:var(--warn);font:inherit;font-size:11px;font-weight:600;cursor:pointer;transition:background .13s,border-color .13s,transform .14s cubic-bezier(.23,1,.32,1)}.ver-banner .ver-act:hover:not(:disabled){background:color-mix(in srgb,var(--warn) 26%,transparent);border-color:var(--warn)}.ver-banner .ver-act:active:not(:disabled){transform:scale(.97)}.ver-banner .ver-act:disabled{opacity:var(--dim-off);cursor:default}.ver-banner .ver-sub.fail{color:var(--err)}.ver-banner .ver-auto{display:inline-flex;align-items:center;gap:6px;padding:3px 9px;border:1px solid transparent;border-radius:999px;background:none;color:var(--muted);font:inherit;font-size:11px;cursor:pointer;transition:color .13s,border-color .13s,transform .14s cubic-bezier(.23,1,.32,1)}.ver-banner .ver-auto:hover{color:var(--text);border-color:var(--ctl-edge)}.ver-banner .ver-auto:active{transform:scale(.97)}.ver-banner .ver-auto i{width:6px;height:6px;border-radius:50%;background:var(--muted-dim);transition:background .13s,box-shadow .13s}.ver-banner .ver-auto.on{color:var(--warn)}.ver-banner .ver-auto.on i{background:var(--warn);box-shadow:0 0 6px var(--warn)}.ver-banner .ver-close{display:inline-flex;align-items:center;justify-content:center;margin-left:2px;flex:none;width:24px;height:24px;padding:0;border:0;border-radius:999px;background:none;color:var(--muted);font:inherit;font-size:14px;line-height:1;cursor:pointer;transition:background .12s,color .12s,transform .14s cubic-bezier(.23,1,.32,1)}.ver-banner .ver-close:hover{background:var(--line);color:var(--text)}.ver-banner .ver-close:active{transform:scale(.94)}.react-flow__node.rf-spotlit-out{opacity:.16;filter:saturate(.3) blur(.3px);transition:opacity .2s ease,filter .2s ease}.react-flow__node.rf-spotlit-out:hover{opacity:.55;filter:saturate(.7)}.react-flow__edge.rf-edge-selected .react-flow__edge-path{stroke-dasharray:6 3;animation:dashflow .8s linear infinite;filter:drop-shadow(0 0 4px var(--accent-dim))}.react-flow__node.rf-exiting{pointer-events:none}.react-flow__node.rf-exiting .agent-node{animation:nodeExit .6s cubic-bezier(.55,0,.55,1) forwards}@keyframes nodeExit{0%{opacity:1;filter:blur(0) saturate(1);transform:scale(1)}60%{opacity:.4;filter:blur(2px) saturate(.4)}to{opacity:0;filter:blur(6px) saturate(0);transform:scale(.85)}}.react-flow__edge.rf-edge-exiting .react-flow__edge-path{animation:edgeExit .6s ease forwards}@keyframes edgeExit{to{opacity:0;stroke-dashoffset:40}}.canvas-wrap{position:relative;background:radial-gradient(1200px 600px at 60% -10%,var(--bg-grid-1),transparent 60%),radial-gradient(1000px 500px at 10% 110%,var(--bg-grid-2),transparent 60%),var(--bg);overflow:hidden}.cat-filter-bar{position:absolute;top:14px;left:14px;z-index:6;display:flex;gap:4px;padding:4px;background:#14161bc7;border:1px solid var(--line);border-radius:999px;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);box-shadow:0 6px 18px #0000004d}:root[data-theme=light] .cat-filter-bar{background:#ffffffc7;box-shadow:0 6px 18px #0f172a1a}.cat-filter{display:inline-flex;align-items:center;gap:5px;padding:4px 10px 4px 8px;border-radius:999px;border:1px solid transparent;background:transparent;color:var(--text);font:inherit;font-size:11px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.02em;cursor:pointer;transition:background .12s,color .12s,transform .14s cubic-bezier(.23,1,.32,1)}.cat-filter .cat-emoji{font-size:13px;line-height:1}.cat-filter .cat-name{text-transform:lowercase}.cat-filter:hover{background:var(--ctl-fill)}.cat-filter:active{transform:scale(.97)}.cat-filter:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.cat-filter.off{color:var(--muted)}.cat-filter.off .cat-emoji{filter:grayscale(.7)}.cat-filter.off:hover{color:var(--text)}.cat-filter.off .cat-name{text-decoration:line-through}.detail{position:relative;background:var(--panel);border-left:1px solid var(--line);padding:18px;overflow:auto;display:flex;flex-direction:column;gap:12px}.detail-close{position:absolute;top:10px;right:12px;z-index:2;margin-top:0;margin-bottom:0}.app:has(.detail-reopen){grid-template-columns:1fr}.app:has(.session-list):has(.detail-reopen){grid-template-columns:240px 1fr}.app:has(.accounts-panel):has(.detail-reopen){grid-template-columns:288px 1fr}.detail-reopen{position:fixed;top:64px;right:0;width:24px;height:44px;display:grid;place-items:center;font-size:16px;line-height:1;color:var(--muted);background:var(--panel);border:1px solid var(--ctl-edge);border-right:none;border-radius:8px 0 0 8px;cursor:pointer;z-index:10;box-shadow:-2px 2px 8px #0003;transition:color .12s ease,background .12s ease,transform .14s cubic-bezier(.23,1,.32,1)}.detail-reopen:hover{color:var(--text)}.detail-reopen:active{transform:scale(.94)}.detail>h2,.detail h3{margin:0;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);font-weight:600}.detail .empty{color:var(--muted);font-style:italic}.detail .hint{border:1px dashed var(--line);border-radius:8px;padding:12px;color:var(--muted);font-size:12px;line-height:1.55;background:var(--bg-soft)}.detail .hint code{background:var(--bg);border:1px solid var(--line);padding:1px 6px;border-radius:4px;font-size:11px;color:var(--text)}.detail .row{display:flex;justify-content:space-between;align-items:baseline;padding:5px 0;border-bottom:1px solid var(--line-soft);font-size:12px;gap:12px}.detail .row:last-child{border-bottom:none}.detail .row .k{color:var(--muted)}.detail .row .v{color:var(--text);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;overflow:hidden;text-overflow:ellipsis;max-width:220px;white-space:nowrap}.detail .tool{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;padding:5px 0;color:var(--text);display:flex;justify-content:space-between;gap:8px;border-bottom:1px solid var(--line-soft)}.detail .tool:last-child{border-bottom:none}.detail .tool .name{display:inline-flex;align-items:center;gap:8px}.detail .tool .name .status-dot{display:inline-flex;align-items:center;justify-content:center;width:10px;height:10px;flex:0 0 10px;font-size:11px;font-weight:700;line-height:1}.detail .tool .name .status-dot:before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor}.detail .tool .name .status-dot.inflight{color:var(--inflight)}.detail .tool .name .status-dot.inflight:before{animation:pulse var(--pulse-live) infinite}.detail .tool .name .status-dot.done{color:var(--ok)}.detail .tool .name .status-dot.done:before{content:"✓";width:auto;height:auto;background:none}.detail .tool .name .status-dot.err{color:var(--err)}.detail .tool .name .status-dot.err:before{content:"×";width:auto;height:auto;background:none}.react-flow__renderer{background:transparent}.react-flow__node{transition:transform .32s cubic-bezier(.22,1,.36,1);animation:nodeSpawn .36s cubic-bezier(.22,1,.36,1) both}@keyframes nodeSpawn{0%{opacity:0;filter:blur(2px)}}.react-flow__node.dragging,.react-flow__node:active{transition:none}.react-flow__edge-path{stroke:var(--accent-dim);stroke-width:1.5;transition:stroke .2s ease}.react-flow__edge.animated .react-flow__edge-path{stroke:var(--inflight);stroke-dasharray:5;animation:dashflow .8s linear infinite}.react-flow__edge.sess-edge.sess-live .react-flow__edge-path{stroke:hsl(var(--session-hue, 200) 80% var(--session-edge-l))}.react-flow__edge.sess-edge.sess-idle .react-flow__edge-path{stroke:hsl(var(--session-hue, 200) 50% var(--session-edge-idle-l))}@keyframes dashflow{to{stroke-dashoffset:-10}}.react-flow__attribution{display:none}.react-flow__controls{background:var(--panel);border:1px solid var(--line);border-radius:8px;box-shadow:none;overflow:hidden}.react-flow__controls-button{background:var(--panel);color:var(--text);border-bottom:1px solid var(--line);fill:var(--text)}.react-flow__controls-button:hover{background:var(--ctl-fill)}.react-flow__controls-button[aria-pressed=true]{background:var(--warn);color:var(--bg);fill:var(--bg)}.react-flow__controls-button[aria-pressed=true]:hover{box-shadow:inset 0 0 0 2px var(--bg)}.agent-node{--accent: hsl(var(--session-hue, 200) 70% var(--session-accent-l));position:relative;min-width:220px;max-width:260px;padding:10px 12px 10px 16px;background:var(--node-grad);border:1px solid var(--line);border-radius:10px;color:var(--text);font-size:12px;box-shadow:var(--shadow-1);transition:border-color .2s ease,box-shadow .2s ease;overflow:hidden;will-change:transform}.agent-node:hover{box-shadow:var(--shadow-2)}.agent-node.selected{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent-dim),0 10px 24px #0006}.agent-node.state-active{border-color:var(--inflight);box-shadow:0 0 0 1px #f0abfc73,0 8px 22px #f0abfc2e}.agent-node.state-done{border-color:#86efac80}.agent-node.state-err{border-color:#fca5a599}.agent-node .accent-stripe{position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--accent);opacity:.7}.agent-node .head{display:flex;align-items:center;justify-content:space-between;gap:8px}.agent-node .head-right{display:flex;align-items:center;gap:6px}.ctx-donut{background:transparent;border:none;padding:0;cursor:pointer;line-height:0;border-radius:50%;transition:filter .12s ease,transform .12s ease}.ctx-donut:hover{filter:brightness(1.2);transform:scale(1.08)}.ctx-donut:active{transform:scale(.94)}.ctx-donut:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.ctx-modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#0000008c;display:flex;align-items:center;justify-content:center;z-index:100;padding:24px;animation:fadeIn .14s ease-out}.ctx-modal{background:var(--panel);border:1px solid var(--line);border-radius:12px;box-shadow:0 20px 50px #00000080;width:min(560px,100%);max-height:80vh;overflow:auto;padding:18px 20px 22px;color:var(--text);animation:popIn .18s cubic-bezier(.22,1,.36,1)}.ctx-modal-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:14px}.ctx-modal-title{font-size:14px;font-weight:600}.ctx-modal-sub{font-size:11px;color:var(--muted);margin-top:3px}.ctx-modal-close{transition:color .12s,transform .14s cubic-bezier(.23,1,.32,1)}.ctx-modal-close:hover{color:var(--text)}.ctx-window-row{margin-bottom:16px}.ctx-window-bar{position:relative;height:10px;border-radius:999px;background:var(--bg-soft);border:1px solid var(--line);overflow:hidden}.ctx-window-fill{height:100%;background:linear-gradient(90deg,var(--accent),var(--inflight));transition:width .4s ease}.ctx-window-meta{display:flex;justify-content:space-between;font-size:11px;margin-top:6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--muted)}.ctx-window-pct{color:var(--text);font-weight:600}.ctx-section-title{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin:18px 0 8px;font-weight:600}.ctx-grid{display:grid;grid-template-columns:1fr 1fr;gap:4px 16px}.ctx-row{display:flex;justify-content:space-between;padding:4px 0;font-size:12px;border-bottom:1px dashed var(--line)}.ctx-row.accent .ctx-row-val{color:var(--accent);font-weight:600}.ctx-row-label{color:var(--muted)}.ctx-row-val{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-variant-numeric:tabular-nums}.ctx-empty{font-size:12px;color:var(--muted);padding:8px 0}.ctx-md-list{list-style:none;padding:0;margin:0}.ctx-md-list li{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:6px 0;border-bottom:1px dashed var(--line);font-size:12px}.ctx-md-path{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ctx-md-size{color:var(--muted);font-variant-numeric:tabular-nums;flex-shrink:0}.agent-node .title{display:flex;align-items:center;gap:8px;min-width:0}.agent-node .title .label{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:160px}.agent-node .time{font-variant-numeric:tabular-nums;font-size:11px;color:var(--muted);font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.state-pill{display:inline-flex;align-items:center;padding:1px 7px;font-size:10px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;border-radius:999px;border:1px solid transparent}.state-pill.state-active{color:var(--inflight);border-color:#f0abfc66;background:#f0abfc14}.state-pill.state-active:before{content:"";width:5px;height:5px;border-radius:50%;background:var(--inflight);box-shadow:0 0 6px var(--inflight);margin-right:5px;animation:pulse var(--pulse-live) infinite}.state-pill.state-done{color:var(--ok);border-color:#86efac59;background:#86efac14}.state-pill.state-err{color:var(--err);border-color:#fca5a566;background:#fca5a514}.agent-node .waiting-row{display:flex;align-items:center;gap:6px;margin-top:7px;padding:3px 7px;border:1px solid transparent;border-radius:6px;font-size:10px;font-weight:600;min-width:0}.agent-node .waiting-row.permission{color:var(--warn);border-color:color-mix(in srgb,var(--warn) 85%,transparent)}.agent-node .waiting-row.idle{color:var(--accent);border-color:color-mix(in srgb,var(--accent) 85%,transparent)}.agent-node .waiting-said{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-node .waiting-row b{font-weight:700;font-variant-numeric:tabular-nums}.waiting-dot{width:5px;height:5px;border-radius:50%;background:currentColor;flex-shrink:0}.agent-node .approval-blind-row{display:flex;align-items:center;gap:6px;margin-top:7px;padding:3px 7px;font-size:10px;font-weight:600;min-width:0;color:var(--muted);font-style:italic}.agent-node .approval-blind-said{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.approval-blind-dot{width:5px;height:5px;border-radius:50%;border:1px solid currentColor;flex-shrink:0}.agent-node .sub{color:var(--muted);font-size:11px;margin-top:3px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-node .session-name{margin-top:4px;font-size:11px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tool-spark-row{display:flex;align-items:center;gap:8px;margin-top:6px;height:14px}.tool-spark{flex:0 0 auto;overflow:visible}.tool-spark-bar{fill:var(--muted);transition:fill .2s}.tool-spark-bar.active{fill:var(--accent);opacity:.72}.tool-spark-bar.latest{fill:var(--inflight);opacity:1;filter:drop-shadow(0 0 3px rgba(240,171,252,.55))}.tool-spark-label{color:var(--muted);font-size:9px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.04em;text-transform:uppercase}:root[data-theme=light] .tool-spark-bar{fill:var(--muted-dim)}:root[data-theme=light] .tool-spark-bar.active{fill:var(--accent);opacity:.85}:root[data-theme=light] .tool-spark-bar.latest{fill:var(--inflight);filter:drop-shadow(0 0 3px rgba(126,34,206,.45))}.agent-node .meta{color:var(--muted);font-size:11px;margin-top:8px;display:flex;gap:12px}.agent-node .meta b{color:var(--text);font-weight:600}.agent-node .meta .inflight-meta,.agent-node .meta .inflight-meta b{color:var(--inflight)}.agent-node .meta .tokens-meta{color:var(--accent);margin-left:auto}.agent-node .meta .tokens-meta b{color:var(--accent)}.agent-node .meta .cost-meta{color:var(--ok);display:inline-flex;align-items:baseline;gap:4px}.agent-node .meta .cost-meta b{color:var(--ok)}.agent-node .meta .cost-unpriced{color:var(--muted);font-style:italic}.agent-node .meta .cost-meta .cost-rate{color:var(--muted);font-size:9px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.02em}.tokens-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px 12px;padding:8px 10px;background:var(--bg-soft);border:1px solid var(--line);border-radius:8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.tokens-grid>div{display:flex;justify-content:space-between;align-items:baseline}.tokens-grid .k{color:var(--muted);font-size:10px;text-transform:uppercase;letter-spacing:.06em}.tokens-grid b{color:var(--text);font-weight:600;font-variant-numeric:tabular-nums}.agent-node.synthetic{border-style:dashed;opacity:.92}.agent-node .synth-tag{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;border-radius:50%;border:1px solid var(--muted);color:var(--muted);font-size:10px;font-weight:700;margin-left:4px}.spawn-badge{display:inline-flex;align-items:center;padding:1px 6px;margin-left:6px;border-radius:999px;border:1px solid var(--line);color:var(--accent);background:var(--bg-soft);font-size:10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:600}.model-chip{display:inline-flex;align-items:center;padding:1px 7px;margin-left:6px;border-radius:999px;border:1px solid var(--line);color:var(--text);background:var(--bg-soft);font-size:10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:600;letter-spacing:.02em}.model-chip[data-family=opus]{color:#f0abfc;border-color:#f0abfc66;background:#f0abfc0f}.model-chip[data-family=sonnet]{color:#7dd3fc;border-color:#7dd3fc66;background:#7dd3fc0f}.model-chip[data-family=haiku]{color:#86efac;border-color:#86efac66;background:#86efac0f}.model-chip[data-family=fable],.model-chip[data-family=mythos]{color:#fcd34d;border-color:#fcd34d66;background:#fcd34d0f}:root[data-theme=light] .model-chip[data-family=opus]{color:#6b21a8;border-color:#7e22ce8c;background:#7e22ce24}:root[data-theme=light] .model-chip[data-family=sonnet]{color:#075985;border-color:#0369a18c;background:#0369a124}:root[data-theme=light] .model-chip[data-family=haiku]{color:#166534;border-color:#15803d8c;background:#15803d24}:root[data-theme=light] .model-chip[data-family=fable],:root[data-theme=light] .model-chip[data-family=mythos]{color:#92400e;border-color:#b453098c;background:#b4530924}.react-flow__edge-textbg{fill:var(--bg-soft);fill-opacity:.9}.react-flow__edge-text{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;fill:var(--text)}.session-clusters{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:0;transform-origin:0 0;will-change:transform}.cluster-card{position:absolute;border-radius:16px;border:1px solid hsl(var(--session-hue, 200) 65% var(--session-rim-l) / .32);background:hsl(var(--session-hue, 200) 70% 50% / .04);transition:opacity .2s ease,left .32s cubic-bezier(.22,1,.36,1),top .32s cubic-bezier(.22,1,.36,1),width .32s cubic-bezier(.22,1,.36,1),height .32s cubic-bezier(.22,1,.36,1);overflow:visible;pointer-events:auto;cursor:grab}.cluster-label{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;padding:3px 10px;border-radius:999px;background:var(--bg);color:hsl(var(--session-hue, 200) 70% var(--session-label-l));border:1px solid hsl(var(--session-hue, 200) 65% var(--session-rim-l) / .5);box-shadow:0 2px 6px #00000040;white-space:nowrap;line-height:1;cursor:pointer;pointer-events:auto;-webkit-user-select:none;user-select:none;transition:box-shadow .12s ease,filter .12s ease}.cluster-label-name{text-transform:none;letter-spacing:.02em}.cluster-label:hover{filter:brightness(1.25);box-shadow:0 4px 14px #00000073,0 0 0 1px currentColor}.session-group-handle{cursor:grab;background:transparent}.react-flow__node-sessionGroup{cursor:grab}.react-flow__node-sessionGroup.dragging,.react-flow__node-sessionGroup:active{cursor:grabbing}.react-flow__node-sessionGroup.selected{box-shadow:none}:root[data-theme=light] .cluster-label{background:var(--bg-soft);box-shadow:0 1px 4px #0f172a14}:root[data-theme=light] .cluster-label:hover{filter:brightness(.9)}.tool-bursts-layer{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:5;overflow:visible}.tool-bursts-svg{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;pointer-events:none;overflow:visible}.tool-conn{fill:none;stroke-width:1.4;stroke-dasharray:5 4;stroke-linecap:round;transition:opacity .3s ease}.tool-conn.status-inflight{stroke:var(--inflight);animation:dashflow .7s linear infinite;filter:drop-shadow(0 0 4px rgba(240,171,252,.45))}.tool-conn.status-done{stroke:#86efacd9}.tool-conn.status-err{stroke:#fca5a5d9}.tool-conn.fading{stroke-dasharray:4 6}.tool-burst-wrap{position:absolute;pointer-events:none;will-change:transform}.tool-burst{display:inline-flex;align-items:center;gap:6px;padding:5px 11px 5px 9px;border-radius:999px;background:var(--panel);border:1px solid var(--line);font-size:11px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;box-shadow:0 4px 14px #00000059,0 0 0 1px #00000040;white-space:nowrap;color:var(--text);animation:bubble-spawn .22s cubic-bezier(.34,1.56,.64,1) both}.tool-burst .tb-emoji{font-size:13px;line-height:1;filter:saturate(1.2);display:inline-block}.tool-burst .tb-name{font-weight:600;letter-spacing:.01em}.tool-burst .tb-spin{width:8px;height:8px;border-radius:50%;background:radial-gradient(circle at 30% 30%,var(--inflight),transparent 70%);box-shadow:0 0 8px var(--inflight);animation:pulse var(--pulse-live) infinite}.tool-burst .tb-mark{font-weight:700;font-size:12px;line-height:1;margin-left:2px;animation:mark-pop .26s cubic-bezier(.34,1.56,.64,1) both}.tool-burst .tb-mark.done{color:var(--ok);text-shadow:0 0 6px rgba(134,239,172,.55)}.tool-burst .tb-mark.err{color:var(--err);text-shadow:0 0 6px rgba(252,165,165,.55)}.tool-burst.status-inflight{border-color:#f0abfc8c;background:linear-gradient(180deg,#f0abfc1a,#7dd3fc0d),var(--panel);box-shadow:0 0 0 1px #f0abfc4d,0 6px 18px #f0abfc40}.tool-burst.status-inflight .tb-emoji{animation:emoji-wobble 1.6s ease-in-out infinite}.tool-burst.status-done{border-color:#86efac8c;background:linear-gradient(180deg,rgba(134,239,172,.1),transparent),var(--panel);box-shadow:0 0 0 1px #86efac38,0 4px 14px #86efac26;animation:bubble-spawn .22s cubic-bezier(.34,1.56,.64,1) both,bubble-done-flash .52s ease-out}.tool-burst.status-err{border-color:#fca5a599;background:linear-gradient(180deg,rgba(252,165,165,.1),transparent),var(--panel);box-shadow:0 0 0 1px #fca5a559,0 4px 12px #fca5a52e;animation:bubble-spawn .22s cubic-bezier(.34,1.56,.64,1) both,bubble-err-shake .38s ease-in-out}.tool-burst.fading{animation:bubble-fade-move .6s cubic-bezier(.22,.61,.36,1) forwards,bubble-fade-out .6s linear forwards}.tool-burst{position:relative}.tool-burst:before{content:"";position:absolute;left:4px;top:6px;bottom:6px;width:3px;border-radius:2px;background:var(--cat-accent, transparent);opacity:.85}.tool-burst.cat-file{--cat-accent: #7dd3fc}.tool-burst.cat-shell{--cat-accent: #fcd34d}.tool-burst.cat-web{--cat-accent: #67e8f9}.tool-burst.cat-agent{--cat-accent: #f0abfc}.tool-burst.cat-task{--cat-accent: #86efac}.tool-burst.cat-plan{--cat-accent: #c4b5fd}.tool-burst.cat-mcp{--cat-accent: #5eead4}.tool-burst.cat-other{--cat-accent: #94a3b8}.tool-burst.cat-mcp.mcp-hue{--cat-accent: hsl(var(--mcp-hue, 170) 65% var(--mcp-dot-l))}.tool-burst.dim{opacity:.22;filter:saturate(.4);transition:opacity .18s ease,filter .18s ease}.tool-burst.dim:hover{opacity:.6}.tool-burst.sub{font-size:10px;padding:4px 10px 4px 8px;opacity:.94;animation:bubble-spawn .22s .11s cubic-bezier(.34,1.56,.64,1) both}.tool-burst.sub .tb-emoji{font-size:12px}.tool-burst.sub.status-done{animation:bubble-spawn .22s .11s cubic-bezier(.34,1.56,.64,1) both,bubble-done-flash .52s ease-out}.tool-burst.sub.status-err{animation:bubble-spawn .22s .11s cubic-bezier(.34,1.56,.64,1) both,bubble-err-shake .38s ease-in-out}.tool-burst.sub.fading{animation:bubble-fade-move .6s cubic-bezier(.22,.61,.36,1) forwards,bubble-fade-out .6s linear forwards}.tool-burst.clickable{pointer-events:auto;cursor:pointer;transition:translate .12s ease,scale .14s cubic-bezier(.23,1,.32,1),box-shadow .12s ease,opacity .18s ease,filter .18s ease}.tool-burst.clickable:hover{translate:0 -1px;box-shadow:0 6px 18px #00000073,0 0 0 1px var(--cat-accent, rgba(255,255,255,.15))}.tool-burst.clickable:active{scale:.97}@keyframes bubble-spawn{0%{opacity:0;transform:translate(var(--spawn-dx, -28px),var(--spawn-dy, 0)) scale(.92);filter:blur(3px) brightness(1.4)}55%{opacity:1;transform:translate(0) scale(1.06);filter:blur(0) brightness(1.15);animation-timing-function:cubic-bezier(.23,1,.32,1)}to{transform:translate(0) scale(1)}}@keyframes bubble-done-flash{0%{scale:1;box-shadow:0 0 0 1px #86efac38,0 4px 14px #86efac26}40%{scale:1.14;box-shadow:0 0 0 2px #86efac8c,0 0 22px #86efac8c}to{scale:1;box-shadow:0 0 0 1px #86efac38,0 4px 14px #86efac26}}@keyframes bubble-err-shake{0%,to{translate:0}15%{translate:-4px}35%{translate:4px}55%{translate:-3px}75%{translate:2px}}@keyframes bubble-fade-move{0%{transform:scale(1) translate(0);filter:blur(0)}to{transform:scale(.82) translate(18px,-4px);filter:blur(1.5px)}}@keyframes bubble-fade-out{0%{opacity:1}to{opacity:0}}@keyframes emoji-wobble{0%,to{transform:rotate(-6deg) scale(1)}50%{transform:rotate(6deg) scale(1.08)}}@keyframes mark-pop{0%{opacity:0;transform:scale(.3) rotate(-30deg)}to{opacity:1;transform:scale(1) rotate(0)}}:root[data-theme=light] .tool-burst{box-shadow:0 2px 8px #0f172a1a,0 0 0 1px #0f172a0a}:root[data-theme=light] .tool-burst.status-inflight{border-color:#7e22ce8c;background:linear-gradient(180deg,rgba(126,34,206,.06),transparent),var(--panel);box-shadow:0 0 0 1px #7e22ce33,0 6px 14px #7e22ce2e}:root[data-theme=light] .tool-burst.status-done{border-color:#15803d80}:root[data-theme=light] .tool-burst.status-err{border-color:#b91c1c8c}:root[data-theme=light] .tool-conn.status-inflight{stroke:#7e22ced9;filter:drop-shadow(0 0 3px rgba(126,34,206,.35))}:root[data-theme=light] .tool-conn.status-done{stroke:#15803dd9}:root[data-theme=light] .tool-conn.status-err{stroke:#b91c1cd9}.session-list{grid-column:1;grid-row:2 / -1;background:var(--panel);border-right:1px solid var(--line);display:flex;flex-direction:column;min-height:0;overflow-y:auto}.session-list .sl-header{display:flex;align-items:center;gap:8px;padding:12px var(--panel-inset) 10px;border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--panel);z-index:1}.up-header h2,.ap-header h2,.session-list .sl-header h2{font-size:13px;font-weight:600}.session-list .sl-header h2{margin:0;flex:1;display:inline-flex;align-items:center;gap:8px}.session-list .sl-count{display:inline-flex;align-items:center;padding:1px 7px;border-radius:999px;background:var(--bg-soft);border:1px solid var(--line);color:var(--text);font-size:10px;font-weight:600;text-transform:none;letter-spacing:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.session-list .sl-live-count{font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--inflight);font-weight:600}.session-list .sl-waiting-count{font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--warn);font-weight:600}.session-list .sl-close{width:26px;height:26px}.session-list .sl-rows{--sl-card-gutter: 4px;--sl-card-edge: 1px;flex:1;padding:6px var(--sl-card-gutter);display:flex;flex-direction:column;gap:4px}.session-list .sl-empty{padding:16px 12px;color:var(--muted);font-size:12px;font-style:italic}.session-list .sl-row{display:flex;align-items:flex-start;gap:9px;padding:9px calc(var(--panel-inset) - var(--sl-card-gutter) - var(--sl-card-edge));background:transparent;border-width:var(--sl-card-edge);border-style:solid;border-color:transparent;border-radius:8px;cursor:pointer;text-align:left;color:var(--text);font:inherit;transition:background .12s,border-color .12s,transform .14s cubic-bezier(.23,1,.32,1);min-width:0}.session-list .sl-row:hover{background:var(--bg-soft);border-color:var(--ctl-edge)}.session-list .sl-row:active{transform:scale(.97)}.session-list .sl-row.selected{background:var(--bg-soft);border-color:var(--accent)}.session-list .sl-row:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.sl-dot{display:inline-flex;align-items:center;justify-content:center;width:10px;height:10px;margin-top:5px;flex:0 0 10px;font-size:11px;font-weight:700;line-height:1;color:var(--muted)}.sl-dot:before{content:"";width:8px;height:8px;border-radius:50%;background:currentColor}.up-session-row .sl-dot{margin-top:0}.sl-dot.state-active{color:var(--inflight)}.sl-dot.state-active:before{box-shadow:0 0 8px var(--inflight);animation:pulse var(--pulse-live) infinite}.sl-dot.state-done{color:var(--ok)}.sl-dot.state-done:before{content:"✓";width:auto;height:auto;background:none}.sl-dot.state-err{color:var(--err)}.sl-dot.state-err:before{content:"×";width:auto;height:auto;background:none}.session-list .sl-row-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}.session-list .sl-row-head{display:flex;align-items:center;gap:6px;min-width:0}.session-list .sl-label{font-weight:600;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;flex:1}.session-list .sl-row-meta{display:flex;flex-wrap:wrap;gap:8px;font-size:11px;color:var(--muted);font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.session-list .sl-row-meta b{color:var(--text);font-weight:600;font-variant-numeric:tabular-nums}.session-list .sl-cost b{color:var(--ok)}.session-list .sl-elapsed{margin-left:auto}.session-list .sl-waiting{margin-left:auto;color:var(--warn);font-weight:600}.session-list .sl-waiting-tool{font-weight:500;opacity:.75}.detail-hero{display:flex;flex-direction:column;gap:8px;padding:4px 0 14px;border-bottom:1px solid var(--line)}.detail-hero .hero-line{display:flex;align-items:center;gap:10px;min-width:0}.detail-hero .hero-title{margin:0;font-size:18px;font-weight:600;letter-spacing:.01em;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.detail-hero .hero-meta{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--muted);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;flex-wrap:wrap}.detail-hero .hero-meta-item{letter-spacing:.03em}.detail-hero .hero-sep{color:var(--text-dim)}.detail-hero .hero-cost{margin-top:8px;padding:10px 12px;background:var(--bg-soft);border:1px solid var(--line);border-radius:10px}.detail-hero .hero-actions{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}.detail-hero .hero-action-btn{padding:5px 12px;font-size:11px}.detail-hero .hero-cost-headline{display:flex;align-items:baseline;gap:6px;margin-bottom:8px}.detail-hero .hero-cost-value{font-size:22px;font-weight:700;color:var(--ok);font-variant-numeric:tabular-nums;letter-spacing:-.01em}.detail-hero .hero-cost-label{font-size:10px;text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}.cost-bar{display:flex;height:8px;width:100%;border-radius:4px;overflow:hidden;background:var(--line)}.cost-bar .cb-seg{height:100%;display:block;transition:filter .12s ease;box-shadow:-1px 0 0 var(--panel)}.cost-bar .cb-seg:hover{filter:brightness(1.3)}:root[data-theme=light] .cost-bar .cb-seg:hover{filter:brightness(.85)}.cost-bar .cb-input{background:var(--usage-blue)}.cost-bar .cb-output{background:var(--usage-purple)}.cost-bar .cb-cache-r{background:var(--usage-green)}.cost-bar .cb-cache-w{background:var(--usage-amber)}.detail-section{display:flex;flex-direction:column;gap:8px;padding-top:4px}.detail-section h3{display:flex;align-items:center;gap:8px}.detail-section h3 .section-count{display:inline-flex;align-items:center;padding:1px 7px;border-radius:999px;background:var(--bg-soft);border:1px solid var(--line);color:var(--text);font-size:10px;font-weight:600;text-transform:none;letter-spacing:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.activity-row{display:flex;flex-direction:column;gap:8px}.activity-counters{display:flex;gap:12px;font-size:12px;color:var(--muted)}.activity-counters .ac-item b{color:var(--text);font-weight:600;font-variant-numeric:tabular-nums}.activity-counters .ac-live,.activity-counters .ac-live b{color:var(--inflight)}.activity-counters .ac-err,.activity-counters .ac-err b{color:var(--err)}.cat-strip{display:flex;flex-wrap:wrap;gap:5px}.cat-chip{display:inline-flex;align-items:center;gap:5px;padding:3px 9px 3px 7px;border-radius:999px;border:1px solid var(--line);background:var(--bg-soft);font-size:11px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.cat-chip .cat-emoji{font-size:12px;line-height:1}.cat-chip .cat-count{color:var(--text);font-weight:600;font-variant-numeric:tabular-nums}.cat-chip .cat-server{color:var(--muted);max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cat-chip.cat-file{border-color:#7dd3fc66}.cat-chip.cat-shell{border-color:#fcd34d66}.cat-chip.cat-web{border-color:#67e8f966}.cat-chip.cat-agent{border-color:#f0abfc66}.cat-chip.cat-task{border-color:#86efac66}.cat-chip.cat-plan{border-color:#c4b5fd66}.cat-chip.cat-mcp{border-color:#5eead466}.cat-chip.cat-other{border-color:#94a3b866}.cat-chip.cat-mcp.mcp-hue{border-color:hsl(var(--mcp-hue, 170) 65% var(--mcp-dot-l) / .4)}.prompts{display:flex;flex-direction:column;gap:8px}.prompt-entry{border:1px solid var(--line);border-radius:8px;padding:8px 10px;background:var(--bg-soft)}.prompt-time{color:var(--muted);font-size:10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.04em;text-transform:uppercase;margin-bottom:4px}.prompt-text{font-size:12px;line-height:1.5;color:var(--text);white-space:pre-wrap;word-break:break-word}button.tool.clickable{width:100%;background:transparent;border:none;border-bottom:1px solid var(--line-soft);text-align:left;cursor:pointer;color:var(--text);font:inherit;padding:6px 0;display:flex;align-items:center;gap:8px;justify-content:space-between;border-radius:4px;transition:background .12s,transform .14s cubic-bezier(.23,1,.32,1)}button.tool.clickable{padding-left:6px;padding-right:6px}button.tool.clickable:hover{background:var(--ctl-fill)}button.tool.clickable:active{transform:scale(.97)}button.tool.clickable:last-child{border-bottom:none}.shortcuts{display:grid;grid-template-columns:auto 1fr;gap:6px 12px;align-items:center}.shortcuts .sc{display:contents}.shortcuts .sc kbd{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;font-weight:600;color:var(--text);background:var(--bg-soft);border:1px solid var(--line);border-bottom-width:2px;border-radius:4px;padding:2px 7px;text-align:center;min-width:38px}.shortcuts .sc span{color:var(--muted);font-size:12px}.empty-hero .hint-row{margin-top:14px;font-size:12px;opacity:.75}.empty-hero .hint-row+.hint-row{margin-top:6px}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#0506098c;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:100;animation:fadeIn .14s ease-out}:root[data-theme=light] .modal-backdrop{background:#0f172a4d}.modal{width:min(820px,92vw);max-height:82vh;display:flex;flex-direction:column;background:var(--panel);border:1px solid var(--line);border-radius:12px;box-shadow:var(--shadow-2),0 0 0 1px #7dd3fc1a;overflow:hidden;animation:popIn .18s cubic-bezier(.22,1,.36,1)}.modal-head{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--line);background:var(--bg-soft)}.modal-title{display:flex;align-items:center;gap:10px;min-width:0}.modal-title .status-dot{display:inline-block;width:8px;height:8px;border-radius:50%}.modal-title .status-dot.inflight{background:var(--inflight);animation:pulse var(--pulse-live) infinite}.modal-title .status-dot.done{background:var(--ok)}.modal-title .status-dot.err{background:var(--err)}.modal-tool-name{font-weight:600;font-size:14px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.modal-tool-id{color:var(--muted);font-size:11px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.modal-actions{display:flex;align-items:center;gap:8px}.modal-dur{color:var(--muted);font-size:12px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.modal-body{padding:16px;overflow:auto;display:flex;flex-direction:column;gap:16px}.modal-section h4{margin:0 0 6px;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);font-weight:600;display:flex;align-items:center;gap:8px}.modal-section .err-tag{font-size:9px;font-weight:700;padding:1px 6px;border-radius:4px;color:var(--err);background:#fca5a51a;border:1px solid rgba(252,165,165,.3)}.modal-note{margin:0;padding:8px 12px;border:1px solid var(--line);border-radius:8px;background:var(--bg);color:var(--muted);font-size:11px;line-height:1.5}.modal-section pre{margin:0;padding:12px;background:var(--bg);border:1px solid var(--line);border-radius:8px;color:var(--text);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.5;white-space:pre-wrap;word-break:break-word;max-height:320px;overflow:auto}@keyframes fadeIn{0%{opacity:0}}@keyframes popIn{0%{opacity:0;transform:translateY(4px) scale(.985)}to{opacity:1;transform:none}}.modal.clear-confirm{width:min(440px,92vw)}.clear-confirm .cc-actions{display:flex;justify-content:flex-end;gap:8px}.modal.key-help{width:min(560px,92vw)}.kh-group{grid-column:1 / -1;margin:10px 0 0;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);font-weight:600}.kh-group:first-child{margin-top:0}.modal.release-notes{width:min(620px,92vw)}.release-notes .rn-version{margin:0 0 10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;font-weight:600;color:var(--muted)}.release-notes .rn-notes{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:14px}.release-notes .rn-note{border-left:2px solid var(--line);padding-left:12px}.release-notes .rn-note-title{margin:0 0 4px;font-size:13px;font-weight:600;line-height:1.45;color:var(--text)}.release-notes .rn-note-icon{margin-right:.15em}.release-notes .rn-note-body{margin:0;font-size:12px;line-height:1.65;color:var(--muted);white-space:pre-line}.session-summary{width:min(720px,92vw)}.session-summary .ss-hero{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.6fr);gap:22px;padding:18px 18px 20px;background:linear-gradient(180deg,rgba(134,239,172,.05),transparent);border-bottom:1px solid var(--line)}.session-summary .ss-hero-left{display:flex;flex-direction:column;gap:8px;min-width:0}.session-summary .ss-cost-label{font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}.session-summary .ss-cost{font-size:34px;font-weight:700;color:var(--ok);font-variant-numeric:tabular-nums;letter-spacing:-.02em;line-height:1}.session-summary .ss-models{display:flex;gap:6px;flex-wrap:wrap}.session-summary .ss-hero-right{display:flex;flex-direction:column;justify-content:center;gap:10px;min-width:0}.cost-bar.cost-bar-lg{height:14px;border-radius:7px}.session-summary .ss-cost-legend{display:grid;grid-template-columns:1fr 1fr;gap:6px 16px;font-size:11px;color:var(--muted);font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.session-summary .ssl{display:inline-flex;align-items:baseline;gap:5px}.session-summary .ssl b{color:var(--text);font-weight:600;font-variant-numeric:tabular-nums}.session-summary .ssl:before{content:"";display:inline-block;width:8px;height:8px;border-radius:2px;margin-right:1px}.session-summary .ssl-in:before{background:var(--usage-blue)}.session-summary .ssl-out:before{background:var(--usage-purple)}.session-summary .ssl-cr:before{background:var(--usage-green)}.session-summary .ssl-cw:before{background:var(--usage-amber)}.session-summary .ss-stats{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:6px;padding:14px 18px;border-bottom:1px solid var(--line)}.session-summary .ss-stat{display:flex;flex-direction:column;gap:2px;padding:8px 10px;background:var(--bg-soft);border:1px solid var(--line);border-radius:8px}.session-summary .ss-stat-value{font-size:18px;font-weight:600;color:var(--text);font-variant-numeric:tabular-nums;letter-spacing:-.01em;line-height:1.1}.session-summary .ss-stat-label{font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}.session-summary .ss-stat.tone-err .ss-stat-value{color:var(--err)}@media(max-width:640px){.session-summary .ss-hero{grid-template-columns:1fr}.session-summary .ss-stats{grid-template-columns:repeat(3,minmax(0,1fr))}}.session-summary .ss-top-tools{display:flex;flex-direction:column;gap:6px}.session-summary .ss-tt{display:grid;grid-template-columns:130px 1fr 36px;gap:10px;align-items:center}.session-summary .ss-tt-name{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.session-summary .ss-tt-bar{height:6px;background:var(--line);border-radius:3px;overflow:hidden}.session-summary .ss-tt-bar-fill{display:block;height:100%;background:linear-gradient(90deg,var(--accent),var(--inflight));border-radius:3px}.session-summary .ss-tt-count{text-align:right;font-variant-numeric:tabular-nums;font-size:11px;color:var(--muted)}.session-summary .ss-prompt{font-size:12px;line-height:1.55;color:var(--text);padding:10px 12px;background:var(--bg-soft);border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:4px;white-space:pre-wrap;word-break:break-word;max-height:200px;overflow:auto}.empty-hero{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none;color:var(--muted);-webkit-user-select:none;user-select:none;max-width:520px}.empty-hero .orbit-stack{position:relative;width:260px;height:260px;margin:0 auto 28px}.empty-hero .orbit{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;border:1px dashed rgba(125,211,252,.18)}.empty-hero .orbit.r1{top:0;right:0;bottom:0;left:0;animation:spin 22s linear infinite}.empty-hero .orbit.r2{top:30px;right:30px;bottom:30px;left:30px;animation:spin 14s linear infinite reverse;border-color:#f0abfc33}.empty-hero .orbit.r3{top:60px;right:60px;bottom:60px;left:60px;animation:spin 9s linear infinite;border-color:#86efac38}.empty-hero .orbit .dot{position:absolute;width:14px;height:14px;border-radius:50%;top:-7px;left:50%;margin-left:-7px}.empty-hero .orbit.r1 .dot{background:var(--accent);box-shadow:0 0 22px var(--accent)}.empty-hero .orbit.r2 .dot{background:var(--inflight);box-shadow:0 0 22px var(--inflight);width:12px;height:12px;margin-left:-6px;top:-6px}.empty-hero .orbit.r3 .dot{background:var(--ok);box-shadow:0 0 22px var(--ok);width:10px;height:10px;margin-left:-5px;top:-5px}.empty-hero .orbit .dot.b{top:auto;bottom:-7px}.empty-hero .orbit.r2 .dot.b{bottom:-6px}.empty-hero .orbit.r3 .dot.b{bottom:-5px}.empty-hero .core{position:absolute;top:50%;left:50%;width:56px;height:56px;margin:-28px 0 0 -28px;border-radius:50%;background:radial-gradient(circle at 30% 30%,#f0abfc,#7dd3fc 55%,#14161b);box-shadow:0 0 28px #f0abfc8c,0 0 64px #7dd3fc59;animation:corepulse 2.6s ease-in-out infinite}.empty-hero .core:after{content:"";position:absolute;top:-14px;right:-14px;bottom:-14px;left:-14px;border-radius:50%;border:1px solid rgba(255,255,255,.06);animation:corewave 2.6s ease-out infinite}@keyframes corepulse{0%,to{transform:scale(1);filter:brightness(1)}50%{transform:scale(1.08);filter:brightness(1.15)}}@keyframes corewave{0%{transform:scale(.85);opacity:.6}to{transform:scale(1.6);opacity:0}}.empty-hero h2{color:var(--text);font-size:18px;font-weight:600;margin:0 0 8px;letter-spacing:.01em}.empty-hero p{margin:0;font-size:13px;line-height:1.65}.empty-hero code{background:var(--bg-soft);border:1px solid var(--line);padding:2px 7px;border-radius:5px;color:var(--text);font-size:12px}@keyframes spin{to{transform:rotate(360deg)}}:root[data-theme=light] .topbar .status .pill.live{border-color:#15803d73;background:#e8f2eb}:root[data-theme=light] .topbar .status .pill.paused{border-color:#b4530980;background:#f8eee6}:root[data-theme=light] .topbar .status .pill.dead{border-color:#b91c1c80;background:#f8e8e8}:root[data-theme=light] .agent-node.state-active{border-color:#7e22cea6;box-shadow:0 0 0 1px #7e22ce4d,0 8px 22px #7e22ce2e}:root[data-theme=light] .agent-node.state-done{border-color:var(--ok)}:root[data-theme=light] .agent-node.state-err{border-color:var(--err)}:root[data-theme=light] .state-pill.state-active{border-color:#7e22ce73;background:#7e22ce1a}:root[data-theme=light] .state-pill.state-active:before{box-shadow:0 0 5px #7e22ce8c}:root[data-theme=light] .state-pill.state-done{border-color:#15803d73;background:#15803d1a;color:#166534}:root[data-theme=light] .state-pill.state-err{border-color:#b91c1c80;background:#b91c1c1a}:root[data-theme=light] .modal-section .err-tag{background:#b91c1c1a;border-color:#b91c1c73}:root[data-theme=light] .empty-hero .orbit{border-color:#0369a14d}:root[data-theme=light] .empty-hero .orbit.r2{border-color:#7e22ce4d}:root[data-theme=light] .empty-hero .orbit.r3{border-color:#15803d52}:root[data-theme=light] .empty-hero .core{background:radial-gradient(circle at 30% 30%,#c084fc,#0ea5e9 55%,#1e293b);box-shadow:0 0 28px #7e22ce66,0 0 64px #0369a140}:root[data-theme=light] .conn-banner{background:linear-gradient(90deg,rgba(185,28,28,.14),transparent);border-bottom-color:#b91c1c73}:root[data-theme=light] .react-flow__edge-path{stroke:#0369a166}:root[data-theme=light] .react-flow__minimap-node{stroke:#0f172a40}.usage-panel{position:fixed;top:60px;right:368px;width:280px;max-height:calc(100vh - 76px);overflow-y:auto;background:var(--panel);border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow-2);z-index:20;padding:0 0 12px}.up-header{display:flex;align-items:center;gap:8px;padding:10px var(--panel-inset) 8px;border-bottom:1px solid var(--line-soft);position:sticky;top:0;background:var(--panel);z-index:1}.up-header h2{margin:0;flex:1}.up-header-right{display:flex;align-items:center;gap:4px}.up-rate{font-size:11px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-variant-numeric:tabular-nums;color:var(--inflight);padding:2px 6px;border-radius:999px;background:#f0abfc1f}.up-close{color:var(--muted)}.up-period{display:flex;margin:12px var(--panel-inset) 0;width:fit-content}.up-stale{opacity:var(--dim-stale);transition:opacity .14s ease-out}.up-dot-past{visibility:hidden}.up-session-id{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--text-dim)}.up-total{display:flex;align-items:baseline;gap:8px;padding:14px var(--panel-inset) 6px}.up-total-value{font-size:26px;font-weight:700;font-variant-numeric:tabular-nums;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--ok);line-height:1}.up-total-label{font-size:11px;color:var(--muted)}.usage-panel .cost-bar{margin:4px 14px 10px;width:auto;border-radius:3px}.up-tokens-row{display:flex;flex-wrap:wrap;gap:10px 16px;padding:6px var(--panel-inset) 10px}.up-tok{display:flex;align-items:baseline;gap:5px;font-size:12px;font-variant-numeric:tabular-nums;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.up-k,.up-scope{font-size:10px;color:var(--muted);font-family:inherit}.up-section{padding:0 14px;margin-top:4px;border-top:1px solid var(--line-soft)}.up-section-title{display:flex;align-items:baseline;gap:8px;margin:8px 0 6px;font-size:11px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}.up-section-age{margin-left:auto;font-size:10px;font-weight:400;color:var(--text-dim);text-transform:none;letter-spacing:0;white-space:nowrap}.up-table{width:100%;border-collapse:collapse;font-size:12px}.up-table th{text-align:left;color:var(--muted);font-weight:500;font-size:10px;padding:0 0 4px;border-bottom:1px solid var(--line-soft)}.up-table th:not(:first-child){text-align:right}.up-table td{padding:4px 0;vertical-align:middle}.up-model-name{color:var(--text);font-weight:500;max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.up-num{text-align:right;font-variant-numeric:tabular-nums;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--muted);font-size:11px}.up-cost-val{color:var(--ok)}.up-sessions{display:flex;flex-direction:column;gap:4px}.up-session-row{display:flex;align-items:center;gap:7px;font-size:12px;padding:3px 0}.up-session-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}.up-session-tokens{font-variant-numeric:tabular-nums;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;color:var(--muted)}.up-session-cost{font-variant-numeric:tabular-nums;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;color:var(--ok);min-width:36px;text-align:right}.up-unpriced{color:var(--muted);font-style:italic}.up-hint{padding:8px 14px 4px;font-size:11px;color:var(--muted);line-height:1.5}.up-empty{padding:20px 14px;font-size:12px;color:var(--muted);text-align:center;line-height:1.6}.app:not(:has(.detail)) .usage-panel{right:8px}.up-quota-section{padding-top:10px;border-top:none}.up-refresh-btn{padding:1px 7px}.up-quota-bars{display:flex;flex-direction:column;gap:10px}.qb-row{display:flex;flex-direction:column;gap:3px}.qb-meta{display:flex;justify-content:space-between;align-items:baseline;font-size:11px}.qb-label{color:var(--muted)}.qb-pct{font-variant-numeric:tabular-nums;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;font-weight:600}.qb-track{position:relative;height:6px;border-radius:3px;background:var(--line);overflow:hidden}.qb-fill{height:100%;border-radius:3px;transition:width .4s ease}.qb-pace-marker{position:absolute;top:0;bottom:0;width:2px;margin-left:-1px;border-radius:1px;box-shadow:0 0 0 1px var(--panel);transition:left .4s ease;z-index:2}.qb-reset-row{display:flex;justify-content:space-between;align-items:baseline;gap:4px;min-height:14px}.qb-reset{font-size:10px;color:var(--text-dim)}.qb-pace{font-size:10px;font-weight:500;text-align:right;flex-shrink:0}.qb-limit-badge{margin-left:4px;font-size:10px}.up-plan-badge{margin-left:6px;padding:1px 5px;border:1px solid var(--line-soft);border-radius:3px;font-size:9px;font-weight:500;color:var(--text-dim);text-transform:none;letter-spacing:0;vertical-align:1px}.up-quota-na{display:flex;flex-direction:column;gap:3px;font-size:11px;color:var(--muted)}.up-quota-hint{color:var(--text-dim)}.up-quota-hint code{background:var(--line);color:var(--text);padding:0 3px;border-radius:3px;font-size:10px}.up-quota-loading{font-size:11px;color:var(--text-dim)}.up-quota-sub{font-size:10px;color:var(--text-dim);margin-top:4px}.up-credits{color:var(--accent)}.up-reset-credits{color:var(--ok)}:root[data-theme=light] .up-rate{background:#7e22ce1a}.uh-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#0000008c;display:flex;align-items:center;justify-content:center;z-index:100;padding:24px;animation:fadeIn .14s ease-out}.uh-modal{background:var(--panel);border:1px solid var(--line);border-radius:12px;box-shadow:0 20px 50px #00000080;width:min(760px,100%);max-height:84vh;overflow:auto;padding:16px 18px 20px;color:var(--text);animation:popIn .18s cubic-bezier(.22,1,.36,1)}.uh-head{display:flex;align-items:center;gap:12px;margin-bottom:14px}.uh-titlewrap{display:flex;flex-direction:column;gap:2px;margin-right:auto}.uh-title{font-size:14px;font-weight:600}.uh-sub{font-size:10px;color:var(--text-dim);font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.uh-range{display:inline-flex;gap:2px;background:var(--bg-soft);border:1px solid var(--line);border-radius:999px;padding:2px}.uh-range-btn{font:inherit;font-size:10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;padding:2px 9px;border:none;border-radius:999px;color:var(--muted);background:transparent;cursor:pointer;transition:background .12s,color .12s,transform .14s cubic-bezier(.23,1,.32,1)}.uh-range-btn:hover{color:var(--text)}.uh-range-btn:active{transform:scale(.97)}.uh-range-btn[aria-pressed=true]{background:var(--accent);color:var(--bg)}.uh-range-btn[aria-pressed=true]:hover{color:var(--bg)}.uh-reload{width:24px;height:24px;padding:0}.uh-reload:disabled{opacity:var(--dim-off);cursor:default}.uh-close{transition:color .12s,transform .14s cubic-bezier(.23,1,.32,1)}.uh-close:hover{color:var(--text)}.uh-status{padding:40px 0;text-align:center;color:var(--muted);font-size:12px}.uh-status.uh-err{color:var(--err);max-width:46ch;margin:0 auto;line-height:1.5}.uh-retry{margin-top:14px}.uh-retry:disabled{opacity:var(--dim-off);cursor:default}.uh-stale{opacity:var(--dim-stale);transition:opacity .12s}.uh-totals{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:14px}.uh-stat{display:flex;flex-direction:column;gap:2px;padding:8px 10px;background:var(--bg-soft);border:1px solid var(--line-soft);border-radius:8px}.uh-stat-val{font-size:14px;font-weight:600;font-variant-numeric:tabular-nums}.uh-stat-val.accent{color:var(--ok)}.uh-stat-label{font-size:9px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em}.uh-agents{margin-bottom:12px}.uh-agent-bar{display:flex;height:6px;border-radius:3px;background:var(--line);overflow:hidden;margin-bottom:7px}.uh-agent-seg{height:100%;box-shadow:-1px 0 0 var(--panel)}.uh-agent-keys{display:flex;flex-wrap:wrap;gap:12px;font-size:11px;color:var(--muted)}.uh-agent-key{display:inline-flex;align-items:center;gap:5px}.uh-agent-cost{color:var(--text);font-variant-numeric:tabular-nums}.uh-agent-share{color:var(--text-dim);font-variant-numeric:tabular-nums}.uh-chart{display:flex;align-items:flex-end;height:168px;margin-bottom:10px;padding-bottom:16px;border-bottom:1px solid var(--line-soft);overflow-x:auto}.uh-bar-col{display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%;position:relative;background:none;border:none;padding:0;cursor:pointer;min-width:24px;transition:transform .14s cubic-bezier(.23,1,.32,1)}.uh-bar-col:focus-visible{outline-offset:-1px}.uh-bar-col:hover .uh-bar{filter:brightness(1.15)}.uh-bar-col:active{transform:scale(.97)}.uh-bar-col.sel .uh-bar{outline:1px solid var(--accent);outline-offset:1px}.uh-bar{width:78%;min-height:1px;display:flex;flex-direction:column;border-radius:2px 2px 0 0;overflow:hidden;transition:height .3s ease}.uh-bar-seg{width:100%;box-shadow:0 -1px 0 var(--panel)}.uh-bar-label{position:absolute;bottom:-15px;font-size:9px;color:var(--text-dim);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;white-space:nowrap;transform:rotate(0);overflow:hidden;max-width:100%;text-overflow:ellipsis}.uh-legend{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:12px;font-size:11px;color:var(--muted)}.uh-legend-item{display:inline-flex;align-items:center;gap:5px}.uh-legend-dot{width:8px;height:8px;border-radius:2px;display:inline-block;flex-shrink:0}.uh-legend-cost{color:var(--text);font-variant-numeric:tabular-nums}.uh-detail{background:var(--bg-soft);border:1px solid var(--line-soft);border-radius:10px;padding:12px 14px}.uh-detail-head{display:flex;align-items:baseline;gap:10px;margin-bottom:10px}.uh-detail-date{font-size:12px;font-weight:600}.uh-detail-cost{font-size:12px;color:var(--ok);font-variant-numeric:tabular-nums}.uh-detail-agents{margin-left:auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:10px;color:var(--text-dim);font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.uh-detail-mini{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;margin-bottom:12px}.uh-ministat{display:flex;flex-direction:column;gap:1px}.uh-ministat-val{font-size:12px;font-variant-numeric:tabular-nums}.uh-ministat-label{font-size:9px;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}.uh-detail-models{display:flex;flex-direction:column;gap:5px}.uh-model-row{display:grid;grid-template-columns:130px 1fr auto;align-items:center;gap:8px}.uh-model-name{display:inline-flex;align-items:center;gap:5px;font-size:11px;min-width:0}.uh-model-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.uh-model-bar{height:6px;border-radius:3px;background:var(--line);overflow:hidden}.uh-model-bar-fill{display:block;height:100%;border-radius:3px}.uh-model-cost{font-size:11px;color:var(--text);font-variant-numeric:tabular-nums}:root[data-theme=light] .uh-backdrop{background:#0f172a4d}.accounts-panel{grid-column:1;grid-row:2 / -1;background:var(--panel);border-right:1px solid var(--line);display:flex;flex-direction:column;min-height:0;overflow-y:auto}.ap-header{display:flex;align-items:center;gap:8px;padding:12px var(--panel-inset) 10px;border-bottom:1px solid var(--line);flex-shrink:0}.ap-header h2{margin:0;letter-spacing:.02em}.ap-header-right{margin-left:auto;display:flex;align-items:center;gap:4px}.ap-refresh{padding:1px 6px}.ap-refresh:disabled{opacity:var(--dim-off);cursor:default}.ap-account{padding:9px var(--panel-inset) 8px;border-bottom:1px solid var(--line-soft)}.ap-account.active{background:color-mix(in srgb,var(--accent) 2%,transparent)}.ap-account-head{display:flex;align-items:center;gap:6px;margin-bottom:6px}.ap-num{font-size:10px;color:var(--muted);min-width:9px}.ap-alias{font-size:11px;font-weight:600;color:var(--text);min-width:0;max-width:40%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ap-email{font-size:10px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.ap-badge-active{flex-shrink:0;padding:1px 7px;border-radius:999px;background:var(--accent);color:var(--bg);font-size:10px;font-weight:600;line-height:1.5}.ap-badge-held{flex-shrink:0;padding:1px 7px;border-radius:999px;background:var(--ctl-fill);color:var(--text);font-size:10px;line-height:1.5}.ap-switch{flex-shrink:0}.ap-lanes{display:flex;flex-direction:column}.ap-lane{display:grid;grid-template-columns:30px 1fr 32px;grid-template-areas:"label track pct" ". reset reset";align-items:center;gap:2px 6px;margin-bottom:3px}.ap-lane-label{grid-area:label;font-size:10px;color:var(--muted)}.ap-lane-track{grid-area:track;height:4px;border-radius:2px;background:var(--line-soft);overflow:hidden}.ap-lane-fill{height:100%;border-radius:2px}.ap-lane-pct{grid-area:pct;font-size:10px;text-align:right}.ap-lane-reset{grid-area:reset;font-size:9px;color:var(--text-dim)}.ap-lane-reset:empty{display:none}.ap-meta{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 8px;margin-top:5px;font-size:9px;color:var(--muted)}.ap-err,.ap-stale{color:var(--warn)}.ap-age{margin-left:auto;white-space:nowrap;cursor:help}.ap-empty{display:flex;flex-direction:column;gap:4px;padding:12px var(--panel-inset);font-size:11px;color:var(--muted)}.ap-hint{font-size:10px;line-height:1.5;color:var(--muted)}.ap-empty .ap-cmd{display:block;margin:6px 0 2px;padding:7px 9px;border-radius:5px;background:color-mix(in srgb,var(--accent) 7%,transparent);color:var(--text);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere;-webkit-user-select:all;user-select:all}.ap-empty .ap-hint code{padding:1px 4px;border-radius:3px;background:color-mix(in srgb,var(--accent) 7%,transparent);font-size:10px}.ap-failure{display:flex;align-items:flex-start;gap:6px;margin:8px var(--panel-inset) 0;padding:6px 8px;border-radius:4px;background:color-mix(in srgb,var(--err) 12%,transparent);color:var(--err);font-size:10px;word-break:break-word}.ap-failure-text{flex:1;min-width:0}.ap-failure-x{position:relative;flex:none;margin:-2px -2px 0 0;padding:0 3px;border:0;background:none;color:inherit;opacity:.6;font-size:12px;line-height:1.2;cursor:pointer;transition:opacity .12s,transform .14s cubic-bezier(.23,1,.32,1)}.ap-failure-x:after{content:"";position:absolute;top:50%;left:50%;width:24px;height:24px;margin:-12px 0 0 -12px}.ap-failure-x:hover{opacity:1}.ap-failure-x:active{transform:scale(.94)}.ap-auto{padding:12px var(--panel-inset) 11px;border-top:1px solid var(--line)}.ap-auto-head{display:flex;flex-direction:column;gap:8px}.ap-auto-ctl{display:flex;align-items:center;gap:6px}.ap-auto-title{margin:0;font-size:11px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}.ap-auto-state{margin-left:auto;display:inline-flex;align-items:center;gap:5px;padding:2px 8px 2px 7px;border:1px solid var(--ctl-edge);border-radius:999px;background:transparent;font:inherit;font-size:10px;color:var(--muted);line-height:1.5}.ap-dot{width:5px;height:5px;border-radius:50%;background:currentColor;opacity:.55;flex-shrink:0}button.ap-auto-state{cursor:pointer;transition:border-color .12s,color .12s,transform .14s cubic-bezier(.23,1,.32,1)}button.ap-auto-state:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}button.ap-auto-state:active:not(:disabled){transform:scale(.97)}button.ap-auto-state:focus-visible{outline:2px solid var(--accent);outline-offset:1px}button.ap-auto-state:disabled{cursor:default;opacity:var(--dim-off)}.ap-auto-state.live{border-color:var(--accent);color:var(--accent)}.ap-pulse{position:relative;width:5px;height:5px;border-radius:50%;background:currentColor;flex-shrink:0}.ap-pulse:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;border:1px solid currentColor;animation:ap-ping 2.6s cubic-bezier(.22,.61,.36,1) infinite}@keyframes ap-ping{0%{transform:scale(1);opacity:.7}50%{transform:scale(3.2);opacity:0}to{transform:scale(3.2);opacity:0}}@media(prefers-reduced-motion:reduce){.ap-pulse:after{animation:none;opacity:.35;transform:scale(2.2)}}.ap-auto-note{margin:9px 0 0;font-size:9px;line-height:1.6;color:var(--muted)}.ap-auto-note .ap-pulse{display:inline-block;margin-right:5px;vertical-align:1px;color:var(--accent)}.ap-auto-note code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;color:var(--text);white-space:nowrap}.ap-auto-now{font-size:10px;color:var(--muted);font-variant-numeric:tabular-nums}.ap-auto-now:after{content:"/";margin-left:8px;color:var(--muted);opacity:.45}.ap-auto-now.near{color:var(--warn)}.ap-field{position:relative;display:inline-block}.ap-field:after{content:"";position:absolute;right:7px;top:50%;width:5px;height:5px;margin-top:-3px;border-right:1.2px solid currentColor;border-bottom:1.2px solid currentColor;transform:rotate(45deg);opacity:.5;pointer-events:none}.ap-field select{-moz-appearance:none;appearance:none;-webkit-appearance:none;background:var(--ctl-fill);color:var(--text);border:1px solid var(--ctl-edge);border-radius:5px;padding:2px 19px 2px 7px;font:inherit;font-size:11px;line-height:1.5;text-align:right;cursor:pointer;transition:border-color .12s,color .12s,transform .14s cubic-bezier(.23,1,.32,1)}.ap-field select:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}.ap-field select:active:not(:disabled){transform:scale(.97)}.ap-manage .ap-field select{text-align:left}.ap-field select:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.ap-field select:disabled{cursor:default;opacity:var(--dim-off)}.ap-field:has(select:hover:not(:disabled)):after{color:var(--accent);opacity:1}.ap-auto-foot{display:flex;align-items:baseline;gap:8px;margin-top:8px;padding-top:8px;border-top:1px solid var(--line-soft)}.ap-auto-result{font-size:10px;line-height:1.5;color:var(--muted);min-width:0}.ap-rotate{background:none;border:none;padding:0;font:inherit;font-size:9px;color:var(--muted);cursor:pointer;text-decoration:underline dotted;text-underline-offset:2px;transition:color .12s,transform .14s cubic-bezier(.23,1,.32,1)}.ap-rotate:hover:not(:disabled){color:var(--accent)}.ap-rotate:active:not(:disabled){transform:scale(.97)}.ap-rotate:disabled{cursor:default;opacity:var(--dim-off)}.ap-lanes-more{background:none;border:none;padding:0;font:inherit;font-size:9px;color:var(--muted);cursor:pointer;text-decoration:underline dotted;text-underline-offset:2px;transition:color .12s,transform .14s cubic-bezier(.23,1,.32,1)}.ap-lanes-more:hover{color:var(--accent)}.ap-lanes-more:active{transform:scale(.97)}.ap-footnote{margin:0;padding:9px 14px 2px;border-top:1px solid var(--line-soft);font-size:9px;line-height:1.5;color:var(--muted);cursor:help}.canvas-wrap.bubbling .react-flow__node{transition:transform .42s cubic-bezier(.22,.61,.36,1)}.canvas-wrap.bubbling .react-flow__node.react-flow__node-sessionGroup{transition:transform .42s cubic-bezier(.22,.61,.36,1),width .42s cubic-bezier(.22,.61,.36,1),height .42s cubic-bezier(.22,.61,.36,1)}@media(prefers-reduced-motion:reduce){.canvas-wrap.bubbling .react-flow__node,.canvas-wrap.bubbling .react-flow__node.react-flow__node-sessionGroup{transition:none}}.canvas-wrap.bubbling .react-flow__node.dragging,.canvas-wrap.dragging-any .react-flow__node,.canvas-wrap.dragging-any .react-flow__node.react-flow__node-sessionGroup{transition:none}.canvas-wrap.dragging-any .cluster-card{transition:opacity .2s ease}@media(prefers-reduced-motion:reduce){.react-flow__node{transition:none;animation:fadeIn .14s ease both}.react-flow__node.rf-exiting .agent-node,.react-flow__edge.rf-edge-exiting .react-flow__edge-path{animation:canvas-fade-out .6s linear forwards}.react-flow__edge.animated .react-flow__edge-path,.react-flow__edge.rf-edge-selected .react-flow__edge-path,.tool-conn.status-inflight{animation:none}.cluster-card{transition:opacity .2s ease}.ctx-donut{transition:filter .12s ease}.ctx-donut:hover{transform:none}.tool-burst,.tool-burst.sub,.tool-burst.status-done,.tool-burst.status-err,.tool-burst.sub.status-done,.tool-burst.sub.status-err{animation:fadeIn .14s ease both}.tool-burst.fading,.tool-burst.sub.fading{animation:canvas-fade-out .6s linear forwards}.tool-burst .tb-spin,.tool-burst .tb-mark,.tool-burst.status-inflight .tb-emoji,.state-pill.state-active:before{animation:none}.tool-burst.clickable{transition:box-shadow .12s ease,opacity .18s ease,filter .18s ease}.tool-burst.clickable:hover{translate:none}.empty-hero .orbit.r1,.empty-hero .orbit.r2,.empty-hero .orbit.r3,.empty-hero .core,.empty-hero .core:after{animation:none}@keyframes canvas-fade-out{to{opacity:0}}}.ap-add{line-height:1;margin-right:6px}.ap-more{margin-left:4px;display:inline-grid;place-items:center;min-width:24px;min-height:24px;padding:0 2px;border:1px solid transparent;border-radius:6px;background:none;color:var(--text-dim);font-size:13px;line-height:1;cursor:pointer}.ap-account:hover .ap-more,.ap-more:hover,.ap-more:focus-visible,.ap-more.on{color:var(--text)}.ap-more:hover,.ap-more.on{border-color:var(--ctl-edge)}.ap-manage{display:flex;flex-direction:column;gap:8px;margin-top:8px;padding-top:8px;border-top:1px dashed var(--line-soft)}.ap-manage-name,.ap-manage-slot,.ap-manage-acts{display:flex;align-items:center;gap:8px}.ap-manage-input{flex:1}.ap-manage-slot .ap-field{flex:1;min-width:0}.ap-manage-slot .ap-field select{width:100%}.ap-manage-acts .ap-manage-btn.danger{margin-left:auto;min-width:62px}.ap-manage-hint{color:var(--text-dim);font-size:10px;min-width:0}.ap-manage-hint.ap-manage-swap{color:var(--accent)}.ap-manage-input{min-width:0;padding:3px 7px;border:1px solid var(--ctl-edge);border-radius:6px;background:var(--ctl-fill);color:var(--text);font:inherit;font-size:11px;transition:border-color .12s,background .12s}.ap-manage-input:hover{border-color:var(--accent)}.ap-manage-input:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.ap-manage-btn{padding:3px 9px;border:1px solid var(--ctl-edge);border-radius:999px;background:var(--ctl-fill);color:var(--text);font:inherit;font-size:10px;cursor:pointer;transition:border-color .12s,color .12s,background .12s,transform .14s cubic-bezier(.23,1,.32,1)}.ap-manage-btn:hover:not(:disabled){border-color:var(--accent);background:color-mix(in srgb,var(--text) 12%,transparent)}.ap-manage-btn:active:not(:disabled){transform:scale(.97)}.ap-manage-btn:disabled{opacity:var(--dim-off);cursor:default}.ap-manage-btn.danger{color:var(--err);border-color:color-mix(in srgb,var(--err) 65%,transparent)}.ap-manage-btn.danger:hover:not(:disabled){border-color:var(--err)}.ap-manage-btn.danger.armed{color:var(--bg);background:var(--err);border-color:var(--err);font-weight:600}.ap-share{display:flex;flex-direction:column;gap:5px}.ap-share-blob{display:block;max-height:66px;overflow:auto;overflow-wrap:anywhere;padding:6px 8px;border:1px solid var(--line);border-radius:6px;background:var(--bg-soft);color:var(--muted);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;line-height:1.4;-webkit-user-select:all;user-select:all}.ap-share-foot{display:flex;align-items:center;gap:8px}.aa-modal{width:min(560px,92vw)}.aa-body{gap:18px;display:flex;flex-direction:column}.aa-tabs{display:inline-flex;gap:4px}.aa-tab{padding:4px 12px;border:1px solid var(--ctl-edge);border-radius:999px;background:none;color:var(--muted);font:inherit;font-size:12px;cursor:pointer;transition:color .12s,border-color .12s,background .12s,transform .14s cubic-bezier(.23,1,.32,1)}.aa-tab:hover{color:var(--text)}.aa-tab:active{transform:scale(.97)}.aa-tab.on{color:var(--text);border-color:var(--accent);background:color-mix(in srgb,var(--accent) 12%,transparent)}.aa-step{display:flex;flex-direction:column;gap:8px}.aa-step h4{margin:0;color:var(--muted);font-size:10px;font-weight:600;letter-spacing:.06em;text-transform:uppercase}.aa-note{margin:0;color:var(--muted);font-size:12px;line-height:1.5}.aa-err{margin:0;color:var(--err);font-size:12px;line-height:1.5}.aa-link{overflow-wrap:anywhere;padding:8px 10px;border:1px solid var(--ctl-edge);border-radius:8px;background:var(--ctl-fill);color:var(--accent);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;line-height:1.5;text-decoration:none;-webkit-user-select:all;user-select:all}.aa-link:hover{border-color:var(--accent);text-decoration:underline}.aa-field{display:flex;align-items:center;gap:8px}.aa-field input{flex:1;min-width:0;padding:7px 11px;border:1px solid var(--ctl-edge);border-radius:8px;background:var(--bg-soft);color:var(--text);font:inherit;font-size:13px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.aa-field input::placeholder{color:var(--text-dim)}.aa-field input:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.aa-field input:disabled{opacity:var(--dim-off)}.aa-primer .aa-note{max-width:46ch}.aa-actions{display:flex;gap:8px;align-items:center;margin-top:2px}.aa-done{position:relative;display:flex;flex-direction:column;align-items:center;gap:10px;padding:6px 0 2px;text-align:center;animation:aa-done-in .22s cubic-bezier(.23,1,.32,1) both}.aa-done h4{margin:0;color:var(--text);font-size:13px;font-weight:600;letter-spacing:0;text-transform:none}.aa-done .aa-note{max-width:44ch}@keyframes aa-done-in{0%{opacity:0;transform:scale(.97) translateY(4px)}to{opacity:1;transform:none}}.aa-mark{width:44px;height:44px;overflow:visible}.aa-mark-ring,.aa-mark-tick{fill:none;stroke:var(--ok);stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round}.aa-mark-ring{opacity:.45;stroke-dasharray:126;stroke-dashoffset:126;transform:rotate(-90deg);transform-origin:50% 50%;animation:aa-draw .38s cubic-bezier(.23,1,.32,1) 40ms forwards}.aa-mark-tick{stroke-dasharray:30;stroke-dashoffset:30;animation:aa-draw .26s cubic-bezier(.23,1,.32,1) .2s forwards}@keyframes aa-draw{to{stroke-dashoffset:0}}.confetti{position:fixed;width:0;height:0;z-index:101;pointer-events:none}.confetti-bit{position:absolute;top:0;left:0;width:6px;height:9px;margin:-4px 0 0 -3px;border-radius:1.5px;background:var(--accent);opacity:0;animation:aa-burst-move .9s cubic-bezier(.16,.9,.3,1) both,aa-burst-fade .9s linear both}.confetti-bit.round{width:6px;height:6px;border-radius:50%}.confetti-bit[data-hue="1"]{background:var(--ok)}.confetti-bit[data-hue="2"]{background:var(--warn)}.confetti-bit[data-hue="3"]{background:color-mix(in srgb,var(--accent) 55%,var(--ok))}@keyframes aa-burst-move{0%{transform:translateZ(0) scale(calc(var(--s, 1) * .6)) rotate(0)}70%{transform:translate3d(var(--dx),var(--dy),0) scale(var(--s, 1)) rotate(var(--rot))}to{transform:translate3d(calc(var(--dx) * 1.08),calc(var(--dy) * .82 + 16px),0) scale(calc(var(--s, 1) * .9)) rotate(var(--rot))}}@keyframes aa-burst-fade{0%{opacity:0}10%{opacity:1}62%{opacity:1}to{opacity:0}}@media(prefers-reduced-motion:reduce){.aa-done{animation:aa-done-fade .16s ease both}.aa-mark-ring,.aa-mark-tick{animation:none;stroke-dashoffset:0}@keyframes aa-done-fade{0%{opacity:0}to{opacity:1}}}.cat-filter-bar{transition:background .18s ease,border-color .18s ease,box-shadow .18s ease}.cat-filter-bar.occluded:not(:hover):not(:focus-within){background:#14161b59;border-color:transparent;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none}:root[data-theme=light] .cat-filter-bar.occluded:not(:hover):not(:focus-within){background:#ffffff59}.ap-manage{animation:ap-manage-in .18s cubic-bezier(.23,1,.32,1) both}@keyframes ap-manage-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}.ap-more{transition:color .12s,border-color .12s,transform .14s cubic-bezier(.23,1,.32,1)}.ap-more:active{transform:scale(.94)}.ap-manage-btn.danger.armed{position:relative;overflow:hidden}.ap-manage-btn.danger.armed:after{content:"";position:absolute;left:0;right:0;bottom:0;height:2px;background:color-mix(in srgb,var(--bg) 70%,transparent);transform-origin:left center;animation:ap-disarm 4s linear forwards}@keyframes ap-disarm{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.ap-share{animation:ap-manage-in .18s cubic-bezier(.23,1,.32,1) both}.ap-share-blob{-webkit-user-select:all;user-select:all;max-height:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--text-dim)}.ap-share-foot .ap-manage-btn{color:var(--accent);border-color:var(--accent);background:color-mix(in srgb,var(--accent) 10%,transparent)}.ap-share-foot .ap-manage-btn:hover:not(:disabled){background:color-mix(in srgb,var(--accent) 18%,transparent)}.ap-share.expired .ap-share-blob{opacity:var(--dim-stale)}.ap-share-warn,.ap-share-expiry.soon{color:var(--warn)}.ap-share-expiry.gone{color:var(--err)}@media(prefers-reduced-motion:reduce){.ap-manage,.ap-share{animation:none}.ap-manage-btn.danger.armed:after{animation:none;transform:scaleX(0)}button.btn:active:not(:disabled),.ap-manage-btn:active:not(:disabled),.ap-more:active,.glyph-btn:active:not(:disabled),.cat-filter:active,.uh-range-btn:active,.selected-ribbon .selected-close:active,.ver-banner .ver-cmd:active,.ver-banner .ver-auto:active,.ver-banner .ver-close:active,.topbar .brand button.v:active,.ver-banner .ver-act:active:not(:disabled),.detail-reopen:active,.ctx-donut:active,.session-list .sl-row:active,button.tool.clickable:active,.uh-bar-col:active,.ap-failure-x:active,button.ap-auto-state:active:not(:disabled),.ap-field select:active:not(:disabled),.ap-rotate:active:not(:disabled),.ap-lanes-more:active,.aa-tab:active,.aa-result-fix:active,.bw-ep-head:active,.bw-toggle:active,.bw-help:active,.bw-settings select:active:not(:disabled),.selected-ribbon:active:not(:has(.selected-close:active)){transform:none}.tool-burst.clickable:active{scale:none}}.ap-fix{margin-left:6px;padding:1px 8px;border:1px solid color-mix(in srgb,var(--warn) 85%,transparent);border-radius:999px;background:color-mix(in srgb,var(--warn) 12%,transparent);color:var(--warn);font:inherit;font-size:10px;cursor:pointer;transition:background .12s,border-color .12s,transform .14s cubic-bezier(.23,1,.32,1)}.ap-fix:hover{background:color-mix(in srgb,var(--warn) 22%,transparent);border-color:var(--warn)}.ap-fix:active{transform:scale(.97)}@media(prefers-reduced-motion:reduce){.ap-fix:active{transform:none}}.ap-empty .ap-fix{align-self:flex-start;margin:5px 0 0}.ap-empty .ap-fix:disabled{opacity:var(--dim-off);cursor:default}@media(prefers-reduced-motion:reduce){.ctx-window-fill,.qb-fill,.qb-pace-marker,.uh-bar{transition:none}.modal,.ctx-modal,.uh-modal,.sound-menu{animation:fadeIn .14s ease-out}}.ap-stale-copy{font-size:10px;color:var(--text-dim)}.bw-btn{position:relative}.bw-badge{position:absolute;top:-4px;right:-4px;min-width:14px;height:14px;padding:0 3px;border-radius:7px;background:var(--warn);color:var(--bg);font-size:9px;font-weight:700;line-height:14px;text-align:center;font-variant-numeric:tabular-nums}.bw-btn.watching{color:var(--accent)}.bw-btn.has-findings{color:var(--warn)}.bw-modal{width:min(860px,94vw)}.bw-body{container:bw / inline-size;display:flex;flex-direction:column;gap:16px}.bw-body>*{flex:none}.bw-day{display:flex;flex-direction:column;gap:8px}.bw-day h4{margin:0;font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--text-dim)}.bw-ep{border:1px solid var(--line);border-radius:6px;overflow:hidden;background:var(--panel)}.bw-ep-row{display:flex;align-items:stretch}.bw-ep-row .bw-ep-head{flex:1 1 auto;min-width:0}.bw-ep-x{flex:none;align-self:center;margin-right:6px;color:var(--text-dim);transition:color .12s ease}.bw-ep-x:hover,.bw-ep-x:focus-visible{color:var(--warn)}.bw-ep.open{border-color:var(--ctl-edge)}.bw-ep-head{display:grid;grid-template-columns:auto minmax(0,1fr) auto auto;gap:12px;align-items:baseline;width:100%;padding:10px 12px;background:none;border:0;color:inherit;font:inherit;text-align:left;cursor:pointer;transition:transform .12s ease,background .12s ease}.bw-ep-head:hover{background:var(--bg-soft)}.bw-ep-head:active{transform:scale(.97)}.bw-ep-host{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bw-ep-meta,.bw-ep-count{font-size:11px;color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap}.bw-ep-head:hover .bw-ep-count{color:var(--text)}.bw-urls{list-style:none;margin:0;padding:0 12px 10px;display:flex;flex-direction:column;gap:4px}.bw-urls li{display:grid;grid-template-columns:62px 1fr;gap:8px;font-size:11px;align-items:baseline}.bw-url-time{color:var(--text-dim);font-variant-numeric:tabular-nums;white-space:nowrap}.bw-url{color:var(--muted);word-break:break-all}.bw-status{display:flex;align-items:center;flex-wrap:wrap;gap:10px;min-height:48px;border-top:1px solid var(--line);padding-top:12px}.bw-status-text{font-size:12px;color:var(--muted);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bw-gear{margin-left:auto}.bw-gear.on{color:var(--accent)}.bw-switch{display:flex;align-items:center;gap:12px;padding:8px 0;cursor:pointer}.bw-switch-label{font-size:12px;color:var(--muted);white-space:nowrap}.bw-switch:hover .bw-switch-label{color:var(--text)}.bw-prof-name{font-weight:600}.bw-note{margin:0;font-size:11px;color:var(--text-secondary);max-width:72ch;line-height:1.55}.bw-state{display:flex;flex-direction:column;gap:1px;background:var(--line);border:1px solid var(--line);border-radius:6px;overflow:hidden}.bw-row{display:grid;grid-template-columns:8px auto 1fr auto;gap:8px;align-items:center;background:var(--panel);padding:10px 14px}.bw-dot{width:7px;height:7px;border-radius:50%;background:var(--muted-dim)}.bw-row.err .bw-dot{background:var(--err)}.bw-row.ok .bw-dot{background:var(--ok)}.bw-row.on .bw-dot{background:var(--accent)}.bw-row-label{font-size:13px;font-weight:600;white-space:nowrap}.bw-row.err .bw-row-label{color:var(--err)}.bw-row-detail{font-size:12px;color:var(--text-secondary);min-width:0;overflow:hidden;text-overflow:ellipsis}.bw-write-err{border-color:var(--err)}.bw-write-err .bw-row-detail{white-space:normal;overflow:visible}.bw-write-err-x{color:var(--err)}.bw-row .btn{white-space:nowrap}.bw-why{background:none;border:0;padding:0 0 0 6px;color:var(--muted);font:inherit;font-size:11px;text-decoration:underline;text-underline-offset:2px;cursor:pointer}.bw-why:hover{color:var(--text)}.bw-toggle{position:relative;width:30px;height:17px;padding:0;border-radius:9px;border:1px solid var(--ctl-edge);background:var(--ctl-fill);cursor:pointer;flex:none;transition:background .14s ease,border-color .14s ease,transform .12s ease}.bw-toggle:hover{border-color:var(--accent)}.bw-toggle:active{transform:scale(.97)}.bw-toggle[aria-checked=true]{background:var(--accent);border-color:var(--accent)}.bw-toggle-knob{position:absolute;top:2px;left:2px;width:11px;height:11px;border-radius:50%;background:var(--text);transition:transform .14s ease,background .14s ease}.bw-toggle[aria-checked=true] .bw-toggle-knob{transform:translate(13px);background:var(--bg)}.bw-log{display:flex;flex-direction:column;gap:4px;max-height:320px;overflow-y:auto}.bw-feed{display:flex;flex-direction:column;gap:12px;min-height:0}.bw-feed-note{margin-bottom:-4px;max-width:68ch}.bw-head-row{align-items:baseline}.bw-feed-count{margin-left:auto;font-size:10px;letter-spacing:0;text-transform:none;color:var(--text-dim);font-variant-numeric:tabular-nums}.bw-log-line{display:grid;grid-template-columns:66px minmax(0,96px) minmax(0,1fr) max-content;gap:8px;font-size:11px;align-items:baseline;padding:4px 8px;border-radius:4px;min-width:0;transition:background .14s ease}.bw-log-line:hover{background:var(--bg-soft)}.bw-log-line:hover .bw-log-time,.bw-log-line:hover .bw-log-profile,.bw-log-line:hover .bw-log-sys{color:var(--text)}.bw-log-time,.bw-log-profile,.bw-log-sys,.bw-log-browser{transition:color .14s ease}@media(prefers-reduced-motion:no-preference){.bw-log-line{animation:bw-line-in .26s cubic-bezier(.16,1,.3,1)}}@keyframes bw-line-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}@media(prefers-reduced-motion:no-preference){.bw-log-line.find{animation:bw-find-in .9s cubic-bezier(.16,1,.3,1)}}@keyframes bw-find-in{0%{background:color-mix(in srgb,var(--accent) 22%,transparent)}to{background:transparent}}.bw-log-time{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--text-dim);font-variant-numeric:tabular-nums;white-space:nowrap}.bw-log-line{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;line-height:1.6;color:var(--muted)}.bw-log-line.find .bw-log-browser,.bw-log-line.find .bw-log-value{color:var(--accent);font-weight:600}.bw-log-line.act .bw-log-sys{color:var(--text);font-style:normal}.bw-log-line.warn .bw-log-sys,.bw-log-line.warn .bw-log-browser,.bw-log-line.warn .bw-log-value{color:var(--warn)}.bw-log-sys{grid-column:2 / -1;color:var(--text-dim);font-style:italic}.bw-log-browser{color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bw-log-profile{color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bw-log-value{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}.bw-log-flag{color:var(--accent)}.bw-rest{margin:0;font-size:10px;color:var(--text-secondary);line-height:1.5}.bw-rest-head{align-self:flex-start}.bw-chev{color:var(--text-dim);font-size:9px}.bw-relay{font-size:10px;color:var(--text-dim);white-space:nowrap}.bw-loading{display:flex;flex-direction:column;gap:8px;padding:18px 0}.bw-loading p{margin:0;font-size:12px;color:var(--text-secondary)}.bw-loading-bar{position:relative;height:2px;border-radius:1px;background:var(--line);overflow:hidden}.bw-loading-bar:after{content:"";position:absolute;top:0;bottom:0;width:32%;border-radius:1px;background:var(--accent);animation:bw-sweep 1.4s ease-in-out infinite}@keyframes bw-sweep{0%{transform:translate(-110%)}to{transform:translate(320%)}}@media(prefers-reduced-motion:reduce){.bw-loading-bar:after{animation:none}}.bw-path{-webkit-user-select:all;user-select:all;word-break:break-all}.bw-mode-dot{width:7px;height:7px;border-radius:50%;background:var(--text-dim);flex:none;align-self:center;transition:background .2s ease,box-shadow .2s ease}.bw-mode-dot.on{background:var(--accent)}@media(prefers-reduced-motion:no-preference){.bw-mode-dot.on{animation:bw-pulse 2.6s ease-in-out infinite}}@keyframes bw-pulse{0%,to{box-shadow:0 0 color-mix(in srgb,var(--accent) 55%,transparent)}50%{box-shadow:0 0 0 4px color-mix(in srgb,var(--accent) 0%,transparent)}}.bw-mode-word{flex:none;font-size:12px;color:var(--text);font-weight:600;animation:bw-state-in .22s cubic-bezier(.16,1,.3,1)}@keyframes bw-state-in{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:none}}@keyframes bw-state-fade{0%{opacity:0}to{opacity:1}}.bw-settings{display:flex;gap:16px;flex-wrap:wrap;align-items:flex-start;padding:12px 16px;background:var(--bg-soft);border:1px solid var(--line);border-radius:6px;transform-origin:top}@media(prefers-reduced-motion:no-preference){.bw-settings{animation:bw-settings-in .24s cubic-bezier(.16,1,.3,1)}}@keyframes bw-settings-in{0%{opacity:0;transform:translateY(-6px) scaleY(.96)}to{opacity:1;transform:none}}.bw-why[aria-expanded=true]{color:var(--text)}.bw-settings label{display:flex;flex-direction:column;gap:4px;font-size:11px;color:var(--muted)}.bw-settings select{background:var(--ctl-fill);border:1px solid var(--ctl-edge);color:var(--text);border-radius:4px;padding:4px 6px;font-size:12px;cursor:pointer;transition:border-color .12s ease,color .12s ease,transform .12s ease}.bw-settings select:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}.bw-settings select:active:not(:disabled){transform:scale(.97)}.bw-settings-note{margin:0;flex:1 1 30ch;font-size:11px;line-height:1.6;color:var(--text-secondary);max-width:66ch}.bw-settings-note strong{color:var(--text);font-weight:600}.bw-radar{display:block;width:100%;height:168px}@media(prefers-reduced-motion:reduce){.bw-radar{opacity:1}}.bw-work{display:grid;grid-template-columns:280px minmax(0,1fr);gap:32px;align-items:stretch}.bw-side{display:flex;flex-direction:column;gap:24px;min-width:0}.bw-sec{display:flex;flex-direction:column;gap:12px}.bw-sec-head{display:flex;align-items:center;gap:8px;margin:0;font-size:10px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--text-dim)}.bw-help{width:16px;height:16px;padding:0;border:1px solid var(--ctl-edge);border-radius:50%;background:none;color:var(--text-dim);font:inherit;font-size:9px;line-height:1;cursor:pointer;transition:color .12s ease,border-color .12s ease,transform .12s ease}.bw-help{position:relative}.bw-help:after{content:"";position:absolute;top:-4px;right:-4px;bottom:-4px;left:-4px;border-radius:50%}.bw-help:hover{color:var(--text);border-color:var(--accent)}.bw-help:active{transform:scale(.94)}.bw-help[aria-expanded=true]{color:var(--accent);border-color:var(--accent)}.bw-glance{display:flex;align-items:center;gap:16px}.bw-counts{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px;min-width:0}.bw-counts li{display:flex;align-items:baseline;gap:8px;min-width:0}.bw-count-n{min-width:3ch;text-align:right;font-size:18px;line-height:1.1;color:var(--text);font-variant-numeric:tabular-nums}.bw-count-of{font-size:11px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bw-since{margin:0;font-size:10px;line-height:1.5;color:var(--text-dim)}.bw-since+.bw-since{margin-top:-8px}.bw-gate{margin:0;font-size:10px;line-height:1.5;color:var(--muted);font-variant-numeric:tabular-nums}.bw-key{margin:0;display:grid;grid-template-columns:max-content minmax(0,1fr);gap:4px 12px;padding:8px 12px;border-radius:6px;background:var(--bg-soft)}.bw-key dt{font-size:10px;font-weight:600;color:var(--muted)}.bw-key dd{margin:0;font-size:10px;line-height:1.5;color:var(--text-secondary)}.bw-rc-verdict{margin:0;font-size:11px;line-height:1.5;color:var(--text-secondary)}.bw-rc-verdict.exposed{color:var(--warn)}.bw-rc-foreign{margin:0;display:flex;flex-direction:column;gap:4px;font-size:10px;line-height:1.5;color:var(--warn)}.bw-rc-body{display:flex;flex-direction:column;gap:8px}.bw-rc-note{margin:0;font-size:10px;line-height:1.5;color:var(--text-secondary)}.bw-rc-cmd{display:flex;align-items:flex-start;gap:8px;padding:8px 10px;border-radius:6px;background:var(--bg-soft);border:1px solid var(--line)}.bw-rc-cmd code{flex:1;min-width:0;font-size:10px;line-height:1.6;white-space:pre-wrap;word-break:break-all;-webkit-user-select:all;user-select:all;color:var(--text)}button.btn.bw-rc-copy{flex:none;font-size:10px;padding:2px 8px}.bw-profiles{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}.bw-profiles li{display:flex;align-items:center;gap:8px;min-height:24px;font-size:12px;min-width:0}.bw-prof-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bw-prof-dot{width:6px;height:6px;border-radius:50%;background:var(--text-dim);flex:none}.bw-prof-dot.on{background:var(--accent)}.bw-prof-state{font-size:11px;color:var(--muted);margin-left:auto;flex:none}.bw-work .bw-radar{width:88px;height:88px;flex:none}.bw-work .bw-log{flex:1 1 auto;min-height:220px;max-height:min(42vh,360px)}@container bw (max-width: 720px){.bw-work{grid-template-columns:minmax(0,1fr);gap:24px}.bw-work .bw-radar{width:88px;height:88px}}@media(max-width:640px){.bw-work{grid-template-columns:minmax(0,1fr);gap:24px}}@media(prefers-reduced-motion:reduce){.bw-mode-word,.bw-log-line,.bw-settings{animation:bw-state-fade .22s ease}}.bw-trouble{margin:0;padding:12px;border-radius:6px;border:1px solid var(--line);background:var(--bg-soft);font-size:11px;line-height:1.55;color:var(--text)}.bw-trouble.unreadable{border-color:color-mix(in srgb,var(--warn) 45%,transparent);color:var(--warn)}.bw-access{margin:8px 0 0;display:grid;grid-template-columns:max-content minmax(0,1fr);gap:4px 16px}.bw-access dt{font-size:10px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--text-dim)}.bw-access dd{margin:0;font-size:11px;line-height:1.55;color:var(--text-secondary)}.bw-main{display:flex;flex-direction:column;gap:24px;min-width:0}.bw-findings{display:flex;flex-direction:column;gap:12px;min-height:0}.bw-eps{display:flex;flex-direction:column;gap:16px;max-height:min(30vh,260px);overflow-y:auto}.bw-empty{display:flex;flex-direction:column;gap:8px;max-width:62ch}.bw-empty-head{margin:0;font-size:13px;color:var(--text)}.bw-empty-note{margin:0;font-size:11px;line-height:1.6;color:var(--text-secondary)}.sa-modal{width:min(560px,92vw)}.sa-body{display:flex;flex-direction:column;gap:18px}.sa-step{display:flex;flex-direction:column;gap:10px}.sa-step h4{margin:0;color:var(--muted);font-size:10px;font-weight:600;letter-spacing:.06em;text-transform:uppercase}.sa-note{margin:0;color:var(--muted);font-size:12px;line-height:1.5}.sa-actions{display:flex;gap:8px;align-items:center;margin-top:2px}.sa-count{margin:0;color:var(--text);font-size:12px;line-height:1.5}.sa-count.empty{color:var(--muted)}.sa-list{margin:0;padding:0;list-style:none;display:flex;flex-direction:column}.sa-pick{max-height:min(46vh,320px);overflow-y:auto;gap:2px}.sa-row{display:flex;align-items:baseline;gap:8px;padding:6px 8px;border-radius:6px;cursor:pointer}.sa-row:hover{background:color-mix(in srgb,var(--text) 6%,transparent)}.sa-row input{flex:none;accent-color:var(--accent)}.sa-who{color:var(--text);font-size:12px;overflow-wrap:anywhere}.sa-sub{color:var(--text-dim);font-size:11px;overflow-wrap:anywhere}.sa-failed{display:flex;flex-direction:column;gap:4px;padding:8px 10px;border:1px solid color-mix(in srgb,var(--warn) 45%,transparent);border-radius:6px}.sa-failed-head{margin:0;color:var(--warn);font-size:12px}.sa-failed .sa-list{gap:4px}.sa-failed li{display:flex;flex-direction:column}.sa-why{color:var(--text-secondary);font-size:11px;line-height:1.5}.sa-dead{opacity:var(--dim-stale)}.aa-results{margin:0;padding:0;list-style:none;align-self:stretch;display:flex;flex-direction:column;gap:2px;max-height:min(38vh,260px);overflow-y:auto;text-align:left}.aa-result{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;padding:5px 8px;border-radius:6px;font-size:12px}.aa-result-who{color:var(--text);overflow-wrap:anywhere}.aa-result-what{margin-left:auto;color:var(--muted);font-size:11px;white-space:nowrap}.aa-result.imported .aa-result-what{color:var(--ok)}.aa-result.healed .aa-result-what,.aa-result.updated .aa-result-what{color:var(--accent)}.aa-result.failed .aa-result-what{color:var(--err)}.aa-result.failed{background:color-mix(in srgb,var(--err) 8%,transparent)}.aa-result-fix{padding:2px 8px;border:1px solid var(--ctl-edge);border-radius:999px;background:none;color:var(--muted);font:inherit;font-size:10px;cursor:pointer;transition:color .12s,border-color .12s,transform .14s cubic-bezier(.23,1,.32,1)}.aa-result-fix:hover{color:var(--text);border-color:var(--accent)}.aa-result-fix:active{transform:scale(.97)}.aa-result-err{flex-basis:100%;color:var(--err);font-size:11px;line-height:1.5}.ap-share-set{padding:1px 6px}.hist-modal{width:min(620px,92vw)}.hist-since{margin-left:auto;margin-right:10px;font-size:11px;color:var(--muted);font-variant-numeric:tabular-nums}.hist-body{padding:14px 16px 16px;overflow-y:auto}.hist-empty{margin:0;padding:20px 0;text-align:center;color:var(--muted);font-size:12px}.hist-series+.hist-series{margin-top:26px}.hist-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:6px}.hist-label{font-size:12px;font-weight:600}.hist-stats{display:flex;align-items:baseline;gap:4px;font-variant-numeric:tabular-nums}.hist-stats b{font-size:16px;font-weight:600}.hist-stats b.warn{color:var(--warn)}.hist-stats b.hot{color:var(--err)}.hist-stats i{font-style:normal;font-size:10px;color:var(--muted);margin-right:8px}.hist-plot{position:relative}.hist-chart{display:block;width:100%;overflow:visible;touch-action:none}.hist-area{fill:var(--accent);opacity:.14}.hist-line{fill:none;stroke:var(--accent);stroke-width:1.5;stroke-linejoin:round;stroke-linecap:round}.hist-dot{fill:var(--accent);stroke:var(--panel);stroke-width:1.5}.hist-floor{stroke:var(--line);stroke-width:1}.hist-rule{stroke-width:1;opacity:.6}.hist-rule.warn{stroke:var(--warn);stroke-dasharray:6 4}.hist-rule.hot{stroke:var(--err);stroke-dasharray:2 3;opacity:.75}.hist-rule-tag{font-size:9px;fill:var(--muted);font-variant-numeric:tabular-nums}.hist-rule-tag.warn{fill:var(--warn)}.hist-rule-tag.hot{fill:var(--err)}.hist-cross{stroke:var(--muted);stroke-width:1;stroke-dasharray:2 3}.hist-axis{display:flex;justify-content:space-between;margin-top:4px;font-size:10px;color:var(--muted);font-variant-numeric:tabular-nums;min-height:13px}.hist-at b{color:var(--text);font-weight:600}.hist-note{margin-top:5px;font-size:10px;color:var(--muted)}@media(prefers-reduced-motion:reduce){.hist-modal,.pl-modal{animation:none}}.pl-modal{width:min(680px,92vw)}.pl-count{margin-left:auto;margin-right:10px;font-size:11px;color:var(--muted);font-variant-numeric:tabular-nums}.pl-body{padding:10px 16px 4px;overflow-y:auto;font-size:11px}.pl-empty{margin:0;padding:20px 0;text-align:center;color:var(--muted);font-size:12px}.pl-table thead th{position:sticky;top:0;background:var(--panel);z-index:1}.pl-pid-h{width:62px;text-align:right;padding-right:8px!important;font-size:10px;font-weight:500;color:var(--muted)}.pl-pid{width:62px}.pl-name{padding-left:2px;color:var(--muted)}.pl-body tbody tr:hover td{color:var(--text)}.pl-foot{padding:8px 16px 12px;border-top:1px solid var(--line);font-size:10px;color:var(--muted)}
|
package/dist/web/index.html
CHANGED
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
document.documentElement.setAttribute("data-theme", stored === "light" ? "light" : "dark");
|
|
41
41
|
})();
|
|
42
42
|
</script>
|
|
43
|
-
<script type="module" crossorigin src="/assets/index-
|
|
44
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
43
|
+
<script type="module" crossorigin src="/assets/index-BBEG2BX8.js"></script>
|
|
44
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BJsEM-0j.css">
|
|
45
45
|
</head>
|
|
46
46
|
<body>
|
|
47
47
|
<div id="root"></div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-dag",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.10.0",
|
|
4
4
|
"description": "Live deck of Claude Code and Codex agents — watch tool calls, token spend and every Claude Code subagent on one calm canvas. Run it with npx ccdeck.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
package/release-notes.json
CHANGED
|
@@ -31,6 +31,18 @@
|
|
|
31
31
|
"about a defect in the type, and the suite refuses both it and no space at",
|
|
32
32
|
"all."
|
|
33
33
|
],
|
|
34
|
+
"3.10.0": [
|
|
35
|
+
{
|
|
36
|
+
"title": "\ud83d\udd0c Who else can drive your browser, and where to see it",
|
|
37
|
+
"body": "**Browser Watch has a Remote control section.** The Claude in Chrome extension holds a connection open to Anthropic's relay, and that connection is registered against your **account**, not against this machine \u2014 so any Claude Code session signed in to the same account, running anywhere, can enumerate and drive this browser, and nothing prompts you on the machine being driven.\n\nThe panel now says whether that is the case here, and what the extension is actually allowed to do in each profile \u2014 enabled or switched off, every site or only the ones it was granted, and which of the powerful APIs it holds. That last part is not what `chrome://extensions` shows you: the per-site list there is enforced by the extension, on itself, while the grant underneath stays exactly as wide as it was.\n\nIf you want it closed, the section hands you the one command that closes it \u2014 as text, to paste in your own terminal. **ccdeck never runs it and never asks for your password**, and it never will: no part of this deck elevates, and a dashboard that could raise a password box on request would be a gift to anything else running on the machine. If the block is already in place, the section offers the command that takes it back out. And if something else in your hosts file already points that name somewhere, it says so and leaves the line alone \u2014 ccdeck only removes the line ccdeck wrote.\n\nAll of this is two file reads and no network call. It was written some releases ago and, until now, was not connected to any screen.\n\n**Also:** the README said `share` produces a `ccdeck1:` blob. It produces `ccdeck2:` \u2014 `ccdeck1:` has been read-only legacy for a while."
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"3.9.0": [
|
|
41
|
+
{
|
|
42
|
+
"title": "\ud83c\udf9b\ufe0f Five switches that were not where the thing they control is",
|
|
43
|
+
"body": "**The session list has a button again.** It lost one a while back and only the `L` key was left \u2014 and `L` is written down in one place, a shortcuts sheet behind a small `?` in the corner of the canvas. If you use a mouse there was no way to open the list at all. The `\u2630` is back at the left of the top bar.\n\n**The Notifications switch now tells you whether the browser will actually show one.** It said `on` while this browser had never been asked for permission, which is not the same thing. It now says so on that row and offers the ask right there. Before, the only place to grant it was a button that appears solely while a session is stuck waiting \u2014 so on a machine where that rarely happens you could not switch notifications on at all.\n\n**Started with `--workspace` or `--scope` and seeing nothing?** The empty screen used to tell everyone to \"run `claude` or `codex` in any folder\", which is the one thing that cannot work for you. It now names the folder the deck is actually watching.\n\n**Browser Watch says when a setting did not save.** Flipping the switch and having it fail showed a red line reading \"Could not read\" \u2014 about reading history, not about your press \u2014 and ten seconds later the panel wiped it and looked perfectly healthy with the setting unchanged. A failed save now says so, in its own words, and stays until you dismiss it. The \"nobody browsing for\" menu also follows the stored value again: change it in a second tab and this one never caught up.\n\n**The deck no longer restarts itself when nothing on screen offers to stop it.** Thirty seconds after the last agent went quiet, with a new version on disk, the server would exit, come back and reload the page. The `auto when idle` switch that controls that lives inside the update banner \u2014 so if you had closed the banner with its `\u00d7`, it happened with no visible setting anywhere. Closing the banner now also stands down the restart; clicking the version chip brings back both together."
|
|
44
|
+
}
|
|
45
|
+
],
|
|
34
46
|
"3.8.9": [
|
|
35
47
|
{
|
|
36
48
|
"title": "\ud83d\udda5\ufe0f Four things that only went wrong on somebody else's operating system",
|
|
@@ -33,6 +33,15 @@
|
|
|
33
33
|
import { existsSync as fsExistsSync, readdirSync as fsReaddirSync, statSync as fsStatSync } from "node:fs";
|
|
34
34
|
import { homedir } from "node:os";
|
|
35
35
|
import { posix as posixPath, win32 as winPath } from "node:path";
|
|
36
|
+
// ONE DECLARATION OF THE EXTENSION ID (#798). It was written out here and again
|
|
37
|
+
// in relay-guard.mjs, with the same literal, in two modules that never imported
|
|
38
|
+
// each other — so republishing the extension under a new id and updating one
|
|
39
|
+
// would leave the other detector answering "not installed" forever, with
|
|
40
|
+
// nothing going red anywhere. It comes from relay-guard because that direction
|
|
41
|
+
// is the safe one: relay-guard imports node:path and nothing else, a property
|
|
42
|
+
// its own header states and relay-guard.test.ts pins by reading the source, and
|
|
43
|
+
// importing this module (node:fs) into it would break that.
|
|
44
|
+
import { CLAUDE_EXT_ID } from "./relay-guard.mjs";
|
|
36
45
|
|
|
37
46
|
/**
|
|
38
47
|
* Claude in Chrome's extension id, which is the same 32 characters in every
|
|
@@ -42,8 +51,11 @@ import { posix as posixPath, win32 as winPath } from "node:path";
|
|
|
42
51
|
* the browser, so Brave, Edge and Vivaldi all hold it under this exact name.
|
|
43
52
|
* That is what makes a directory test sufficient here and what lets one
|
|
44
53
|
* constant serve every row this module returns.
|
|
54
|
+
*
|
|
55
|
+
* Re-exported rather than moved, so the callers that read it from here keep
|
|
56
|
+
* working and the name still documents itself where it is used.
|
|
45
57
|
*/
|
|
46
|
-
export
|
|
58
|
+
export { CLAUDE_EXT_ID };
|
|
47
59
|
|
|
48
60
|
/**
|
|
49
61
|
* The directories inside a user-data root that are browsing profiles.
|
|
@@ -37,7 +37,7 @@ import { classify, toEpisodes, defaultExclusions, isProgramNavigation } from "./
|
|
|
37
37
|
import { appendLog, logPath, mergeEpisodes, readStore, undismissed, updateStore, writeStore } from "./browser-watch-store.mjs";
|
|
38
38
|
import { browserSurvey } from "./browser-presence.mjs";
|
|
39
39
|
import { available, performable, react } from "./browser-react.mjs";
|
|
40
|
-
import { RELAY_HOST } from "./relay-guard.mjs";
|
|
40
|
+
import { RELAY_HOST, hostsPath, readKillswitch, extensionReport, killswitchCommand, verdict } from "./relay-guard.mjs";
|
|
41
41
|
|
|
42
42
|
/**
|
|
43
43
|
* The moment this deck started, and the only floor any read uses.
|
|
@@ -77,6 +77,106 @@ function mtimeMs(file, deps) {
|
|
|
77
77
|
try { return (deps.statSync ?? statSync)(file).mtimeMs; } catch { return null; }
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
/** Secure Preferences reports, keyed on the file and its mtime — see
|
|
81
|
+
* `relayGuard` for why this one needs a cache more than the History read
|
|
82
|
+
* does. */
|
|
83
|
+
const extCache = new Map();
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* What relay-guard can say about this machine, from two reads it does not do
|
|
87
|
+
* itself.
|
|
88
|
+
*
|
|
89
|
+
* THE MODULE WAS BUILT AND NEVER PLUGGED IN (#799). Every export but
|
|
90
|
+
* `RELAY_HOST` greped to its own declaration and its test, so the header's
|
|
91
|
+
* promise — "the one command that closes it … hands back the command that would
|
|
92
|
+
* change it, as text, for the user to paste" — reached no surface. A reader
|
|
93
|
+
* auditing this repo's security posture would have believed the killswitch and
|
|
94
|
+
* the grant report ship. This is that promise kept: the panel now renders both.
|
|
95
|
+
*
|
|
96
|
+
* relay-guard imports node:path and nothing else, on purpose, so the reading is
|
|
97
|
+
* here. Two sources:
|
|
98
|
+
*
|
|
99
|
+
* THE HOSTS FILE, once. Small, and the same file for every profile.
|
|
100
|
+
*
|
|
101
|
+
* EACH PROFILE'S "Secure Preferences", only where `hasExtension` already said
|
|
102
|
+
* the directory is there. This one is why there is a cache: it is a single
|
|
103
|
+
* JSON document holding every extension's settings and it runs to megabytes
|
|
104
|
+
* on a profile with a few installed, while the panel polls every ten seconds.
|
|
105
|
+
* Keyed on mtime like the History cache above, and for the same reason — a
|
|
106
|
+
* browser that is closed cannot invalidate it.
|
|
107
|
+
*
|
|
108
|
+
* A read that fails is not a report of "nothing installed": `null` for that
|
|
109
|
+
* profile, and the aggregate says so. The difference matters here more than
|
|
110
|
+
* anywhere else in this file, because the reassuring answer and the unreadable
|
|
111
|
+
* answer are the same shape.
|
|
112
|
+
*/
|
|
113
|
+
async function relayGuard(profiles, { platform, env, deps }) {
|
|
114
|
+
const readOne = async (file) => {
|
|
115
|
+
const stamp = mtimeMs(file, deps);
|
|
116
|
+
if (stamp === null) return null;
|
|
117
|
+
const hit = extCache.get(file);
|
|
118
|
+
if (hit && hit.stamp === stamp) return hit.report;
|
|
119
|
+
let report = null;
|
|
120
|
+
try {
|
|
121
|
+
report = extensionReport(JSON.parse(await (deps.readFile ?? readFile)(file, "utf8")));
|
|
122
|
+
} catch {
|
|
123
|
+
// Unreadable or not JSON — a profile being written as we looked, a
|
|
124
|
+
// hardened profile we cannot open. Not cached, so the next poll retries.
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
extCache.set(file, { stamp, report });
|
|
128
|
+
return report;
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
const seen = [];
|
|
132
|
+
for (const profile of profiles) {
|
|
133
|
+
// `hasClaudeExt` is an existsSync on `Extensions/<id>` and is already
|
|
134
|
+
// computed; it cannot see `enabled`, `allUrls` or `sensitiveApis`, which is
|
|
135
|
+
// the whole reason this reads the preferences at all. But it is a free way
|
|
136
|
+
// to skip every profile that has no extension to report on.
|
|
137
|
+
if (!profile.hasClaudeExt) continue;
|
|
138
|
+
const report = await readOne(profile.securePrefsPath);
|
|
139
|
+
seen.push({
|
|
140
|
+
browser: profile.browser,
|
|
141
|
+
name: profile.name,
|
|
142
|
+
profile: profile.profile,
|
|
143
|
+
// Null when the file could not be read, which the panel says out loud
|
|
144
|
+
// rather than rendering as an absence of permissions.
|
|
145
|
+
report,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
let hostsText = null;
|
|
150
|
+
const hosts = (deps.hostsPath ?? hostsPath)(platform, env);
|
|
151
|
+
try { hostsText = await (deps.readFile ?? readFile)(hosts, "utf8"); } catch { /* no file, or no permission to read it */ }
|
|
152
|
+
const killswitch = readKillswitch(hostsText);
|
|
153
|
+
|
|
154
|
+
// ONE ENABLED COPY ANYWHERE IS ENOUGH, which is `verdict`'s own rule: the
|
|
155
|
+
// relay is registered per ANTHROPIC ACCOUNT, not per profile, so a second
|
|
156
|
+
// profile with the extension switched off protects nothing.
|
|
157
|
+
const anyExtension = seen.some(p => p.report?.present === true && p.report.enabled === true);
|
|
158
|
+
|
|
159
|
+
return {
|
|
160
|
+
relayHost: RELAY_HOST,
|
|
161
|
+
hostsPath: hosts,
|
|
162
|
+
// Whether the hosts file could be read at all. `blocked: false` from an
|
|
163
|
+
// unreadable file and `blocked: false` from a file with no entry are the
|
|
164
|
+
// same value and not the same fact.
|
|
165
|
+
hostsRead: typeof hostsText === "string",
|
|
166
|
+
profiles: seen,
|
|
167
|
+
anyExtension,
|
|
168
|
+
killswitch,
|
|
169
|
+
verdict: verdict({ anyExtension, blocked: killswitch.blocked }),
|
|
170
|
+
// Both, always, so the panel can offer the one that matches the state
|
|
171
|
+
// without having to know how either is spelled. Text only — nothing here
|
|
172
|
+
// runs it, and relay-guard could not if it tried.
|
|
173
|
+
command: {
|
|
174
|
+
block: killswitchCommand(platform, { on: true }),
|
|
175
|
+
unblock: killswitchCommand(platform, { on: false }),
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
|
|
80
180
|
/**
|
|
81
181
|
* Visits for one profile, re-reading only when the browser has written since
|
|
82
182
|
* the last look.
|
|
@@ -503,6 +603,10 @@ export async function browserWatchSnapshot({
|
|
|
503
603
|
log: watchLog(),
|
|
504
604
|
profiles: [],
|
|
505
605
|
browsers: [],
|
|
606
|
+
// Null rather than an empty report: this poll read no browser at all, and
|
|
607
|
+
// "the extension is not installed" is not something it is in a position
|
|
608
|
+
// to say. The panel renders the difference.
|
|
609
|
+
relay: null,
|
|
506
610
|
episodes: archived,
|
|
507
611
|
coverage: {
|
|
508
612
|
startedMs: STARTED_MS,
|
|
@@ -753,10 +857,14 @@ export async function browserWatchSnapshot({
|
|
|
753
857
|
_checkedMs = now;
|
|
754
858
|
|
|
755
859
|
const browsers = await surveyBrowsers(platform, env, now, deps);
|
|
860
|
+
// Two small reads, and the answer to the one question this panel exists
|
|
861
|
+
// beside: whether somebody else's Claude Code can drive this browser (#799).
|
|
862
|
+
const relay = await relayGuard(profiles, { platform, env, deps }).catch(() => null);
|
|
756
863
|
|
|
757
864
|
return {
|
|
758
865
|
ok: true,
|
|
759
866
|
settings: store.settings,
|
|
867
|
+
relay,
|
|
760
868
|
// What this platform can actually do, so the panel never offers a mode
|
|
761
869
|
// that would silently do nothing. See browser-react.mjs.
|
|
762
870
|
reactions: available(platform),
|
package/src/server/index.mjs
CHANGED
|
@@ -788,7 +788,7 @@ const AGENT_NAME_MARK = '"agent-name"';
|
|
|
788
788
|
/** Fold one line's naming records into `out`. Last value wins. Pure: `out` is
|
|
789
789
|
* the only thing written, and a line that is not one of the two records — or
|
|
790
790
|
* is a truncated fragment of one — leaves it untouched. */
|
|
791
|
-
function foldSessionNamingLine(out, line) {
|
|
791
|
+
export function foldSessionNamingLine(out, line) {
|
|
792
792
|
if (!line) return;
|
|
793
793
|
const hasTitle = line.includes(AI_TITLE_MARK);
|
|
794
794
|
const hasName = line.includes(AGENT_NAME_MARK);
|
|
@@ -803,22 +803,6 @@ function foldSessionNamingLine(out, line) {
|
|
|
803
803
|
}
|
|
804
804
|
}
|
|
805
805
|
|
|
806
|
-
/**
|
|
807
|
-
* The session naming carried by a chunk of transcript text, newest wins.
|
|
808
|
-
*
|
|
809
|
-
* Pure and text-in, so the suite can pin the parsing against a handful of lines
|
|
810
|
-
* instead of a 46 MB fixture. Returns `{aiTitle: null, agentName: null}` for a
|
|
811
|
-
* chunk holding neither — a young session, or a stretch of the file that is all
|
|
812
|
-
* tool output — and the caller keeps whatever it already knew rather than
|
|
813
|
-
* clearing a name it has already shown.
|
|
814
|
-
*/
|
|
815
|
-
export function readSessionNaming(text) {
|
|
816
|
-
const out = { aiTitle: null, agentName: null };
|
|
817
|
-
if (!text || typeof text !== "string") return out;
|
|
818
|
-
for (const line of text.split("\n")) foldSessionNamingLine(out, line);
|
|
819
|
-
return out;
|
|
820
|
-
}
|
|
821
|
-
|
|
822
806
|
/** Fold one transcript line into the running state. Every fact the three
|
|
823
807
|
* scanners need lives on a single line, so line-at-a-time folding sees
|
|
824
808
|
* exactly what a whole-file pass would. */
|
|
@@ -1459,8 +1443,13 @@ const lastNameReadAt = new Map(); // sid -> ms timestamp
|
|
|
1459
1443
|
const pendingNameReads = new Set(); // sid currently being read
|
|
1460
1444
|
|
|
1461
1445
|
/** The naming the cursor has folded so far, or null when the scan has nothing.
|
|
1462
|
-
*
|
|
1463
|
-
*
|
|
1446
|
+
*
|
|
1447
|
+
* NOT exported, and the comment here used to say it was — "beside
|
|
1448
|
+
* readContextFromTranscript … the rule is worth pinning directly rather than
|
|
1449
|
+
* through a live server" — which stated a test contract no test had (#798).
|
|
1450
|
+
* What is worth pinning is the parsing, and that is `foldSessionNamingLine`,
|
|
1451
|
+
* which IS exported and which session-name.test.ts drives line at a time the
|
|
1452
|
+
* way `foldTranscriptLine` does. This wrapper is a scan and two null checks. */
|
|
1464
1453
|
async function readSessionNamingFromTranscript(path) {
|
|
1465
1454
|
const state = await scanTranscript(path);
|
|
1466
1455
|
if (!state) return null;
|
package/src/server/open-url.mjs
CHANGED
|
@@ -158,19 +158,14 @@ export function startCommand(url, env = process.env, comspec) {
|
|
|
158
158
|
}
|
|
159
159
|
|
|
160
160
|
/**
|
|
161
|
-
*
|
|
161
|
+
* The address to actually hand the desktop, or null when it is not one — and
|
|
162
|
+
* the ONLY guard, since #798 removed the `isOpenable` boolean that sat in front
|
|
163
|
+
* of it with no caller but the suite.
|
|
162
164
|
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
* it and `start` would run it.
|
|
167
|
-
*/
|
|
168
|
-
export function isOpenable(url) {
|
|
169
|
-
return normalizeOpenable(url) !== null;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* The address to actually hand the desktop, or null when it is not one.
|
|
165
|
+
* Refuse anything that is not an http(s) URL: today's one caller passes a
|
|
166
|
+
* loopback address this deck built itself, so this is not guarding against a
|
|
167
|
+
* hostile input — it is guarding against the day a second caller passes a path,
|
|
168
|
+
* because every launcher above would happily open it and `start` would run it.
|
|
174
169
|
*
|
|
175
170
|
* The guard used to parse into a local `u`, check its protocol and throw the
|
|
176
171
|
* parse away — so what reached `launchers` was the RAW string. `new URL()`
|
|
@@ -12,6 +12,11 @@
|
|
|
12
12
|
// the one holding the user's logged-in sessions, so the question is worth a
|
|
13
13
|
// panel rather than a footnote.
|
|
14
14
|
//
|
|
15
|
+
// WHERE IT SURFACES. The Browser Watch panel, under "Can this browser be
|
|
16
|
+
// driven": the verdict, the grants each profile actually holds, and the
|
|
17
|
+
// killswitch command as text to copy. `browser-watch.mjs`'s `relayGuard` does
|
|
18
|
+
// the two reads this module refuses to do and calls everything below.
|
|
19
|
+
//
|
|
15
20
|
// WHAT THIS MODULE DOES. Two reads and a string. It says whether the extension
|
|
16
21
|
// is installed and what it was granted (from a profile's "Secure Preferences",
|
|
17
22
|
// which the caller parses), and whether the hosts file already black-holes the
|
|
@@ -1463,6 +1463,23 @@ export function startSystemMetrics() {
|
|
|
1463
1463
|
thermalTimer.unref?.();
|
|
1464
1464
|
}
|
|
1465
1465
|
|
|
1466
|
+
/**
|
|
1467
|
+
* Stop the three timers and reset every reading this module holds.
|
|
1468
|
+
*
|
|
1469
|
+
* THE SUITE'S, AND SAID PLAINLY (#798). Production starts the loop once at boot
|
|
1470
|
+
* and never stops it — the process ending is what stops it — so an audit
|
|
1471
|
+
* grepping for callers finds none, and the honest answer is not to delete this
|
|
1472
|
+
* but to name what it is for. It is a RESET as much as a stop: `history`,
|
|
1473
|
+
* `thermal`, the CPU baselines and the miss counters all go back to their
|
|
1474
|
+
* initial values, which is exactly what a case needs between two runs of
|
|
1475
|
+
* `startSystemMetrics` in one process, and what nothing else in this module
|
|
1476
|
+
* offers. Deleting it would leave the suite leaking intervals into the values
|
|
1477
|
+
* the next case reads.
|
|
1478
|
+
*
|
|
1479
|
+
* That is also why it is safe as a test-only export where the four removed in
|
|
1480
|
+
* #798 were not: there is no shipped counterpart for it to drift away from. The
|
|
1481
|
+
* state it clears IS the state every other assertion here reads.
|
|
1482
|
+
*/
|
|
1466
1483
|
export function stopSystemMetrics() {
|
|
1467
1484
|
if (cpuTimer) clearInterval(cpuTimer);
|
|
1468
1485
|
if (memTimer) clearInterval(memTimer);
|