fifony 0.1.47 → 0.1.48-next.aedf844

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.
Files changed (91) hide show
  1. package/README.md +78 -0
  2. package/app/dist/assets/CommandPalette-CZDG20HW.js +1 -0
  3. package/app/dist/assets/{KeyboardShortcutsHelp-CqEFfGcE.js → KeyboardShortcutsHelp-TYhQc4aA.js} +1 -1
  4. package/app/dist/assets/OnboardingWizard-CQ9YmVIT.js +1 -0
  5. package/app/dist/assets/agents.lazy-CgakDm_P.js +1 -0
  6. package/app/dist/assets/analytics.lazy-C0rw3sov.js +1 -0
  7. package/app/dist/assets/{createLucideIcon-luywpIq4.js → createLucideIcon-B3bah5lk.js} +1 -1
  8. package/app/dist/assets/hooks-CNPue7d7.js +1 -0
  9. package/app/dist/assets/index-B8XCmr0-.css +1 -0
  10. package/app/dist/assets/index-Dfn02uW3.js +47 -0
  11. package/app/dist/assets/index.lazy-JdqhBwPd.js +44 -0
  12. package/app/dist/assets/services-CHpVij2M.css +1 -0
  13. package/app/dist/assets/services.lazy-BShKUCOt.js +12 -0
  14. package/app/dist/assets/vendor-X6HTElZW.js +9 -0
  15. package/app/dist/assets/viz-Dsh_q2DK.js +4 -0
  16. package/app/dist/index.html +5 -4
  17. package/app/dist/service-worker.js +32 -1
  18. package/bin/fifony.js +9 -1
  19. package/dist/agent/run-local.js +89 -76
  20. package/dist/{agent-DFSFG6DG.js → agent-FPSBQ3VE.js} +22 -17
  21. package/dist/{analytics-broadcaster-O4AE3RUK.js → analytics-broadcaster-GBXQVFDG.js} +25 -20
  22. package/dist/approve-plan.command-QSQMO5NW.js +21 -0
  23. package/dist/{chunk-QHISYRXJ.js → chunk-4QXECRSB.js} +57 -3
  24. package/dist/{chunk-5AMWD66T.js → chunk-63P5EWIR.js} +6 -4
  25. package/dist/{chunk-AAZKYWOY.js → chunk-AFYKGVSP.js} +103 -8
  26. package/dist/chunk-BENC6AV2.js +1247 -0
  27. package/dist/{chunk-AAVROEQC.js → chunk-F3V43TLJ.js} +253 -349
  28. package/dist/{chunk-JRLWLZOD.js → chunk-FHH2PEDF.js} +43 -23
  29. package/dist/{chunk-QH6VCTET.js → chunk-FOOEDTUJ.js} +1016 -99
  30. package/dist/{chunk-HOIOVUHI.js → chunk-HY6VTREX.js} +8 -6
  31. package/dist/chunk-JIEKFAM4.js +737 -0
  32. package/dist/{chunk-7TXZYZR5.js → chunk-L2IDS6Z4.js} +7 -5
  33. package/dist/{chunk-K36BWMUV.js → chunk-PHB3JCLR.js} +2694 -778
  34. package/dist/{chunk-PACI3T4I.js → chunk-PONHU7EN.js} +13 -5
  35. package/dist/chunk-SLKYFN3Q.js +722 -0
  36. package/dist/chunk-SQ734TQC.js +134 -0
  37. package/dist/chunk-VBXVP4BX.js +241 -0
  38. package/dist/{chunk-EBCSQFPR.js → chunk-W5IULOWV.js} +2 -3
  39. package/dist/{chunk-2PRRKBG6.js → chunk-WKO3UBFU.js} +22 -9
  40. package/dist/chunk-WZ2BMCEV.js +195 -0
  41. package/dist/{chunk-PI7Y77R3.js → chunk-XRBR553K.js} +37 -9
  42. package/dist/chunk-Z6ZWNWWR.js +34 -0
  43. package/dist/cli.js +45 -17
  44. package/dist/constants-R3ZJIXZP.js +126 -0
  45. package/dist/create-issue.command-7FKDXPK5.js +29 -0
  46. package/dist/fsm-agent-W6MCQF34.js +59 -0
  47. package/dist/{fsm-issue-EHTSKMFN.js → fsm-issue-LMMBZ5FL.js} +12 -8
  48. package/dist/{fsm-service-7O4AJG2R.js → fsm-service-OTPMNSBM.js} +13 -4
  49. package/dist/{helpers-ON2S7UEF.js → helpers-PQ3QJPHR.js} +6 -2
  50. package/dist/{issue-log-broadcaster-FZGVEEIX.js → issue-log-broadcaster-MI65XPCE.js} +33 -19
  51. package/dist/{issues-3YNNTB4U.js → issues-GWH5SADH.js} +10 -7
  52. package/dist/{log-analyzer-EIX6R6PP.js → log-analyzer-LGNGQTSL.js} +30 -20
  53. package/dist/{logger-IFLXTQPS.js → logger-4F6ATWNA.js} +2 -1
  54. package/dist/mcp/server.js +6 -2
  55. package/dist/merge-workspace.command-5F2ANP5K.js +29 -0
  56. package/dist/{parallel-executor-DWESCNX3.js → parallel-executor-VDC3HZC4.js} +78 -19
  57. package/dist/{pid-manager-UBWXVSMD.js → pid-manager-EDT4DHAU.js} +2 -1
  58. package/dist/queue-workers-AP3SE5ZR.js +43 -0
  59. package/dist/replan-issue.command-7ZOEWFNB.js +21 -0
  60. package/dist/retry-issue.command-6GUQGKWM.js +21 -0
  61. package/dist/reverse-proxy-server-EYU7FFZL.js +97 -0
  62. package/dist/scheduler-VQ2VD3CJ.js +37 -0
  63. package/dist/service-log-broadcaster-6NII7ZDH.js +21 -0
  64. package/dist/{settings-SOTIS6ZD.js → settings-N6UX3JNN.js} +34 -23
  65. package/dist/settings.resource-KCRJGHKA.js +35 -0
  66. package/dist/{store-S3NAYZ3S.js → store-TA2P77AH.js} +22 -17
  67. package/dist/telemetry-KVUFHDQS.js +828 -0
  68. package/dist/template-variants-XYKW3M5P.js +24 -0
  69. package/dist/trace-bundle-U3HYIKAI.js +41 -0
  70. package/dist/{web-push-QCTLS7EJ.js → web-push-X2LLMQ4M.js} +2 -1
  71. package/dist/websocket-T3IWGDLU.js +103 -0
  72. package/dist/wiki-2EDJ7TK3.js +188 -0
  73. package/dist/{workspace-OS7GPMCN.js → workspace-ES4L3ZWM.js} +10 -6
  74. package/package.json +12 -9
  75. package/app/dist/assets/CommandPalette-CL8p78lG.js +0 -1
  76. package/app/dist/assets/OnboardingWizard-BmI50ZUv.js +0 -1
  77. package/app/dist/assets/analytics.lazy-CXGjZabc.js +0 -1
  78. package/app/dist/assets/index-CEaccpYh.js +0 -96
  79. package/app/dist/assets/index-CzzWGzux.css +0 -1
  80. package/app/dist/assets/vendor-uqBx3VSC.js +0 -9
  81. package/dist/approve-plan.command-QGQZZXTQ.js +0 -17
  82. package/dist/chunk-N4KFNX2G.js +0 -370
  83. package/dist/chunk-VM5QAYP5.js +0 -404
  84. package/dist/create-issue.command-VAKYRECC.js +0 -24
  85. package/dist/merge-workspace.command-T2NIGR4M.js +0 -24
  86. package/dist/queue-workers-V57BYXAY.js +0 -38
  87. package/dist/replan-issue.command-2GQ3QXCR.js +0 -17
  88. package/dist/retry-issue.command-GJBUUYDJ.js +0 -17
  89. package/dist/scheduler-KYILMWLD.js +0 -32
  90. package/dist/settings.resource-JMD3JQOS.js +0 -30
  91. package/dist/websocket-T2Y3BY4B.js +0 -61
package/README.md CHANGED
@@ -158,6 +158,84 @@ The Setup step blocks execution until the workspace is a git repository with at
158
158
 
159
159
  The **Issue Detail Drawer** shows the full plan (phases and steps), the workspace diff, and a per-phase token breakdown — Plan / Execute / Review — with input and output counts per model.
160
160
 
161
+ ### Managed Services — Environment Variables
162
+
163
+ Environment variables for managed services are stored via **Vaulter** (SQLite at `.fifony/secrets.db`) and injected at process startup.
164
+
165
+ - **Global variables** (`Settings → Services → Global variables`) — injected into every service.
166
+ - **Per-service variables** (`Settings → Services → <service> → Variables`) — injected only into that service and override global variables of the same key.
167
+
168
+ Variables are applied on the **next start or restart** of the service — a process already running does not receive changes automatically.
169
+
170
+ The injection order (last wins):
171
+ ```
172
+ global vars → per-service vars → PORT (enforced, always wins)
173
+ ```
174
+
175
+ ### Managed Services Port Contract
176
+
177
+ Managed services started by fifony must bind to the `PORT` environment variable.
178
+
179
+ - If you configure a service port manually, fifony injects that value as `PORT`.
180
+ - If you leave the port empty, fifony assigns a free local port above `12000`, persists it, and injects it as `PORT` on startup.
181
+ - Reverse proxy routing by service and mesh topology resolution both depend on each managed service having a resolvable port.
182
+
183
+ ### Reverse Proxy — Local HTTPS Setup (Linux)
184
+
185
+ fifony includes a built-in HTTPS reverse proxy for routing `.local` domains (e.g. `https://admin.tetis.local`) to managed services. Two one-time host setup steps are required:
186
+
187
+ **1. Allow binding to port 443 without root**
188
+
189
+ By default, Linux only allows root processes to bind to ports below 1024. Lower the limit permanently:
190
+
191
+ ```bash
192
+ echo "net.ipv4.ip_unprivileged_port_start=443" | sudo tee /etc/sysctl.d/99-local-dev.conf
193
+ sudo sysctl -p /etc/sysctl.d/99-local-dev.conf
194
+ ```
195
+
196
+ Then set the HTTPS Port to `443` in **Settings → Services**.
197
+
198
+ **2. Trust the local CA certificate**
199
+
200
+ fifony generates a self-signed CA at `.fifony/tls/ca.pem` on first run. Install it so the browser accepts the certificates:
201
+
202
+ ```bash
203
+ # System-wide (curl, etc.)
204
+ sudo cp .fifony/tls/ca.pem /usr/local/share/ca-certificates/fifony-ca.crt
205
+ sudo update-ca-certificates
206
+
207
+ # Chrome / Chromium on Linux (NSS)
208
+ certutil -d sql:$HOME/.pki/nssdb -A -t "CT,," -n "fifony Local CA" -i .fifony/tls/ca.pem
209
+ ```
210
+
211
+ Restart Chrome after running `certutil`. After both steps, `.local` domains resolve and display the green padlock with no warnings.
212
+
213
+ **macOS**
214
+
215
+ Port 443 requires a `pf` redirect (no sysctl equivalent on macOS). Create `/etc/pf.anchors/fifony`:
216
+
217
+ ```
218
+ rdr pass inet proto tcp from any to any port 443 -> 127.0.0.1 port 4433
219
+ ```
220
+
221
+ Load it (survives reboots when added to `/etc/pf.conf`):
222
+
223
+ ```bash
224
+ # One-time load
225
+ echo "rdr pass inet proto tcp from any to any port 443 -> 127.0.0.1 port 4433" | sudo pfctl -ef -
226
+
227
+ # Permanent — add to /etc/pf.conf then:
228
+ sudo pfctl -f /etc/pf.conf
229
+ ```
230
+
231
+ Trust the CA via Keychain (Chrome uses the system keychain on macOS — no certutil needed):
232
+
233
+ ```bash
234
+ sudo security add-trusted-cert -d -r trustRoot \
235
+ -k /Library/Keychains/System.keychain \
236
+ .fifony/tls/ca.pem
237
+ ```
238
+
161
239
  <div align="center">
162
240
  <img src="docs/ss-04.webp" alt="Agents cockpit" width="720" />
