@viraatdas/rudder 2.14.58 → 2.14.60

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 CHANGED
@@ -116,6 +116,18 @@ to `~/.rudder/config.json`.
116
116
  Mouse wheel and trackpad scroll the pane under the pointer. Over the worker or
117
117
  review pane they scroll Rudder's captured scrollback.
118
118
 
119
+ ### Usage dashboard
120
+
121
+ Press `U` in the agents pane (or type `/usage web`) for a machine-wide usage
122
+ page in your browser: subscription quota meters for every signed-in Claude Code
123
+ and Codex account (session and weekly windows with time to reset, read from the
124
+ providers' own usage endpoints using the sign-ins the CLIs already hold), token
125
+ costs estimated at API list rates from the CLIs' local session logs (per day,
126
+ provider, model, and workspace, with the top sessions per workspace and a
127
+ click-to-copy id for `--resume`), and a live view of CPU and memory for Rudder
128
+ and every agent process. Bare `/usage` keeps the one-line summary for the
129
+ current session.
130
+
119
131
  ### Web board
120
132
 
121
133
  Press `o` in the agents pane (or type `/web`) to open the live project board in
@@ -189,7 +201,8 @@ scroll the pane.
189
201
  **In the agents pane:** `j` / `k` or arrows move the selection, `Enter` focuses
190
202
  the worker, `m` / `M` / `R` / `r` / `d` act on the selection, `x` stops a running
191
203
  agent (keeping its workspace), `c` clears all merged agents from the list (press
192
- twice to confirm), `g` toggles the nested DAG view, and `o` opens the web board.
204
+ twice to confirm), `g` toggles the nested DAG view, `o` opens the web board, and
205
+ `U` opens the usage dashboard.
193
206
 
194
207
  **Finished work collapses.** A long session ends with dozens of merged and failed
195
208
  rows, which bury the two or three still moving, so `done` and `closed` each render
