@andrejvysny/symphony 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -0
- package/dist/client/assets/index-CkX5Wfff.css +1 -0
- package/dist/client/assets/index-D9N3V9nX.js +1 -0
- package/dist/client/index.html +32 -0
- package/dist/main.js +5502 -0
- package/dist/stdio-tracker-server.js +118 -0
- package/package.json +53 -0
package/README.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# @andrejvysny/symphony
|
|
2
|
+
|
|
3
|
+
Agent-agnostic coding-agent orchestrator — delegate tickets to a **local coding agent** (Claude Code
|
|
4
|
+
by default; Codex CLI / opencode also supported) running against a **local file-based task store**. A
|
|
5
|
+
single-user local app: no SaaS, no Docker, no database, no auth — state is plain JSON under
|
|
6
|
+
`~/.symphony`. TypeScript reimplementation of [Symphony](https://github.com/andrejvysny/symphony-ts).
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm i -g @andrejvysny/symphony # or: pnpm add -g @andrejvysny/symphony
|
|
12
|
+
symphony --help
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
**Prerequisites**
|
|
16
|
+
|
|
17
|
+
- **Node ≥ 22**.
|
|
18
|
+
- A local **`claude` login** (`~/.claude`) — the default backend reuses it. (Codex/opencode backends
|
|
19
|
+
use their own CLIs instead.)
|
|
20
|
+
- A **`WORKFLOW.md`** config in your working directory — copy
|
|
21
|
+
[`WORKFLOW.md.example`](https://github.com/andrejvysny/symphony-ts/blob/master/WORKFLOW.md.example)
|
|
22
|
+
and set `workspace.repo` to your local git repo.
|
|
23
|
+
|
|
24
|
+
## Use
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# 1. Drop a WORKFLOW.md in the current dir (see WORKFLOW.md.example), then:
|
|
28
|
+
symphony WORKFLOW.md --port 4500 # run the orchestrator + dashboard at http://127.0.0.1:4500/
|
|
29
|
+
|
|
30
|
+
# Create tickets from the CLI (or the dashboard's "+ New ticket"):
|
|
31
|
+
symphony ticket create "Add dark mode" --desc "..." --state Todo
|
|
32
|
+
|
|
33
|
+
symphony --version
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
| Command | What it does |
|
|
37
|
+
| -------------------------------------------------------------- | ------------------------------------------------- |
|
|
38
|
+
| `symphony [WORKFLOW.md] [--port <n>] [--json-logs]` | Run the orchestrator (and dashboard if `--port`). |
|
|
39
|
+
| `symphony ticket create "<title>" [--desc --state --priority]` | Create a ticket in the active project's store. |
|
|
40
|
+
| `symphony --version` / `--help` | Version / usage. |
|
|
41
|
+
|
|
42
|
+
> The dashboard has **no authentication** — keep `server.host` on loopback (`127.0.0.1`).
|
|
43
|
+
|
|
44
|
+
Full docs, configuration reference, and architecture: **https://github.com/andrejvysny/symphony-ts**.
|
|
45
|
+
|
|
46
|
+
## License
|
|
47
|
+
|
|
48
|
+
Apache-2.0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--canvas:#09090b;--board:#0c0c0f;--surface:#18181b;--surface-2:#141417;--hairline:#27272a;--hairline-2:#1c1c20;--border-strong:#3f3f46;--fg:#fafafa;--fg-1:#e4e4e7;--fg-2:#d4d4d8;--muted:#a1a1aa;--muted-2:#71717a;--faint:#52525b;--faint-2:#3f3f46;--green:#34d399;--green-deep:#10b981;--green-done:#4ade80;--green-border:#2f4039;--amber:#fbbf24;--amber-deep:#f59e0b;--orange:#fb923c;--blue:#60a5fa;--blue-deep:#3b82f6;--purple:#a78bfa;--rose:#fb7185;--on-primary:#18181b;--blue-lane:#1b2433;--amber-lane:#2a2418;--blue-wash:#10131a;--surface-sunken:#0a0a0d;--surface-deep:#070709;--border-modal:#2a2a30;--overlay-bg:#0000009e;--att-scrim:linear-gradient(180deg, #09090b00, #09090bf0);--att-rm-bg:#09090bb8;--on-scrim:#fafafa;--shadow-modal:0 24px 64px #0009;--shadow-menu:0 12px 30px #00000073;--shadow-drawer:-10px 0 40px #0006;--mono:"Geist Mono", ui-monospace, "SF Mono", monospace;--sans:"Geist", system-ui, -apple-system, sans-serif}:root[data-theme=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--canvas:#fff;--board:#f4f4f5;--surface:#fff;--surface-2:#f4f4f5;--hairline:#e4e4e7;--hairline-2:#f0f0f1;--border-strong:#d4d4d8;--fg:#18181b;--fg-1:#27272a;--fg-2:#3f3f46;--muted:#52525b;--muted-2:#71717a;--faint:#a1a1aa;--faint-2:#d4d4d8;--green:#059669;--green-deep:#10b981;--green-done:#16a34a;--green-border:#a7f3d0;--amber:#d97706;--amber-deep:#d97706;--orange:#ea580c;--blue:#2563eb;--blue-deep:#3b82f6;--purple:#7c3aed;--rose:#e11d48;--on-primary:#fafafa;--blue-lane:#bfdbfe;--amber-lane:#fde68a;--blue-wash:#eff6ff;--surface-sunken:#fafafa;--surface-deep:#f4f4f5;--border-modal:#e4e4e7;--overlay-bg:#18181b73;--shadow-modal:0 24px 64px #0000002e;--shadow-menu:0 12px 30px #0000001f;--shadow-drawer:-10px 0 40px #0000001f}*{box-sizing:border-box}body{font-family:var(--sans);background:var(--canvas);color:var(--fg-1);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;margin:0;font-size:13px}.mono{font-family:var(--mono)}.muted{color:var(--muted-2)}.empty{color:var(--faint-2);font-size:11px;font-style:italic}@keyframes sym-pulse{0%,to{opacity:1}50%{opacity:.3}}@keyframes sym-ping{0%{opacity:.55;transform:scale(1)}70%,to{opacity:0;transform:scale(2.4)}}@keyframes sym-caret{0%,to{opacity:1}50%{opacity:0}}.app{background:var(--canvas);flex-direction:column;height:100vh;display:flex}.topbar{border-bottom:1px solid var(--hairline);flex:none;justify-content:space-between;align-items:center;gap:14px;height:57px;padding:0 20px;display:flex}.topbar .left,.topbar .right{align-items:center;gap:12px;display:flex}.brand{align-items:center;gap:9px;display:flex}.brand .mark{background:linear-gradient(135deg, var(--hairline), var(--surface));border:1px solid var(--border-strong);border-radius:7px;justify-content:center;align-items:center;width:24px;height:24px;display:flex}.brand .mark i{border:1.5px solid var(--fg-1);border-radius:3px;width:11px;height:11px}.brand b{color:var(--fg);letter-spacing:-.02em;font-size:15px;font-weight:600}.sep{background:var(--hairline);width:1px;height:18px}.topmeta{font-family:var(--mono);color:var(--faint);font-size:11.5px}.gauge{border:1px solid var(--hairline);background:var(--surface);border-radius:8px;align-items:center;gap:9px;height:34px;padding:0 11px;display:flex}.gauge .val{font-family:var(--mono);color:var(--fg);font-size:12.5px}.gauge .val span{color:var(--faint)}.gauge .cap{letter-spacing:.08em;text-transform:uppercase;color:var(--muted-2);font-size:10px}.gauge .bars{gap:3px;display:flex}.gauge .bars i{background:var(--hairline);border-radius:2px;width:5px;height:14px}.gauge .bars i.on{background:var(--green)}.gauge.usage .usage-val{align-items:center;gap:6px;display:flex}.usage-win{font-variant-numeric:tabular-nums}.usage-win.bind{font-weight:600}.usage-win.ok{color:var(--green)}.usage-win.warn{color:var(--amber)}.usage-win.crit{color:var(--rose)}.usage-win.na{color:var(--muted-2)}.gauge.usage.unavailable{opacity:.7}.usage-sep{color:var(--muted-2)}.live{flex:none;width:7px;height:7px;display:inline-flex;position:relative}.live:before{content:"";background:var(--green-deep);border-radius:9999px;animation:1.8s ease-out infinite sym-ping;position:absolute;inset:0}.live:after{content:"";background:var(--green);border-radius:9999px;width:7px;height:7px;position:relative}.pulse-dot{background:var(--green);border-radius:9999px;width:6px;height:6px;animation:1.5s ease-in-out infinite sym-pulse}.caret{color:var(--green);animation:1.1s step-end infinite sym-caret}.tabs{background:var(--surface);border:1px solid var(--hairline);border-radius:8px;gap:2px;padding:3px;display:flex}.tabs button{font:inherit;color:var(--muted-2);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:5px 12px;font-size:12.5px;font-weight:500}.tabs button.on{color:var(--fg);background:var(--hairline)}.btn{font:inherit;cursor:pointer;background:var(--surface);height:34px;color:var(--fg);border:1px solid var(--hairline);border-radius:8px;align-items:center;gap:6px;padding:0 14px;font-size:12.5px;font-weight:600;display:inline-flex}.btn:hover{filter:brightness(1.12)}.btn:disabled{opacity:.5;cursor:not-allowed}.btn.primary{background:var(--fg);color:var(--on-primary);border:none}.btn.ghost{border:1px solid var(--border-strong);color:var(--fg-2);background:0 0;font-weight:500}.btn.danger{border:1px solid var(--border-strong);color:var(--rose);background:0 0;font-weight:500}.btn.sm{height:30px;padding:0 12px;font-size:12px}.btn.block{justify-content:center;width:100%}.err-banner{color:var(--rose);background:#fb71851a;border-bottom:1px solid #fb718540;padding:7px 20px;font-size:12px}.board{flex:1;gap:12px;min-height:0;padding:16px;display:flex;overflow-x:auto}.lane{flex-direction:column;flex:1 1 0;min-width:200px;min-height:0;display:flex}.lane.wide{flex-grow:1.5}.lane-head{justify-content:space-between;align-items:center;padding:0 4px 10px;display:flex}.lane-head .name{letter-spacing:.09em;text-transform:uppercase;color:var(--muted);align-items:center;gap:7px;font-size:11px;font-weight:600;display:flex}.lane-head .name.hot{color:var(--fg)}.lane-head .swatch{background:var(--faint);border-radius:2px;width:7px;height:7px}.lane-count{font-family:var(--mono);color:var(--faint);background:var(--surface);border:1px solid var(--hairline);border-radius:5px;padding:1px 7px;font-size:11px}.lane-count.hot{color:var(--muted)}.lane-collapse{background:var(--surface);border:1px solid var(--hairline);color:var(--muted-2);cursor:pointer;border-radius:5px;padding:2px 6px;font-size:11px;line-height:1}.lane-collapse:hover{color:var(--fg-1)}.lane-body{background:var(--board);border:1px solid var(--hairline-2);border-radius:10px;flex-direction:column;flex:1;gap:9px;padding:9px;display:flex;overflow-y:auto}.lane-body.active{border-color:var(--green-border)}.lane-body.review{border-color:var(--blue-lane)}.lane-body.blocked{border-color:var(--amber-lane)}.lane-body.dragover{border-color:var(--blue);background:var(--blue-wash)}.lane-body.empty-pad{border-style:dashed;justify-content:center;align-items:center}.ghost-card{appearance:none;border:1.5px dashed var(--hairline);width:100%;font:inherit;color:var(--muted-2);cursor:pointer;background:0 0;border-radius:8px;justify-content:center;align-items:center;gap:6px;padding:10px 12px;font-size:12px;transition:border-color .15s,color .15s,background .15s;display:flex}.ghost-card:hover{border-color:var(--blue);color:var(--blue);background:var(--blue-wash)}.ghost-card .ghost-plus{font-size:14px;line-height:1}.rails{flex:none;gap:12px;display:flex}.rail{background:var(--board);border:1px solid var(--hairline-2);cursor:pointer;border-radius:10px;flex-direction:column;flex:none;align-items:center;gap:14px;width:58px;padding:14px 0;display:flex}.rail:hover{border-color:var(--hairline)}.rail .n{font-family:var(--mono);color:var(--fg);font-size:16px}.rail .n.zero{color:var(--faint)}.rail .lbl{writing-mode:vertical-rl;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);font-size:10px;font-weight:600;transform:rotate(180deg)}.rail.done .lbl{color:var(--green-done)}.card{background:var(--surface);border:1px solid var(--hairline);cursor:pointer;border-radius:8px;flex-direction:column;gap:8px;padding:11px 12px;display:flex}.card:hover{border-color:var(--border-strong)}.card.running{border-color:var(--green-border);gap:9px;padding:12px}.card.blocked{border-left:2px solid var(--amber-deep);gap:9px;padding:12px}.card.review{gap:9px;padding:12px}.card-top{justify-content:space-between;align-items:center;gap:8px;display:flex}.card-id{font-family:var(--mono);color:var(--muted-2);font-size:11px}.card.running .card-id,.card.blocked .card-id,.card.review .card-id{color:var(--blue)}.card-title{color:var(--fg-1);font-size:13px;font-weight:500;line-height:1.35}.card.running .card-title,.card.blocked .card-title,.card.review .card-title{color:var(--fg)}.card-note{color:var(--muted);font-size:11px;line-height:1.45}.card-ts{color:var(--muted-2);font-size:10px}.pill{white-space:nowrap;border-radius:5px;align-items:center;gap:5px;padding:2px 8px;font-size:10.5px;font-weight:600;display:inline-flex}.pill.running{color:var(--green);background:#10b9811f}.pill.blocked{color:var(--amber);background:#f59e0b1f}.pill.retrying{color:var(--orange);background:#fb923c1f}.pill.review{color:var(--blue);background:#3b82f61f}.pill.paused{color:var(--muted);background:var(--hairline)}.pill.rework{color:var(--orange);text-transform:uppercase;letter-spacing:.03em;background:#fb923c24}.card-top-right{align-items:center;gap:6px;display:flex}.action{font-family:var(--mono);color:var(--faint);background:var(--board);border:1px solid var(--hairline-2);white-space:nowrap;text-overflow:ellipsis;border-radius:6px;padding:7px 9px;font-size:10.5px;overflow:hidden}.chips{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.chip{font-family:var(--mono);color:var(--muted);background:var(--hairline);border-radius:4px;padding:2px 7px;font-size:10px}.chip.dim{color:var(--muted-2)}.chip.tmux{color:var(--purple);background:#a78bfa1f;align-items:center;gap:4px;display:inline-flex}.chip.retry{color:var(--orange);background:#fb923c1f}.chip.cap{color:var(--amber);background:#f59e0b1f}.chip.plain{color:var(--muted-2);background:0 0;padding:2px 0}.diff-add{font-family:var(--mono);color:var(--green);font-size:10.5px}.overlay{background:var(--overlay-bg);z-index:50;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal{background:var(--board);border:1px solid var(--border-modal);border-radius:12px;width:480px;max-width:94vw;padding:20px}.modal h3{color:var(--fg);margin:0 0 14px;font-size:15px}.field{margin-top:12px;display:block}.field-row{gap:12px;display:flex}.field-row>.field{flex:1;min-width:0}.field>span{letter-spacing:.06em;text-transform:uppercase;color:var(--muted-2);margin-bottom:5px;font-size:10.5px;font-weight:600;display:block}input,textarea,select{background:var(--surface);width:100%;color:var(--fg-1);border:1px solid var(--hairline);font:inherit;border-radius:7px;padding:9px 11px;font-size:13px}input:focus,textarea:focus,select:focus{border-color:var(--blue);outline:none}textarea{resize:vertical;min-height:90px;line-height:1.5}.modal-actions{justify-content:flex-end;gap:8px;margin-top:18px;display:flex}.att-grid{grid-template-columns:repeat(3,1fr);gap:10px;display:grid}.dropzone{border:1.5px dashed var(--border-strong);cursor:pointer;background:var(--board);height:110px;color:var(--fg-2);border-radius:9px;flex-direction:column;justify-content:center;align-items:center;gap:6px;display:flex}.dropzone:hover,.dropzone.over{border-color:var(--blue);background:var(--blue-wash)}.dropzone .ic{background:var(--surface);border:1px solid var(--hairline);width:30px;height:30px;color:var(--muted);border-radius:8px;justify-content:center;align-items:center;font-size:15px;display:flex}.dropzone .t{font-size:11.5px;font-weight:500}.dropzone .h{color:var(--faint);font-size:9.5px}.att{border:1px solid var(--hairline);background:var(--board);border-radius:9px;justify-content:center;align-items:center;height:110px;display:flex;position:relative;overflow:hidden}.att .name{background:var(--att-scrim);color:var(--on-scrim);white-space:nowrap;text-overflow:ellipsis;padding:7px 9px;font-size:11px;position:absolute;bottom:0;left:0;right:0;overflow:hidden}.att .ext{font-family:var(--mono);color:var(--muted);font-size:13px}.att .rm{background:var(--att-rm-bg);width:22px;height:22px;color:var(--on-scrim);cursor:pointer;border:none;border-radius:6px;padding:0;font-size:13px;position:absolute;top:6px;right:6px}.ticket{background:var(--board);border:1px solid var(--border-modal);width:980px;max-width:96vw;max-height:90vh;box-shadow:var(--shadow-modal);border-radius:14px;flex-direction:column;display:flex;overflow:hidden}.ticket-head{border-bottom:1px solid var(--hairline-2);flex:none;justify-content:space-between;align-items:center;padding:14px 20px;display:flex}.ticket-head .crumb{font-family:var(--mono);align-items:center;gap:10px;font-size:12px;display:flex}.ticket-head .crumb .scope{color:var(--muted-2)}.ticket-head .crumb .id{color:var(--blue)}.iconbtn{border:1px solid var(--hairline);width:28px;height:28px;color:var(--muted-2);cursor:pointer;background:0 0;border-radius:7px;justify-content:center;align-items:center;font-size:15px;display:inline-flex}.iconbtn:hover{color:var(--fg-1)}.ticket-body{flex:1;min-height:0;display:flex}.ticket-main{flex-direction:column;flex:1;gap:22px;min-width:0;padding:22px 24px;display:flex;overflow-y:auto}.ticket-main h1{color:var(--fg);letter-spacing:-.01em;margin:0;font-size:20px;font-weight:600;line-height:1.3}.ticket-main .opened{color:var(--muted-2);margin-top:6px;font-size:11.5px}.section>.label,.ticket-side .label{letter-spacing:.08em;text-transform:uppercase;color:var(--muted-2);align-items:center;gap:9px;margin-bottom:9px;font-size:10.5px;font-weight:600;display:flex}.desc{color:var(--fg-2);background:var(--surface);border:1px solid var(--hairline);white-space:pre-wrap;border-radius:9px;padding:14px 15px;font-size:13px;line-height:1.65}.subtabs{border-bottom:1px solid var(--hairline-2);align-items:center;gap:16px;display:flex}.subtabs button{font:inherit;color:var(--muted-2);cursor:pointer;background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-1px;padding:0 0 8px;font-size:12px;font-weight:600}.subtabs button.on{color:var(--fg);border-bottom-color:var(--fg)}.stream{flex-direction:column;gap:14px;margin-top:14px;display:flex}.cmt{gap:11px;display:flex}.cmt .avatar{background:var(--surface);border:1px solid var(--hairline);width:28px;height:28px;color:var(--muted);border-radius:7px;flex:none;justify-content:center;align-items:center;font-size:11px;display:flex}.cmt .avatar.ai{border-color:var(--green-border);font-family:var(--mono);color:var(--green);font-size:9px}.cmt .body{flex-direction:column;flex:1;gap:5px;display:flex}.cmt .by{align-items:center;gap:8px;font-size:12.5px;display:flex}.cmt .by b{color:var(--fg-1);font-weight:600}.cmt .by .when{color:var(--faint);font-size:11px}.cmt .txt{color:var(--fg-2);white-space:pre-wrap;font-size:12.5px;line-height:1.55}.event{border-left:2px solid var(--hairline);gap:10px;padding:3px 0 3px 10px;font-size:12px;display:flex}.event .when{color:var(--faint);white-space:nowrap;font-family:var(--mono);font-size:11px}.ticket-side{border-left:1px solid var(--hairline-2);background:var(--surface-sunken);flex-direction:column;flex:none;gap:16px;width:296px;padding:20px;display:flex;overflow-y:auto}.side-row{justify-content:space-between;align-items:center;font-size:11.5px;display:flex}.side-row .k{color:var(--muted-2)}.side-row .v{font-family:var(--mono);color:var(--muted);font-size:11px}.side-row .v.blue{color:var(--blue)}.review-actions{flex-direction:column;gap:9px;display:flex}.review-notes{min-height:64px;font-size:12px;line-height:1.5}.review-btns{gap:6px;display:flex}.review-btns .btn{flex:1;justify-content:center}.hr{background:var(--hairline-2);height:1px}.ticket-foot{border-top:1px solid var(--hairline-2);background:var(--surface-sunken);flex:none;justify-content:space-between;align-items:center;padding:13px 20px;display:flex}.title-edit{width:100%;font-family:var(--sans);color:var(--fg);letter-spacing:-.01em;background:0 0;border:1px solid #0000;border-radius:7px;margin:-4px -6px;padding:4px 6px;font-size:20px;font-weight:600}.title-edit:hover{background:var(--surface-2)}.title-edit:focus{background:var(--surface);border-color:var(--hairline);outline:none}.desc-edit{min-height:120px;line-height:1.6}.label-chip{align-items:center;gap:5px;padding-right:5px;display:inline-flex}.label-x{color:var(--muted-2);cursor:pointer;background:0 0;border:none;padding:0;font-size:13px;line-height:1}.label-x:hover{color:var(--rose)}.drawer{background:var(--board);border-left:1px solid var(--hairline);z-index:45;width:460px;max-width:96vw;height:100vh;box-shadow:var(--shadow-drawer);flex-direction:column;display:flex;position:fixed;top:0;right:0}.drawer-resize{cursor:ew-resize;z-index:2;touch-action:none;width:6px;height:100%;position:absolute;top:0;left:0}.drawer-resize:hover,body.resizing-x .drawer-resize{background:var(--border-strong)}body.resizing-x{cursor:ew-resize;-webkit-user-select:none;user-select:none}.drawer-head{border-bottom:1px solid var(--hairline-2);flex-direction:column;flex:none;gap:12px;padding:18px 20px;display:flex}.drawer-head .row{justify-content:space-between;align-items:center;display:flex}.drawer-head .ttl{color:var(--fg);letter-spacing:-.01em;font-size:16px;font-weight:600;line-height:1.3}.tagrow{flex-wrap:wrap;gap:7px;display:flex}.tag{font-family:var(--mono);color:var(--muted);background:var(--surface);border:1px solid var(--hairline);border-radius:5px;padding:3px 8px;font-size:10.5px}.stats{border-bottom:1px solid var(--hairline-2);flex:none;grid-template-columns:1fr 1fr 1fr;display:grid}.stat{border-right:1px solid var(--hairline-2);flex-direction:column;gap:4px;padding:14px 16px;display:flex}.stat:last-child{border-right:none}.stat .n{font-family:var(--mono);color:var(--fg);font-size:17px}.stat .n small{color:var(--faint);font-size:13px}.stat .k{letter-spacing:.06em;text-transform:uppercase;color:var(--muted-2);font-size:10px}.stall{border-bottom:1px solid var(--hairline-2);flex-direction:column;flex:none;gap:8px;padding:13px 20px;display:flex}.stall .row{letter-spacing:.06em;text-transform:uppercase;color:var(--muted-2);justify-content:space-between;align-items:center;font-size:10.5px;display:flex}.stall .row .ago{font-family:var(--mono);text-transform:none;letter-spacing:0;color:var(--muted)}.meter{background:var(--surface);border-radius:9999px;height:5px;overflow:hidden}.meter>i{background:var(--green);border-radius:9999px;height:100%;display:block}.meter.warn>i{background:var(--amber)}.stall .foot{font-family:var(--mono);color:var(--faint);font-size:10px}.plan{border-bottom:1px solid var(--hairline);flex-direction:column;flex:none;min-height:0;max-height:32%;display:flex}.plan .label{flex:none;padding:12px 20px 6px}.plan .todos{flex-direction:column;gap:4px;margin:0;padding:0 20px 12px;list-style:none;display:flex;overflow-y:auto}.plan .todo{color:var(--muted-2);align-items:flex-start;gap:8px;font-size:12px;line-height:1.5;display:flex}.plan .todo .box{text-align:center;width:14px;color:var(--faint);flex:none}.plan .todo.completed .box{color:var(--green)}.plan .todo.completed .txt{color:var(--faint);text-decoration:line-through}.plan .todo.in_progress .box{color:var(--blue)}.plan .todo.in_progress .txt{color:var(--fg);font-weight:600}.activity{flex-direction:column;flex:1;min-height:0;display:flex}.activity .label{flex:none;padding:12px 20px 6px}.activity .log{font-family:var(--mono);color:var(--muted-2);flex:1;padding:0 20px 14px;font-size:11px;line-height:1.8;overflow-y:auto}.activity .log p{white-space:pre-wrap;word-break:break-word;margin:0}.activity .log .tool{color:var(--fg-1)}.activity .log .err{color:var(--rose)}.activity .log .sys{color:var(--faint)}.tmux{background:var(--board);border:1px solid var(--hairline);border-radius:10px;flex:none;margin:0 20px 14px;overflow:hidden}.tmux .bar{border-bottom:1px solid var(--hairline-2);font-family:var(--mono);justify-content:space-between;align-items:center;padding:10px 13px;font-size:11px;display:flex}.tmux .bar .s{color:var(--purple);align-items:center;gap:6px;display:inline-flex}.tmux .bar .s i{background:var(--purple);border-radius:9999px;width:6px;height:6px}.tmux .hint{font-family:var(--mono);color:var(--faint);background:var(--surface-deep);padding:11px 13px;font-size:10.5px}.drawer-actions{border-top:1px solid var(--hairline-2);flex:none;gap:9px;padding:14px 20px;display:flex}.agents{flex:1;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));align-content:start;gap:12px;padding:16px 20px;display:grid;overflow-y:auto}.agent-card{background:var(--surface);border:1px solid var(--green-border);cursor:pointer;border-radius:10px;flex-direction:column;gap:10px;padding:13px;display:flex}.agent-card.idle{border-color:var(--hairline)}.agent-card .log{font-family:var(--mono);color:var(--muted);background:var(--board);border:1px solid var(--hairline-2);white-space:nowrap;text-overflow:ellipsis;border-radius:7px;padding:9px;font-size:10.5px;line-height:1.6;overflow:hidden}.fill{flex:1}.center{color:var(--faint);flex:1;justify-content:center;align-items:center;font-size:13px;display:flex}.proj{position:relative}.proj-btn{background:var(--surface);border:1px solid var(--hairline);height:32px;color:var(--fg-1);cursor:pointer;font:inherit;border-radius:8px;align-items:center;gap:7px;padding:0 10px;font-size:12.5px;font-weight:600;display:inline-flex}.proj-btn:hover{filter:brightness(1.12)}.proj-btn:disabled{opacity:.6;cursor:progress}.proj-ico{color:var(--muted-2)}.proj-name{text-overflow:ellipsis;white-space:nowrap;max-width:180px;overflow:hidden}.proj-caret{color:var(--faint);font-size:10px}.menu{z-index:60;background:var(--board);border:1px solid var(--border-modal);width:280px;box-shadow:var(--shadow-menu);border-radius:10px;padding:6px;position:absolute;top:38px;left:0}.menu-head{letter-spacing:.06em;text-transform:uppercase;color:var(--muted-2);padding:6px 8px 4px;font-size:10.5px;font-weight:600}.menu-empty{color:var(--faint-2);padding:8px;font-size:11.5px;font-style:italic}.menu-sep{background:var(--hairline);height:1px;margin:6px 4px}.menu-item{width:100%;color:var(--fg-1);cursor:pointer;text-align:left;font:inherit;background:0 0;border:none;border-radius:7px;align-items:center;gap:9px;padding:8px;display:flex}.menu-item:hover:not(:disabled){background:var(--surface)}.menu-item:disabled{cursor:default}.menu-item.on{background:var(--surface-2)}.menu-item.add .mi-name{color:var(--blue)}.menu-row{align-items:stretch;gap:2px;display:flex}.menu-row .menu-item{flex:1;width:auto}.mi-open{color:var(--blue);border-radius:7px;align-items:center;padding:0 11px;font-size:13px;text-decoration:none;display:flex}.mi-open:hover{background:var(--surface)}.field-hint{color:var(--muted-2);margin-top:2px;font-size:10.5px;line-height:1.4}.mi-check{text-align:center;width:14px;color:var(--green);font-weight:700}.menu-item.add .mi-check{color:var(--blue)}.mi-body{flex-direction:column;gap:2px;min-width:0;display:flex}.mi-name{text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;overflow:hidden}.mi-id{color:var(--faint);font-family:var(--mono);font-size:10.5px;font-weight:500}.mi-sub{font-family:var(--mono);color:var(--faint);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;overflow:hidden}.modal.settings{width:560px}.settings-body{max-height:64vh;padding-right:4px;overflow-y:auto}.settings-group{margin-bottom:16px}.settings-h{letter-spacing:.06em;text-transform:uppercase;color:var(--muted);border-bottom:1px solid var(--hairline);margin-bottom:4px;padding-bottom:6px;font-size:11px;font-weight:600}.settings-row{grid-template-columns:1fr 1fr;gap:12px;display:grid}.field.check{align-items:center;gap:8px;margin-top:14px;display:flex}.field.check input{width:auto}.field.check>span{text-transform:none;letter-spacing:0;color:var(--fg-2);margin:0;font-size:12.5px;font-weight:500}.modal-head{justify-content:space-between;align-items:center;margin-bottom:14px;display:flex}.modal-head h3{margin:0}.create-modal{width:520px}.subhead{letter-spacing:.08em;text-transform:uppercase;color:var(--faint);margin-bottom:8px;font-size:10px;font-weight:600;display:block}.head-actions{align-items:center;gap:8px;display:flex;position:relative}.head-menu{z-index:60;background:var(--board);border:1px solid var(--border-modal);min-width:168px;box-shadow:var(--shadow-menu);border-radius:9px;flex-direction:column;padding:5px;display:flex;position:absolute;top:34px;right:0}.head-menu button,.head-menu a{font:inherit;text-align:left;color:var(--fg-1);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:7px 9px;font-size:12.5px;text-decoration:none}.head-menu button:hover,.head-menu a:hover{background:var(--surface)}.desc-view{cursor:text;min-height:44px}.desc-view:hover{border-color:var(--border-strong)}.desc-view .empty{color:var(--faint);font-style:italic}.section>.label .count,.ticket-side .label .count{font-family:var(--mono);color:var(--muted-2);background:var(--surface);border:1px solid var(--hairline);text-transform:none;letter-spacing:0;border-radius:5px;padding:0 6px;font-size:10px;font-weight:500}.dispatch-btn{height:38px;font-size:13px}.assignee{background:var(--surface);border:1px solid var(--hairline);border-radius:7px;align-items:center;gap:8px;height:34px;padding:0 11px;display:flex}.assignee .ai-badge,.cmt .avatar.ai-inline{background:var(--board);border:1px solid var(--green-border);width:20px;height:20px;font-family:var(--mono);color:var(--green);border-radius:5px;flex:none;justify-content:center;align-items:center;font-size:8px;display:flex}.assignee .an{color:var(--fg-1);font-size:12.5px;font-family:var(--mono)}.ticket-foot .foot-left{align-items:center;display:flex}.confirm-del{color:var(--fg-2);align-items:center;gap:8px;font-size:12px;display:flex}.pm-modal{width:620px}.pm-list{flex-direction:column;gap:6px;max-height:56vh;margin-bottom:14px;display:flex;overflow-y:auto}.pm-row{background:var(--surface);border:1px solid var(--hairline);border-radius:9px;justify-content:space-between;align-items:center;gap:12px;padding:11px 12px;display:flex}.pm-row.active{border-color:var(--green-border)}.pm-main{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.pm-name{align-items:center;gap:8px;min-width:0;display:flex}.pm-title{color:var(--fg);text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:600;overflow:hidden}.pm-badge{letter-spacing:.04em;text-transform:uppercase;border-radius:5px;padding:1px 6px;font-size:9.5px;font-weight:600}.pm-badge.on{color:var(--green);background:#10b9811f}.pm-badge.muted{color:var(--muted-2);background:var(--hairline)}.pm-sub{font-family:var(--mono);color:var(--muted-2);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.pm-actions{flex:none;align-items:center;gap:6px;display:flex}.pm-edit{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.pm-edit input{width:220px}.pm-warn{color:var(--amber);font-size:10.5px}.pm-confirm{align-items:center;gap:6px;display:flex}.project-empty{text-align:center;flex-direction:column;align-items:center;gap:14px;max-width:420px;padding:40px 24px;display:flex}.project-empty .pe-mark{background:var(--surface);border:1px solid var(--hairline);border-radius:12px;justify-content:center;align-items:center;width:46px;height:46px;display:flex}.project-empty .pe-mark i{border:1.5px solid var(--muted);border-radius:5px;width:18px;height:18px}.project-empty .pe-title{color:var(--fg);font-size:16px;font-weight:600}.project-empty .pe-sub{color:var(--muted-2);font-size:12.5px;line-height:1.6}.project-empty .pe-actions{gap:9px;margin-top:4px;display:flex}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e,t,n,r,i,a,o,s,c,l,u,d,f,p,m={},h=[],g=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,_=Array.isArray;function v(e,t){for(var n in t)e[n]=t[n];return e}function y(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function b(t,n,r){var i,a,o,s={};for(o in n)o==`key`?i=n[o]:o==`ref`?a=n[o]:s[o]=n[o];if(arguments.length>2&&(s.children=arguments.length>3?e.call(arguments,2):r),typeof t==`function`&&t.defaultProps!=null)for(o in t.defaultProps)s[o]===void 0&&(s[o]=t.defaultProps[o]);return x(t,s,i,a,null)}function x(e,r,i,a,o){var s={type:e,props:r,key:i,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:o??++n,__i:-1,__u:0};return o==null&&t.vnode!=null&&t.vnode(s),s}function S(e){return e.children}function C(e,t){this.props=e,this.context=t}function w(e,t){if(t==null)return e.__?w(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`?w(e):null}function T(e){if(e.__P&&e.__d){var n=e.__v,r=n.__e,i=[],a=[],o=v({},n);o.__v=n.__v+1,t.vnode&&t.vnode(o),N(e.__P,o,n,e.__n,e.__P.namespaceURI,32&n.__u?[r]:null,i,r??w(n),!!(32&n.__u),a),o.__v=n.__v,o.__.__k[o.__i]=o,P(i,o,a),n.__e=n.__=null,o.__e!=r&&E(o)}}function E(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}),E(e)}function D(e){(!e.__d&&(e.__d=!0)&&r.push(e)&&!O.__r++||i!=t.debounceRendering)&&((i=t.debounceRendering)||a)(O)}function O(){try{for(var e,t=1;r.length;)r.length>t&&r.sort(o),e=r.shift(),t=r.length,T(e)}finally{r.length=O.__r=0}}function ee(e,t,n,r,i,a,o,s,c,l,u){var d,f,p,g,_,v,y,b=r&&r.__k||h,x=t.length;for(c=te(n,t,b,c,x),d=0;d<x;d++)(p=n.__k[d])!=null&&(f=p.__i!=-1&&b[p.__i]||m,p.__i=d,v=N(e,p,f,i,a,o,s,c,l,u),g=p.__e,p.ref&&f.ref!=p.ref&&(f.ref&&L(f.ref,null,p),u.push(p.ref,p.__c||g,p)),_==null&&g!=null&&(_=g),(y=!!(4&p.__u))||f.__k===p.__k?(c=k(p,c,e,y),y&&f.__e&&(f.__e=null)):typeof p.type==`function`&&v!==void 0?c=v:g&&(c=g.nextSibling),p.__u&=-7);return n.__e=_,c}function te(e,t,n,r,i){var a,o,s,c,l,u=n.length,d=u,f=0;for(e.__k=Array(i),a=0;a<i;a++)(o=t[a])!=null&&typeof o!=`boolean`&&typeof o!=`function`?(typeof o==`string`||typeof o==`number`||typeof o==`bigint`||o.constructor==String?o=e.__k[a]=x(null,o,null,null,null):_(o)?o=e.__k[a]=x(S,{children:o},null,null,null):o.constructor===void 0&&o.__b>0?o=e.__k[a]=x(o.type,o.props,o.key,o.ref?o.ref:null,o.__v):e.__k[a]=o,c=a+f,o.__=e,o.__b=e.__b+1,s=null,(l=o.__i=A(o,n,c,d))!=-1&&(d--,(s=n[l])&&(s.__u|=2)),s==null||s.__v==null?(l==-1&&(i>u?f--:i<u&&f++),typeof o.type!=`function`&&(o.__u|=4)):l!=c&&(l==c-1?f--:l==c+1?f++:(l>c?f--:f++,o.__u|=4))):e.__k[a]=null;if(d)for(a=0;a<u;a++)(s=n[a])!=null&&!(2&s.__u)&&(s.__e==r&&(r=w(s)),ie(s,s));return r}function k(e,t,n,r){var i,a;if(typeof e.type==`function`){for(i=e.__k,a=0;i&&a<i.length;a++)i[a]&&(i[a].__=e,t=k(i[a],t,n,r));return t}e.__e!=t&&(r&&(t&&e.type&&!t.parentNode&&(t=w(e)),n.insertBefore(e.__e,t||null)),t=e.__e);do t&&=t.nextSibling;while(t!=null&&t.nodeType==8);return t}function A(e,t,n,r){var i,a,o,s=e.key,c=e.type,l=t[n],u=l!=null&&(2&l.__u)==0;if(l===null&&s==null||u&&s==l.key&&c==l.type)return n;if(r>+!!u){for(i=n-1,a=n+1;i>=0||a<t.length;)if((l=t[o=i>=0?i--:a++])!=null&&!(2&l.__u)&&s==l.key&&c==l.type)return o}return-1}function j(e,t,n){t[0]==`-`?e.setProperty(t,n??``):e[t]=n==null?``:typeof n!=`number`||g.test(t)?n:n+`px`}function M(e,t,n,r,i){var a,o;n:if(t==`style`)if(typeof n==`string`)e.style.cssText=n;else{if(typeof r==`string`&&(e.style.cssText=r=``),r)for(t in r)n&&t in n||j(e.style,t,``);if(n)for(t in n)r&&n[t]==r[t]||j(e.style,t,n[t])}else if(t[0]==`o`&&t[1]==`n`)a=t!=(t=t.replace(u,`$1`)),o=t.toLowerCase(),t=o in e||t==`onFocusOut`||t==`onFocusIn`?o.slice(2):t.slice(2),e.l||={},e.l[t+a]=n,n?r?n[l]=r[l]:(n[l]=d,e.addEventListener(t,a?p:f,a)):e.removeEventListener(t,a?p:f,a);else{if(i==`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 n}catch{}typeof n==`function`||(n==null||!1===n&&t[4]!=`-`?e.removeAttribute(t):e.setAttribute(t,t==`popover`&&n==1?``:n))}}function ne(e){return function(n){if(this.l){var r=this.l[n.type+e];if(n[c]==null)n[c]=d++;else if(n[c]<r[l])return;return r(t.event?t.event(n):n)}}}function N(e,n,r,i,a,o,s,c,l,u){var d,f,p,m,g,b,x,w,T,E,D,O,te,k,A,j=n.type;if(n.constructor!==void 0)return null;128&r.__u&&(l=!!(32&r.__u),o=[c=n.__e=r.__e]),(d=t.__b)&&d(n);n:if(typeof j==`function`)try{if(w=n.props,T=j.prototype&&j.prototype.render,E=(d=j.contextType)&&i[d.__c],D=d?E?E.props.value:d.__:i,r.__c?x=(f=n.__c=r.__c).__=f.__E:(T?n.__c=f=new j(w,D):(n.__c=f=new C(w,D),f.constructor=j,f.render=ae),E&&E.sub(f),f.state||={},f.__n=i,p=f.__d=!0,f.__h=[],f._sb=[]),T&&f.__s==null&&(f.__s=f.state),T&&j.getDerivedStateFromProps!=null&&(f.__s==f.state&&(f.__s=v({},f.__s)),v(f.__s,j.getDerivedStateFromProps(w,f.__s))),m=f.props,g=f.state,f.__v=n,p)T&&j.getDerivedStateFromProps==null&&f.componentWillMount!=null&&f.componentWillMount(),T&&f.componentDidMount!=null&&f.__h.push(f.componentDidMount);else{if(T&&j.getDerivedStateFromProps==null&&w!==m&&f.componentWillReceiveProps!=null&&f.componentWillReceiveProps(w,D),n.__v==r.__v||!f.__e&&f.shouldComponentUpdate!=null&&!1===f.shouldComponentUpdate(w,f.__s,D)){n.__v!=r.__v&&(f.props=w,f.state=f.__s,f.__d=!1),n.__e=r.__e,n.__k=r.__k,n.__k.some(function(e){e&&(e.__=n)}),h.push.apply(f.__h,f._sb),f._sb=[],f.__h.length&&s.push(f);break n}f.componentWillUpdate!=null&&f.componentWillUpdate(w,f.__s,D),T&&f.componentDidUpdate!=null&&f.__h.push(function(){f.componentDidUpdate(m,g,b)})}if(f.context=D,f.props=w,f.__P=e,f.__e=!1,O=t.__r,te=0,T)f.state=f.__s,f.__d=!1,O&&O(n),d=f.render(f.props,f.state,f.context),h.push.apply(f.__h,f._sb),f._sb=[];else do f.__d=!1,O&&O(n),d=f.render(f.props,f.state,f.context),f.state=f.__s;while(f.__d&&++te<25);f.state=f.__s,f.getChildContext!=null&&(i=v(v({},i),f.getChildContext())),T&&!p&&f.getSnapshotBeforeUpdate!=null&&(b=f.getSnapshotBeforeUpdate(m,g)),k=d!=null&&d.type===S&&d.key==null?F(d.props.children):d,c=ee(e,_(k)?k:[k],n,r,i,a,o,s,c,l,u),f.base=n.__e,n.__u&=-161,f.__h.length&&s.push(f),x&&(f.__E=f.__=null)}catch(e){if(n.__v=null,l||o!=null)if(e.then){for(n.__u|=l?160:128;c&&c.nodeType==8&&c.nextSibling;)c=c.nextSibling;o[o.indexOf(c)]=null,n.__e=c}else{for(A=o.length;A--;)y(o[A]);re(n)}else n.__e=r.__e,n.__k=r.__k,e.then||re(n);t.__e(e,n,r)}else o==null&&n.__v==r.__v?(n.__k=r.__k,n.__e=r.__e):c=n.__e=I(r.__e,n,r,i,a,o,s,l,u);return(d=t.diffed)&&d(n),128&n.__u?void 0:c}function re(e){e&&(e.__c&&(e.__c.__e=!0),e.__k&&e.__k.some(re))}function P(e,n,r){for(var i=0;i<r.length;i++)L(r[i],r[++i],r[++i]);t.__c&&t.__c(n,e),e.some(function(n){try{e=n.__h,n.__h=[],e.some(function(e){e.call(n)})}catch(e){t.__e(e,n.__v)}})}function F(e){return typeof e!=`object`||!e||e.__b>0?e:_(e)?e.map(F):e.constructor===void 0?v({},e):null}function I(n,r,i,a,o,s,c,l,u){var d,f,p,h,g,v,b,x=i.props||m,S=r.props,C=r.type;if(C==`svg`?o=`http://www.w3.org/2000/svg`:C==`math`?o=`http://www.w3.org/1998/Math/MathML`:o||=`http://www.w3.org/1999/xhtml`,s!=null){for(d=0;d<s.length;d++)if((g=s[d])&&`setAttribute`in g==!!C&&(C?g.localName==C:g.nodeType==3)){n=g,s[d]=null;break}}if(n==null){if(C==null)return document.createTextNode(S);n=document.createElementNS(o,C,S.is&&S),l&&=(t.__m&&t.__m(r,s),!1),s=null}if(C==null)x===S||l&&n.data==S||(n.data=S);else{if(s=C==`textarea`&&S.defaultValue!=null?null:s&&e.call(n.childNodes),!l&&s!=null)for(x={},d=0;d<n.attributes.length;d++)x[(g=n.attributes[d]).name]=g.value;for(d in x)g=x[d],d==`dangerouslySetInnerHTML`?p=g:d==`children`||d in S||d==`value`&&`defaultValue`in S||d==`checked`&&`defaultChecked`in S||M(n,d,null,g,o);for(d in S)g=S[d],d==`children`?h=g:d==`dangerouslySetInnerHTML`?f=g:d==`value`?v=g:d==`checked`?b=g:l&&typeof g!=`function`||x[d]===g||M(n,d,g,x[d],o);if(f)l||p&&(f.__html==p.__html||f.__html==n.innerHTML)||(n.innerHTML=f.__html),r.__k=[];else if(p&&(n.innerHTML=``),ee(r.type==`template`?n.content:n,_(h)?h:[h],r,i,a,C==`foreignObject`?`http://www.w3.org/1999/xhtml`:o,s,c,s?s[0]:i.__k&&w(i,0),l,u),s!=null)for(d=s.length;d--;)y(s[d]);l&&C!=`textarea`||(d=`value`,C==`progress`&&v==null?n.removeAttribute(`value`):v!=null&&(v!==n[d]||C==`progress`&&!v||C==`option`&&v!=x[d])&&M(n,d,v,x[d],o),d=`checked`,b!=null&&b!=n[d]&&M(n,d,b,x[d],o))}return n}function L(e,n,r){try{if(typeof e==`function`){var i=typeof e.__u==`function`;i&&e.__u(),i&&n==null||(e.__u=e(n))}else e.current=n}catch(e){t.__e(e,r)}}function ie(e,n,r){var i,a;if(t.unmount&&t.unmount(e),(i=e.ref)&&(i.current&&i.current!=e.__e||L(i,null,n)),(i=e.__c)!=null){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(e){t.__e(e,n)}i.base=i.__P=null}if(i=e.__k)for(a=0;a<i.length;a++)i[a]&&ie(i[a],n,r||typeof e.type!=`function`);r||y(e.__e),e.__c=e.__=e.__e=void 0}function ae(e,t,n){return this.constructor(e,n)}function oe(n,r,i){var a,o,s,c;r==document&&(r=document.documentElement),t.__&&t.__(n,r),o=(a=typeof i==`function`)?null:i&&i.__k||r.__k,s=[],c=[],N(r,n=(!a&&i||r).__k=b(S,null,[n]),o||m,m,r.namespaceURI,!a&&i?[i]:o?null:r.firstChild?e.call(r.childNodes):null,s,!a&&i?i:o?o.__e:r.firstChild,a,c),P(s,n,c)}e=h.slice,t={__e:function(e,t,n,r){for(var i,a,o;t=t.__;)if((i=t.__c)&&!i.__)try{if((a=i.constructor)&&a.getDerivedStateFromError!=null&&(i.setState(a.getDerivedStateFromError(e)),o=i.__d),i.componentDidCatch!=null&&(i.componentDidCatch(e,r||{}),o=i.__d),o)return i.__E=i}catch(t){e=t}throw e}},n=0,C.prototype.setState=function(e,t){var n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=v({},this.state);typeof e==`function`&&(e=e(v({},n),this.props)),e&&v(n,e),e!=null&&this.__v&&(t&&this._sb.push(t),D(this))},C.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),D(this))},C.prototype.render=S,r=[],a=typeof Promise==`function`?Promise.prototype.then.bind(Promise.resolve()):setTimeout,o=function(e,t){return e.__v.__b-t.__v.__b},O.__r=0,s=Math.random().toString(8),c=`__d`+s,l=`__a`+s,u=/(PointerCapture)$|Capture$/i,d=0,f=ne(!1),p=ne(!0);var R,z,B,V,H=0,U=[],W=t,se=W.__b,ce=W.__r,G=W.diffed,le=W.__c,ue=W.unmount,de=W.__;function fe(e,t){W.__h&&W.__h(z,e,H||t),H=0;var n=z.__H||={__:[],__h:[]};return e>=n.__.length&&n.__.push({}),n.__[e]}function K(e){return H=1,q(be,e)}function q(e,t,n){var r=fe(R++,2);if(r.t=e,!r.__c&&(r.__=[n?n(t):be(void 0,t),function(e){var t=r.__N?r.__N[0]:r.__[0],n=r.t(t,e);t!==n&&(r.__N=[n,r.__[1]],r.__c.setState({}))}],r.__c=z,!z.__f)){var i=function(e,t,n){if(!r.__c.__H)return!0;var i=r.__c.__H.__.filter(function(e){return e.__c});if(i.every(function(e){return!e.__N}))return!a||a.call(this,e,t,n);var o=r.__c.props!==e;return i.some(function(e){if(e.__N){var t=e.__[0];e.__=e.__N,e.__N=void 0,t!==e.__[0]&&(o=!0)}}),a&&a.call(this,e,t,n)||o};z.__f=!0;var a=z.shouldComponentUpdate,o=z.componentWillUpdate;z.componentWillUpdate=function(e,t,n){if(this.__e){var r=a;a=void 0,i(e,t,n),a=r}o&&o.call(this,e,t,n)},z.shouldComponentUpdate=i}return r.__N||r.__}function J(e,t){var n=fe(R++,3);!W.__s&&ye(n.__H,t)&&(n.__=e,n.u=t,z.__H.__h.push(n))}function Y(e){return H=5,X(function(){return{current:e}},[])}function X(e,t){var n=fe(R++,7);return ye(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function pe(e,t){return H=8,X(function(){return e},t)}function me(){for(var e;e=U.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(_e),t.__h.some(ve),t.__h=[]}catch(n){t.__h=[],W.__e(n,e.__v)}}}W.__b=function(e){z=null,se&&se(e)},W.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),de&&de(e,t)},W.__r=function(e){ce&&ce(e),R=0;var t=(z=e.__c).__H;t&&(B===z?(t.__h=[],z.__h=[],t.__.some(function(e){e.__N&&(e.__=e.__N),e.u=e.__N=void 0})):(t.__h.some(_e),t.__h.some(ve),t.__h=[],R=0)),B=z},W.diffed=function(e){G&&G(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(U.push(t)!==1&&V===W.requestAnimationFrame||((V=W.requestAnimationFrame)||ge)(me)),t.__H.__.some(function(e){e.u&&(e.__H=e.u),e.u=void 0})),B=z=null},W.__c=function(e,t){t.some(function(e){try{e.__h.some(_e),e.__h=e.__h.filter(function(e){return!e.__||ve(e)})}catch(n){t.some(function(e){e.__h&&=[]}),t=[],W.__e(n,e.__v)}}),le&&le(e,t)},W.unmount=function(e){ue&&ue(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.some(function(e){try{_e(e)}catch(e){t=e}}),n.__H=void 0,t&&W.__e(t,n.__v))};var he=typeof requestAnimationFrame==`function`;function ge(e){var t,n=function(){clearTimeout(r),he&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,35);he&&(t=requestAnimationFrame(n))}function _e(e){var t=z,n=e.__c;typeof n==`function`&&(e.__c=void 0,n()),z=t}function ve(e){var t=z;e.__c=e.__(),z=t}function ye(e,t){return!e||e.length!==t.length||t.some(function(t,n){return t!==e[n]})}function be(e,t){return typeof t==`function`?t(e):t}async function Z(e){if(!e.ok){let t=e.statusText;try{let n=await e.json();t=n.error?.message??n.error?.code??t}catch{}throw Error(`${e.status}: ${t}`)}return await e.json()}var Q={board:()=>fetch(`/api/v1/board`).then(e=>Z(e)),state:()=>fetch(`/api/v1/state`).then(e=>Z(e)),meta:()=>fetch(`/api/v1/meta`).then(e=>Z(e)),capabilities:()=>fetch(`/api/v1/capabilities`).then(e=>Z(e)),projects:()=>fetch(`/api/v1/projects`).then(e=>Z(e)),switchProject:e=>fetch(`/api/v1/projects/switch`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({projectId:e})}).then(e=>Z(e)),createProject:e=>fetch(`/api/v1/projects`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e)}).then(e=>Z(e)),updateProject:(e,t)=>fetch(`/api/v1/projects/${encodeURIComponent(e)}`,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}).then(e=>Z(e)),removeProject:e=>fetch(`/api/v1/projects/${encodeURIComponent(e)}`,{method:`DELETE`}).then(e=>Z(e)),closeProject:()=>fetch(`/api/v1/projects/close`,{method:`POST`}).then(e=>Z(e)),settings:()=>fetch(`/api/v1/settings`).then(e=>Z(e)),updateSettings:e=>fetch(`/api/v1/settings`,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify(e)}).then(e=>Z(e)),states:()=>fetch(`/api/v1/states`).then(e=>Z(e)),labels:()=>fetch(`/api/v1/labels`).then(e=>Z(e)),sessions:()=>fetch(`/api/v1/sessions`).then(e=>Z(e)),usageLimits:()=>fetch(`/api/v1/usage-limits`).then(e=>Z(e)),createTicket:e=>fetch(`/api/v1/tickets`,{method:`POST`,body:e}).then(e=>Z(e)),moveIssue:(e,t)=>fetch(`/api/v1/issues/${encodeURIComponent(e)}/state`,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify({stateId:t})}).then(e=>Z(e)),updateIssue:(e,t)=>fetch(`/api/v1/issues/${encodeURIComponent(e)}`,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}).then(e=>Z(e)),issueDetail:e=>fetch(`/api/v1/issues/${encodeURIComponent(e)}/detail`).then(e=>Z(e)),addComment:(e,t)=>fetch(`/api/v1/issues/${encodeURIComponent(e)}/comments`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({body:t})}).then(e=>Z(e)),deleteIssue:e=>fetch(`/api/v1/issues/${encodeURIComponent(e)}`,{method:`DELETE`}).then(e=>Z(e)),addAttachment:(e,t)=>fetch(`/api/v1/issues/${encodeURIComponent(e)}/attachments`,{method:`POST`,body:t}).then(e=>Z(e)),removeAttachment:(e,t)=>fetch(`/api/v1/issues/${encodeURIComponent(e)}/attachments`,{method:`DELETE`,headers:{"content-type":`application/json`},body:JSON.stringify({url:t})}).then(e=>Z(e)),terminate:e=>fetch(`/api/v1/sessions/${encodeURIComponent(e)}/terminate`,{method:`POST`}).then(e=>Z(e)),unblock:e=>fetch(`/api/v1/sessions/${encodeURIComponent(e)}/unblock`,{method:`POST`}).then(e=>Z(e)),terminateAll:()=>fetch(`/api/v1/sessions/terminate-all`,{method:`POST`}).then(e=>Z(e)),refresh:()=>fetch(`/api/v1/refresh`,{method:`POST`}).then(e=>e.ok),logStream:e=>new EventSource(`/api/v1/sessions/${encodeURIComponent(e)}/logs`),eventStream:()=>new EventSource(`/api/v1/events`)},xe=0;Array.isArray;function $(e,n,r,i,a,o){n||={};var s,c,l=n;if(`ref`in l)for(c in l={},n)c==`ref`?s=n[c]:l[c]=n[c];var u={type:e,props:l,key:r,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--xe,__i:-1,__u:0,__source:a,__self:o};if(typeof e==`function`&&(s=e.defaultProps))for(c in s)l[c]===void 0&&(l[c]=s[c]);return t.vnode&&t.vnode(u),u}function Se(e){if(!e)return`—`;let t=new Date(e);return Number.isNaN(t.getTime())?`—`:t.toLocaleString()}function Ce(e){if(!e)return``;let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleString(void 0,{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`})}function we(e){if(!e)return``;let t=new Date(e);return Number.isNaN(t.getTime())?``:t.toLocaleTimeString(void 0,{hour12:!1})}function Te(e,t){if(!e)return 0;let n=new Date(e).getTime();return Number.isNaN(n)?0:Math.max(0,Math.floor((t-n)/1e3))}function Ee(e){if(e<60)return`${e}s`;let t=Math.floor(e/60),n=e%60;return t<60?`${t}m${String(n).padStart(2,`0`)}s`:`${Math.floor(t/60)}h${String(t%60).padStart(2,`0`)}m`}function De(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(+(e<1e4))}k`:`${(e/1e6).toFixed(1)}M`}function Oe(e){return e==null||e<=0?null:e<1?`$${e.toFixed(2)}`:`$${e.toFixed(e<100?2:0)}`}function ke(e,t){let n=new Date(e).getTime()-t;if(Number.isNaN(n)||n<=0)return`now`;let r=Math.floor(n/6e4);if(r<60)return`${r}m`;let i=Math.floor(r/60);return i<24?`${i}h${r%60?`${r%60}m`:``}`:`${Math.floor(i/24)}d${i%24?`${i%24}h`:``}`}function Ae(e,t){let n=new Date(e).getTime()-t;if(Number.isNaN(n)||n<=0)return`now`;let r=Math.round(n/1e3);return`${Math.floor(r/60)}:${String(r%60).padStart(2,`0`)}`}function je(e){return e.verb===`created`&&!e.field?`created the ticket`:e.field===`state`?`state: ${e.oldValue??`∅`} → ${e.newValue??`∅`}`:e.field?`${e.field}: ${e.oldValue??`∅`} → ${e.newValue??`∅`}`:e.verb}function Me(e){return e.type===`completed`||e.type===`canceled`||e.type===`cancelled`}function Ne(e){return e===null||e===0?null:[``,`Urgent`,`High`,`Medium`,`Low`][e]??`P${e}`}var Pe=`symphony-theme`;function Fe(){return document.documentElement.dataset.theme===`light`?`light`:`dark`}function Ie(e){document.documentElement.dataset.theme=e;try{localStorage.setItem(Pe,e)}catch{}}function Le(){let[e,t]=K(Fe),n=e===`dark`?`light`:`dark`;return $(`button`,{class:`iconbtn`,"data-test":`theme-toggle`,title:`Switch to ${n} mode`,"aria-label":`Switch to ${n} mode`,onClick:()=>{Ie(n),t(n)},children:e===`dark`?`☀`:`☾`})}var Re=`symphony-drawer-width`,ze=460;function Be(e){return Math.min(Math.max(e,360),Math.min(window.innerWidth*.96,1100))}function Ve(){try{let e=parseInt(localStorage.getItem(Re)??``,10);return Number.isFinite(e)?Be(e):ze}catch{return ze}}function He(e){try{localStorage.setItem(Re,String(Math.round(e)))}catch{}}function Ue(){let[e,t]=K(Ve),n=Y(null);return{width:e,handleProps:{onPointerDown:t=>{n.current={startX:t.clientX,startW:e,latest:e},t.currentTarget.setPointerCapture(t.pointerId),document.body.classList.add(`resizing-x`),t.preventDefault()},onPointerMove:e=>{let r=n.current;if(!r)return;let i=Be(r.startW+(r.startX-e.clientX));r.latest=i,t(i)},onPointerUp:e=>{let t=n.current;t&&(n.current=null,e.currentTarget.releasePointerCapture(e.pointerId),document.body.classList.remove(`resizing-x`),He(t.latest))},onDblClick:()=>{t(ze),He(ze)}}}}function We(){return $(`span`,{class:`live`})}function Ge(){return $(`span`,{class:`pulse-dot`})}var Ke={running:`RUNNING`,blocked:`NEEDS OPERATOR`,retrying:`RETRY`,paused:`PAUSED`};function qe(e){return e.status===`idle`?null:$(`span`,{class:`pill ${e.status}`,children:[e.status===`running`&&$(Ge,{}),e.children??Ke[e.status]]})}function Je(e){let[t,n]=K(new Set),r=e.live.meta,i=r?new Set([r.backlog_state,...r.active_states,r.review_state].filter(Boolean)):null,a=e=>i?i.has(e.name):!Me(e),o=e.board.states.filter(e=>a(e)&&!Me(e)),s=e.board.states.filter(e=>e.type===`completed`),c=s.filter(e=>!t.has(e.id)),l=s.filter(e=>t.has(e.id)),u=e=>n(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),d=new Set(e.board.states.map(e=>e.name)),f=Object.keys(e.board.columns).filter(t=>!d.has(t)&&(e.board.columns[t]?.length??0)>0);return $(`div`,{class:`board`,"data-test":`board`,children:[o.map(t=>$(Xe,{state:t,issues:e.board.columns[t.name]??[],...e},t.id)),l.map(t=>$(Xe,{state:t,issues:e.board.columns[t.name]??[],onCollapse:()=>u(t.id),...e},t.id)),f.map(t=>$(Xe,{state:{id:t,name:t,type:`unstarted`,position:999},issues:e.board.columns[t]??[],droppable:!1,...e},`extra-${t}`)),c.length>0&&$(`div`,{class:`rails`,children:c.map(t=>$(Ye,{state:t,count:(e.board.columns[t.name]??[]).length,onClick:()=>u(t.id)},t.id))})]})}function Ye(e){return $(`div`,{class:`rail${e.state.type===`completed`?` done`:``}`,"data-test":`rail-${e.state.name}`,title:`click to expand`,onClick:e.onClick,children:[$(`span`,{class:`n${e.count===0?` zero`:``}`,children:e.count}),$(`span`,{class:`lbl`,children:e.state.name})]})}function Xe(e){let[t,n]=K(!1),r=e.issues.some(e=>e.status===`running`),i=e.issues.some(e=>e.status===`blocked`),a=e.state.type===`started`,o=r||i,s=r?`active`:i?`blocked`:a?`review`:``,c=e.issues.length===0,l=e.droppable!==!1;return $(`section`,{class:`lane${o?` wide`:``}`,"data-test":`col-${e.state.name}`,children:[$(`div`,{class:`lane-head`,children:[$(`div`,{class:`name${r?` hot`:``}`,children:[r?$(We,{}):$(`span`,{class:`swatch`,style:Ze(e.state)}),$(`span`,{children:e.state.name})]}),$(`div`,{style:`display:flex;align-items:center;gap:6px`,children:[$(`span`,{class:`lane-count${r||i?` hot`:``}`,children:e.issues.length}),e.onCollapse&&$(`button`,{class:`lane-collapse`,title:`collapse`,onClick:e.onCollapse,children:`⟨`})]})]}),$(`div`,{class:`lane-body ${s}${t?` dragover`:``}${c&&!l?` empty-pad`:``}`,onDragOver:l?e=>{e.preventDefault(),n(!0)}:void 0,onDragLeave:l?()=>n(!1):void 0,onDrop:l?t=>{t.preventDefault(),n(!1);let r=t.dataTransfer?.getData(`text/plain`);r&&e.onMove(r,e.state.id)}:void 0,children:[c&&!l&&$(`span`,{class:`empty`,children:`none`}),e.issues.map(t=>$(Qe,{issue:t,live:e.live,started:a,onOpen:e.onOpen,onUnblock:e.onUnblock,onOpenAgent:e.onOpenAgent},t.id)),l&&$(`button`,{class:`ghost-card`,"data-test":`add-card`,title:`New ticket in ${e.state.name}`,onClick:()=>e.onAdd(e.state.id),children:[$(`span`,{class:`ghost-plus`,children:`+`}),` Add new`]})]})]})}function Ze(e){return e.color?`background:${e.color}`:``}function Qe(e){let t=e.issue,n=e.live.sessions.get(t.id),r=e.live.blocked.get(t.id),i=e.live.retry.get(t.id),a=e.live.meta?.branch_prefix??`symphony/`,o=e.live.meta?.max_turns,s=e.live.meta?.max_continuations??0,c=()=>e.onOpen(t),l=e=>e.stopPropagation();return $(`div`,{class:`card ${t.status}`,"data-test":`card`,"data-issue":t.id,draggable:!0,onClick:c,onDragStart:e=>e.dataTransfer?.setData(`text/plain`,t.id),children:[$(`div`,{class:`card-top`,children:[$(`span`,{class:`card-id`,children:t.identifier}),$(`span`,{class:`card-top-right`,children:[t.labels.includes(`rework`)&&$(`span`,{class:`pill rework`,title:`sent back for rework`,children:`rework`}),t.status!==`idle`&&$(qe,{status:t.status})]})]}),$(`span`,{class:`card-title`,children:t.title}),t.status===`running`&&n&&$(S,{children:[n.last_action&&$(`div`,{class:`action`,title:n.last_action,onClick:n=>{l(n),e.onOpenAgent(t.id)},children:[`↳ `,n.last_action,$(`span`,{class:`caret`,children:`▍`})]}),$(`div`,{class:`chips`,children:[$(`span`,{class:`chip`,children:[`turn `,n.turn_count,o?`/${o}`:``]}),n.continuation_count>0&&$(`span`,{class:`chip`,children:[`↻ `,n.continuation_count]}),n.tmux_session?$(`span`,{class:`chip tmux`,children:[`⧉ tmux:`,n.issue_identifier]}):$(`span`,{class:`chip dim`,children:n.backend})]})]}),t.status===`blocked`&&$(S,{children:[r&&$(`div`,{class:`card-note`,children:r.reason}),s>0&&$(`div`,{class:`chips`,children:$(`span`,{class:`chip cap`,children:[`↻ `,s,` cap`]})}),$(`button`,{class:`btn sm ghost`,"data-test":`unblock`,onClick:n=>{l(n),e.onUnblock(t.id)},children:`Unblock`})]}),t.status===`retrying`&&i&&$(`div`,{class:`chips`,children:[$(`span`,{class:`chip retry`,children:[`retry `,i.attempt]}),$(`span`,{class:`chip plain`,children:[`backoff `,Ae(i.due_at,e.live.now)]})]}),t.status===`idle`&&$(S,{children:[e.started&&$(`div`,{class:`chips`,children:$(`span`,{class:`chip dim`,children:[a,t.identifier]})}),$($e,{issue:t})]})]})}function $e(e){let t=e.issue,n=Ne(t.priority),r=t.updatedAt??t.createdAt,i=t.labels.filter(e=>e!==`rework`);return!n&&i.length===0&&!r?null:$(S,{children:[(n||i.length>0)&&$(`div`,{class:`chips`,children:[n&&$(`span`,{class:`chip dim`,children:n}),i.slice(0,3).map(e=>$(`span`,{class:`chip dim`,children:e},e))]}),r&&$(`span`,{class:`card-ts`,children:[`upd `,Ce(r)]})]})}function et(e){if(typeof e!=`object`||!e)return null;let t=e.todos;if(typeof t==`string`)try{t=JSON.parse(t)}catch{return null}if(!Array.isArray(t))return null;let n=[];for(let e of t){if(typeof e!=`object`||!e)continue;let t=e;if(typeof t.content!=`string`||t.content.trim()===``)continue;let r=t.status===`in_progress`||t.status===`completed`?t.status:`pending`;n.push({content:t.content,status:r,...typeof t.activeForm==`string`?{activeForm:t.activeForm}:{}})}return n.length>0?n:null}function tt(e){let[t,n]=K([]),[r,i]=K(null);return J(()=>{n([]),i(null);let t=Q.logStream(e);return t.onmessage=e=>{try{let t=JSON.parse(e.data),r=`sys`,a=t.type;if(t.type===`text_delta`)r=``,a=t.text??``;else if(t.type===`tool_use`){if(r=`tool`,a=`${t.toolName}`,t.toolName===`TodoWrite`){let e=et(t.input);e&&i(e)}}else t.type===`turn_failed`?(r=`err`,a=`turn failed: ${t.error??``}`):t.type===`turn_completed`&&(a=`turn completed`);if(a.trim()===``)return;n(e=>[...e.slice(-299),{cls:r,text:a,at:t.at??``}])}catch{}},t.onerror=()=>n(e=>e[e.length-1]?.text===`[stream closed]`?e:[...e.slice(-299),{cls:`sys`,text:`[stream closed]`,at:``}]),()=>t.close()},[e]),{lines:t,todos:r}}function nt(e){return e.sessions.length===0?$(`div`,{class:`center`,children:`no running agents`}):$(`div`,{class:`agents`,"data-test":`agents`,children:e.sessions.map(t=>{let n=e.issuesById.get(t.issue_id);return $(`div`,{class:`agent-card`,"data-test":`agent`,onClick:()=>e.onOpen(t.issue_id),children:[$(`div`,{class:`card-top`,children:[$(`div`,{class:`name hot`,style:`display:flex;align-items:center;gap:8px`,children:[$(We,{}),$(`span`,{class:`card-id`,style:`color:var(--fg)`,children:t.issue_identifier})]}),$(`span`,{class:`chip dim`,children:[t.backend,` · `,Ee(Te(t.started_at,e.now))]})]}),n&&$(`span`,{class:`card-title`,children:n.title}),$(`div`,{class:`log`,children:[`↳ `,t.last_action??`waiting…`,$(`span`,{class:`caret`,children:`▍`})]}),$(`div`,{class:`chips`,children:[$(`span`,{class:`chip`,children:[`turn `,t.turn_count]}),t.todo_progress&&$(`span`,{class:`chip`,children:[`☑ `,t.todo_progress.done,`/`,t.todo_progress.total]}),t.continuation_count>0&&$(`span`,{class:`chip`,children:[`↻ `,t.continuation_count]}),t.tokens.total_tokens>0&&$(`span`,{class:`chip`,title:`tokens this run (input+output)`,children:[`⛁ `,De(t.tokens.total_tokens),Oe(t.tokens.cost_usd)?` · ${Oe(t.tokens.cost_usd)}`:``]}),t.tmux_session&&$(`span`,{class:`chip tmux`,children:[`⧉ tmux:`,t.issue_identifier]})]})]},t.issue_id)})})}function rt(e){let t=e.session,{lines:n,todos:r}=tt(e.issueId),i=r??t?.todos??null,a=Y(null),[o,s]=K(!1),[c,l]=K(null),{width:u,handleProps:d}=Ue();J(()=>{a.current&&(a.current.scrollTop=a.current.scrollHeight)},[n]);let f=e.issue?.title??t?.issue_identifier??e.issueId,p=e.issue?.state??t?.state??``,m=`${e.meta?.branch_prefix??`symphony/`}${t?.issue_identifier??e.issue?.identifier??``}`,h=e.meta?.stall_timeout_ms?e.meta.stall_timeout_ms/1e3:0,g=Te(t?.last_event_at??t?.started_at??null,e.now),_=h>0?Math.min(100,Math.round(g/h*100)):0,v=async()=>{s(!0),l(null);try{await Q.terminate(e.issueId),e.onAfterAction(),e.onClose()}catch(e){l(e.message),s(!1)}};return $(`div`,{class:`drawer`,"data-test":`agent-drawer`,style:{width:`${u}px`},children:[$(`div`,{class:`drawer-resize`,"data-test":`drawer-resize`,...d}),$(`div`,{class:`drawer-head`,children:[$(`div`,{class:`row`,children:[$(`div`,{style:`display:flex;align-items:center;gap:9px`,children:[$(`span`,{class:`card-id`,style:`color:var(--blue)`,children:t?.issue_identifier??e.issue?.identifier??e.issueId}),t&&$(`span`,{class:`pill running`,children:[$(`span`,{class:`pulse-dot`}),`RUNNING`]})]}),$(`button`,{class:`iconbtn`,"data-test":`drawer-close`,onClick:e.onClose,children:`×`})]}),$(`span`,{class:`ttl`,children:f}),$(`div`,{class:`tagrow`,children:[t&&$(`span`,{class:`tag`,children:t.backend}),$(`span`,{class:`tag`,children:m}),p&&$(`span`,{class:`tag`,children:p})]})]}),t?$(S,{children:[$(`div`,{class:`stats`,children:[$(`div`,{class:`stat`,children:[$(`span`,{class:`n`,children:[t.turn_count,e.meta?.max_turns?$(`small`,{children:[`/`,e.meta.max_turns]}):null]}),$(`span`,{class:`k`,children:`turns`})]}),$(`div`,{class:`stat`,children:[$(`span`,{class:`n`,children:[t.continuation_count,e.meta?.max_continuations?$(`small`,{children:[`/`,e.meta.max_continuations]}):null]}),$(`span`,{class:`k`,children:`continuation`})]}),$(`div`,{class:`stat`,children:[$(`span`,{class:`n`,children:Ee(Te(t.started_at,e.now))}),$(`span`,{class:`k`,children:`elapsed`})]}),$(`div`,{class:`stat`,children:[$(`span`,{class:`n`,children:[De(t.tokens.total_tokens),Oe(t.tokens.cost_usd)?$(`small`,{children:Oe(t.tokens.cost_usd)}):null]}),$(`span`,{class:`k`,children:`tokens`})]})]}),h>0&&$(`div`,{class:`stall`,children:[$(`div`,{class:`row`,children:[$(`span`,{children:`Stall watchdog`}),$(`span`,{class:`ago`,children:[`last event `,g,`s ago`]})]}),$(`div`,{class:`meter${_>=60?` warn`:``}`,children:$(`i`,{style:`width:${Math.max(3,_)}%`})}),$(`span`,{class:`foot`,children:[`reconcile at `,Math.round(h/60),`m idle`]})]})]}):$(`div`,{class:`stall`,children:$(`span`,{class:`foot`,children:`session ended — showing last streamed events`})}),i&&i.length>0&&$(`div`,{class:`plan`,"data-test":`agent-plan`,children:[$(`div`,{class:`label section`,style:`display:flex;justify-content:space-between;align-items:center`,children:[$(`span`,{style:`font-size:10.5px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--muted-2)`,children:`Plan`}),$(`span`,{class:`ago`,children:[i.filter(e=>e.status===`completed`).length,`/`,i.length]})]}),$(`ul`,{class:`todos`,children:i.map((e,t)=>$(`li`,{class:`todo ${e.status}`,children:[$(`span`,{class:`box`,children:e.status===`completed`?`✓`:e.status===`in_progress`?`▸`:`○`}),$(`span`,{class:`txt`,children:e.status===`in_progress`&&e.activeForm?e.activeForm:e.content})]},t))})]}),$(`div`,{class:`activity`,children:[$(`div`,{class:`label section`,children:$(`span`,{style:`font-size:10.5px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--muted-2)`,children:`Activity`})}),$(`div`,{class:`log`,ref:a,"data-test":`drawer-log`,children:[n.length===0&&$(`p`,{class:`sys`,children:`waiting for events…`}),n.map((e,t)=>$(`p`,{class:e.cls,children:[e.at&&$(`span`,{style:`color:var(--faint-2)`,children:[we(e.at),` `]}),e.text]},t))]})]}),t?.tmux_session&&$(`div`,{class:`tmux`,children:[$(`div`,{class:`bar`,children:[$(`span`,{class:`s`,children:[$(`i`,{}),`tmux: `,t.tmux_session]}),$(`span`,{style:`color:var(--blue)`,children:`attach ↗`})]}),$(`div`,{class:`hint`,children:[`$ tmux attach -t `,t.tmux_session]})]}),c&&$(`div`,{class:`err-banner`,style:`flex:none`,children:[`⚠ `,c]}),$(`div`,{class:`drawer-actions`,children:$(`button`,{class:`btn danger block`,"data-test":`drawer-abort`,disabled:o||!t,onClick:v,children:o?`Aborting…`:`Abort`})})]})}var it=[{value:1,label:`Urgent`},{value:2,label:`High`},{value:3,label:`Medium`},{value:4,label:`Low`},{value:null,label:`None`}],at=[{value:``,label:`Default (workflow)`},{value:`claude-opus-4-8`,label:`Opus 4.8`},{value:`claude-opus-4-7`,label:`Opus 4.7`},{value:`claude-sonnet-4-6`,label:`Sonnet 4.6`},{value:`claude-haiku-4-5`,label:`Haiku 4.5`},{value:`claude-fable-5`,label:`Fable 5`}],ot=[{value:``,label:`Default`},{value:`low`,label:`Low`},{value:`medium`,label:`Medium`},{value:`high`,label:`High`},{value:`xhigh`,label:`X-High`},{value:`max`,label:`Max`}];function st(e){let[t,n]=K(``),[r,i]=K(``),[a,o]=K(e.preselectedStateId??e.states[0]?.id??``),[s,c]=K(``),[l,u]=K(``),[d,f]=K([]),[p,m]=K(!1),[h,g]=K(!1),[_,v]=K(null),y=Y(null),b=Y(1),x=Y([]);x.current=d,J(()=>()=>x.current.forEach(e=>e.preview&&URL.revokeObjectURL(e.preview)),[]);let S=e=>{let t=[];for(let n of Array.from(e??[])){let e=n.type.startsWith(`image/`);t.push({id:b.current++,file:n,preview:e?URL.createObjectURL(n):null,ext:(n.name.split(`.`).pop()??`file`).toUpperCase().slice(0,4)})}t.length&&f(e=>[...e,...t])},C=e=>f(t=>{let n=t.find(t=>t.id===e);return n?.preview&&URL.revokeObjectURL(n.preview),t.filter(t=>t.id!==e)});return $(`div`,{class:`overlay`,onClick:e.onClose,children:$(`div`,{class:`modal create-modal`,"data-test":`create-modal`,onClick:e=>e.stopPropagation(),children:[$(`div`,{class:`modal-head`,children:[$(`h3`,{children:`New ticket`}),$(`button`,{class:`iconbtn`,"data-test":`create-close`,title:`Close`,onClick:e.onClose,children:`×`})]}),_&&$(`div`,{class:`err-banner`,style:`border-radius:7px;margin-bottom:8px`,children:_}),$(`label`,{class:`field`,children:[$(`span`,{children:`Title`}),$(`input`,{"data-test":`ticket-title`,placeholder:`Short, imperative summary…`,value:t,onInput:e=>n(e.target.value)})]}),$(`label`,{class:`field`,children:[$(`span`,{children:`Description (markdown)`}),$(`textarea`,{"data-test":`ticket-desc`,placeholder:`Context, acceptance criteria, links…`,value:r,onInput:e=>i(e.target.value)})]}),$(`label`,{class:`field`,children:[$(`span`,{children:`State`}),$(`select`,{"data-test":`ticket-state`,value:a,onChange:e=>o(e.target.value),children:e.states.map(e=>$(`option`,{value:e.id,children:e.name},e.id))})]}),$(`div`,{class:`field`,children:[$(`span`,{class:`subhead`,children:`Agent`}),$(`div`,{class:`field-row`,style:`margin-top:0`,children:[$(`label`,{class:`field`,style:`margin-top:0`,children:[$(`span`,{children:`Model`}),$(`select`,{"data-test":`ticket-model`,value:s,onChange:e=>c(e.target.value),children:at.map(e=>$(`option`,{value:e.value,children:e.label},e.value))})]}),$(`label`,{class:`field`,style:`margin-top:0`,children:[$(`span`,{children:`Effort`}),$(`select`,{"data-test":`ticket-effort`,value:l,onChange:e=>u(e.target.value),children:ot.map(e=>$(`option`,{value:e.value,children:e.label},e.value))})]})]})]}),$(`div`,{class:`field`,children:[$(`span`,{children:`Attachments`}),$(`input`,{type:`file`,multiple:!0,ref:y,"data-test":`ticket-files`,style:`display:none`,accept:`image/*,.md,.log,.txt,.json,.patch,.diff`,onChange:e=>{S(e.target.files),e.target.value=``}}),$(`div`,{class:`att-grid`,children:[$(`div`,{class:`dropzone${p?` over`:``}`,onClick:()=>y.current?.click(),onDragOver:e=>{e.preventDefault(),m(!0)},onDragLeave:()=>m(!1),onDrop:e=>{e.preventDefault(),m(!1),S(e.dataTransfer?.files??null)},children:[$(`span`,{class:`ic`,children:`↑`}),$(`span`,{class:`t`,children:`Add files`}),$(`span`,{class:`h`,children:`drop screenshots or click`})]}),d.map(e=>$(`div`,{class:`att`,children:[e.preview?$(`img`,{src:e.preview,alt:e.file.name,style:`width:100%;height:100%;object-fit:cover`}):$(`span`,{class:`ext`,children:e.ext}),$(`button`,{class:`rm`,onClick:()=>C(e.id),children:`×`}),$(`span`,{class:`name`,children:e.file.name})]},e.id))]})]}),$(`div`,{class:`modal-actions`,children:[$(`button`,{class:`btn ghost sm`,onClick:e.onClose,children:`Cancel`}),$(`button`,{class:`btn primary sm`,"data-test":`create-submit`,disabled:h,onClick:async()=>{if(!t.trim()){v(`Title is required`);return}g(!0),v(null);try{let n=new FormData;n.set(`title`,t),r&&n.set(`description`,r),a&&n.set(`stateId`,a),s&&n.set(`model`,s),l&&n.set(`effort`,l);for(let e of d)n.append(`files`,e.file,e.file.name);await Q.createTicket(n),e.onCreated()}catch(e){v(e.message),g(!1)}},children:h?`Creating…`:`Create`})]})]})})}function ct(e){let t=e.issue,[n,r]=K(null),[i,a]=K(`comments`),[o,s]=K(``),[c,l]=K(!1),[u,d]=K(null),[f,p]=K(!1),[m,h]=K(``),[g,_]=K(t.title),[v,y]=K(``),[b,x]=K(t.priority),[C,w]=K(t.labels),[T,E]=K(``),[D,O]=K(``),[ee,te]=K(``),[k,A]=K([]),[j,M]=K(!1),ne=Y(!1),[N,re]=K(!1),[P,F]=K(!1),I=Y(null),[L,ie]=K(!1),[ae,oe]=K(!1),R=Y(null),z=()=>{ne.current=!0,M(!0),p(!1)};J(()=>{if(!P)return;let e=e=>{I.current&&!I.current.contains(e.target)&&F(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[P]);let B=pe(async()=>{try{let e=await Q.issueDetail(t.id);r(e),d(null),e&&!ne.current&&(_(e.title),y(e.description??``),x(e.priority),w(e.labels),E(e.model??``),O(e.effort??``))}catch(e){d(e.message)}},[t.id]);J(()=>{B()},[B]),J(()=>{Q.labels().then(A).catch(()=>void 0)},[]);let V=n?.state??t.state,H=async n=>{l(!0);try{await Q.moveIssue(t.id,n),await B(),e.onChanged()}catch(e){d(e.message)}finally{l(!1)}},U=async()=>{if(o.trim()){l(!0);try{await Q.addComment(t.id,o),s(``),await B()}catch(e){d(e.message)}finally{l(!1)}}},W=e=>{let t=e.trim();!t||C.some(e=>e.toLowerCase()===t.toLowerCase())||(w(e=>[...e,t]),te(``),z())},se=e=>{w(t=>t.filter(t=>t!==e)),z()},ce=async()=>{if(!g.trim()){d(`Title is required`);return}l(!0),d(null);try{await Q.updateIssue(t.id,{title:g.trim(),description:v,priority:b,labels:C,model:T||null,effort:D||null}),ne.current=!1,M(!1),p(!0),await B(),e.onChanged()}catch(e){d(e.message)}finally{l(!1)}},G=e.meta?.review_state,le=G!==void 0&&V===G,ue=e.states.find(e=>e.type===`completed`),de=e.states.find(e=>e.type===`canceled`||e.type===`cancelled`),fe=e.meta?.in_progress_state,q=fe?e.states.find(e=>e.name===fe):void 0,X=async n=>{if(n){l(!0),d(null);try{m.trim()&&await Q.addComment(t.id,m.trim()),await Q.moveIssue(t.id,n.id),h(``),await B(),e.onChanged()}catch(e){d(e.message)}finally{l(!1)}}},me=async()=>{if(q){l(!0),d(null);try{if(m.trim()&&await Q.addComment(t.id,m.trim()),!C.includes(`rework`)){let e=[...C,`rework`];w(e),await Q.updateIssue(t.id,{labels:e})}await Q.moveIssue(t.id,q.id),h(``),await B(),e.onChanged()}catch(e){d(e.message)}finally{l(!1)}}},he=async()=>{if(q){l(!0),d(null);try{V!==q.name&&await Q.moveIssue(t.id,q.id),await Q.refresh().catch(()=>void 0),await B(),e.onChanged()}catch(e){d(e.message)}finally{l(!1)}}},ge=async()=>{l(!0),d(null);try{await Q.deleteIssue(t.id),e.onChanged(),e.onClose()}catch(e){d(e.message),l(!1),ie(!1)}},_e=async e=>{let n=Array.from(e??[]);if(n.length!==0){l(!0),d(null);try{for(let e of n){let n=new FormData;n.append(`files`,e,e.name),await Q.addAttachment(t.id,n)}await B()}catch(e){d(e.message)}finally{l(!1)}}},ve=async e=>{l(!0),d(null);try{await Q.removeAttachment(t.id,e),await B()}catch(e){d(e.message)}finally{l(!1)}},ye=`${e.meta?.branch_prefix??`symphony/`}${t.identifier}`,be=e.session?.backend??e.meta?.backend??`—`,Z=t.identifier.split(`-`)[0]??`SYM`,xe=n?.worktree_path??null,Ce=n?.attachments??[],we=e.states.find(e=>e.name===V)?.type??``,Te=we===`completed`||we===`canceled`||we===`cancelled`,Ee=e.session!==void 0,ke=e=>/\.(png|jpe?g|gif|webp|svg)(\?|$)/i.test(e),Ae=e=>((e.split(`/`).pop()??e).split(`.`).pop()??`file`).toUpperCase().slice(0,4);return $(`div`,{class:`overlay`,onClick:e.onClose,children:$(`div`,{class:`ticket`,"data-test":`ticket-detail`,onClick:e=>e.stopPropagation(),children:[$(`div`,{class:`ticket-head`,children:[$(`div`,{class:`crumb`,children:[$(`span`,{class:`scope`,children:Z}),$(`span`,{style:`color:var(--faint-2)`,children:`/`}),$(`span`,{class:`id`,children:t.identifier}),t.status!==`idle`&&$(qe,{status:t.status})]}),$(`div`,{class:`head-actions`,ref:I,children:[$(`button`,{class:`iconbtn`,"data-test":`ticket-menu`,title:`More actions`,onClick:()=>F(e=>!e),children:`⋯`}),P&&$(`div`,{class:`head-menu`,"data-test":`ticket-menu-pop`,children:[$(`button`,{onClick:()=>{navigator.clipboard?.writeText(t.identifier),F(!1)},children:`Copy id`}),t.url&&$(`a`,{href:t.url,target:`_blank`,rel:`noreferrer`,onClick:()=>F(!1),children:`Open link ↗`}),xe&&$(`a`,{href:`vscode://file${encodeURI(xe)}`,onClick:()=>F(!1),children:`Open in VS Code ↗`})]}),$(`button`,{class:`iconbtn`,"data-test":`ticket-close`,onClick:e.onClose,children:`×`})]})]}),$(`div`,{class:`ticket-body`,children:[$(`div`,{class:`ticket-main`,children:[$(`div`,{children:[$(`input`,{class:`title-edit`,"data-test":`edit-title`,value:g,onInput:e=>{_(e.target.value),z()}}),$(`div`,{class:`opened`,children:[`Opened `,Se(n?.createdAt??t.createdAt)]})]}),u&&$(`div`,{class:`err-banner`,style:`border-radius:7px`,children:u}),$(`div`,{class:`section`,children:[$(`div`,{class:`label`,children:`Description`}),N?$(`textarea`,{class:`desc-edit`,"data-test":`edit-description`,autofocus:!0,placeholder:`Add a description… (markdown)`,value:v,onInput:e=>{y(e.target.value),z()},onBlur:()=>re(!1)}):$(`div`,{class:`desc desc-view`,"data-test":`desc-view`,title:`Click to edit`,onClick:()=>re(!0),children:v.trim()?v:$(`span`,{class:`empty`,children:`Add a description… (markdown)`})})]}),$(`div`,{class:`section`,children:[$(`div`,{class:`label`,children:[`Attachments`,Ce.length>0&&$(`span`,{class:`count`,children:Ce.length})]}),$(`input`,{type:`file`,multiple:!0,ref:R,"data-test":`att-files`,style:`display:none`,accept:`image/*,.md,.log,.txt,.json,.patch,.diff`,onChange:e=>{_e(e.target.files),e.target.value=``}}),$(`div`,{class:`att-grid`,children:[$(`div`,{class:`dropzone${ae?` over`:``}`,onClick:()=>R.current?.click(),onDragOver:e=>{e.preventDefault(),oe(!0)},onDragLeave:()=>oe(!1),onDrop:e=>{e.preventDefault(),oe(!1),_e(e.dataTransfer?.files??null)},children:[$(`span`,{class:`ic`,children:`↑`}),$(`span`,{class:`t`,children:`Add files`}),$(`span`,{class:`h`,children:`drop screenshots or click`})]}),Ce.map(e=>$(`div`,{class:`att`,children:[ke(e.url)?$(`img`,{src:e.url,alt:e.title,style:`width:100%;height:100%;object-fit:cover`}):$(`span`,{class:`ext`,children:Ae(e.url)}),$(`button`,{class:`rm`,"data-test":`att-remove`,disabled:c,onClick:()=>void ve(e.url),children:`×`}),$(`span`,{class:`name`,children:e.title})]},e.url))]})]}),$(`div`,{class:`section`,children:[$(`div`,{class:`subtabs`,children:[$(`button`,{class:i===`comments`?`on`:``,onClick:()=>a(`comments`),children:`Comments`}),$(`button`,{class:i===`history`?`on`:``,onClick:()=>a(`history`),children:`History`})]}),i===`comments`&&$(`div`,{class:`stream`,"data-test":`detail-comments`,children:[n&&n.comments.length===0&&$(`div`,{class:`empty`,children:`no comments`}),n?.comments.map((e,t)=>$(`div`,{class:`cmt`,children:[$(`div`,{class:`avatar`,children:`•`}),$(`div`,{class:`body`,children:[$(`div`,{class:`by`,children:$(`span`,{class:`when`,children:Se(e.at)})}),$(`div`,{class:`txt`,children:e.body})]})]},t)),$(`div`,{class:`cmt`,children:[$(`div`,{class:`avatar`,children:`Y`}),$(`div`,{class:`body`,children:[$(`textarea`,{"data-test":`detail-comment`,placeholder:`Add a comment…`,value:o,onInput:e=>s(e.target.value)}),$(`div`,{class:`modal-actions`,style:`margin-top:9px`,children:$(`button`,{class:`btn primary sm`,disabled:c||!o.trim(),onClick:U,children:`Comment`})})]})]})]}),i===`history`&&$(`div`,{style:`margin-top:14px`,"data-test":`detail-history`,children:[!n&&$(`div`,{class:`empty`,children:`loading…`}),n&&n.activity.length===0&&$(`div`,{class:`empty`,children:`no activity`}),n?.activity.map((e,t)=>$(`div`,{class:`event`,children:[$(`span`,{class:`when`,children:Se(e.at)}),$(`span`,{children:je(e)})]},t))]})]})]}),$(`div`,{class:`ticket-side`,children:[Ee&&e.onViewRunningAgent?$(`button`,{class:`btn primary block dispatch-btn`,"data-test":`view-running-agent`,title:`Open the live agent view for this ticket`,onClick:()=>e.onViewRunningAgent?.(t.id),children:`▶ View running agent`}):!Te&&q?$(`button`,{class:`btn primary block dispatch-btn`,"data-test":`dispatch-agent`,disabled:c,title:`Dispatch — move to ${q.name} and run now`,onClick:()=>void he(),children:`▶ Dispatch to agent`}):null,$(`label`,{class:`field`,style:`margin:0`,children:[$(`span`,{children:`Status`}),$(`select`,{"data-test":`detail-state`,disabled:c,value:V,onChange:t=>{let n=t.target.value,r=e.states.find(e=>e.name===n);r&&r.name!==V&&H(r.id)},children:e.states.map(e=>$(`option`,{value:e.name,children:e.name},e.id))})]}),$(`div`,{class:`field`,style:`margin:0`,children:[$(`span`,{children:`Assignee`}),$(`div`,{class:`assignee`,"data-test":`assignee`,children:[$(`span`,{class:`ai-badge`,children:`AI`}),$(`span`,{class:`an`,children:be})]})]}),$(`label`,{class:`field`,style:`margin:0`,children:[$(`span`,{children:`Priority`}),$(`select`,{"data-test":`edit-priority`,disabled:c,value:b===null?`none`:String(b),onChange:e=>{let t=e.target.value;x(t===`none`?null:Number(t)),z()},children:it.map(e=>$(`option`,{value:e.value===null?`none`:String(e.value),children:e.label},e.label))})]}),$(`label`,{class:`field`,style:`margin:0`,children:[$(`span`,{children:`Model`}),$(`select`,{"data-test":`edit-model`,disabled:c,value:T,onChange:e=>{E(e.target.value),z()},children:at.map(e=>$(`option`,{value:e.value,children:e.label},e.value))})]}),$(`label`,{class:`field`,style:`margin:0`,children:[$(`span`,{children:`Effort`}),$(`select`,{"data-test":`edit-effort`,disabled:c,value:D,onChange:e=>{O(e.target.value),z()},children:ot.map(e=>$(`option`,{value:e.value,children:e.label},e.value))})]}),$(`div`,{children:[$(`div`,{class:`label`,children:`Labels`}),$(`div`,{class:`chips`,style:`margin-bottom:8px`,children:[C.length===0&&$(`span`,{class:`empty`,children:`none`}),C.map(e=>$(`span`,{class:`chip dim label-chip`,children:[e,$(`button`,{class:`label-x`,"data-test":`label-remove`,onClick:()=>se(e),children:`×`})]},e))]}),$(`input`,{"data-test":`label-add`,list:`ticket-labels`,placeholder:`add label…`,value:ee,onInput:e=>te(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),W(ee))}}),$(`datalist`,{id:`ticket-labels`,children:k.map(e=>$(`option`,{value:e.name},e.id))})]}),le&&$(S,{children:[$(`div`,{class:`hr`}),$(`div`,{class:`review-actions`,"data-test":`review-actions`,children:[$(`div`,{class:`label`,children:`Review`}),$(`textarea`,{class:`review-notes`,"data-test":`review-notes`,placeholder:`Notes (optional, attached to the action)…`,value:m,disabled:c,onInput:e=>h(e.target.value)}),$(`div`,{class:`review-btns`,children:[$(`button`,{class:`btn sm primary`,"data-test":`review-accept`,disabled:c||!ue,title:ue?`Accept — move to Done`:`no Done state in workflow`,onClick:()=>void X(ue),children:`Accept`}),$(`button`,{class:`btn sm`,"data-test":`review-rework`,disabled:c||!q,title:q?`Rework — tag 'rework' and send back to ${q.name}`:`no In Progress state`,onClick:()=>void me(),children:`Rework`}),$(`button`,{class:`btn sm danger`,"data-test":`review-discard`,disabled:c||!de,title:de?`Discard — move to Cancelled`:`no Cancelled state`,onClick:()=>void X(de),children:`Discard`})]})]})]}),$(`div`,{class:`hr`}),$(`div`,{style:`display:flex;flex-direction:column;gap:11px`,children:[$(`div`,{class:`side-row`,children:[$(`span`,{class:`k`,children:`Branch`}),$(`span`,{class:`v blue`,children:ye})]}),xe&&$(`div`,{class:`side-row`,children:[$(`span`,{class:`k`,children:`Workspace`}),$(`a`,{class:`v blue`,"data-test":`open-vscode`,href:`vscode://file${encodeURI(xe)}`,title:xe,children:`open in VS Code ↗`})]}),$(`div`,{class:`side-row`,children:[$(`span`,{class:`k`,children:`Backend`}),$(`span`,{class:`v`,children:be})]}),e.session&&$(`div`,{class:`side-row`,children:[$(`span`,{class:`k`,children:`Last run`}),$(`span`,{class:`v`,children:[`turn `,e.session.turn_count,e.session.continuation_count>0?` · ↻${e.session.continuation_count}`:``]})]}),n?.usage&&n.usage.total_tokens>0&&$(`div`,{class:`side-row`,children:[$(`span`,{class:`k`,children:`Usage`}),$(`span`,{class:`v`,title:`cumulative tokens (input+output) for this task`,children:[De(n.usage.total_tokens),` tok`,Oe(n.usage.cost_usd)?` · ${Oe(n.usage.cost_usd)}`:``]})]}),$(`div`,{class:`side-row`,children:[$(`span`,{class:`k`,children:`Created`}),$(`span`,{class:`v`,children:Se(n?.createdAt??t.createdAt)})]}),$(`div`,{class:`side-row`,children:[$(`span`,{class:`k`,children:`Updated`}),$(`span`,{class:`v`,children:Se(n?.updatedAt??t.updatedAt)})]}),t.url&&$(`div`,{class:`side-row`,children:[$(`span`,{class:`k`,children:`Link`}),$(`a`,{class:`v blue`,href:t.url,target:`_blank`,rel:`noreferrer`,children:`open ↗`})]})]})]})]}),$(`div`,{class:`ticket-foot`,children:[$(`div`,{class:`foot-left`,children:L?$(`div`,{class:`confirm-del`,"data-test":`confirm-delete`,children:[$(`span`,{children:`Delete this ticket?`}),$(`button`,{class:`btn danger sm`,"data-test":`confirm-delete-yes`,disabled:c,onClick:()=>void ge(),children:c?`Deleting…`:`Delete`}),$(`button`,{class:`btn ghost sm`,disabled:c,onClick:()=>ie(!1),children:`Keep`})]}):$(`button`,{class:`btn danger sm`,"data-test":`ticket-delete`,disabled:Ee,title:Ee?`terminate the agent first`:`Delete this ticket`,onClick:()=>ie(!0),children:`Delete`})}),$(`div`,{style:`display:flex;align-items:center;gap:9px`,children:[$(`span`,{class:`muted`,style:`font-size:11.5px`,children:f?`Saved ✓`:j?`Unsaved changes`:``}),$(`button`,{class:`btn ghost sm`,onClick:e.onClose,children:`Cancel`}),$(`button`,{class:`btn primary sm`,"data-test":`ticket-save`,disabled:c||!j,onClick:ce,children:c?`Saving…`:`Save changes`})]})]})]})})}function lt(e){let[t,n]=K(!1),r=Y(null);J(()=>{if(!t)return;let e=e=>{r.current&&!r.current.contains(e.target)&&n(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[t]);let i=e.projects.find(t=>t.project_id===e.activeProjectId),a=e.switching?`switching…`:i?.name??`No project`;return $(`div`,{class:`proj`,ref:r,children:[$(`button`,{class:`proj-btn`,"data-test":`project-switcher`,disabled:e.switching,onClick:()=>n(e=>!e),children:[$(`span`,{class:`proj-ico`,children:`▦`}),$(`span`,{class:`proj-name`,children:a}),$(`span`,{class:`proj-caret`,children:`▾`})]}),t&&$(`div`,{class:`menu`,"data-test":`project-menu`,children:[$(`div`,{class:`menu-head`,children:`Projects`}),e.projects.length===0&&$(`div`,{class:`menu-empty`,children:`no projects found`}),e.projects.map(t=>{let r=t.registered&&!t.active;return $(`div`,{class:`menu-row`,children:[$(`button`,{class:`menu-item${t.active?` on`:``}`,"data-test":`project-item`,disabled:!r,title:t.registered?t.repo??``:`not registered — create it to switch`,onClick:()=>{r&&(n(!1),e.onSwitch(t.project_id))},children:[$(`span`,{class:`mi-check`,children:t.active?`✓`:``}),$(`span`,{class:`mi-body`,children:[$(`span`,{class:`mi-name`,children:[t.name,t.identifier?$(`span`,{class:`mi-id`,children:[` `,t.identifier]}):null]}),$(`span`,{class:`mi-sub`,children:t.registered?t.repo??`—`:`not registered`})]})]}),t.repo_path&&$(`a`,{class:`mi-open`,"data-test":`project-open`,title:`Open ${t.repo_path} in VS Code`,href:`vscode://file${t.repo_path}`,onClick:e=>e.stopPropagation(),children:`↗`})]},t.project_id)}),$(`div`,{class:`menu-sep`}),$(`button`,{class:`menu-item add`,"data-test":`project-new`,onClick:()=>{n(!1),e.onNew()},children:[$(`span`,{class:`mi-check`,children:`+`}),$(`span`,{class:`mi-body`,children:[$(`span`,{class:`mi-name`,children:`Add / import project`}),$(`span`,{class:`mi-sub`,children:`point at a folder — created + git-initialized if needed`})]})]}),$(`button`,{class:`menu-item manage`,"data-test":`project-manage`,onClick:()=>{n(!1),e.onManage()},children:[$(`span`,{class:`mi-check`,children:`⚙`}),$(`span`,{class:`mi-body`,children:[$(`span`,{class:`mi-name`,children:`Manage projects`}),$(`span`,{class:`mi-sub`,children:`rename · re-point · remove`})]})]})]})]})}function ut(e){return e.toUpperCase().replace(/[^A-Z0-9]/g,``).slice(0,8)}function dt(e){let[t,n]=K(``),[r,i]=K(``),[a,o]=K(!1),[s,c]=K(``),[l,u]=K(!1),[d,f]=K(null),p=e=>{n(e),a||i(ut(e))};return $(`div`,{class:`overlay`,onClick:e.onClose,children:$(`div`,{class:`modal`,"data-test":`create-project-modal`,onClick:e=>e.stopPropagation(),children:[$(`h3`,{children:`Add / import project`}),d&&$(`div`,{class:`err-banner`,style:`border-radius:7px;margin-bottom:8px`,children:d}),$(`label`,{class:`field`,children:[$(`span`,{children:`Name`}),$(`input`,{"data-test":`project-name`,value:t,onInput:e=>p(e.target.value)})]}),$(`label`,{class:`field`,children:[$(`span`,{children:`Identifier (issue id prefix)`}),$(`input`,{"data-test":`project-identifier`,value:r,onInput:e=>{o(!0),i(e.target.value.toUpperCase())}})]}),$(`label`,{class:`field`,children:[$(`span`,{children:`Project folder`}),$(`input`,{"data-test":`project-repo`,placeholder:`~/code/my-project`,value:s,onInput:e=>c(e.target.value)}),$(`span`,{class:`field-hint`,children:`An existing folder is imported as-is; a missing one is created and git-initialized on first switch.`})]}),$(`div`,{class:`modal-actions`,children:[$(`button`,{class:`btn ghost sm`,onClick:e.onClose,children:`Cancel`}),$(`button`,{class:`btn primary sm`,"data-test":`project-create-submit`,disabled:l,onClick:async()=>{if(!t.trim()||!r.trim()||!s.trim()){f(`Name, identifier and repo are all required`);return}u(!0),f(null);try{let n=await Q.createProject({name:t.trim(),identifier:r.trim(),repo:s.trim()});e.onCreated(n)}catch(e){f(e.message),u(!1)}},children:l?`Creating…`:`Create project`})]})]})})}function ft(e){let t=e.projects.some(e=>e.active),[n,r]=K(null),[i,a]=K(null),[o,s]=K(null),[c,l]=K(null),u=async(t,n)=>{r(t),a(null);try{await n(),e.onChanged()}catch(e){a(e.message)}finally{r(null)}},d=async()=>{if(!o)return;let e=o.value.trim(),{id:t,field:n}=o;if(s(null),!e)return;let r=n===`repo`?{repo:e}:{name:e};await u(t,()=>Q.updateProject(t,r))};return $(`div`,{class:`overlay`,onClick:e.onClose,children:$(`div`,{class:`modal pm-modal`,"data-test":`manage-projects-modal`,onClick:e=>e.stopPropagation(),children:[$(`div`,{class:`modal-head`,children:[$(`h3`,{children:`Projects`}),$(`button`,{class:`iconbtn`,"data-test":`pm-close`,title:`Close`,onClick:e.onClose,children:`×`})]}),i&&$(`div`,{class:`err-banner`,style:`border-radius:7px;margin-bottom:8px`,children:i}),$(`div`,{class:`pm-list`,"data-test":`pm-list`,children:[e.projects.length===0&&$(`div`,{class:`menu-empty`,children:`no projects found`}),e.projects.map(t=>{let r=o&&o.id===t.project_id?o:null,i=n===t.project_id;return $(`div`,{class:`pm-row${t.active?` active`:``}`,"data-test":`pm-row`,children:[$(`div`,{class:`pm-main`,children:[$(`div`,{class:`pm-name`,children:[$(`span`,{class:`pm-title`,children:t.name}),t.identifier&&$(`span`,{class:`mi-id`,children:t.identifier}),t.active&&$(`span`,{class:`pm-badge on`,children:`active`}),!t.registered&&$(`span`,{class:`pm-badge muted`,children:`not registered`})]}),r?$(`div`,{class:`pm-edit`,children:[$(`input`,{autofocus:!0,"data-test":`pm-edit-input`,value:r.value,placeholder:r.field===`repo`?`~/code/my-project`:`Project name`,onInput:e=>s({...r,value:e.target.value}),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),d()),e.key===`Escape`&&s(null)}}),$(`button`,{class:`btn primary sm`,disabled:i,onClick:()=>void d(),children:`Save`}),$(`button`,{class:`btn ghost sm`,onClick:()=>s(null),children:`Cancel`}),r.field===`repo`&&t.active&&$(`span`,{class:`pm-warn`,children:`re-points the live workspace — restarts agents`})]}):$(`div`,{class:`pm-sub`,children:t.repo_path??t.repo??(t.registered?`—`:`on disk, unregistered`)})]}),!r&&$(`div`,{class:`pm-actions`,children:[t.repo_path&&$(`a`,{class:`iconbtn`,"data-test":`pm-open`,title:`Open ${t.repo_path} in VS Code`,href:`vscode://file${t.repo_path}`,onClick:e=>e.stopPropagation(),children:`↗`}),t.registered&&!t.active&&$(`button`,{class:`btn ghost sm`,"data-test":`pm-switch`,disabled:i,onClick:()=>e.onSwitch(t.project_id),children:`Switch`}),t.registered&&$(S,{children:[$(`button`,{class:`btn ghost sm`,"data-test":`pm-rename`,disabled:i,onClick:()=>s({id:t.project_id,field:`name`,value:t.name}),children:`Rename`}),$(`button`,{class:`btn ghost sm`,"data-test":`pm-repoint`,disabled:i,onClick:()=>s({id:t.project_id,field:`repo`,value:t.repo??``}),children:`Re-point`}),c===t.project_id?$(`span`,{class:`pm-confirm`,"data-test":`pm-confirm-remove`,children:[$(`button`,{class:`btn danger sm`,disabled:i,onClick:()=>{l(null),u(t.project_id,()=>Q.removeProject(t.project_id))},children:`Remove`}),$(`button`,{class:`btn ghost sm`,onClick:()=>l(null),children:`Keep`})]}):$(`button`,{class:`btn danger sm`,"data-test":`pm-remove`,disabled:i||t.active,title:t.active?`switch to another project first`:`unregister (keeps task data on disk)`,onClick:()=>l(t.project_id),children:`Remove`})]})]})]},t.project_id)})]}),$(`div`,{class:`modal-actions`,style:`justify-content:space-between`,children:[$(`button`,{class:`btn sm`,"data-test":`pm-add`,onClick:e.onAdd,children:`+ Add / import project`}),$(`div`,{style:`display:flex;gap:8px`,children:[t&&$(`button`,{class:`btn ghost sm`,"data-test":`pm-close-project`,title:`Detach the active project (no project active)`,onClick:e.onCloseProject,children:`Close project`}),$(`button`,{class:`btn ghost sm`,onClick:e.onClose,children:`Done`})]})]})]})})}var pt=[`claude-sdk`,`claude-cli`,`codex-cli`,`opencode-cli`],mt=[`default`,`acceptEdits`,`bypassPermissions`,`plan`];function ht(e){let[t,n]=K(null),[r,i]=K(!1),[a,o]=K(!1),[s,c]=K(null);J(()=>{Q.settings().then(n).catch(e=>c(e.message))},[]);let l=(e,t)=>{n(n=>n&&{...n,agent:{...n.agent,[e]:t}}),o(!1)},u=(e,t)=>{n(n=>n&&{...n,workspace:{...n.workspace,[e]:t}}),o(!1)},d=async()=>{if(t){i(!0),c(null);try{await Q.updateSettings({agent:{backend:t.agent.backend,model:t.agent.model?.trim()?t.agent.model.trim():null,permission_mode:t.agent.permission_mode,max_turns:t.agent.max_turns,max_continuations:t.agent.max_continuations,max_concurrent_agents:t.agent.max_concurrent_agents,max_retry_backoff_ms:t.agent.max_retry_backoff_ms,turn_timeout_ms:t.agent.turn_timeout_ms,stall_timeout_ms:t.agent.stall_timeout_ms,tmux:t.agent.tmux,max_budget_usd:t.agent.max_budget_usd},polling:{interval_ms:t.polling.interval_ms},workspace:{branch_prefix:t.workspace.branch_prefix,mode:t.workspace.mode,merge_on_accept:t.workspace.merge_on_accept}}),o(!0),e.onSaved()}catch(e){c(e.message)}finally{i(!1)}}},f=(e,t,n,r)=>$(`label`,{class:`field`,children:[$(`span`,{children:e}),$(`input`,{type:`number`,"data-test":r,value:String(t),onInput:e=>{let t=Number(e.target.value);Number.isFinite(t)&&n(t)}})]});return $(`div`,{class:`overlay`,onClick:e.onClose,children:$(`div`,{class:`modal settings`,"data-test":`settings-modal`,onClick:e=>e.stopPropagation(),children:[$(`h3`,{children:`Settings`}),s&&$(`div`,{class:`err-banner`,style:`border-radius:7px;margin-bottom:8px`,children:s}),!t&&!s&&$(`div`,{class:`empty`,children:`loading…`}),t&&$(`div`,{class:`settings-body`,children:[$(`div`,{class:`settings-group`,children:[$(`div`,{class:`settings-h`,children:`Agent`}),$(`label`,{class:`field`,children:[$(`span`,{children:`Backend`}),$(`select`,{"data-test":`set-backend`,value:t.agent.backend,onChange:e=>l(`backend`,e.target.value),children:pt.map(e=>$(`option`,{value:e,children:e},e))})]}),$(`label`,{class:`field`,children:[$(`span`,{children:`Model (optional)`}),$(`input`,{"data-test":`set-model`,placeholder:`default`,value:t.agent.model??``,onInput:e=>l(`model`,e.target.value)})]}),$(`label`,{class:`field`,children:[$(`span`,{children:`Permission mode`}),$(`select`,{"data-test":`set-permission`,value:t.agent.permission_mode,onChange:e=>l(`permission_mode`,e.target.value),children:mt.map(e=>$(`option`,{value:e,children:e},e))})]}),$(`div`,{class:`settings-row`,children:[f(`Max concurrent agents`,t.agent.max_concurrent_agents,e=>l(`max_concurrent_agents`,e),`set-max-concurrent`),f(`Max turns`,t.agent.max_turns,e=>l(`max_turns`,e),`set-max-turns`)]}),$(`div`,{class:`settings-row`,children:[f(`Max continuations`,t.agent.max_continuations,e=>l(`max_continuations`,e),`set-max-continuations`),f(`Turn timeout (ms)`,t.agent.turn_timeout_ms,e=>l(`turn_timeout_ms`,e),`set-turn-timeout`)]}),$(`div`,{class:`settings-row`,children:[f(`Stall timeout (ms)`,t.agent.stall_timeout_ms,e=>l(`stall_timeout_ms`,e),`set-stall-timeout`),f(`Max retry backoff (ms)`,t.agent.max_retry_backoff_ms,e=>l(`max_retry_backoff_ms`,e),`set-retry-backoff`)]}),$(`label`,{class:`field check`,children:[$(`input`,{type:`checkbox`,"data-test":`set-tmux`,checked:t.agent.tmux,onChange:e=>l(`tmux`,e.target.checked)}),$(`span`,{children:`Supervise CLI agents under tmux`})]})]}),$(`div`,{class:`settings-group`,children:[$(`div`,{class:`settings-h`,children:`Polling & workspace`}),f(`Poll interval (ms)`,t.polling.interval_ms,e=>n(t=>t&&{...t,polling:{interval_ms:e}}),`set-poll-interval`),$(`label`,{class:`field`,children:[$(`span`,{children:`Workspace mode`}),$(`select`,{"data-test":`set-workspace-mode`,value:t.workspace.mode,onChange:e=>u(`mode`,e.target.value),children:[$(`option`,{value:`single_dir`,children:`single_dir — one project dir, one task at a time`}),$(`option`,{value:`worktree`,children:`worktree — isolated per-ticket worktrees`})]})]}),$(`span`,{class:`muted`,style:`font-size:11px`,children:`Mode applies immediately when no agents are running; otherwise on the next restart.`}),t.workspace.mode===`worktree`&&$(S,{children:[$(`label`,{class:`field`,children:[$(`span`,{children:`Branch prefix`}),$(`input`,{"data-test":`set-branch-prefix`,value:t.workspace.branch_prefix,onInput:e=>u(`branch_prefix`,e.target.value)})]}),$(`label`,{class:`field check`,children:[$(`input`,{type:`checkbox`,"data-test":`set-merge-on-accept`,checked:t.workspace.merge_on_accept,onChange:e=>u(`merge_on_accept`,e.target.checked)}),$(`span`,{children:`Merge the issue branch into base on accept`})]})]})]})]}),$(`div`,{class:`modal-actions`,children:[$(`span`,{class:`muted`,style:`margin-right:auto;font-size:11.5px`,children:a?`Saved ✓`:``}),$(`button`,{class:`btn ghost sm`,onClick:e.onClose,children:`Close`}),$(`button`,{class:`btn primary sm`,"data-test":`settings-save`,disabled:r||!t,onClick:d,children:r?`Saving…`:`Save`})]})]})})}function gt(e){return e>=90?`crit`:e>=70?`warn`:`ok`}function _t(e){switch(e){case`no_token`:return`no Claude subscription token (API-key mode or not logged in)`;case`timeout`:return`request timed out`;case`network`:return`network error`;case`parse`:case`shape`:return`unexpected response`;default:return e.startsWith(`http_`)?`HTTP ${e.slice(5)}`:e}}function vt(e){let t=Math.round(e.w.utilization);return $(`span`,{class:`usage-win ${gt(t)}${e.bind?` bind`:``}`,title:`${e.label}: ${t}% used · resets in ${ke(e.w.resetsAt,e.now)}`,children:[e.label,` `,t,`%`]})}function yt(e){let t=e.usage;if(!t)return null;if(!t.available)return $(`div`,{class:`gauge usage unavailable`,"data-test":`usage-limits`,title:`Claude usage limits unavailable — ${_t(t.reason)}`,children:[$(`span`,{class:`val usage-val`,children:$(`span`,{class:`usage-win na`,children:`5h n/a`})}),$(`span`,{class:`cap`,children:`Claude limit`})]});let n=t.fiveHour.utilization>=t.sevenDay.utilization;return $(`div`,{class:`gauge usage`,"data-test":`usage-limits`,title:`Claude subscription usage limits`,children:[$(`span`,{class:`val usage-val`,children:[$(vt,{label:`5h`,w:t.fiveHour,now:e.now,bind:n}),$(`span`,{class:`usage-sep`,children:`·`}),$(vt,{label:`wk`,w:t.sevenDay,now:e.now,bind:!n})]}),$(`span`,{class:`cap`,children:`Claude limit`})]})}function bt(){let[e,t]=K(null),[n,r]=K(null),[i,a]=K([]),[o,s]=K(null),[c,l]=K(()=>Date.now()),[u,d]=K(null),[f,p]=K(`board`),[m,h]=K(!1),[g,_]=K(null),[v,y]=K(null),[b,x]=K(null),[C,w]=K(null),[T,E]=K(null),[D,O]=K([]),[ee,te]=K(null),[k,A]=K(!1),[j,M]=K(!1),[ne,N]=K(!1),[re,P]=K(!1),F=pe(async()=>{try{let[e,n,i]=await Promise.all([Q.board(),Q.state(),Q.sessions()]);t(e),r(n),a(i.sessions),l(Date.now()),d(null)}catch(e){d(e.message)}},[]),I=pe(async()=>{try{let e=await Q.projects();O(e.projects),te(e.active_project_id)}catch{}},[]);J(()=>{F(),Q.meta().then(s).catch(()=>void 0),Q.capabilities().then(e=>{w(e),e.projects&&I()}).catch(()=>void 0);let e=!1,t=Q.eventStream();t.onopen=()=>{e=!0},t.onmessage=()=>void F(),t.onerror=()=>{e=!1};let n=setInterval(()=>{e||F()},2e3),r=setInterval(()=>void F(),15e3),i=setInterval(()=>l(Date.now()),1e3);return()=>{t.close(),clearInterval(n),clearInterval(r),clearInterval(i)}},[F,I]),J(()=>{if(!C?.usage_limits){E(null);return}let e=!1,t=()=>Q.usageLimits().then(t=>{e||E(t)}).catch(()=>void 0);t();let n=setInterval(()=>void t(),9e4);return()=>{e=!0,clearInterval(n)}},[C?.usage_limits]);let L=async e=>{A(!0),d(null);try{await Q.switchProject(e),await Promise.all([F(),I()]),await Promise.all([Q.capabilities().then(w),Q.meta().then(s)]).catch(()=>void 0)}catch(e){d(e.message)}finally{A(!1)}},ie=async()=>{A(!0),d(null);try{await Q.closeProject(),await Promise.all([F(),I()]),await Promise.all([Q.capabilities().then(w),Q.meta().then(s)]).catch(()=>void 0)}catch(e){d(e.message)}finally{A(!1)}},ae=X(()=>new Map(i.map(e=>[e.issue_id,e])),[i]),oe=X(()=>{let t=new Map;for(let n of Object.values(e?.columns??{}))for(let e of n)t.set(e.id,e);return t},[e]),R=X(()=>({sessions:ae,blocked:new Map((n?.blocked??[]).map(e=>[e.issue_id,e])),retry:new Map((n?.retrying??[]).map(e=>[e.issue_id,e])),meta:o,now:c}),[ae,n,o,c]),z=async(e,t)=>{try{await Q.moveIssue(e,t),await F()}catch(e){d(e.message)}},B=async e=>{try{await Q.unblock(e),await F()}catch(e){d(e.message)}},V=e?.states??[],H=o?V.filter(e=>new Set([o.backlog_state,...o.active_states,o.review_state].filter(Boolean)).has(e.name)||e.type===`completed`).length:V.length,U=i.length,W=o?.max_concurrent_agents??0,se=o?Math.round(o.poll_interval_ms/1e3):null,ce=Math.min(Math.max(W,U,1),8),G=C?.projects===!0&&C?.activeProject===!1;return $(`div`,{class:`app`,children:[$(`header`,{class:`topbar`,children:[$(`div`,{class:`left`,children:[$(`div`,{class:`brand`,children:[$(`span`,{class:`mark`,children:$(`i`,{})}),$(`b`,{children:`Symphony`})]}),C?.projects&&$(S,{children:[$(`span`,{class:`sep`}),$(lt,{projects:D,activeProjectId:ee,switching:k,onSwitch:e=>void L(e),onNew:()=>N(!0),onManage:()=>P(!0)})]}),$(`span`,{class:`sep`}),$(`span`,{class:`topmeta`,children:[H,` states`,se===null?``:` · poll ${se}s`,o?` · ${o.backend}`:``]})]}),$(`div`,{class:`right`,children:[$(`div`,{class:`gauge`,"data-test":`capacity`,children:[U>0?$(We,{}):$(`span`,{class:`swatch`,style:`background:var(--faint)`}),$(`span`,{class:`val`,children:[U,$(`span`,{children:[` / `,W||`—`]})]}),$(`span`,{class:`cap`,children:`running`}),$(`span`,{class:`bars`,children:Array.from({length:ce},(e,t)=>$(`i`,{class:t<U?`on`:``},t))})]}),$(yt,{usage:T,now:c}),$(`div`,{class:`tabs`,children:[$(`button`,{class:f===`board`?`on`:``,onClick:()=>p(`board`),children:`Board`}),$(`button`,{class:f===`agents`?`on`:``,"data-test":`tab-agents`,onClick:()=>p(`agents`),children:`Agents`})]}),!G&&$(`button`,{class:`btn primary`,"data-test":`new-ticket`,onClick:()=>{_(null),h(!0)},children:`+ New ticket`}),$(Le,{}),C?.settings&&$(`button`,{class:`iconbtn`,"data-test":`open-settings`,title:`Settings`,onClick:()=>M(!0),children:`⚙`})]})]}),u&&$(`div`,{class:`err-banner`,children:[`⚠ `,u]}),n?.merge_failures?.length?$(`div`,{class:`err-banner`,"data-test":`merge-failures`,children:[`⚠ Auto-merge failed for `,n.merge_failures.map(e=>e.issue_identifier).join(`, `),` — the branch is preserved; merge it manually.`]}):null,G&&$(`div`,{class:`center`,"data-test":`no-project`,children:$(`div`,{class:`project-empty`,children:[$(`div`,{class:`pe-mark`,children:$(`i`,{})}),$(`div`,{class:`pe-title`,children:`No project open`}),$(`div`,{class:`pe-sub`,children:`Symphony has no preconfigured project. Open an existing one or create / import a folder to start delegating tasks to agents.`}),$(`div`,{class:`pe-actions`,children:[$(`button`,{class:`btn primary sm`,"data-test":`pe-open`,onClick:()=>P(!0),children:`Open a project`}),$(`button`,{class:`btn sm`,"data-test":`pe-create`,onClick:()=>N(!0),children:`Create / import project`})]})]})}),!G&&!e&&!u&&$(`div`,{class:`center`,children:`connecting…`}),!G&&e&&f===`board`&&$(Je,{board:e,live:R,onMove:z,onOpen:y,onUnblock:B,onOpenAgent:x,onAdd:e=>{_(e),h(!0)}}),!G&&e&&f===`agents`&&$(nt,{sessions:i,issuesById:oe,now:c,onOpen:x}),m&&$(st,{states:V,preselectedStateId:g,onClose:()=>h(!1),onCreated:()=>{h(!1),F()}}),v&&$(ct,{issue:v,states:V,session:ae.get(v.id),meta:o,onClose:()=>y(null),onChanged:()=>void F(),onViewRunningAgent:e=>{y(null),p(`agents`),x(e)}}),b&&$(rt,{issueId:b,session:ae.get(b),issue:oe.get(b),meta:o,now:c,onClose:()=>x(null),onAfterAction:()=>void F()}),ne&&$(dt,{onClose:()=>N(!1),onCreated:()=>{N(!1),I()}}),re&&$(ft,{projects:D,onClose:()=>P(!1),onChanged:()=>void I(),onSwitch:e=>{P(!1),L(e)},onAdd:()=>{P(!1),N(!0)},onCloseProject:()=>{P(!1),ie()}}),j&&$(ht,{onClose:()=>M(!1),onSaved:()=>void Q.meta().then(s).catch(()=>void 0)})]})}oe($(bt,{}),document.getElementById(`app`));
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>Symphony</title>
|
|
7
|
+
<link rel="icon" href="data:," />
|
|
8
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
9
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
10
|
+
<link
|
|
11
|
+
href="https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&family=Geist+Mono:wght@400;500;600&display=swap"
|
|
12
|
+
rel="stylesheet"
|
|
13
|
+
/>
|
|
14
|
+
<script>
|
|
15
|
+
// Apply the saved theme before first paint so there's no dark→light flash.
|
|
16
|
+
// Defaults to dark; the in-app toggle writes 'symphony-theme'.
|
|
17
|
+
(function () {
|
|
18
|
+
try {
|
|
19
|
+
var t = localStorage.getItem('symphony-theme');
|
|
20
|
+
document.documentElement.dataset.theme = t === 'light' ? 'light' : 'dark';
|
|
21
|
+
} catch (e) {
|
|
22
|
+
document.documentElement.dataset.theme = 'dark';
|
|
23
|
+
}
|
|
24
|
+
})();
|
|
25
|
+
</script>
|
|
26
|
+
<script type="module" crossorigin src="./assets/index-D9N3V9nX.js"></script>
|
|
27
|
+
<link rel="stylesheet" crossorigin href="./assets/index-CkX5Wfff.css">
|
|
28
|
+
</head>
|
|
29
|
+
<body>
|
|
30
|
+
<div id="app"></div>
|
|
31
|
+
</body>
|
|
32
|
+
</html>
|