163
241
  <br><sub>Agents cockpit — live output, worker slots, token usage</sub>
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{I as t,h as n}from"./vendor-X6HTElZW.js";import{t as r}from"./createLucideIcon-B3bah5lk.js";import{$ as i,A as a,g as o}from"./index-Dfn02uW3.js";var s=r(`corner-down-left`,[[`path`,{d:`M20 4v7a4 4 0 0 1-4 4H4`,key:`6o5b7l`}],[`path`,{d:`m9 10-5 5 5 5`,key:`1kshq7`}]]),c=r(`navigation`,[[`polygon`,{points:`3 11 22 2 13 21 11 13 3 11`,key:`1ltx0t`}]]),l=e(t(),1),u=n(),d=typeof navigator<`u`&&/Mac|iPhone|iPad/.test(navigator.platform)?`⌘`:`Ctrl`,f=[{id:`nav-kanban`,label:`Go to Kanban`,hint:`K`,to:`/kanban`,icon:c},{id:`nav-issues`,label:`Go to Issues`,hint:`I`,to:`/issues`,icon:c},{id:`nav-agents`,label:`Go to Agents`,hint:`A`,to:`/agents`,icon:c},{id:`nav-analytics`,label:`Go to Analytics`,hint:`T`,to:`/analytics`,icon:c},{id:`nav-settings`,label:`Go to Settings`,hint:`S`,to:`/settings`,icon:c}],p=[{id:`act-create`,label:`New Issue`,hint:`N`,actionKey:`create`,icon:o},{id:`act-refresh`,label:`Refresh`,hint:`R`,actionKey:`refresh`,icon:o}];function m(e,t){if(!e)return 1;let n=e.toLowerCase(),r=t.toLowerCase(),i=r.indexOf(n);if(i<0)return 0;let a=1;return i===0&&(a+=3),i>0&&(r[i-1]===` `||r[i-1]===`-`||r[i-1]===`/`)&&(a+=2),a}function h({issues:e,onSelect:t,onNavigate:n,onAction:r,onClose:o}){let[c,h]=(0,l.useState)(``),[g,_]=(0,l.useState)(0),v=(0,l.useRef)(null),y=(0,l.useRef)(null);(0,l.useEffect)(()=>{v.current?.focus()},[]);let b=(0,l.useMemo)(()=>{let t=[];for(let n of e){let e=m(c,`${n.identifier} ${n.title} ${n.description||``}`);e>0&&t.push({type:`issue`,issue:n,label:`${n.identifier} — ${n.title}`,score:e,state:n.state})}for(let e of f){let n=m(c,e.label);n>0&&t.push({type:`nav`,...e,score:n})}for(let e of p){let n=m(c,e.label);n>0&&t.push({type:`action`,...e,score:n})}return t.sort((e,t)=>t.score-e.score),t.slice(0,12)},[c,e]);(0,l.useEffect)(()=>{_(0)},[c]);let x=(0,l.useCallback)(e=>{e&&(e.type===`issue`?t(e.issue):e.type===`nav`?n(e.to):e.type===`action`&&r(()=>{}))},[t,n,r]),S=(0,l.useCallback)(e=>{e.key===`Escape`?(e.preventDefault(),o()):e.key===`ArrowDown`||e.key===`j`&&e.ctrlKey?(e.preventDefault(),_(e=>Math.min(e+1,b.length-1))):e.key===`ArrowUp`||e.key===`k`&&e.ctrlKey?(e.preventDefault(),_(e=>Math.max(e-1,0))):e.key===`Enter`&&(e.preventDefault(),x(b[g]))},[b,g,x,o]);return(0,l.useEffect)(()=>{(y.current?.children[g])?.scrollIntoView({block:`nearest`})},[g]),(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{className:`fixed inset-0 bg-black/40 z-50 animate-fade-in`,onClick:o}),(0,u.jsxs)(`div`,{className:`fixed top-[15%] left-1/2 -translate-x-1/2 z-50 w-[calc(100vw-1.5rem)] max-w-lg bg-base-100 rounded-2xl shadow-2xl border border-base-300 overflow-hidden animate-fade-in-up`,onKeyDown:S,children:[(0,u.jsxs)(`div`,{className:`flex items-center gap-3 px-4 py-3 border-b border-base-300`,children:[(0,u.jsx)(a,{className:`size-4 opacity-40 shrink-0`}),(0,u.jsx)(`input`,{ref:v,type:`text`,className:`flex-1 bg-transparent outline-none text-sm placeholder:opacity-40`,placeholder:`Search issues, navigate, run actions...`,value:c,onChange:e=>h(e.target.value)}),(0,u.jsx)(`kbd`,{className:`kbd kbd-xs opacity-40`,children:`Esc`})]}),(0,u.jsxs)(`div`,{ref:y,className:`max-h-80 overflow-y-auto py-1`,children:[b.length===0&&(0,u.jsx)(`div`,{className:`px-4 py-8 text-center text-sm opacity-40`,children:`No results found`}),b.map((e,t)=>{let n=t===g,r=e.icon||i;return(0,u.jsxs)(`button`,{className:`flex items-center gap-3 w-full px-4 py-2.5 text-left text-sm transition-colors ${n?`bg-primary/10 text-primary`:`hover:bg-base-200`}`,onClick:()=>x(e),onMouseEnter:()=>_(t),children:[e.type===`issue`?(0,u.jsx)(i,{className:`size-4 opacity-40 shrink-0`}):(0,u.jsx)(r,{className:`size-4 opacity-40 shrink-0`}),(0,u.jsx)(`span`,{className:`flex-1 truncate`,children:e.label}),e.state&&(0,u.jsx)(`span`,{className:`badge badge-xs badge-ghost opacity-60`,children:e.state}),e.hint&&(0,u.jsx)(`kbd`,{className:`kbd kbd-xs opacity-30`,children:e.hint}),n&&(0,u.jsx)(s,{className:`size-3 opacity-30 shrink-0`})]},e.id||e.issue?.id||t)})]}),(0,u.jsxs)(`div`,{className:`px-4 py-2 border-t border-base-300 flex items-center gap-4 text-[10px] opacity-40`,children:[(0,u.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,u.jsx)(`kbd`,{className:`kbd kbd-xs`,children:`↑`}),(0,u.jsx)(`kbd`,{className:`kbd kbd-xs`,children:`↓`}),` navigate`]}),(0,u.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,u.jsx)(`kbd`,{className:`kbd kbd-xs`,children:`↵`}),` select`]}),(0,u.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,u.jsx)(`kbd`,{className:`kbd kbd-xs`,children:`Esc`}),` close`]}),(0,u.jsxs)(`span`,{className:`ml-auto`,children:[d,`+K`]})]})]})]})}export{h as default};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{R as t,g as n}from"./vendor-uqBx3VSC.js";import{E as r,c as i,d as a}from"./index-CEaccpYh.js";var o=e(t(),1),s=n(),c=typeof navigator<`u`&&/Mac|iPhone|iPad/.test(navigator.platform),l=[`palette`,`navigation`,`global`,`drawer`,`kanban`,`issues`],u={palette:`Command Palette`,navigation:`Navigation`,global:`Global`,drawer:`Issue Detail`,kanban:`Kanban Board`,issues:`Issues List`};function d(e){return e.replace(/mod/gi,c?`⌘`:`Ctrl`).replace(/ctrl/gi,`Ctrl`).replace(/alt/gi,`Alt`).replace(/shift/gi,`Shift`).replace(/enter/gi,`↵`).replace(/escape/gi,`Esc`).replace(/slash/gi,`/`).split(`+`)}function f({open:e,onClose:t}){let n=(0,o.useRef)(null),{hotkeys:c}=i();(0,o.useEffect)(()=>{let t=n.current;t&&(e&&!t.open?t.showModal():!e&&t.open&&t.close())},[e]);let f=(0,o.useMemo)(()=>{let e=new Map,t=new Set;for(let n of c){let r=n.description,i=n.metadata?.group;if(!r||!i)continue;let a=`${i}:${r}`;t.has(a)||(t.add(a),e.has(i)||e.set(i,[]),e.get(i).push(n))}let n=[];for(let t of l)e.has(t)&&n.push({group:t,label:u[t]||t,shortcuts:e.get(t)});return n},[c]);return(0,s.jsxs)(`dialog`,{ref:n,className:`modal modal-bottom sm:modal-middle`,onClose:t,children:[(0,s.jsxs)(`div`,{className:`modal-box max-w-lg`,children:[(0,s.jsxs)(`div`,{className:`flex items-center justify-between mb-4`,children:[(0,s.jsxs)(`h3`,{className:`font-bold text-lg flex items-center gap-2`,children:[(0,s.jsx)(r,{className:`size-5 opacity-60`}),`Keyboard Shortcuts`]}),(0,s.jsx)(`button`,{className:`btn btn-sm btn-ghost btn-circle`,onClick:t,children:(0,s.jsx)(a,{className:`size-4`})})]}),(0,s.jsx)(`div`,{className:`space-y-4 max-h-[60vh] overflow-y-auto`,children:f.map(({group:e,label:t,shortcuts:n})=>(0,s.jsxs)(`div`,{children:[(0,s.jsx)(`h4`,{className:`text-xs font-semibold uppercase tracking-wider opacity-40 mb-2`,children:t}),(0,s.jsx)(`div`,{className:`space-y-1`,children:n.map((e,t)=>{let n=d(e.hotkey||``);return(0,s.jsxs)(`div`,{className:`flex items-center justify-between py-1`,children:[(0,s.jsx)(`span`,{className:`text-sm opacity-70`,children:e.description}),(0,s.jsx)(`div`,{className:`flex items-center gap-0.5`,children:n.map((e,t)=>(0,s.jsxs)(`span`,{children:[t>0&&(0,s.jsx)(`span`,{className:`text-xs opacity-20 mx-0.5`,children:`+`}),(0,s.jsx)(`kbd`,{className:`kbd kbd-sm`,children:e})]},t))})]},t)})})]},e))}),(0,s.jsx)(`div`,{className:`modal-action`,children:(0,s.jsx)(`button`,{className:`btn btn-sm`,onClick:t,children:`Close`})})]}),(0,s.jsx)(`form`,{method:`dialog`,className:`modal-backdrop`,children:(0,s.jsx)(`button`,{children:`close`})})]})}export{f as default};
1
+ import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{I as t,h as n}from"./vendor-X6HTElZW.js";import{U as r,_ as i,c as a}from"./index-Dfn02uW3.js";var o=e(t(),1),s=n(),c=typeof navigator<`u`&&/Mac|iPhone|iPad/.test(navigator.platform),l=[`palette`,`navigation`,`global`,`drawer`,`kanban`,`issues`],u={palette:`Command Palette`,navigation:`Navigation`,global:`Global`,drawer:`Issue Detail`,kanban:`Kanban Board`,issues:`Issues List`};function d(e){return e.replace(/mod/gi,c?`⌘`:`Ctrl`).replace(/ctrl/gi,`Ctrl`).replace(/alt/gi,`Alt`).replace(/shift/gi,`Shift`).replace(/enter/gi,`↵`).replace(/escape/gi,`Esc`).replace(/slash/gi,`/`).split(`+`)}function f({open:e,onClose:t}){let n=(0,o.useRef)(null),{hotkeys:c}=a();(0,o.useEffect)(()=>{let t=n.current;t&&(e&&!t.open?t.showModal():!e&&t.open&&t.close())},[e]);let f=(0,o.useMemo)(()=>{let e=new Map,t=new Set;for(let n of c){let r=n.description,i=n.metadata?.group;if(!r||!i)continue;let a=`${i}:${r}`;t.has(a)||(t.add(a),e.has(i)||e.set(i,[]),e.get(i).push(n))}let n=[];for(let t of l)e.has(t)&&n.push({group:t,label:u[t]||t,shortcuts:e.get(t)});return n},[c]);return(0,s.jsxs)(`dialog`,{ref:n,className:`modal modal-bottom sm:modal-middle`,onClose:t,children:[(0,s.jsxs)(`div`,{className:`modal-box max-w-lg`,children:[(0,s.jsxs)(`div`,{className:`flex items-center justify-between mb-4`,children:[(0,s.jsxs)(`h3`,{className:`font-bold text-lg flex items-center gap-2`,children:[(0,s.jsx)(r,{className:`size-5 opacity-60`}),`Keyboard Shortcuts`]}),(0,s.jsx)(`button`,{className:`btn btn-sm btn-ghost btn-circle`,onClick:t,children:(0,s.jsx)(i,{className:`size-4`})})]}),(0,s.jsx)(`div`,{className:`space-y-4 max-h-[60vh] overflow-y-auto`,children:f.map(({group:e,label:t,shortcuts:n})=>(0,s.jsxs)(`div`,{children:[(0,s.jsx)(`h4`,{className:`text-xs font-semibold uppercase tracking-wider opacity-40 mb-2`,children:t}),(0,s.jsx)(`div`,{className:`space-y-1`,children:n.map((e,t)=>{let n=d(e.hotkey||``);return(0,s.jsxs)(`div`,{className:`flex items-center justify-between py-1`,children:[(0,s.jsx)(`span`,{className:`text-sm opacity-70`,children:e.description}),(0,s.jsx)(`div`,{className:`flex items-center gap-0.5`,children:n.map((e,t)=>(0,s.jsxs)(`span`,{children:[t>0&&(0,s.jsx)(`span`,{className:`text-xs opacity-20 mx-0.5`,children:`+`}),(0,s.jsx)(`kbd`,{className:`kbd kbd-sm`,children:e})]},t))})]},t)})})]},e))}),(0,s.jsx)(`div`,{className:`modal-action`,children:(0,s.jsx)(`button`,{className:`btn btn-sm`,onClick:t,children:`Close`})})]}),(0,s.jsx)(`form`,{method:`dialog`,className:`modal-backdrop`,children:(0,s.jsx)(`button`,{children:`close`})})]})}export{f as default};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{I as t,h as n,m as r}from"./vendor-X6HTElZW.js";import{t as i}from"./api-CEr_D4e5.js";import{I as a,L as o,R as s,b as c,t as l}from"./hooks-CNPue7d7.js";import{A as u,B as d,Ct as f,D as p,E as m,Et as h,G as g,I as _,J as v,L as y,M as b,N as x,Q as S,St as C,Tt as w,Z as T,a as E,b as D,ct as O,dt as k,i as A,l as j,mt as M,n as N,o as P,ot as F,pt as ee,q as I,r as te,s as ne,st as re,t as L,ut as R,wt as ie,y as z,z as ae}from"./index-Dfn02uW3.js";var B=e(t(),1),V=n();function oe(){let e=(0,B.useRef)(null),t=(0,B.useRef)([]),n=(0,B.useRef)(null);return(0,B.useEffect)(()=>{let r=e.current;if(!r)return;let i=r.getContext(`2d`),a=[`♪`,`♫`,`♩`,`♬`],o=[`oklch(0.75 0.18 250)`,`oklch(0.80 0.16 200)`,`oklch(0.70 0.20 330)`,`oklch(0.85 0.14 85)`,`oklch(0.75 0.18 145)`,`oklch(0.80 0.12 280)`,`oklch(0.78 0.15 30)`],s=o.length,c=a.length,l=document.createElement(`canvas`);l.width=s*56,l.height=c*56;let u=l.getContext(`2d`);u.textAlign=`center`,u.textBaseline=`middle`,u.font=`48px serif`;let d=[];for(let e=0;e<c;e++){d[e]=[];for(let t=0;t<s;t++){let n=t*56+56/2,r=e*56+56/2;u.fillStyle=o[t],u.fillText(a[e],n,r),d[e][t]={x:t*56,y:e*56}}}let f=0,p=0,m=()=>{let e=window.devicePixelRatio||1;f=window.innerWidth,p=window.innerHeight,r.width=f*e,r.height=p*e,r.style.width=f+`px`,r.style.height=p+`px`,i.setTransform(e,0,0,e,0,0)};m();function h(){let e=f/2,t=p*.38,n=Math.random()*Math.PI*2,r=Math.random()*1.8+.4,i=Math.random()*20,a=Math.floor(Math.random()*c),o=Math.floor(Math.random()*s);return{x:e+Math.cos(n)*i,y:t+Math.sin(n)*i,vx:Math.cos(n)*r,vy:Math.sin(n)*r,gravity:.003+Math.random()*.005,scale:Math.random()*.4+.25,si:a,ci:o,rotation:Math.random()*Math.PI*2,rotationSpeed:(Math.random()-.5)*.04,life:0,maxLife:180+Math.random()*200,fadeIn:15}}let g=Math.min(Math.floor(f*p/6e3),120);t.current=[];for(let e=0;e<g;e++){let e=h(),n=Math.random()*e.maxLife*.8;e.x+=e.vx*n,e.y+=e.vy*n+.5*e.gravity*n*n,e.rotation+=e.rotationSpeed*n,e.life=n,t.current.push(e)}let _=Math.max(1,Math.floor(g/90)),v=0,y=()=>{if(i.clearRect(0,0,f,p),v++,v%2==0)for(let e=0;e<_;e++)t.current.push(h());let e=[];for(let n of t.current){if(n.life++,n.x+=n.vx,n.y+=n.vy,n.vy+=n.gravity,n.rotation+=n.rotationSpeed,n.vx*=.998,n.vy*=.998,n.life>n.maxLife||n.x<-60||n.x>f+60||n.y<-60||n.y>p+60)continue;e.push(n);let t=Math.min(1,n.life/n.fadeIn),r=n.maxLife*.6,a=t*(n.life>r?1-(n.life-r)/(n.maxLife-r):1)*.45;if(a<=.01)continue;let o=d[n.si][n.ci],s=56*n.scale,c=s/2;i.save(),i.translate(n.x,n.y),i.rotate(n.rotation),i.globalAlpha=a,i.drawImage(l,o.x,o.y,56,56,-c,-c,s,s),i.restore()}t.current=e,n.current=requestAnimationFrame(y)};return n.current=requestAnimationFrame(y),window.addEventListener(`resize`,m),()=>{cancelAnimationFrame(n.current),window.removeEventListener(`resize`,m)}},[]),(0,V.jsx)(`canvas`,{ref:e,className:`fixed inset-0 pointer-events-none`,style:{zIndex:0},"aria-hidden":`true`})}async function H(e,t,n=`ui`){return i.post(`/settings/${encodeURIComponent(e)}`,{value:t,scope:n,source:`user`})}function U(e,t=`medium`){return L.some(t=>t.value===e)?e:t}function se(e){return!e||typeof e!=`object`||Array.isArray(e)?{enhancer:`medium`,chatter:`medium`,planner:`medium`,executor:`medium`,reviewer:`medium`,services:`medium`}:{enhancer:U(e.enhancer??e.default,`medium`),chatter:U(e.chatter??e.default,`medium`),planner:U(e.planner??e.default,`medium`),executor:U(e.executor??e.default,`medium`),reviewer:U(e.reviewer??e.default,`medium`),services:U(e.services??e.default,`medium`)}}function ce(e,t,n={}){return{enhance:{provider:e.enhancer||e.planner||``,model:n.enhance||``,effort:t.enhancer||`medium`},chat:{provider:e.chatter||e.planner||``,model:n.chat||``,effort:t.chatter||`medium`},plan:{provider:e.planner||``,model:n.plan||``,effort:t.planner||`medium`},execute:{provider:e.executor||``,model:n.execute||``,effort:t.executor||`medium`},review:{provider:e.reviewer||e.executor||``,model:n.review||``,effort:t.reviewer||`medium`},services:{provider:e.services||e.planner||``,model:n.services||``,effort:t.services||`medium`}}}function le(e){return!!(e?.isGit&&e?.hasCommits)}function ue(e,t){return!!e&&le(t)}function de({current:e}){let t=ne(),n=e-1;return(0,V.jsx)(`ul`,{className:`steps steps-horizontal w-full max-w-2xl text-xs`,children:t.map((e,t)=>{let r=t<n,i=t===n;return(0,V.jsx)(`li`,{"data-content":r?`✓`:t+1,className:`step ${r||i?`step-primary`:``}`,style:{transition:`color 0.3s ease`},children:e},e)})})}function fe({direction:e,stepKey:t,center:n,children:r}){return(0,V.jsx)(`div`,{className:`${e===`forward`?`animate-slide-in-right`:`animate-slide-in-left`} w-full max-w-2xl mx-auto ${n?`my-auto`:``}`,children:r},t)}function pe({step:e,stepCount:t,stepName:n,canProceed:r,launching:i,onBack:a,onNext:o,onLaunch:s}){return e===0?null:(0,V.jsxs)(`div`,{className:`relative z-10 p-4 pb-6 flex items-center max-w-2xl mx-auto w-full justify-between`,children:[(0,V.jsxs)(`button`,{className:`btn btn-ghost gap-1`,onClick:a,disabled:i,children:[(0,V.jsx)(k,{className:`size-4`}),` Back`]}),e<t-1?(0,V.jsxs)(`button`,{className:`btn btn-primary gap-1`,onClick:o,disabled:!r,children:[`Next `,(0,V.jsx)(R,{className:`size-4`})]}):(0,V.jsx)(`button`,{className:`btn btn-primary btn-lg gap-2 animate-pulse-soft`,onClick:s,disabled:i,children:i?(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(d,{className:`size-5 animate-spin`}),` Launching...`]}):(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(b,{className:`size-5`}),` Launch fifony`]})})]})}function me({workspacePath:e,onGetStarted:t}){return(0,V.jsxs)(`div`,{className:`flex flex-col items-center text-center gap-6 stagger-children py-4`,children:[(0,V.jsx)(`img`,{src:h,alt:`fifony mascot`,className:`h-72 sm:h-96 object-contain animate-bounce-in select-none pointer-events-none`,style:{filter:`drop-shadow(0 12px 40px rgba(128, 0, 255, 0.3))`}}),(0,V.jsxs)(`h1`,{className:`text-4xl sm:text-5xl font-bold tracking-tight leading-none`,style:{fontFamily:`'Space Grotesk', system-ui, sans-serif`},children:[`Welcome to `,(0,V.jsx)(`span`,{className:`text-primary`,children:`fifony`})]}),(0,V.jsx)(`p`,{className:`text-base-content/60 text-lg max-w-md`,children:`Let's set up your AI orchestration project in just a few steps.`}),e&&(0,V.jsxs)(`div`,{className:`badge badge-lg badge-soft badge-primary gap-2`,children:[(0,V.jsx)(m,{className:`size-3.5`}),`Project target: `,e]}),(0,V.jsxs)(`button`,{className:`btn btn-primary btn-lg gap-2 mt-2`,onClick:t,children:[`Get Started `,(0,V.jsx)(R,{className:`size-5`})]})]})}var W=new Set([`main`,`master`]);function he(){let[e,t]=(0,B.useState)(null),[n,r]=(0,B.useState)(!1),[a,o]=(0,B.useState)(!1);return(0,B.useEffect)(()=>{i.get(`/gitignore/status`).then(t).catch(()=>t({exists:!1,hasFifony:!1}))},[]),e===null||e.hasFifony?null:a?(0,V.jsxs)(`div`,{className:`alert alert-success py-2.5 text-sm animate-fade-in`,children:[(0,V.jsx)(p,{className:`size-4 shrink-0`}),(0,V.jsxs)(`span`,{children:[(0,V.jsx)(`code`,{children:`.fifony/`}),` adicionado ao `,(0,V.jsx)(`code`,{children:`.gitignore`})]})]}):(0,V.jsxs)(`div`,{className:`alert alert-warning py-2.5 text-sm`,children:[(0,V.jsx)(p,{className:`size-4 shrink-0`}),(0,V.jsxs)(`div`,{className:`flex-1`,children:[(0,V.jsxs)(`span`,{children:[(0,V.jsx)(`code`,{children:`.fifony/`}),` não está no `,(0,V.jsx)(`code`,{children:`.gitignore`})]}),(0,V.jsx)(`span`,{className:`text-base-content/50 block text-xs mt-0.5`,children:`O fifony guarda estado local lá — não deve ser commitado.`})]}),(0,V.jsx)(`button`,{className:`btn btn-xs btn-warning`,onClick:async()=>{r(!0);try{await i.post(`/gitignore/add`),o(!0)}catch{}finally{r(!1)}},disabled:n,children:n?(0,V.jsx)(d,{className:`size-3 animate-spin`}):`Adicionar`})]})}function G({currentBranch:e,onBranchCreated:t,onGitStatusChange:n}){let[r,a]=(0,B.useState)(null),[o,s]=(0,B.useState)(!1),[c,l]=(0,B.useState)(null),[u,f]=(0,B.useState)(e);(0,B.useEffect)(()=>{i.get(`/git/status`).then(e=>{a(e),e.branch&&f(e.branch)}).catch(()=>a({isGit:!1,branch:e||null,hasCommits:!1}))},[]),(0,B.useEffect)(()=>{n?.(r)},[r,n]);let[p,m]=(0,B.useState)(!1),[h,g]=(0,B.useState)(``),[y,b]=(0,B.useState)(!1),[x,S]=(0,B.useState)(null),[C,w]=(0,B.useState)(null),T=r===null||r.isGit,E=r?.hasCommits??!1,k=W.has(u),A=h.trim(),j=/^[a-zA-Z0-9/_.-]+$/.test(A)&&A.length>0,M=A===u;function N(){m(!0),g(u||``),S(null),w(null)}async function P(){if(!(!j||M||y)){b(!0),S(null);try{let e=await i.post(`/git/switch`,{branchName:A});if(!e.ok)throw Error(e.error||`Failed to switch branch.`);f(A),w({branch:A,created:e.created}),m(!1),t?.(A)}catch(e){S(e instanceof Error?e.message:String(e))}finally{b(!1)}}}async function F(){s(!0),l(null);try{let e=await i.post(`/git/init`,{});if(!e.ok)throw Error(e.error||`Failed to initialize git.`);a({isGit:!!(e.isGit??!0),branch:e.branch||null,hasCommits:!!(e.hasCommits??!0)}),f(e.branch||u)}catch(e){l(e instanceof Error?e.message:String(e))}finally{s(!1)}}return(0,V.jsxs)(`div`,{className:`bg-base-200 rounded-2xl p-5 flex flex-col gap-4`,children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,V.jsx)(v,{className:`size-4 text-primary`}),(0,V.jsx)(`div`,{className:`text-sm font-semibold`,children:`Working branch`})]}),(0,V.jsx)(`p`,{className:`text-xs text-base-content/50 -mt-2`,children:`Agents create worktrees based on the current branch. We recommend not working directly on main.`}),r!==null&&!r.isGit&&(0,V.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,V.jsxs)(`div`,{className:`alert alert-warning py-3`,children:[(0,V.jsx)(I,{className:`size-4 shrink-0`}),(0,V.jsxs)(`div`,{className:`text-sm`,children:[(0,V.jsx)(`p`,{className:`font-semibold`,children:`Not a git repository`}),(0,V.jsx)(`p`,{className:`opacity-80 mt-0.5`,children:`fifony requires git and an initial commit to create agent worktrees. Initialize it here to continue.`})]})]}),c&&(0,V.jsxs)(`p`,{className:`text-xs text-error flex items-center gap-1`,children:[(0,V.jsx)(D,{className:`size-3`}),` `,c]}),(0,V.jsxs)(`button`,{className:`btn btn-primary gap-2 self-start`,onClick:F,disabled:o,children:[o?(0,V.jsx)(d,{className:`size-4 animate-spin`}):(0,V.jsx)(I,{className:`size-4`}),`Initialize git repository`]})]}),r!==null&&r.isGit&&!E&&(0,V.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,V.jsxs)(`div`,{className:`alert alert-warning py-3`,children:[(0,V.jsx)(I,{className:`size-4 shrink-0`}),(0,V.jsxs)(`div`,{className:`text-sm`,children:[(0,V.jsx)(`p`,{className:`font-semibold`,children:`Repository has no commits yet`}),(0,V.jsx)(`p`,{className:`opacity-80 mt-0.5`,children:`fifony needs one initial commit before it can create per-issue git worktrees. Create it here to continue.`})]})]}),c&&(0,V.jsxs)(`p`,{className:`text-xs text-error flex items-center gap-1`,children:[(0,V.jsx)(D,{className:`size-3`}),` `,c]}),(0,V.jsxs)(`button`,{className:`btn btn-primary gap-2 self-start`,onClick:F,disabled:o,children:[o?(0,V.jsx)(d,{className:`size-4 animate-spin`}):(0,V.jsx)(I,{className:`size-4`}),`Create initial commit`]})]}),r?.isGit&&r?.hasCommits&&r?.isClean===!1&&(0,V.jsxs)(`div`,{className:`alert alert-info py-3 text-sm`,children:[(0,V.jsx)(D,{className:`size-4 shrink-0`}),(0,V.jsxs)(`div`,{children:[(0,V.jsx)(`p`,{className:`font-semibold`,children:`Working tree has uncommitted changes`}),(0,V.jsxs)(`p`,{className:`opacity-80 mt-0.5`,children:[r.untrackedCount>0?`${r.untrackedCount} untracked file${r.untrackedCount>1?`s`:``} found. `:``,`Commit or stash your changes before merging issues — fifony requires a clean working tree to merge agent work.`]})]})]}),T&&(0,V.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[p?(0,V.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,V.jsxs)(`div`,{className:`flex gap-2`,children:[(0,V.jsxs)(`label`,{className:`input input-bordered flex items-center gap-2 flex-1`,children:[(0,V.jsx)(v,{className:`size-3.5 opacity-40`}),(0,V.jsx)(`input`,{type:`text`,className:`grow font-mono text-sm`,value:h,onChange:e=>{g(e.target.value),S(null)},onKeyDown:e=>{e.key===`Enter`&&P(),e.key===`Escape`&&(m(!1),S(null))},placeholder:`develop`,autoFocus:!0,disabled:y})]}),(0,V.jsx)(`button`,{className:`btn btn-primary`,onClick:P,disabled:!j||M||y,children:y?(0,V.jsx)(ae,{className:`size-4 animate-spin`}):`Switch`}),(0,V.jsx)(`button`,{className:`btn btn-ghost`,onClick:()=>{m(!1),S(null)},disabled:y,children:`Cancel`})]}),x&&(0,V.jsxs)(`p`,{className:`text-xs text-error flex items-center gap-1`,children:[(0,V.jsx)(D,{className:`size-3`}),` `,x]}),(0,V.jsx)(`p`,{className:`text-xs opacity-40`,children:`Switches to the branch if it exists, or creates it from the current HEAD.`})]}):(0,V.jsxs)(`div`,{className:`flex items-center gap-2 px-4 py-3 rounded-box border border-base-300 bg-base-100 cursor-pointer hover:border-primary/40 transition-colors group`,onClick:N,role:`button`,tabIndex:0,onKeyDown:e=>e.key===`Enter`&&N(),children:[(0,V.jsx)(v,{className:`size-4 opacity-50 shrink-0`}),(0,V.jsx)(`span`,{className:`text-sm opacity-50`,children:`Current branch:`}),(0,V.jsx)(`span`,{className:`font-mono text-sm font-semibold`,children:u||(r===null?`…`:`—`)}),k&&(0,V.jsx)(`span`,{className:`badge badge-warning badge-sm ml-auto shrink-0`,children:`protected`}),!k&&(0,V.jsx)(_,{className:`size-3.5 opacity-0 group-hover:opacity-40 ml-auto shrink-0 transition-opacity`})]}),C&&(0,V.jsxs)(`div`,{className:`alert alert-success py-3 text-sm animate-fade-in`,children:[(0,V.jsx)(O,{className:`size-4 shrink-0`}),(0,V.jsxs)(`div`,{children:[(0,V.jsx)(`p`,{className:`font-semibold`,children:C.created?`Branch created`:`Switched to branch`}),(0,V.jsxs)(`p`,{className:`opacity-75 font-mono mt-0.5`,children:[`Now on `,(0,V.jsx)(`span`,{className:`text-success-content`,children:C.branch}),` — agents will use this as the base branch`]})]})]}),k&&!p&&(0,V.jsxs)(`div`,{className:`alert alert-warning py-3`,children:[(0,V.jsx)(D,{className:`size-4 shrink-0`}),(0,V.jsxs)(`div`,{className:`text-sm`,children:[(0,V.jsxs)(`p`,{className:`font-semibold`,children:[`Working directly on `,(0,V.jsx)(`span`,{className:`font-mono`,children:u})]}),(0,V.jsx)(`p`,{className:`opacity-80 mt-0.5`,children:`In teams with protected branches, local merges are rejected. Click the branch above to switch, or use Push PR mode.`})]})]}),(0,V.jsx)(he,{})]})]})}function K({mergeMode:e,setMergeMode:t,prBaseBranch:n,setPrBaseBranch:r,currentBranch:i}){return(0,V.jsxs)(`div`,{className:`bg-base-200 rounded-2xl p-5 flex flex-col gap-4`,children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,V.jsx)(g,{className:`size-4 text-primary`}),(0,V.jsx)(`div`,{className:`text-sm font-semibold`,children:`Merge mode`})]}),(0,V.jsx)(`p`,{className:`text-xs text-base-content/50 -mt-2`,children:`Choose how completed issues are integrated: local git merge or push a PR to GitHub.`}),(0,V.jsxs)(`div`,{className:`flex gap-3`,children:[(0,V.jsxs)(`label`,{className:`flex-1 cursor-pointer rounded-xl border-2 p-3 text-center text-sm font-medium transition-colors ${e===`local`?`border-primary bg-primary/10`:`border-base-300 bg-base-100`}`,children:[(0,V.jsx)(`input`,{type:`radio`,name:`mergeMode`,className:`hidden`,checked:e===`local`,onChange:()=>t(`local`)}),(0,V.jsx)(I,{className:`size-4 mx-auto mb-1 opacity-60`}),`Local merge`]}),(0,V.jsxs)(`label`,{className:`flex-1 cursor-pointer rounded-xl border-2 p-3 text-center text-sm font-medium transition-colors ${e===`push-pr`?`border-primary bg-primary/10`:`border-base-300 bg-base-100`}`,children:[(0,V.jsx)(`input`,{type:`radio`,name:`mergeMode`,className:`hidden`,checked:e===`push-pr`,onChange:()=>t(`push-pr`)}),(0,V.jsx)(g,{className:`size-4 mx-auto mb-1 opacity-60`}),`Push PR`]})]}),e===`push-pr`&&(0,V.jsxs)(`label`,{className:`form-control w-full gap-2`,children:[(0,V.jsx)(`span`,{className:`label-text text-sm font-medium`,children:`PR base branch`}),(0,V.jsx)(`input`,{type:`text`,className:`input input-bordered w-full text-sm font-mono`,placeholder:i||`main`,value:n,onChange:e=>r(e.target.value)}),(0,V.jsx)(`p`,{className:`text-xs opacity-40`,children:`Branch that PRs will target. Defaults to the current branch.`})]})]})}function q({testCommand:e,setTestCommand:t}){let n=!!e?.trim();return(0,V.jsxs)(`div`,{className:`bg-base-200 rounded-2xl p-5 flex flex-col gap-4`,children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,V.jsx)(S,{className:`size-4 text-primary`}),(0,V.jsx)(`div`,{className:`text-sm font-semibold`,children:`Validation gate`})]}),(0,V.jsxs)(`p`,{className:`text-xs text-base-content/50 -mt-2`,children:[`This command runs `,(0,V.jsx)(`strong`,{children:`after every execution`}),`, before the AI review starts. If it fails, the issue is retried automatically — bad code never reaches the review phase.`]}),(0,V.jsx)(`input`,{type:`text`,className:`input input-bordered w-full text-sm font-mono`,placeholder:`pnpm test`,value:e,onChange:e=>t(e.target.value)}),(0,V.jsxs)(`p`,{className:`text-xs text-base-content/40`,children:[`For monorepos (pnpm/yarn/npm workspaces), Spark automatically scopes tests to affected packages only — no need for `,(0,V.jsx)(`code`,{className:`opacity-60`,children:`turbo`}),` or full-suite runs.`]}),!n&&(0,V.jsxs)(`div`,{className:`alert alert-warning py-3 text-sm`,children:[(0,V.jsx)(D,{className:`size-4 shrink-0`}),(0,V.jsxs)(`div`,{children:[(0,V.jsx)(`p`,{className:`font-semibold`,children:`No safety net configured`}),(0,V.jsx)(`p`,{className:`opacity-80 mt-0.5`,children:`Without a test command, Spark cannot validate that agent changes actually work. Issues will skip the validation gate entirely — if you enable automatic merge, broken code could be merged into your branch without any checks.`}),(0,V.jsx)(`p`,{className:`opacity-60 mt-1.5 text-xs`,children:`You can always add a test command later in Settings → Workflow.`})]})]}),n&&(0,V.jsxs)(`div`,{className:`alert alert-success py-2.5 text-sm`,children:[(0,V.jsx)(p,{className:`size-4 shrink-0`}),(0,V.jsx)(`span`,{children:`Validation gate active — every execution will be tested before review.`})]})]})}function ge({autoReviewApproval:e,setAutoReviewApproval:t}){return(0,V.jsxs)(`div`,{className:`bg-base-200 rounded-2xl p-5 flex flex-col gap-4`,children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,V.jsx)(p,{className:`size-4 text-primary`}),(0,V.jsx)(`div`,{className:`text-sm font-semibold`,children:`Review completion`})]}),(0,V.jsx)(`p`,{className:`text-xs text-base-content/50 -mt-2`,children:`Control whether completed reviews move issues directly to Done or require manual confirmation.`}),(0,V.jsxs)(`label`,{className:`label cursor-pointer justify-start gap-3`,children:[(0,V.jsx)(`input`,{type:`checkbox`,className:`toggle toggle-sm toggle-primary`,checked:e,onChange:e=>t(e.target.checked)}),(0,V.jsx)(`span`,{className:`label-text text-sm`,children:`Automatic review approval`})]}),(0,V.jsx)(`p`,{className:`text-xs text-base-content/50`,children:e?`Checked: issues move to Approved when the reviewer succeeds, or when no reviewer is configured.`:`Unchecked: issues stop in Pending Decision and require manual approval action.`})]})}function J({autoCommitBeforeMerge:e,setAutoCommitBeforeMerge:t,autoResolveConflicts:n,setAutoResolveConflicts:r}){return(0,V.jsxs)(`div`,{className:`bg-base-200 rounded-2xl p-5 flex flex-col gap-4`,children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,V.jsx)(I,{className:`size-4 text-primary`}),(0,V.jsx)(`div`,{className:`text-sm font-semibold`,children:`Merge behavior`})]}),(0,V.jsx)(`p`,{className:`text-xs text-base-content/50 -mt-2`,children:`Control how fifony handles merge blockers automatically.`}),(0,V.jsxs)(`label`,{className:`label cursor-pointer justify-start gap-3`,children:[(0,V.jsx)(`input`,{type:`checkbox`,className:`toggle toggle-sm toggle-primary`,checked:e,onChange:e=>t(e.target.checked)}),(0,V.jsxs)(`div`,{children:[(0,V.jsx)(`span`,{className:`label-text text-sm`,children:`Auto-commit before merge`}),(0,V.jsx)(`p`,{className:`text-xs text-base-content/50 mt-0.5`,children:e?`Uncommitted changes are committed automatically so merges aren't blocked.`:`Merge will fail if there are uncommitted changes — issues move to Blocked.`})]})]}),(0,V.jsxs)(`label`,{className:`label cursor-pointer justify-start gap-3`,children:[(0,V.jsx)(`input`,{type:`checkbox`,className:`toggle toggle-sm toggle-primary`,checked:n,onChange:e=>r(e.target.checked)}),(0,V.jsxs)(`div`,{children:[(0,V.jsx)(`span`,{className:`label-text text-sm`,children:`Auto-resolve merge conflicts`}),(0,V.jsx)(`p`,{className:`text-xs text-base-content/50 mt-0.5`,children:n?`An agent is spawned to resolve conflicts automatically when a merge collides.`:`Merge conflicts block the issue — you must resolve them manually.`})]})]})]})}function _e({projectName:e,setProjectName:t,detectedProjectName:n,projectSource:r,workspacePath:i,currentBranch:a,onGitStatusChange:o,onBranchCreated:s,mergeMode:c,setMergeMode:l,prBaseBranch:u,setPrBaseBranch:d,autoReviewApproval:f,setAutoReviewApproval:p,testCommand:h,setTestCommand:g,autoCommitBeforeMerge:v,setAutoCommitBeforeMerge:y,autoResolveConflicts:b,setAutoResolveConflicts:x}){let S=w(e),C=ie(S||n),E=S?r===`saved`||r===`detected`?r:`manual`:n?`detected`:`missing`;return(0,V.jsxs)(`div`,{className:`flex flex-col gap-6 py-4`,children:[(0,V.jsxs)(`div`,{className:`text-center space-y-3`,children:[(0,V.jsx)(`div`,{className:`inline-flex size-14 items-center justify-center rounded-full bg-primary/10 text-primary mx-auto`,children:(0,V.jsx)(T,{className:`size-7`})}),(0,V.jsxs)(`div`,{className:`space-y-2`,children:[(0,V.jsx)(`h2`,{className:`text-2xl font-bold tracking-tight`,children:`Set up your workspace`}),(0,V.jsx)(`p`,{className:`text-base-content/60 max-w-xl mx-auto text-sm`,children:`Name your project and configure the working branch`})]})]}),(0,V.jsxs)(`div`,{className:`bg-base-200 rounded-2xl p-5 flex flex-col gap-4`,children:[(0,V.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,V.jsxs)(`div`,{children:[(0,V.jsx)(`div`,{className:`text-sm font-semibold`,children:`Project name`}),(0,V.jsx)(`div`,{className:`text-xs text-base-content/50`,children:`This becomes the default queue title for future runs.`})]}),E===`saved`&&(0,V.jsxs)(`span`,{className:`badge badge-primary badge-soft gap-1.5`,children:[(0,V.jsx)(m,{className:`size-3`}),`Saved configuration`]}),E===`detected`&&(0,V.jsxs)(`span`,{className:`badge badge-secondary badge-soft gap-1.5`,children:[(0,V.jsx)(m,{className:`size-3`}),`Detected automatically`]}),E===`manual`&&(0,V.jsxs)(`span`,{className:`badge badge-accent badge-soft gap-1.5`,children:[(0,V.jsx)(_,{className:`size-3`}),`Edited manually`]}),E===`missing`&&(0,V.jsxs)(`span`,{className:`badge badge-warning badge-soft gap-1.5`,children:[(0,V.jsx)(D,{className:`size-3`}),`Manual entry required`]})]}),(0,V.jsxs)(`label`,{className:`form-control w-full gap-2`,children:[(0,V.jsx)(`span`,{className:`label-text text-sm font-medium`,children:`Project`}),(0,V.jsx)(`input`,{type:`text`,className:`input input-bordered w-full text-base`,placeholder:n||`Enter your project name`,value:e,onChange:e=>t(e.target.value),onBlur:n=>{let r=w(n.target.value);r!==e&&t(r)}})]}),i&&(0,V.jsxs)(`div`,{className:`text-xs text-base-content/50 break-all`,children:[`Workspace: `,i]}),!n&&!S&&(0,V.jsxs)(`div`,{className:`alert alert-warning text-sm`,children:[(0,V.jsx)(D,{className:`size-4 shrink-0`}),(0,V.jsx)(`span`,{children:`We could not detect a project name from the current directory. Enter one to continue.`})]}),(0,V.jsxs)(`div`,{className:`rounded-xl border border-base-300/70 bg-base-100 px-4 py-3`,children:[(0,V.jsx)(`div`,{className:`text-xs uppercase tracking-[0.2em] text-base-content/40`,children:`Queue title preview`}),(0,V.jsx)(`div`,{className:`mt-1.5 text-base font-semibold tracking-tight break-words`,children:C})]})]}),(0,V.jsx)(G,{currentBranch:a,onGitStatusChange:o,onBranchCreated:s}),(0,V.jsx)(K,{mergeMode:c,setMergeMode:l,prBaseBranch:u,setPrBaseBranch:d,currentBranch:a}),(0,V.jsx)(ge,{autoReviewApproval:f,setAutoReviewApproval:p}),(0,V.jsx)(J,{autoCommitBeforeMerge:v,setAutoCommitBeforeMerge:y,autoResolveConflicts:b,setAutoResolveConflicts:x}),(0,V.jsx)(q,{testCommand:h,setTestCommand:g})]})}var ve={enhancer:`enhance`,chatter:`chat`,planner:`plan`,executor:`execute`,reviewer:`review`,services:`services`},Y=N.map(e=>e.role);function ye({options:e,value:t,onChange:n}){return(0,V.jsx)(`div`,{className:`flex gap-1 flex-wrap`,children:e.map(e=>{let r=e.value===t,i=e.icon;return(0,V.jsxs)(`button`,{type:`button`,onClick:()=>n(e.value),className:`flex items-center gap-1 px-2.5 py-1 rounded-full text-[11px] font-medium border transition-all ${r?`${e.color} border-current bg-base-300`:`text-base-content/35 border-base-content/10 hover:border-base-content/30 hover:text-base-content/60`}`,children:[(0,V.jsx)(i,{className:`size-2.5`}),e.label]},e.value)})})}function be({providers:e,providersLoading:t,pipeline:n,setPipeline:r,efforts:i,setEfforts:a,models:o,setModels:s,modelsByProvider:c}){let l=Array.isArray(e)?e:[],u=l.filter(e=>e.available!==!1),f=Y.every(e=>n[e]&&n[e]===n[Y[0]]),p=(0,B.useMemo)(()=>{let e=N.map(e=>new Set(A(e.role,n).map(e=>e.value)));if(e.length===0)return L;let t=[...e[0]].filter(t=>e.every(e=>e.has(t))),r=L.filter(e=>t.includes(e.value));return r.length>0?r:L},[n]),m=(0,B.useMemo)(()=>{let e=Y.map(e=>i[e]),t=(e.every(t=>t===e[0])?e[0]:null)||p[0]?.value||`high`;return p.some(e=>e.value===t)?t:`high`},[i,p]),h=e=>e?.id||e?.name||e,g=e=>(c?.[e]||[])[0]?.id||``,_=e=>{let t=h(e);if(!t)return;let n=g(t),i=Object.fromEntries(Y.map(e=>[e,t])),a=Object.fromEntries(Object.values(ve).map(e=>[e,n]));r(i),s(a)};return(0,B.useEffect)(()=>{for(let e of Y){let t=A(e,n),r=i[e];r&&!t.some(e=>e.value===r)&&a(t=>({...t,[e]:`high`}))}},[n,i,a]),(0,V.jsxs)(`div`,{className:`flex flex-col gap-5 w-full max-w-2xl`,children:[(0,V.jsxs)(`div`,{className:`text-center`,children:[(0,V.jsx)(b,{className:`size-9 text-primary mx-auto mb-2`}),(0,V.jsx)(`h2`,{className:`text-2xl font-bold`,children:`Agent Pipeline`}),(0,V.jsx)(`p`,{className:`text-sm text-base-content/50 mt-1`,children:`Configure which CLI and reasoning depth runs each stage`})]}),t?(0,V.jsxs)(`div`,{className:`flex flex-col items-center gap-3 py-10`,children:[(0,V.jsx)(d,{className:`size-7 text-primary animate-spin`}),(0,V.jsx)(`p`,{className:`text-sm text-base-content/50`,children:`Detecting available CLIs...`})]}):u.length===0?(0,V.jsx)(`div`,{className:`alert alert-warning text-sm`,children:`No providers detected. Install claude, codex, or gemini CLI first.`}):(0,V.jsxs)(V.Fragment,{children:[(0,V.jsxs)(`div`,{className:`bg-base-200 rounded-xl p-4 space-y-4`,children:[(0,V.jsxs)(`div`,{children:[(0,V.jsx)(`h3`,{className:`text-sm font-semibold mb-2`,children:`Apply to all stages`}),(0,V.jsx)(`p`,{className:`text-xs text-base-content/50 mb-2`,children:`Use one CLI and one effort across all 6 stages.`}),(0,V.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:u.map(e=>{let t=h(e);return(0,V.jsx)(`button`,{type:`button`,className:`btn btn-xs ${f&&n[Y[0]]===t?`btn-primary`:`btn-soft`}`,onClick:()=>_(e),children:t},t)})})]}),(0,V.jsxs)(`div`,{children:[(0,V.jsx)(`div`,{className:`text-[10px] text-base-content/40 mb-2`,children:`Effort (applies to all)`}),(0,V.jsx)(ye,{options:p,value:m,onChange:e=>{e&&p.some(t=>t.value===e)&&a(Object.fromEntries(Y.map(t=>[t,e])))}})]})]}),(0,V.jsx)(`div`,{className:`flex flex-wrap gap-2 justify-center`,children:l.map(e=>{let t=h(e),n=e.available!==!1;return(0,V.jsxs)(`span`,{className:`badge gap-1.5 badge-sm ${n?`badge-success`:`badge-ghost opacity-40`}`,children:[n?(0,V.jsx)(re,{className:`size-3`}):(0,V.jsx)(F,{className:`size-3`}),(0,V.jsx)(`span`,{className:`font-mono`,children:t}),e.path&&(0,V.jsx)(`span`,{className:`opacity-50 text-[9px] hidden sm:inline`,children:e.path})]},t)})}),(0,V.jsx)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 gap-3`,children:N.map(e=>{let t=e.icon,l=n[e.role]||u[0]?.id||u[0]?.name||``,d=ve[e.role],f=o?.[d]||``,p=c?.[l]||[],m=A(e.role,n),h=i?.[e.role]||`high`;return(0,V.jsx)(`div`,{className:`bg-base-200 rounded-xl p-4`,children:(0,V.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,V.jsx)(`div`,{className:`size-8 rounded-lg flex items-center justify-center bg-base-300 shrink-0 ${e.color}`,children:(0,V.jsx)(t,{className:`size-4`})}),(0,V.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,V.jsx)(`span`,{className:`font-semibold text-sm`,children:e.label}),(0,V.jsx)(`p`,{className:`text-[11px] text-base-content/40 leading-tight mt-0.5 truncate`,children:e.description})]}),(0,V.jsx)(`select`,{className:`select select-sm select-bordered w-28 shrink-0`,value:l,onChange:t=>{let n=t.target.value;r(t=>({...t,[e.role]:n}));let i=c?.[n]?.[0]?.id||``;s(e=>({...e,[d]:i}))},children:u.map(e=>{let t=e.id||e.name||e;return(0,V.jsx)(`option`,{value:t,children:t},t)})})]}),(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,V.jsx)(`span`,{className:`text-[10px] text-base-content/40 shrink-0 w-10`,children:`Effort`}),(0,V.jsx)(ye,{options:m,value:h,onChange:t=>a(n=>({...n,[e.role]:t}))})]}),p.length>0&&(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,V.jsx)(`span`,{className:`text-[10px] text-base-content/40 shrink-0 w-10`,children:`Model`}),(0,V.jsx)(`select`,{className:`select select-xs select-bordered flex-1`,value:f,onChange:e=>s(t=>({...t,[d]:e.target.value})),children:p.map(e=>(0,V.jsx)(`option`,{value:e.id,children:e.label||e.id},e.id))})]})]})},e.role)})}),(0,V.jsx)(`p`,{className:`text-[11px] text-base-content/35 text-center`,children:`Pipeline stages: enhance, chat, plan, execute, review, services`})]})]})}function xe({selectedAgents:e,setSelectedAgents:t,existingAgents:n,autoSelectAgents:r=!0}){let[a,o]=(0,B.useState)([]),[s,c]=(0,B.useState)(!1),l=(0,B.useRef)(!1),[f,p]=(0,B.useState)([]),[m,h]=(0,B.useState)(!1),[g,_]=(0,B.useState)(``),[v,y]=(0,B.useState)(()=>new Set),[b,S]=(0,B.useState)({}),C=(0,B.useRef)(!1),[w,T]=(0,B.useState)(``),E=(0,B.useCallback)(()=>i.get(`/catalog/agents`).catch(()=>({agents:[]})).then(e=>{let t=e?.agents||[];return o(t),t}),[]);(0,B.useEffect)(()=>{l.current||(l.current=!0,c(!0),E().then(i=>{let a=new Set((n||[]).map(e=>e.name)),o=i.filter(e=>!a.has(e.name)).map(e=>e.name);r&&o.length>0&&e.length===0&&t(o)}).finally(()=>c(!1)))},[]);let D=(0,B.useCallback)(()=>(_(``),h(!0),i.get(`/reference-repositories`).then(e=>{p(e?.repositories||[])}).catch(e=>{let t=e?.message||`Failed to load reference repositories.`;t.toLowerCase().includes(`route not found`)?_(`Backend route not loaded. Start Fifony with --dev (or run pnpm build:server) and retry.`):_(t)}).finally(()=>h(!1))),[]);(0,B.useEffect)(()=>{C.current||(C.current=!0,D())},[D]);let O=(0,B.useMemo)(()=>new Set((n||[]).map(e=>e.name)),[n]),k=(0,B.useMemo)(()=>{let e=w.trim().toLowerCase();return e?a.filter(t=>[t?.name,t?.displayName,t?.description].filter(Boolean).join(` `).toLowerCase().includes(e)):a},[w,a]),A=(0,B.useCallback)(e=>{t(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])},[t]),j=(0,B.useCallback)(()=>{t(a.filter(e=>!O.has(e.name)).map(e=>e.name))},[a,O,t]),N=(0,B.useCallback)(()=>t([]),[t]),P=(0,B.useCallback)(async e=>{y(t=>new Set([...t,e])),S(t=>({...t,[e]:``}));try{let t=((await i.post(`/reference-repositories/sync`,{repository:e}))?.results||[]).find(t=>t.id===e);if(t?.action===`failed`){S(n=>({...n,[e]:t.message||`Sync failed.`}));return}await i.post(`/reference-repositories/import`,{repository:e,kind:`agents`,global:!1}),await Promise.all([D(),E()]),S(t=>({...t,[e]:`Synced & imported.`}))}catch(t){S(n=>({...n,[e]:t?.message||`Failed.`}))}finally{y(t=>{let n=new Set(t);return n.delete(e),n})}},[D,E]);return s?(0,V.jsxs)(`div`,{className:`flex flex-col items-center gap-3 py-12`,children:[(0,V.jsx)(d,{className:`size-8 text-primary animate-spin`}),(0,V.jsx)(`p`,{className:`text-sm text-base-content/50`,children:`Loading catalog...`})]}):(0,V.jsxs)(`div`,{className:`flex flex-col gap-6 stagger-children`,children:[(0,V.jsxs)(`div`,{className:`text-center`,children:[(0,V.jsx)(M,{className:`size-10 text-primary mx-auto mb-3`}),(0,V.jsx)(`h2`,{className:`text-2xl font-bold`,children:`Agents`}),(0,V.jsx)(`p`,{className:`text-base-content/60 mt-1`,children:`Choose which agents to install`})]}),(0,V.jsx)(`div`,{className:`card bg-base-200`,children:(0,V.jsxs)(`div`,{className:`card-body gap-3 p-4`,children:[(0,V.jsx)(`h3`,{className:`font-semibold text-sm`,children:`Sources`}),g&&(0,V.jsx)(`div`,{className:`alert alert-warning text-xs`,children:g}),m?(0,V.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-base-content/60`,children:[(0,V.jsx)(d,{className:`size-3 animate-spin`}),` Loading...`]}):(0,V.jsx)(`div`,{className:`grid grid-cols-2 xl:grid-cols-4 gap-2`,children:f.map(e=>{let t=v.has(e.id),n=e?.artifactCounts??null,r=e?.present&&e?.synced;return(0,V.jsxs)(`div`,{className:`rounded-lg border border-base-300/70 bg-base-100 p-2 flex flex-col gap-1.5`,children:[(0,V.jsx)(`div`,{className:`font-medium text-xs truncate`,children:e.name}),r&&n?(0,V.jsxs)(`div`,{className:`text-[11px] text-base-content/60`,children:[n.agents,` agents`]}):(0,V.jsx)(`span`,{className:`badge badge-xs badge-warning`,children:`Not synced`}),b[e.id]&&(0,V.jsx)(`p`,{className:`text-[11px] text-base-content/60 truncate`,children:b[e.id]}),(0,V.jsxs)(`button`,{className:`btn btn-xs btn-outline gap-1 mt-auto`,onClick:()=>P(e.id),disabled:t,children:[t?(0,V.jsx)(d,{className:`size-3 animate-spin`}):(0,V.jsx)(x,{className:`size-3`}),t?`Syncing…`:r?`Re-sync`:`Sync`]})]},e.id)})})]})}),(0,V.jsxs)(`div`,{className:`space-y-2`,children:[(0,V.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,V.jsxs)(`h3`,{className:`font-semibold text-sm flex items-center gap-2`,children:[(0,V.jsx)(M,{className:`size-4 opacity-50`}),`Agents (`,a.length,`)`]}),(0,V.jsxs)(`div`,{className:`flex gap-1`,children:[(0,V.jsx)(`button`,{className:`btn btn-xs btn-ghost`,onClick:j,children:`Select All`}),(0,V.jsx)(`button`,{className:`btn btn-xs btn-ghost`,onClick:N,children:`None`})]})]}),(0,V.jsxs)(`label`,{className:`input input-bordered input-sm flex items-center gap-2`,children:[(0,V.jsx)(u,{className:`size-4 opacity-60`}),(0,V.jsx)(`input`,{type:`text`,className:`grow`,placeholder:`Search agents...`,value:w,onChange:e=>T(e.target.value)})]}),k.length===0&&a.length>0&&(0,V.jsx)(`div`,{className:`text-sm text-base-content/60`,children:`No agents match your search.`}),(0,V.jsx)(`div`,{className:`space-y-1 pt-1`,children:k.map(t=>{let n=O.has(t.name),r=n||e.includes(t.name);return(0,V.jsx)(`button`,{className:`w-full rounded-md border border-transparent px-2 py-2 text-left transition-all ${n?`opacity-70 bg-base-100/40`:`hover:bg-base-100`} ${r&&!n?`ring-1 ring-primary ring-offset-1 ring-offset-base-200`:``}`,onClick:()=>!n&&A(t.name),disabled:n,children:(0,V.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,V.jsx)(`span`,{className:`mt-0.5 text-base`,children:t.emoji||`🤖`}),(0,V.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,V.jsx)(`span`,{className:`font-medium text-sm truncate`,children:t.displayName||t.name}),t.source&&(0,V.jsx)(`span`,{className:`badge badge-xs badge-ghost shrink-0`,children:t.source}),n?(0,V.jsxs)(`span`,{className:`badge badge-xs badge-success gap-1 shrink-0`,children:[(0,V.jsx)(ee,{className:`size-3`}),` Installed`]}):(0,V.jsx)(`input`,{type:`checkbox`,className:`checkbox checkbox-primary checkbox-sm self-start mt-0.5 shrink-0`,checked:r,readOnly:!0,tabIndex:-1})]}),t.description&&(0,V.jsx)(`p`,{className:`text-xs text-base-content/60 mt-1 truncate`,children:t.description})]})]})},t.name)})})]}),a.length===0&&(0,V.jsx)(`div`,{className:`alert alert-info text-sm`,children:`No agents found in the catalog. Sync a source above or add them later from the settings page.`})]})}var X={auto:{bg:null,label:`Auto`},light:{bg:`#ffffff`,accent:`#7c3aed`},dark:{bg:`#1d232a`,accent:`#661ae6`},black:{bg:`#000000`,accent:`#ffffff`},cupcake:{bg:`#faf7f5`,accent:`#ef9fbc`},night:{bg:`#0f172a`,accent:`#38bdf8`},sunset:{bg:`#1a1019`,accent:`#ff865b`}};function Se({theme:e,selected:t,onClick:n}){let r=X[e.value];return(0,V.jsxs)(`button`,{onClick:n,title:e.label,className:`flex flex-col items-center gap-1.5 group focus:outline-none`,children:[(0,V.jsx)(`div`,{className:`w-10 h-10 rounded-xl border-2 transition-all overflow-hidden flex-shrink-0 ${t?`border-primary ring-2 ring-primary ring-offset-2 ring-offset-base-200 scale-110`:`border-base-300 group-hover:border-base-content/30 group-hover:scale-105`}`,style:r.bg?{background:r.bg}:void 0,children:r.bg?(0,V.jsxs)(`div`,{className:`w-full h-full flex flex-col`,children:[(0,V.jsx)(`div`,{className:`flex-1`,style:{background:r.bg}}),(0,V.jsx)(`div`,{className:`h-3 w-full`,style:{background:r.accent}})]}):(0,V.jsxs)(`div`,{className:`w-full h-full flex`,children:[(0,V.jsx)(`div`,{className:`flex-1 bg-white`}),(0,V.jsx)(`div`,{className:`flex-1 bg-neutral`})]})}),(0,V.jsx)(`span`,{className:`text-xs font-medium transition-colors ${t?`text-primary`:`text-base-content/50 group-hover:text-base-content/80`}`,children:e.label})]})}function Ce({concurrency:e,setConcurrency:t,selectedTheme:n,setSelectedTheme:r}){let i=Number.isFinite(e)?Math.max(1,Math.min(10,e)):1;return(0,V.jsxs)(`div`,{className:`flex flex-col gap-6 stagger-children`,children:[(0,V.jsxs)(`div`,{className:`text-center`,children:[(0,V.jsx)(z,{className:`size-10 text-primary mx-auto mb-3`}),(0,V.jsx)(`h2`,{className:`text-2xl font-bold`,children:`Workers & Theme`}),(0,V.jsx)(`p`,{className:`text-base-content/60 mt-1 text-sm`,children:`Configure parallel workers and visual theme`})]}),(0,V.jsx)(`div`,{className:`card bg-base-200`,children:(0,V.jsxs)(`div`,{className:`card-body p-5 gap-3`,children:[(0,V.jsxs)(`h3`,{className:`font-semibold text-sm flex items-center gap-2`,children:[(0,V.jsx)(z,{className:`size-4 opacity-50`}),`Worker Concurrency`]}),(0,V.jsxs)(`p`,{className:`text-xs text-base-content/60`,children:[`How many agents can work in parallel (`,i,` worker`,i===1?``:`s`,`)`]}),(0,V.jsxs)(`div`,{className:`w-full max-w-xs`,children:[(0,V.jsx)(`input`,{type:`range`,min:1,max:10,step:1,value:i,onChange:e=>t(Math.round(Number(e.target.value))),"aria-label":`Number of parallel workers`,className:`range range-primary range-sm w-full`}),(0,V.jsx)(`div`,{className:`flex justify-between px-2.5 mt-2 text-xs`,children:Array.from({length:10},(e,t)=>(0,V.jsx)(`span`,{children:`|`},t))}),(0,V.jsx)(`div`,{className:`flex justify-between px-2.5 mt-2 text-xs`,children:Array.from({length:10},(e,t)=>(0,V.jsx)(`span`,{children:t+1},t))})]}),(0,V.jsxs)(`p`,{className:`text-xs text-base-content/50 bg-base-100 rounded-lg px-3 py-2 mt-1`,children:[(0,V.jsx)(`span`,{className:`font-medium text-base-content/70`,children:`Tip:`}),` 2–4 workers is recommended for most projects. More workers consume more API quota and may hit rate limits.`]})]})}),(0,V.jsx)(`div`,{className:`card bg-base-200`,children:(0,V.jsxs)(`div`,{className:`card-body p-5 gap-4`,children:[(0,V.jsxs)(`h3`,{className:`font-semibold text-sm flex items-center gap-2`,children:[(0,V.jsx)(y,{className:`size-4 opacity-50`}),`Theme`]}),(0,V.jsx)(`div`,{className:`flex flex-wrap gap-5 justify-center py-1`,children:te.map(e=>(0,V.jsx)(Se,{theme:e,selected:n===e.value,onClick:()=>r(e.value)},e.value))})]})})]})}function we({config:e,launching:t}){return(0,V.jsxs)(`div`,{className:`flex flex-col items-center text-center gap-6 stagger-children py-4`,children:[(0,V.jsx)(`div`,{className:`animate-bounce-in`,children:(0,V.jsx)(b,{className:`size-16 sm:size-20 text-primary mx-auto`})}),(0,V.jsx)(`h2`,{className:`text-2xl sm:text-3xl font-bold`,children:`You're All Set!`}),(0,V.jsx)(`p`,{className:`text-base-content/60 max-w-md`,children:`Here's a summary of your configuration. Hit launch when you're ready.`}),(0,V.jsx)(`div`,{className:`card bg-base-200 w-full max-w-sm`,children:(0,V.jsxs)(`div`,{className:`card-body p-4 gap-2 text-sm text-left`,children:[(0,V.jsxs)(`div`,{className:`flex justify-between gap-4`,children:[(0,V.jsx)(`span`,{className:`text-base-content/60`,children:`Queue title`}),(0,V.jsx)(`span`,{className:`font-semibold text-right break-words`,children:e.queueTitle||`fifony`})]}),(0,V.jsx)(`div`,{className:`divider my-0`}),(0,V.jsxs)(`div`,{className:`flex justify-between`,children:[(0,V.jsx)(`span`,{className:`text-base-content/60`,children:`Pipeline`}),(0,V.jsxs)(`span`,{className:`font-semibold capitalize text-xs font-mono`,children:[e.pipeline?.planner||`?`,` → `,e.pipeline?.executor||`?`,` → `,e.pipeline?.reviewer||`?`]})]}),(0,V.jsx)(`div`,{className:`divider my-0`}),(0,V.jsxs)(`div`,{className:`flex justify-between`,children:[(0,V.jsx)(`span`,{className:`text-base-content/60`,children:`Domains`}),(0,V.jsx)(`span`,{className:`font-semibold`,children:e.domains?.length>0?e.domains.length+` selected`:`none`})]}),(0,V.jsx)(`div`,{className:`divider my-0`}),(0,V.jsxs)(`div`,{className:`flex justify-between`,children:[(0,V.jsx)(`span`,{className:`text-base-content/60`,children:`Agents`}),(0,V.jsxs)(`span`,{className:`font-semibold`,children:[e.agents?.length||0,` to install`]})]}),(0,V.jsx)(`div`,{className:`divider my-0`}),(0,V.jsxs)(`div`,{className:`flex justify-between`,children:[(0,V.jsx)(`span`,{className:`text-base-content/60`,children:`Skills`}),(0,V.jsxs)(`span`,{className:`font-semibold`,children:[e.skills?.length||0,` to install`]})]}),(0,V.jsx)(`div`,{className:`divider my-0`}),(0,V.jsxs)(`div`,{className:`flex justify-between`,children:[(0,V.jsx)(`span`,{className:`text-base-content/60`,children:`Plan`}),(0,V.jsx)(`span`,{className:`font-semibold capitalize`,children:e.efforts.planner})]}),(0,V.jsx)(`div`,{className:`divider my-0`}),(0,V.jsxs)(`div`,{className:`flex justify-between`,children:[(0,V.jsx)(`span`,{className:`text-base-content/60`,children:`Execute`}),(0,V.jsx)(`span`,{className:`font-semibold capitalize`,children:e.efforts.executor})]}),(0,V.jsx)(`div`,{className:`divider my-0`}),(0,V.jsxs)(`div`,{className:`flex justify-between`,children:[(0,V.jsx)(`span`,{className:`text-base-content/60`,children:`Review`}),(0,V.jsx)(`span`,{className:`font-semibold capitalize`,children:e.efforts.reviewer})]}),(0,V.jsx)(`div`,{className:`divider my-0`}),(0,V.jsxs)(`div`,{className:`flex justify-between`,children:[(0,V.jsx)(`span`,{className:`text-base-content/60`,children:`Workers`}),(0,V.jsx)(`span`,{className:`font-semibold`,children:e.concurrency})]}),(0,V.jsx)(`div`,{className:`divider my-0`}),(0,V.jsxs)(`div`,{className:`flex justify-between`,children:[(0,V.jsx)(`span`,{className:`text-base-content/60`,children:`Theme`}),(0,V.jsx)(`span`,{className:`font-semibold capitalize`,children:e.theme})]})]})}),t&&(0,V.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-base-content/50`,children:[(0,V.jsx)(d,{className:`size-4 animate-spin`}),`Saving configuration & installing agents...`]})]})}function Te({onComplete:e}){let t=r(),n=c(),u=o(n.data),[d,p]=(0,B.useState)(0),[m,h]=(0,B.useState)(`forward`),[g,_]=(0,B.useState)(!1),[v,y]=(0,B.useState)(null),b=(0,B.useRef)(!1),x=(0,B.useRef)(!1),[S,T]=(0,B.useState)({enhancer:``,chatter:``,planner:``,executor:``,reviewer:``,services:``}),[D,O]=(0,B.useState)(()=>se(null)),[k,A]=(0,B.useState)(3),[M,N]=(0,B.useState)(`auto`),[F,ee]=(0,B.useState)(``),[I,te]=(0,B.useState)(`missing`),[ne,re]=(0,B.useState)(null),[L,R]=(0,B.useState)(null),[z,ae]=(0,B.useState)([]),[U,le]=(0,B.useState)([]),[W,he]=(0,B.useState)(`local`),[G,K]=(0,B.useState)(``),[q,ge]=(0,B.useState)(``),[J,ve]=(0,B.useState)(!0),[Y,ye]=(0,B.useState)(!0),[X,Se]=(0,B.useState)(!1),Te=E(),Z=P()[d]||``,[Ee,De]=(0,B.useState)(null),[Oe,ke]=(0,B.useState)(!1),[Ae,je]=(0,B.useState)({}),[Q,Me]=(0,B.useState)({enhance:``,chat:``,plan:``,execute:``,review:``,services:``}),[Ne,Pe]=(0,B.useState)(``),[Fe,Ie]=(0,B.useState)(``);(0,B.useEffect)(()=>{i.get(`/state`).then(e=>{R(e||{}),Pe(e?.sourceRepoUrl||e?.config?.sourceRepo||``),Ie(e?.config?.defaultBranch||``)}).catch(()=>{R({})})},[]),(0,B.useEffect)(()=>{if(b.current||n.isLoading)return;b.current=!0;let e=a(u,`runtime.pipeline`,null),t=a(u,`runtime.workflowConfig`,null),r=a(u,`runtime.defaultEffort`,null),i=a(u,`ui.theme`,`auto`),o=a(u,`runtime.workerConcurrency`,3);if(Array.isArray(e)&&e.length>0){let t=Object.fromEntries(e.map(e=>[e.role,e.provider]));T({enhancer:t.enhancer||``,chatter:t.chatter||``,planner:t.planner||``,executor:t.executor||``,reviewer:t.reviewer||``,services:t.services||``})}t&&typeof t==`object`&&Me({enhance:t.enhance?.model||``,chat:t.chat?.model||``,plan:t.plan?.model||``,execute:t.execute?.model||``,review:t.review?.model||``,services:t.services?.model||``}),O(se(r)),typeof i==`string`&&i.trim()&&N(i);let s=Number.parseInt(String(o??2),10);Number.isFinite(s)&&A(Math.min(10,Math.max(1,s)));let c=a(u,`runtime.autoReviewApproval`,!0);typeof c==`boolean`&&ve(c);let l=a(u,`runtime.autoCommitBeforeMerge`,!0);typeof l==`boolean`&&ye(l);let d=a(u,`runtime.autoResolveConflicts`,!1);typeof d==`boolean`&&Se(d);let f=a(u,`runtime.mergeMode`,`local`);(f===`local`||f===`push-pr`)&&he(f);let p=a(u,`runtime.prBaseBranch`,``);typeof p==`string`&&K(p);let m=a(u,`runtime.testCommand`,``);typeof m==`string`&&ge(m)},[u,n.isLoading]),(0,B.useEffect)(()=>{if(x.current||n.isLoading||L===null)return;x.current=!0;let e=f(u,L);ee(e.projectName),te(e.source)},[L,u,n.isLoading]);let Le=(0,B.useCallback)(e=>{ee(e),te(`manual`)},[]),$=w(F),Re=ie($);(0,B.useEffect)(()=>{document.title=ie($||L?.detectedProjectName||L?.projectName||``)},[$,L]),(0,B.useEffect)(()=>{d>=1&&Ee===null&&(ke(!0),Promise.all([i.get(`/providers`),i.get(`/config/workflow?details=1`).catch(()=>null)]).then(([e,t])=>{let n=Array.isArray(e)?e:e?.providers||[];De(n);let r=t?.models||{};je(r);let i=n.filter(e=>e.available!==!1),a=i[0]?.id||i[0]?.name||``,o=i.find(e=>(e.id||e.name)===`claude`),s=a,c=o?`claude`:s,l={enhancer:c,chatter:c,planner:c,executor:s,reviewer:c,services:c};T(e=>({enhancer:e.enhancer||l.enhancer,chatter:e.chatter||l.chatter,planner:e.planner||l.planner,executor:e.executor||l.executor,reviewer:e.reviewer||l.reviewer,services:e.services||l.services})),Me(e=>({enhance:e.enhance||r[c]?.[0]?.id||``,chat:e.chat||r[c]?.[0]?.id||``,plan:e.plan||r[c]?.[0]?.id||``,execute:e.execute||r[s]?.[0]?.id||``,review:e.review||r[c]?.[0]?.id||``,services:e.services||r[c]?.[0]?.id||``}))}).catch(()=>{De([])}).finally(()=>{ke(!1)}))},[d,Ee]),(0,B.useEffect)(()=>{let e=M===`auto`?window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:M;document.documentElement.setAttribute(`data-theme`,e)},[M]);let ze=(0,B.useCallback)(e=>{if(e===`Setup`)$&&H(C,$,`system`).catch(()=>{}),H(`runtime.mergeMode`,W,`runtime`).catch(()=>{}),W===`push-pr`&&G.trim()&&H(`runtime.prBaseBranch`,G.trim(),`runtime`).catch(()=>{}),H(`runtime.autoReviewApproval`,J,`runtime`).catch(()=>{}),H(`runtime.autoCommitBeforeMerge`,Y,`runtime`).catch(()=>{}),H(`runtime.autoResolveConflicts`,X,`runtime`).catch(()=>{}),q.trim()&&H(`runtime.testCommand`,q.trim(),`runtime`).catch(()=>{});else if(e===`Pipeline`){let e=[{provider:S.enhancer,role:`enhancer`},{provider:S.chatter,role:`chatter`},{provider:S.planner,role:`planner`},{provider:S.executor,role:`executor`},{provider:S.reviewer,role:`reviewer`},{provider:S.services,role:`services`}];H(`runtime.agentProvider`,S.executor,`runtime`).catch(()=>{}),H(`runtime.pipeline`,e,`runtime`).catch(()=>{}),H(`runtime.defaultEffort`,D,`runtime`).catch(()=>{}),H(`runtime.workflowConfig`,ce(S,D,Q),`runtime`).catch(()=>{})}else e===`Preferences`&&(H(`ui.theme`,M,`ui`).catch(()=>{}),i.post(`/config/concurrency`,{concurrency:k}).catch(()=>{}))},[S,D,Q,k,M,$,W,G,q,J,Y,X]),Be=(0,B.useCallback)(()=>{d<Te-1&&(ze(Z),h(`forward`),p(e=>e+1))},[d,Te,Z,ze]),Ve=(0,B.useCallback)(()=>{d>0&&(h(`backward`),p(e=>e-1))},[d]),He=(0,B.useCallback)(async()=>{if($){_(!0);try{let n=[H(C,$,`system`),H(`ui.theme`,M,`ui`),H(`ui.onboarding.completed`,!0,`ui`)],r=[{provider:S.enhancer,role:`enhancer`},{provider:S.chatter,role:`chatter`},{provider:S.planner,role:`planner`},{provider:S.executor,role:`executor`},{provider:S.reviewer,role:`reviewer`},{provider:S.services,role:`services`}];n.push(H(`runtime.agentProvider`,S.executor,`runtime`)),n.push(H(`runtime.pipeline`,r,`runtime`)),n.push(H(`runtime.defaultEffort`,D,`runtime`)),n.push(H(`runtime.workflowConfig`,ce(S,D,Q),`runtime`)),n.push(i.post(`/config/concurrency`,{concurrency:k})),n.push(H(`runtime.mergeMode`,W,`runtime`)),n.push(H(`runtime.autoReviewApproval`,J,`runtime`)),n.push(H(`runtime.autoCommitBeforeMerge`,Y,`runtime`)),n.push(H(`runtime.autoResolveConflicts`,X,`runtime`)),W===`push-pr`&&G.trim()&&n.push(H(`runtime.prBaseBranch`,G.trim(),`runtime`)),q.trim()&&n.push(H(`runtime.testCommand`,q.trim(),`runtime`)),z.length>0&&n.push(i.post(`/install/agents`,{agents:z})),U.length>0&&n.push(i.post(`/install/skills`,{skills:U})),await Promise.allSettled(n),t.setQueryData(l,e=>s(e,{id:C,scope:`system`,value:$,source:`user`,updatedAt:new Date().toISOString()})),t.setQueryData(l,e=>s(e,{id:`ui.onboarding.completed`,scope:`ui`,value:!0,source:`user`,updatedAt:new Date().toISOString()})),y({x:window.innerWidth/2,y:window.innerHeight/3}),setTimeout(()=>{e?.(),t.invalidateQueries({queryKey:l})},1200)}catch{t.setQueryData(l,e=>s(e,{id:C,scope:`system`,value:$,source:`user`,updatedAt:new Date().toISOString()})),t.setQueryData(l,e=>s(e,{id:`ui.onboarding.completed`,scope:`ui`,value:!0,source:`user`,updatedAt:new Date().toISOString()})),await H(`ui.onboarding.completed`,!0,`ui`).catch(()=>{}),t.invalidateQueries({queryKey:l}),e?.()}}},[$,S,D,Q,k,M,z,U,W,G,q,J,Y,X,t,e]),Ue=Z===`Welcome`||Z===`Setup`&&ue($,ne)||Z===`Pipeline`&&(S.executor||Oe)||Z===`Agents & Skills`||Z===`Preferences`||Z===`Launch`,We=[],Ge=[],Ke={projectName:$,queueTitle:Re,pipeline:S,efforts:D,concurrency:k,theme:M,agents:z,skills:U};return(0,V.jsxs)(`div`,{className:`fixed inset-0 z-50 bg-base-100 flex flex-col overflow-hidden`,children:[d===0&&(0,V.jsx)(oe,{}),v&&(0,V.jsx)(j,{x:v.x,y:v.y,active:!0,onDone:()=>y(null)}),d>0&&(0,V.jsx)(`div`,{className:`relative z-10 pt-6 pb-2 px-4 flex justify-center`,children:(0,V.jsx)(de,{current:d})}),(0,V.jsx)(`div`,{className:`relative z-10 flex-1 flex flex-col items-center justify-start px-4 py-6 overflow-y-auto`,children:(0,V.jsxs)(fe,{direction:m,stepKey:d,center:Z===`Welcome`||Z===`Setup`||Z===`Pipeline`||Z===`Launch`,children:[Z===`Welcome`&&(0,V.jsx)(me,{workspacePath:Ne,onGetStarted:Be}),Z===`Setup`&&(0,V.jsx)(_e,{projectName:F,setProjectName:Le,detectedProjectName:L?.detectedProjectName||``,projectSource:I,workspacePath:Ne,currentBranch:Fe,onGitStatusChange:re,onBranchCreated:e=>{Ie(e),G||K(e)},mergeMode:W,setMergeMode:he,prBaseBranch:G,setPrBaseBranch:K,autoReviewApproval:J,setAutoReviewApproval:ve,testCommand:q,setTestCommand:ge,autoCommitBeforeMerge:Y,setAutoCommitBeforeMerge:ye,autoResolveConflicts:X,setAutoResolveConflicts:Se}),Z===`Pipeline`&&(0,V.jsx)(be,{providers:Ee||[],providersLoading:Oe,pipeline:S,setPipeline:T,efforts:D,setEfforts:O,models:Q,setModels:Me,modelsByProvider:Ae}),Z===`Agents & Skills`&&(0,V.jsx)(xe,{selectedAgents:z,setSelectedAgents:ae,selectedSkills:U,setSelectedSkills:le,existingAgents:We,existingSkills:Ge}),Z===`Preferences`&&(0,V.jsx)(Ce,{concurrency:k,setConcurrency:A,selectedTheme:M,setSelectedTheme:N}),Z===`Launch`&&(0,V.jsx)(we,{config:Ke,launching:g})]})}),(0,V.jsx)(pe,{step:d,stepCount:Te,stepName:Z,canProceed:Ue,launching:g,onBack:Ve,onNext:Be,onLaunch:He})]})}export{Te as default};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{I as t,h as n,o as r}from"./vendor-X6HTElZW.js";import{s as i,u as a}from"./api-CEr_D4e5.js";import{c as o}from"./hooks-CNPue7d7.js";import{V as s,Y as c,_t as l,at as u,b as d,et as f,ft as p,g as m,lt as h,ot as g,q as _,rt as v,st as y,tt as b,u as x,w as S,y as C,yt as w,z as T}from"./index-Dfn02uW3.js";var E=e(t(),1),D=n();function O({data:e,width:t=80,height:n=24,color:r=`var(--color-accent)`}){if(!e?.length||e.length<2)return null;let i=Math.max(...e,1);return(0,D.jsx)(`svg`,{width:t,height:n,className:`inline-block ml-2 opacity-60`,children:(0,D.jsx)(`polyline`,{fill:`none`,stroke:r,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`,points:e.map((r,a)=>`${a/(e.length-1)*t},${n-r/i*(n-2)-1}`).join(` `)})})}var k={Queued:`badge-info`,Running:`badge-primary`,Reviewing:`badge-secondary`,PendingDecision:`badge-success`,Blocked:`badge-error`,Approved:`badge-success`,Merged:`badge-success`,Cancelled:`badge-neutral`,Planning:`badge-info`},A={Queued:s,Running:u,Reviewing:f,PendingDecision:f,Blocked:d,Approved:y,Merged:_,Cancelled:g};function j(e){return!e||e===0?`0`:e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e)}function M(e){if(!e)return null;let t=e.match(/claude-(\w+)-(\d+)-(\d+)/);return t?`${t[1].charAt(0).toUpperCase()+t[1].slice(1)} ${t[2]}.${t[3]}`:e.length<=16?e:e.slice(0,16)}function N({issueId:e,issueState:t}){let n=t===`Running`||t===`Reviewing`,{liveMode:r}=l(),{log:a,liveInfo:o}=w(e,n,r),[s,c]=(0,E.useState)(!0),u=(0,E.useRef)(null);(0,E.useEffect)(()=>{u.current&&(u.current.scrollTop=u.current.scrollHeight)},[a]);let d=o&&Number.isFinite(Number(o.elapsed))?Number(o.elapsed):o?.startedAt?Math.max(Date.now()-new Date(o.startedAt).getTime(),0):0,f=o?.logSize?(o.logSize/1024).toFixed(1):null;return(0,D.jsxs)(`div`,{className:`mt-2 space-y-1.5`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-3 text-xs opacity-60`,children:[o&&(0,D.jsxs)(D.Fragment,{children:[(0,D.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,D.jsx)(v,{className:`size-3`}),i(d)]}),f&&(0,D.jsxs)(`span`,{children:[`Log: `,f,` KB`]}),o.agentPid&&(0,D.jsxs)(`span`,{children:[`PID `,o.agentPid]}),o.agentAlive===!1&&o.agentPid&&(0,D.jsx)(`span`,{className:`text-error`,children:`dead`})]}),(0,D.jsxs)(`button`,{className:`ml-auto flex items-center gap-0.5 opacity-50 hover:opacity-100 transition-opacity`,onClick:()=>c(e=>!e),title:s?`Collapse output`:`Expand output`,children:[s?(0,D.jsx)(h,{className:`size-3`}):(0,D.jsx)(p,{className:`size-3`}),(0,D.jsx)(`span`,{className:`text-[10px]`,children:s?`hide`:`output`})]})]}),s&&(0,D.jsx)(`pre`,{ref:u,className:`text-[11px] bg-base-300 rounded-box p-3 overflow-x-auto whitespace-pre-wrap max-h-72 overflow-y-auto font-mono opacity-80 leading-relaxed break-all w-full max-w-full`,children:a||(0,D.jsx)(`span`,{className:`opacity-30`,children:`Waiting for output…`})})]})}function P({index:e,issue:t,total:n,workflow:r}){if(!t)return(0,D.jsx)(`div`,{className:`slot-idle rounded-box p-4 flex items-center justify-center opacity-30 transition-opacity duration-300 hover:opacity-40 border-2 border-dashed border-base-300 min-w-0`,children:(0,D.jsxs)(`div`,{className:`flex items-center gap-2 text-sm`,children:[(0,D.jsx)(u,{className:`size-5 animate-pulse-soft`}),`Slot `,e+1,` -- idle`]})});let i=t.state===`Running`,o=t.state===`Planning`,s=t.state===`Reviewing`||t.state===`PendingDecision`?`border-secondary bg-secondary/5`:o?`border-info bg-info/5`:`border-primary bg-primary/5`,c=o?`plan`:t.state===`Reviewing`||t.state===`PendingDecision`?`review`:`execute`,l=r?.[c],d=o?`planner`:t.state===`Reviewing`||t.state===`PendingDecision`?`reviewer`:`executor`,f=t.tokensByPhase?.[d]?.model,p=M(f||l?.model),m=l?.provider,h=t.effort?.[d]||t.effort?.default||l?.effort;return(0,D.jsxs)(`div`,{className:`border-2 rounded-box p-4 space-y-2 animate-fade-in-scale overflow-hidden min-w-0 w-full ${s} ${i?`slot-active`:``}`,children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between min-w-0`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[o?(0,D.jsx)(T,{className:`size-4 animate-spin text-info shrink-0`}):(0,D.jsx)(`span`,{className:`loading loading-spinner loading-sm text-primary shrink-0`}),(0,D.jsx)(`span`,{className:`font-mono text-base font-bold truncate`,children:t.identifier}),(0,D.jsx)(`span`,{className:`badge badge-sm ${k[t.state]||`badge-ghost`} shrink-0`,children:t.state})]}),(0,D.jsxs)(`span`,{className:`text-xs font-mono opacity-50 shrink-0 bg-base-200 px-2 py-0.5 rounded`,children:[`Slot `,e+1,`/`,n]})]}),(0,D.jsx)(`div`,{className:`text-sm font-medium`,children:t.title}),(0,D.jsxs)(`div`,{className:`flex flex-wrap gap-2 text-xs opacity-60`,children:[(0,D.jsxs)(`span`,{children:[`Attempt `,(t.attempts||0)+1,`/`,t.maxAttempts]}),t.startedAt&&(0,D.jsxs)(`span`,{children:[`started `,a(t.startedAt)]})]}),(m||p||h)&&(0,D.jsxs)(`div`,{className:`flex items-center gap-1.5 flex-wrap`,children:[m&&(0,D.jsxs)(`span`,{className:`badge badge-xs badge-ghost font-mono gap-1`,children:[(0,D.jsx)(S,{className:`size-2.5`}),m]}),p&&(0,D.jsx)(`span`,{className:`badge badge-xs badge-ghost font-mono`,children:p}),h&&(0,D.jsx)(`span`,{className:`badge badge-xs badge-outline`,children:h})]}),(0,D.jsx)(N,{issueId:t.id,issueState:t.state})]})}function F({issue:e}){return(0,D.jsxs)(`div`,{className:`flex items-center gap-2 text-xs py-1.5 px-3 rounded-lg bg-base-200`,children:[(0,D.jsx)(A[e.state]||u,{className:`size-3 opacity-40 shrink-0`}),(0,D.jsx)(`span`,{className:`font-mono opacity-60 shrink-0`,children:e.identifier}),(0,D.jsx)(`span`,{className:`truncate flex-1`,children:e.title}),(0,D.jsx)(`span`,{className:`badge badge-xs ${k[e.state]||`badge-ghost`}`,children:e.state}),e.state===`Blocked`&&e.nextRetryAt&&(0,D.jsxs)(`span`,{className:`opacity-40 shrink-0`,children:[`retry `,a(e.nextRetryAt)]})]})}function I({issue:e}){return(0,D.jsxs)(`div`,{className:`flex items-center gap-2 text-xs py-1.5 px-3 rounded-lg bg-base-200`,children:[(0,D.jsx)(e.state===`Merged`?_:e.state===`Approved`?y:g,{className:`size-3 shrink-0 ${e.state===`Approved`||e.state===`Merged`?`text-success`:`text-neutral`}`}),(0,D.jsx)(`span`,{className:`font-mono opacity-60 shrink-0`,children:e.identifier}),(0,D.jsx)(`span`,{className:`truncate flex-1 opacity-70`,children:e.title}),e.durationMs&&(0,D.jsx)(`span`,{className:`opacity-40 shrink-0`,children:i(e.durationMs)}),e.completedAt&&(0,D.jsx)(`span`,{className:`opacity-40 shrink-0`,children:a(e.completedAt)})]})}function L({running:e,queued:t,concurrency:n,totalTokensToday:r,hourlyTokens:i}){return(0,D.jsxs)(`div`,{className:`grid grid-cols-2 sm:grid-cols-4 gap-3 pt-3`,children:[(0,D.jsxs)(`div`,{className:`bg-base-200 rounded-box p-3 flex items-center gap-3`,children:[(0,D.jsx)(`div`,{className:`bg-primary/10 rounded-btn p-2`,children:(0,D.jsx)(C,{className:`size-5 text-primary`})}),(0,D.jsxs)(`div`,{children:[(0,D.jsxs)(`div`,{className:`text-2xl font-bold font-mono`,children:[e.length,(0,D.jsxs)(`span`,{className:`text-sm opacity-50`,children:[`/`,n]})]}),(0,D.jsx)(`div`,{className:`text-xs opacity-50`,children:`Active agents`})]})]}),(0,D.jsxs)(`div`,{className:`bg-base-200 rounded-box p-3 flex items-center gap-3`,children:[(0,D.jsx)(`div`,{className:`bg-info/10 rounded-btn p-2`,children:(0,D.jsx)(s,{className:`size-5 text-info`})}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`div`,{className:`text-2xl font-bold font-mono`,children:t.length}),(0,D.jsx)(`div`,{className:`text-xs opacity-50`,children:`Queued`})]})]}),(0,D.jsxs)(`div`,{className:`bg-base-200 rounded-box p-3 flex items-center gap-3`,children:[(0,D.jsx)(`div`,{className:`bg-accent/10 rounded-btn p-2`,children:(0,D.jsx)(m,{className:`size-5 text-accent`})}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`div`,{className:`text-2xl font-bold font-mono`,children:j(r)}),(0,D.jsxs)(`div`,{className:`text-xs opacity-50 flex items-center gap-1`,children:[`Tokens today`,(0,D.jsx)(O,{data:i})]})]})]}),(0,D.jsxs)(`div`,{className:`bg-base-200 rounded-box p-3 flex items-center gap-3`,children:[(0,D.jsx)(`div`,{className:`bg-secondary/10 rounded-btn p-2`,children:(0,D.jsx)(c,{className:`size-5 text-secondary`})}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`div`,{className:`text-2xl font-bold font-mono`,children:n}),(0,D.jsx)(`div`,{className:`text-xs opacity-50`,children:`Max parallelism`})]})]})]})}function R({state:e,providers:t,parallelism:n,onRefresh:r,issues:i=[]}){let a=Array.isArray(e.issues)?e.issues:[],c=Number(e.config?.workerConcurrency)||3,{data:l}=x(),u=l?.workflow||null,d=a.filter(e=>e.state===`Planning`&&e.planningStatus===`planning`),f=[...a.filter(e=>e.state===`Running`||e.state===`Reviewing`),...d],p=a.filter(e=>e.state===`PendingApproval`||e.state===`Queued`||e.state===`Blocked`&&e.nextRetryAt||e.state===`Planning`&&e.planningStatus!==`planning`),m=a.filter(e=>e.state===`Approved`||e.state===`Merged`||e.state===`Cancelled`).sort((e,t)=>(t.completedAt||``).localeCompare(e.completedAt||``)).slice(0,10),h=(0,E.useMemo)(()=>{let e=new Date().toISOString().slice(0,10),t=0;for(let n of i)n.tokenUsage?.totalTokens&&(n.completedAt||n.updatedAt||``).slice(0,10)===e&&(t+=n.tokenUsage.totalTokens);return t},[i]),{data:g}=o(24),_=(0,E.useMemo)(()=>g?.buckets?g.buckets.map(e=>e.tokens||0):[],[g]),v=[];for(let e=0;e<c;e++)v.push(f[e]||null);return(0,D.jsxs)(`div`,{className:`space-y-5 min-w-0 overflow-hidden flex-1`,children:[(0,D.jsx)(L,{running:f,queued:p,concurrency:c,totalTokensToday:h,hourlyTokens:_}),(0,D.jsxs)(`div`,{className:`space-y-3 min-w-0`,children:[(0,D.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,D.jsxs)(`h3`,{className:`font-semibold text-sm flex items-center gap-1.5`,children:[(0,D.jsx)(b,{className:`size-4 opacity-50`}),`Active Agents`]}),(0,D.jsxs)(`span`,{className:`text-xs opacity-50`,children:[f.length,`/`,c,` slots`]})]}),(0,D.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-3 min-w-0`,children:v.map((e,t)=>(0,D.jsx)(P,{index:t,issue:e,total:c,workflow:u},t))})]}),p.length>0&&(0,D.jsxs)(`div`,{className:`space-y-2`,children:[(0,D.jsxs)(`h3`,{className:`font-semibold text-sm opacity-70 flex items-center gap-1.5`,children:[(0,D.jsx)(s,{className:`size-4 opacity-50`}),`Queue`,(0,D.jsx)(`span`,{className:`badge badge-xs badge-ghost`,children:p.length})]}),(0,D.jsxs)(`div`,{className:`space-y-1 stagger-children`,children:[p.slice(0,12).map(e=>(0,D.jsx)(F,{issue:e},e.id)),p.length>12&&(0,D.jsxs)(`div`,{className:`text-xs opacity-40 pl-3`,children:[`+`,p.length-12,` more`]})]})]}),m.length>0&&(0,D.jsxs)(`div`,{className:`space-y-2`,children:[(0,D.jsxs)(`h3`,{className:`font-semibold text-sm opacity-70 flex items-center gap-1.5`,children:[(0,D.jsx)(y,{className:`size-4 opacity-50`}),`Recently Completed`,(0,D.jsx)(`span`,{className:`badge badge-xs badge-ghost`,children:m.length})]}),(0,D.jsx)(`div`,{className:`space-y-1 stagger-children`,children:m.map(e=>(0,D.jsx)(I,{issue:e},e.id))})]}),f.length===0&&p.length===0&&m.length===0&&(0,D.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-16 animate-fade-in-up`,children:[(0,D.jsx)(`div`,{className:`bg-primary/10 rounded-full p-5 mb-4`,children:(0,D.jsx)(b,{className:`size-10 text-primary opacity-60`})}),(0,D.jsx)(`h3`,{className:`text-base font-semibold mb-1`,children:`No agents running`}),(0,D.jsx)(`p`,{className:`text-sm opacity-50 text-center max-w-xs`,children:`Approve a plan on an issue to start an agent, or create a new issue from the Kanban board.`})]})]})}var z=r(`/agents`)({component:B});function B(){let e=l();return(0,D.jsx)(`div`,{className:`flex-1 flex flex-col min-h-0 px-4 pb-4 overflow-y-auto`,children:(0,D.jsx)(R,{state:e.data,providers:e.providers.data||{},parallelism:e.parallelism.data||{},onRefresh:e.refresh,issues:e.issues})})}export{z as Route};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{I as t,h as n,o as r}from"./vendor-X6HTElZW.js";import{a as i}from"./api-CEr_D4e5.js";import{S as a,l as o,s,w as c,x as l}from"./hooks-CNPue7d7.js";import{t as u}from"./createLucideIcon-B3bah5lk.js";import{C as d,H as f,K as p,g as m,gt as h,it as g,q as _,rt as v,tt as y,x as b}from"./index-Dfn02uW3.js";var x=u(`shield-alert`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`M12 8v4`,key:`1got3b`}],[`path`,{d:`M12 16h.01`,key:`1drbdi`}]]),S=e(t(),1),C=n();function w(e){return!e||e===0?`0`:e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e)}function T(e){return!e||e===0?`0`:e.toLocaleString()}function E({value:e,format:t=w,className:n=``}){let[r,i]=(0,S.useState)(()=>t(e)),a=(0,S.useRef)(e),o=(0,S.useRef)(null);return(0,S.useEffect)(()=>{let n=a.current||0,r=e||0;if(a.current=r,n===r){i(t(r));return}let s=performance.now(),c=e=>{let a=e-s,l=Math.min(a/600,1),u=1-(1-l)**3,d=n+(r-n)*u;i(t(Math.round(d))),l<1&&(o.current=requestAnimationFrame(c))};return cancelAnimationFrame(o.current),o.current=requestAnimationFrame(c),()=>cancelAnimationFrame(o.current)},[e,t]),(0,C.jsx)(`span`,{className:`${n} inline-block tabular-nums`,children:r})}var D=[{key:`planner`,label:`Plan`,color:`bg-info`,textColor:`text-info`},{key:`executor`,label:`Execute`,color:`bg-primary`,textColor:`text-primary`},{key:`reviewer`,label:`Review`,color:`bg-secondary`,textColor:`text-secondary`}];function O({byPhase:e}){if(!e)return null;let t=D.reduce((t,n)=>t+(e[n.key]?.totalTokens||0),0);return t===0?null:(0,C.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,C.jsx)(`div`,{className:`flex h-4 rounded-full overflow-hidden bg-base-300 w-full`,children:D.map(n=>{let r=e[n.key]?.totalTokens||0,i=r/t*100;return i===0?null:(0,C.jsx)(`div`,{className:`${n.color} opacity-80 transition-all duration-500`,style:{width:`${i}%`},title:`${n.label}: ${T(r)} (${Math.round(i)}%)`},n.key)})}),(0,C.jsx)(`div`,{className:`flex items-center gap-3 flex-wrap text-xs`,children:D.map(n=>{let r=e[n.key]?.totalTokens||0,i=t>0?Math.round(r/t*100):0;return r===0?null:(0,C.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,C.jsx)(`span`,{className:`inline-block size-2 rounded-full ${n.color} shrink-0`}),(0,C.jsx)(`span`,{className:`opacity-60`,children:n.label}),(0,C.jsx)(`span`,{className:`font-mono font-semibold`,children:w(r)}),(0,C.jsxs)(`span`,{className:`opacity-40`,children:[`(`,i,`%)`]})]},n.key)})})]})}function k({data:e,valueKey:t,barClass:n,label:r,height:i=64,showXAxis:a=!1,hoveredIdx:o,onHover:s,formatTooltip:c}){if(!e||e.length===0)return null;let l=new Date().toISOString().slice(0,10),u=Math.max(...e.map(e=>e[t]||0),1),d=e.length<=7?1:e.length<=14?2:e.length<=21?3:5,f=o==null?null:e[o],p=o==null?`center`:o<e.length/3?`left`:o>e.length*2/3?`right`:`center`;return(0,C.jsxs)(`div`,{className:`relative`,children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs opacity-50 mb-2`,children:[(0,C.jsx)(`span`,{className:`inline-block w-2.5 h-2.5 rounded-sm ${n}`}),r]}),f&&(0,C.jsx)(`div`,{className:`absolute top-5 z-10 pointer-events-none`,style:{left:p===`right`?void 0:`${(o+.5)/e.length*100}%`,right:p===`right`?`${(e.length-1-o)/e.length*100}%`:void 0,transform:p===`center`?`translateX(-50%) translateY(-100%)`:`translateY(-100%)`},children:(0,C.jsxs)(`div`,{className:`bg-base-300 border border-base-content/10 rounded-lg px-2.5 py-1.5 shadow-lg text-left whitespace-nowrap`,children:[(0,C.jsx)(`div`,{className:`text-[10px] font-semibold opacity-60 mb-0.5`,children:f.date===l?`Today`:new Date(f.date+`T00:00:00`).toLocaleDateString(void 0,{weekday:`short`,month:`short`,day:`numeric`})}),(0,C.jsxs)(`span`,{className:`flex items-center gap-1.5 text-xs`,children:[(0,C.jsx)(`span`,{className:`inline-block w-2 h-2 rounded-sm ${n} shrink-0`}),(0,C.jsx)(`span`,{className:`font-mono font-semibold`,children:c?c(f[t]||0):(f[t]||0).toLocaleString()})]})]})}),(0,C.jsx)(`div`,{className:`flex gap-px`,style:{height:i},children:e.map((e,r)=>{let a=e[t]||0,c=a>0?Math.max(3,Math.round(a/u*i)):0,d=e.date===l,f=o===r;return(0,C.jsxs)(`div`,{className:`flex-1 relative cursor-default`,onMouseEnter:()=>s?.(r),onMouseLeave:()=>s?.(null),children:[c>0&&(0,C.jsx)(`div`,{className:`absolute bottom-0 left-0 right-0 rounded-t-[2px] ${n} transition-opacity duration-100 ${f?`opacity-80`:d?`opacity-90`:`opacity-35`}`,style:{height:c}}),f&&(0,C.jsx)(`div`,{className:`absolute inset-0 bg-base-content/5 rounded-sm`})]},e.date)})}),a&&(0,C.jsx)(`div`,{className:`flex gap-px mt-1.5`,children:e.map((e,t)=>{let n=e.date===l,r=o===t,i=n||t===0||t%d===0,a=e.date?new Date(e.date+`T00:00:00`).toLocaleDateString(void 0,{month:`numeric`,day:`numeric`}):``;return(0,C.jsx)(`div`,{className:`flex-1 overflow-hidden`,children:i&&(0,C.jsx)(`span`,{className:`block text-center text-[9px] truncate transition-opacity duration-100 ${r?`opacity-80`:n?`opacity-60 font-semibold`:`opacity-30`}`,children:n?`today`:a})},e.date)})})]})}function A({daily:e}){let[t,n]=(0,S.useState)(null),r=e||[];return(0,C.jsxs)(`div`,{className:`space-y-4`,children:[(0,C.jsx)(k,{data:r,valueKey:`totalTokens`,barClass:`bg-primary`,label:`Tokens / day`,height:64,showXAxis:!1,hoveredIdx:t,onHover:n,formatTooltip:e=>e.toLocaleString()}),(0,C.jsx)(k,{data:r,valueKey:`events`,barClass:`bg-secondary`,label:`Events / day`,height:36,showXAxis:!0,hoveredIdx:t,onHover:n})]})}function j({byModel:e}){if(!e)return null;let t=Object.entries(e).map(([e,t])=>({model:e,inputTokens:t?.inputTokens||0,outputTokens:t?.outputTokens||0,totalTokens:t?.totalTokens||0})).sort((e,t)=>t.totalTokens-e.totalTokens);if(t.length===0)return null;let n=t.reduce((e,t)=>e+t.totalTokens,0);return(0,C.jsx)(`div`,{className:`overflow-x-auto`,children:(0,C.jsxs)(`table`,{className:`table table-sm`,children:[(0,C.jsx)(`thead`,{children:(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`th`,{children:`Model`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Input`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Output`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Total`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Share`})]})}),(0,C.jsx)(`tbody`,{children:t.map(e=>{let t=n>0?Math.round(e.totalTokens/n*100):0,r=e.model.includes(`claude`)?`bg-primary`:e.model.includes(`codex`)?`bg-secondary`:`bg-accent`;return(0,C.jsxs)(`tr`,{children:[(0,C.jsxs)(`td`,{className:`flex items-center gap-2`,children:[(0,C.jsx)(`span`,{className:`inline-block w-2.5 h-2.5 rounded-full ${r} shrink-0`}),(0,C.jsx)(`span`,{className:`font-mono text-xs`,children:e.model})]}),(0,C.jsx)(`td`,{className:`text-right font-mono text-xs`,children:w(e.inputTokens)}),(0,C.jsx)(`td`,{className:`text-right font-mono text-xs`,children:w(e.outputTokens)}),(0,C.jsx)(`td`,{className:`text-right font-mono text-xs font-semibold`,children:w(e.totalTokens)}),(0,C.jsx)(`td`,{className:`text-right`,children:(0,C.jsxs)(`div`,{className:`flex items-center justify-end gap-1.5`,children:[(0,C.jsx)(`div`,{className:`w-12 h-1.5 bg-base-300 rounded-full overflow-hidden`,children:(0,C.jsx)(`div`,{className:`h-full ${r} rounded-full`,style:{width:`${t}%`}})}),(0,C.jsxs)(`span`,{className:`text-xs opacity-60 w-8 text-right`,children:[t,`%`]})]})})]},e.model)})})]})})}function M({topIssues:e,metric:t=`tokens`}){return!e||e.length===0?null:(0,C.jsx)(`div`,{className:`overflow-x-auto`,children:(0,C.jsxs)(`table`,{className:`table table-sm`,children:[(0,C.jsx)(`thead`,{children:(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`th`,{className:`w-20`,children:`Issue`}),(0,C.jsx)(`th`,{children:`Title`}),(0,C.jsx)(`th`,{className:`text-right`,children:t===`cost`?`Cost`:`Tokens`}),(0,C.jsx)(`th`,{className:`text-right hidden sm:table-cell`,children:t===`cost`?`Tokens`:`Cost`}),(0,C.jsx)(`th`,{className:`hidden sm:table-cell`,children:`Phase Split`})]})}),(0,C.jsx)(`tbody`,{children:e.slice(0,10).map(e=>{let n=e.byPhase,r=e.totalTokens||0;return(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`td`,{className:`font-mono text-xs font-semibold text-primary`,children:e.identifier}),(0,C.jsx)(`td`,{className:`max-w-[200px] truncate text-sm`,title:e.title,children:e.title||`-`}),(0,C.jsx)(`td`,{className:`text-right font-mono text-xs font-semibold`,children:t===`cost`?e.costUsd?`$${e.costUsd.toFixed(3)}`:(0,C.jsx)(`span`,{className:`opacity-30`,children:`—`}):w(r)}),(0,C.jsx)(`td`,{className:`text-right font-mono text-xs hidden sm:table-cell`,children:t===`cost`?w(r):e.costUsd?`$${e.costUsd.toFixed(3)}`:(0,C.jsx)(`span`,{className:`opacity-30`,children:`—`})}),(0,C.jsx)(`td`,{className:`hidden sm:table-cell`,children:n?(0,C.jsx)(`div`,{className:`flex h-1.5 rounded-full overflow-hidden bg-base-300 w-24`,children:D.map(e=>{let t=n[e.key]?.totalTokens||0,i=r>0?t/r*100:0;return i===0?null:(0,C.jsx)(`div`,{className:`${e.color} opacity-80`,style:{width:`${i}%`},title:`${e.label}: ${w(t)}`},e.key)})}):(0,C.jsx)(`span`,{className:`opacity-30 text-xs`,children:`-`})})]},e.id||e.identifier)})})]})})}function N({daily:e}){let t=e||[],[n,r]=(0,S.useState)(null),i=new Date().toISOString().slice(0,10),a=Math.max(...t.map(e=>e.linesAdded||0),1),o=Math.max(...t.map(e=>e.linesRemoved||0),1),s=t.length<=7?1:t.length<=14?2:t.length<=21?3:5,c=n==null?null:t[n],l=n==null?`center`:n<t.length/3?`left`:n>t.length*2/3?`right`:`center`;return(0,C.jsxs)(`div`,{children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-5 mb-3`,children:[(0,C.jsxs)(`span`,{className:`flex items-center gap-1.5 text-xs opacity-50`,children:[(0,C.jsx)(`span`,{className:`inline-block w-2.5 h-2.5 rounded-sm bg-success`}),`Lines added / day`]}),(0,C.jsxs)(`span`,{className:`flex items-center gap-1.5 text-xs opacity-50`,children:[(0,C.jsx)(`span`,{className:`inline-block w-2.5 h-2.5 rounded-sm bg-error`}),`Lines removed / day`]})]}),(0,C.jsxs)(`div`,{className:`relative`,children:[c&&(0,C.jsx)(`div`,{className:`absolute -top-1 z-10 pointer-events-none`,style:{left:l===`right`?void 0:`${(n+.5)/t.length*100}%`,right:l===`right`?`${(t.length-1-n)/t.length*100}%`:void 0,transform:l===`center`?`translateX(-50%) translateY(-100%)`:`translateY(-100%)`},children:(0,C.jsxs)(`div`,{className:`bg-base-300 border border-base-content/10 rounded-lg px-2.5 py-1.5 shadow-lg text-left whitespace-nowrap`,children:[(0,C.jsx)(`div`,{className:`text-[10px] font-semibold opacity-60 mb-1`,children:c.date===i?`Today`:new Date(c.date+`T00:00:00`).toLocaleDateString(void 0,{weekday:`short`,month:`short`,day:`numeric`})}),(0,C.jsxs)(`div`,{className:`flex flex-col gap-0.5`,children:[(0,C.jsxs)(`span`,{className:`flex items-center gap-1.5 text-xs`,children:[(0,C.jsx)(`span`,{className:`inline-block w-2 h-2 rounded-sm bg-success shrink-0`}),(0,C.jsxs)(`span`,{className:`font-mono font-semibold`,children:[`+`,(c.linesAdded||0).toLocaleString()]}),(0,C.jsx)(`span`,{className:`opacity-50`,children:`added`})]}),(0,C.jsxs)(`span`,{className:`flex items-center gap-1.5 text-xs`,children:[(0,C.jsx)(`span`,{className:`inline-block w-2 h-2 rounded-sm bg-error shrink-0`}),(0,C.jsxs)(`span`,{className:`font-mono font-semibold`,children:[`-`,(c.linesRemoved||0).toLocaleString()]}),(0,C.jsx)(`span`,{className:`opacity-50`,children:`removed`})]}),(c.filesChanged||0)>0&&(0,C.jsx)(`span`,{className:`flex items-center gap-1.5 text-xs`,children:(0,C.jsxs)(`span`,{className:`opacity-50`,children:[c.filesChanged,` file`,c.filesChanged===1?``:`s`]})})]})]})}),(0,C.jsx)(`div`,{className:`flex gap-px`,children:t.map((e,t)=>{let s=e.linesAdded||0,c=e.linesRemoved||0,l=s>0?Math.max(3,Math.round(s/a*64)):0,u=c>0?Math.max(3,Math.round(c/o*24)):0,d=e.date===i,f=n===t;return(0,C.jsxs)(`div`,{className:`flex-1 flex flex-col cursor-default`,onMouseEnter:()=>r(t),onMouseLeave:()=>r(null),children:[(0,C.jsxs)(`div`,{className:`relative`,style:{height:64},children:[l>0&&(0,C.jsx)(`div`,{className:`absolute bottom-0 left-0 right-0 rounded-t-[2px] bg-success transition-opacity duration-100 ${f?`opacity-80`:d?`opacity-90`:`opacity-35`}`,style:{height:l}}),f&&(0,C.jsx)(`div`,{className:`absolute inset-0 bg-base-content/5 rounded-sm`})]}),(0,C.jsx)(`div`,{className:`h-px transition-colors duration-100 ${f?`bg-base-content/20`:`bg-base-300`}`}),(0,C.jsxs)(`div`,{className:`relative`,style:{height:24},children:[u>0&&(0,C.jsx)(`div`,{className:`absolute bottom-0 left-0 right-0 rounded-t-[2px] bg-error transition-opacity duration-100 ${f?`opacity-80`:d?`opacity-90`:`opacity-35`}`,style:{height:u}}),f&&(0,C.jsx)(`div`,{className:`absolute inset-0 bg-base-content/5 rounded-sm`})]})]},e.date)})}),(0,C.jsx)(`div`,{className:`flex gap-px mt-1.5`,children:t.map((e,t)=>{let r=e.date===i,a=n===t,o=r||t===0||t%s===0,c=e.date?new Date(e.date+`T00:00:00`).toLocaleDateString(void 0,{month:`numeric`,day:`numeric`}):``;return(0,C.jsx)(`div`,{className:`flex-1 overflow-hidden`,children:o&&(0,C.jsx)(`span`,{className:`block text-center text-[9px] truncate transition-opacity duration-100 ${a?`opacity-80`:r?`opacity-60 font-semibold`:`opacity-30`}`,children:r?`today`:c})},e.date)})})]})]})}function P(e){return e==null||!Number.isFinite(e)?`–`:e<1/24?`${Math.round(e*24*60)}m`:e<1?`${(e*24).toFixed(1)}h`:`${e.toFixed(1)}d`}function F(e){return e==null||!Number.isFinite(e)?`–`:e>=1e3?`${(e/1e3).toFixed(1)}K`:Math.round(e).toString()}function I(e){return e==null||!Number.isFinite(e)?`–`:`${Math.round(e*100)}%`}function L(e){return e==null||!Number.isFinite(e)?`–`:e.toFixed(1)}function R(e){return e==null||!Number.isFinite(e)||e<=0?`–`:`$${e.toFixed(2)}`}function z({icon:e,iconClass:t,title:n,avg:r,median:i,n:a,formatValue:o,unit:s}){return(0,C.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-figure ${t}`,children:(0,C.jsx)(e,{className:`size-6`})}),(0,C.jsx)(`div`,{className:`stat-title`,children:n}),(0,C.jsxs)(`div`,{className:`stat-value text-2xl ${t}`,children:[o(r),s&&(0,C.jsx)(`span`,{className:`text-base font-normal opacity-50 ml-1`,children:s})]}),(0,C.jsxs)(`div`,{className:`stat-desc`,children:[i==null?`–`:`median ${o(i)}`,a!=null&&(0,C.jsxs)(`span`,{className:`opacity-40`,children:[` · n=`,a]})]})]})}function B({icon:e,iconClass:t,title:n,value:r,desc:i}){return(0,C.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-figure ${t}`,children:(0,C.jsx)(e,{className:`size-5`})}),(0,C.jsx)(`div`,{className:`stat-title`,children:n}),(0,C.jsx)(`div`,{className:`stat-value text-2xl ${t}`,children:r}),(0,C.jsx)(`div`,{className:`stat-desc`,children:i})]})}function V({byHarnessMode:e}){let t=Object.entries(e||{}).map(([e,t])=>({mode:e,...t||{}})).filter(e=>(e.reviewedIssues||0)>0).sort((e,t)=>(t.reviewedIssues||0)-(e.reviewedIssues||0));return t.length===0?(0,C.jsx)(`div`,{className:`text-sm opacity-45`,children:`No reviewed issues yet.`}):(0,C.jsx)(`div`,{className:`overflow-x-auto`,children:(0,C.jsxs)(`table`,{className:`table table-sm`,children:[(0,C.jsx)(`thead`,{children:(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`th`,{children:`Harness`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Reviewed`}),(0,C.jsx)(`th`,{className:`text-right`,children:`First Pass`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Rework`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Criteria Fail`})]})}),(0,C.jsx)(`tbody`,{children:t.map(e=>(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`td`,{className:`font-medium capitalize`,children:e.mode}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:e.reviewedIssues||0}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:I(e.firstPassReviewPassRate)}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:I(e.reviewReworkRate)}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:I(e.criteriaFailureRate)})]},e.mode))})]})})}function H({contractNegotiation:e}){let t=Object.entries(e?.byReviewProfile||{}).map(([e,t])=>({profile:e,...t||{}})).filter(e=>(e.negotiatedIssues||0)>0).sort((e,t)=>(t.negotiatedIssues||0)-(e.negotiatedIssues||0));return t.length===0?(0,C.jsx)(`div`,{className:`text-sm opacity-45`,children:`No contractual negotiation history yet.`}):(0,C.jsx)(`div`,{className:`overflow-x-auto`,children:(0,C.jsxs)(`table`,{className:`table table-sm`,children:[(0,C.jsx)(`thead`,{children:(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`th`,{children:`Profile`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Negotiated`}),(0,C.jsx)(`th`,{className:`text-right`,children:`First Pass`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Revisions`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Blocking`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Avg Rounds`})]})}),(0,C.jsx)(`tbody`,{children:t.map(e=>(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`td`,{className:`font-medium`,children:e.profile}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:e.negotiatedIssues||0}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:I(e.firstPassApprovalRate)}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:I(e.revisionRate)}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:I(e.blockingConcernRate)}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:L(e.avgRoundsPerIssue)})]},e.profile))})]})})}function U({checkpointPolicy:e}){let t=Object.entries(e||{}).map(([e,t])=>({policy:e,...t||{}})).filter(e=>(e.reviewedIssues||0)>0).sort((e,t)=>(t.reviewedIssues||0)-(e.reviewedIssues||0));return t.length===0?(0,C.jsx)(`div`,{className:`text-sm opacity-45`,children:`No contractual review history yet.`}):(0,C.jsx)(`div`,{className:`overflow-x-auto`,children:(0,C.jsxs)(`table`,{className:`table table-sm`,children:[(0,C.jsx)(`thead`,{children:(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`th`,{children:`Policy`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Reviewed`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Final Gate`}),(0,C.jsx)(`th`,{className:`text-right`,children:`First Pass`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Rework`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Catch`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Avg CP Runs`})]})}),(0,C.jsx)(`tbody`,{children:t.map(e=>(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`td`,{className:`font-medium`,children:e.policy}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:e.reviewedIssues||0}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:I(e.gatePassRate)}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:I(e.firstPassReviewPassRate)}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:I(e.reviewReworkRate)}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:I(e.checkpointCatchRate)}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:L(e.avgCheckpointRunsPerIssue)})]},e.policy))})]})})}function W({memoryPipeline:e}){let t=Object.entries(e?.byLayer||{}).map(([e,t])=>({layer:e,...t||{}})).filter(e=>(e.hitCount||0)>0).sort((e,t)=>(t.hitCount||0)-(e.hitCount||0));return t.length===0?(0,C.jsx)(`div`,{className:`text-sm opacity-45`,children:`No context assembly reports yet.`}):(0,C.jsx)(`div`,{className:`overflow-x-auto`,children:(0,C.jsxs)(`table`,{className:`table table-sm`,children:[(0,C.jsx)(`thead`,{children:(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`th`,{children:`Layer`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Hits`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Selected`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Discarded`})]})}),(0,C.jsx)(`tbody`,{children:t.map(e=>(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`td`,{className:`font-medium`,children:e.layer}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:e.hitCount||0}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:e.selectedHitCount||0}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:e.discardedHitCount||0})]},e.layer))})]})})}function G({memoryPipeline:e}){let t=Object.entries(e?.byStage||{}).map(([e,t])=>({stage:e,...t||{}})).filter(e=>(e.reports||0)>0).sort((e,t)=>(t.reports||0)-(e.reports||0)||(t.avgDurationMs||0)-(e.avgDurationMs||0));return t.length===0?(0,C.jsx)(`div`,{className:`text-sm opacity-45`,children:`No context pipeline stage telemetry yet.`}):(0,C.jsx)(`div`,{className:`overflow-x-auto`,children:(0,C.jsxs)(`table`,{className:`table table-sm`,children:[(0,C.jsx)(`thead`,{children:(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`th`,{children:`Stage`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Runs`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Completed`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Avg ms`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Avg Out`})]})}),(0,C.jsx)(`tbody`,{children:t.map(e=>(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`td`,{className:`font-medium`,children:e.stage}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:e.reports||0}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:I(e.completionRate)}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:L(e.avgDurationMs)}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:L(e.avgOutputCount)})]},e.stage))})]})})}var K=r(`/analytics`)({component:re});function q({h:e=`h-28`}){return(0,C.jsx)(`div`,{className:`skeleton-card ${e} w-full rounded-box`})}function J(){let{data:e}=c(),{data:t}=s(),n=e?.overall?.totalTokens||0,r=e?.byPhase||null,a=i(e?.daily,32),o=new Date().toISOString().slice(0,10),l=a.find(e=>e.date===o),u=l?.totalTokens||0,d=a.reduce((e,t)=>e+(t.totalTokens||0),0),p=a.reduce((e,t)=>e+(t.events||0),0),g=l?.events||0,y=(()=>{let e=new Map((t?.lines||[]).filter(e=>e.date).map(e=>[e.date,e])),n=[];for(let t=31;t>=0;t--){let r=new Date;r.setDate(r.getDate()-t);let i=r.toISOString().slice(0,10);n.push(e.get(i)??{date:i,linesAdded:0,linesRemoved:0,filesChanged:0})}return n})(),b=y.reduce((e,t)=>e+(t.linesAdded||0),0),x=y.reduce((e,t)=>e+(t.linesRemoved||0),0);return e?(0,C.jsx)(`section`,{children:(0,C.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-7 gap-4`,children:[(0,C.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-figure text-primary`,children:(0,C.jsx)(m,{className:`size-6`})}),(0,C.jsx)(`div`,{className:`stat-title`,children:`Total Tokens`}),(0,C.jsx)(`div`,{className:`stat-value text-2xl`,children:(0,C.jsx)(E,{value:n})}),(0,C.jsx)(`div`,{className:`stat-desc font-mono`,children:T(n)})]}),(0,C.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-figure text-accent`,children:(0,C.jsx)(v,{className:`size-6`})}),(0,C.jsx)(`div`,{className:`stat-title`,children:`Tokens Today`}),(0,C.jsx)(`div`,{className:`stat-value text-2xl`,children:(0,C.jsx)(E,{value:u})}),(0,C.jsxs)(`div`,{className:`stat-desc`,children:[`30d: `,w(d)]})]}),(0,C.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-figure text-secondary`,children:(0,C.jsx)(h,{className:`size-6`})}),(0,C.jsx)(`div`,{className:`stat-title`,children:`Total Events`}),(0,C.jsx)(`div`,{className:`stat-value text-2xl`,children:(0,C.jsx)(E,{value:p,format:e=>String(e||0)})}),(0,C.jsxs)(`div`,{className:`stat-desc`,children:[`Today: `,g]})]}),(0,C.jsxs)(`div`,{className:`stat bg-base-200 rounded-box xl:col-span-2 overflow-hidden`,children:[(0,C.jsx)(`div`,{className:`stat-figure text-info`,children:(0,C.jsx)(f,{className:`size-6`})}),(0,C.jsx)(`div`,{className:`stat-title`,children:`Phase Split`}),(0,C.jsx)(`div`,{className:`stat-value text-2xl p-0`,children:r?(0,C.jsx)(O,{byPhase:r}):(0,C.jsx)(`span`,{className:`opacity-30`,children:`-`})})]}),(0,C.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-figure text-success`,children:(0,C.jsx)(_,{className:`size-6`})}),(0,C.jsx)(`div`,{className:`stat-title`,children:`Lines Added`}),(0,C.jsx)(`div`,{className:`stat-value text-2xl text-success`,children:(0,C.jsx)(E,{value:b,format:e=>e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e||0)})}),(0,C.jsx)(`div`,{className:`stat-desc`,children:`30d total`})]}),(0,C.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-figure text-error`,children:(0,C.jsx)(_,{className:`size-6`})}),(0,C.jsx)(`div`,{className:`stat-title`,children:`Lines Removed`}),(0,C.jsx)(`div`,{className:`stat-value text-2xl text-error`,children:(0,C.jsx)(E,{value:x,format:e=>e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e||0)})}),(0,C.jsx)(`div`,{className:`stat-desc`,children:`30d total`})]})]})}):(0,C.jsx)(q,{h:`h-32`})}function Y(){let{data:e}=c(),{data:t}=s(),n=i(e?.daily,32),r=(()=>{let e=new Map((t?.lines||[]).filter(e=>e.date).map(e=>[e.date,e])),n=[];for(let t=31;t>=0;t--){let r=new Date;r.setDate(r.getDate()-t);let i=r.toISOString().slice(0,10);n.push(e.get(i)??{date:i,linesAdded:0,linesRemoved:0,filesChanged:0})}return n})();return e?(0,C.jsxs)(`section`,{className:`bg-base-200 rounded-box p-5`,children:[(0,C.jsx)(`div`,{className:`flex items-center justify-between mb-4`,children:(0,C.jsxs)(`h2`,{className:`text-sm font-semibold flex items-center gap-2`,children:[(0,C.jsx)(b,{className:`size-4 text-primary`}),`Daily Activity`]})}),(0,C.jsx)(A,{daily:n}),(0,C.jsx)(`div`,{className:`border-t border-base-300 my-5`}),(0,C.jsx)(N,{daily:r})]}):(0,C.jsx)(q,{h:`h-52`})}function X(){let{data:e}=o(),t=e?.ok?e:null;return e?(0,C.jsxs)(`section`,{className:`bg-base-200 rounded-box p-5`,children:[(0,C.jsxs)(`h2`,{className:`text-sm font-semibold flex items-center gap-2 mb-4`,children:[(0,C.jsx)(d,{className:`size-4 text-warning`}),`Engineering KPIs`,t?.sampleSize>0&&(0,C.jsxs)(`span`,{className:`text-xs font-normal opacity-40 ml-1`,children:[`based on `,t.sampleSize,` completed issue`,t.sampleSize===1?``:`s`]})]}),(0,C.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-4 gap-4`,children:[(0,C.jsx)(z,{icon:v,iconClass:`text-primary`,title:`Issue Cycle Time`,avg:t?.issueCycleTimeDays?.avg??null,median:t?.issueCycleTimeDays?.median??null,n:t?.issueCycleTimeDays?.n??null,formatValue:P}),(0,C.jsx)(z,{icon:p,iconClass:`text-secondary`,title:`PR Cycle Time`,avg:t?.prCycleTimeDays?.avg??null,median:t?.prCycleTimeDays?.median??null,n:t?.prCycleTimeDays?.n??null,formatValue:P}),(0,C.jsx)(z,{icon:d,iconClass:`text-warning`,title:`Review Turnaround`,avg:t?.reviewTurnaroundDays?.avg??null,median:t?.reviewTurnaroundDays?.median??null,n:t?.reviewTurnaroundDays?.n??null,formatValue:P}),(0,C.jsx)(z,{icon:_,iconClass:`text-info`,title:`PR Size`,avg:t?.prSizeLines?.avg??null,median:t?.prSizeLines?.median??null,n:t?.prSizeLines?.n??null,formatValue:F,unit:`lines`})]})]}):(0,C.jsx)(q,{h:`h-36`})}var Z={planner:`Plan`,executor:`Execute`,reviewer:`Review`};function Q(){let{data:e}=l(),[t,n]=(0,S.useState)(`executor`),[r,i]=(0,S.useState)(``),[o,s]=(0,S.useState)(`rails`),c=e?.ok&&e.roles||[],u=c.find(e=>e.role===t)||c[0]||null,{data:d,error:p,isLoading:m}=a(r,o);return e?c.length===0?null:(0,C.jsxs)(`section`,{className:`bg-base-200 rounded-box p-5`,children:[(0,C.jsxs)(`div`,{className:`flex items-center justify-between gap-3 mb-4 flex-wrap`,children:[(0,C.jsxs)(`h2`,{className:`text-sm font-semibold flex items-center gap-2`,children:[(0,C.jsx)(f,{className:`size-4 text-accent`}),`Stage Quality`]}),(0,C.jsxs)(`div`,{className:`text-xs opacity-45`,children:[e.issueCount||0,` issue`,(e.issueCount||0)===1?``:`s`,` with per-stage usage`]})]}),(0,C.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-3 gap-4`,children:c.map(e=>{let t=u?.role===e.role,r=e.byProviderModel?.[0];return(0,C.jsxs)(`button`,{type:`button`,onClick:()=>{n(e.role),i(``)},className:`text-left rounded-box border px-4 py-4 transition-colors ${t?`border-accent bg-base-100`:`border-base-300 hover:border-base-content/20`}`,children:[(0,C.jsx)(`div`,{className:`text-xs uppercase tracking-[0.18em] opacity-45 mb-2`,children:Z[e.role]||e.role}),(0,C.jsx)(`div`,{className:`text-2xl font-semibold`,children:w(e.totalTokens)}),(0,C.jsxs)(`div`,{className:`text-sm opacity-65 mt-1`,children:[`avg/issue `,w(Math.round(e.avgTokensPerIssue||0))]}),(0,C.jsxs)(`div`,{className:`text-sm opacity-65`,children:[`success `,I(e.successRate)]}),(0,C.jsx)(`div`,{className:`text-xs opacity-45 mt-2`,children:r?`${r.provider}/${r.model}`:`provider/model unavailable`})]},e.role)})}),u&&(0,C.jsxs)(`div`,{className:`grid grid-cols-1 xl:grid-cols-2 gap-5 mt-5`,children:[(0,C.jsxs)(`div`,{className:`space-y-3`,children:[(0,C.jsx)(`div`,{className:`text-xs uppercase tracking-[0.18em] opacity-45`,children:`Selected stage`}),(0,C.jsxs)(`div`,{className:`grid grid-cols-2 xl:grid-cols-4 gap-3`,children:[(0,C.jsxs)(`div`,{className:`stat bg-base-100 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-title`,children:`Total cost`}),(0,C.jsx)(`div`,{className:`stat-value text-xl`,children:R(u.costUsdSum)}),(0,C.jsxs)(`div`,{className:`stat-desc`,children:[`avg/issue `,R(u.avgCostUsd)]})]}),(0,C.jsxs)(`div`,{className:`stat bg-base-100 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-title`,children:`Outcomes`}),(0,C.jsx)(`div`,{className:`stat-value text-xl`,children:u.issueCount}),(0,C.jsxs)(`div`,{className:`stat-desc`,children:[`A `,u.outcomes.Approved||0,` · M `,u.outcomes.Merged||0,` · B `,u.outcomes.Blocked||0]})]}),(0,C.jsxs)(`div`,{className:`stat bg-base-100 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-title`,children:`Context resets`}),(0,C.jsx)(`div`,{className:`stat-value text-xl`,children:u.rails?.issuesWithContextResets||0}),(0,C.jsxs)(`div`,{className:`stat-desc`,children:[`avg/issue `,(u.rails?.avgContextResets||0).toFixed(1)]})]}),(0,C.jsxs)(`div`,{className:`stat bg-base-100 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-title`,children:`Retry pressure`}),(0,C.jsx)(`div`,{className:`stat-value text-xl`,children:u.rails?.issuesNearRetryBudget||0}),(0,C.jsxs)(`div`,{className:`stat-desc`,children:[`policy changes `,u.rails?.issuesWithPolicyChanges||0]})]})]}),(0,C.jsxs)(`div`,{className:`grid grid-cols-1 gap-3`,children:[(0,C.jsx)(`div`,{className:`overflow-x-auto`,children:(0,C.jsxs)(`table`,{className:`table table-sm`,children:[(0,C.jsx)(`thead`,{children:(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`th`,{children:`Provider / Model`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Issues`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Tokens`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Avg`})]})}),(0,C.jsx)(`tbody`,{children:u.byProviderModel.map(e=>(0,C.jsxs)(`tr`,{children:[(0,C.jsxs)(`td`,{className:`font-medium`,children:[e.provider,` / `,e.model]}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:e.issueCount}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:T(e.totalTokens)}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:w(Math.round(e.avgTokensPerIssue||0))})]},`${e.provider}:${e.model}`))})]})}),(0,C.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-3`,children:[(0,C.jsxs)(`div`,{className:`bg-base-100 rounded-box p-3`,children:[(0,C.jsx)(`div`,{className:`text-xs uppercase tracking-[0.18em] opacity-45 mb-2`,children:`Harness modes`}),(0,C.jsx)(`div`,{className:`space-y-2`,children:(u.rails?.harnessModes||[]).map(e=>(0,C.jsxs)(`div`,{className:`flex items-center justify-between gap-3 text-sm`,children:[(0,C.jsx)(`span`,{className:`font-medium`,children:e.name}),(0,C.jsx)(`span`,{className:`font-mono opacity-70`,children:e.count})]},e.name))})]}),(0,C.jsxs)(`div`,{className:`bg-base-100 rounded-box p-3`,children:[(0,C.jsx)(`div`,{className:`text-xs uppercase tracking-[0.18em] opacity-45 mb-2`,children:`Checkpoint policy`}),(0,C.jsx)(`div`,{className:`space-y-2`,children:(u.rails?.checkpointPolicies||[]).map(e=>(0,C.jsxs)(`div`,{className:`flex items-center justify-between gap-3 text-sm`,children:[(0,C.jsx)(`span`,{className:`font-medium`,children:e.name}),(0,C.jsx)(`span`,{className:`font-mono opacity-70`,children:e.count})]},e.name))}),(0,C.jsxs)(`div`,{className:`text-xs opacity-50 mt-3`,children:[`checkpoint failures `,u.rails?.issuesWithCheckpointFailures||0,` · `,`contract blockers `,u.rails?.issuesWithContractBlockers||0]})]})]})]})]}),(0,C.jsxs)(`div`,{className:`space-y-3`,children:[(0,C.jsx)(`div`,{className:`text-xs uppercase tracking-[0.18em] opacity-45`,children:`Top issues by token usage`}),(0,C.jsx)(`div`,{className:`overflow-x-auto`,children:(0,C.jsxs)(`table`,{className:`table table-sm`,children:[(0,C.jsx)(`thead`,{children:(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`th`,{children:`Issue`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Outcome`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Tokens`})]})}),(0,C.jsx)(`tbody`,{children:u.topIssues.map(e=>(0,C.jsxs)(`tr`,{children:[(0,C.jsxs)(`td`,{children:[(0,C.jsx)(`div`,{className:`font-medium`,children:e.identifier}),(0,C.jsx)(`div`,{className:`text-xs opacity-50 truncate max-w-[20rem]`,children:e.title}),(0,C.jsxs)(`div`,{className:`text-[11px] opacity-45 mt-1`,children:[e.harnessMode,` · `,e.checkpointPolicy,` · resets `,e.contextResetCount,` · `,`retry left `,e.retryBudgetRemaining,`/`,e.retryBudgetMax,` · `,`policy changes `,e.policyDecisionCount]}),e.railsPath&&(0,C.jsx)(`div`,{className:`text-[11px] font-mono opacity-40 truncate max-w-[20rem] mt-1`,children:e.railsPath}),(0,C.jsxs)(`div`,{className:`flex items-center gap-2 mt-2`,children:[(0,C.jsx)(`button`,{type:`button`,className:`btn btn-xs ${r===e.id&&o===`rails`?`btn-accent`:`btn-ghost`}`,onClick:()=>{i(e.id),s(`rails`)},disabled:!e.railsPath,children:`rails`}),(0,C.jsx)(`button`,{type:`button`,className:`btn btn-xs ${r===e.id&&o===`similar`?`btn-accent`:`btn-ghost`}`,onClick:()=>{i(e.id),s(`similar`)},disabled:!e.similarTracesPath,children:`similar`})]})]}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:e.outcome}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:T(e.totalTokens)})]},e.id))})]})}),r&&(0,C.jsxs)(`div`,{className:`bg-base-100 rounded-box p-3`,children:[(0,C.jsxs)(`div`,{className:`flex items-center justify-between gap-3 mb-2 flex-wrap`,children:[(0,C.jsxs)(`div`,{className:`text-xs uppercase tracking-[0.18em] opacity-45`,children:[`Trace detail · `,o]}),(0,C.jsx)(`div`,{className:`text-[11px] font-mono opacity-45`,children:d?.path||``})]}),(0,C.jsx)($,{kind:o,traceDetail:d?.ok===!1?null:d,traceDetailError:d?.ok===!1?{message:d.error||`Artifact unavailable.`}:p,traceDetailLoading:m})]})]})]})]}):(0,C.jsx)(q,{h:`h-56`})}function $({kind:e,traceDetail:t,traceDetailError:n,traceDetailLoading:r}){if(r)return(0,C.jsx)(`div`,{className:`text-sm opacity-50`,children:`Loading trace detail…`});if(n)return(0,C.jsx)(`div`,{className:`text-sm opacity-50`,children:n.message||`Artifact unavailable.`});if(!t?.data)return(0,C.jsx)(`div`,{className:`text-sm opacity-50`,children:`Artifact unavailable.`});let i=t.data;if(e===`rails`){let e=i.harness||{},t=(i.budget||{}).retryBudget||{},n=i.runtimeRails||{},r=Array.isArray(i.policyDecisions)?i.policyDecisions:[];return(0,C.jsxs)(`div`,{className:`space-y-3`,children:[(0,C.jsxs)(`div`,{className:`grid grid-cols-2 xl:grid-cols-4 gap-3`,children:[(0,C.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-title`,children:`Harness mode`}),(0,C.jsx)(`div`,{className:`stat-value text-lg`,children:e.mode||`—`}),(0,C.jsx)(`div`,{className:`stat-desc`,children:e.checkpointPolicy||`—`})]}),(0,C.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-title`,children:`Retry budget`}),(0,C.jsx)(`div`,{className:`stat-value text-lg`,children:t.remaining??0}),(0,C.jsxs)(`div`,{className:`stat-desc`,children:[`remaining of `,t.max??0]})]}),(0,C.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-title`,children:`Context resets`}),(0,C.jsx)(`div`,{className:`stat-value text-lg`,children:n.contextResetCount??0}),(0,C.jsx)(`div`,{className:`stat-desc`,children:n.lastFailedPhase||`no failed phase`})]}),(0,C.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-title`,children:`Policy changes`}),(0,C.jsx)(`div`,{className:`stat-value text-lg`,children:r.length}),(0,C.jsx)(`div`,{className:`stat-desc`,children:e.contractNegotiationStatus||e.checkpointStatus||`no blockers`})]})]}),r.length>0&&(0,C.jsx)(`div`,{className:`overflow-x-auto`,children:(0,C.jsxs)(`table`,{className:`table table-sm`,children:[(0,C.jsx)(`thead`,{children:(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`th`,{children:`Decision`}),(0,C.jsx)(`th`,{children:`Basis`}),(0,C.jsx)(`th`,{children:`Transition`}),(0,C.jsx)(`th`,{children:`Rationale`})]})}),(0,C.jsx)(`tbody`,{children:r.map(e=>(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`td`,{className:`font-medium`,children:e.kind}),(0,C.jsx)(`td`,{className:`font-mono text-xs`,children:e.basis}),(0,C.jsx)(`td`,{className:`font-mono text-xs`,children:e.from?`${e.from} → ${e.to}`:e.to}),(0,C.jsx)(`td`,{className:`text-xs opacity-70`,children:e.rationale})]},e.id))})]})})]})}if(e===`similar`){let e=Array.isArray(i.hits)?i.hits:[],t=i.postAttemptAnalysis||{},n=t.likelyFollowedHit||null;return(0,C.jsxs)(`div`,{className:`space-y-3`,children:[(0,C.jsxs)(`div`,{className:`grid grid-cols-2 xl:grid-cols-4 gap-3`,children:[(0,C.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-title`,children:`Retrieved hits`}),(0,C.jsx)(`div`,{className:`stat-value text-lg`,children:e.length}),(0,C.jsx)(`div`,{className:`stat-desc`,children:`candidate prior failures`})]}),(0,C.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-title`,children:`Likely followed`}),(0,C.jsx)(`div`,{className:`stat-value text-lg`,children:n?.issueIdentifier||`—`}),(0,C.jsx)(`div`,{className:`stat-desc`,children:n?`score ${n.score}`:`no overlap detected`})]}),(0,C.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-title`,children:`Changed files`}),(0,C.jsx)(`div`,{className:`stat-value text-lg`,children:(t.attemptChangedFiles||[]).length}),(0,C.jsx)(`div`,{className:`stat-desc`,children:`in the completed attempt`})]}),(0,C.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,C.jsx)(`div`,{className:`stat-title`,children:`Outcome`}),(0,C.jsx)(`div`,{className:`stat-value text-lg`,children:t.attemptOutcome||`—`}),(0,C.jsx)(`div`,{className:`stat-desc`,children:`post-attempt analysis`})]})]}),n&&(0,C.jsxs)(`div`,{className:`bg-base-200 rounded-box p-3`,children:[(0,C.jsx)(`div`,{className:`text-xs uppercase tracking-[0.18em] opacity-45 mb-2`,children:`Likely followed hit`}),(0,C.jsx)(`div`,{className:`font-medium`,children:n.issueIdentifier}),(0,C.jsx)(`div`,{className:`text-xs opacity-70 mt-1`,children:(n.reasons||[]).join(` · `)}),(0,C.jsxs)(`div`,{className:`text-xs font-mono opacity-50 mt-2`,children:[`overlap `,(n.overlapFiles||[]).join(`, `)||`none`]})]}),e.length>0&&(0,C.jsx)(`div`,{className:`overflow-x-auto`,children:(0,C.jsxs)(`table`,{className:`table table-sm`,children:[(0,C.jsx)(`thead`,{children:(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`th`,{children:`Issue`}),(0,C.jsx)(`th`,{className:`text-right`,children:`Score`}),(0,C.jsx)(`th`,{children:`Reasons`})]})}),(0,C.jsx)(`tbody`,{children:e.map(e=>(0,C.jsxs)(`tr`,{children:[(0,C.jsx)(`td`,{className:`font-medium`,children:e.issueIdentifier}),(0,C.jsx)(`td`,{className:`text-right font-mono`,children:e.score}),(0,C.jsx)(`td`,{className:`text-xs opacity-70`,children:(e.reasons||[]).join(` · `)})]},`${e.issueId}-${e.issueIdentifier}`))})]})})]})}return(0,C.jsx)(`pre`,{className:`text-xs overflow-x-auto whitespace-pre-wrap break-words bg-base-200 rounded-box p-3`,children:JSON.stringify(i,null,2)})}function ee(){let{data:e}=o(),t=(e?.ok?e:null)?.qualityGate||null,n=t?.contractNegotiation||null,r=t?.checkpointPolicy||null,i=t?.memoryPipeline||null;return e?t?(0,C.jsxs)(`section`,{className:`bg-base-200 rounded-box p-5`,children:[(0,C.jsxs)(`h2`,{className:`text-sm font-semibold flex items-center gap-2 mb-4`,children:[(0,C.jsx)(g,{className:`size-4 text-success`}),`Harness Quality`]}),(0,C.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-8 gap-4`,children:[(0,C.jsx)(B,{icon:g,iconClass:`text-success`,title:`Review First Pass`,value:I(t.firstPassReviewPassRate),desc:`${t.completedReviewedIssues||0} completed reviewed issues`}),(0,C.jsx)(B,{icon:x,iconClass:`text-warning`,title:`Review Rework`,value:I(t.reviewReworkRate),desc:`${t.reviewedIssues||0} reviewed issues`}),(0,C.jsx)(B,{icon:f,iconClass:`text-info`,title:`Contract First Pass`,value:I(n?.firstPassApprovalRate),desc:`${n?.negotiatedIssues||0} negotiated issues`}),(0,C.jsx)(B,{icon:h,iconClass:`text-error`,title:`Blocking Concerns`,value:I(n?.blockingConcernRate),desc:n?.negotiatedIssues?`${L(n?.avgRoundsPerIssue)} avg rounds / issue`:`No negotiation history yet`}),(0,C.jsx)(B,{icon:f,iconClass:`text-info`,title:`Checkpoint Catch`,value:I(r?.checkpointed?.checkpointCatchRate),desc:r?.checkpointed?.reviewedIssues?`${r.checkpointed.reviewedIssues} checkpointed contractual issue${r.checkpointed.reviewedIssues===1?``:`s`}`:`No checkpointed contractual history yet`}),(0,C.jsx)(B,{icon:y,iconClass:`text-primary`,title:`Memory Coverage`,value:I(i?.memoryFlushCoverageRate),desc:i?.issuesWithMemoryFlushes?`${i.issuesWithMemoryFlushes} issue workspaces flushed`:`No workspace memory flushes yet`}),(0,C.jsx)(B,{icon:h,iconClass:`text-secondary`,title:`Context Coverage`,value:I(i?.contextReportCoverageRate),desc:i?.issuesWithContextReports?`${i.issuesWithContextReports} issue(s) emitted context reports`:`No context assembly reports yet`}),(0,C.jsx)(B,{icon:f,iconClass:`text-accent`,title:`Compaction Coverage`,value:I(i?.compactionCoverageRate),desc:i?.issuesWithCompaction?`${i.issuesWithCompaction} issue(s) compacted by budget`:`No budget compaction yet`})]}),(0,C.jsxs)(`div`,{className:`grid grid-cols-1 xl:grid-cols-3 gap-5 mt-5`,children:[(0,C.jsxs)(`div`,{className:`space-y-3`,children:[(0,C.jsx)(`div`,{className:`text-xs uppercase tracking-[0.18em] opacity-45`,children:`Review by harness mode`}),(0,C.jsx)(V,{byHarnessMode:t.byHarnessMode})]}),(0,C.jsxs)(`div`,{className:`space-y-3`,children:[(0,C.jsx)(`div`,{className:`text-xs uppercase tracking-[0.18em] opacity-45`,children:`Contract negotiation by review profile`}),(0,C.jsx)(H,{contractNegotiation:n})]}),(0,C.jsxs)(`div`,{className:`space-y-3`,children:[(0,C.jsx)(`div`,{className:`text-xs uppercase tracking-[0.18em] opacity-45`,children:`Checkpoint policy lift`}),(0,C.jsx)(U,{checkpointPolicy:r})]})]}),(0,C.jsxs)(`div`,{className:`grid grid-cols-1 xl:grid-cols-2 gap-5 mt-5`,children:[(0,C.jsxs)(`div`,{className:`space-y-3`,children:[(0,C.jsx)(`div`,{className:`text-xs uppercase tracking-[0.18em] opacity-45`,children:`Context layer hit mix`}),(0,C.jsx)(W,{memoryPipeline:i})]}),(0,C.jsxs)(`div`,{className:`space-y-3`,children:[(0,C.jsx)(`div`,{className:`text-xs uppercase tracking-[0.18em] opacity-45`,children:`Context pipeline stages`}),(0,C.jsx)(G,{memoryPipeline:i})]})]})]}):null:(0,C.jsx)(q,{h:`h-72`})}function te(){let{data:e}=c(),t=e?.topIssues||[],n=[...t].filter(e=>typeof e.costUsd==`number`&&e.costUsd>0).sort((e,t)=>(t.costUsd||0)-(e.costUsd||0));return e?t.length===0?null:(0,C.jsxs)(`section`,{className:`bg-base-200 rounded-box p-5`,children:[(0,C.jsxs)(`h2`,{className:`text-sm font-semibold flex items-center gap-2 mb-4`,children:[(0,C.jsx)(m,{className:`size-4 text-accent`}),`Top Issues by Usage`]}),(0,C.jsxs)(`div`,{className:`grid gap-5 ${n.length>0?`xl:grid-cols-2`:``}`,children:[(0,C.jsxs)(`div`,{className:`space-y-3`,children:[(0,C.jsx)(`div`,{className:`text-xs uppercase tracking-[0.18em] opacity-45`,children:`By tokens`}),(0,C.jsx)(M,{topIssues:t,metric:`tokens`})]}),n.length>0&&(0,C.jsxs)(`div`,{className:`space-y-3`,children:[(0,C.jsx)(`div`,{className:`text-xs uppercase tracking-[0.18em] opacity-45`,children:`By cost`}),(0,C.jsx)(M,{topIssues:n,metric:`cost`})]})]})]}):(0,C.jsx)(q,{h:`h-40`})}function ne(){let{data:e}=c(),t=e?.byModel||{};return e?Object.keys(t).length===0?null:(0,C.jsxs)(`section`,{className:`bg-base-200 rounded-box p-5`,children:[(0,C.jsxs)(`h2`,{className:`text-sm font-semibold flex items-center gap-2 mb-4`,children:[(0,C.jsx)(y,{className:`size-4 text-info`}),`Model Breakdown`]}),(0,C.jsx)(j,{byModel:t})]}):(0,C.jsx)(q,{h:`h-40`})}function re(){return(0,C.jsx)(`div`,{className:`flex-1 flex flex-col min-h-0 px-4 pb-4 pt-3 overflow-y-auto`,children:(0,C.jsxs)(`div`,{className:`max-w-6xl w-full mx-auto space-y-6`,children:[(0,C.jsx)(J,{}),(0,C.jsx)(Y,{}),(0,C.jsx)(X,{}),(0,C.jsx)(Q,{}),(0,C.jsx)(ee,{}),(0,C.jsx)(te,{}),(0,C.jsx)(ne,{})]})})}export{K as Route};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{R as t}from"./vendor-uqBx3VSC.js";var n=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),r=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),i=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),a=e=>{let t=i(e);return t.charAt(0).toUpperCase()+t.slice(1)},o={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`},s=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0;return!1},c=e(t()),l=(0,c.createContext)({}),u=()=>(0,c.useContext)(l),d=(0,c.forwardRef)(({color:e,size:t,strokeWidth:r,absoluteStrokeWidth:i,className:a=``,children:l,iconNode:d,...f},p)=>{let{size:m=24,strokeWidth:h=2,absoluteStrokeWidth:g=!1,color:_=`currentColor`,className:v=``}=u()??{},y=i??g?Number(r??h)*24/Number(t??m):r??h;return(0,c.createElement)(`svg`,{ref:p,...o,width:t??m??o.width,height:t??m??o.height,stroke:e??_,strokeWidth:y,className:n(`lucide`,v,a),...!l&&!s(f)&&{"aria-hidden":`true`},...f},[...d.map(([e,t])=>(0,c.createElement)(e,t)),...Array.isArray(l)?l:[l]])}),f=(e,t)=>{let i=(0,c.forwardRef)(({className:i,...o},s)=>(0,c.createElement)(d,{ref:s,iconNode:t,className:n(`lucide-${r(a(e))}`,`lucide-${e}`,i),...o}));return i.displayName=a(e),i};export{f as t};
1
+ import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{I as t}from"./vendor-X6HTElZW.js";var n=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),r=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),i=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),a=e=>{let t=i(e);return t.charAt(0).toUpperCase()+t.slice(1)},o={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`},s=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0;return!1},c=e(t()),l=(0,c.createContext)({}),u=()=>(0,c.useContext)(l),d=(0,c.forwardRef)(({color:e,size:t,strokeWidth:r,absoluteStrokeWidth:i,className:a=``,children:l,iconNode:d,...f},p)=>{let{size:m=24,strokeWidth:h=2,absoluteStrokeWidth:g=!1,color:_=`currentColor`,className:v=``}=u()??{},y=i??g?Number(r??h)*24/Number(t??m):r??h;return(0,c.createElement)(`svg`,{ref:p,...o,width:t??m??o.width,height:t??m??o.height,stroke:e??_,strokeWidth:y,className:n(`lucide`,v,a),...!l&&!s(f)&&{"aria-hidden":`true`},...f},[...d.map(([e,t])=>(0,c.createElement)(e,t)),...Array.isArray(l)?l:[l]])}),f=(e,t)=>{let i=(0,c.forwardRef)(({className:i,...o},s)=>(0,c.createElement)(d,{ref:s,iconNode:t,className:n(`lucide-${r(a(e))}`,`lucide-${e}`,i),...o}));return i.displayName=a(e),i};export{f as t};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{I as t,f as n,m as r}from"./vendor-X6HTElZW.js";import{l as i,t as a}from"./api-CEr_D4e5.js";function o(e){return Array.isArray(e?.settings)?e.settings:Array.isArray(e?.data)?e.data:Array.isArray(e)?e:[]}function s(e,t,n){return(Array.isArray(e)?e.find(e=>e?.id===t):null)?.value??n}function c(e,t){let n=e&&typeof e==`object`?e:{},r=[...o(n).filter(e=>e?.id!==t.id),t];return Array.isArray(n?.settings)?{...n,settings:r}:{...n,success:n?.success??!0,data:r}}var l=Object.freeze({CONNECTED:`connected`,STATE_UPDATE:`state:update`,STATE_DELTA:`state:delta`,ANALYTICS_UPDATE:`analytics:update`,SERVICE_LOG:`service:log`,SERVICE_STATE:`service`,ISSUE_LOG:`issue:log`,ISSUE_PROGRESS:`issue:progress`,ISSUE_SUBTASKS:`issue:subtasks`,ISSUE_TRANSITION:`issue:transition`,MESH_ENTRY:`mesh:entry`,MESH_EVENT:`mesh:event`,MESH_SNAPSHOT:`mesh:snapshot`,SERVICES_SNAPSHOT:`services:snapshot`,REVERSE_PROXY_SNAPSHOT:`proxy:reverse:snapshot`,AGENT_FSM:`agent-fsm`,VARIABLES:`variables`,BOOT_SCAN_SKIPPED:`boot:scan:skipped`,PING:`ping`,PONG:`pong`}),u=Object.freeze({PING:`ping`,PONG:`pong`,SERVICE_LOG_SUBSCRIBE:`service:log:subscribe`,SERVICE_LOG_UNSUBSCRIBE:`service:log:unsubscribe`,SERVICES_SUBSCRIBE:`services:subscribe`,SERVICES_UNSUBSCRIBE:`services:unsubscribe`,ISSUE_LOG_SUBSCRIBE:`issue:log:subscribe`,ISSUE_LOG_UNSUBSCRIBE:`issue:log:unsubscribe`,ANALYTICS_SUBSCRIBE:`analytics:subscribe`,ANALYTICS_UNSUBSCRIBE:`analytics:unsubscribe`,MESH_SUBSCRIBE:`mesh:subscribe`,MESH_UNSUBSCRIBE:`mesh:unsubscribe`,REVERSE_PROXY_SUBSCRIBE:`proxy:reverse:subscribe`,REVERSE_PROXY_UNSUBSCRIBE:`proxy:reverse:unsubscribe`});Object.freeze([`analytics:tokens`,`analytics:lines`,`analytics:kpis`,`analytics:hourly`]);var d=Object.freeze({"analytics:tokens":[`token-analytics`],"analytics:lines":[`analytics-lines`],"analytics:kpis":[`analytics-kpis`],"analytics:hourly":[`hourly-analytics`]}),f=new Set([l.CONNECTED,l.STATE_UPDATE,l.STATE_DELTA]);function p(e){return d[e]}function m(e){return f.has(e?.type)}function ee(e){if(!e)return null;let t=typeof e==`string`?i(e):e;return!t||typeof t!=`object`?null:t}function h(e,t=null){return!e||typeof e!=`string`?null:t?{type:e,...t}:{type:e}}function g(e){return h(u.ANALYTICS_SUBSCRIBE,{topic:e})}function te(e){return h(u.ANALYTICS_UNSUBSCRIBE,{topic:e})}function _(){return h(u.MESH_SUBSCRIBE)}function ne(){return h(u.MESH_UNSUBSCRIBE)}function re(){return h(u.REVERSE_PROXY_SUBSCRIBE)}function v(e){return h(u.SERVICE_LOG_SUBSCRIBE,{id:e})}function ie(e){return h(u.SERVICE_LOG_UNSUBSCRIBE,{id:e})}function y(){return h(u.SERVICES_SUBSCRIBE)}function ae(){return h(u.SERVICES_UNSUBSCRIBE)}function b(e){return h(u.ISSUE_LOG_SUBSCRIBE,{id:e})}function oe(e){return h(u.ISSUE_LOG_UNSUBSCRIBE,{id:e})}var x={DISCONNECTED:`disconnected`,CONNECTING:`connecting`,CONNECTED:`connected`,ERROR:`error`},se=`*`,ce=3e4,S=2e3,le=25e3,ue=100,C=null,w=x.DISCONNECTED,T=null,E=null,D=S,O=!1,k=0,A=0,j=new Map,de=new Map,fe=new Map,pe=[],me=[],he=[],M=new Set,N=new Map,P=new Set,F=new Set,I=new Map,L=0,R=0,ge=0,z={startedAt:Date.now(),connectAttempts:0,reconnects:0,successfulConnections:0,disconnects:0,connectionErrors:0,parseErrors:0,reconnectWaitMs:S,lastConnectedAt:null,lastDisconnectedAt:null,lastMessageAt:null,lastSentAt:null,status:x.DISCONNECTED,activeConsumers:0,activeSocket:!1,totalSent:0,totalReceived:0,pingsSent:0,pongsReceived:0,lastPingRttMs:null,messageCounts:{},outboundMessageCounts:{},connectEvents:[],inboundEvents:[],outboundEvents:[]};function B(){return Date.now()}function V(e,t,n=ue){e.push(t),e.length>n&&e.shift()}function H(e,t={}){let n={at:B(),...t};e===`inbound`?V(me,n):e===`outbound`?V(he,n):e===`connect`&&V(pe,n)}function _e(e){return typeof e==`string`&&e.length>0?e:`__unknown__`}function ve(e,t){e.set(t,(e.get(t)??0)+1)}function U(e){if(w!==e){w=e,z.status=e;for(let e of[...M])try{e(w)}catch{}}}function ye(e,t){let n=N.get(e);return n||(n=new Set,N.set(e,n)),n.add(t),()=>n.delete(t)}function be(e){let t=_e(e?.type);z.totalReceived+=1,z.lastMessageAt=B(),ve(de,t),H(`inbound`,{type:t,status:w});let n=N.get(se)??new Set;for(let t of[...n])try{t(e)}catch{}let r=N.get(e?.type);if(r)for(let t of[...r])try{t(e)}catch{}}function W(e){if(!C||C.readyState!==WebSocket.OPEN)return;let t=_e(e?.type);if(z.totalSent+=1,z.lastSentAt=B(),ve(fe,t),t===u.PING&&typeof e?.seq==`number`){let t=typeof e?.ts==`number`?e.ts:B();j.set(e.seq,t)}return H(`outbound`,{type:t,consumerCount:k,socketReadyState:C.readyState}),C.send(JSON.stringify(e)),!0}function G(e){try{return W(e)}catch(e){throw z.connectionErrors+=1,e}}function xe(){A+=1;let e={type:u.PING,seq:A,ts:B()};j.set(A,e.ts),z.pingsSent+=1,G(e)}function Se(){for(let e of P)W(v(e));for(let e of F)W(b(e));for(let[e,t]of I)t>0&&W(g(e));R>0&&W(y()),L>0&&W(_()),ge>0&&W(re())}function Ce(){if(C||!O||k<=0)return;let e=`${location.protocol===`https:`?`wss`:`ws`}://${location.host}/ws`;try{z.connectAttempts+=1,H(`connect`,{type:`attempt`,url:e,consumerCount:k}),C=new WebSocket(e)}catch{U(x.ERROR),z.connectionErrors+=1,we();return}U(x.CONNECTING),C.onopen=()=>{U(x.CONNECTED),z.successfulConnections+=1,z.lastConnectedAt=B(),z.lastConnectedAt,H(`connect`,{type:`open`,status:w}),D=S,z.reconnectWaitMs=S,Se(),clearInterval(E),E=setInterval(xe,le)},C.onmessage=e=>{let t=ee(e.data);if(!t){z.parseErrors+=1,H(`inbound`,{type:`parse_error`,status:w});return}if(t.type===l.PONG&&typeof t.seq==`number`){let e=j.get(t.seq);typeof e==`number`&&(z.pongsReceived+=1,z.lastPingRttMs=Math.max(0,B()-e),j.delete(t.seq))}be(t)},C.onclose=()=>{U(x.DISCONNECTED),z.disconnects+=1,z.lastDisconnectedAt=B(),C=null,clearInterval(E),E=null,j.clear(),O&&k>0?(z.reconnects+=1,we()):(D=S,z.reconnectWaitMs=S)},C.onerror=()=>{U(x.ERROR),z.connectionErrors+=1}}function we(){if(!O||k<=0)return;clearTimeout(T);let e=D;z.reconnectWaitMs=e,H(`connect`,{type:`reconnect_scheduled`,delay:e}),T=setTimeout(()=>{D=Math.min(D*2,ce),z.reconnectWaitMs=D,Ce()},e)}function Te(){if(clearTimeout(T),T=null,clearInterval(E),E=null,!C){D=S,z.reconnectWaitMs=S;return}C.onopen=null,C.onmessage=null,C.onclose=null,C.onerror=null,C.close(),C=null,D=S,z.reconnectWaitMs=S}function Ee(e){return M.add(e),e(w),()=>M.delete(e)}function De(e,t){return ye(e,t)}function Oe(){return k+=1,O=!0,Ce(),()=>{k=Math.max(k-1,0),k===0&&(O=!1,Te(),U(x.DISCONNECTED))}}function ke(e){!e||typeof e!=`string`||(P.add(e),G(v(e)))}function Ae(e){!e||typeof e!=`string`||(P.delete(e),G(ie(e)))}function je(e){!e||typeof e!=`string`||(F.add(e),G(b(e)))}function Me(e){!e||typeof e!=`string`||(F.delete(e),G(oe(e)))}function Ne(){L+=1,L===1&&G(_())}function Pe(){L=Math.max(L-1,0),L===0&&G(ne())}function Fe(){R+=1,R===1&&G(y())}function Ie(){R=Math.max(R-1,0),R===0&&G(ae())}function K(e){if(!e||typeof e!=`string`)return;let t=(I.get(e)??0)+1;I.set(e,t),t===1&&G(g(e))}function q(e){if(!e||typeof e!=`string`)return;let t=I.get(e)??0,n=Math.max(t-1,0);I.set(e,n),n===0&&G(te(e))}var J=e(t(),1);function Le(e,t=[],n=[]){let r=new Map(e.map(e=>[e.id,e]));for(let e of n)r.delete(e);for(let e of t)e?.id&&r.set(e.id,e);return[...r.values()]}function Re(e,t){let n=e&&typeof e==`object`?{...e}:{},r={...n,...t};return Array.isArray(t.issues)?r.issues=t.issues:Array.isArray(t.issuesDelta)&&(r.issues=Le(Array.isArray(n.issues)?n.issues:[],t.issuesDelta,t.issuesRemoved||[])),Array.isArray(t.events)&&(r.events=t.events),r}var ze=[`(display-mode: fullscreen)`,`(display-mode: standalone)`,`(display-mode: minimal-ui)`,`(display-mode: window-controls-overlay)`];function Y(){if(typeof window>`u`)return`browser`;if(document.referrer.startsWith(`android-app://`))return`twa`;if(window.navigator.standalone===!0)return`standalone`;let e=ze.find(e=>window.matchMedia(e).matches);return e?e.slice(15,-1):`browser`}function Be(){return typeof window>`u`?!1:Y()!==`browser`}async function Ve(e){if(!(`serviceWorker`in navigator))return null;let t=await navigator.serviceWorker.getRegistration();return t?.active?new Promise(n=>{let r=new MessageChannel,i=window.setTimeout(()=>n(null),1500);r.port1.onmessage=e=>{window.clearTimeout(i),n(e.data??null)},t.active.postMessage(e,[r.port2])}):null}function He(e){let[t,n]=(0,J.useState)(`disconnected`),i=r();return(0,J.useEffect)(()=>{let t=Ee(n),r=De(`*`,t=>{if(t?.type===l.ANALYTICS_UPDATE&&t?.topic&&t?.data){let e=p(t.topic);e&&i.setQueriesData({queryKey:e},t.data);return}let n=m(t);(n||t?.type===l.ISSUE_TRANSITION)&&i.cancelQueries({queryKey:[`runtime-state`]}),n&&i.setQueriesData({queryKey:[`runtime-state`]},e=>Re(e||{},t)),e&&e(t)}),a=Oe();return()=>{a(),t(),r()}},[i,e]),t}function Ue({pollInterval:e=3e3,showAll:t=!1}={}){return n({queryKey:[`runtime-state`,t],queryFn:()=>a.get(t?`/state?all=1`:`/state`),refetchInterval:e,refetchOnWindowFocus:!0})}function We({pollInterval:e=1e4}={}){return n({queryKey:[`runtime-status`],queryFn:()=>a.get(`/runtime/status`),refetchInterval:e})}function Ge({pollInterval:e=1e4}={}){return n({queryKey:[`runtime-probe`],queryFn:()=>a.get(`/runtime/probe`),refetchInterval:e})}function Ke({pollInterval:e=15e3}={}){return n({queryKey:[`runtime-doctor`],queryFn:()=>a.get(`/runtime/doctor`),refetchInterval:e})}function qe(e,t,r=2500){let i=new URLSearchParams;return e&&e!==`all`&&i.set(`kind`,e),t&&t!==`all`&&i.set(`issueId`,t),n({queryKey:[`runtime-events`,e,t],queryFn:()=>a.get(`/events/feed${i.size?`?${i}`:``}`),refetchInterval:r})}function Je({pollInterval:e=15e3}={}){return n({queryKey:[`providers`],queryFn:()=>a.get(`/providers`),refetchInterval:e})}function Ye({pollInterval:e=15e3}={}){return n({queryKey:[`parallelism`],queryFn:()=>a.get(`/parallelism`),refetchInterval:e})}var Xe=[`claude`,`codex`,`gemini`];function Ze(e){if(!e||typeof e!=`object`||!Array.isArray(e.providers))return null;let t=typeof e.collectedAt==`string`?e.collectedAt:null;return{providers:e.providers,collectedAt:t}}function Qe(){return n({queryKey:[`providers-usage`],queryFn:async()=>{let e=await Promise.allSettled(Xe.map(e=>a.get(`/providers/${e}/usage`))),t=[],n=[];for(let r of e){if(r.status!==`fulfilled`)continue;let e=Ze(r.value);e&&(t.push(...e.providers),e.collectedAt&&n.push(e.collectedAt))}if(t.length>0){let e=n.map(e=>new Date(e).getTime()).filter(e=>Number.isFinite(e)).reduce((e,t)=>Math.max(e,t),0);return{providers:t,collectedAt:e?new Date(e).toISOString():new Date().toISOString()}}try{let e=Ze(await a.get(`/providers/usage`));e&&(t=e.providers,e.collectedAt&&n.push(e.collectedAt))}catch{}let r=n.map(e=>new Date(e).getTime()).filter(e=>Number.isFinite(e)).reduce((e,t)=>Math.max(e,t),0);return{providers:t,collectedAt:r?new Date(r).toISOString():new Date().toISOString()}},refetchInterval:3e4})}var $e=[`auto`,`light`,`dark`],et=`cupcake.bumblebee.emerald.corporate.synthwave.retro.cyberpunk.valentine.halloween.garden.forest.aqua.lofi.pastel.fantasy.wireframe.black.luxury.dracula.cmyk.autumn.business.acid.lemonade.night.coffee.winter.dim.nord.sunset.caramellatte.abyss.silk`.split(`.`),tt=[...$e,...et],X=[`settings`],Z=`ui.theme`,nt=`ui.notifications.enabled`,rt=`ui.issues.stateFilter`,it=`ui.issues.completionFilter`,at=`ui.events.kind`,ot=`ui.events.issueId`,Q=window.matchMedia(`(prefers-color-scheme: dark)`);function st(e){return e===`auto`?Q.matches?`dark`:`light`:e}function ct(e){return tt.includes(e)?e:`auto`}function lt(e,t=!1){return typeof e==`boolean`?e:t}async function ut(e,t){return a.post(`/settings/${encodeURIComponent(e)}`,{scope:`ui`,value:t,source:`user`})}function $(){return n({queryKey:X,queryFn:()=>a.get(`/settings`),staleTime:3e4})}function dt(e,t,n={}){let i=r(),l=$(),u=typeof n.normalize==`function`?n.normalize:e=>e,d=u(s(o(l.data),e,t)),[f,p]=(0,J.useState)(d),m=(0,J.useCallback)(t=>{let n=u(t);p(n);let r={id:e,scope:`ui`,value:n,source:`user`,updatedAt:new Date().toISOString()};i.cancelQueries({queryKey:X}),i.setQueryData(X,e=>c(e,r)),a.post(`/settings/${encodeURIComponent(e)}`,{scope:`ui`,value:n,source:`user`}).then(e=>{e?.setting&&i.setQueryData(X,t=>c(t,e.setting))}).catch(()=>{i.invalidateQueries({queryKey:X})})},[u,i,e]);return(0,J.useEffect)(()=>{p(e=>Object.is(e,d)?e:d)},[d]),[f,m]}function ft(){let e=r(),t=ct(s(o($().data),Z,`auto`)),[n,i]=(0,J.useState)(t),l=(0,J.useCallback)(t=>{let n=ct(t);i(n);let r={id:Z,scope:`ui`,value:n,source:`user`,updatedAt:new Date().toISOString()};e.cancelQueries({queryKey:X}),e.setQueryData(X,e=>c(e,r)),a.post(`/settings/${encodeURIComponent(Z)}`,{scope:`ui`,value:n,source:`user`}).then(t=>{t?.setting&&e.setQueryData(X,e=>c(e,t.setting))}).catch(()=>{e.invalidateQueries({queryKey:X})})},[e]);return(0,J.useEffect)(()=>{i(e=>e===t?e:t)},[t]),(0,J.useEffect)(()=>{let e=()=>{let e=document.documentElement;return e.classList.add(`theme-transitioning`),e.setAttribute(`data-theme`,st(n)),setTimeout(()=>e.classList.remove(`theme-transitioning`),350)},t=e();if(n===`auto`){let n=()=>e();return Q.addEventListener(`change`,n),()=>{clearTimeout(t),Q.removeEventListener(`change`,n)}}return()=>clearTimeout(t)},[n]),[n,l]}function pt(){return dt(nt,!1,{normalize:e=>lt(e,!1)})}function mt(){return(0,J.useEffect)(()=>(K(`analytics:tokens`),()=>q(`analytics:tokens`)),[]),n({queryKey:[`token-analytics`],queryFn:()=>a.get(`/analytics/tokens`),staleTime:6e4})}function ht(){return(0,J.useEffect)(()=>(K(`analytics:lines`),()=>q(`analytics:lines`)),[]),n({queryKey:[`analytics-lines`],queryFn:()=>a.get(`/analytics/lines`),staleTime:6e4})}function gt(){return(0,J.useEffect)(()=>(K(`analytics:kpis`),()=>q(`analytics:kpis`)),[]),n({queryKey:[`analytics-kpis`],queryFn:()=>a.get(`/analytics/kpis`),staleTime:6e4})}function _t(e={}){let t=new URLSearchParams;return e.from&&t.set(`from`,e.from),e.to&&t.set(`to`,e.to),n({queryKey:[`analytics-stage-quality`,e.from||``,e.to||``],queryFn:()=>a.get(`/analytics/stage-quality${t.size?`?${t}`:``}`),staleTime:6e4})}function vt(e,t=`rails`){let r=new URLSearchParams;return e&&r.set(`issueId`,e),t&&r.set(`kind`,t),n({queryKey:[`analytics-stage-quality-trace-detail`,e||``,t||``],queryFn:()=>a.get(`/analytics/stage-quality/trace-detail?${r}`),staleTime:6e4,enabled:!!e})}function yt(e=24){return(0,J.useEffect)(()=>(K(`analytics:hourly`),()=>q(`analytics:hourly`)),[]),n({queryKey:[`hourly-analytics`,e],queryFn:()=>a.get(`/analytics/hourly?hours=${e}`),staleTime:6e4})}function bt(){let[e,t]=(0,J.useState)(()=>navigator.onLine),[n,r]=(0,J.useState)(null),[i,a]=(0,J.useState)(!1),[o,s]=(0,J.useState)(!1),[c,l]=(0,J.useState)(()=>Be()),[u,d]=(0,J.useState)(()=>Y()),[f,p]=(0,J.useState)(!1),[m,ee]=(0,J.useState)(null);(0,J.useEffect)(()=>{let e=()=>t(!0),n=()=>t(!1);return window.addEventListener(`online`,e),window.addEventListener(`offline`,n),()=>{window.removeEventListener(`online`,e),window.removeEventListener(`offline`,n)}},[]),(0,J.useEffect)(()=>{let e=ze.map(e=>window.matchMedia(e)),t=e=>{e.preventDefault(),r(e),a(!0)},n=()=>{r(null),a(!1),l(!0),d(Y())},i=()=>{l(Be()),d(Y())};window.__fifonyInstallPrompt&&(r(window.__fifonyInstallPrompt),a(!0),window.__fifonyInstallPrompt=null),window.addEventListener(`beforeinstallprompt`,t),window.addEventListener(`appinstalled`,n);for(let t of e)t.addEventListener(`change`,i);return()=>{window.removeEventListener(`beforeinstallprompt`,t),window.removeEventListener(`appinstalled`,n);for(let t of e)t.removeEventListener(`change`,i)}},[]),(0,J.useEffect)(()=>{if(!(`serviceWorker`in navigator))return;let e=!1,t=e=>{p(!!e),e&&(e.waiting&&navigator.serviceWorker.controller&&s(!0),e.addEventListener(`updatefound`,()=>{let t=e.installing;t&&t.addEventListener(`statechange`,()=>{t.state===`installed`&&navigator.serviceWorker.controller&&s(!0)})}))},n=()=>{e||(e=!0,window.location.reload())};return Ve({type:`GET_VERSION`}).then(e=>ee(e?.version??null)).catch(()=>{}),navigator.serviceWorker.addEventListener(`controllerchange`,n),navigator.serviceWorker.getRegistration().then(t).catch(()=>{}),()=>{navigator.serviceWorker.removeEventListener(`controllerchange`,n)}},[]);let h=(0,J.useCallback)(async()=>!n||(await n.prompt(),(await n.userChoice)?.outcome!==`accepted`)?!1:(r(null),a(!1),!0),[n]),g=(0,J.useCallback)(async()=>{if(!(`serviceWorker`in navigator))return!1;let e=await navigator.serviceWorker.getRegistration();return e?.waiting?(e.waiting.postMessage({type:`SKIP_WAITING`}),!0):!1},[]);return{isOnline:e,canInstall:i&&!c,isInstalled:c,displayMode:u,updateAvailable:o,serviceWorkerSupported:`serviceWorker`in navigator,serviceWorkerRegistered:f,serviceWorkerVersion:m,installApp:h,applyUpdate:g}}export{Fe as A,ft as C,je as D,dt as E,l as F,s as I,o as L,Pe as M,Ae as N,Ne as O,Ie as P,c as R,vt as S,pt as T,Ue as _,rt as a,$ as b,yt as c,Je as d,Qe as f,Ge as g,qe as h,it as i,Me as j,ke as k,gt as l,Ke as m,ot as n,ut as o,bt as p,at as r,ht as s,X as t,Ye as u,We as v,mt as w,_t as x,He as y};