Binary file
@@ -1 +1 @@
1
- :root{--paper: #ffffff;--paper-2: #fafafa;--card: #ffffff;--ink: #111111;--ink-2: #6b7280;--line: #e8e8e8;--line-strong: #d9d9d9;--accent: #0b747c;--accent-deep: #0b6e74;--st-todo: #6b7280;--st-running: #b45309;--st-review: #0b747c;--st-done: #15803d;--st-failed: #c0392b;--st-conflict: #a21caf;--st-blocked: #64748b;--shadow-sm: 0 1px 2px rgba(17, 17, 17, .04);--shadow: 0 3px 10px rgba(17, 17, 17, .06);--shadow-lg: 0 18px 48px rgba(17, 17, 17, .12);--radius: 8px;--sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;--mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, monospace;--t-fast: .12s cubic-bezier(.2, .7, .2, 1);--t-slow: .2s cubic-bezier(.2, .7, .2, 1);color:var(--ink);background:var(--paper);font-family:var(--sans);font-size:15px;line-height:1.4;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}*{box-sizing:border-box}html,body{margin:0;padding:0;background:var(--paper);color:var(--ink);min-height:100%}.mono{font-family:var(--mono);font-variant-ligatures:none}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}button{font-family:inherit}button:focus-visible{outline:2px solid var(--ink);outline-offset:2px}[data-status=todo]{--sc: var(--st-todo)}[data-status=running]{--sc: var(--st-running)}[data-status=review]{--sc: var(--st-review)}[data-status=done]{--sc: var(--st-done)}[data-status=failed]{--sc: var(--st-failed)}[data-status=conflict]{--sc: var(--st-conflict)}[data-status=blocked]{--sc: var(--st-blocked)}.page{min-height:100vh;display:flex;flex-direction:column}.topbar{position:sticky;top:0;z-index:20;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 24px;background:var(--paper);border-bottom:1px solid var(--line-strong)}.brand{display:inline-flex;align-items:center;gap:10px}.brand-link{display:inline-flex;align-items:center;text-decoration:none;color:inherit;transition:color var(--t-fast)}.brand-link:hover{color:var(--ink-2)}.brand-mark{color:var(--ink);font-size:19px;line-height:1}.brand-back{margin-left:6px;font-size:12px;color:var(--ink-2);white-space:nowrap}.brand-link:hover .brand-back{color:var(--accent)}.brand-name{font-size:15px;font-weight:500;letter-spacing:-.01em}.brand-sub{padding:1px 6px;border:1px solid var(--line);font-size:11px;color:var(--ink-2);text-transform:uppercase;letter-spacing:.08em}.btn{appearance:none;display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border:1px solid var(--line-strong);background:var(--card);color:var(--ink);font-size:13px;font-weight:500;cursor:pointer;border-radius:7px;box-shadow:none;transition:border-color var(--t-fast),background var(--t-fast),color var(--t-fast)}.btn:hover:not(:disabled){border-color:#b8b8b8;background:var(--paper-2)}.btn:active:not(:disabled){background:#f2f2f2}.btn:disabled{opacity:.5;cursor:not-allowed;box-shadow:none}.btn:focus-visible{outline:2px solid var(--ink);outline-offset:2px}.btn-accent{background:var(--ink);color:#fff;border-color:var(--ink)}.btn-accent:hover:not(:disabled){background:#2a2a2a;border-color:#2a2a2a}.btn-danger{background:var(--card);color:var(--st-failed);border-color:var(--st-failed)}.btn-danger:hover:not(:disabled){background:var(--st-failed);color:#fff}.index-main{flex:1;width:100%;max-width:1200px;margin:0 auto;padding:48px 24px 80px}.index-title{margin:0;font-size:44px;font-weight:400;letter-spacing:-.02em;line-height:.95}.index-lede{margin:12px 0 40px;color:var(--ink-2);font-size:17px;max-width:60ch}.tile-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:18px}.tile{display:block;width:100%;text-align:left;padding:20px;border:1px solid var(--line-strong);background:var(--card);border-radius:var(--radius);box-shadow:none;cursor:pointer;transition:border-color var(--t-fast),background var(--t-fast)}.tile:hover{border-color:#b8b8b8;background:#fdfdfd}.tile:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.tile-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px}.tile-name{font-size:19px;font-weight:500;letter-spacing:-.01em}.tile-path{margin-top:6px;color:var(--ink-2);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tile-counts{display:flex;flex-wrap:wrap;gap:8px;margin-top:18px}.count{display:inline-flex;align-items:center;gap:6px;padding:3px 8px;border:1px solid var(--line);background:var(--paper)}.count[data-zero=true]{opacity:.4}.count-n{font-size:13px;font-weight:500}.count-label{font-size:11px;color:var(--ink-2);text-transform:uppercase;letter-spacing:.06em}.count-running .count-n{color:var(--st-running)}.count-review .count-n{color:var(--st-review)}.count-todo .count-n{color:var(--st-todo)}.count-done .count-n{color:var(--st-done)}.count-blocked .count-n{color:var(--st-blocked)}.count-failed .count-n{color:var(--st-failed)}.board-page{height:100vh;overflow:hidden}.board-topbar{flex:0 0 auto}.toolbar-actions{display:flex;align-items:center;gap:12px}.readonly-pill{display:inline-flex;align-items:center;min-height:30px;padding:0 10px;border:1px solid var(--line-strong);border-radius:999px;color:var(--ink-2);font-size:11px;letter-spacing:.05em;text-transform:uppercase}.view-toggle{display:inline-flex;border:1px solid var(--line-strong);background:var(--card);border-radius:7px;box-shadow:none;overflow:hidden}.toggle{appearance:none;display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border:none;border-right:1px solid var(--line);background:transparent;color:var(--ink-2);font-size:13px;font-weight:500;cursor:pointer;transition:background var(--t-fast),color var(--t-fast)}.toggle:last-child{border-right:none}.toggle:hover:not(:disabled):not(.toggle-on){background:var(--paper-2);color:var(--ink)}.toggle-on{background:var(--ink);color:var(--paper)}.toggle-disabled{opacity:.4;cursor:not-allowed}.toggle-badge{padding:0 5px;font-size:10px;font-weight:500;background:var(--accent);color:#fff}.toggle-on .toggle-badge{background:var(--paper);color:var(--ink)}.conn{display:inline-flex;align-items:center;gap:6px;margin-left:4px;padding:2px 8px;border:1px solid var(--line);border-radius:999px}.conn-dot{width:7px;height:7px;background:var(--st-done)}.conn-live .conn-dot{background:var(--st-done)}.conn-warn{border-color:var(--st-running)}.conn-warn .conn-dot{background:var(--st-running)}.conn-dot-pulse{animation:pulse 1.1s ease-in-out infinite}.conn-label{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-2)}.board-main{flex:1;min-height:0;overflow:hidden;padding:18px 18px 0}.board{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px;height:100%}.column{display:flex;flex-direction:column;min-height:0;background:var(--paper-2);border:1px solid var(--line);border-radius:var(--radius) var(--radius) 0 0;overflow:hidden}.column-head{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;padding:11px 14px;border-bottom:1px solid var(--line);background:var(--paper-2)}.column-title{font-size:12px;font-weight:500;text-transform:uppercase;letter-spacing:.12em;color:var(--ink-2)}.column-count{font-size:12px;font-weight:500;color:var(--ink);padding:1px 7px;border:1px solid var(--line);background:var(--paper)}.column-body{flex:1;min-height:0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:12px}.column-empty{padding:16px 4px;text-align:center;color:var(--ink-2);opacity:.55;font-size:12px;text-transform:uppercase;letter-spacing:.08em}.card{position:relative;display:flex;padding:0;border:1px solid var(--line-strong);background:var(--card);border-radius:var(--radius);box-shadow:none;cursor:pointer;overflow:hidden;transition:border-color var(--t-fast),box-shadow var(--t-fast)}.card:hover{border-color:#b8b8b8;box-shadow:var(--shadow-sm)}.card:focus-visible{outline:2px solid var(--ink);outline-offset:2px}.card-selected{box-shadow:0 0 0 2px var(--accent),var(--shadow)}.card-spine{flex:0 0 4px;width:4px;background:var(--sc, var(--st-todo))}.card-body{flex:1;min-width:0;padding:12px 14px;display:flex;flex-direction:column;gap:8px}.card-top{display:flex;align-items:center;gap:8px}.card-status{font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:var(--sc, var(--st-todo))}.flag{padding:1px 6px;font-size:10px;font-weight:500;text-transform:uppercase;letter-spacing:.06em}.flag-blocked{color:#fff;background:var(--st-blocked)}.card-title{margin:0;font-size:14px;font-weight:500;line-height:1.3;letter-spacing:-.005em;color:var(--ink);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.card-meta{display:flex;flex-wrap:wrap;gap:8px;font-size:11px;color:var(--ink-2)}.card-backend{color:var(--ink);font-weight:500}.card-model{color:var(--st-conflict)}.card-effort{color:var(--ink-2)}.card-lastline{display:flex;align-items:center;gap:7px;font-size:11px;color:var(--ink-2);background:var(--paper);border:1px solid var(--line);padding:5px 8px}.lastline-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.pulse-dot{flex:0 0 auto;width:7px;height:7px;background:var(--st-running);animation:pulse 1.1s ease-in-out infinite}.card-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:11px}.tokens{display:inline-flex;gap:8px;color:var(--ink-2)}.tok-in{color:var(--st-review)}.tok-out{color:var(--st-running)}.dep-badge{display:inline-flex;gap:6px}.dep{padding:1px 5px;border:1px solid var(--line);font-size:10px;text-transform:uppercase;letter-spacing:.04em}.dep-hard{color:var(--st-failed);border-color:var(--st-failed)}.dep-soft{color:var(--ink-2)}.overlay{position:fixed;inset:0;z-index:40;display:flex;align-items:flex-start;justify-content:center;padding-top:12vh;background:#11111114;animation:fade var(--t-slow)}.composer{width:min(640px,calc(100vw - 48px));background:var(--card);border:1px solid var(--line-strong);border-radius:10px;box-shadow:var(--shadow-lg);overflow:hidden;animation:rise var(--t-slow)}.composer-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;padding:14px 16px;border-bottom:1px solid var(--line)}.composer-title{font-size:15px;font-weight:500}.composer-hint{font-size:11px;color:var(--ink-2)}.composer-input{display:block;width:100%;border:none;border-bottom:1px solid var(--line);background:var(--paper);color:var(--ink);padding:14px 16px;font-size:13px;line-height:1.5;resize:vertical}.composer-input:focus{outline:none;background:#fff}.composer-input::placeholder{color:var(--ink-2);opacity:.7}.composer-actions{display:flex;justify-content:flex-end;gap:10px;padding:14px 16px}.drawer-overlay{position:fixed;inset:0;z-index:50;background:#11111114;animation:fade var(--t-slow)}.drawer{position:absolute;top:0;right:0;height:100%;width:min(620px,calc(100vw - 40px));display:flex;flex-direction:column;background:var(--card);border-left:1px solid var(--line-strong);box-shadow:var(--shadow-lg);animation:slide-in var(--t-slow)}.drawer:focus{outline:none}.drawer-spine{position:absolute;top:0;left:0;bottom:0;width:4px;background:var(--sc, var(--st-todo))}.drawer-head{flex:0 0 auto;padding:18px 20px 16px 22px;border-bottom:1px solid var(--line)}.drawer-head-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.drawer-close{appearance:none;border:1px solid var(--line);background:var(--paper);color:var(--ink-2);width:26px;height:26px;border-radius:6px;cursor:pointer;font-size:12px;transition:background var(--t-fast),color var(--t-fast)}.drawer-close:hover{background:var(--ink);color:var(--paper)}.drawer-title{margin:0 0 10px;font-size:20px;font-weight:500;letter-spacing:-.01em;line-height:1.2}.drawer-meta{display:flex;flex-wrap:wrap;gap:12px;font-size:12px;color:var(--ink-2)}.drawer-meta span:first-child{color:var(--ink);font-weight:500}.drawer-worktree{margin-top:10px;padding:5px 8px;background:var(--paper);border:1px solid var(--line);border-radius:6px;font-size:11px;color:var(--ink-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.drawer-actions{flex:0 0 auto;display:flex;align-items:center;flex-wrap:wrap;gap:10px;padding:14px 20px 14px 22px;border-bottom:1px solid var(--line)}.action-msg{font-size:12px;color:var(--st-done)}.action-err{font-size:12px;color:var(--st-failed)}.drawer-scroll{flex:1;min-height:0;overflow-y:auto}.task-updates{padding:18px 20px 8px 22px;border-bottom:1px solid var(--line)}.task-updates-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:4px}.task-updates-head h3{margin:0;font-size:13px;font-weight:500}.task-updates-count{min-width:22px;padding:1px 6px;border:1px solid var(--line);border-radius:999px;color:var(--ink-2);font-size:10px;text-align:center}.task-thread{display:flex;flex-direction:column}.task-thread-empty{margin:8px 0 10px;color:var(--ink-2);font-size:13px}.task-update{display:flex;gap:10px;padding:12px 0;border-top:1px solid var(--line)}.task-update:first-child{border-top:none}.task-update-avatar{flex:0 0 auto;display:grid;place-items:center;width:24px;height:24px;border:1px solid var(--line-strong);border-radius:50%;background:var(--paper);color:var(--ink);font-size:10px;font-weight:500}.task-update-avatar-agent{background:var(--ink);border-color:var(--ink);color:var(--paper)}.task-update-body{flex:1;min-width:0}.task-update-meta{display:flex;align-items:baseline;justify-content:space-between;gap:12px;color:var(--ink-2);font-size:11px}.task-update-meta span:first-child{color:var(--ink);font-weight:500}.task-update-body p{margin:4px 0 0;color:var(--ink);font-size:13px;line-height:1.5;overflow-wrap:anywhere}.task-update-agent .task-update-body p{padding:8px 10px;border:1px solid var(--line);border-radius:6px;background:var(--paper-2);color:var(--ink-2);font-size:11px}.drawer-log{padding:0 20px 20px 22px}.drawer-log-head{display:flex;align-items:center;gap:8px;padding:16px 0 8px;font-size:11px;text-transform:uppercase;letter-spacing:.1em;color:var(--ink-2)}.log-pre{min-height:150px;max-height:320px;margin:0;overflow:auto;padding:12px;font-size:12px;line-height:1.5;color:var(--ink);white-space:pre-wrap;word-break:break-word;background:var(--paper-2);border:1px solid var(--line);border-radius:7px}.log-loading{display:flex;flex-direction:column;gap:10px}.memory{flex:1;overflow-y:auto;max-width:860px;margin:0 auto;padding:8px 6px 40px;display:flex;flex-direction:column;gap:0}.memory-entry{position:relative;display:flex;gap:16px;padding:16px 4px 16px 0;border-bottom:1px solid var(--line)}.memory-bead{flex:0 0 auto;margin-top:5px;width:11px;height:11px;background:var(--accent);border:1px solid var(--line-strong)}.memory-content{flex:1;min-width:0}.memory-text{margin:0;font-size:14px;line-height:1.5;color:var(--ink)}.memory-meta{display:flex;gap:12px;margin-top:6px;font-size:11px;color:var(--ink-2)}.memory-owner{color:var(--accent);font-weight:500}.nest{height:100%;min-height:0;overflow:auto;padding:8px 4px 24px}.nest-svg{display:block}.nest .edge-hard{stroke:var(--line-strong);stroke-width:2;marker-end:url(#arrow)}.nest .edge-soft{stroke:var(--line);stroke-width:1.5;stroke-dasharray:4 4;opacity:.6;marker-end:url(#arrow-soft)}.nest .arrow-head{fill:var(--line-strong)}.nest .arrow-head-soft{fill:var(--line)}.nest .node{cursor:pointer}.nest .node:focus-visible{outline:none}.nest .node-box{fill:var(--card);stroke:var(--sc, var(--st-todo));stroke-width:2;transition:transform var(--t-fast)}.nest .node:hover .node-box{fill:var(--paper)}.nest .node-selected .node-box{stroke:var(--accent);stroke-width:3}.nest .node-spine{fill:var(--sc, var(--st-todo))}.nest .node-status{fill:var(--sc, var(--st-todo));font-size:10px;font-weight:500;text-transform:uppercase;letter-spacing:.06em}.nest .node-title{fill:var(--ink);font-family:var(--sans);font-size:13px;font-weight:500}.nest .node:focus-visible .node-box{stroke:var(--accent);stroke-width:3}.banner{padding:10px 12px;border:1px solid var(--line-strong);font-size:12px;margin:12px 0}.banner-error{color:var(--st-failed);border-color:var(--st-failed);background:var(--card)}.empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:80px 20px;text-align:center}.empty-title{font-size:18px;font-weight:500;color:var(--ink)}.empty-sub{font-size:12px;color:var(--ink-2)}.tile-skeleton,.card-skeleton{cursor:default;display:flex;flex-direction:column;gap:10px;padding:18px}.card-skeleton:hover,.tile-skeleton:hover{transform:none;box-shadow:var(--shadow-sm)}.skel{background:var(--paper-2);border:1px solid var(--line)}.skel-line{height:12px}.skel-row{height:28px;margin-top:8px}@keyframes pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.8)}}@keyframes slide-in{0%{transform:translate(24px);opacity:.6}to{transform:translate(0);opacity:1}}@keyframes rise{0%{transform:translateY(-12px);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes fade{0%{opacity:0}to{opacity:1}}@media (max-width: 900px){.board{grid-template-columns:repeat(2,minmax(0,1fr));height:auto}.board-page{height:auto;overflow:auto}.board-main{overflow:visible}.column{min-height:200px}}@media (max-width: 560px){.board{grid-template-columns:1fr}.drawer{width:100vw}}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}.pulse-dot,.conn-dot-pulse{animation:none!important;opacity:1!important}}.activity{flex:1;min-height:0;display:flex;flex-direction:column;max-width:920px;width:100%;margin:0 auto;padding:8px 6px 24px}.activity-steer{flex:0 0 auto;border:1px solid var(--line);border-radius:var(--radius);background:var(--card);box-shadow:none;padding:14px;margin-bottom:14px}.steer{display:flex;flex-direction:column;gap:8px}.steer-label{color:var(--ink);font-size:13px;font-weight:500}.steer-input{display:block;width:100%;min-height:78px;max-height:180px;border:1px solid var(--line);border-radius:7px;background:var(--paper);color:var(--ink);padding:10px 11px;font-family:var(--sans);font-size:13px;line-height:1.5;resize:vertical}.steer-input:focus{outline:none;border-color:var(--ink);box-shadow:0 0 0 1px var(--ink)}.steer-input::placeholder{color:var(--ink-2);opacity:.7}.steer-actions{display:flex;align-items:center;justify-content:space-between;gap:12px}.steer-hint{color:var(--ink-2);font-family:var(--mono);font-size:10px}.steer-feedback{display:flex;flex-direction:column;gap:2px;padding:8px 10px;border-left:2px solid var(--line-strong);background:var(--paper-2);font-size:11px}.steer-feedback-delivered,.steer-feedback-accepted{border-left-color:var(--st-done)}.steer-feedback-failed{border-left-color:var(--st-failed)}.steer-feedback-state{color:var(--ink);font-weight:500}.steer-feedback-text{overflow:hidden;color:var(--ink-2);text-overflow:ellipsis;white-space:nowrap}.steer-error{padding:8px 10px;border:1px solid color-mix(in srgb,var(--st-failed) 35%,var(--line));border-radius:6px;background:color-mix(in srgb,var(--st-failed) 4%,var(--paper))}.activity-feed{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:2px;padding:4px 2px 8px}.activity-entry{display:flex;align-items:baseline;gap:10px;padding:7px 10px;border-radius:8px;font-size:13px;line-height:1.45;color:var(--ink)}.activity-entry:hover{background:var(--paper)}.activity-dot{flex:0 0 auto;width:6px;height:6px;border-radius:50%;background:var(--accent);transform:translateY(-1px)}.activity-heartbeat{color:var(--ink-2)}.activity-heartbeat .activity-dot{background:var(--st-blocked)}.activity-text{flex:1;word-break:break-word}.activity-ts{flex:0 0 auto;font-size:11px;color:var(--ink-2);opacity:.8}.drawer-steer{flex:0 0 auto;padding:14px 20px 16px 22px;border-top:1px solid var(--line);background:var(--paper)}.activity-ticker{display:inline-flex;align-items:center;gap:7px;max-width:42ch;margin-left:6px;padding:4px 10px;border:1px solid var(--line);border-radius:999px;background:var(--card);color:var(--ink-2);font-size:12px;cursor:pointer;transition:border-color var(--t-fast),color var(--t-fast)}.activity-ticker:hover{border-color:var(--accent);color:var(--ink)}.activity-ticker-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
1
+ :root{--paper: #ffffff;--paper-2: #fafafa;--card: #ffffff;--ink: #111111;--ink-2: #6b7280;--line: #e8e8e8;--line-strong: #d9d9d9;--accent: #0b747c;--accent-deep: #0b6e74;--st-todo: #6b7280;--st-running: #b45309;--st-review: #0b747c;--st-done: #15803d;--st-failed: #c0392b;--st-conflict: #a21caf;--st-blocked: #64748b;--shadow-sm: 0 1px 2px rgba(17, 17, 17, .04);--shadow: 0 3px 10px rgba(17, 17, 17, .06);--shadow-lg: 0 18px 48px rgba(17, 17, 17, .12);--radius: 8px;--sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;--mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, monospace;--t-fast: .12s cubic-bezier(.2, .7, .2, 1);--t-slow: .2s cubic-bezier(.2, .7, .2, 1);color:var(--ink);background:var(--paper);font-family:var(--sans);font-size:15px;line-height:1.4;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}*{box-sizing:border-box}html,body{margin:0;padding:0;background:var(--paper);color:var(--ink);min-height:100%}.mono{font-family:var(--mono);font-variant-ligatures:none}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}button{font-family:inherit}button:focus-visible{outline:2px solid var(--ink);outline-offset:2px}[data-status=todo]{--sc: var(--st-todo)}[data-status=running]{--sc: var(--st-running)}[data-status=review]{--sc: var(--st-review)}[data-status=done]{--sc: var(--st-done)}[data-status=failed]{--sc: var(--st-failed)}[data-status=conflict]{--sc: var(--st-conflict)}[data-status=blocked]{--sc: var(--st-blocked)}.page{min-height:100vh;display:flex;flex-direction:column}.topbar{position:sticky;top:0;z-index:20;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 24px;background:var(--paper);border-bottom:1px solid var(--line-strong)}.brand{display:inline-flex;align-items:center;gap:10px}.brand-link{display:inline-flex;align-items:center;text-decoration:none;color:inherit;transition:color var(--t-fast)}.brand-link:hover{color:var(--ink-2)}.brand-mark{color:var(--ink);font-size:19px;line-height:1}.brand-back{margin-left:6px;font-size:12px;color:var(--ink-2);white-space:nowrap}.brand-link:hover .brand-back{color:var(--accent)}.brand-name{font-size:15px;font-weight:500;letter-spacing:-.01em}.brand-sub{padding:1px 6px;border:1px solid var(--line);font-size:11px;color:var(--ink-2);text-transform:uppercase;letter-spacing:.08em}.btn{appearance:none;display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border:1px solid var(--line-strong);background:var(--card);color:var(--ink);font-size:13px;font-weight:500;cursor:pointer;border-radius:7px;box-shadow:none;transition:border-color var(--t-fast),background var(--t-fast),color var(--t-fast)}.btn:hover:not(:disabled){border-color:#b8b8b8;background:var(--paper-2)}.btn:active:not(:disabled){background:#f2f2f2}.btn:disabled{opacity:.5;cursor:not-allowed;box-shadow:none}.btn:focus-visible{outline:2px solid var(--ink);outline-offset:2px}.btn-accent{background:var(--ink);color:#fff;border-color:var(--ink)}.btn-accent:hover:not(:disabled){background:#2a2a2a;border-color:#2a2a2a}.btn-danger{background:var(--card);color:var(--st-failed);border-color:var(--st-failed)}.btn-danger:hover:not(:disabled){background:var(--st-failed);color:#fff}.index-main{flex:1;width:100%;max-width:1200px;margin:0 auto;padding:48px 24px 80px}.index-title{margin:0;font-size:44px;font-weight:400;letter-spacing:-.02em;line-height:.95}.index-lede{margin:12px 0 40px;color:var(--ink-2);font-size:17px;max-width:60ch}.tile-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:18px}.tile{display:block;width:100%;text-align:left;padding:20px;border:1px solid var(--line-strong);background:var(--card);border-radius:var(--radius);box-shadow:none;cursor:pointer;transition:border-color var(--t-fast),background var(--t-fast)}.tile:hover{border-color:#b8b8b8;background:#fdfdfd}.tile:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.tile-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px}.tile-name{font-size:19px;font-weight:500;letter-spacing:-.01em}.tile-path{margin-top:6px;color:var(--ink-2);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tile-counts{display:flex;flex-wrap:wrap;gap:8px;margin-top:18px}.count{display:inline-flex;align-items:center;gap:6px;padding:3px 8px;border:1px solid var(--line);background:var(--paper)}.count[data-zero=true]{opacity:.4}.count-n{font-size:13px;font-weight:500}.count-label{font-size:11px;color:var(--ink-2);text-transform:uppercase;letter-spacing:.06em}.count-running .count-n{color:var(--st-running)}.count-review .count-n{color:var(--st-review)}.count-todo .count-n{color:var(--st-todo)}.count-done .count-n{color:var(--st-done)}.count-blocked .count-n{color:var(--st-blocked)}.count-failed .count-n{color:var(--st-failed)}.board-page{height:100vh;overflow:hidden}.board-topbar{flex:0 0 auto}.toolbar-actions{display:flex;align-items:center;gap:12px}.readonly-pill{display:inline-flex;align-items:center;min-height:30px;padding:0 10px;border:1px solid var(--line-strong);border-radius:999px;color:var(--ink-2);font-size:11px;letter-spacing:.05em;text-transform:uppercase}.view-toggle{display:inline-flex;border:1px solid var(--line-strong);background:var(--card);border-radius:7px;box-shadow:none;overflow:hidden}.toggle{appearance:none;display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border:none;border-right:1px solid var(--line);background:transparent;color:var(--ink-2);font-size:13px;font-weight:500;cursor:pointer;transition:background var(--t-fast),color var(--t-fast)}.toggle:last-child{border-right:none}.toggle:hover:not(:disabled):not(.toggle-on){background:var(--paper-2);color:var(--ink)}.toggle-on{background:var(--ink);color:var(--paper)}.toggle-disabled{opacity:.4;cursor:not-allowed}.toggle-badge{padding:0 5px;font-size:10px;font-weight:500;background:var(--accent);color:#fff}.toggle-on .toggle-badge{background:var(--paper);color:var(--ink)}.conn{display:inline-flex;align-items:center;gap:6px;margin-left:4px;padding:2px 8px;border:1px solid var(--line);border-radius:999px}.conn-dot{width:7px;height:7px;background:var(--st-done)}.conn-live .conn-dot{background:var(--st-done)}.conn-warn{border-color:var(--st-running)}.conn-warn .conn-dot{background:var(--st-running)}.conn-dot-pulse{animation:pulse 1.1s ease-in-out infinite}.conn-label{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-2)}.board-main{flex:1;min-height:0;overflow:hidden;padding:18px 18px 0}.board{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px;height:100%}.column{display:flex;flex-direction:column;min-height:0;background:var(--paper-2);border:1px solid var(--line);border-radius:var(--radius) var(--radius) 0 0;overflow:hidden}.column-head{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;padding:11px 14px;border-bottom:1px solid var(--line);background:var(--paper-2)}.column-title{font-size:12px;font-weight:500;text-transform:uppercase;letter-spacing:.12em;color:var(--ink-2)}.column-count{font-size:12px;font-weight:500;color:var(--ink);padding:1px 7px;border:1px solid var(--line);background:var(--paper)}.column-body{flex:1;min-height:0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:12px}.column-empty{padding:16px 4px;text-align:center;color:var(--ink-2);opacity:.55;font-size:12px;text-transform:uppercase;letter-spacing:.08em}.card{position:relative;display:flex;padding:0;border:1px solid var(--line-strong);background:var(--card);border-radius:var(--radius);box-shadow:none;cursor:pointer;overflow:hidden;transition:border-color var(--t-fast),box-shadow var(--t-fast)}.card:hover{border-color:#b8b8b8;box-shadow:var(--shadow-sm)}.card:focus-visible{outline:2px solid var(--ink);outline-offset:2px}.card-selected{box-shadow:0 0 0 2px var(--accent),var(--shadow)}.card-spine{flex:0 0 4px;width:4px;background:var(--sc, var(--st-todo))}.card-body{flex:1;min-width:0;padding:12px 14px;display:flex;flex-direction:column;gap:8px}.card-top{display:flex;align-items:center;gap:8px}.card-status{font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:var(--sc, var(--st-todo))}.flag{padding:1px 6px;font-size:10px;font-weight:500;text-transform:uppercase;letter-spacing:.06em}.flag-blocked{color:#fff;background:var(--st-blocked)}.card-title{margin:0;font-size:14px;font-weight:500;line-height:1.3;letter-spacing:-.005em;color:var(--ink);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.card-meta{display:flex;flex-wrap:wrap;gap:8px;font-size:11px;color:var(--ink-2)}.card-backend{color:var(--ink);font-weight:500}.card-model{color:var(--st-conflict)}.card-effort{color:var(--ink-2)}.card-lastline{display:flex;align-items:center;gap:7px;font-size:11px;color:var(--ink-2);background:var(--paper);border:1px solid var(--line);padding:5px 8px}.lastline-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.pulse-dot{flex:0 0 auto;width:7px;height:7px;background:var(--st-running);animation:pulse 1.1s ease-in-out infinite}.card-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:11px}.tokens{display:inline-flex;gap:8px;color:var(--ink-2)}.tok-in{color:var(--st-review)}.tok-out{color:var(--st-running)}.dep-badge{display:inline-flex;gap:6px}.dep{padding:1px 5px;border:1px solid var(--line);font-size:10px;text-transform:uppercase;letter-spacing:.04em}.dep-hard{color:var(--st-failed);border-color:var(--st-failed)}.dep-soft{color:var(--ink-2)}.overlay{position:fixed;inset:0;z-index:40;display:flex;align-items:flex-start;justify-content:center;padding-top:12vh;background:#11111114;animation:fade var(--t-slow)}.composer{width:min(640px,calc(100vw - 48px));background:var(--card);border:1px solid var(--line-strong);border-radius:10px;box-shadow:var(--shadow-lg);overflow:hidden;animation:rise var(--t-slow)}.composer-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;padding:14px 16px;border-bottom:1px solid var(--line)}.composer-title{font-size:15px;font-weight:500}.composer-hint{font-size:11px;color:var(--ink-2)}.composer-input{display:block;width:100%;border:none;border-bottom:1px solid var(--line);background:var(--paper);color:var(--ink);padding:14px 16px;font-size:13px;line-height:1.5;resize:vertical}.composer-input:focus{outline:none;background:#fff}.composer-input::placeholder{color:var(--ink-2);opacity:.7}.composer-actions{display:flex;justify-content:flex-end;gap:10px;padding:14px 16px}.drawer-overlay{position:fixed;inset:0;z-index:50;background:#11111114;animation:fade var(--t-slow)}.drawer{position:absolute;top:0;right:0;height:100%;width:min(620px,calc(100vw - 40px));display:flex;flex-direction:column;background:var(--card);border-left:1px solid var(--line-strong);box-shadow:var(--shadow-lg);animation:slide-in var(--t-slow)}.drawer:focus{outline:none}.drawer-spine{position:absolute;top:0;left:0;bottom:0;width:4px;background:var(--sc, var(--st-todo))}.drawer-head{flex:0 0 auto;padding:18px 20px 16px 22px;border-bottom:1px solid var(--line)}.drawer-head-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.drawer-close{appearance:none;border:1px solid var(--line);background:var(--paper);color:var(--ink-2);width:26px;height:26px;border-radius:6px;cursor:pointer;font-size:12px;transition:background var(--t-fast),color var(--t-fast)}.drawer-close:hover{background:var(--ink);color:var(--paper)}.drawer-title{margin:0 0 10px;font-size:20px;font-weight:500;letter-spacing:-.01em;line-height:1.2}.drawer-meta{display:flex;flex-wrap:wrap;gap:12px;font-size:12px;color:var(--ink-2)}.drawer-meta span:first-child{color:var(--ink);font-weight:500}.drawer-worktree{margin-top:10px;padding:5px 8px;background:var(--paper);border:1px solid var(--line);border-radius:6px;font-size:11px;color:var(--ink-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.drawer-actions{flex:0 0 auto;display:flex;align-items:center;flex-wrap:wrap;gap:10px;padding:14px 20px 14px 22px;border-bottom:1px solid var(--line)}.action-msg{font-size:12px;color:var(--st-done)}.action-err{font-size:12px;color:var(--st-failed)}.drawer-scroll{flex:1;min-height:0;overflow-y:auto}.task-updates{padding:18px 20px 8px 22px;border-bottom:1px solid var(--line)}.task-updates-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:4px}.task-updates-head h3{margin:0;font-size:13px;font-weight:500}.task-updates-count{min-width:22px;padding:1px 6px;border:1px solid var(--line);border-radius:999px;color:var(--ink-2);font-size:10px;text-align:center}.task-thread{display:flex;flex-direction:column}.task-thread-empty{margin:8px 0 10px;color:var(--ink-2);font-size:13px}.task-update{display:flex;gap:10px;padding:12px 0;border-top:1px solid var(--line)}.task-update:first-child{border-top:none}.task-update-avatar{flex:0 0 auto;display:grid;place-items:center;width:24px;height:24px;border:1px solid var(--line-strong);border-radius:50%;background:var(--paper);color:var(--ink);font-size:10px;font-weight:500}.task-update-avatar-agent{background:var(--ink);border-color:var(--ink);color:var(--paper)}.task-update-body{flex:1;min-width:0}.task-update-meta{display:flex;align-items:baseline;justify-content:space-between;gap:12px;color:var(--ink-2);font-size:11px}.task-update-meta span:first-child{color:var(--ink);font-weight:500}.task-update-body p{margin:4px 0 0;color:var(--ink);font-size:13px;line-height:1.5;overflow-wrap:anywhere}.task-update-agent .task-update-body p{padding:8px 10px;border:1px solid var(--line);border-radius:6px;background:var(--paper-2);color:var(--ink-2);font-size:11px}.drawer-log{padding:0 20px 20px 22px}.drawer-log-head{display:flex;align-items:center;gap:8px;padding:16px 0 8px;font-size:11px;text-transform:uppercase;letter-spacing:.1em;color:var(--ink-2)}.log-pre{min-height:150px;max-height:320px;margin:0;overflow:auto;padding:12px;font-size:12px;line-height:1.5;color:var(--ink);white-space:pre-wrap;word-break:break-word;background:var(--paper-2);border:1px solid var(--line);border-radius:7px}.log-loading{display:flex;flex-direction:column;gap:10px}.memory{flex:1;overflow-y:auto;max-width:860px;margin:0 auto;padding:8px 6px 40px;display:flex;flex-direction:column;gap:0}.memory-entry{position:relative;display:flex;gap:16px;padding:16px 4px 16px 0;border-bottom:1px solid var(--line)}.memory-bead{flex:0 0 auto;margin-top:5px;width:11px;height:11px;background:var(--accent);border:1px solid var(--line-strong)}.memory-content{flex:1;min-width:0}.memory-text{margin:0;font-size:14px;line-height:1.5;color:var(--ink)}.memory-meta{display:flex;gap:12px;margin-top:6px;font-size:11px;color:var(--ink-2)}.memory-owner{color:var(--accent);font-weight:500}.nest{height:100%;min-height:0;overflow:auto;padding:8px 4px 24px}.nest-svg{display:block}.nest .edge-hard{stroke:var(--line-strong);stroke-width:2;marker-end:url(#arrow)}.nest .edge-soft{stroke:var(--line);stroke-width:1.5;stroke-dasharray:4 4;opacity:.6;marker-end:url(#arrow-soft)}.nest .arrow-head{fill:var(--line-strong)}.nest .arrow-head-soft{fill:var(--line)}.nest .node{cursor:pointer}.nest .node:focus-visible{outline:none}.nest .node-box{fill:var(--card);stroke:var(--sc, var(--st-todo));stroke-width:2;transition:transform var(--t-fast)}.nest .node:hover .node-box{fill:var(--paper)}.nest .node-selected .node-box{stroke:var(--accent);stroke-width:3}.nest .node-spine{fill:var(--sc, var(--st-todo))}.nest .node-status{fill:var(--sc, var(--st-todo));font-size:10px;font-weight:500;text-transform:uppercase;letter-spacing:.06em}.nest .node-title{fill:var(--ink);font-family:var(--sans);font-size:13px;font-weight:500}.nest .node:focus-visible .node-box{stroke:var(--accent);stroke-width:3}.banner{padding:10px 12px;border:1px solid var(--line-strong);font-size:12px;margin:12px 0}.banner-error{color:var(--st-failed);border-color:var(--st-failed);background:var(--card)}.empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:80px 20px;text-align:center}.empty-title{font-size:18px;font-weight:500;color:var(--ink)}.empty-sub{font-size:12px;color:var(--ink-2)}.tile-skeleton,.card-skeleton{cursor:default;display:flex;flex-direction:column;gap:10px;padding:18px}.card-skeleton:hover,.tile-skeleton:hover{transform:none;box-shadow:var(--shadow-sm)}.skel{background:var(--paper-2);border:1px solid var(--line)}.skel-line{height:12px}.skel-row{height:28px;margin-top:8px}@keyframes pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.8)}}@keyframes slide-in{0%{transform:translate(24px);opacity:.6}to{transform:translate(0);opacity:1}}@keyframes rise{0%{transform:translateY(-12px);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes fade{0%{opacity:0}to{opacity:1}}@media (max-width: 900px){.board{grid-template-columns:repeat(2,minmax(0,1fr));height:auto}.board-page{height:auto;overflow:auto}.board-main{overflow:visible}.column{min-height:200px}}@media (max-width: 560px){.board{grid-template-columns:1fr}.drawer{width:100vw}}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}.pulse-dot,.conn-dot-pulse{animation:none!important;opacity:1!important}}.activity{flex:1;min-height:0;display:flex;flex-direction:column;max-width:920px;width:100%;margin:0 auto;padding:8px 6px 24px}.activity-steer{flex:0 0 auto;border:1px solid var(--line);border-radius:var(--radius);background:var(--card);box-shadow:none;padding:14px;margin-bottom:14px}.steer{display:flex;flex-direction:column;gap:8px}.steer-label{color:var(--ink);font-size:13px;font-weight:500}.steer-input{display:block;width:100%;min-height:78px;max-height:180px;border:1px solid var(--line);border-radius:7px;background:var(--paper);color:var(--ink);padding:10px 11px;font-family:var(--sans);font-size:13px;line-height:1.5;resize:vertical}.steer-input:focus{outline:none;border-color:var(--ink);box-shadow:0 0 0 1px var(--ink)}.steer-input::placeholder{color:var(--ink-2);opacity:.7}.steer-actions{display:flex;align-items:center;justify-content:space-between;gap:12px}.steer-hint{color:var(--ink-2);font-family:var(--mono);font-size:10px}.steer-feedback{display:flex;flex-direction:column;gap:2px;padding:8px 10px;border-left:2px solid var(--line-strong);background:var(--paper-2);font-size:11px}.steer-feedback-delivered,.steer-feedback-accepted{border-left-color:var(--st-done)}.steer-feedback-failed{border-left-color:var(--st-failed)}.steer-feedback-state{color:var(--ink);font-weight:500}.steer-feedback-text{overflow:hidden;color:var(--ink-2);text-overflow:ellipsis;white-space:nowrap}.steer-error{padding:8px 10px;border:1px solid color-mix(in srgb,var(--st-failed) 35%,var(--line));border-radius:6px;background:color-mix(in srgb,var(--st-failed) 4%,var(--paper))}.activity-feed{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:2px;padding:4px 2px 8px}.activity-entry{display:flex;align-items:baseline;gap:10px;padding:7px 10px;border-radius:8px;font-size:13px;line-height:1.45;color:var(--ink)}.activity-entry:hover{background:var(--paper)}.activity-dot{flex:0 0 auto;width:6px;height:6px;border-radius:50%;background:var(--accent);transform:translateY(-1px)}.activity-heartbeat{color:var(--ink-2)}.activity-heartbeat .activity-dot{background:var(--st-blocked)}.activity-text{flex:1;word-break:break-word}.activity-ts{flex:0 0 auto;font-size:11px;color:var(--ink-2);opacity:.8}.drawer-steer{flex:0 0 auto;padding:14px 20px 16px 22px;border-top:1px solid var(--line);background:var(--paper)}.activity-ticker{display:inline-flex;align-items:center;gap:7px;max-width:42ch;margin-left:6px;padding:4px 10px;border:1px solid var(--line);border-radius:999px;background:var(--card);color:var(--ink-2);font-size:12px;cursor:pointer;transition:border-color var(--t-fast),color var(--t-fast)}.activity-ticker:hover{border-color:var(--accent);color:var(--ink)}.activity-ticker-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.usage-main{flex:1;width:100%;max-width:1120px;margin:0 auto;padding:20px 24px 64px}.usage-section{margin-top:28px}.usage-section-head{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:12px}.usage-section-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.usage-h2{font-size:18px;font-weight:500;margin:0;letter-spacing:-.01em}.usage-h3{font-size:14px;font-weight:500;margin:18px 0 8px;color:var(--ink-2);text-transform:uppercase;letter-spacing:.06em}.usage-h3-row{display:flex;align-items:baseline;justify-content:space-between}.usage-muted{color:var(--ink-2);font-size:12px}.usage-note{color:var(--ink-2);font-size:12.5px;margin:14px 0 0;max-width:72ch}.usage-loading{color:var(--ink-2);padding:24px 0}.btn-link{background:none;border:0;color:var(--accent);cursor:pointer;font-size:12px;padding:0}.provider-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:6px;vertical-align:middle;background:var(--ink-2)}.provider-claude{background:#d97706}.provider-codex{background:#111}.provider-opencode{background:#7c3aed}.provider-rudder{background:var(--accent)}.quota-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:14px}.quota-card{border:1px solid var(--line);border-radius:var(--radius);background:var(--card);box-shadow:var(--shadow-sm);padding:14px 16px;min-height:120px}.quota-card-skeleton{background:linear-gradient(90deg,var(--paper-2),#f3f3f3,var(--paper-2));background-size:200% 100%;animation:shimmer 1.2s infinite;border-color:transparent}@keyframes shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.quota-card-error{border-style:dashed}.quota-head{display:flex;align-items:center;gap:8px}.quota-provider{font-weight:500}.quota-plan{margin-left:auto;font-size:11px;color:var(--accent-deep);border:1px solid color-mix(in srgb,var(--accent) 35%,transparent);border-radius:999px;padding:1px 8px}.quota-email{color:var(--ink-2);font-size:12px;margin-top:2px}.quota-error{color:var(--st-failed);font-size:12.5px;margin-top:14px}.meters{display:grid;gap:12px;margin-top:14px}.meter-row{display:flex;justify-content:space-between;font-size:13px}.meter-track{height:8px;border-radius:999px;background:var(--paper-2);border:1px solid var(--line);overflow:hidden;margin-top:4px}.meter-fill{height:100%;background:var(--accent);border-radius:999px;transition:width var(--t-slow)}.meter-warm{background:var(--st-running)}.meter-hot{background:var(--st-failed)}.meter-reset{color:var(--ink-2);font-size:11px;margin-top:3px}.stat-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:8px 0 16px}.stat{border:1px solid var(--line);border-radius:var(--radius);padding:12px 14px;background:var(--card)}.stat-label{font-size:11.5px;color:var(--ink-2);text-transform:uppercase;letter-spacing:.06em}.stat-value{font-size:24px;font-weight:500;letter-spacing:-.02em;margin-top:2px;font-variant-numeric:tabular-nums}.stat-sub{font-size:12px;color:var(--ink-2);margin-top:2px}.provider-chips{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px}.chip{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--line-strong);background:var(--card);border-radius:999px;padding:4px 10px;font:inherit;font-size:13px;cursor:pointer;color:var(--ink)}.chip-off{opacity:.45;text-decoration:line-through}.chip-value{color:var(--ink-2);font-size:12px;margin-left:4px}.chart-wrap{border:1px solid var(--line);border-radius:var(--radius);padding:8px;background:var(--card);overflow-x:auto}.daily-chart{width:100%;height:auto;display:block}.chart-grid{stroke:var(--line);stroke-width:1}.chart-tick{fill:var(--ink-2);font-family:var(--mono);font-size:10px}.chart-hit{fill:transparent}.chart-bar{cursor:pointer}.chart-bar:hover .chart-hit,.chart-bar-selected .chart-hit{fill:#0b747c14}.bar-claude{fill:#d97706}.bar-codex{fill:#111}.day-detail{border:1px solid var(--line);border-radius:var(--radius);padding:10px 14px;margin-top:10px;background:var(--paper-2)}.day-detail-head{display:flex;justify-content:space-between;align-items:center}.day-detail-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px;margin-top:8px;font-size:13px}.usage-columns{display:grid;grid-template-columns:1.1fr 1fr;gap:24px}@media (max-width: 820px){.usage-columns{grid-template-columns:1fr}}.usage-table{width:100%;border-collapse:collapse;font-size:13px}.usage-table th{text-align:left;font-weight:500;color:var(--ink-2);font-size:11.5px;text-transform:uppercase;letter-spacing:.05em;padding:6px 8px;border-bottom:1px solid var(--line-strong)}.usage-table td{padding:7px 8px;border-bottom:1px solid var(--line);vertical-align:middle}.usage-table .num{text-align:right;font-variant-numeric:tabular-nums}.usage-table .cmd{max-width:420px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink-2);font-size:12px}.usage-row{cursor:pointer}.usage-row:hover td,.usage-row-open td,.usage-drill td{background:var(--paper-2)}.totals-breakdown{display:flex;flex-wrap:wrap;gap:6px 18px;font-size:12px;color:var(--ink-2)}.project-bars{display:grid;gap:8px}.project-bar-btn{display:block;width:100%;text-align:left;background:none;border:0;padding:6px 4px;font:inherit;color:inherit;cursor:pointer;border-radius:6px}.project-bar-btn:hover{background:var(--paper-2)}.project-bar-row{display:flex;justify-content:space-between;font-size:13px}.project-name a{color:var(--accent-deep);text-decoration:none}.project-name a:hover{text-decoration:underline}.project-value{color:var(--ink-2)}.project-track{height:6px;background:var(--paper-2);border:1px solid var(--line);border-radius:999px;overflow:hidden;margin-top:4px}.project-fill{height:100%;background:var(--accent)}.project-path{font-size:11px;color:var(--ink-2);margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.project-sessions{padding:4px 4px 8px 12px;display:grid;gap:2px}.session-row{display:grid;grid-template-columns:14px 90px 1fr auto auto;gap:8px;align-items:center;width:100%;background:none;border:0;padding:4px 6px;font:inherit;font-size:12px;color:inherit;cursor:pointer;border-radius:4px;text-align:left}.session-row:hover{background:var(--paper-2)}.session-when{color:var(--ink-2)}.ram-bar{display:flex;height:14px;border-radius:999px;overflow:hidden;border:1px solid var(--line);background:var(--paper-2)}.ram-seg{height:100%;transition:width var(--t-slow)}.ram-rudder{background:var(--accent)}.ram-agents{background:#d97706}.ram-other{background:#c9c9c9}.ram-legend{display:flex;gap:18px;font-size:12px;color:var(--ink-2);margin-top:6px}.ram-swatch{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:4px;vertical-align:middle}
@@ -1,2 +1,2 @@
1
- var Q,k,Te,mt,P,we,Ce,Re,oe,K,j,Me,ce,ae,ie,gt,J={},z=[],yt=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,Z=Array.isArray;function $(e,t){for(var n in t)e[n]=t[n];return e}function de(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function vt(e,t,n){var o,s,i,l={};for(i in t)i=="key"?o=t[i]:i=="ref"?s=t[i]:l[i]=t[i];if(arguments.length>2&&(l.children=arguments.length>3?Q.call(arguments,2):n),typeof e=="function"&&e.defaultProps!=null)for(i in e.defaultProps)l[i]===void 0&&(l[i]=e.defaultProps[i]);return Y(e,l,o,s,null)}function Y(e,t,n,o,s){var i={type:e,props:t,key:n,ref:o,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:s??++Te,__i:-1,__u:0};return s==null&&k.vnode!=null&&k.vnode(i),i}function q(e){return e.children}function G(e,t){this.props=e,this.context=t}function B(e,t){if(t==null)return e.__?B(e.__,e.__i+1):null;for(var n;t<e.__k.length;t++)if((n=e.__k[t])!=null&&n.__e!=null)return n.__e;return typeof e.type=="function"?B(e):null}function ht(e){if(e.__P&&e.__d){var t=e.__v,n=t.__e,o=[],s=[],i=$({},t);i.__v=t.__v+1,k.vnode&&k.vnode(i),ue(e.__P,i,t,e.__n,e.__P.namespaceURI,32&t.__u?[n]:null,o,n??B(t),!!(32&t.__u),s),i.__v=t.__v,i.__.__k[i.__i]=i,Le(o,i,s),t.__e=t.__=null,i.__e!=n&&De(i)}}function De(e){if((e=e.__)!=null&&e.__c!=null)return e.__e=e.__c.base=null,e.__k.some(function(t){if(t!=null&&t.__e!=null)return e.__e=e.__c.base=t.__e}),De(e)}function Ee(e){(!e.__d&&(e.__d=!0)&&P.push(e)&&!X.__r++||we!=k.debounceRendering)&&((we=k.debounceRendering)||Ce)(X)}function X(){try{for(var e,t=1;P.length;)P.length>t&&P.sort(Re),e=P.shift(),t=P.length,ht(e)}finally{P.length=X.__r=0}}function Ae(e,t,n,o,s,i,l,u,d,c,p){var a,_,f,v,h,y,m,g=o&&o.__k||z,w=t.length;for(d=bt(n,t,g,d,w),a=0;a<w;a++)(f=n.__k[a])!=null&&(_=f.__i!=-1&&g[f.__i]||J,f.__i=a,y=ue(e,f,_,s,i,l,u,d,c,p),v=f.__e,f.ref&&_.ref!=f.ref&&(_.ref&&pe(_.ref,null,f),p.push(f.ref,f.__c||v,f)),h==null&&v!=null&&(h=v),(m=!!(4&f.__u))||_.__k===f.__k?(d=Ne(f,d,e,m),m&&_.__e&&(_.__e=null)):typeof f.type=="function"&&y!==void 0?d=y:v&&(d=v.nextSibling),f.__u&=-7);return n.__e=h,d}function bt(e,t,n,o,s){var i,l,u,d,c,p=n.length,a=p,_=0;for(e.__k=new Array(s),i=0;i<s;i++)(l=t[i])!=null&&typeof l!="boolean"&&typeof l!="function"?(typeof l=="string"||typeof l=="number"||typeof l=="bigint"||l.constructor==String?l=e.__k[i]=Y(null,l,null,null,null):Z(l)?l=e.__k[i]=Y(q,{children:l},null,null,null):l.constructor===void 0&&l.__b>0?l=e.__k[i]=Y(l.type,l.props,l.key,l.ref?l.ref:null,l.__v):e.__k[i]=l,d=i+_,l.__=e,l.__b=e.__b+1,u=null,(c=l.__i=kt(l,n,d,a))!=-1&&(a--,(u=n[c])&&(u.__u|=2)),u==null||u.__v==null?(c==-1&&(s>p?_--:s<p&&_++),typeof l.type!="function"&&(l.__u|=4)):c!=d&&(c==d-1?_--:c==d+1?_++:(c>d?_--:_++,l.__u|=4))):e.__k[i]=null;if(a)for(i=0;i<p;i++)(u=n[i])!=null&&!(2&u.__u)&&(u.__e==o&&(o=B(u)),Pe(u,u));return o}function Ne(e,t,n,o){var s,i;if(typeof e.type=="function"){for(s=e.__k,i=0;s&&i<s.length;i++)s[i]&&(s[i].__=e,t=Ne(s[i],t,n,o));return t}e.__e!=t&&(o&&(t&&e.type&&!t.parentNode&&(t=B(e)),n.insertBefore(e.__e,t||null)),t=e.__e);do t=t&&t.nextSibling;while(t!=null&&t.nodeType==8);return t}function kt(e,t,n,o){var s,i,l,u=e.key,d=e.type,c=t[n],p=c!=null&&(2&c.__u)==0;if(c===null&&u==null||p&&u==c.key&&d==c.type)return n;if(o>(p?1:0)){for(s=n-1,i=n+1;s>=0||i<t.length;)if((c=t[l=s>=0?s--:i++])!=null&&!(2&c.__u)&&u==c.key&&d==c.type)return l}return-1}function xe(e,t,n){t[0]=="-"?e.setProperty(t,n??""):e[t]=n==null?"":typeof n!="number"||yt.test(t)?n:n+"px"}function W(e,t,n,o,s){var i,l;e:if(t=="style")if(typeof n=="string")e.style.cssText=n;else{if(typeof o=="string"&&(e.style.cssText=o=""),o)for(t in o)n&&t in n||xe(e.style,t,"");if(n)for(t in n)o&&n[t]==o[t]||xe(e.style,t,n[t])}else if(t[0]=="o"&&t[1]=="n")i=t!=(t=t.replace(Me,"$1")),l=t.toLowerCase(),t=l in e||t=="onFocusOut"||t=="onFocusIn"?l.slice(2):t.slice(2),e.l||(e.l={}),e.l[t+i]=n,n?o?n[j]=o[j]:(n[j]=ce,e.addEventListener(t,i?ie:ae,i)):e.removeEventListener(t,i?ie:ae,i);else{if(s=="http://www.w3.org/2000/svg")t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(t!="width"&&t!="height"&&t!="href"&&t!="list"&&t!="form"&&t!="tabIndex"&&t!="download"&&t!="rowSpan"&&t!="colSpan"&&t!="role"&&t!="popover"&&t in e)try{e[t]=n??"";break e}catch{}typeof n=="function"||(n==null||n===!1&&t[4]!="-"?e.removeAttribute(t):e.setAttribute(t,t=="popover"&&n==1?"":n))}}function Se(e){return function(t){if(this.l){var n=this.l[t.type+e];if(t[K]==null)t[K]=ce++;else if(t[K]<n[j])return;return n(k.event?k.event(t):t)}}}function ue(e,t,n,o,s,i,l,u,d,c){var p,a,_,f,v,h,y,m,g,w,x,M,V,U,b,R=t.type;if(t.constructor!==void 0)return null;128&n.__u&&(d=!!(32&n.__u),i=[u=t.__e=n.__e]),(p=k.__b)&&p(t);e:if(typeof R=="function")try{if(m=t.props,g=R.prototype&&R.prototype.render,w=(p=R.contextType)&&o[p.__c],x=p?w?w.props.value:p.__:o,n.__c?y=(a=t.__c=n.__c).__=a.__E:(g?t.__c=a=new R(m,x):(t.__c=a=new G(m,x),a.constructor=R,a.render=Et),w&&w.sub(a),a.state||(a.state={}),a.__n=o,_=a.__d=!0,a.__h=[],a._sb=[]),g&&a.__s==null&&(a.__s=a.state),g&&R.getDerivedStateFromProps!=null&&(a.__s==a.state&&(a.__s=$({},a.__s)),$(a.__s,R.getDerivedStateFromProps(m,a.__s))),f=a.props,v=a.state,a.__v=t,_)g&&R.getDerivedStateFromProps==null&&a.componentWillMount!=null&&a.componentWillMount(),g&&a.componentDidMount!=null&&a.__h.push(a.componentDidMount);else{if(g&&R.getDerivedStateFromProps==null&&m!==f&&a.componentWillReceiveProps!=null&&a.componentWillReceiveProps(m,x),t.__v==n.__v||!a.__e&&a.shouldComponentUpdate!=null&&a.shouldComponentUpdate(m,a.__s,x)===!1){t.__v!=n.__v&&(a.props=m,a.state=a.__s,a.__d=!1),t.__e=n.__e,t.__k=n.__k,t.__k.some(function(D){D&&(D.__=t)}),z.push.apply(a.__h,a._sb),a._sb=[],a.__h.length&&l.push(a);break e}a.componentWillUpdate!=null&&a.componentWillUpdate(m,a.__s,x),g&&a.componentDidUpdate!=null&&a.__h.push(function(){a.componentDidUpdate(f,v,h)})}if(a.context=x,a.props=m,a.__P=e,a.__e=!1,M=k.__r,V=0,g)a.state=a.__s,a.__d=!1,M&&M(t),p=a.render(a.props,a.state,a.context),z.push.apply(a.__h,a._sb),a._sb=[];else do a.__d=!1,M&&M(t),p=a.render(a.props,a.state,a.context),a.state=a.__s;while(a.__d&&++V<25);a.state=a.__s,a.getChildContext!=null&&(o=$($({},o),a.getChildContext())),g&&!_&&a.getSnapshotBeforeUpdate!=null&&(h=a.getSnapshotBeforeUpdate(f,v)),U=p!=null&&p.type===q&&p.key==null?$e(p.props.children):p,u=Ae(e,Z(U)?U:[U],t,n,o,s,i,l,u,d,c),a.base=t.__e,t.__u&=-161,a.__h.length&&l.push(a),y&&(a.__E=a.__=null)}catch(D){if(t.__v=null,d||i!=null)if(D.then){for(t.__u|=d?160:128;u&&u.nodeType==8&&u.nextSibling;)u=u.nextSibling;i[i.indexOf(u)]=null,t.__e=u}else{for(b=i.length;b--;)de(i[b]);le(t)}else t.__e=n.__e,t.__k=n.__k,D.then||le(t);k.__e(D,t,n)}else i==null&&t.__v==n.__v?(t.__k=n.__k,t.__e=n.__e):u=t.__e=wt(n.__e,t,n,o,s,i,l,d,c);return(p=k.diffed)&&p(t),128&t.__u?void 0:u}function le(e){e&&(e.__c&&(e.__c.__e=!0),e.__k&&e.__k.some(le))}function Le(e,t,n){for(var o=0;o<n.length;o++)pe(n[o],n[++o],n[++o]);k.__c&&k.__c(t,e),e.some(function(s){try{e=s.__h,s.__h=[],e.some(function(i){i.call(s)})}catch(i){k.__e(i,s.__v)}})}function $e(e){return typeof e!="object"||e==null||e.__b>0?e:Z(e)?e.map($e):e.constructor!==void 0?null:$({},e)}function wt(e,t,n,o,s,i,l,u,d){var c,p,a,_,f,v,h,y=n.props||J,m=t.props,g=t.type;if(g=="svg"?s="http://www.w3.org/2000/svg":g=="math"?s="http://www.w3.org/1998/Math/MathML":s||(s="http://www.w3.org/1999/xhtml"),i!=null){for(c=0;c<i.length;c++)if((f=i[c])&&"setAttribute"in f==!!g&&(g?f.localName==g:f.nodeType==3)){e=f,i[c]=null;break}}if(e==null){if(g==null)return document.createTextNode(m);e=document.createElementNS(s,g,m.is&&m),u&&(k.__m&&k.__m(t,i),u=!1),i=null}if(g==null)y===m||u&&e.data==m||(e.data=m);else{if(i=g=="textarea"&&m.defaultValue!=null?null:i&&Q.call(e.childNodes),!u&&i!=null)for(y={},c=0;c<e.attributes.length;c++)y[(f=e.attributes[c]).name]=f.value;for(c in y)f=y[c],c=="dangerouslySetInnerHTML"?a=f:c=="children"||c in m||c=="value"&&"defaultValue"in m||c=="checked"&&"defaultChecked"in m||W(e,c,null,f,s);for(c in m)f=m[c],c=="children"?_=f:c=="dangerouslySetInnerHTML"?p=f:c=="value"?v=f:c=="checked"?h=f:u&&typeof f!="function"||y[c]===f||W(e,c,f,y[c],s);if(p)u||a&&(p.__html==a.__html||p.__html==e.innerHTML)||(e.innerHTML=p.__html),t.__k=[];else if(a&&(e.innerHTML=""),Ae(t.type=="template"?e.content:e,Z(_)?_:[_],t,n,o,g=="foreignObject"?"http://www.w3.org/1999/xhtml":s,i,l,i?i[0]:n.__k&&B(n,0),u,d),i!=null)for(c=i.length;c--;)de(i[c]);u&&g!="textarea"||(c="value",g=="progress"&&v==null?e.removeAttribute("value"):v!=null&&(v!==e[c]||g=="progress"&&!v||g=="option"&&v!=y[c])&&W(e,c,v,y[c],s),c="checked",h!=null&&h!=e[c]&&W(e,c,h,y[c],s))}return e}function pe(e,t,n){try{if(typeof e=="function"){var o=typeof e.__u=="function";o&&e.__u(),o&&t==null||(e.__u=e(t))}else e.current=t}catch(s){k.__e(s,n)}}function Pe(e,t,n){var o,s;if(k.unmount&&k.unmount(e),(o=e.ref)&&(o.current&&o.current!=e.__e||pe(o,null,t)),(o=e.__c)!=null){if(o.componentWillUnmount)try{o.componentWillUnmount()}catch(i){k.__e(i,t)}o.base=o.__P=null}if(o=e.__k)for(s=0;s<o.length;s++)o[s]&&Pe(o[s],t,n||typeof e.type!="function");n||de(e.__e),e.__c=e.__=e.__e=void 0}function Et(e,t,n){return this.constructor(e,n)}function Ie(e,t,n){var o,s,i,l;t==document&&(t=document.documentElement),k.__&&k.__(e,t),s=(o=typeof n=="function")?null:n&&n.__k||t.__k,i=[],l=[],ue(t,e=(!o&&n||t).__k=vt(q,null,[e]),s||J,J,t.namespaceURI,!o&&n?[n]:s?null:t.firstChild?Q.call(t.childNodes):null,i,!o&&n?n:s?s.__e:t.firstChild,o,l),Le(i,e,l)}Q=z.slice,k={__e:function(e,t,n,o){for(var s,i,l;t=t.__;)if((s=t.__c)&&!s.__)try{if((i=s.constructor)&&i.getDerivedStateFromError!=null&&(s.setState(i.getDerivedStateFromError(e)),l=s.__d),s.componentDidCatch!=null&&(s.componentDidCatch(e,o||{}),l=s.__d),l)return s.__E=s}catch(u){e=u}throw e}},Te=0,mt=function(e){return e!=null&&e.constructor===void 0},G.prototype.setState=function(e,t){var n;n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=$({},this.state),typeof e=="function"&&(e=e($({},n),this.props)),e&&$(n,e),e!=null&&this.__v&&(t&&this._sb.push(t),Ee(this))},G.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),Ee(this))},G.prototype.render=q,P=[],Ce=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Re=function(e,t){return e.__v.__b-t.__v.__b},X.__r=0,oe=Math.random().toString(8),K="__d"+oe,j="__a"+oe,Me=/(PointerCapture)$|Capture$/i,ce=0,ae=Se(!1),ie=Se(!0),gt=0;var F,S,_e,Ue,te=0,We=[],T=k,Oe=T.__b,Be=T.__r,qe=T.diffed,He=T.__c,je=T.unmount,Fe=T.__;function me(e,t){T.__h&&T.__h(S,e,te||t),te=0;var n=S.__H||(S.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function C(e){return te=1,ge(Ye,e)}function ge(e,t,n){var o=me(F++,2);if(o.t=e,!o.__c&&(o.__=[n?n(t):Ye(void 0,t),function(u){var d=o.__N?o.__N[0]:o.__[0],c=o.t(d,u);d!==c&&(o.__N=[c,o.__[1]],o.__c.setState({}))}],o.__c=S,!S.__f)){var s=function(u,d,c){if(!o.__c.__H)return!0;var p=o.__c.__H.__.filter(function(_){return _.__c});if(p.every(function(_){return!_.__N}))return!i||i.call(this,u,d,c);var a=o.__c.props!==u;return p.some(function(_){if(_.__N){var f=_.__[0];_.__=_.__N,_.__N=void 0,f!==_.__[0]&&(a=!0)}}),i&&i.call(this,u,d,c)||a};S.__f=!0;var i=S.shouldComponentUpdate,l=S.componentWillUpdate;S.componentWillUpdate=function(u,d,c){if(this.__e){var p=i;i=void 0,s(u,d,c),i=p}l&&l.call(this,u,d,c)},S.shouldComponentUpdate=s}return o.__N||o.__}function N(e,t){var n=me(F++,3);!T.__s&&Ke(n.__H,t)&&(n.__=e,n.u=t,S.__H.__h.push(n))}function A(e){return te=5,I(function(){return{current:e}},[])}function I(e,t){var n=me(F++,7);return Ke(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function xt(){for(var e;e=We.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(ee),t.__h.some(fe),t.__h=[]}catch(n){t.__h=[],T.__e(n,e.__v)}}}T.__b=function(e){S=null,Oe&&Oe(e)},T.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),Fe&&Fe(e,t)},T.__r=function(e){Be&&Be(e),F=0;var t=(S=e.__c).__H;t&&(_e===S?(t.__h=[],S.__h=[],t.__.some(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(t.__h.some(ee),t.__h.some(fe),t.__h=[],F=0)),_e=S},T.diffed=function(e){qe&&qe(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(We.push(t)!==1&&Ue===T.requestAnimationFrame||((Ue=T.requestAnimationFrame)||St)(xt)),t.__H.__.some(function(n){n.u&&(n.__H=n.u),n.u=void 0})),_e=S=null},T.__c=function(e,t){t.some(function(n){try{n.__h.some(ee),n.__h=n.__h.filter(function(o){return!o.__||fe(o)})}catch(o){t.some(function(s){s.__h&&(s.__h=[])}),t=[],T.__e(o,n.__v)}}),He&&He(e,t)},T.unmount=function(e){je&&je(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.some(function(o){try{ee(o)}catch(s){t=s}}),n.__H=void 0,t&&T.__e(t,n.__v))};var Ve=typeof requestAnimationFrame=="function";function St(e){var t,n=function(){clearTimeout(o),Ve&&cancelAnimationFrame(t),setTimeout(e)},o=setTimeout(n,35);Ve&&(t=requestAnimationFrame(n))}function ee(e){var t=S,n=e.__c;typeof n=="function"&&(e.__c=void 0,n()),S=t}function fe(e){var t=S;e.__c=e.__(),S=t}function Ke(e,t){return!e||e.length!==t.length||t.some(function(n,o){return n!==e[o]})}function Ye(e,t){return typeof t=="function"?t(e):t}async function H(e){if(!e.ok){let t=await e.text().catch(()=>"");throw new Error(`${e.status} ${e.statusText}${t?`: ${t}`:""}`)}return e.json()}function ne(e){return{"x-rudder-token":typeof window<"u"&&window.__RUDDER_TOKEN__||"",...e??{}}}async function Ge(){return H(await fetch("/api/projects"))}async function Je(e){return H(await fetch(`/api/projects/${encodeURIComponent(e)}/state`))}async function ze(e,t,n=200){let o=await fetch(`/api/projects/${encodeURIComponent(e)}/tasks/${encodeURIComponent(t)}/log?tail=${n}`);if(!o.ok)throw new Error(`${o.status} ${o.statusText}`);return o.text()}async function Xe(e,t){let n=tt();return H(await nt(`/api/projects/${encodeURIComponent(e)}/tasks`,{method:"POST",headers:ne({"content-type":"application/json"}),body:JSON.stringify({prompt:t,requestId:n})}))}async function Qe(e,t){return H(await fetch(`/api/projects/${encodeURIComponent(e)}/tasks/${encodeURIComponent(t)}/merge`,{method:"POST",headers:ne()}))}async function Ze(e,t){let n=await fetch(`/api/projects/${encodeURIComponent(e)}/tasks/${encodeURIComponent(t)}/cancel`,{method:"POST",headers:ne()});if(!n.ok)throw new Error(`${n.status} ${n.statusText}`)}async function et(e,t,n){let o=tt(),s=t==="conductor"?`/api/projects/${encodeURIComponent(e)}/steer`:`/api/projects/${encodeURIComponent(e)}/tasks/${encodeURIComponent(t)}/steer`;return H(await nt(s,{method:"POST",headers:ne({"content-type":"application/json"}),body:JSON.stringify({instruction:n,requestId:o})}))}function tt(){return globalThis.crypto?.randomUUID?.()??`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}-${Math.random().toString(36).slice(2)}`}async function nt(e,t){try{return await fetch(e,t)}catch{return await new Promise(n=>setTimeout(n,150)),fetch(e,t)}}async function ye(e,t){return H(await fetch(`/api/projects/${encodeURIComponent(e)}/steer-receipts/${encodeURIComponent(t)}`))}function rt(e){return`/api/projects/${encodeURIComponent(e)}/events`}function Tt(){return{nodes:new Map,edges:[],gates:[],memory:[],activity:[],loaded:!1}}function Ct(e,t){switch(t.type){case"SNAPSHOT":{let n=new Map;for(let o of t.snapshot.nodes)n.set(o.id,o);return{nodes:n,edges:t.snapshot.edges??[],gates:t.snapshot.gates??[],memory:t.snapshot.memory??[],activity:t.snapshot.activity??[],loaded:!0}}case"NODE_UPSERT":{let n=new Map(e.nodes);return n.set(t.node.id,t.node),{...e,nodes:n}}case"NODE_REMOVE":{if(!e.nodes.has(t.id))return e;let n=new Map(e.nodes);return n.delete(t.id),{...e,nodes:n}}case"EDGE_UPSERT":{let n=e.edges.filter(o=>!(o.from===t.edge.from&&o.to===t.edge.to&&o.kind===t.edge.kind));return n.push(t.edge),{...e,edges:n}}case"EDGE_REMOVE":return{...e,edges:e.edges.filter(n=>!(n.from===t.from&&n.to===t.to))};case"MEMORY":return{...e,memory:t.memory};case"ACTIVITY":return{...e,activity:t.activity};default:return e}}function st(e){let[t,n]=ge(Ct,void 0,Tt),[o,s]=C("connecting"),[i,l]=C(""),u=A(!1);return N(()=>{let d=!1;u.current=!1;async function c(){try{let a=await Je(e);if(d)return;l(a.name||e),n({type:"SNAPSHOT",snapshot:a})}catch{}}c();let p=new EventSource(rt(e));return p.addEventListener("open",()=>{d||(u.current&&c(),u.current=!0,s("live"))}),p.addEventListener("snapshot",a=>{if(!d)try{let _=JSON.parse(a.data);l(_.name||e),n({type:"SNAPSHOT",snapshot:_})}catch{}}),p.addEventListener("node.added",a=>{if(!d)try{n({type:"NODE_UPSERT",node:JSON.parse(a.data)})}catch{}}),p.addEventListener("node.updated",a=>{if(!d)try{n({type:"NODE_UPSERT",node:JSON.parse(a.data)})}catch{}}),p.addEventListener("node.removed",a=>{if(!d)try{let _=JSON.parse(a.data),f=typeof _=="string"?_:_.id;f&&n({type:"NODE_REMOVE",id:f})}catch{}}),p.addEventListener("edge.added",a=>{if(!d)try{n({type:"EDGE_UPSERT",edge:JSON.parse(a.data)})}catch{}}),p.addEventListener("edge.removed",a=>{if(!d)try{let _=JSON.parse(a.data);_?.from&&_?.to&&n({type:"EDGE_REMOVE",from:_.from,to:_.to})}catch{}}),p.addEventListener("memory.updated",a=>{if(!d)try{let _=JSON.parse(a.data),f=Array.isArray(_)?_:_.memory??[];n({type:"MEMORY",memory:f})}catch{}}),p.addEventListener("activity.updated",a=>{if(!d)try{let _=JSON.parse(a.data),f=Array.isArray(_)?_:_.activity??[];n({type:"ACTIVITY",activity:f})}catch{}}),p.addEventListener("error",()=>{d||s(u.current?"reconnecting":"connecting")}),()=>{d=!0,p.close()}},[e]),{state:t,conn:o,name:i}}var Rt=0,nn=Array.isArray;function r(e,t,n,o,s,i){t||(t={});var l,u,d=t;if("ref"in d)for(u in d={},t)u=="ref"?l=t[u]:d[u]=t[u];var c={type:e,props:d,key:n,ref:l,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--Rt,__i:-1,__u:0,__source:s,__self:i};if(typeof e=="function"&&(l=e.defaultProps))for(u in l)d[u]===void 0&&(d[u]=l[u]);return k.vnode&&k.vnode(c),c}var at=[{key:"todo",label:"Todo"},{key:"running",label:"Running"},{key:"review",label:"Review"},{key:"done",label:"Done"}];function it(e){let t=e.delivery;return!!(t?.required&&(t.status==="deployed"||t.status==="verified")&&t.kind?.trim()&&t.target?.trim()&&t.verifiedAt?.trim()&&t.checks?.length)}function he(e){if(e.merge&&e.merge.status==="merge-conflict")return"conflict";if(e.blocked)return"blocked";if(e.delivery?.required&&e.status==="completed")return e.delivery.status==="blocked"||e.delivery.status==="failed"?"failed":it(e)?"done":"review";switch(e.status){case"running":case"steering":case"verifying":case"created":return"running";case"completed":return"review";case"merged":return"done";case"failed":return"failed";case"cancelled":return"failed";case"paused":return"done";case"merge-conflict":return"conflict";default:return e.column}}function re(e){return e.merge&&e.merge.status==="merge-conflict"?"conflict":e.blocked?"blocked":e.delivery?.required&&e.status==="completed"?e.delivery.status==="blocked"||e.delivery.status==="failed"?"delivery blocked":it(e)?"deployed":"delivery proof needed":e.status||e.column}function lt(e){return["running","steering","verifying","created"].includes(e.status)}function se(e){return e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e)}function ct(){let[e,t]=C(null),[n,o]=C(null);return N(()=>{let s=!1;return Ge().then(i=>{s||t(i.projects??[])}).catch(i=>{s||o(String(i?.message??i))}),()=>{s=!0}},[]),r("div",{class:"page",children:[r("header",{class:"topbar",children:r("div",{class:"brand",children:[r("span",{class:"brand-mark",children:"\u25B0"}),r("span",{class:"brand-name",children:"Rudder"}),r("span",{class:"brand-sub mono",children:"board"})]})}),r("main",{class:"index-main",children:[r("h1",{class:"index-title",children:"Projects"}),r("p",{class:"index-lede",children:"Local agent runs, projected live. Pick a repo."}),n&&r("div",{class:"banner banner-error mono",children:["failed to load projects: ",n]}),e===null&&!n&&r("div",{class:"tile-grid",children:[r(ve,{}),r(ve,{}),r(ve,{})]}),e!==null&&e.length===0&&r("div",{class:"empty",children:[r("div",{class:"empty-title",children:"no projects yet"}),r("div",{class:"empty-sub mono",children:"start a run in any repo and it registers here"})]}),e!==null&&e.length>0&&r("div",{class:"tile-grid",children:e.map(s=>r(Mt,{project:s},s.slug))})]})]})}function Mt({project:e}){let t=e.counts,n=()=>{window.location.href=`/rudder/${encodeURIComponent(e.slug)}`},o=[{token:"running",label:"running",n:t.running},{token:"review",label:"review",n:t.review},{token:"todo",label:"todo",n:t.todo},{token:"done",label:"done",n:t.done},{token:"blocked",label:"blocked",n:t.blocked},{token:"failed",label:"failed",n:t.failed}];return r("button",{class:"tile",onClick:n,type:"button",children:[r("div",{class:"tile-head",children:r("span",{class:"tile-name",children:e.name})}),r("div",{class:"tile-path mono",children:e.repoRoot}),r("div",{class:"tile-counts",children:o.map(s=>r("span",{class:`count count-${s.token}`,"data-zero":s.n===0,children:[r("span",{class:"count-n mono",children:s.n}),r("span",{class:"count-label",children:s.label})]},s.label))})]})}function ve(){return r("div",{class:"tile tile-skeleton","aria-hidden":"true",children:[r("div",{class:"skel skel-line",style:"width: 52%"}),r("div",{class:"skel skel-line",style:"width: 78%"}),r("div",{class:"skel skel-row"})]})}var dt="rudder.board.view";function Dt(){try{let e=localStorage.getItem(dt);if(e==="board"||e==="nest"||e==="activity"||e==="memory")return e}catch{}return"board"}function ut({slug:e}){let{state:t,conn:n,name:o}=st(e),[s,i]=C(Dt),[l,u]=C(null),d=A(null),c=window.__RUDDER_CONTROL_MODE__??"projector",p=window.__RUDDER_CAN_MUTATE__!==!1,a=h=>{i(h);try{localStorage.setItem(dt,h)}catch{}},_=I(()=>Array.from(t.nodes.values()),[t.nodes]),f=l?t.nodes.get(l)??null:null,v=(h,y)=>{d.current=y,u(h)};return r("div",{class:"page board-page",children:[r(At,{slug:e,name:o||e,conn:n,view:s,onView:a,memoryCount:t.memory.length,latestActivity:t.activity.length?t.activity[t.activity.length-1]:null,canMutate:p}),r("main",{class:"board-main",children:!t.loaded&&n!=="reconnecting"?r(Kt,{}):s==="board"?r($t,{nodes:_,onOpen:v,selected:l}):s==="nest"?r(Bt,{nodes:_,edges:t.edges,onOpen:v,selected:l}):s==="activity"?r(Vt,{slug:e,activity:t.activity,canSteerConductor:p&&c==="projector"}):r(Wt,{memory:t.memory})}),f&&r(qt,{slug:e,node:f,onClose:()=>u(null),returnFocus:d.current,canMutate:p})]})}function At({slug:e,name:t,conn:n,view:o,onView:s,memoryCount:i,latestActivity:l,canMutate:u}){let[d,c]=C(!1);return r("header",{class:"topbar board-topbar",children:[r("div",{class:"brand",children:[r("a",{class:"brand-link",href:"/rudder",title:"Back to all projects",children:[r("span",{class:"brand-mark",children:"\u25B0"}),r("span",{class:"brand-back",children:"\u2190 all projects"})]}),r("span",{class:"brand-name",children:t}),r(Nt,{conn:n}),l&&o!=="activity"&&r("button",{type:"button",class:"activity-ticker mono",title:"Latest activity \u2014 click for the full feed",onClick:()=>s("activity"),children:[r("span",{class:"pulse-dot","aria-hidden":"true"}),r("span",{class:"activity-ticker-text",children:l.text})]})]}),r("div",{class:"toolbar-actions",children:[r("div",{class:"view-toggle",role:"group","aria-label":"View",children:[r("button",{type:"button","aria-pressed":o==="board",class:`toggle ${o==="board"?"toggle-on":""}`,onClick:()=>s("board"),children:"Board"}),r("button",{type:"button","aria-pressed":o==="nest",class:`toggle ${o==="nest"?"toggle-on":""}`,onClick:()=>s("nest"),title:"Nest / DAG view",children:"Nest"}),r("button",{type:"button","aria-pressed":o==="activity",class:`toggle ${o==="activity"?"toggle-on":""}`,onClick:()=>s("activity"),title:"Live activity feed",children:"Activity"}),r("button",{type:"button","aria-pressed":o==="memory",class:`toggle ${o==="memory"?"toggle-on":""}`,onClick:()=>s("memory"),children:["Memory",i>0&&r("span",{class:"toggle-badge mono",children:i})]})]}),u?r("button",{type:"button",class:"btn btn-accent",onClick:()=>c(!0),children:"+ Task"}):r("span",{class:"readonly-pill mono",title:"Open this project's own Rudder board to make changes",children:"read-only"})]}),d&&r(Lt,{slug:e,onClose:()=>c(!1)})]})}function Nt({conn:e}){if(e==="live")return r("span",{class:"conn conn-live",title:"Live",children:[r("span",{class:"conn-dot"}),r("span",{class:"conn-label mono",children:"live"})]});let t=e==="connecting"?"connecting":"reconnecting";return r("span",{class:"conn conn-warn",title:t,children:[r("span",{class:"conn-dot conn-dot-pulse"}),r("span",{class:"conn-label mono",children:t})]})}function Lt({slug:e,onClose:t}){let[n,o]=C(""),[s,i]=C(!1),[l,u]=C(null),[d,c]=C(null),p=A(null),a=A(null),_=A(!1),f=A(t);f.current=t,_.current=s,N(()=>{let y=document.activeElement;p.current?.focus();let m=g=>{if(g.key==="Escape"){g.preventDefault(),_.current||f.current();return}if(g.key!=="Tab"||!a.current)return;let w=Array.from(a.current.querySelectorAll('button:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')),x=w[0],M=w[w.length-1];x&&M&&g.shiftKey&&document.activeElement===x?(g.preventDefault(),M.focus()):x&&M&&!g.shiftKey&&document.activeElement===M&&(g.preventDefault(),x.focus())};return window.addEventListener("keydown",m),()=>{window.removeEventListener("keydown",m),y?.focus()}},[]),N(()=>{if(d?.state!=="queued"||!d.requestId)return;let y=!1,m,g=async()=>{try{let w=await ye(e,d.requestId);if(y)return;if(w.status==="delivered"){c({requestId:w.requestId,state:"delivered",message:"Delivered to the native conductor"});return}if(w.status==="failed"){c(null),u(w.error||"The native conductor could not accept the task");return}}catch{}y||(m=window.setTimeout(g,500))};return m=window.setTimeout(g,250),()=>{y=!0,m!==void 0&&window.clearTimeout(m)}},[e,d?.state,d?.requestId]);let v=async()=>{let y=n.trim();if(!(!y||s)){i(!0),u(null),c(null);try{let m=await Xe(e,y);if(m.status==="queued"){o(""),c({requestId:m.requestId,state:"queued",message:"Queued for the native conductor"}),i(!1);return}if(m.status==="failed")throw new Error("The task could not be delivered to the conductor");t()}catch(m){u(String(m?.message??m)),i(!1)}}};return r("div",{class:"overlay",onClick:()=>{s||t()},children:r("form",{ref:a,class:"composer",onClick:y=>y.stopPropagation(),onSubmit:y=>{y.preventDefault(),v()},role:"dialog","aria-modal":"true","aria-labelledby":"new-task-title","aria-busy":s,children:[r("div",{class:"composer-head",children:[r("span",{class:"composer-title",id:"new-task-title",children:"New task"}),r("span",{class:"composer-hint mono",id:"new-task-hint",children:"\u2318/Ctrl + Enter to run \xB7 Esc to close"})]}),r("label",{class:"sr-only",for:"new-task-prompt",children:"Task description"}),r("textarea",{ref:p,id:"new-task-prompt",class:"composer-input mono",rows:5,placeholder:"Describe the task. The agent decomposes and schedules it.",value:n,"aria-describedby":"new-task-hint",onInput:y=>o(y.target.value),onKeyDown:y=>{(y.metaKey||y.ctrlKey)&&y.key==="Enter"&&(y.preventDefault(),v())},readOnly:s}),l&&r("div",{class:"banner banner-error mono",role:"alert",children:l}),d&&r("div",{class:"banner mono",role:"status",children:d.message}),r("div",{class:"composer-actions",children:[r("button",{type:"button",class:"btn",onClick:t,disabled:s,children:d?"Close":"Cancel"}),r("button",{type:"submit",class:"btn btn-accent",disabled:s||!n.trim(),children:s?"Running\u2026":"Run task"})]})]})})}function $t({nodes:e,onOpen:t,selected:n}){let o=I(()=>{let s={todo:[],running:[],review:[],done:[]};for(let i of e)(s[i.column]??s.todo).push(i);for(let i of Object.keys(s))s[i].sort((l,u)=>l.updatedAt<u.updatedAt?1:-1);return s},[e]);return r("div",{class:"board",children:at.map(s=>{let i=o[s.key];return r("section",{class:"column","data-column":s.key,children:[r("header",{class:"column-head",children:[r("span",{class:"column-title",children:s.label}),r("span",{class:"column-count mono",children:i.length})]}),r("div",{class:"column-body",children:i.length===0?r("div",{class:"column-empty mono",children:"empty"}):i.map(l=>r(Pt,{node:l,onOpen:t,selected:n===l.id},l.id))})]},s.key)})})}function Pt({node:e,onOpen:t,selected:n}){let o=he(e),s=lt(e),i=e.deps.hard.length+e.deps.soft.length;return r("article",{class:`card ${n?"card-selected":""}`,"data-status":o,"data-task-id":e.id,tabIndex:0,role:"button","aria-haspopup":"dialog","aria-expanded":n,onClick:l=>t(e.id,l.currentTarget),onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),t(e.id,l.currentTarget))},children:[r("div",{class:"card-spine","data-status":o}),r("div",{class:"card-body",children:[r("div",{class:"card-top",children:[r("span",{class:"card-status mono","data-status":o,children:re(e)}),e.blocked&&r("span",{class:"flag flag-blocked mono",children:"blocked"})]}),r("h3",{class:"card-title",children:e.title}),r("div",{class:"card-meta mono",children:[r("span",{class:"card-backend",children:e.backend}),e.model&&r("span",{class:"card-model",children:e.model}),e.effort&&r("span",{class:"card-effort",children:e.effort})]}),e.delivery?.required&&r("div",{class:"card-lastline mono",children:r("span",{class:"lastline-text",children:["delivery ",e.delivery.status," \xB7 ",e.delivery.target??"target not recorded",e.delivery.checks?.length?` \xB7 ${e.delivery.checks.length} check${e.delivery.checks.length===1?"":"s"}`:""]})}),e.lastLine&&r("div",{class:"card-lastline mono",children:[s&&r("span",{class:"pulse-dot","aria-hidden":"true"}),r("span",{class:"lastline-text",children:e.lastLine})]}),r("div",{class:"card-foot",children:[e.tokens&&r("span",{class:"tokens mono",title:"input / output tokens",children:[r("span",{class:"tok-in",children:["\u2193",se(e.tokens.input)]}),r("span",{class:"tok-out",children:["\u2191",se(e.tokens.output)]})]}),i>0&&r("span",{class:"dep-badge mono",title:"upstream dependencies",children:[e.deps.hard.length>0&&r("span",{class:"dep dep-hard",title:`${e.deps.hard.length} hard dependency(ies)`,children:["\u2191",e.deps.hard.length," hard"]}),e.deps.soft.length>0&&r("span",{class:"dep dep-soft",title:`${e.deps.soft.length} soft dependency(ies)`,children:["\u2191",e.deps.soft.length," soft"]})]})]})]})]})}var E={boxW:220,boxH:64,gapX:96,gapY:26,padX:40,padY:40,spineW:5};function It(e,t){let n=new Map;for(let l of e)n.set(l.id,l.deps.hard.filter(u=>t.has(u)&&u!==l.id));let o=new Map,s=new Set,i=l=>{let u=o.get(l);if(u!==void 0)return u;if(s.has(l))return 0;s.add(l);let d=n.get(l)??[],c=-1;for(let a of d)c=Math.max(c,i(a));s.delete(l);let p=c+1;return o.set(l,p),p};for(let l of e)i(l.id);return o}function Ut(e){let t=new Set(e.map(p=>p.id)),n=It(e,t),o=new Map;for(let p of e){let a=n.get(p.id)??0,_=o.get(a);_?_.push(p):o.set(a,[p])}let s=new Map,i=Array.from(o.keys()).sort((p,a)=>p-a),l=0;for(let p of i){let a=o.get(p);a.sort((v,h)=>v.createdAt!==h.createdAt?v.createdAt<h.createdAt?-1:1:v.id<h.id?-1:1);let _=E.padX+p*(E.boxW+E.gapX),f=E.padY;for(let v of a)s.set(v.id,{x:_,y:f}),f+=E.boxH+E.gapY;l=Math.max(l,f-E.gapY)}let u=i.length?i[i.length-1]:0,d=E.padX*2+(u+1)*E.boxW+u*E.gapX,c=Math.max(l+E.padY,E.padY*2+E.boxH);return{pos:s,width:d,height:c}}function Ot(e,t){return e.length<=t?e:`${e.slice(0,Math.max(0,t-1)).trimEnd()}\u2026`}function Bt({nodes:e,edges:t,onOpen:n,selected:o}){let s=I(()=>Ut(e),[e]),i=I(()=>new Set(e.map(d=>d.id)),[e]);if(e.length===0)return r("div",{class:"empty",children:[r("div",{class:"empty-title",children:"no tasks in the graph yet"}),r("div",{class:"empty-sub mono",children:"the dependency DAG renders here once tasks exist"})]});let l=t.filter(d=>i.has(d.from)&&i.has(d.to)),u=d=>{let c=s.pos.get(d.from),p=s.pos.get(d.to);if(!c||!p)return null;let a=c.x+E.boxW,_=c.y+E.boxH/2,f=p.x,v=p.y+E.boxH/2,h=Math.max(28,(f-a)/2);return`M ${a} ${_} C ${a+h} ${_}, ${f-h} ${v}, ${f} ${v}`};return r("div",{class:"nest",children:r("svg",{class:"nest-svg",width:s.width,height:s.height,viewBox:`0 0 ${s.width} ${s.height}`,role:"group","aria-label":"Task dependency graph",children:[r("defs",{children:[r("marker",{id:"arrow",viewBox:"0 0 10 10",refX:"9",refY:"5",markerWidth:"7",markerHeight:"7",orient:"auto-start-reverse",children:r("path",{d:"M 0 0 L 10 5 L 0 10 z",class:"arrow-head"})}),r("marker",{id:"arrow-soft",viewBox:"0 0 10 10",refX:"9",refY:"5",markerWidth:"6",markerHeight:"6",orient:"auto-start-reverse",children:r("path",{d:"M 0 0 L 10 5 L 0 10 z",class:"arrow-head-soft"})})]}),r("g",{class:"nest-edges",children:l.map((d,c)=>{let p=u(d);return p?r("path",{d:p,fill:"none",class:d.kind==="hard"?"edge edge-hard":"edge edge-soft"},`${d.from}->${d.to}:${d.kind}:${c}`):null})}),r("g",{class:"nest-nodes",children:e.map(d=>{let c=s.pos.get(d.id);if(!c)return null;let p=he(d),a=o===d.id,_=f=>n(d.id,f);return r("g",{class:`node ${a?"node-selected":""}`,"data-status":p,"data-task-id":d.id,transform:`translate(${c.x} ${c.y})`,tabIndex:0,role:"button","aria-label":`${re(d)}: ${d.title}`,"aria-haspopup":"dialog","aria-expanded":a,onClick:f=>_(f.currentTarget),onKeyDown:f=>{(f.key==="Enter"||f.key===" ")&&(f.preventDefault(),_(f.currentTarget))},children:[r("rect",{class:"node-box",x:"0",y:"0",width:E.boxW,height:E.boxH}),r("rect",{class:"node-spine",x:"0",y:"0",width:E.spineW,height:E.boxH}),r("text",{class:"node-status mono",x:E.spineW+12,y:"22",children:re(d)}),r("text",{class:"node-title",x:E.spineW+12,y:"44",children:Ot(d.title,30)})]},d.id)})})]})})}function qt({slug:e,node:t,onClose:n,returnFocus:o,canMutate:s}){let[i,l]=C(null),[u,d]=C(null),[c,p]=C({busy:!1,msg:null,err:null}),a=A(null),_=A(n);_.current=n;let f=he(t),v=lt(t),h=t.status==="completed"||t.status==="review",y=h||t.column==="review",m=v||h,g=h&&!v,w=t.runId??t.id,x=`task-update-${t.id.replace(/[^A-Za-z0-9_-]/g,"-")}`;N(()=>{let b=o??document.activeElement,R=window.requestAnimationFrame(()=>{(a.current?.querySelector("[data-autofocus]")??a.current)?.focus()}),D=L=>{if(L.key==="Escape"){L.preventDefault(),_.current();return}if(L.key!=="Tab"||!a.current)return;let O=Array.from(a.current.querySelectorAll('a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex="-1"])'));if(O.length===0){L.preventDefault(),a.current.focus();return}let be=O[0],ke=O[O.length-1];L.shiftKey&&document.activeElement===be?(L.preventDefault(),ke.focus()):!L.shiftKey&&document.activeElement===ke&&(L.preventDefault(),be.focus())};return window.addEventListener("keydown",D),()=>{window.cancelAnimationFrame(R),window.removeEventListener("keydown",D),b?.isConnected?b.focus():Array.from(document.querySelectorAll("[data-task-id]")).find(O=>O.getAttribute("data-task-id")===t.id)?.focus()}},[t.id]),N(()=>{let b=!1;return l(null),d(null),ze(e,w,200).then(R=>{b||l(R)}).catch(R=>{b||d(String(R?.message??R))}),()=>{b=!0}},[e,w]);let M=I(()=>{let b=i??"";return!t.lastLine||b.trimEnd().endsWith(t.lastLine.trimEnd())?b:b?`${b}
2
- ${t.lastLine}`:t.lastLine},[i,t.lastLine]),V=async()=>{p({busy:!0,msg:null,err:null});try{let b=await Qe(e,w);if(b.status==="merge-conflict"||b.status==="conflict"||b.status==="blocked"){let D=b.conflictedFiles?.length??0;p({busy:!1,msg:null,err:D?`conflict in ${D} file(s)`:"merge conflict"})}else p({busy:!1,msg:b.status,err:null})}catch(b){p({busy:!1,msg:null,err:String(b?.message??b)})}},U=async()=>{p({busy:!0,msg:null,err:null});try{await Ze(e,w),p({busy:!1,msg:"cancel requested",err:null})}catch(b){p({busy:!1,msg:null,err:String(b?.message??b)})}};return r("div",{class:"drawer-overlay",onClick:n,children:r("aside",{ref:a,class:"drawer",onClick:b=>b.stopPropagation(),"data-status":f,role:"dialog","aria-modal":"true","aria-labelledby":"task-detail-title",tabIndex:-1,children:[r("div",{class:"drawer-spine","data-status":f}),r("header",{class:"drawer-head",children:[r("div",{class:"drawer-head-top",children:[r("span",{class:"card-status mono","data-status":f,children:re(t)}),r("button",{type:"button",class:"drawer-close",onClick:n,"aria-label":"Close",children:"\u2715"})]}),r("h2",{class:"drawer-title",id:"task-detail-title",children:t.title}),r("div",{class:"drawer-meta mono",children:[r("span",{children:t.backend}),t.model&&r("span",{children:t.model}),t.effort&&r("span",{children:t.effort}),t.tokens&&r("span",{children:["\u2193",se(t.tokens.input)," \u2191",se(t.tokens.output)]})]}),t.worktree&&r("div",{class:"drawer-worktree mono",title:t.worktree.path,children:t.worktree.workspaceName??t.worktree.path}),t.delivery?.required&&r("div",{class:"drawer-worktree mono",title:t.delivery.url??t.delivery.appPath??t.delivery.target,children:["delivery ",t.delivery.status," \xB7 ",t.delivery.target??"target not recorded",t.delivery.revision?` \xB7 ${t.delivery.revision}`:""]})]}),s&&r("div",{class:"drawer-actions",children:[y&&r("button",{type:"button",class:"btn btn-accent",onClick:V,disabled:c.busy,children:c.busy?"Merging\u2026":"Merge"}),g&&r("button",{type:"button",class:"btn",onClick:()=>document.getElementById(x)?.focus(),disabled:c.busy,children:"Request changes"}),v&&r("button",{type:"button",class:"btn btn-danger",onClick:U,disabled:c.busy,children:c.busy?"Stopping\u2026":"Stop"}),c.msg&&r("span",{class:"action-msg","aria-live":"polite",children:c.msg}),c.err&&r("span",{class:"action-err",role:"alert",children:c.err})]}),r("div",{class:"drawer-scroll",children:[r(Ht,{updates:t.updates??[],lastLine:t.lastLine}),r("div",{class:"drawer-log",children:[r("div",{class:"drawer-log-head mono",children:[r("span",{children:"Worker log"}),v&&r("span",{class:"pulse-dot","aria-hidden":"true"})]}),r(Ft,{text:M,error:u,loading:i===null&&!u})]})]}),s&&m&&r("div",{class:"drawer-steer",children:r(pt,{slug:e,targetId:w,inputId:x,label:g?"Request changes":"Send update",submitLabel:g?"Request changes":"Send update",placeholder:g?"Describe what should change before this task is merged.":"Add context or redirect this worker.",autoFocus:!0})})]})})}function Ht({updates:e,lastLine:t}){let n=e.filter(o=>o.instruction.trim());return r("section",{class:"task-updates","aria-labelledby":"task-updates-title",children:[r("div",{class:"task-updates-head",children:[r("h3",{id:"task-updates-title",children:"Updates"}),n.length>0&&r("span",{class:"task-updates-count mono",children:n.length})]}),r("div",{class:"task-thread",children:[n.length===0&&!t&&r("p",{class:"task-thread-empty",children:"No updates have been sent yet."}),n.map((o,s)=>r("article",{class:"task-update task-update-user",children:[r("div",{class:"task-update-avatar","aria-hidden":"true",children:"Y"}),r("div",{class:"task-update-body",children:[r("div",{class:"task-update-meta",children:[r("span",{children:jt(o.source)}),r("time",{class:"mono",dateTime:o.ts,children:_t(o.ts)})]}),r("p",{children:o.instruction})]})]},`${o.ts}-${s}`)),t&&r("article",{class:"task-update task-update-agent",children:[r("div",{class:"task-update-avatar task-update-avatar-agent","aria-hidden":"true",children:"R"}),r("div",{class:"task-update-body",children:[r("div",{class:"task-update-meta",children:r("span",{children:"Latest from worker"})}),r("p",{class:"mono",children:t})]})]})]})]})}function jt(e){let t=(e??"").trim().toLowerCase();return!t||t==="user"||t==="web"||t==="operator"||t==="regoal"?"You":t==="steerer"||t==="rudder"?"Rudder":e??"You"}function Ft({text:e,error:t,loading:n}){let o=A(null);return N(()=>{let s=o.current;s&&(s.scrollTop=s.scrollHeight)},[e]),t?r("div",{class:"banner banner-error mono",children:["log unavailable: ",t]}):n?r("div",{class:"log-pre log-loading mono","aria-label":"Loading worker log",children:[r("div",{class:"skel skel-line",style:"width:70%"}),r("div",{class:"skel skel-line",style:"width:90%"}),r("div",{class:"skel skel-line",style:"width:55%"})]}):r("pre",{ref:o,class:"log-pre mono",children:e||"no output yet"})}function ot(e){return e.status==="failed"?e.error||"Delivery failed":e.status==="accepted"?e.mode==="resumed"?"Accepted \xB7 agent is resuming":"Accepted \xB7 agent is restarting":e.status==="delivered"?e.mode==="resumed"?"Delivered \xB7 agent resumed":"Delivered to agent":e.mode==="resumed"?"Queued \xB7 agent is resuming":e.mode==="redirected"?"Queued for the live agent":"Queued for delivery"}function pt({slug:e,targetId:t,inputId:n,label:o,submitLabel:s,placeholder:i,autoFocus:l=!1}){let[u,d]=C(""),[c,p]=C(!1),[a,_]=C(null),[f,v]=C(null);N(()=>{if(a?.state!=="queued"||!a.requestId||window.__RUDDER_CONTROL_MODE__!=="projector")return;let m=!1,g,w=async()=>{try{let x=await ye(e,a.requestId);if(m)return;if(x.status==="delivered"||x.status==="failed"){_(M=>M?.requestId===x.requestId?{...M,state:x.status,message:ot(x)}:M);return}}catch{}m||(g=window.setTimeout(w,500))};return g=window.setTimeout(w,250),()=>{m=!0,g!==void 0&&window.clearTimeout(g)}},[e,a?.state,a?.requestId]);let h=async()=>{let m=u.trim();if(!(!m||c)){p(!0),_({instruction:m,state:"sending",message:"Sending request\u2026"}),v(null);try{let g=await et(e,t,m);d(""),_({instruction:m,requestId:g.requestId,state:g.status,message:ot(g)})}catch(g){_(null),v(String(g?.message??g))}finally{p(!1)}}},y=m=>{(m.metaKey||m.ctrlKey)&&m.key==="Enter"&&(m.preventDefault(),h())};return r("form",{class:"steer",onSubmit:m=>{m.preventDefault(),h()},"aria-busy":c,children:[r("label",{class:"steer-label",for:n,children:o}),r("textarea",{id:n,class:"steer-input",rows:3,maxLength:8e3,placeholder:i,value:u,disabled:c,"data-autofocus":l?"true":void 0,"aria-describedby":`${n}-hint${a?` ${n}-status`:""}`,onInput:m=>{d(m.target.value),f&&v(null)},onKeyDown:y}),r("div",{class:"steer-actions",children:[r("span",{class:"steer-hint",id:`${n}-hint`,children:"\u2318/Ctrl + Enter to send"}),r("button",{type:"submit",class:"btn btn-accent",disabled:c||!u.trim(),children:c?"Sending\u2026":s})]}),a&&r("div",{class:`steer-feedback steer-feedback-${a.state}`,id:`${n}-status`,"aria-live":"polite",children:[r("span",{class:"steer-feedback-state",children:a.message}),r("span",{class:"steer-feedback-text",children:a.instruction})]}),f&&r("div",{class:"action-err steer-error",role:"alert",children:["Could not send: ",f]})]})}function Vt({slug:e,activity:t,canSteerConductor:n}){let o=A(null);return N(()=>{let s=o.current;s&&(s.scrollTop=s.scrollHeight)},[t]),r("div",{class:"activity",children:[n&&r("div",{class:"activity-steer",children:r(pt,{slug:e,targetId:"conductor",inputId:"conductor-update",label:"Message conductor",submitLabel:"Send update",placeholder:"Tell the live orchestrator what to do next."})}),t.length===0?r("div",{class:"empty",children:[r("div",{class:"empty-title",children:"no activity yet"}),r("div",{class:"empty-sub mono",children:"the conductor narrates what it is doing here as work runs"})]}):r("div",{class:"activity-feed",ref:o,children:t.map((s,i)=>r("div",{class:`activity-entry activity-${s.kind}`,children:[r("span",{class:"activity-dot","aria-hidden":"true"}),r("span",{class:"activity-text",children:s.text}),s.ts&&r("span",{class:"activity-ts mono",children:_t(s.ts)})]},`${s.ts??""}-${i}`))})]})}function _t(e){let t=/^\d{10,}$/.test(e.trim())?Number(e):e,n=new Date(t);return Number.isNaN(n.getTime())?"":n.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}function Wt({memory:e}){return e.length===0?r("div",{class:"empty",children:[r("div",{class:"empty-title",children:"no decisions recorded yet"}),r("div",{class:"empty-sub mono",children:"agents append cross-cutting decisions here as they work"})]}):r("div",{class:"memory",children:e.map((t,n)=>r("article",{class:"memory-entry",children:[r("div",{class:"memory-bead","aria-hidden":"true"}),r("div",{class:"memory-content",children:[r("p",{class:"memory-text",children:t.text}),r("div",{class:"memory-meta mono",children:[t.owner&&r("span",{class:"memory-owner",children:t.owner}),t.ts&&r("span",{class:"memory-ts",children:t.ts})]})]})]},n))})}function Kt(){return r("div",{class:"board","aria-hidden":"true",children:at.map(e=>r("section",{class:"column",children:[r("header",{class:"column-head",children:[r("span",{class:"column-title",children:e.label}),r("span",{class:"column-count mono",children:"\xB7"})]}),r("div",{class:"column-body",children:[r("div",{class:"card card-skeleton",children:[r("div",{class:"skel skel-line",style:"width:60%"}),r("div",{class:"skel skel-line",style:"width:85%"})]}),e.key==="running"&&r("div",{class:"card card-skeleton",children:[r("div",{class:"skel skel-line",style:"width:70%"}),r("div",{class:"skel skel-line",style:"width:50%"})]})]})]},e.key))})}function Yt(){let e=(window.__RUDDER_SLUG__??"").trim();return e?r(ut,{slug:e}):r(ct,{})}var ft=document.getElementById("app");ft&&Ie(r(Yt,{}),ft);
1
+ var se,R,De,Tt,O,Ce,Ue,Ne,de,z,G,Ie,_e,ue,pe,Mt,ee={},te=[],Ct=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,re=Array.isArray;function L(e,t){for(var s in t)e[s]=t[s];return e}function fe(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function $t(e,t,s){var a,r,i,l={};for(i in t)i=="key"?a=t[i]:i=="ref"?r=t[i]:l[i]=t[i];if(arguments.length>2&&(l.children=arguments.length>3?se.call(arguments,2):s),typeof e=="function"&&e.defaultProps!=null)for(i in e.defaultProps)l[i]===void 0&&(l[i]=e.defaultProps[i]);return X(e,l,a,r,null)}function X(e,t,s,a,r){var i={type:e,props:t,key:s,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:r??++De,__i:-1,__u:0};return r==null&&R.vnode!=null&&R.vnode(i),i}function A(e){return e.children}function Z(e,t){this.props=e,this.context=t}function V(e,t){if(t==null)return e.__?V(e.__,e.__i+1):null;for(var s;t<e.__k.length;t++)if((s=e.__k[t])!=null&&s.__e!=null)return s.__e;return typeof e.type=="function"?V(e):null}function Pt(e){if(e.__P&&e.__d){var t=e.__v,s=t.__e,a=[],r=[],i=L({},t);i.__v=t.__v+1,R.vnode&&R.vnode(i),ge(e.__P,i,t,e.__n,e.__P.namespaceURI,32&t.__u?[s]:null,a,s??V(t),!!(32&t.__u),r),i.__v=t.__v,i.__.__k[i.__i]=i,qe(a,i,r),t.__e=t.__=null,i.__e!=s&&Le(i)}}function Le(e){if((e=e.__)!=null&&e.__c!=null)return e.__e=e.__c.base=null,e.__k.some(function(t){if(t!=null&&t.__e!=null)return e.__e=e.__c.base=t.__e}),Le(e)}function $e(e){(!e.__d&&(e.__d=!0)&&O.push(e)&&!ne.__r++||Ce!=R.debounceRendering)&&((Ce=R.debounceRendering)||Ue)(ne)}function ne(){try{for(var e,t=1;O.length;)O.length>t&&O.sort(Ne),e=O.shift(),t=O.length,Pt(e)}finally{O.length=ne.__r=0}}function je(e,t,s,a,r,i,l,u,d,c,p){var o,_,f,h,b,y,g,v=a&&a.__k||te,m=t.length;for(d=At(s,t,v,d,m),o=0;o<m;o++)(f=s.__k[o])!=null&&(_=f.__i!=-1&&v[f.__i]||ee,f.__i=o,y=ge(e,f,_,r,i,l,u,d,c,p),h=f.__e,f.ref&&_.ref!=f.ref&&(_.ref&&ve(_.ref,null,f),p.push(f.ref,f.__c||h,f)),b==null&&h!=null&&(b=h),(g=!!(4&f.__u))||_.__k===f.__k?(d=Be(f,d,e,g),g&&_.__e&&(_.__e=null)):typeof f.type=="function"&&y!==void 0?d=y:h&&(d=h.nextSibling),f.__u&=-7);return s.__e=b,d}function At(e,t,s,a,r){var i,l,u,d,c,p=s.length,o=p,_=0;for(e.__k=new Array(r),i=0;i<r;i++)(l=t[i])!=null&&typeof l!="boolean"&&typeof l!="function"?(typeof l=="string"||typeof l=="number"||typeof l=="bigint"||l.constructor==String?l=e.__k[i]=X(null,l,null,null,null):re(l)?l=e.__k[i]=X(A,{children:l},null,null,null):l.constructor===void 0&&l.__b>0?l=e.__k[i]=X(l.type,l.props,l.key,l.ref?l.ref:null,l.__v):e.__k[i]=l,d=i+_,l.__=e,l.__b=e.__b+1,u=null,(c=l.__i=Dt(l,s,d,o))!=-1&&(o--,(u=s[c])&&(u.__u|=2)),u==null||u.__v==null?(c==-1&&(r>p?_--:r<p&&_++),typeof l.type!="function"&&(l.__u|=4)):c!=d&&(c==d-1?_--:c==d+1?_++:(c>d?_--:_++,l.__u|=4))):e.__k[i]=null;if(o)for(i=0;i<p;i++)(u=s[i])!=null&&!(2&u.__u)&&(u.__e==a&&(a=V(u)),Fe(u,u));return a}function Be(e,t,s,a){var r,i;if(typeof e.type=="function"){for(r=e.__k,i=0;r&&i<r.length;i++)r[i]&&(r[i].__=e,t=Be(r[i],t,s,a));return t}e.__e!=t&&(a&&(t&&e.type&&!t.parentNode&&(t=V(e)),s.insertBefore(e.__e,t||null)),t=e.__e);do t=t&&t.nextSibling;while(t!=null&&t.nodeType==8);return t}function Dt(e,t,s,a){var r,i,l,u=e.key,d=e.type,c=t[s],p=c!=null&&(2&c.__u)==0;if(c===null&&u==null||p&&u==c.key&&d==c.type)return s;if(a>(p?1:0)){for(r=s-1,i=s+1;r>=0||i<t.length;)if((c=t[l=r>=0?r--:i++])!=null&&!(2&c.__u)&&u==c.key&&d==c.type)return l}return-1}function Pe(e,t,s){t[0]=="-"?e.setProperty(t,s??""):e[t]=s==null?"":typeof s!="number"||Ct.test(t)?s:s+"px"}function J(e,t,s,a,r){var i,l;e:if(t=="style")if(typeof s=="string")e.style.cssText=s;else{if(typeof a=="string"&&(e.style.cssText=a=""),a)for(t in a)s&&t in s||Pe(e.style,t,"");if(s)for(t in s)a&&s[t]==a[t]||Pe(e.style,t,s[t])}else if(t[0]=="o"&&t[1]=="n")i=t!=(t=t.replace(Ie,"$1")),l=t.toLowerCase(),t=l in e||t=="onFocusOut"||t=="onFocusIn"?l.slice(2):t.slice(2),e.l||(e.l={}),e.l[t+i]=s,s?a?s[G]=a[G]:(s[G]=_e,e.addEventListener(t,i?pe:ue,i)):e.removeEventListener(t,i?pe:ue,i);else{if(r=="http://www.w3.org/2000/svg")t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(t!="width"&&t!="height"&&t!="href"&&t!="list"&&t!="form"&&t!="tabIndex"&&t!="download"&&t!="rowSpan"&&t!="colSpan"&&t!="role"&&t!="popover"&&t in e)try{e[t]=s??"";break e}catch{}typeof s=="function"||(s==null||s===!1&&t[4]!="-"?e.removeAttribute(t):e.setAttribute(t,t=="popover"&&s==1?"":s))}}function Ae(e){return function(t){if(this.l){var s=this.l[t.type+e];if(t[z]==null)t[z]=_e++;else if(t[z]<s[G])return;return s(R.event?R.event(t):t)}}}function ge(e,t,s,a,r,i,l,u,d,c){var p,o,_,f,h,b,y,g,v,m,k,E,H,I,x,M=t.type;if(t.constructor!==void 0)return null;128&s.__u&&(d=!!(32&s.__u),i=[u=t.__e=s.__e]),(p=R.__b)&&p(t);e:if(typeof M=="function")try{if(g=t.props,v=M.prototype&&M.prototype.render,m=(p=M.contextType)&&a[p.__c],k=p?m?m.props.value:p.__:a,s.__c?y=(o=t.__c=s.__c).__=o.__E:(v?t.__c=o=new M(g,k):(t.__c=o=new Z(g,k),o.constructor=M,o.render=Nt),m&&m.sub(o),o.state||(o.state={}),o.__n=a,_=o.__d=!0,o.__h=[],o._sb=[]),v&&o.__s==null&&(o.__s=o.state),v&&M.getDerivedStateFromProps!=null&&(o.__s==o.state&&(o.__s=L({},o.__s)),L(o.__s,M.getDerivedStateFromProps(g,o.__s))),f=o.props,h=o.state,o.__v=t,_)v&&M.getDerivedStateFromProps==null&&o.componentWillMount!=null&&o.componentWillMount(),v&&o.componentDidMount!=null&&o.__h.push(o.componentDidMount);else{if(v&&M.getDerivedStateFromProps==null&&g!==f&&o.componentWillReceiveProps!=null&&o.componentWillReceiveProps(g,k),t.__v==s.__v||!o.__e&&o.shouldComponentUpdate!=null&&o.shouldComponentUpdate(g,o.__s,k)===!1){t.__v!=s.__v&&(o.props=g,o.state=o.__s,o.__d=!1),t.__e=s.__e,t.__k=s.__k,t.__k.some(function($){$&&($.__=t)}),te.push.apply(o.__h,o._sb),o._sb=[],o.__h.length&&l.push(o);break e}o.componentWillUpdate!=null&&o.componentWillUpdate(g,o.__s,k),v&&o.componentDidUpdate!=null&&o.__h.push(function(){o.componentDidUpdate(f,h,b)})}if(o.context=k,o.props=g,o.__P=e,o.__e=!1,E=R.__r,H=0,v)o.state=o.__s,o.__d=!1,E&&E(t),p=o.render(o.props,o.state,o.context),te.push.apply(o.__h,o._sb),o._sb=[];else do o.__d=!1,E&&E(t),p=o.render(o.props,o.state,o.context),o.state=o.__s;while(o.__d&&++H<25);o.state=o.__s,o.getChildContext!=null&&(a=L(L({},a),o.getChildContext())),v&&!_&&o.getSnapshotBeforeUpdate!=null&&(b=o.getSnapshotBeforeUpdate(f,h)),I=p!=null&&p.type===A&&p.key==null?Oe(p.props.children):p,u=je(e,re(I)?I:[I],t,s,a,r,i,l,u,d,c),o.base=t.__e,t.__u&=-161,o.__h.length&&l.push(o),y&&(o.__E=o.__=null)}catch($){if(t.__v=null,d||i!=null)if($.then){for(t.__u|=d?160:128;u&&u.nodeType==8&&u.nextSibling;)u=u.nextSibling;i[i.indexOf(u)]=null,t.__e=u}else{for(x=i.length;x--;)fe(i[x]);me(t)}else t.__e=s.__e,t.__k=s.__k,$.then||me(t);R.__e($,t,s)}else i==null&&t.__v==s.__v?(t.__k=s.__k,t.__e=s.__e):u=t.__e=Ut(s.__e,t,s,a,r,i,l,d,c);return(p=R.diffed)&&p(t),128&t.__u?void 0:u}function me(e){e&&(e.__c&&(e.__c.__e=!0),e.__k&&e.__k.some(me))}function qe(e,t,s){for(var a=0;a<s.length;a++)ve(s[a],s[++a],s[++a]);R.__c&&R.__c(t,e),e.some(function(r){try{e=r.__h,r.__h=[],e.some(function(i){i.call(r)})}catch(i){R.__e(i,r.__v)}})}function Oe(e){return typeof e!="object"||e==null||e.__b>0?e:re(e)?e.map(Oe):e.constructor!==void 0?null:L({},e)}function Ut(e,t,s,a,r,i,l,u,d){var c,p,o,_,f,h,b,y=s.props||ee,g=t.props,v=t.type;if(v=="svg"?r="http://www.w3.org/2000/svg":v=="math"?r="http://www.w3.org/1998/Math/MathML":r||(r="http://www.w3.org/1999/xhtml"),i!=null){for(c=0;c<i.length;c++)if((f=i[c])&&"setAttribute"in f==!!v&&(v?f.localName==v:f.nodeType==3)){e=f,i[c]=null;break}}if(e==null){if(v==null)return document.createTextNode(g);e=document.createElementNS(r,v,g.is&&g),u&&(R.__m&&R.__m(t,i),u=!1),i=null}if(v==null)y===g||u&&e.data==g||(e.data=g);else{if(i=v=="textarea"&&g.defaultValue!=null?null:i&&se.call(e.childNodes),!u&&i!=null)for(y={},c=0;c<e.attributes.length;c++)y[(f=e.attributes[c]).name]=f.value;for(c in y)f=y[c],c=="dangerouslySetInnerHTML"?o=f:c=="children"||c in g||c=="value"&&"defaultValue"in g||c=="checked"&&"defaultChecked"in g||J(e,c,null,f,r);for(c in g)f=g[c],c=="children"?_=f:c=="dangerouslySetInnerHTML"?p=f:c=="value"?h=f:c=="checked"?b=f:u&&typeof f!="function"||y[c]===f||J(e,c,f,y[c],r);if(p)u||o&&(p.__html==o.__html||p.__html==e.innerHTML)||(e.innerHTML=p.__html),t.__k=[];else if(o&&(e.innerHTML=""),je(t.type=="template"?e.content:e,re(_)?_:[_],t,s,a,v=="foreignObject"?"http://www.w3.org/1999/xhtml":r,i,l,i?i[0]:s.__k&&V(s,0),u,d),i!=null)for(c=i.length;c--;)fe(i[c]);u&&v!="textarea"||(c="value",v=="progress"&&h==null?e.removeAttribute("value"):h!=null&&(h!==e[c]||v=="progress"&&!h||v=="option"&&h!=y[c])&&J(e,c,h,y[c],r),c="checked",b!=null&&b!=e[c]&&J(e,c,b,y[c],r))}return e}function ve(e,t,s){try{if(typeof e=="function"){var a=typeof e.__u=="function";a&&e.__u(),a&&t==null||(e.__u=e(t))}else e.current=t}catch(r){R.__e(r,s)}}function Fe(e,t,s){var a,r;if(R.unmount&&R.unmount(e),(a=e.ref)&&(a.current&&a.current!=e.__e||ve(a,null,t)),(a=e.__c)!=null){if(a.componentWillUnmount)try{a.componentWillUnmount()}catch(i){R.__e(i,t)}a.base=a.__P=null}if(a=e.__k)for(r=0;r<a.length;r++)a[r]&&Fe(a[r],t,s||typeof e.type!="function");s||fe(e.__e),e.__c=e.__=e.__e=void 0}function Nt(e,t,s){return this.constructor(e,s)}function He(e,t,s){var a,r,i,l;t==document&&(t=document.documentElement),R.__&&R.__(e,t),r=(a=typeof s=="function")?null:s&&s.__k||t.__k,i=[],l=[],ge(t,e=(!a&&s||t).__k=$t(A,null,[e]),r||ee,ee,t.namespaceURI,!a&&s?[s]:r?null:t.firstChild?se.call(t.childNodes):null,i,!a&&s?s:r?r.__e:t.firstChild,a,l),qe(i,e,l)}se=te.slice,R={__e:function(e,t,s,a){for(var r,i,l;t=t.__;)if((r=t.__c)&&!r.__)try{if((i=r.constructor)&&i.getDerivedStateFromError!=null&&(r.setState(i.getDerivedStateFromError(e)),l=r.__d),r.componentDidCatch!=null&&(r.componentDidCatch(e,a||{}),l=r.__d),l)return r.__E=r}catch(u){e=u}throw e}},De=0,Tt=function(e){return e!=null&&e.constructor===void 0},Z.prototype.setState=function(e,t){var s;s=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=L({},this.state),typeof e=="function"&&(e=e(L({},s),this.props)),e&&L(s,e),e!=null&&this.__v&&(t&&this._sb.push(t),$e(this))},Z.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),$e(this))},Z.prototype.render=A,O=[],Ue=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Ne=function(e,t){return e.__v.__b-t.__v.__b},ne.__r=0,de=Math.random().toString(8),z="__d"+de,G="__a"+de,Ie=/(PointerCapture)$|Capture$/i,_e=0,ue=Ae(!1),pe=Ae(!0),Mt=0;var Y,T,he,Ke,oe=0,Xe=[],C=R,We=C.__b,Ve=C.__r,Qe=C.diffed,Ge=C.__c,Ye=C.unmount,Je=C.__;function be(e,t){C.__h&&C.__h(T,e,oe||t),oe=0;var s=T.__H||(T.__H={__:[],__h:[]});return e>=s.__.length&&s.__.push({}),s.__[e]}function w(e){return oe=1,ke(et,e)}function ke(e,t,s){var a=be(Y++,2);if(a.t=e,!a.__c&&(a.__=[s?s(t):et(void 0,t),function(u){var d=a.__N?a.__N[0]:a.__[0],c=a.t(d,u);d!==c&&(a.__N=[c,a.__[1]],a.__c.setState({}))}],a.__c=T,!T.__f)){var r=function(u,d,c){if(!a.__c.__H)return!0;var p=a.__c.__H.__.filter(function(_){return _.__c});if(p.every(function(_){return!_.__N}))return!i||i.call(this,u,d,c);var o=a.__c.props!==u;return p.some(function(_){if(_.__N){var f=_.__[0];_.__=_.__N,_.__N=void 0,f!==_.__[0]&&(o=!0)}}),i&&i.call(this,u,d,c)||o};T.__f=!0;var i=T.shouldComponentUpdate,l=T.componentWillUpdate;T.componentWillUpdate=function(u,d,c){if(this.__e){var p=i;i=void 0,r(u,d,c),i=p}l&&l.call(this,u,d,c)},T.shouldComponentUpdate=r}return a.__N||a.__}function P(e,t){var s=be(Y++,3);!C.__s&&Ze(s.__H,t)&&(s.__=e,s.u=t,T.__H.__h.push(s))}function D(e){return oe=5,j(function(){return{current:e}},[])}function j(e,t){var s=be(Y++,7);return Ze(s.__H,t)&&(s.__=e(),s.__H=t,s.__h=e),s.__}function It(){for(var e;e=Xe.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(ae),t.__h.some(ye),t.__h=[]}catch(s){t.__h=[],C.__e(s,e.__v)}}}C.__b=function(e){T=null,We&&We(e)},C.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),Je&&Je(e,t)},C.__r=function(e){Ve&&Ve(e),Y=0;var t=(T=e.__c).__H;t&&(he===T?(t.__h=[],T.__h=[],t.__.some(function(s){s.__N&&(s.__=s.__N),s.u=s.__N=void 0})):(t.__h.some(ae),t.__h.some(ye),t.__h=[],Y=0)),he=T},C.diffed=function(e){Qe&&Qe(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(Xe.push(t)!==1&&Ke===C.requestAnimationFrame||((Ke=C.requestAnimationFrame)||Lt)(It)),t.__H.__.some(function(s){s.u&&(s.__H=s.u),s.u=void 0})),he=T=null},C.__c=function(e,t){t.some(function(s){try{s.__h.some(ae),s.__h=s.__h.filter(function(a){return!a.__||ye(a)})}catch(a){t.some(function(r){r.__h&&(r.__h=[])}),t=[],C.__e(a,s.__v)}}),Ge&&Ge(e,t)},C.unmount=function(e){Ye&&Ye(e);var t,s=e.__c;s&&s.__H&&(s.__H.__.some(function(a){try{ae(a)}catch(r){t=r}}),s.__H=void 0,t&&C.__e(t,s.__v))};var ze=typeof requestAnimationFrame=="function";function Lt(e){var t,s=function(){clearTimeout(a),ze&&cancelAnimationFrame(t),setTimeout(e)},a=setTimeout(s,35);ze&&(t=requestAnimationFrame(s))}function ae(e){var t=T,s=e.__c;typeof s=="function"&&(e.__c=void 0,s()),T=t}function ye(e){var t=T;e.__c=e.__(),T=t}function Ze(e,t){return!e||e.length!==t.length||t.some(function(s,a){return s!==e[a]})}function et(e,t){return typeof t=="function"?t(e):t}async function B(e){if(!e.ok){let t=await e.text().catch(()=>"");throw new Error(`${e.status} ${e.statusText}${t?`: ${t}`:""}`)}return e.json()}function ie(e){return{"x-rudder-token":typeof window<"u"&&window.__RUDDER_TOKEN__||"",...e??{}}}async function tt(e){return B(await fetch(`/api/usage/tokens?range=${encodeURIComponent(e)}`))}async function nt(e=!1){return B(await fetch(`/api/usage/quota${e?"?refresh=1":""}`))}async function st(){return B(await fetch("/api/usage/machine"))}async function rt(){return B(await fetch("/api/projects"))}async function at(e){return B(await fetch(`/api/projects/${encodeURIComponent(e)}/state`))}async function ot(e,t,s=200){let a=await fetch(`/api/projects/${encodeURIComponent(e)}/tasks/${encodeURIComponent(t)}/log?tail=${s}`);if(!a.ok)throw new Error(`${a.status} ${a.statusText}`);return a.text()}async function it(e,t){let s=ut();return B(await pt(`/api/projects/${encodeURIComponent(e)}/tasks`,{method:"POST",headers:ie({"content-type":"application/json"}),body:JSON.stringify({prompt:t,requestId:s})}))}async function lt(e,t){return B(await fetch(`/api/projects/${encodeURIComponent(e)}/tasks/${encodeURIComponent(t)}/merge`,{method:"POST",headers:ie()}))}async function ct(e,t){let s=await fetch(`/api/projects/${encodeURIComponent(e)}/tasks/${encodeURIComponent(t)}/cancel`,{method:"POST",headers:ie()});if(!s.ok)throw new Error(`${s.status} ${s.statusText}`)}async function dt(e,t,s){let a=ut(),r=t==="conductor"?`/api/projects/${encodeURIComponent(e)}/steer`:`/api/projects/${encodeURIComponent(e)}/tasks/${encodeURIComponent(t)}/steer`;return B(await pt(r,{method:"POST",headers:ie({"content-type":"application/json"}),body:JSON.stringify({instruction:s,requestId:a})}))}function ut(){return globalThis.crypto?.randomUUID?.()??`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}-${Math.random().toString(36).slice(2)}`}async function pt(e,t){try{return await fetch(e,t)}catch{return await new Promise(s=>setTimeout(s,150)),fetch(e,t)}}async function we(e,t){return B(await fetch(`/api/projects/${encodeURIComponent(e)}/steer-receipts/${encodeURIComponent(t)}`))}function mt(e){return`/api/projects/${encodeURIComponent(e)}/events`}function jt(){return{nodes:new Map,edges:[],gates:[],memory:[],activity:[],loaded:!1}}function Bt(e,t){switch(t.type){case"SNAPSHOT":{let s=new Map;for(let a of t.snapshot.nodes)s.set(a.id,a);return{nodes:s,edges:t.snapshot.edges??[],gates:t.snapshot.gates??[],memory:t.snapshot.memory??[],activity:t.snapshot.activity??[],loaded:!0}}case"NODE_UPSERT":{let s=new Map(e.nodes);return s.set(t.node.id,t.node),{...e,nodes:s}}case"NODE_REMOVE":{if(!e.nodes.has(t.id))return e;let s=new Map(e.nodes);return s.delete(t.id),{...e,nodes:s}}case"EDGE_UPSERT":{let s=e.edges.filter(a=>!(a.from===t.edge.from&&a.to===t.edge.to&&a.kind===t.edge.kind));return s.push(t.edge),{...e,edges:s}}case"EDGE_REMOVE":return{...e,edges:e.edges.filter(s=>!(s.from===t.from&&s.to===t.to))};case"MEMORY":return{...e,memory:t.memory};case"ACTIVITY":return{...e,activity:t.activity};default:return e}}function _t(e){let[t,s]=ke(Bt,void 0,jt),[a,r]=w("connecting"),[i,l]=w(""),u=D(!1);return P(()=>{let d=!1;u.current=!1;async function c(){try{let o=await at(e);if(d)return;l(o.name||e),s({type:"SNAPSHOT",snapshot:o})}catch{}}c();let p=new EventSource(mt(e));return p.addEventListener("open",()=>{d||(u.current&&c(),u.current=!0,r("live"))}),p.addEventListener("snapshot",o=>{if(!d)try{let _=JSON.parse(o.data);l(_.name||e),s({type:"SNAPSHOT",snapshot:_})}catch{}}),p.addEventListener("node.added",o=>{if(!d)try{s({type:"NODE_UPSERT",node:JSON.parse(o.data)})}catch{}}),p.addEventListener("node.updated",o=>{if(!d)try{s({type:"NODE_UPSERT",node:JSON.parse(o.data)})}catch{}}),p.addEventListener("node.removed",o=>{if(!d)try{let _=JSON.parse(o.data),f=typeof _=="string"?_:_.id;f&&s({type:"NODE_REMOVE",id:f})}catch{}}),p.addEventListener("edge.added",o=>{if(!d)try{s({type:"EDGE_UPSERT",edge:JSON.parse(o.data)})}catch{}}),p.addEventListener("edge.removed",o=>{if(!d)try{let _=JSON.parse(o.data);_?.from&&_?.to&&s({type:"EDGE_REMOVE",from:_.from,to:_.to})}catch{}}),p.addEventListener("memory.updated",o=>{if(!d)try{let _=JSON.parse(o.data),f=Array.isArray(_)?_:_.memory??[];s({type:"MEMORY",memory:f})}catch{}}),p.addEventListener("activity.updated",o=>{if(!d)try{let _=JSON.parse(o.data),f=Array.isArray(_)?_:_.activity??[];s({type:"ACTIVITY",activity:f})}catch{}}),p.addEventListener("error",()=>{d||r(u.current?"reconnecting":"connecting")}),()=>{d=!0,p.close()}},[e]),{state:t,conn:a,name:i}}var qt=0,Tn=Array.isArray;function n(e,t,s,a,r,i){t||(t={});var l,u,d=t;if("ref"in d)for(u in d={},t)u=="ref"?l=t[u]:d[u]=t[u];var c={type:e,props:d,key:s,ref:l,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--qt,__i:-1,__u:0,__source:r,__self:i};if(typeof e=="function"&&(l=e.defaultProps))for(u in l)d[u]===void 0&&(d[u]=l[u]);return R.vnode&&R.vnode(c),c}var gt=[{key:"todo",label:"Todo"},{key:"running",label:"Running"},{key:"review",label:"Review"},{key:"done",label:"Done"}];function vt(e){let t=e.delivery;return!!(t?.required&&(t.status==="deployed"||t.status==="verified")&&t.kind?.trim()&&t.target?.trim()&&t.verifiedAt?.trim()&&t.checks?.length)}function Ee(e){if(e.merge&&e.merge.status==="merge-conflict")return"conflict";if(e.blocked)return"blocked";if(e.delivery?.required&&e.status==="completed")return e.delivery.status==="blocked"||e.delivery.status==="failed"?"failed":vt(e)?"done":"review";switch(e.status){case"running":case"steering":case"verifying":case"created":return"running";case"completed":return"review";case"merged":return"done";case"failed":return"failed";case"cancelled":return"failed";case"paused":return"done";case"merge-conflict":return"conflict";default:return e.column}}function le(e){return e.merge&&e.merge.status==="merge-conflict"?"conflict":e.blocked?"blocked":e.delivery?.required&&e.status==="completed"?e.delivery.status==="blocked"||e.delivery.status==="failed"?"delivery blocked":vt(e)?"deployed":"delivery proof needed":e.status||e.column}function ht(e){return["running","steering","verifying","created"].includes(e.status)}function ce(e){return e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}k`:String(e)}function yt(){let[e,t]=w(null),[s,a]=w(null);return P(()=>{let r=!1;return rt().then(i=>{r||t(i.projects??[])}).catch(i=>{r||a(String(i?.message??i))}),()=>{r=!0}},[]),n("div",{class:"page",children:[n("header",{class:"topbar",children:[n("div",{class:"brand",children:[n("span",{class:"brand-mark",children:"\u25B0"}),n("span",{class:"brand-name",children:"Rudder"}),n("span",{class:"brand-sub mono",children:"board"})]}),n("div",{class:"toolbar-actions",children:n("a",{class:"btn",href:"/usage",title:"Quota meters, token costs, machine resources",children:"Usage"})})]}),n("main",{class:"index-main",children:[n("h1",{class:"index-title",children:"Projects"}),n("p",{class:"index-lede",children:"Local agent runs, projected live. Pick a repo."}),s&&n("div",{class:"banner banner-error mono",children:["failed to load projects: ",s]}),e===null&&!s&&n("div",{class:"tile-grid",children:[n(xe,{}),n(xe,{}),n(xe,{})]}),e!==null&&e.length===0&&n("div",{class:"empty",children:[n("div",{class:"empty-title",children:"no projects yet"}),n("div",{class:"empty-sub mono",children:"start a run in any repo and it registers here"})]}),e!==null&&e.length>0&&n("div",{class:"tile-grid",children:e.map(r=>n(Ot,{project:r},r.slug))})]})]})}function Ot({project:e}){let t=e.counts,s=()=>{window.location.href=`/rudder/${encodeURIComponent(e.slug)}`},a=[{token:"running",label:"running",n:t.running},{token:"review",label:"review",n:t.review},{token:"todo",label:"todo",n:t.todo},{token:"done",label:"done",n:t.done},{token:"blocked",label:"blocked",n:t.blocked},{token:"failed",label:"failed",n:t.failed}];return n("button",{class:"tile",onClick:s,type:"button",children:[n("div",{class:"tile-head",children:n("span",{class:"tile-name",children:e.name})}),n("div",{class:"tile-path mono",children:e.repoRoot}),n("div",{class:"tile-counts",children:a.map(r=>n("span",{class:`count count-${r.token}`,"data-zero":r.n===0,children:[n("span",{class:"count-n mono",children:r.n}),n("span",{class:"count-label",children:r.label})]},r.label))})]})}function xe(){return n("div",{class:"tile tile-skeleton","aria-hidden":"true",children:[n("div",{class:"skel skel-line",style:"width: 52%"}),n("div",{class:"skel skel-line",style:"width: 78%"}),n("div",{class:"skel skel-row"})]})}var bt="rudder.board.view";function Ft(){try{let e=localStorage.getItem(bt);if(e==="board"||e==="nest"||e==="activity"||e==="memory")return e}catch{}return"board"}function kt({slug:e}){let{state:t,conn:s,name:a}=_t(e),[r,i]=w(Ft),[l,u]=w(null),d=D(null),c=window.__RUDDER_CONTROL_MODE__??"projector",p=window.__RUDDER_CAN_MUTATE__!==!1,o=b=>{i(b);try{localStorage.setItem(bt,b)}catch{}},_=j(()=>Array.from(t.nodes.values()),[t.nodes]),f=l?t.nodes.get(l)??null:null,h=(b,y)=>{d.current=y,u(b)};return n("div",{class:"page board-page",children:[n(Ht,{slug:e,name:a||e,conn:s,view:r,onView:o,memoryCount:t.memory.length,latestActivity:t.activity.length?t.activity[t.activity.length-1]:null,canMutate:p}),n("main",{class:"board-main",children:!t.loaded&&s!=="reconnecting"?n(rn,{}):r==="board"?n(Vt,{nodes:_,onOpen:h,selected:l}):r==="nest"?n(zt,{nodes:_,edges:t.edges,onOpen:h,selected:l}):r==="activity"?n(nn,{slug:e,activity:t.activity,canSteerConductor:p&&c==="projector"}):n(sn,{memory:t.memory})}),f&&n(Xt,{slug:e,node:f,onClose:()=>u(null),returnFocus:d.current,canMutate:p})]})}function Ht({slug:e,name:t,conn:s,view:a,onView:r,memoryCount:i,latestActivity:l,canMutate:u}){let[d,c]=w(!1);return n("header",{class:"topbar board-topbar",children:[n("div",{class:"brand",children:[n("a",{class:"brand-link",href:"/rudder",title:"Back to all projects",children:[n("span",{class:"brand-mark",children:"\u25B0"}),n("span",{class:"brand-back",children:"\u2190 all projects"})]}),n("span",{class:"brand-name",children:t}),n(Kt,{conn:s}),l&&a!=="activity"&&n("button",{type:"button",class:"activity-ticker mono",title:"Latest activity \u2014 click for the full feed",onClick:()=>r("activity"),children:[n("span",{class:"pulse-dot","aria-hidden":"true"}),n("span",{class:"activity-ticker-text",children:l.text})]})]}),n("div",{class:"toolbar-actions",children:[n("a",{class:"btn",href:"/usage",title:"Quota meters, token costs, machine resources",children:"Usage"}),n("div",{class:"view-toggle",role:"group","aria-label":"View",children:[n("button",{type:"button","aria-pressed":a==="board",class:`toggle ${a==="board"?"toggle-on":""}`,onClick:()=>r("board"),children:"Board"}),n("button",{type:"button","aria-pressed":a==="nest",class:`toggle ${a==="nest"?"toggle-on":""}`,onClick:()=>r("nest"),title:"Nest / DAG view",children:"Nest"}),n("button",{type:"button","aria-pressed":a==="activity",class:`toggle ${a==="activity"?"toggle-on":""}`,onClick:()=>r("activity"),title:"Live activity feed",children:"Activity"}),n("button",{type:"button","aria-pressed":a==="memory",class:`toggle ${a==="memory"?"toggle-on":""}`,onClick:()=>r("memory"),children:["Memory",i>0&&n("span",{class:"toggle-badge mono",children:i})]})]}),u?n("button",{type:"button",class:"btn btn-accent",onClick:()=>c(!0),children:"+ Task"}):n("span",{class:"readonly-pill mono",title:"Open this project's own Rudder board to make changes",children:"read-only"})]}),d&&n(Wt,{slug:e,onClose:()=>c(!1)})]})}function Kt({conn:e}){if(e==="live")return n("span",{class:"conn conn-live",title:"Live",children:[n("span",{class:"conn-dot"}),n("span",{class:"conn-label mono",children:"live"})]});let t=e==="connecting"?"connecting":"reconnecting";return n("span",{class:"conn conn-warn",title:t,children:[n("span",{class:"conn-dot conn-dot-pulse"}),n("span",{class:"conn-label mono",children:t})]})}function Wt({slug:e,onClose:t}){let[s,a]=w(""),[r,i]=w(!1),[l,u]=w(null),[d,c]=w(null),p=D(null),o=D(null),_=D(!1),f=D(t);f.current=t,_.current=r,P(()=>{let y=document.activeElement;p.current?.focus();let g=v=>{if(v.key==="Escape"){v.preventDefault(),_.current||f.current();return}if(v.key!=="Tab"||!o.current)return;let m=Array.from(o.current.querySelectorAll('button:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')),k=m[0],E=m[m.length-1];k&&E&&v.shiftKey&&document.activeElement===k?(v.preventDefault(),E.focus()):k&&E&&!v.shiftKey&&document.activeElement===E&&(v.preventDefault(),k.focus())};return window.addEventListener("keydown",g),()=>{window.removeEventListener("keydown",g),y?.focus()}},[]),P(()=>{if(d?.state!=="queued"||!d.requestId)return;let y=!1,g,v=async()=>{try{let m=await we(e,d.requestId);if(y)return;if(m.status==="delivered"){c({requestId:m.requestId,state:"delivered",message:"Delivered to the native conductor"});return}if(m.status==="failed"){c(null),u(m.error||"The native conductor could not accept the task");return}}catch{}y||(g=window.setTimeout(v,500))};return g=window.setTimeout(v,250),()=>{y=!0,g!==void 0&&window.clearTimeout(g)}},[e,d?.state,d?.requestId]);let h=async()=>{let y=s.trim();if(!(!y||r)){i(!0),u(null),c(null);try{let g=await it(e,y);if(g.status==="queued"){a(""),c({requestId:g.requestId,state:"queued",message:"Queued for the native conductor"}),i(!1);return}if(g.status==="failed")throw new Error("The task could not be delivered to the conductor");t()}catch(g){u(String(g?.message??g)),i(!1)}}};return n("div",{class:"overlay",onClick:()=>{r||t()},children:n("form",{ref:o,class:"composer",onClick:y=>y.stopPropagation(),onSubmit:y=>{y.preventDefault(),h()},role:"dialog","aria-modal":"true","aria-labelledby":"new-task-title","aria-busy":r,children:[n("div",{class:"composer-head",children:[n("span",{class:"composer-title",id:"new-task-title",children:"New task"}),n("span",{class:"composer-hint mono",id:"new-task-hint",children:"\u2318/Ctrl + Enter to run \xB7 Esc to close"})]}),n("label",{class:"sr-only",for:"new-task-prompt",children:"Task description"}),n("textarea",{ref:p,id:"new-task-prompt",class:"composer-input mono",rows:5,placeholder:"Describe the task. The agent decomposes and schedules it.",value:s,"aria-describedby":"new-task-hint",onInput:y=>a(y.target.value),onKeyDown:y=>{(y.metaKey||y.ctrlKey)&&y.key==="Enter"&&(y.preventDefault(),h())},readOnly:r}),l&&n("div",{class:"banner banner-error mono",role:"alert",children:l}),d&&n("div",{class:"banner mono",role:"status",children:d.message}),n("div",{class:"composer-actions",children:[n("button",{type:"button",class:"btn",onClick:t,disabled:r,children:d?"Close":"Cancel"}),n("button",{type:"submit",class:"btn btn-accent",disabled:r||!s.trim(),children:r?"Running\u2026":"Run task"})]})]})})}function Vt({nodes:e,onOpen:t,selected:s}){let a=j(()=>{let r={todo:[],running:[],review:[],done:[]};for(let i of e)(r[i.column]??r.todo).push(i);for(let i of Object.keys(r))r[i].sort((l,u)=>l.updatedAt<u.updatedAt?1:-1);return r},[e]);return n("div",{class:"board",children:gt.map(r=>{let i=a[r.key];return n("section",{class:"column","data-column":r.key,children:[n("header",{class:"column-head",children:[n("span",{class:"column-title",children:r.label}),n("span",{class:"column-count mono",children:i.length})]}),n("div",{class:"column-body",children:i.length===0?n("div",{class:"column-empty mono",children:"empty"}):i.map(l=>n(Qt,{node:l,onOpen:t,selected:s===l.id},l.id))})]},r.key)})})}function Qt({node:e,onOpen:t,selected:s}){let a=Ee(e),r=ht(e),i=e.deps.hard.length+e.deps.soft.length;return n("article",{class:`card ${s?"card-selected":""}`,"data-status":a,"data-task-id":e.id,tabIndex:0,role:"button","aria-haspopup":"dialog","aria-expanded":s,onClick:l=>t(e.id,l.currentTarget),onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),t(e.id,l.currentTarget))},children:[n("div",{class:"card-spine","data-status":a}),n("div",{class:"card-body",children:[n("div",{class:"card-top",children:[n("span",{class:"card-status mono","data-status":a,children:le(e)}),e.blocked&&n("span",{class:"flag flag-blocked mono",children:"blocked"})]}),n("h3",{class:"card-title",children:e.title}),n("div",{class:"card-meta mono",children:[n("span",{class:"card-backend",children:e.backend}),e.model&&n("span",{class:"card-model",children:e.model}),e.effort&&n("span",{class:"card-effort",children:e.effort})]}),e.delivery?.required&&n("div",{class:"card-lastline mono",children:n("span",{class:"lastline-text",children:["delivery ",e.delivery.status," \xB7 ",e.delivery.target??"target not recorded",e.delivery.checks?.length?` \xB7 ${e.delivery.checks.length} check${e.delivery.checks.length===1?"":"s"}`:""]})}),e.lastLine&&n("div",{class:"card-lastline mono",children:[r&&n("span",{class:"pulse-dot","aria-hidden":"true"}),n("span",{class:"lastline-text",children:e.lastLine})]}),n("div",{class:"card-foot",children:[e.tokens&&n("span",{class:"tokens mono",title:"input / output tokens",children:[n("span",{class:"tok-in",children:["\u2193",ce(e.tokens.input)]}),n("span",{class:"tok-out",children:["\u2191",ce(e.tokens.output)]})]}),i>0&&n("span",{class:"dep-badge mono",title:"upstream dependencies",children:[e.deps.hard.length>0&&n("span",{class:"dep dep-hard",title:`${e.deps.hard.length} hard dependency(ies)`,children:["\u2191",e.deps.hard.length," hard"]}),e.deps.soft.length>0&&n("span",{class:"dep dep-soft",title:`${e.deps.soft.length} soft dependency(ies)`,children:["\u2191",e.deps.soft.length," soft"]})]})]})]})]})}var S={boxW:220,boxH:64,gapX:96,gapY:26,padX:40,padY:40,spineW:5};function Gt(e,t){let s=new Map;for(let l of e)s.set(l.id,l.deps.hard.filter(u=>t.has(u)&&u!==l.id));let a=new Map,r=new Set,i=l=>{let u=a.get(l);if(u!==void 0)return u;if(r.has(l))return 0;r.add(l);let d=s.get(l)??[],c=-1;for(let o of d)c=Math.max(c,i(o));r.delete(l);let p=c+1;return a.set(l,p),p};for(let l of e)i(l.id);return a}function Yt(e){let t=new Set(e.map(p=>p.id)),s=Gt(e,t),a=new Map;for(let p of e){let o=s.get(p.id)??0,_=a.get(o);_?_.push(p):a.set(o,[p])}let r=new Map,i=Array.from(a.keys()).sort((p,o)=>p-o),l=0;for(let p of i){let o=a.get(p);o.sort((h,b)=>h.createdAt!==b.createdAt?h.createdAt<b.createdAt?-1:1:h.id<b.id?-1:1);let _=S.padX+p*(S.boxW+S.gapX),f=S.padY;for(let h of o)r.set(h.id,{x:_,y:f}),f+=S.boxH+S.gapY;l=Math.max(l,f-S.gapY)}let u=i.length?i[i.length-1]:0,d=S.padX*2+(u+1)*S.boxW+u*S.gapX,c=Math.max(l+S.padY,S.padY*2+S.boxH);return{pos:r,width:d,height:c}}function Jt(e,t){return e.length<=t?e:`${e.slice(0,Math.max(0,t-1)).trimEnd()}\u2026`}function zt({nodes:e,edges:t,onOpen:s,selected:a}){let r=j(()=>Yt(e),[e]),i=j(()=>new Set(e.map(d=>d.id)),[e]);if(e.length===0)return n("div",{class:"empty",children:[n("div",{class:"empty-title",children:"no tasks in the graph yet"}),n("div",{class:"empty-sub mono",children:"the dependency DAG renders here once tasks exist"})]});let l=t.filter(d=>i.has(d.from)&&i.has(d.to)),u=d=>{let c=r.pos.get(d.from),p=r.pos.get(d.to);if(!c||!p)return null;let o=c.x+S.boxW,_=c.y+S.boxH/2,f=p.x,h=p.y+S.boxH/2,b=Math.max(28,(f-o)/2);return`M ${o} ${_} C ${o+b} ${_}, ${f-b} ${h}, ${f} ${h}`};return n("div",{class:"nest",children:n("svg",{class:"nest-svg",width:r.width,height:r.height,viewBox:`0 0 ${r.width} ${r.height}`,role:"group","aria-label":"Task dependency graph",children:[n("defs",{children:[n("marker",{id:"arrow",viewBox:"0 0 10 10",refX:"9",refY:"5",markerWidth:"7",markerHeight:"7",orient:"auto-start-reverse",children:n("path",{d:"M 0 0 L 10 5 L 0 10 z",class:"arrow-head"})}),n("marker",{id:"arrow-soft",viewBox:"0 0 10 10",refX:"9",refY:"5",markerWidth:"6",markerHeight:"6",orient:"auto-start-reverse",children:n("path",{d:"M 0 0 L 10 5 L 0 10 z",class:"arrow-head-soft"})})]}),n("g",{class:"nest-edges",children:l.map((d,c)=>{let p=u(d);return p?n("path",{d:p,fill:"none",class:d.kind==="hard"?"edge edge-hard":"edge edge-soft"},`${d.from}->${d.to}:${d.kind}:${c}`):null})}),n("g",{class:"nest-nodes",children:e.map(d=>{let c=r.pos.get(d.id);if(!c)return null;let p=Ee(d),o=a===d.id,_=f=>s(d.id,f);return n("g",{class:`node ${o?"node-selected":""}`,"data-status":p,"data-task-id":d.id,transform:`translate(${c.x} ${c.y})`,tabIndex:0,role:"button","aria-label":`${le(d)}: ${d.title}`,"aria-haspopup":"dialog","aria-expanded":o,onClick:f=>_(f.currentTarget),onKeyDown:f=>{(f.key==="Enter"||f.key===" ")&&(f.preventDefault(),_(f.currentTarget))},children:[n("rect",{class:"node-box",x:"0",y:"0",width:S.boxW,height:S.boxH}),n("rect",{class:"node-spine",x:"0",y:"0",width:S.spineW,height:S.boxH}),n("text",{class:"node-status mono",x:S.spineW+12,y:"22",children:le(d)}),n("text",{class:"node-title",x:S.spineW+12,y:"44",children:Jt(d.title,30)})]},d.id)})})]})})}function Xt({slug:e,node:t,onClose:s,returnFocus:a,canMutate:r}){let[i,l]=w(null),[u,d]=w(null),[c,p]=w({busy:!1,msg:null,err:null}),o=D(null),_=D(s);_.current=s;let f=Ee(t),h=ht(t),b=t.status==="completed"||t.status==="review",y=b||t.column==="review",g=h||b,v=b&&!h,m=t.runId??t.id,k=`task-update-${t.id.replace(/[^A-Za-z0-9_-]/g,"-")}`;P(()=>{let x=a??document.activeElement,M=window.requestAnimationFrame(()=>{(o.current?.querySelector("[data-autofocus]")??o.current)?.focus()}),$=N=>{if(N.key==="Escape"){N.preventDefault(),_.current();return}if(N.key!=="Tab"||!o.current)return;let W=Array.from(o.current.querySelectorAll('a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex="-1"])'));if(W.length===0){N.preventDefault(),o.current.focus();return}let Te=W[0],Me=W[W.length-1];N.shiftKey&&document.activeElement===Te?(N.preventDefault(),Me.focus()):!N.shiftKey&&document.activeElement===Me&&(N.preventDefault(),Te.focus())};return window.addEventListener("keydown",$),()=>{window.cancelAnimationFrame(M),window.removeEventListener("keydown",$),x?.isConnected?x.focus():Array.from(document.querySelectorAll("[data-task-id]")).find(W=>W.getAttribute("data-task-id")===t.id)?.focus()}},[t.id]),P(()=>{let x=!1;return l(null),d(null),ot(e,m,200).then(M=>{x||l(M)}).catch(M=>{x||d(String(M?.message??M))}),()=>{x=!0}},[e,m]);let E=j(()=>{let x=i??"";return!t.lastLine||x.trimEnd().endsWith(t.lastLine.trimEnd())?x:x?`${x}
2
+ ${t.lastLine}`:t.lastLine},[i,t.lastLine]),H=async()=>{p({busy:!0,msg:null,err:null});try{let x=await lt(e,m);if(x.status==="merge-conflict"||x.status==="conflict"||x.status==="blocked"){let $=x.conflictedFiles?.length??0;p({busy:!1,msg:null,err:$?`conflict in ${$} file(s)`:"merge conflict"})}else p({busy:!1,msg:x.status,err:null})}catch(x){p({busy:!1,msg:null,err:String(x?.message??x)})}},I=async()=>{p({busy:!0,msg:null,err:null});try{await ct(e,m),p({busy:!1,msg:"cancel requested",err:null})}catch(x){p({busy:!1,msg:null,err:String(x?.message??x)})}};return n("div",{class:"drawer-overlay",onClick:s,children:n("aside",{ref:o,class:"drawer",onClick:x=>x.stopPropagation(),"data-status":f,role:"dialog","aria-modal":"true","aria-labelledby":"task-detail-title",tabIndex:-1,children:[n("div",{class:"drawer-spine","data-status":f}),n("header",{class:"drawer-head",children:[n("div",{class:"drawer-head-top",children:[n("span",{class:"card-status mono","data-status":f,children:le(t)}),n("button",{type:"button",class:"drawer-close",onClick:s,"aria-label":"Close",children:"\u2715"})]}),n("h2",{class:"drawer-title",id:"task-detail-title",children:t.title}),n("div",{class:"drawer-meta mono",children:[n("span",{children:t.backend}),t.model&&n("span",{children:t.model}),t.effort&&n("span",{children:t.effort}),t.tokens&&n("span",{children:["\u2193",ce(t.tokens.input)," \u2191",ce(t.tokens.output)]})]}),t.worktree&&n("div",{class:"drawer-worktree mono",title:t.worktree.path,children:t.worktree.workspaceName??t.worktree.path}),t.delivery?.required&&n("div",{class:"drawer-worktree mono",title:t.delivery.url??t.delivery.appPath??t.delivery.target,children:["delivery ",t.delivery.status," \xB7 ",t.delivery.target??"target not recorded",t.delivery.revision?` \xB7 ${t.delivery.revision}`:""]})]}),r&&n("div",{class:"drawer-actions",children:[y&&n("button",{type:"button",class:"btn btn-accent",onClick:H,disabled:c.busy,children:c.busy?"Merging\u2026":"Merge"}),v&&n("button",{type:"button",class:"btn",onClick:()=>document.getElementById(k)?.focus(),disabled:c.busy,children:"Request changes"}),h&&n("button",{type:"button",class:"btn btn-danger",onClick:I,disabled:c.busy,children:c.busy?"Stopping\u2026":"Stop"}),c.msg&&n("span",{class:"action-msg","aria-live":"polite",children:c.msg}),c.err&&n("span",{class:"action-err",role:"alert",children:c.err})]}),n("div",{class:"drawer-scroll",children:[n(Zt,{updates:t.updates??[],lastLine:t.lastLine}),n("div",{class:"drawer-log",children:[n("div",{class:"drawer-log-head mono",children:[n("span",{children:"Worker log"}),h&&n("span",{class:"pulse-dot","aria-hidden":"true"})]}),n(tn,{text:E,error:u,loading:i===null&&!u})]})]}),r&&g&&n("div",{class:"drawer-steer",children:n(wt,{slug:e,targetId:m,inputId:k,label:v?"Request changes":"Send update",submitLabel:v?"Request changes":"Send update",placeholder:v?"Describe what should change before this task is merged.":"Add context or redirect this worker.",autoFocus:!0})})]})})}function Zt({updates:e,lastLine:t}){let s=e.filter(a=>a.instruction.trim());return n("section",{class:"task-updates","aria-labelledby":"task-updates-title",children:[n("div",{class:"task-updates-head",children:[n("h3",{id:"task-updates-title",children:"Updates"}),s.length>0&&n("span",{class:"task-updates-count mono",children:s.length})]}),n("div",{class:"task-thread",children:[s.length===0&&!t&&n("p",{class:"task-thread-empty",children:"No updates have been sent yet."}),s.map((a,r)=>n("article",{class:"task-update task-update-user",children:[n("div",{class:"task-update-avatar","aria-hidden":"true",children:"Y"}),n("div",{class:"task-update-body",children:[n("div",{class:"task-update-meta",children:[n("span",{children:en(a.source)}),n("time",{class:"mono",dateTime:a.ts,children:xt(a.ts)})]}),n("p",{children:a.instruction})]})]},`${a.ts}-${r}`)),t&&n("article",{class:"task-update task-update-agent",children:[n("div",{class:"task-update-avatar task-update-avatar-agent","aria-hidden":"true",children:"R"}),n("div",{class:"task-update-body",children:[n("div",{class:"task-update-meta",children:n("span",{children:"Latest from worker"})}),n("p",{class:"mono",children:t})]})]})]})]})}function en(e){let t=(e??"").trim().toLowerCase();return!t||t==="user"||t==="web"||t==="operator"||t==="regoal"?"You":t==="steerer"||t==="rudder"?"Rudder":e??"You"}function tn({text:e,error:t,loading:s}){let a=D(null);return P(()=>{let r=a.current;r&&(r.scrollTop=r.scrollHeight)},[e]),t?n("div",{class:"banner banner-error mono",children:["log unavailable: ",t]}):s?n("div",{class:"log-pre log-loading mono","aria-label":"Loading worker log",children:[n("div",{class:"skel skel-line",style:"width:70%"}),n("div",{class:"skel skel-line",style:"width:90%"}),n("div",{class:"skel skel-line",style:"width:55%"})]}):n("pre",{ref:a,class:"log-pre mono",children:e||"no output yet"})}function ft(e){return e.status==="failed"?e.error||"Delivery failed":e.status==="accepted"?e.mode==="resumed"?"Accepted \xB7 agent is resuming":"Accepted \xB7 agent is restarting":e.status==="delivered"?e.mode==="resumed"?"Delivered \xB7 agent resumed":"Delivered to agent":e.mode==="resumed"?"Queued \xB7 agent is resuming":e.mode==="redirected"?"Queued for the live agent":"Queued for delivery"}function wt({slug:e,targetId:t,inputId:s,label:a,submitLabel:r,placeholder:i,autoFocus:l=!1}){let[u,d]=w(""),[c,p]=w(!1),[o,_]=w(null),[f,h]=w(null);P(()=>{if(o?.state!=="queued"||!o.requestId||window.__RUDDER_CONTROL_MODE__!=="projector")return;let g=!1,v,m=async()=>{try{let k=await we(e,o.requestId);if(g)return;if(k.status==="delivered"||k.status==="failed"){_(E=>E?.requestId===k.requestId?{...E,state:k.status,message:ft(k)}:E);return}}catch{}g||(v=window.setTimeout(m,500))};return v=window.setTimeout(m,250),()=>{g=!0,v!==void 0&&window.clearTimeout(v)}},[e,o?.state,o?.requestId]);let b=async()=>{let g=u.trim();if(!(!g||c)){p(!0),_({instruction:g,state:"sending",message:"Sending request\u2026"}),h(null);try{let v=await dt(e,t,g);d(""),_({instruction:g,requestId:v.requestId,state:v.status,message:ft(v)})}catch(v){_(null),h(String(v?.message??v))}finally{p(!1)}}},y=g=>{(g.metaKey||g.ctrlKey)&&g.key==="Enter"&&(g.preventDefault(),b())};return n("form",{class:"steer",onSubmit:g=>{g.preventDefault(),b()},"aria-busy":c,children:[n("label",{class:"steer-label",for:s,children:a}),n("textarea",{id:s,class:"steer-input",rows:3,maxLength:8e3,placeholder:i,value:u,disabled:c,"data-autofocus":l?"true":void 0,"aria-describedby":`${s}-hint${o?` ${s}-status`:""}`,onInput:g=>{d(g.target.value),f&&h(null)},onKeyDown:y}),n("div",{class:"steer-actions",children:[n("span",{class:"steer-hint",id:`${s}-hint`,children:"\u2318/Ctrl + Enter to send"}),n("button",{type:"submit",class:"btn btn-accent",disabled:c||!u.trim(),children:c?"Sending\u2026":r})]}),o&&n("div",{class:`steer-feedback steer-feedback-${o.state}`,id:`${s}-status`,"aria-live":"polite",children:[n("span",{class:"steer-feedback-state",children:o.message}),n("span",{class:"steer-feedback-text",children:o.instruction})]}),f&&n("div",{class:"action-err steer-error",role:"alert",children:["Could not send: ",f]})]})}function nn({slug:e,activity:t,canSteerConductor:s}){let a=D(null);return P(()=>{let r=a.current;r&&(r.scrollTop=r.scrollHeight)},[t]),n("div",{class:"activity",children:[s&&n("div",{class:"activity-steer",children:n(wt,{slug:e,targetId:"conductor",inputId:"conductor-update",label:"Message conductor",submitLabel:"Send update",placeholder:"Tell the live orchestrator what to do next."})}),t.length===0?n("div",{class:"empty",children:[n("div",{class:"empty-title",children:"no activity yet"}),n("div",{class:"empty-sub mono",children:"the conductor narrates what it is doing here as work runs"})]}):n("div",{class:"activity-feed",ref:a,children:t.map((r,i)=>n("div",{class:`activity-entry activity-${r.kind}`,children:[n("span",{class:"activity-dot","aria-hidden":"true"}),n("span",{class:"activity-text",children:r.text}),r.ts&&n("span",{class:"activity-ts mono",children:xt(r.ts)})]},`${r.ts??""}-${i}`))})]})}function xt(e){let t=/^\d{10,}$/.test(e.trim())?Number(e):e,s=new Date(t);return Number.isNaN(s.getTime())?"":s.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}function sn({memory:e}){return e.length===0?n("div",{class:"empty",children:[n("div",{class:"empty-title",children:"no decisions recorded yet"}),n("div",{class:"empty-sub mono",children:"agents append cross-cutting decisions here as they work"})]}):n("div",{class:"memory",children:e.map((t,s)=>n("article",{class:"memory-entry",children:[n("div",{class:"memory-bead","aria-hidden":"true"}),n("div",{class:"memory-content",children:[n("p",{class:"memory-text",children:t.text}),n("div",{class:"memory-meta mono",children:[t.owner&&n("span",{class:"memory-owner",children:t.owner}),t.ts&&n("span",{class:"memory-ts",children:t.ts})]})]})]},s))})}function rn(){return n("div",{class:"board","aria-hidden":"true",children:gt.map(e=>n("section",{class:"column",children:[n("header",{class:"column-head",children:[n("span",{class:"column-title",children:e.label}),n("span",{class:"column-count mono",children:"\xB7"})]}),n("div",{class:"column-body",children:[n("div",{class:"card card-skeleton",children:[n("div",{class:"skel skel-line",style:"width:60%"}),n("div",{class:"skel skel-line",style:"width:85%"})]}),e.key==="running"&&n("div",{class:"card card-skeleton",children:[n("div",{class:"skel skel-line",style:"width:70%"}),n("div",{class:"skel skel-line",style:"width:50%"})]})]})]},e.key))})}var Re={claude:"Claude Code",codex:"Codex"};function Q(e){return e>=100?`$${e.toFixed(0)}`:e>=10?`$${e.toFixed(1)}`:`$${e.toFixed(2)}`}function U(e){return e>=1e9?`${(e/1e9).toFixed(2)}B`:e>=1e6?`${(e/1e6).toFixed(2)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(Math.round(e))}function q(e){return e>=1<<30?`${(e/(1<<30)).toFixed(2)} GB`:e>=1<<20?`${(e/(1<<20)).toFixed(0)} MB`:`${(e/1024).toFixed(0)} KB`}function Se(e){return e.input+e.output+e.cacheWrite+e.cacheRead}function F(e,t){return t==="cost"?e.cost:Se(e)}function K(e,t){return t==="cost"?Q(e):U(e)}function an(e,t){if(!e)return"";let s=new Date(e).getTime()-t;if(Number.isNaN(s))return"";if(s<=0)return"resets now";let a=Math.round(s/6e4);if(a<60)return`resets in ${a}m`;let r=Math.floor(a/60);return r<24?`resets in ${r}h ${a%60}m`:`resets in ${Math.floor(r/24)}d ${r%24}h`}function Et(e){return e.replace(/^claude-/,"").replace(/-\d{8}$/,"")}function on(e){let[,t,s]=e.split("-");return`${Number(t)}/${Number(s)}`}function Rt(){let[e,t]=w("tokens");return n("div",{class:"page usage-page",children:[n("header",{class:"topbar",children:[n("div",{class:"brand",children:[n("a",{class:"brand-link",href:"/rudder",title:"Back to all projects",children:[n("span",{class:"brand-mark",children:"\u25B0"}),n("span",{class:"brand-back",children:"\u2190 all projects"})]}),n("span",{class:"brand-name",children:"Usage"}),n("span",{class:"brand-sub mono",children:"this machine"})]}),n("div",{class:"toolbar-actions",children:n("div",{class:"view-toggle",role:"group","aria-label":"Usage view",children:[n("button",{type:"button","aria-pressed":e==="tokens",class:`toggle ${e==="tokens"?"toggle-on":""}`,onClick:()=>t("tokens"),children:"Token usage"}),n("button",{type:"button","aria-pressed":e==="machine",class:`toggle ${e==="machine"?"toggle-on":""}`,onClick:()=>t("machine"),children:"Machine resources"})]})})]}),n("main",{class:"usage-main",children:e==="tokens"?n(un,{}):n(gn,{})})]})}function ln(){let[e,t]=w(null),[s,a]=w(null),[r,i]=w(!1),[l,u]=w(Date.now()),d=c=>{i(!0),nt(c).then(p=>{t(p),a(null)}).catch(p=>a(String(p?.message??p))).finally(()=>i(!1))};return P(()=>{d(!1);let c=setInterval(()=>u(Date.now()),3e4),p=setInterval(()=>d(!1),5*6e4);return()=>{clearInterval(c),clearInterval(p)}},[]),n("section",{class:"usage-section",children:[n("div",{class:"usage-section-head",children:[n("h2",{class:"usage-h2",children:"Subscription quota"}),n("div",{class:"usage-section-actions",children:[e&&n("span",{class:"usage-muted mono",children:["refreshed ",new Date(e.fetchedAt).toLocaleTimeString()," \xB7 every ",Math.round(e.ttlSeconds/60),"m"]}),n("button",{type:"button",class:"btn",disabled:r,onClick:()=>d(!0),children:r?"refreshing\u2026":"refresh"})]})]}),s&&n("div",{class:"banner banner-error mono",children:["quota failed: ",s]}),n("div",{class:"quota-grid",children:[(e?.accounts??[]).map(c=>n(dn,{account:c,now:l},c.provider)),!e&&!s&&n(A,{children:[n("div",{class:"quota-card quota-card-skeleton"}),n("div",{class:"quota-card quota-card-skeleton"})]})]}),n("p",{class:"usage-note",children:"Read from the providers' own usage endpoints with the sign-ins the CLIs already hold. Rudder never handles a password and never stores a token."})]})}function cn(e){return e>=90?"meter-fill meter-hot":e>=70?"meter-fill meter-warm":"meter-fill"}function dn({account:e,now:t}){return n("div",{class:`quota-card ${e.error?"quota-card-error":""}`,children:[n("div",{class:"quota-head",children:[n("span",{class:`provider-dot provider-${e.provider}`,"aria-hidden":"true"}),n("span",{class:"quota-provider",children:Re[e.provider]}),e.plan&&n("span",{class:"quota-plan mono",children:e.plan})]}),e.email&&n("div",{class:"quota-email mono",children:e.email}),e.error?n("div",{class:"quota-error mono",children:e.error}):n("div",{class:"meters",children:e.windows.map(s=>n("div",{class:"meter",children:[n("div",{class:"meter-row",children:[n("span",{class:"meter-label",children:s.label}),n("span",{class:"meter-value mono",children:[s.percent,"%"]})]}),n("div",{class:"meter-track",role:"progressbar","aria-valuenow":s.percent,"aria-valuemin":0,"aria-valuemax":100,children:n("div",{class:cn(s.percent),style:{width:`${Math.min(100,s.percent)}%`}})}),n("div",{class:"meter-reset mono",children:an(s.resetsAt,t)})]},s.label))})]})}function un(){let[e,t]=w("30d"),[s,a]=w(null),[r,i]=w(null);return P(()=>{let l=!1;return a(null),tt(e).then(u=>{l||(a(u),i(null))}).catch(u=>{l||i(String(u?.message??u))}),()=>{l=!0}},[e]),n(A,{children:[n(ln,{}),n(pn,{report:s,error:r,range:e,onRange:t})]})}function pn({report:e,error:t,range:s,onRange:a}){let[r,i]=w("cost"),[l,u]=w(new Set),[d,c]=w(null),[p,o]=w(null),[_,f]=w(null),[h,b]=w(!1),y=m=>{u(k=>{let E=new Set(k);return E.has(m)?E.delete(m):E.add(m),E})},g=j(()=>{if(!e)return 0;let m=0;for(let k of["claude","codex"])l.has(k)||(m+=F(e.providers[k],r));return m},[e,l,r]),v=e?.days.find(m=>m.day===d)??null;return n(A,{children:n("section",{class:"usage-section",children:[n("div",{class:"usage-section-head",children:[n("h2",{class:"usage-h2",children:"Token usage"}),n("div",{class:"usage-section-actions",children:[n("div",{class:"view-toggle",role:"group","aria-label":"Metric",children:["cost","tokens"].map(m=>n("button",{type:"button","aria-pressed":r===m,class:`toggle ${r===m?"toggle-on":""}`,onClick:()=>i(m),children:m==="cost"?"Cost":"Tokens"},m))}),n("div",{class:"view-toggle",role:"group","aria-label":"Range",children:["7d","30d","90d"].map(m=>n("button",{type:"button","aria-pressed":s===m,class:`toggle ${s===m?"toggle-on":""}`,onClick:()=>a(m),children:m},m))})]})]}),t&&n("div",{class:"banner banner-error mono",children:["usage failed: ",t]}),!e&&!t&&n("div",{class:"usage-loading mono",children:"scanning session logs\u2026"}),e&&n(A,{children:[n("div",{class:"stat-row",children:[n("div",{class:"stat",children:[n("div",{class:"stat-label",children:"Cost to you"}),n("div",{class:"stat-value",children:"$0"}),n("div",{class:"stat-sub",children:"subscription"})]}),n("div",{class:"stat",children:[n("div",{class:"stat-label",children:"At API rates"}),n("div",{class:"stat-value",children:Q(e.total.cost)}),n("div",{class:"stat-sub",children:[U(Se(e.total))," tokens \xB7 ",e.total.calls," calls"]})]}),n("div",{class:"stat",children:[n("div",{class:"stat-label",children:"Caching saved"}),n("div",{class:"stat-value",children:Q(e.total.cacheSavings)}),n("div",{class:"stat-sub",children:[U(e.total.cacheRead)," cache reads"]})]}),n("div",{class:"stat",children:[n("div",{class:"stat-label",children:"Output"}),n("div",{class:"stat-value",children:U(e.total.output)}),n("div",{class:"stat-sub",children:[U(e.total.input+e.total.cacheWrite)," fresh input"]})]})]}),n("div",{class:"provider-chips",children:[["claude","codex"].map(m=>n("button",{type:"button",class:`chip ${l.has(m)?"chip-off":""}`,"aria-pressed":!l.has(m),onClick:()=>y(m),title:"Click to show or hide in the chart",children:[n("span",{class:`provider-dot provider-${m}`,"aria-hidden":"true"}),Re[m],n("span",{class:"chip-value mono",children:K(F(e.providers[m],r),r)})]},m)),n("span",{class:"usage-muted mono",children:[K(g,r)," shown \xB7 ",e.scannedFiles," logs"]})]}),n(_n,{report:e,metric:r,hidden:l,selected:d,onSelect:c}),v&&n("div",{class:"day-detail",children:[n("div",{class:"day-detail-head",children:[n("strong",{children:v.day}),n("button",{type:"button",class:"btn",onClick:()=>c(null),children:"close"})]}),n("div",{class:"day-detail-grid",children:["claude","codex"].map(m=>n("div",{class:"day-detail-cell",children:[n("span",{class:`provider-dot provider-${m}`,"aria-hidden":"true"})," ",Re[m],n("div",{class:"mono",children:[Q(v[m].cost)," \xB7 ",U(Se(v[m]))," tokens \xB7 ",v[m].calls," calls"]})]},m))})]}),n("div",{class:"usage-columns",children:[n("div",{children:[n("h3",{class:"usage-h3",children:"Models"}),n("table",{class:"usage-table",children:[n("thead",{children:n("tr",{children:[n("th",{children:"model"}),n("th",{class:"num",children:r==="cost"?"cost":"tokens"}),n("th",{class:"num",children:"output"}),n("th",{class:"num",children:"cache read"}),n("th",{class:"num",children:"sessions"})]})}),n("tbody",{children:[e.models.map(m=>{let k=`${m.provider}:${m.model}`,E=p===k;return n(A,{children:[n("tr",{class:`usage-row ${E?"usage-row-open":""}`,onClick:()=>o(E?null:k),children:[n("td",{children:[n("span",{class:`provider-dot provider-${m.provider}`,"aria-hidden":"true"}),n("span",{class:"mono",children:Et(m.model)})]}),n("td",{class:"num mono",children:K(F(m.totals,r),r)}),n("td",{class:"num mono",children:U(m.totals.output)}),n("td",{class:"num mono",children:U(m.totals.cacheRead)}),n("td",{class:"num mono",children:m.sessions})]},k),E&&n("tr",{class:"usage-drill",children:n("td",{colSpan:5,children:n(mn,{totals:m.totals})})},`${k}-drill`)]})}),e.models.length===0&&n("tr",{children:n("td",{colSpan:5,class:"usage-muted mono",children:"no usage in this range"})})]})]})]}),n("div",{children:[n("div",{class:"usage-h3-row",children:[n("h3",{class:"usage-h3",children:"Workspaces"}),e.projects.length>8&&n("button",{type:"button",class:"btn-link mono",onClick:()=>b(m=>!m),children:h?"top 8":`All ${e.projects.length} \u2192`})]}),n(fn,{projects:h?e.projects:e.projects.slice(0,8),metric:r,selected:_,onSelect:f})]})]}),n("p",{class:"usage-note",children:e.pricingNote})]})]})})}function mn({totals:e}){return n("div",{class:"totals-breakdown mono",children:[n("span",{children:["input ",U(e.input)]}),n("span",{children:["output ",U(e.output)]}),n("span",{children:["cache write ",U(e.cacheWrite)]}),n("span",{children:["cache read ",U(e.cacheRead)]}),n("span",{children:[Q(e.cost)," at API rates"]}),n("span",{children:[Q(e.cacheSavings)," saved by caching"]})]})}function _n({report:e,metric:t,hidden:s,selected:a,onSelect:r}){let l=e.days.map(m=>({day:m.day,claude:s.has("claude")?0:F(m.claude,t),codex:s.has("codex")?0:F(m.codex,t)})),u=Math.max(1e-9,...l.map(m=>m.claude+m.codex)),d=900,c=180,p=44,o=22,_=8,f=d-p-8,h=c-o-_,b=f/Math.max(1,l.length),y=Math.max(2,b*.7),g=l.length>45?10:l.length>14?5:1,v=[0,.5,1].map(m=>({f:m,label:K(u*m,t)}));return n("div",{class:"chart-wrap",children:n("svg",{class:"daily-chart",viewBox:`0 0 ${d} ${c}`,role:"img","aria-label":"Daily usage",children:[v.map(m=>{let k=_+h-h*m.f;return n("g",{children:[n("line",{x1:p,x2:d-8,y1:k,y2:k,class:"chart-grid"}),n("text",{x:p-6,y:k+4,class:"chart-tick","text-anchor":"end",children:m.label})]},m.f)}),l.map((m,k)=>{let E=p+k*b+(b-y)/2,H=m.claude/u*h,I=m.codex/u*h,x=_+h-I,M=x-H,$=a===m.day;return n("g",{class:`chart-bar ${$?"chart-bar-selected":""}`,onClick:()=>r($?null:m.day),children:[n("title",{children:[m.day,": ",K(m.claude+m.codex,t)]}),n("rect",{x:p+k*b,y:_,width:b,height:h,class:"chart-hit"}),n("rect",{x:E,y:x,width:y,height:I,class:"bar-codex"}),n("rect",{x:E,y:M,width:y,height:H,class:"bar-claude"}),k%g===0&&n("text",{x:E+y/2,y:c-6,class:"chart-tick","text-anchor":"middle",children:on(m.day)})]},m.day)})]})})}function fn({projects:e,metric:t,selected:s,onSelect:a}){let r=Math.max(1e-9,...e.map(d=>F(d.totals,t))),[i,l]=w(null),u=d=>{navigator.clipboard?.writeText(d).then(()=>{l(d),setTimeout(()=>l(null),1200)},()=>l(null))};return e.length===0?n("div",{class:"usage-muted mono",children:"no workspaces in this range"}):n("div",{class:"project-bars",children:e.map(d=>{let c=F(d.totals,t),p=s===d.key;return n("div",{class:`project-bar ${p?"project-bar-open":""}`,children:[n("button",{type:"button",class:"project-bar-btn",onClick:()=>a(p?null:d.key),children:[n("div",{class:"project-bar-row",children:[n("span",{class:"project-name",children:d.slug?n("a",{href:`/rudder/${encodeURIComponent(d.slug)}`,onClick:o=>o.stopPropagation(),children:d.name}):d.name}),n("span",{class:"mono project-value",children:K(c,t)})]}),n("div",{class:"project-track",children:n("div",{class:"project-fill",style:{width:`${c/r*100}%`}})}),n("div",{class:"project-path mono",children:d.key})]}),p&&n("div",{class:"project-sessions",children:[n("div",{class:"usage-muted mono",children:"top sessions by cost \xB7 click to copy the id for --resume"}),d.sessions.slice(0,10).map(o=>n("button",{type:"button",class:"session-row",title:`${o.provider} ${o.id}`,onClick:()=>u(o.id),children:[n("span",{class:`provider-dot provider-${o.provider}`,"aria-hidden":"true"}),n("span",{class:"mono session-id",children:i===o.id?"copied \u2713":o.id.slice(0,8)}),n("span",{class:"mono session-model",children:Et(o.model)}),n("span",{class:"mono session-when",children:new Date(o.lastAt).toLocaleString()}),n("span",{class:"mono session-cost",children:K(F(o.totals,t),t)})]},o.id))]})]},d.key)})})}function gn(){let[e,t]=w(null),[s,a]=w(null);return P(()=>{let r=!1,i=()=>st().then(u=>{r||(t(u),a(null))}).catch(u=>{r||a(String(u?.message??u))});i();let l=setInterval(i,2e3);return()=>{r=!0,clearInterval(l)}},[]),s?n("div",{class:"banner banner-error mono",children:["machine failed: ",s]}):e?n(vn,{report:e}):n("div",{class:"usage-loading mono",children:"sampling\u2026"})}function vn({report:e}){let t=e.totalMem-e.freeMem,s=e.byKind.claude.rss+e.byKind.codex.rss+e.byKind.opencode.rss,a=e.byKind.rudder.rss,r=Math.max(0,t-s-a),i=l=>`${(l/e.totalMem*100).toFixed(1)}%`;return n("section",{class:"usage-section",children:[n("div",{class:"usage-section-head",children:[n("h2",{class:"usage-h2",children:"Machine resources"}),n("span",{class:"usage-muted mono",children:["live \xB7 every 2s \xB7 load ",e.load.map(l=>l.toFixed(2)).join(" ")," on ",e.cpus," cores"]})]}),n("div",{class:"stat-row",children:[n("div",{class:"stat",children:[n("div",{class:"stat-label",children:"Rudder"}),n("div",{class:"stat-value",children:q(a)}),n("div",{class:"stat-sub",children:[e.byKind.rudder.cpu.toFixed(1),"% cpu \xB7 ",e.byKind.rudder.count," procs"]})]}),n("div",{class:"stat",children:[n("div",{class:"stat-label",children:"Agents"}),n("div",{class:"stat-value",children:q(s)}),n("div",{class:"stat-sub",children:[(e.byKind.claude.cpu+e.byKind.codex.cpu+e.byKind.opencode.cpu).toFixed(1),"% cpu \xB7"," ",e.byKind.claude.count+e.byKind.codex.count+e.byKind.opencode.count," procs"]})]}),n("div",{class:"stat",children:[n("div",{class:"stat-label",children:"System RAM"}),n("div",{class:"stat-value",children:[q(t)," / ",q(e.totalMem)]}),n("div",{class:"stat-sub",children:[i(t)," in use"]})]})]}),n("div",{class:"ram-bar",role:"img","aria-label":"RAM split",children:[n("div",{class:"ram-seg ram-rudder",style:{width:i(a)},title:`rudder ${q(a)}`}),n("div",{class:"ram-seg ram-agents",style:{width:i(s)},title:`agents ${q(s)}`}),n("div",{class:"ram-seg ram-other",style:{width:i(r)},title:`everything else ${q(r)}`})]}),n("div",{class:"ram-legend mono",children:[n("span",{children:[n("i",{class:"ram-swatch ram-rudder"})," rudder"]}),n("span",{children:[n("i",{class:"ram-swatch ram-agents"})," agents"]}),n("span",{children:[n("i",{class:"ram-swatch ram-other"})," everything else"]}),n("span",{children:["free ",q(e.freeMem)]})]}),n("h3",{class:"usage-h3",children:"Processes"}),n("table",{class:"usage-table",children:[n("thead",{children:n("tr",{children:[n("th",{children:"kind"}),n("th",{children:"pid"}),n("th",{class:"num",children:"cpu"}),n("th",{class:"num",children:"memory"}),n("th",{children:"uptime"}),n("th",{children:"command"})]})}),n("tbody",{children:[e.processes.map(l=>n("tr",{children:[n("td",{children:[n("span",{class:`provider-dot provider-${l.kind}`,"aria-hidden":"true"}),l.kind]}),n("td",{class:"mono",children:l.pid}),n("td",{class:"num mono",children:[l.cpu.toFixed(1),"%"]}),n("td",{class:"num mono",children:q(l.rss)}),n("td",{class:"mono",children:l.elapsed}),n("td",{class:"mono cmd",title:l.command,children:l.command.length>90?`${l.command.slice(0,90)}\u2026`:l.command})]},l.pid)),e.processes.length===0&&n("tr",{children:n("td",{colSpan:6,class:"usage-muted mono",children:"no agent processes running"})})]})]})]})}function hn(){let e=(window.__RUDDER_SLUG__??"").trim();return window.__RUDDER_VIEW__==="usage"?n(Rt,{}):e?n(kt,{slug:e}):n(yt,{})}var St=document.getElementById("app");St&&He(n(hn,{}),St);
@@ -68,6 +68,7 @@ import { continueRun, stopRun } from "../run-manager.js";
68
68
  import { createLogger } from "../logger.js";
69
69
  import { mergeNodeIntoIntegration, reconcileInjection, withSchedulerLock } from "../scheduler.js";
70
70
  import { nowIso } from "../util.js";
71
+ import { fetchQuota, machineResources, scanTokenUsage } from "../usage.js";
71
72
  // dist/board/daemon.js sits next to dist/board/board.{js,css}, so the prebuilt
72
73
  // SPA bundle resolves relative to this module's own URL.
73
74
  const BOARD_JS_PATH = fileURLToPath(new URL("./board.js", import.meta.url));
@@ -186,6 +187,43 @@ async function handleRequest(req, res, bus, controlMode, ownerRepoRoot) {
186
187
  await sendStatic(res, BOARD_CSS_PATH, "text/css; charset=utf-8");
187
188
  return;
188
189
  }
190
+ // Usage dashboard (`U` in the TUI): quota meters, token costs, machine
191
+ // resources. Read-only, machine-wide (not per project), loopback-only like
192
+ // everything else here.
193
+ if (method === "GET" && (pathname === "/usage" || pathname === "/rudder/usage")) {
194
+ sendHtml(res, renderShell("", controlMode, false, "usage"));
195
+ return;
196
+ }
197
+ if (method === "GET" && pathname === "/api/usage/tokens") {
198
+ const raw = url.searchParams.get("range") ?? "30d";
199
+ const range = raw === "7d" || raw === "90d" ? raw : "30d";
200
+ try {
201
+ const projects = (await loadProjects()).map((p) => ({ slug: p.slug, name: p.name, repoRoot: p.repoRoot }));
202
+ sendJson(res, 200, await scanTokenUsage({ range, projects }));
203
+ }
204
+ catch (error) {
205
+ sendJson(res, 500, { error: String(error?.message ?? error) });
206
+ }
207
+ return;
208
+ }
209
+ if (method === "GET" && pathname === "/api/usage/quota") {
210
+ try {
211
+ sendJson(res, 200, await fetchQuota({ force: url.searchParams.get("refresh") === "1" }));
212
+ }
213
+ catch (error) {
214
+ sendJson(res, 500, { error: String(error?.message ?? error) });
215
+ }
216
+ return;
217
+ }
218
+ if (method === "GET" && pathname === "/api/usage/machine") {
219
+ try {
220
+ sendJson(res, 200, await machineResources());
221
+ }
222
+ catch (error) {
223
+ sendJson(res, 500, { error: String(error?.message ?? error) });
224
+ }
225
+ return;
226
+ }
189
227
  // API routes: /api/projects[/:slug/...]
190
228
  if (pathname === "/api/projects" && method === "GET") {
191
229
  await handleProjectsList(res);
@@ -1358,19 +1396,19 @@ async function loadActivity(repoRoot) {
1358
1396
  // ---------------------------------------------------------------------------
1359
1397
  // HTML shell. The SPA owns all CSS; this carries no inline styles.
1360
1398
  // ---------------------------------------------------------------------------
1361
- function renderShell(slug, controlMode, canMutate) {
1399
+ function renderShell(slug, controlMode, canMutate, view = "board") {
1362
1400
  const slugJson = JSON.stringify(slug ?? "");
1363
1401
  return `<!doctype html>
1364
1402
  <html lang="en">
1365
1403
  <head>
1366
1404
  <meta charset="utf-8" />
1367
1405
  <meta name="viewport" content="width=device-width, initial-scale=1" />
1368
- <title>rudder</title>
1406
+ <title>${view === "usage" ? "rudder · usage" : "rudder"}</title>
1369
1407
  <link rel="stylesheet" href="/board.css" />
1370
1408
  </head>
1371
1409
  <body>
1372
1410
  <div id="app"></div>
1373
- <script>window.__RUDDER_SLUG__ = ${slugJson}; window.__RUDDER_TOKEN__ = ${JSON.stringify(BOARD_TOKEN)}; window.__RUDDER_CONTROL_MODE__ = ${JSON.stringify(controlMode)}; window.__RUDDER_CAN_MUTATE__ = ${JSON.stringify(canMutate)}</script>
1411
+ <script>window.__RUDDER_SLUG__ = ${slugJson}; window.__RUDDER_TOKEN__ = ${JSON.stringify(BOARD_TOKEN)}; window.__RUDDER_CONTROL_MODE__ = ${JSON.stringify(controlMode)}; window.__RUDDER_CAN_MUTATE__ = ${JSON.stringify(canMutate)}; window.__RUDDER_VIEW__ = ${JSON.stringify(view)}</script>
1374
1412
  <script type="module" src="/board.js"></script>
1375
1413
  </body>
1376
1414
  </html>