fifony 0.1.27 → 0.1.29

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 (35) hide show
  1. package/README.md +51 -29
  2. package/app/dist/assets/{KeyboardShortcutsHelp-NmaeCZMn.js → KeyboardShortcutsHelp-BF5KYX3E.js} +1 -1
  3. package/app/dist/assets/OnboardingWizard-Cweg4Ch0.js +1 -0
  4. package/app/dist/assets/{analytics.lazy-BpH26eA2.js → analytics.lazy-BlFXDncv.js} +1 -1
  5. package/app/dist/assets/{createLucideIcon-BWC-guQt.js → createLucideIcon-DgMTp0yx.js} +1 -1
  6. package/app/dist/assets/index-CSquFPSf.js +45 -0
  7. package/app/dist/assets/{index-DntTEHv8.css → index-ZlyvZ7KI.css} +1 -1
  8. package/app/dist/assets/vendor-D-IqxHHu.js +9 -0
  9. package/app/dist/index.html +4 -4
  10. package/app/dist/service-worker.js +1 -1
  11. package/dist/agent/run-local.js +64 -144
  12. package/dist/agent-FPUYBJZD.js +74 -0
  13. package/dist/chunk-2G6SRDOC.js +847 -0
  14. package/dist/{chunk-G7W4NEOA.js → chunk-3FCJI2GK.js} +1232 -633
  15. package/dist/chunk-O5AEQXUV.js +311 -0
  16. package/dist/chunk-OONOOWNC.js +123 -0
  17. package/dist/chunk-VOQT7RVT.js +295 -0
  18. package/dist/{chunk-XN2QKKMY.js → chunk-XVF6GOVS.js} +456 -814
  19. package/dist/cli.js +6 -4
  20. package/dist/issue-runner-MRHO5ZAB.js +15 -0
  21. package/dist/{issue-state-machine-SKODQ6MG.js → issue-state-machine-V2KPUYPW.js} +5 -3
  22. package/dist/issues-3PUMY63N.js +40 -0
  23. package/dist/mcp/server.js +23 -121
  24. package/dist/queue-workers-EGHCDDLB.js +23 -0
  25. package/dist/scheduler-V4GMCBTE.js +21 -0
  26. package/dist/{store-366NGWR4.js → store-RVKQ6UEY.js} +7 -5
  27. package/dist/workspace-KEHFITYR.js +52 -0
  28. package/package.json +6 -6
  29. package/app/dist/assets/OnboardingWizard-CwW6b_X4.js +0 -1
  30. package/app/dist/assets/index-D6jtlB7h.js +0 -43
  31. package/app/dist/assets/vendor-BTlTWMUF.js +0 -9
  32. package/dist/chunk-AMOGDOM7.js +0 -796
  33. package/dist/chunk-MT3S55TM.js +0 -91
  34. package/dist/issue-runner-MTAIYNVN.js +0 -13
  35. package/dist/queue-workers-Q3IWRFLI.js +0 -20
package/README.md CHANGED
@@ -22,6 +22,8 @@ npx -y fifony
22
22
 
23
23
  Open **http://localhost:4000**. The first run launches the onboarding wizard — it detects your CLIs, scans your project, and configures everything in six steps. State lives in `.fifony/`. No accounts, no cloud, no external database.
24
24
 
25
+ fifony executes each issue in an isolated git worktree. If you are starting from an empty folder, initialize git and create the first commit before execution. The onboarding Setup step can do this for you automatically.
26
+
25
27
  <div align="center">
26
28
  <img src="docs/ss-01.webp" alt="Onboarding wizard" width="720" />
27
29
  </div>
@@ -39,6 +41,7 @@ stateDiagram-v2
39
41
  direction LR
40
42
 
41
43
  classDef planning fill:#38bdf8,color:#fff,stroke:#0ea5e9,stroke-width:2px
44
+ classDef approval fill:#fbbf24,color:#000,stroke:#f59e0b,stroke-width:2px
42
45
  classDef queued fill:#a78bfa,color:#fff,stroke:#8b5cf6,stroke-width:2px
43
46
  classDef running fill:#818cf8,color:#fff,stroke:#6366f1,stroke-width:2px
44
47
  classDef review fill:#f59e0b,color:#fff,stroke:#d97706,stroke-width:2px
@@ -48,53 +51,69 @@ stateDiagram-v2
48
51
  classDef cancelled fill:#9ca3af,color:#fff,stroke:#6b7280,stroke-width:2px
49
52
 
50
53
  [*] --> Planning
51
- Planning --> Planned: PLANNED
52
- Planned --> Queued: QUEUE
54
+ Planning --> PendingApproval: PLANNED
55
+ PendingApproval --> Queued: QUEUE
56
+ PendingApproval --> Planning: REPLAN
53
57
  Queued --> Running: RUN
54
58
  Running --> Reviewing: REVIEW
55
- Reviewing --> Reviewed: REVIEWED
56
- Reviewed --> Done: DONE
57
- Done --> Merged: MERGE
58
-
59
+ Running --> Queued: REQUEUE
59
60
  Running --> Blocked: BLOCK
61
+ Reviewing --> PendingDecision: REVIEWED
62
+ Reviewing --> Queued: REQUEUE
60
63
  Reviewing --> Blocked: BLOCK
64
+ PendingDecision --> Approved: APPROVE
65
+ PendingDecision --> Queued: REQUEUE (rework)
66
+ PendingDecision --> Planning: REPLAN
67
+ Approved --> Merged: MERGE
68
+ Approved --> Planning: REOPEN
69
+
61
70
  Blocked --> Queued: UNBLOCK
62
71
  Blocked --> Planning: REPLAN
63
72
 
64
- Reviewed --> Queued: rework
65
- Reviewed --> Planning: REPLAN
66
-
67
- Done --> Planning: REOPEN
68
73
  Merged --> Planning: REOPEN
74
+ Merged --> Archived: ARCHIVE
69
75
 
70
76
  Planning --> Cancelled: CANCEL
71
- Planned --> Cancelled: CANCEL
72
- Reviewed --> Cancelled: CANCEL
77
+ PendingApproval --> Cancelled: CANCEL
78
+ PendingDecision --> Cancelled: CANCEL
73
79
  Blocked --> Cancelled: CANCEL
74
80
  Cancelled --> Planning: REOPEN
81
+ Cancelled --> Archived: ARCHIVE
75
82
 
83
+ Archived --> [*]
76
84
  Merged --> [*]
77
85
  Cancelled --> [*]
78
86
 
79
- class Planning,Planned planning
87
+ class Planning planning
88
+ class PendingApproval,PendingDecision approval
80
89
  class Queued queued
81
90
  class Running running
82
- class Reviewing,Reviewed review
83
- class Done done
91
+ class Reviewing review
92
+ class Approved done
84
93
  class Merged merged
85
94
  class Blocked blocked
86
95
  class Cancelled cancelled
96
+ class Archived cancelled
87
97
  ```
88
98
 
89
- | Step | What happens |
90
- |------|-------------|
91
- | **Create** | Describe what you want done. Hit **Enhance** — AI rewrites your title and description into a clear, actionable spec with acceptance criteria, edge cases, and suggested labels. One click turns a vague idea into a well-scoped task. |
92
- | **Plan** | The planner agent generates a structured execution plan: phases, steps, target files, complexity, risks. |
93
- | **Approve** | You review the plan. Optionally refine it with AI chat before approving. |
94
- | **Execute** | Agents run in an isolated git worktree. Live output streams to the dashboard. |
95
- | **Review** | The reviewer agent inspects the diff and either approves, requests rework, or blocks. |
96
- | **Done** | Approved and waiting for merge. You review the diff in the dashboard. |
97
- | **Merge** | You merge the worktree into your project. Analytics capture lines added/removed. |
99
+ | Step | Who | State | What happens |
100
+ |------|-----|-------|-------------|
101
+ | **Create** | You | → Planning | Describe what you want. Hit **Enhance** — AI rewrites your spec with acceptance criteria and edge cases. |
102
+ | **Plan** | AI | Planning | The planner generates a structured execution plan: phases, steps, target files, complexity, risks. |
103
+ | **Approve plan** | You | PendingApproval → Queued | You review the plan. Optionally refine with AI chat before approving. |
104
+ | **Execute** | AI | Running | Agents run in an isolated git worktree. Live output streams to the dashboard. |
105
+ | **Review** | AI | Reviewing | The reviewer inspects the diff approves, requests rework, or blocks. |
106
+ | **Decide** | You | PendingDecision Approved | You confirm the review. Approve to merge, request rework, or replan. |
107
+ | **Merge** | You | Approved → Merged | Merge the worktree into your project. Analytics capture lines added/removed. |
108
+ | **Archive** | You | Merged/Cancelled → Archived | Soft-delete: issue disappears from all views but stays in the database. |
109
+
110
+ **Retry operations** are semantically distinct — each has its own command, FSM path, and prompt context:
111
+
112
+ | Retry | Command | What happens |
113
+ |-------|---------|-------------|
114
+ | **Replan** | `replanIssueCommand` | Archives current plan, increments plan version, resets execution/review counters, generates fresh plan. |
115
+ | **Re-execute** | `retryExecutionCommand` | Retries from Blocked. Prior failure insights analyzed and injected into prompt — agent avoids repeating the same mistake. |
116
+ | **Rework** | `requestReworkCommand` | Reviewer requested changes. Feedback archived as structured failure insight, issue re-queued for another execution attempt. |
98
117
 
99
118
  Agents run as detached child processes, tracked by PID. If the server restarts mid-run, fifony recovers on the next boot.
100
119
 
@@ -123,6 +142,8 @@ The first run walks you through six steps:
123
142
 
124
143
  Settings are saved progressively and can be re-run from Settings at any time.
125
144
 
145
+ The Setup step blocks execution until the workspace is a git repository with at least one commit, because `git worktree` needs a base commit.
146
+
126
147
  ---
127
148
 
128
149
  ## Dashboard
@@ -225,11 +246,11 @@ Add to `claude_desktop_config.json` or VS Code settings:
225
246
  }
226
247
  ```
227
248
 
228
- **Resources**: state summary, all issues, workflow config, runtime guide, per-issue detail
249
+ **Resources**: `fifony://state/summary`, `fifony://issues`, `fifony://issue/{id}`, `fifony://issue/{id}/plan`, `fifony://issue/{id}/diff`, `fifony://issue/{id}/events`, `fifony://workflow/config`, `fifony://analytics`, `fifony://guide/overview`, `fifony://guide/runtime`, `fifony://guide/integration`, `fifony://integrations`, `fifony://capabilities`, `fifony://agents/catalog`, `fifony://skills/catalog`, `fifony://events/recent`
229
250
 
230
- **Tools**: `fifony.status`, `fifony.list_issues`, `fifony.create_issue`, `fifony.update_issue_state`, `fifony.integration_config`
251
+ **Tools**: `fifony.status`, `fifony.list_issues`, `fifony.create_issue`, `fifony.get_issue`, `fifony.update_issue_state`, `fifony.cancel_issue`, `fifony.retry_issue`, `fifony.plan`, `fifony.refine`, `fifony.approve`, `fifony.merge`, `fifony.get_diff`, `fifony.get_live`, `fifony.get_events`, `fifony.enhance`, `fifony.analytics`, `fifony.resolve_capabilities`, `fifony.get_workflow`, `fifony.scan_project`, `fifony.install_agents`, `fifony.install_skills`, `fifony.integration_config`, `fifony.list_integrations`, `fifony.integration_snippet`
231
252
 
232
- **Prompts**: `fifony-integrate-client`, `fifony-plan-issue`, `fifony-review-workflow`
253
+ **Prompts**: `fifony-integrate-client`, `fifony-plan-issue`, `fifony-route-task`, `fifony-use-integration`, `fifony-diagnose-blocked`, `fifony-weekly-summary`, `fifony-refine-plan`, `fifony-code-review`
233
254
 
234
255
  ---
235
256
 
@@ -268,10 +289,10 @@ FIFONY_LOG_FILE=0 # set to 1 to also write .fifony/fifony-lo
268
289
 
269
290
  | Layer | How it works |
270
291
  |-------|-------------|
271
- | **State machine** | Single source of truth. All transitions, side effects (events, field mutations, EC tracking), and guards live in `issue-state-machine.ts`. |
292
+ | **State machine** | 11 states, 14 events. States named by actor: AI (Planning, Running, Reviewing), Human (PendingApproval, PendingDecision, Approved), terminal (Merged, Cancelled, Archived). Archived = soft-delete, hidden from all views. |
293
+ | **Unified queue** | Single work queue with phase ordering (review → execute → plan). Semaphore for concurrency. No scheduler loop — event-driven dispatch. Planning runs outside the semaphore. |
272
294
  | **Persistence** | s3db.js with SQLite backend. Issues, events, sessions, and settings are first-class resources. No external DB. |
273
295
  | **Analytics** | `EventualConsistencyPlugin` tracks token usage, code churn (lines added/removed), and event counts with daily cohort rollups. |
274
- | **Queue** | `S3QueuePlugin` dispatches planning/execution/review jobs to concurrent workers. |
275
296
  | **Agents** | Wraps local CLIs (Claude, Codex, Gemini). Per-stage provider, model, and reasoning effort. No proprietary model logic. |
276
297
  | **Isolation** | Each issue gets its own git worktree branch. Parallel work on the same repo without file conflicts. |
277
298
  | **Routing** | Capability labels derived from issue text and file paths drive automatic agent/provider selection. |
@@ -281,6 +302,7 @@ FIFONY_LOG_FILE=0 # set to 1 to also write .fifony/fifony-lo
281
302
  ## Requirements
282
303
 
283
304
  - Node.js 23 or newer
305
+ - git installed, with the target workspace initialized as a repository before issue execution
284
306
  - At least one of: `claude` CLI, `codex` CLI, `gemini` CLI
285
307
 
286
308
  ---
@@ -1 +1 @@
1
- import{n as e}from"./rolldown-runtime-DF2fYuay.js";import{I as t,h as n}from"./vendor-BTlTWMUF.js";import{t as r}from"./createLucideIcon-BWC-guQt.js";import{r as i}from"./index-D6jtlB7h.js";var a=r(`keyboard`,[[`path`,{d:`M10 8h.01`,key:`1r9ogq`}],[`path`,{d:`M12 12h.01`,key:`1mp3jc`}],[`path`,{d:`M14 8h.01`,key:`1primd`}],[`path`,{d:`M16 12h.01`,key:`1l6xoz`}],[`path`,{d:`M18 8h.01`,key:`emo2bl`}],[`path`,{d:`M6 8h.01`,key:`x9i8wu`}],[`path`,{d:`M7 16h10`,key:`wp8him`}],[`path`,{d:`M8 12h.01`,key:`czm47f`}],[`rect`,{width:`20`,height:`16`,x:`2`,y:`4`,rx:`2`,key:`18n3k1`}]]),o=e(t(),1),s=n(),c=[{key:`n`,description:`Open New Issue drawer`},{key:`k`,description:`Navigate to Kanban`},{key:`i`,description:`Navigate to Issues`},{key:`a`,description:`Navigate to Agents`},{key:`t`,description:`Navigate to Analytics`},{key:`s`,description:`Navigate to Settings`},{key:`1–6`,description:`Jump to kanban column by index`},{key:`Esc`,description:`Close any open drawer / modal`},{key:`?`,description:`Show this help`}];function l({open:e,onClose:t}){let n=(0,o.useRef)(null);return(0,o.useEffect)(()=>{let t=n.current;t&&(e&&!t.open?t.showModal():!e&&t.open&&t.close())},[e]),(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-md`,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)(a,{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:`overflow-x-auto`,children:(0,s.jsxs)(`table`,{className:`table table-sm`,children:[(0,s.jsx)(`thead`,{children:(0,s.jsxs)(`tr`,{children:[(0,s.jsx)(`th`,{children:`Key`}),(0,s.jsx)(`th`,{children:`Action`})]})}),(0,s.jsx)(`tbody`,{children:c.map(e=>(0,s.jsxs)(`tr`,{children:[(0,s.jsx)(`td`,{children:(0,s.jsx)(`kbd`,{className:`kbd kbd-sm`,children:e.key})}),(0,s.jsx)(`td`,{children:e.description})]},e.key))})]})}),(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{l as default};
1
+ import{n as e}from"./rolldown-runtime-DF2fYuay.js";import{I as t,h as n}from"./vendor-D-IqxHHu.js";import{t as r}from"./createLucideIcon-DgMTp0yx.js";import{r as i}from"./index-CSquFPSf.js";var a=r(`keyboard`,[[`path`,{d:`M10 8h.01`,key:`1r9ogq`}],[`path`,{d:`M12 12h.01`,key:`1mp3jc`}],[`path`,{d:`M14 8h.01`,key:`1primd`}],[`path`,{d:`M16 12h.01`,key:`1l6xoz`}],[`path`,{d:`M18 8h.01`,key:`emo2bl`}],[`path`,{d:`M6 8h.01`,key:`x9i8wu`}],[`path`,{d:`M7 16h10`,key:`wp8him`}],[`path`,{d:`M8 12h.01`,key:`czm47f`}],[`rect`,{width:`20`,height:`16`,x:`2`,y:`4`,rx:`2`,key:`18n3k1`}]]),o=e(t(),1),s=n(),c=[{key:`n`,description:`Open New Issue drawer`},{key:`k`,description:`Navigate to Kanban`},{key:`i`,description:`Navigate to Issues`},{key:`a`,description:`Navigate to Agents`},{key:`t`,description:`Navigate to Analytics`},{key:`s`,description:`Navigate to Settings`},{key:`1–6`,description:`Jump to kanban column by index`},{key:`Esc`,description:`Close any open drawer / modal`},{key:`?`,description:`Show this help`}];function l({open:e,onClose:t}){let n=(0,o.useRef)(null);return(0,o.useEffect)(()=>{let t=n.current;t&&(e&&!t.open?t.showModal():!e&&t.open&&t.close())},[e]),(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-md`,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)(a,{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:`overflow-x-auto`,children:(0,s.jsxs)(`table`,{className:`table table-sm`,children:[(0,s.jsx)(`thead`,{children:(0,s.jsxs)(`tr`,{children:[(0,s.jsx)(`th`,{children:`Key`}),(0,s.jsx)(`th`,{children:`Action`})]})}),(0,s.jsx)(`tbody`,{children:c.map(e=>(0,s.jsxs)(`tr`,{children:[(0,s.jsx)(`td`,{children:(0,s.jsx)(`kbd`,{className:`kbd kbd-sm`,children:e.key})}),(0,s.jsx)(`td`,{children:e.description})]},e.key))})]})}),(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{l as default};
@@ -0,0 +1 @@
1
+ import{n as e}from"./rolldown-runtime-DF2fYuay.js";import{I as t,h as n,m as r}from"./vendor-D-IqxHHu.js";import{t as i}from"./createLucideIcon-DgMTp0yx.js";import{A as a,B as o,C as s,D as c,E as l,F as u,H as d,I as f,L as p,M as m,N as h,O as g,P as _,T as v,W as y,_ as b,a as x,b as S,c as C,d as w,f as T,h as E,i as D,j as O,l as k,n as A,p as j,t as M,u as N,v as P,w as F,y as I}from"./index-CSquFPSf.js";var ee=i(`brain`,[[`path`,{d:`M12 18V5`,key:`adv99a`}],[`path`,{d:`M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4`,key:`1e3is1`}],[`path`,{d:`M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5`,key:`1gqd8o`}],[`path`,{d:`M17.997 5.125a4 4 0 0 1 2.526 5.77`,key:`iwvgf7`}],[`path`,{d:`M18 18a4 4 0 0 0 2-7.464`,key:`efp6ie`}],[`path`,{d:`M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517`,key:`1gq6am`}],[`path`,{d:`M6 18a4 4 0 0 1-2-7.464`,key:`k1g0md`}],[`path`,{d:`M6.003 5.125a4 4 0 0 0-2.526 5.77`,key:`q97ue3`}]]),te=i(`chevron-left`,[[`path`,{d:`m15 18-6-6 6-6`,key:`1wnfg3`}]]),ne=i(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]),L=i(`flame`,[[`path`,{d:`M12 3q1 4 4 6.5t3 5.5a1 1 0 0 1-14 0 5 5 0 0 1 1-3 1 1 0 0 0 5 0c0-2-1.5-3-1.5-5q0-2 2.5-4`,key:`1slcih`}]]),re=i(`folder-root`,[[`path`,{d:`M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z`,key:`1fr9dc`}],[`circle`,{cx:`12`,cy:`13`,r:`2`,key:`1c1ljs`}],[`path`,{d:`M12 15v5`,key:`11xva1`}]]),R=i(`pencil-line`,[[`path`,{d:`M13 21h8`,key:`1jsn5i`}],[`path`,{d:`m15 5 4 4`,key:`1mk7zo`}],[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}]]),z=i(`rocket`,[[`path`,{d:`M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5`,key:`qeys4`}],[`path`,{d:`M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09`,key:`u4xsad`}],[`path`,{d:`M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z`,key:`676m9`}],[`path`,{d:`M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05`,key:`92ym6u`}]]),B=i(`shield-check`,[[`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:`m9 12 2 2 4-4`,key:`dzmm74`}]]),V=e(t(),1),H=n();function ie(){let e=(0,V.useRef)(null),t=(0,V.useRef)([]),n=(0,V.useRef)(null);return(0,V.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,H.jsx)(`canvas`,{ref:e,className:`fixed inset-0 pointer-events-none`,style:{zIndex:0},"aria-hidden":`true`})}var ae=[`Welcome`,`Setup`,`Pipeline`,`Agents & Skills`,`Preferences`,`Launch`];function oe(){return ae}function se(){return ae.length}var U=[`Setup`,`Pipeline`,`Agents`,`Preferences`,`Launch`];function ce(){return U}var W=[{value:`low`,label:`Low`,icon:A,description:`Quick and light -- fast responses, less thorough`,color:`text-info`},{value:`medium`,label:`Medium`,icon:I,description:`Balanced -- good mix of speed and quality`,color:`text-success`},{value:`high`,label:`High`,icon:ee,description:`Thorough -- deeper analysis, takes more time`,color:`text-warning`},{value:`extra-high`,label:`Extra High`,icon:L,description:`Maximum depth -- most thorough, slowest`,color:`text-error`}],G={codex:W,claude:W.filter(e=>e.value!==`extra-high`),gemini:W.filter(e=>e.value!==`extra-high`)};function K(e,t){return G[t?.[e]||`codex`]||W}var le=[{value:`auto`,label:`Auto`},{value:`light`,label:`Light`},{value:`dark`,label:`Dark`},{value:`black`,label:`Black`},{value:`cupcake`,label:`Cupcake`},{value:`night`,label:`Night`},{value:`sunset`,label:`Sunset`}],q=[{role:`planner`,label:`Planner`,description:`Scopes the issue, breaks it into steps, and decides the approach`,icon:ee,color:`text-info`},{role:`executor`,label:`Executor`,description:`Implements the plan — writes code, edits files, runs commands`,icon:A,color:`text-primary`},{role:`reviewer`,label:`Reviewer`,description:`Validates the result — checks correctness, scope, and quality`,icon:k,color:`text-secondary`}];async function J(e,t,n=`ui`){return d.post(`/settings/${encodeURIComponent(e)}`,{value:t,scope:n,source:`user`})}function Y(e,t=`medium`){return W.some(t=>t.value===e)?e:t}function ue(e){return!e||typeof e!=`object`||Array.isArray(e)?{planner:`medium`,executor:`medium`,reviewer:`medium`}:{planner:Y(e.planner??e.default,`medium`),executor:Y(e.executor??e.default,`medium`),reviewer:Y(e.reviewer??e.default,`medium`)}}function de(e,t,n={}){return{plan:{provider:e.planner||e.executor||``,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`}}}function X(e){return!!(e?.isGit&&e?.hasCommits)}function fe(e,t){return!!e&&X(t)}function pe({current:e}){let t=ce(),n=e-1;return(0,H.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,H.jsx)(`li`,{"data-content":r?`✓`:t+1,className:`step ${r||i?`step-primary`:``}`,style:{transition:`color 0.3s ease`},children:e},e)})})}function me({direction:e,stepKey:t,center:n,children:r}){return(0,H.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 he({step:e,stepCount:t,stepName:n,canProceed:r,launching:i,onBack:a,onNext:o,onLaunch:s}){return e===0?null:(0,H.jsxs)(`div`,{className:`relative z-10 p-4 pb-6 flex items-center max-w-2xl mx-auto w-full justify-between`,children:[(0,H.jsxs)(`button`,{className:`btn btn-ghost gap-1`,onClick:a,disabled:i,children:[(0,H.jsx)(te,{className:`size-4`}),` Back`]}),e<t-1?(0,H.jsxs)(`button`,{className:`btn btn-primary gap-1`,onClick:o,disabled:!r,children:[`Next `,(0,H.jsx)(ne,{className:`size-4`})]}):(0,H.jsx)(`button`,{className:`btn btn-primary btn-lg gap-2 animate-pulse-soft`,onClick:s,disabled:i,children:i?(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(j,{className:`size-5 animate-spin`}),` Launching...`]}):(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(z,{className:`size-5`}),` Launch fifony`]})})]})}function ge({workspacePath:e,onGetStarted:t}){return(0,H.jsxs)(`div`,{className:`flex flex-col items-center text-center gap-6 stagger-children py-4`,children:[(0,H.jsx)(`img`,{src:y,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,H.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,H.jsx)(`span`,{className:`text-primary`,children:`fifony`})]}),(0,H.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,H.jsxs)(`div`,{className:`badge badge-lg badge-soft badge-primary gap-2`,children:[(0,H.jsx)(C,{className:`size-3.5`}),`Project target: `,e]}),(0,H.jsxs)(`button`,{className:`btn btn-primary btn-lg gap-2 mt-2`,onClick:t,children:[`Get Started `,(0,H.jsx)(ne,{className:`size-5`})]})]})}var _e=new Set([`main`,`master`]);function ve(){let[e,t]=(0,V.useState)(null),[n,r]=(0,V.useState)(!1),[i,a]=(0,V.useState)(!1);return(0,V.useEffect)(()=>{d.get(`/gitignore/status`).then(t).catch(()=>t({exists:!1,hasFifony:!1}))},[]),e===null||e.hasFifony?null:i?(0,H.jsxs)(`div`,{className:`alert alert-success py-2.5 text-sm animate-fade-in`,children:[(0,H.jsx)(B,{className:`size-4 shrink-0`}),(0,H.jsxs)(`span`,{children:[(0,H.jsx)(`code`,{children:`.fifony/`}),` adicionado ao `,(0,H.jsx)(`code`,{children:`.gitignore`})]})]}):(0,H.jsxs)(`div`,{className:`alert alert-warning py-2.5 text-sm`,children:[(0,H.jsx)(B,{className:`size-4 shrink-0`}),(0,H.jsxs)(`div`,{className:`flex-1`,children:[(0,H.jsxs)(`span`,{children:[(0,H.jsx)(`code`,{children:`.fifony/`}),` não está no `,(0,H.jsx)(`code`,{children:`.gitignore`})]}),(0,H.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,H.jsx)(`button`,{className:`btn btn-xs btn-warning`,onClick:async()=>{r(!0);try{await d.post(`/gitignore/add`),a(!0)}catch{}finally{r(!1)}},disabled:n,children:n?(0,H.jsx)(j,{className:`size-3 animate-spin`}):`Adicionar`})]})}function ye({currentBranch:e,onBranchCreated:t,onGitStatusChange:n}){let[r,i]=(0,V.useState)(null),[a,o]=(0,V.useState)(!1),[s,c]=(0,V.useState)(null),[l,u]=(0,V.useState)(e);(0,V.useEffect)(()=>{d.get(`/git/status`).then(e=>{i(e),e.branch&&u(e.branch)}).catch(()=>i({isGit:!1,branch:e||null,hasCommits:!1}))},[]),(0,V.useEffect)(()=>{n?.(r)},[r,n]);let[f,p]=(0,V.useState)(!1),[m,h]=(0,V.useState)(``),[g,_]=(0,V.useState)(!1),[y,S]=(0,V.useState)(null),[C,w]=(0,V.useState)(null),E=r===null||r.isGit,D=r?.hasCommits??!1,O=_e.has(l),k=m.trim(),A=/^[a-zA-Z0-9/_.-]+$/.test(k)&&k.length>0,M=k===l;function N(){p(!0),h(l||``),S(null),w(null)}async function F(){if(!(!A||M||g)){_(!0),S(null);try{let e=await d.post(`/git/switch`,{branchName:k});if(!e.ok)throw Error(e.error||`Failed to switch branch.`);u(k),w({branch:k,created:e.created}),p(!1),t?.(k)}catch(e){S(e instanceof Error?e.message:String(e))}finally{_(!1)}}}async function I(){o(!0),c(null);try{let e=await d.post(`/git/init`,{});if(!e.ok)throw Error(e.error||`Failed to initialize git.`);i({isGit:!!(e.isGit??!0),branch:e.branch||null,hasCommits:!!(e.hasCommits??!0)}),u(e.branch||l)}catch(e){c(e instanceof Error?e.message:String(e))}finally{o(!1)}}return(0,H.jsxs)(`div`,{className:`bg-base-200 rounded-2xl p-5 flex flex-col gap-4`,children:[(0,H.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,H.jsx)(P,{className:`size-4 text-primary`}),(0,H.jsx)(`div`,{className:`text-sm font-semibold`,children:`Working branch`})]}),(0,H.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,H.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,H.jsxs)(`div`,{className:`alert alert-warning py-3`,children:[(0,H.jsx)(b,{className:`size-4 shrink-0`}),(0,H.jsxs)(`div`,{className:`text-sm`,children:[(0,H.jsx)(`p`,{className:`font-semibold`,children:`Not a git repository`}),(0,H.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.`})]})]}),s&&(0,H.jsxs)(`p`,{className:`text-xs text-error flex items-center gap-1`,children:[(0,H.jsx)(x,{className:`size-3`}),` `,s]}),(0,H.jsxs)(`button`,{className:`btn btn-primary gap-2 self-start`,onClick:I,disabled:a,children:[a?(0,H.jsx)(j,{className:`size-4 animate-spin`}):(0,H.jsx)(b,{className:`size-4`}),`Initialize git repository`]})]}),r!==null&&r.isGit&&!D&&(0,H.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,H.jsxs)(`div`,{className:`alert alert-warning py-3`,children:[(0,H.jsx)(b,{className:`size-4 shrink-0`}),(0,H.jsxs)(`div`,{className:`text-sm`,children:[(0,H.jsx)(`p`,{className:`font-semibold`,children:`Repository has no commits yet`}),(0,H.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.`})]})]}),s&&(0,H.jsxs)(`p`,{className:`text-xs text-error flex items-center gap-1`,children:[(0,H.jsx)(x,{className:`size-3`}),` `,s]}),(0,H.jsxs)(`button`,{className:`btn btn-primary gap-2 self-start`,onClick:I,disabled:a,children:[a?(0,H.jsx)(j,{className:`size-4 animate-spin`}):(0,H.jsx)(b,{className:`size-4`}),`Create initial commit`]})]}),E&&(0,H.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[f?(0,H.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,H.jsxs)(`div`,{className:`flex gap-2`,children:[(0,H.jsxs)(`label`,{className:`input input-bordered flex items-center gap-2 flex-1`,children:[(0,H.jsx)(P,{className:`size-3.5 opacity-40`}),(0,H.jsx)(`input`,{type:`text`,className:`grow font-mono text-sm`,value:m,onChange:e=>{h(e.target.value),S(null)},onKeyDown:e=>{e.key===`Enter`&&F(),e.key===`Escape`&&(p(!1),S(null))},placeholder:`develop`,autoFocus:!0,disabled:g})]}),(0,H.jsx)(`button`,{className:`btn btn-primary`,onClick:F,disabled:!A||M||g,children:g?(0,H.jsx)(T,{className:`size-4 animate-spin`}):`Switch`}),(0,H.jsx)(`button`,{className:`btn btn-ghost`,onClick:()=>{p(!1),S(null)},disabled:g,children:`Cancel`})]}),y&&(0,H.jsxs)(`p`,{className:`text-xs text-error flex items-center gap-1`,children:[(0,H.jsx)(x,{className:`size-3`}),` `,y]}),(0,H.jsx)(`p`,{className:`text-xs opacity-40`,children:`Switches to the branch if it exists, or creates it from the current HEAD.`})]}):(0,H.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,H.jsx)(P,{className:`size-4 opacity-50 shrink-0`}),(0,H.jsx)(`span`,{className:`text-sm opacity-50`,children:`Current branch:`}),(0,H.jsx)(`span`,{className:`font-mono text-sm font-semibold`,children:l||(r===null?`…`:`—`)}),O&&(0,H.jsx)(`span`,{className:`badge badge-warning badge-sm ml-auto shrink-0`,children:`protected`}),!O&&(0,H.jsx)(R,{className:`size-3.5 opacity-0 group-hover:opacity-40 ml-auto shrink-0 transition-opacity`})]}),C&&(0,H.jsxs)(`div`,{className:`alert alert-success py-3 text-sm animate-fade-in`,children:[(0,H.jsx)(v,{className:`size-4 shrink-0`}),(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`p`,{className:`font-semibold`,children:C.created?`Branch created`:`Switched to branch`}),(0,H.jsxs)(`p`,{className:`opacity-75 font-mono mt-0.5`,children:[`Now on `,(0,H.jsx)(`span`,{className:`text-success-content`,children:C.branch}),` — agents will use this as the base branch`]})]})]}),O&&!f&&(0,H.jsxs)(`div`,{className:`alert alert-warning py-3`,children:[(0,H.jsx)(x,{className:`size-4 shrink-0`}),(0,H.jsxs)(`div`,{className:`text-sm`,children:[(0,H.jsxs)(`p`,{className:`font-semibold`,children:[`Working directly on `,(0,H.jsx)(`span`,{className:`font-mono`,children:l})]}),(0,H.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,H.jsx)(ve,{})]})]})}function be({mergeMode:e,setMergeMode:t,prBaseBranch:n,setPrBaseBranch:r,currentBranch:i}){return(0,H.jsxs)(`div`,{className:`bg-base-200 rounded-2xl p-5 flex flex-col gap-4`,children:[(0,H.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,H.jsx)(E,{className:`size-4 text-primary`}),(0,H.jsx)(`div`,{className:`text-sm font-semibold`,children:`Merge mode`})]}),(0,H.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,H.jsxs)(`div`,{className:`flex gap-3`,children:[(0,H.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,H.jsx)(`input`,{type:`radio`,name:`mergeMode`,className:`hidden`,checked:e===`local`,onChange:()=>t(`local`)}),(0,H.jsx)(b,{className:`size-4 mx-auto mb-1 opacity-60`}),`Local merge`]}),(0,H.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,H.jsx)(`input`,{type:`radio`,name:`mergeMode`,className:`hidden`,checked:e===`push-pr`,onChange:()=>t(`push-pr`)}),(0,H.jsx)(E,{className:`size-4 mx-auto mb-1 opacity-60`}),`Push PR`]})]}),e===`push-pr`&&(0,H.jsxs)(`label`,{className:`form-control w-full gap-2`,children:[(0,H.jsx)(`span`,{className:`label-text text-sm font-medium`,children:`PR base branch`}),(0,H.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,H.jsx)(`p`,{className:`text-xs opacity-40`,children:`Branch that PRs will target. Defaults to the current branch.`})]})]})}function xe({testCommand:e,setTestCommand:t}){return(0,H.jsxs)(`div`,{className:`bg-base-200 rounded-2xl p-5 flex flex-col gap-4`,children:[(0,H.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,H.jsx)(S,{className:`size-4 text-primary`}),(0,H.jsx)(`div`,{className:`text-sm font-semibold`,children:`Test command`})]}),(0,H.jsx)(`p`,{className:`text-xs text-base-content/50 -mt-2`,children:`Validation gate: this command runs before merge/done. Leave empty to skip.`}),(0,H.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)})]})}function Se({projectName:e,setProjectName:t,detectedProjectName:n,projectSource:r,workspacePath:i,currentBranch:a,onGitStatusChange:o,onBranchCreated:s,mergeMode:c,setMergeMode:l,prBaseBranch:u,setPrBaseBranch:d,testCommand:f,setTestCommand:p}){let h=m(e),g=O(h||n),_=h?r===`saved`||r===`detected`?r:`manual`:n?`detected`:`missing`;return(0,H.jsxs)(`div`,{className:`flex flex-col gap-6 py-4`,children:[(0,H.jsxs)(`div`,{className:`text-center space-y-3`,children:[(0,H.jsx)(`div`,{className:`inline-flex size-14 items-center justify-center rounded-full bg-primary/10 text-primary mx-auto`,children:(0,H.jsx)(re,{className:`size-7`})}),(0,H.jsxs)(`div`,{className:`space-y-2`,children:[(0,H.jsx)(`h2`,{className:`text-2xl font-bold tracking-tight`,children:`Set up your workspace`}),(0,H.jsx)(`p`,{className:`text-base-content/60 max-w-xl mx-auto text-sm`,children:`Name your project and configure the working branch`})]})]}),(0,H.jsxs)(`div`,{className:`bg-base-200 rounded-2xl p-5 flex flex-col gap-4`,children:[(0,H.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,H.jsxs)(`div`,{children:[(0,H.jsx)(`div`,{className:`text-sm font-semibold`,children:`Project name`}),(0,H.jsx)(`div`,{className:`text-xs text-base-content/50`,children:`This becomes the default queue title for future runs.`})]}),_===`saved`&&(0,H.jsxs)(`span`,{className:`badge badge-primary badge-soft gap-1.5`,children:[(0,H.jsx)(C,{className:`size-3`}),`Saved configuration`]}),_===`detected`&&(0,H.jsxs)(`span`,{className:`badge badge-secondary badge-soft gap-1.5`,children:[(0,H.jsx)(C,{className:`size-3`}),`Detected automatically`]}),_===`manual`&&(0,H.jsxs)(`span`,{className:`badge badge-accent badge-soft gap-1.5`,children:[(0,H.jsx)(R,{className:`size-3`}),`Edited manually`]}),_===`missing`&&(0,H.jsxs)(`span`,{className:`badge badge-warning badge-soft gap-1.5`,children:[(0,H.jsx)(x,{className:`size-3`}),`Manual entry required`]})]}),(0,H.jsxs)(`label`,{className:`form-control w-full gap-2`,children:[(0,H.jsx)(`span`,{className:`label-text text-sm font-medium`,children:`Project`}),(0,H.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=m(n.target.value);r!==e&&t(r)}})]}),i&&(0,H.jsxs)(`div`,{className:`text-xs text-base-content/50 break-all`,children:[`Workspace: `,i]}),!n&&!h&&(0,H.jsxs)(`div`,{className:`alert alert-warning text-sm`,children:[(0,H.jsx)(x,{className:`size-4 shrink-0`}),(0,H.jsx)(`span`,{children:`We could not detect a project name from the current directory. Enter one to continue.`})]}),(0,H.jsxs)(`div`,{className:`rounded-xl border border-base-300/70 bg-base-100 px-4 py-3`,children:[(0,H.jsx)(`div`,{className:`text-xs uppercase tracking-[0.2em] text-base-content/40`,children:`Queue title preview`}),(0,H.jsx)(`div`,{className:`mt-1.5 text-base font-semibold tracking-tight break-words`,children:g})]})]}),(0,H.jsx)(ye,{currentBranch:a,onGitStatusChange:o,onBranchCreated:s}),(0,H.jsx)(be,{mergeMode:c,setMergeMode:l,prBaseBranch:u,setPrBaseBranch:d,currentBranch:a}),(0,H.jsx)(xe,{testCommand:f,setTestCommand:p})]})}var Z={planner:`plan`,executor:`execute`,reviewer:`review`};function Q({options:e,value:t,onChange:n}){return(0,H.jsx)(`div`,{className:`flex gap-1 flex-wrap`,children:e.map(e=>{let r=e.value===t,i=e.icon;return(0,H.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,H.jsx)(i,{className:`size-2.5`}),e.label]},e.value)})})}function Ce({providers:e,providersLoading:t,pipeline:n,setPipeline:r,efforts:i,setEfforts:a,models:o,setModels:c,modelsByProvider:l}){let u=Array.isArray(e)?e:[],d=u.filter(e=>e.available!==!1);return(0,V.useEffect)(()=>{for(let e of[`planner`,`executor`,`reviewer`]){let t=K(e,n),r=i[e];r&&!t.some(e=>e.value===r)&&a(t=>({...t,[e]:`high`}))}},[n,i,a]),(0,H.jsxs)(`div`,{className:`flex flex-col gap-5 w-full max-w-lg`,children:[(0,H.jsxs)(`div`,{className:`text-center`,children:[(0,H.jsx)(z,{className:`size-9 text-primary mx-auto mb-2`}),(0,H.jsx)(`h2`,{className:`text-2xl font-bold`,children:`Agent Pipeline`}),(0,H.jsx)(`p`,{className:`text-sm text-base-content/50 mt-1`,children:`Configure which CLI and reasoning depth runs each stage`})]}),t?(0,H.jsxs)(`div`,{className:`flex flex-col items-center gap-3 py-10`,children:[(0,H.jsx)(j,{className:`size-7 text-primary animate-spin`}),(0,H.jsx)(`p`,{className:`text-sm text-base-content/50`,children:`Detecting available CLIs…`})]}):d.length===0?(0,H.jsx)(`div`,{className:`alert alert-warning text-sm`,children:`No providers detected. Install claude, codex, or gemini CLI first.`}):(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(`div`,{className:`flex flex-wrap gap-2 justify-center`,children:u.map(e=>{let t=e.id||e.name||e,n=e.available!==!1;return(0,H.jsxs)(`span`,{className:`badge gap-1.5 badge-sm ${n?`badge-success`:`badge-ghost opacity-40`}`,children:[n?(0,H.jsx)(F,{className:`size-3`}):(0,H.jsx)(s,{className:`size-3`}),(0,H.jsx)(`span`,{className:`font-mono`,children:t}),e.path&&(0,H.jsx)(`span`,{className:`opacity-50 text-[9px] hidden sm:inline`,children:e.path})]},t)})}),(0,H.jsx)(`div`,{className:`flex flex-col`,children:q.map((e,t)=>{let s=e.icon,u=n[e.role]||d[0]?.id||d[0]?.name||``,f=Z[e.role],p=o?.[f]||``,m=l?.[u]||[],h=K(e.role,n),_=i?.[e.role]||`high`;return(0,H.jsxs)(`div`,{children:[t>0&&(0,H.jsx)(`div`,{className:`flex justify-center py-1.5 text-base-content/20`,children:(0,H.jsx)(g,{className:`size-4`})}),(0,H.jsx)(`div`,{className:`bg-base-200 rounded-xl p-4`,children:(0,H.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,H.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,H.jsx)(`div`,{className:`size-8 rounded-lg flex items-center justify-center bg-base-300 shrink-0 ${e.color}`,children:(0,H.jsx)(s,{className:`size-4`})}),(0,H.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,H.jsx)(`span`,{className:`font-semibold text-sm`,children:e.label}),(0,H.jsx)(`p`,{className:`text-[11px] text-base-content/40 leading-tight mt-0.5 truncate`,children:e.description})]}),(0,H.jsx)(`select`,{className:`select select-sm select-bordered w-28 shrink-0`,value:u,onChange:t=>{let n=t.target.value;r(t=>({...t,[e.role]:n}));let i=l?.[n]?.[0]?.id||``;c(e=>({...e,[f]:i}))},children:d.map(e=>{let t=e.id||e.name||e;return(0,H.jsx)(`option`,{value:t,children:t},t)})})]}),(0,H.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,H.jsx)(`span`,{className:`text-[10px] text-base-content/40 shrink-0 w-10`,children:`Effort`}),(0,H.jsx)(Q,{options:h,value:_,onChange:t=>a(n=>({...n,[e.role]:t}))})]}),m.length>0&&(0,H.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,H.jsx)(`span`,{className:`text-[10px] text-base-content/40 shrink-0 w-10`,children:`Model`}),(0,H.jsx)(`select`,{className:`select select-xs select-bordered flex-1`,value:p,onChange:e=>c(t=>({...t,[f]:e.target.value})),children:m.map(e=>(0,H.jsx)(`option`,{value:e.id,children:e.label||e.id},e.id))})]})]})})]},e.role)})}),(0,H.jsx)(`p`,{className:`text-[11px] text-base-content/35 text-center`,children:`Pipeline runs top to bottom: plan → execute → review`})]})]})}function we({selectedAgents:e,setSelectedAgents:t,existingAgents:n}){let[r,i]=(0,V.useState)([]),[a,o]=(0,V.useState)(!1),s=(0,V.useRef)(!1),[u,f]=(0,V.useState)([]),[p,m]=(0,V.useState)(!1),[h,g]=(0,V.useState)(``),[_,v]=(0,V.useState)(()=>new Set),[y,b]=(0,V.useState)({}),x=(0,V.useRef)(!1),[S,C]=(0,V.useState)(``),w=(0,V.useCallback)(()=>d.get(`/catalog/agents`).catch(()=>({agents:[]})).then(e=>{let t=e?.agents||[];return i(t),t}),[]);(0,V.useEffect)(()=>{s.current||(s.current=!0,o(!0),w().then(r=>{let i=new Set((n||[]).map(e=>e.name)),a=r.filter(e=>!i.has(e.name)).map(e=>e.name);a.length>0&&e.length===0&&t(a)}).finally(()=>o(!1)))},[]);let T=(0,V.useCallback)(()=>(g(``),m(!0),d.get(`/reference-repositories`).then(e=>{f(e?.repositories||[])}).catch(e=>{let t=e?.message||`Failed to load reference repositories.`;t.toLowerCase().includes(`route not found`)?g(`Backend route not loaded. Start Fifony with --dev (or run pnpm build:server) and retry.`):g(t)}).finally(()=>m(!1))),[]);(0,V.useEffect)(()=>{x.current||(x.current=!0,T())},[T]);let E=(0,V.useMemo)(()=>new Set((n||[]).map(e=>e.name)),[n]),D=(0,V.useMemo)(()=>{let e=S.trim().toLowerCase();return e?r.filter(t=>[t?.name,t?.displayName,t?.description].filter(Boolean).join(` `).toLowerCase().includes(e)):r},[S,r]),O=(0,V.useCallback)(e=>{t(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e])},[t]),A=(0,V.useCallback)(()=>{t(r.filter(e=>!E.has(e.name)).map(e=>e.name))},[r,E,t]),M=(0,V.useCallback)(()=>t([]),[t]),P=(0,V.useCallback)(async e=>{v(t=>new Set([...t,e])),b(t=>({...t,[e]:``}));try{let t=((await d.post(`/reference-repositories/sync`,{repository:e}))?.results||[]).find(t=>t.id===e);if(t?.action===`failed`){b(n=>({...n,[e]:t.message||`Sync failed.`}));return}await d.post(`/reference-repositories/import`,{repository:e,kind:`agents`,global:!1}),await Promise.all([T(),w()]),b(t=>({...t,[e]:`Synced & imported.`}))}catch(t){b(n=>({...n,[e]:t?.message||`Failed.`}))}finally{v(t=>{let n=new Set(t);return n.delete(e),n})}},[T,w]);return a?(0,H.jsxs)(`div`,{className:`flex flex-col items-center gap-3 py-12`,children:[(0,H.jsx)(j,{className:`size-8 text-primary animate-spin`}),(0,H.jsx)(`p`,{className:`text-sm text-base-content/50`,children:`Loading catalog...`})]}):(0,H.jsxs)(`div`,{className:`flex flex-col gap-6 stagger-children`,children:[(0,H.jsxs)(`div`,{className:`text-center`,children:[(0,H.jsx)(c,{className:`size-10 text-primary mx-auto mb-3`}),(0,H.jsx)(`h2`,{className:`text-2xl font-bold`,children:`Agents`}),(0,H.jsx)(`p`,{className:`text-base-content/60 mt-1`,children:`Choose which agents to install`})]}),(0,H.jsx)(`div`,{className:`card bg-base-200`,children:(0,H.jsxs)(`div`,{className:`card-body gap-3 p-4`,children:[(0,H.jsx)(`h3`,{className:`font-semibold text-sm`,children:`Sources`}),h&&(0,H.jsx)(`div`,{className:`alert alert-warning text-xs`,children:h}),p?(0,H.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-base-content/60`,children:[(0,H.jsx)(j,{className:`size-3 animate-spin`}),` Loading...`]}):(0,H.jsx)(`div`,{className:`grid grid-cols-2 xl:grid-cols-4 gap-2`,children:u.map(e=>{let t=_.has(e.id),n=e?.artifactCounts??null,r=e?.present&&e?.synced;return(0,H.jsxs)(`div`,{className:`rounded-lg border border-base-300/70 bg-base-100 p-2 flex flex-col gap-1.5`,children:[(0,H.jsx)(`div`,{className:`font-medium text-xs truncate`,children:e.name}),r&&n?(0,H.jsxs)(`div`,{className:`text-[11px] text-base-content/60`,children:[n.agents,` agents`]}):(0,H.jsx)(`span`,{className:`badge badge-xs badge-warning`,children:`Not synced`}),y[e.id]&&(0,H.jsx)(`p`,{className:`text-[11px] text-base-content/60 truncate`,children:y[e.id]}),(0,H.jsxs)(`button`,{className:`btn btn-xs btn-outline gap-1 mt-auto`,onClick:()=>P(e.id),disabled:t,children:[t?(0,H.jsx)(j,{className:`size-3 animate-spin`}):(0,H.jsx)(N,{className:`size-3`}),t?`Syncing…`:r?`Re-sync`:`Sync`]})]},e.id)})})]})}),(0,H.jsxs)(`div`,{className:`space-y-2`,children:[(0,H.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,H.jsxs)(`h3`,{className:`font-semibold text-sm flex items-center gap-2`,children:[(0,H.jsx)(c,{className:`size-4 opacity-50`}),`Agents (`,r.length,`)`]}),(0,H.jsxs)(`div`,{className:`flex gap-1`,children:[(0,H.jsx)(`button`,{className:`btn btn-xs btn-ghost`,onClick:A,children:`Select All`}),(0,H.jsx)(`button`,{className:`btn btn-xs btn-ghost`,onClick:M,children:`None`})]})]}),(0,H.jsxs)(`label`,{className:`input input-bordered input-sm flex items-center gap-2`,children:[(0,H.jsx)(k,{className:`size-4 opacity-60`}),(0,H.jsx)(`input`,{type:`text`,className:`grow`,placeholder:`Search agents...`,value:S,onChange:e=>C(e.target.value)})]}),D.length===0&&r.length>0&&(0,H.jsx)(`div`,{className:`text-sm text-base-content/60`,children:`No agents match your search.`}),(0,H.jsx)(`div`,{className:`space-y-1 pt-1`,children:D.map(t=>{let n=E.has(t.name),r=n||e.includes(t.name);return(0,H.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&&O(t.name),disabled:n,children:(0,H.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,H.jsx)(`span`,{className:`mt-0.5 text-base`,children:t.emoji||`🤖`}),(0,H.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,H.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,H.jsx)(`span`,{className:`font-medium text-sm truncate`,children:t.displayName||t.name}),t.source&&(0,H.jsx)(`span`,{className:`badge badge-xs badge-ghost shrink-0`,children:t.source}),n?(0,H.jsxs)(`span`,{className:`badge badge-xs badge-success gap-1 shrink-0`,children:[(0,H.jsx)(l,{className:`size-3`}),` Installed`]}):(0,H.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,H.jsx)(`p`,{className:`text-xs text-base-content/60 mt-1 truncate`,children:t.description})]})]})},t.name)})})]}),r.length===0&&(0,H.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 Te={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 Ee({theme:e,selected:t,onClick:n}){let r=Te[e.value];return(0,H.jsxs)(`button`,{onClick:n,title:e.label,className:`flex flex-col items-center gap-1.5 group focus:outline-none`,children:[(0,H.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,H.jsxs)(`div`,{className:`w-full h-full flex flex-col`,children:[(0,H.jsx)(`div`,{className:`flex-1`,style:{background:r.bg}}),(0,H.jsx)(`div`,{className:`h-3 w-full`,style:{background:r.accent}})]}):(0,H.jsxs)(`div`,{className:`w-full h-full flex`,children:[(0,H.jsx)(`div`,{className:`flex-1 bg-white`}),(0,H.jsx)(`div`,{className:`flex-1 bg-neutral`})]})}),(0,H.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 De({concurrency:e,setConcurrency:t,selectedTheme:n,setSelectedTheme:r}){let i=Number.isFinite(e)?Math.max(1,Math.min(10,e)):1;return(0,H.jsxs)(`div`,{className:`flex flex-col gap-6 stagger-children`,children:[(0,H.jsxs)(`div`,{className:`text-center`,children:[(0,H.jsx)(D,{className:`size-10 text-primary mx-auto mb-3`}),(0,H.jsx)(`h2`,{className:`text-2xl font-bold`,children:`Workers & Theme`}),(0,H.jsx)(`p`,{className:`text-base-content/60 mt-1 text-sm`,children:`Configure parallel workers and visual theme`})]}),(0,H.jsx)(`div`,{className:`card bg-base-200`,children:(0,H.jsxs)(`div`,{className:`card-body p-5 gap-3`,children:[(0,H.jsxs)(`h3`,{className:`font-semibold text-sm flex items-center gap-2`,children:[(0,H.jsx)(D,{className:`size-4 opacity-50`}),`Worker Concurrency`]}),(0,H.jsxs)(`p`,{className:`text-xs text-base-content/60`,children:[`How many agents can work in parallel (`,i,` worker`,i===1?``:`s`,`)`]}),(0,H.jsxs)(`div`,{className:`w-full max-w-xs`,children:[(0,H.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,H.jsx)(`div`,{className:`flex justify-between px-2.5 mt-2 text-xs`,children:Array.from({length:10},(e,t)=>(0,H.jsx)(`span`,{children:`|`},t))}),(0,H.jsx)(`div`,{className:`flex justify-between px-2.5 mt-2 text-xs`,children:Array.from({length:10},(e,t)=>(0,H.jsx)(`span`,{children:t+1},t))})]}),(0,H.jsxs)(`p`,{className:`text-xs text-base-content/50 bg-base-100 rounded-lg px-3 py-2 mt-1`,children:[(0,H.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,H.jsx)(`div`,{className:`card bg-base-200`,children:(0,H.jsxs)(`div`,{className:`card-body p-5 gap-4`,children:[(0,H.jsxs)(`h3`,{className:`font-semibold text-sm flex items-center gap-2`,children:[(0,H.jsx)(w,{className:`size-4 opacity-50`}),`Theme`]}),(0,H.jsx)(`div`,{className:`flex flex-wrap gap-5 justify-center py-1`,children:le.map(e=>(0,H.jsx)(Ee,{theme:e,selected:n===e.value,onClick:()=>r(e.value)},e.value))})]})})]})}function Oe({config:e,launching:t}){return(0,H.jsxs)(`div`,{className:`flex flex-col items-center text-center gap-6 stagger-children py-4`,children:[(0,H.jsx)(`div`,{className:`animate-bounce-in`,children:(0,H.jsx)(z,{className:`size-16 sm:size-20 text-primary mx-auto`})}),(0,H.jsx)(`h2`,{className:`text-2xl sm:text-3xl font-bold`,children:`You're All Set!`}),(0,H.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,H.jsx)(`div`,{className:`card bg-base-200 w-full max-w-sm`,children:(0,H.jsxs)(`div`,{className:`card-body p-4 gap-2 text-sm text-left`,children:[(0,H.jsxs)(`div`,{className:`flex justify-between gap-4`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Queue title`}),(0,H.jsx)(`span`,{className:`font-semibold text-right break-words`,children:e.queueTitle||`fifony`})]}),(0,H.jsx)(`div`,{className:`divider my-0`}),(0,H.jsxs)(`div`,{className:`flex justify-between`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Pipeline`}),(0,H.jsxs)(`span`,{className:`font-semibold capitalize text-xs font-mono`,children:[e.pipeline?.planner||`?`,` → `,e.pipeline?.executor||`?`,` → `,e.pipeline?.reviewer||`?`]})]}),(0,H.jsx)(`div`,{className:`divider my-0`}),(0,H.jsxs)(`div`,{className:`flex justify-between`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Domains`}),(0,H.jsx)(`span`,{className:`font-semibold`,children:e.domains?.length>0?e.domains.length+` selected`:`none`})]}),(0,H.jsx)(`div`,{className:`divider my-0`}),(0,H.jsxs)(`div`,{className:`flex justify-between`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Agents`}),(0,H.jsxs)(`span`,{className:`font-semibold`,children:[e.agents?.length||0,` to install`]})]}),(0,H.jsx)(`div`,{className:`divider my-0`}),(0,H.jsxs)(`div`,{className:`flex justify-between`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Skills`}),(0,H.jsxs)(`span`,{className:`font-semibold`,children:[e.skills?.length||0,` to install`]})]}),(0,H.jsx)(`div`,{className:`divider my-0`}),(0,H.jsxs)(`div`,{className:`flex justify-between`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Plan`}),(0,H.jsx)(`span`,{className:`font-semibold capitalize`,children:e.efforts.planner})]}),(0,H.jsx)(`div`,{className:`divider my-0`}),(0,H.jsxs)(`div`,{className:`flex justify-between`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Execute`}),(0,H.jsx)(`span`,{className:`font-semibold capitalize`,children:e.efforts.executor})]}),(0,H.jsx)(`div`,{className:`divider my-0`}),(0,H.jsxs)(`div`,{className:`flex justify-between`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Review`}),(0,H.jsx)(`span`,{className:`font-semibold capitalize`,children:e.efforts.reviewer})]}),(0,H.jsx)(`div`,{className:`divider my-0`}),(0,H.jsxs)(`div`,{className:`flex justify-between`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Workers`}),(0,H.jsx)(`span`,{className:`font-semibold`,children:e.concurrency})]}),(0,H.jsx)(`div`,{className:`divider my-0`}),(0,H.jsxs)(`div`,{className:`flex justify-between`,children:[(0,H.jsx)(`span`,{className:`text-base-content/60`,children:`Theme`}),(0,H.jsx)(`span`,{className:`font-semibold capitalize`,children:e.theme})]})]})}),t&&(0,H.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-base-content/50`,children:[(0,H.jsx)(j,{className:`size-4 animate-spin`}),`Saving configuration & installing agents...`]})]})}function ke({onComplete:e}){let t=r(),n=o(),i=f(n.data),[s,c]=(0,V.useState)(0),[l,g]=(0,V.useState)(`forward`),[v,y]=(0,V.useState)(!1),[b,x]=(0,V.useState)(null),S=(0,V.useRef)(!1),C=(0,V.useRef)(!1),[w,T]=(0,V.useState)({planner:``,executor:``,reviewer:``}),[E,D]=(0,V.useState)(()=>ue(null)),[k,A]=(0,V.useState)(3),[j,N]=(0,V.useState)(`auto`),[P,F]=(0,V.useState)(``),[I,ee]=(0,V.useState)(`missing`),[te,ne]=(0,V.useState)(null),[L,re]=(0,V.useState)(null),[R,z]=(0,V.useState)([]),[B,ae]=(0,V.useState)([]),[U,ce]=(0,V.useState)(`local`),[W,G]=(0,V.useState)(``),[K,le]=(0,V.useState)(``),q=se(),Y=oe()[s]||``,[X,_e]=(0,V.useState)(null),[ve,ye]=(0,V.useState)(!1),[be,xe]=(0,V.useState)({}),[Z,Q]=(0,V.useState)({plan:``,execute:``,review:``}),[Te,Ee]=(0,V.useState)(``),[ke,Ae]=(0,V.useState)(``);(0,V.useEffect)(()=>{d.get(`/state`).then(e=>{re(e||{}),Ee(e?.sourceRepoUrl||e?.config?.sourceRepo||``),Ae(e?.config?.defaultBranch||``)}).catch(()=>{re({})})},[]),(0,V.useEffect)(()=>{if(S.current||n.isLoading)return;S.current=!0;let e=u(i,`runtime.pipeline`,null),t=u(i,`runtime.workflowConfig`,null),r=u(i,`runtime.defaultEffort`,null),a=u(i,`ui.theme`,`auto`),o=u(i,`runtime.workerConcurrency`,3);if(Array.isArray(e)&&e.length>0){let t=Object.fromEntries(e.map(e=>[e.role,e.provider]));T({planner:t.planner||``,executor:t.executor||``,reviewer:t.reviewer||``})}t&&typeof t==`object`&&Q({plan:t.plan?.model||``,execute:t.execute?.model||``,review:t.review?.model||``}),D(ue(r)),typeof a==`string`&&a.trim()&&N(a);let s=Number.parseInt(String(o??2),10);Number.isFinite(s)&&A(Math.min(10,Math.max(1,s)));let c=u(i,`runtime.mergeMode`,`local`);(c===`local`||c===`push-pr`)&&ce(c);let l=u(i,`runtime.prBaseBranch`,``);typeof l==`string`&&G(l);let d=u(i,`runtime.testCommand`,``);typeof d==`string`&&le(d)},[i,n.isLoading]),(0,V.useEffect)(()=>{if(C.current||n.isLoading||L===null)return;C.current=!0;let e=h(i,L);F(e.projectName),ee(e.source)},[L,i,n.isLoading]);let je=(0,V.useCallback)(e=>{F(e),ee(`manual`)},[]),$=m(P),Me=O($);(0,V.useEffect)(()=>{document.title=O($||L?.detectedProjectName||L?.projectName||``)},[$,L]),(0,V.useEffect)(()=>{s>=1&&X===null&&(ye(!0),Promise.all([d.get(`/providers`),d.get(`/config/workflow?details=1`).catch(()=>null)]).then(([e,t])=>{let n=Array.isArray(e)?e:e?.providers||[];_e(n);let r=t?.models||{};xe(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={planner:c,executor:s,reviewer:c};T(e=>({planner:e.planner||l.planner,executor:e.executor||l.executor,reviewer:e.reviewer||l.reviewer})),Q(e=>({plan:e.plan||r[c]?.[0]?.id||``,execute:e.execute||r[s]?.[0]?.id||``,review:e.review||r[c]?.[0]?.id||``}))}).catch(()=>{_e([])}).finally(()=>{ye(!1)}))},[s,X]),(0,V.useEffect)(()=>{let e=j===`auto`?window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:j;document.documentElement.setAttribute(`data-theme`,e)},[j]);let Ne=(0,V.useCallback)(e=>{if(e===`Setup`)$&&J(a,$,`system`).catch(()=>{}),J(`runtime.mergeMode`,U,`runtime`).catch(()=>{}),U===`push-pr`&&W.trim()&&J(`runtime.prBaseBranch`,W.trim(),`runtime`).catch(()=>{}),K.trim()&&J(`runtime.testCommand`,K.trim(),`runtime`).catch(()=>{});else if(e===`Pipeline`){let e=[{provider:w.planner,role:`planner`},{provider:w.executor,role:`executor`},{provider:w.reviewer,role:`reviewer`}];J(`runtime.agentProvider`,w.executor,`runtime`).catch(()=>{}),J(`runtime.pipeline`,e,`runtime`).catch(()=>{}),J(`runtime.defaultEffort`,E,`runtime`).catch(()=>{}),J(`runtime.workflowConfig`,de(w,E,Z),`runtime`).catch(()=>{})}else e===`Preferences`&&(J(`ui.theme`,j,`ui`).catch(()=>{}),d.post(`/config/concurrency`,{concurrency:k}).catch(()=>{}))},[w,E,Z,k,j,$,U,W,K]),Pe=(0,V.useCallback)(()=>{s<q-1&&(Ne(Y),g(`forward`),c(e=>e+1))},[s,q,Y,Ne]),Fe=(0,V.useCallback)(()=>{s>0&&(g(`backward`),c(e=>e-1))},[s]),Ie=(0,V.useCallback)(async()=>{if($){y(!0);try{let n=[J(a,$,`system`),J(`ui.theme`,j,`ui`),J(`ui.onboarding.completed`,!0,`ui`)],r=[{provider:w.planner,role:`planner`},{provider:w.executor,role:`executor`},{provider:w.reviewer,role:`reviewer`}];n.push(J(`runtime.agentProvider`,w.executor,`runtime`)),n.push(J(`runtime.pipeline`,r,`runtime`)),n.push(J(`runtime.defaultEffort`,E,`runtime`)),n.push(J(`runtime.workflowConfig`,de(w,E,Z),`runtime`)),n.push(d.post(`/config/concurrency`,{concurrency:k})),n.push(J(`runtime.mergeMode`,U,`runtime`)),U===`push-pr`&&W.trim()&&n.push(J(`runtime.prBaseBranch`,W.trim(),`runtime`)),K.trim()&&n.push(J(`runtime.testCommand`,K.trim(),`runtime`)),R.length>0&&n.push(d.post(`/install/agents`,{agents:R})),B.length>0&&n.push(d.post(`/install/skills`,{skills:B})),await Promise.allSettled(n),t.setQueryData(_,e=>p(e,{id:a,scope:`system`,value:$,source:`user`,updatedAt:new Date().toISOString()})),t.setQueryData(_,e=>p(e,{id:`ui.onboarding.completed`,scope:`ui`,value:!0,source:`user`,updatedAt:new Date().toISOString()})),x({x:window.innerWidth/2,y:window.innerHeight/3}),setTimeout(()=>{t.invalidateQueries({queryKey:_}),e?.()},1200)}catch{t.setQueryData(_,e=>p(e,{id:a,scope:`system`,value:$,source:`user`,updatedAt:new Date().toISOString()})),t.setQueryData(_,e=>p(e,{id:`ui.onboarding.completed`,scope:`ui`,value:!0,source:`user`,updatedAt:new Date().toISOString()})),await J(`ui.onboarding.completed`,!0,`ui`).catch(()=>{}),t.invalidateQueries({queryKey:_}),e?.()}}},[$,w,E,Z,k,j,R,B,U,W,K,t,e]),Le=Y===`Welcome`||Y===`Setup`&&fe($,te)||Y===`Pipeline`&&(w.executor||ve)||Y===`Agents & Skills`||Y===`Preferences`||Y===`Launch`,Re=[],ze=[],Be={projectName:$,queueTitle:Me,pipeline:w,efforts:E,concurrency:k,theme:j,agents:R,skills:B};return(0,H.jsxs)(`div`,{className:`fixed inset-0 z-50 bg-base-100 flex flex-col overflow-hidden`,children:[s===0&&(0,H.jsx)(ie,{}),b&&(0,H.jsx)(M,{x:b.x,y:b.y,active:!0,onDone:()=>x(null)}),s>0&&(0,H.jsx)(`div`,{className:`relative z-10 pt-6 pb-2 px-4 flex justify-center`,children:(0,H.jsx)(pe,{current:s})}),(0,H.jsx)(`div`,{className:`relative z-10 flex-1 flex flex-col items-center justify-start px-4 py-6 overflow-y-auto`,children:(0,H.jsxs)(me,{direction:l,stepKey:s,center:Y===`Welcome`||Y===`Setup`||Y===`Pipeline`||Y===`Launch`,children:[Y===`Welcome`&&(0,H.jsx)(ge,{workspacePath:Te,onGetStarted:Pe}),Y===`Setup`&&(0,H.jsx)(Se,{projectName:P,setProjectName:je,detectedProjectName:L?.detectedProjectName||``,projectSource:I,workspacePath:Te,currentBranch:ke,onGitStatusChange:ne,onBranchCreated:e=>{Ae(e),W||G(e)},mergeMode:U,setMergeMode:ce,prBaseBranch:W,setPrBaseBranch:G,testCommand:K,setTestCommand:le}),Y===`Pipeline`&&(0,H.jsx)(Ce,{providers:X||[],providersLoading:ve,pipeline:w,setPipeline:T,efforts:E,setEfforts:D,models:Z,setModels:Q,modelsByProvider:be}),Y===`Agents & Skills`&&(0,H.jsx)(we,{selectedAgents:R,setSelectedAgents:z,selectedSkills:B,setSelectedSkills:ae,existingAgents:Re,existingSkills:ze}),Y===`Preferences`&&(0,H.jsx)(De,{concurrency:k,setConcurrency:A,selectedTheme:j,setSelectedTheme:N}),Y===`Launch`&&(0,H.jsx)(Oe,{config:Be,launching:v})]})}),(0,H.jsx)(he,{step:s,stepCount:q,stepName:Y,canProceed:Le,launching:v,onBack:Fe,onNext:Pe,onLaunch:Ie})]})}export{ke as default};
@@ -1 +1 @@
1
- import{n as e}from"./rolldown-runtime-DF2fYuay.js";import{I as t,a as n,h as r}from"./vendor-BTlTWMUF.js";import{D as i,I as a,L as o,V as s,b as c,g as l,h as u,m as d,n as f,o as p,s as m,y as h,z as g}from"./index-D6jtlB7h.js";var _=e(t(),1),v=r();function y(e){return!e||e===0?`0`:e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e)}function b(e){return!e||e===0?`0`:e.toLocaleString()}function x({value:e,format:t=y,className:n=``}){let[r,i]=(0,_.useState)(()=>t(e)),a=(0,_.useRef)(e),o=(0,_.useRef)(null);return(0,_.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,v.jsx)(`span`,{className:`${n} inline-block tabular-nums`,children:r})}var S=[{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 C({byPhase:e}){if(!e)return null;let t=S.reduce((t,n)=>t+(e[n.key]?.totalTokens||0),0);return t===0?null:(0,v.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,v.jsx)(`div`,{className:`flex h-4 rounded-full overflow-hidden bg-base-300 w-full`,children:S.map(n=>{let r=e[n.key]?.totalTokens||0,i=r/t*100;return i===0?null:(0,v.jsx)(`div`,{className:`${n.color} opacity-80 transition-all duration-500`,style:{width:`${i}%`},title:`${n.label}: ${b(r)} (${Math.round(i)}%)`},n.key)})}),(0,v.jsx)(`div`,{className:`flex items-center gap-3 flex-wrap text-xs`,children:S.map(n=>{let r=e[n.key]?.totalTokens||0,i=t>0?Math.round(r/t*100):0;return r===0?null:(0,v.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,v.jsx)(`span`,{className:`inline-block size-2 rounded-full ${n.color} shrink-0`}),(0,v.jsx)(`span`,{className:`opacity-60`,children:n.label}),(0,v.jsx)(`span`,{className:`font-mono font-semibold`,children:y(r)}),(0,v.jsxs)(`span`,{className:`opacity-40`,children:[`(`,i,`%)`]})]},n.key)})})]})}function w({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,v.jsxs)(`div`,{className:`relative`,children:[(0,v.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs opacity-50 mb-2`,children:[(0,v.jsx)(`span`,{className:`inline-block w-2.5 h-2.5 rounded-sm ${n}`}),r]}),f&&(0,v.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,v.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,v.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,v.jsxs)(`span`,{className:`flex items-center gap-1.5 text-xs`,children:[(0,v.jsx)(`span`,{className:`inline-block w-2 h-2 rounded-sm ${n} shrink-0`}),(0,v.jsx)(`span`,{className:`font-mono font-semibold`,children:c?c(f[t]||0):(f[t]||0).toLocaleString()})]})]})}),(0,v.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,v.jsxs)(`div`,{className:`flex-1 relative cursor-default`,onMouseEnter:()=>s?.(r),onMouseLeave:()=>s?.(null),children:[c>0&&(0,v.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,v.jsx)(`div`,{className:`absolute inset-0 bg-base-content/5 rounded-sm`})]},e.date)})}),a&&(0,v.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,v.jsx)(`div`,{className:`flex-1 overflow-hidden`,children:i&&(0,v.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 T({daily:e}){let[t,n]=(0,_.useState)(null),r=e||[];return(0,v.jsxs)(`div`,{className:`space-y-4`,children:[(0,v.jsx)(w,{data:r,valueKey:`totalTokens`,barClass:`bg-primary`,label:`Tokens / day`,height:64,showXAxis:!1,hoveredIdx:t,onHover:n,formatTooltip:e=>e.toLocaleString()}),(0,v.jsx)(w,{data:r,valueKey:`events`,barClass:`bg-secondary`,label:`Events / day`,height:36,showXAxis:!0,hoveredIdx:t,onHover:n})]})}function E({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,v.jsx)(`div`,{className:`overflow-x-auto`,children:(0,v.jsxs)(`table`,{className:`table table-sm`,children:[(0,v.jsx)(`thead`,{children:(0,v.jsxs)(`tr`,{children:[(0,v.jsx)(`th`,{children:`Model`}),(0,v.jsx)(`th`,{className:`text-right`,children:`Input`}),(0,v.jsx)(`th`,{className:`text-right`,children:`Output`}),(0,v.jsx)(`th`,{className:`text-right`,children:`Total`}),(0,v.jsx)(`th`,{className:`text-right`,children:`Share`})]})}),(0,v.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,v.jsxs)(`tr`,{children:[(0,v.jsxs)(`td`,{className:`flex items-center gap-2`,children:[(0,v.jsx)(`span`,{className:`inline-block w-2.5 h-2.5 rounded-full ${r} shrink-0`}),(0,v.jsx)(`span`,{className:`font-mono text-xs`,children:e.model})]}),(0,v.jsx)(`td`,{className:`text-right font-mono text-xs`,children:y(e.inputTokens)}),(0,v.jsx)(`td`,{className:`text-right font-mono text-xs`,children:y(e.outputTokens)}),(0,v.jsx)(`td`,{className:`text-right font-mono text-xs font-semibold`,children:y(e.totalTokens)}),(0,v.jsx)(`td`,{className:`text-right`,children:(0,v.jsxs)(`div`,{className:`flex items-center justify-end gap-1.5`,children:[(0,v.jsx)(`div`,{className:`w-12 h-1.5 bg-base-300 rounded-full overflow-hidden`,children:(0,v.jsx)(`div`,{className:`h-full ${r} rounded-full`,style:{width:`${t}%`}})}),(0,v.jsxs)(`span`,{className:`text-xs opacity-60 w-8 text-right`,children:[t,`%`]})]})})]},e.model)})})]})})}function D({topIssues:e}){return!e||e.length===0?null:(0,v.jsx)(`div`,{className:`overflow-x-auto`,children:(0,v.jsxs)(`table`,{className:`table table-sm`,children:[(0,v.jsx)(`thead`,{children:(0,v.jsxs)(`tr`,{children:[(0,v.jsx)(`th`,{className:`w-20`,children:`Issue`}),(0,v.jsx)(`th`,{children:`Title`}),(0,v.jsx)(`th`,{className:`text-right`,children:`Tokens`}),(0,v.jsx)(`th`,{className:`hidden sm:table-cell`,children:`Phase Split`})]})}),(0,v.jsx)(`tbody`,{children:e.slice(0,10).map(e=>{let t=e.byPhase,n=e.totalTokens||0;return(0,v.jsxs)(`tr`,{children:[(0,v.jsx)(`td`,{className:`font-mono text-xs font-semibold text-primary`,children:e.identifier}),(0,v.jsx)(`td`,{className:`max-w-[200px] truncate text-sm`,title:e.title,children:e.title||`-`}),(0,v.jsx)(`td`,{className:`text-right font-mono text-xs font-semibold`,children:y(n)}),(0,v.jsx)(`td`,{className:`hidden sm:table-cell`,children:t?(0,v.jsx)(`div`,{className:`flex h-1.5 rounded-full overflow-hidden bg-base-300 w-24`,children:S.map(e=>{let r=t[e.key]?.totalTokens||0,i=n>0?r/n*100:0;return i===0?null:(0,v.jsx)(`div`,{className:`${e.color} opacity-80`,style:{width:`${i}%`},title:`${e.label}: ${y(r)}`},e.key)})}):(0,v.jsx)(`span`,{className:`opacity-30 text-xs`,children:`-`})})]},e.id||e.identifier)})})]})})}function O({daily:e}){let t=e||[],[n,r]=(0,_.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,v.jsxs)(`div`,{children:[(0,v.jsxs)(`div`,{className:`flex items-center gap-5 mb-3`,children:[(0,v.jsxs)(`span`,{className:`flex items-center gap-1.5 text-xs opacity-50`,children:[(0,v.jsx)(`span`,{className:`inline-block w-2.5 h-2.5 rounded-sm bg-success`}),`Lines added / day`]}),(0,v.jsxs)(`span`,{className:`flex items-center gap-1.5 text-xs opacity-50`,children:[(0,v.jsx)(`span`,{className:`inline-block w-2.5 h-2.5 rounded-sm bg-error`}),`Lines removed / day`]})]}),(0,v.jsxs)(`div`,{className:`relative`,children:[c&&(0,v.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,v.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,v.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,v.jsxs)(`div`,{className:`flex flex-col gap-0.5`,children:[(0,v.jsxs)(`span`,{className:`flex items-center gap-1.5 text-xs`,children:[(0,v.jsx)(`span`,{className:`inline-block w-2 h-2 rounded-sm bg-success shrink-0`}),(0,v.jsxs)(`span`,{className:`font-mono font-semibold`,children:[`+`,(c.linesAdded||0).toLocaleString()]}),(0,v.jsx)(`span`,{className:`opacity-50`,children:`added`})]}),(0,v.jsxs)(`span`,{className:`flex items-center gap-1.5 text-xs`,children:[(0,v.jsx)(`span`,{className:`inline-block w-2 h-2 rounded-sm bg-error shrink-0`}),(0,v.jsxs)(`span`,{className:`font-mono font-semibold`,children:[`-`,(c.linesRemoved||0).toLocaleString()]}),(0,v.jsx)(`span`,{className:`opacity-50`,children:`removed`})]}),(c.filesChanged||0)>0&&(0,v.jsx)(`span`,{className:`flex items-center gap-1.5 text-xs`,children:(0,v.jsxs)(`span`,{className:`opacity-50`,children:[c.filesChanged,` file`,c.filesChanged===1?``:`s`]})})]})]})}),(0,v.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,v.jsxs)(`div`,{className:`flex-1 flex flex-col cursor-default`,onMouseEnter:()=>r(t),onMouseLeave:()=>r(null),children:[(0,v.jsxs)(`div`,{className:`relative`,style:{height:64},children:[l>0&&(0,v.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,v.jsx)(`div`,{className:`absolute inset-0 bg-base-content/5 rounded-sm`})]}),(0,v.jsx)(`div`,{className:`h-px transition-colors duration-100 ${f?`bg-base-content/20`:`bg-base-300`}`}),(0,v.jsxs)(`div`,{className:`relative`,style:{height:24},children:[u>0&&(0,v.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,v.jsx)(`div`,{className:`absolute inset-0 bg-base-content/5 rounded-sm`})]})]},e.date)})}),(0,v.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,v.jsx)(`div`,{className:`flex-1 overflow-hidden`,children:o&&(0,v.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 k(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 A(e){return e==null||!Number.isFinite(e)?`–`:e>=1e3?`${(e/1e3).toFixed(1)}K`:Math.round(e).toString()}function j({icon:e,iconClass:t,title:n,avg:r,median:i,n:a,formatValue:o,unit:s}){return(0,v.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,v.jsx)(`div`,{className:`stat-figure ${t}`,children:(0,v.jsx)(e,{className:`size-6`})}),(0,v.jsx)(`div`,{className:`stat-title`,children:n}),(0,v.jsxs)(`div`,{className:`stat-value text-2xl ${t}`,children:[o(r),s&&(0,v.jsx)(`span`,{className:`text-base font-normal opacity-50 ml-1`,children:s})]}),(0,v.jsxs)(`div`,{className:`stat-desc`,children:[i==null?`–`:`median ${o(i)}`,a!=null&&(0,v.jsxs)(`span`,{className:`opacity-40`,children:[` · n=`,a]})]})]})}var M=n(`/analytics`)({component:z});function N({h:e=`h-28`}){return(0,v.jsx)(`div`,{className:`skeleton-card ${e} w-full rounded-box`})}function P(){let{data:e}=g(),{data:t}=a(),n=e?.overall?.totalTokens||0,r=e?.byPhase||null,o=s(e?.daily,32),u=new Date().toISOString().slice(0,10),p=o.find(e=>e.date===u),m=p?.totalTokens||0,h=o.reduce((e,t)=>e+(t.totalTokens||0),0),_=o.reduce((e,t)=>e+(t.events||0),0),S=p?.events||0,w=(()=>{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})(),T=w.reduce((e,t)=>e+(t.linesAdded||0),0),E=w.reduce((e,t)=>e+(t.linesRemoved||0),0);return e?(0,v.jsx)(`section`,{children:(0,v.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-7 gap-4`,children:[(0,v.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,v.jsx)(`div`,{className:`stat-figure text-primary`,children:(0,v.jsx)(f,{className:`size-6`})}),(0,v.jsx)(`div`,{className:`stat-title`,children:`Total Tokens`}),(0,v.jsx)(`div`,{className:`stat-value text-2xl`,children:(0,v.jsx)(x,{value:n})}),(0,v.jsx)(`div`,{className:`stat-desc font-mono`,children:b(n)})]}),(0,v.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,v.jsx)(`div`,{className:`stat-figure text-accent`,children:(0,v.jsx)(c,{className:`size-6`})}),(0,v.jsx)(`div`,{className:`stat-title`,children:`Tokens Today`}),(0,v.jsx)(`div`,{className:`stat-value text-2xl`,children:(0,v.jsx)(x,{value:m})}),(0,v.jsxs)(`div`,{className:`stat-desc`,children:[`30d: `,y(h)]})]}),(0,v.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,v.jsx)(`div`,{className:`stat-figure text-secondary`,children:(0,v.jsx)(i,{className:`size-6`})}),(0,v.jsx)(`div`,{className:`stat-title`,children:`Total Events`}),(0,v.jsx)(`div`,{className:`stat-value text-2xl`,children:(0,v.jsx)(x,{value:_,format:e=>String(e||0)})}),(0,v.jsxs)(`div`,{className:`stat-desc`,children:[`Today: `,S]})]}),(0,v.jsxs)(`div`,{className:`stat bg-base-200 rounded-box xl:col-span-2 overflow-hidden`,children:[(0,v.jsx)(`div`,{className:`stat-figure text-info`,children:(0,v.jsx)(d,{className:`size-6`})}),(0,v.jsx)(`div`,{className:`stat-title`,children:`Phase Split`}),(0,v.jsx)(`div`,{className:`stat-value text-2xl p-0`,children:r?(0,v.jsx)(C,{byPhase:r}):(0,v.jsx)(`span`,{className:`opacity-30`,children:`-`})})]}),(0,v.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,v.jsx)(`div`,{className:`stat-figure text-success`,children:(0,v.jsx)(l,{className:`size-6`})}),(0,v.jsx)(`div`,{className:`stat-title`,children:`Lines Added`}),(0,v.jsx)(`div`,{className:`stat-value text-2xl text-success`,children:(0,v.jsx)(x,{value:T,format:e=>e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e||0)})}),(0,v.jsx)(`div`,{className:`stat-desc`,children:`30d total`})]}),(0,v.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,v.jsx)(`div`,{className:`stat-figure text-error`,children:(0,v.jsx)(l,{className:`size-6`})}),(0,v.jsx)(`div`,{className:`stat-title`,children:`Lines Removed`}),(0,v.jsx)(`div`,{className:`stat-value text-2xl text-error`,children:(0,v.jsx)(x,{value:E,format:e=>e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e||0)})}),(0,v.jsx)(`div`,{className:`stat-desc`,children:`30d total`})]})]})}):(0,v.jsx)(N,{h:`h-32`})}function F(){let{data:e}=g(),{data:t}=a(),n=s(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,v.jsxs)(`section`,{className:`bg-base-200 rounded-box p-5`,children:[(0,v.jsx)(`div`,{className:`flex items-center justify-between mb-4`,children:(0,v.jsxs)(`h2`,{className:`text-sm font-semibold flex items-center gap-2`,children:[(0,v.jsx)(p,{className:`size-4 text-primary`}),`Daily Activity`]})}),(0,v.jsx)(T,{daily:n}),(0,v.jsx)(`div`,{className:`border-t border-base-300 my-5`}),(0,v.jsx)(O,{daily:r})]}):(0,v.jsx)(N,{h:`h-52`})}function I(){let{data:e}=o(),t=e?.ok?e:null;return e?(0,v.jsxs)(`section`,{className:`bg-base-200 rounded-box p-5`,children:[(0,v.jsxs)(`h2`,{className:`text-sm font-semibold flex items-center gap-2 mb-4`,children:[(0,v.jsx)(m,{className:`size-4 text-warning`}),`Engineering KPIs`,t?.sampleSize>0&&(0,v.jsxs)(`span`,{className:`text-xs font-normal opacity-40 ml-1`,children:[`based on `,t.sampleSize,` completed issue`,t.sampleSize===1?``:`s`]})]}),(0,v.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-4 gap-4`,children:[(0,v.jsx)(j,{icon:c,iconClass:`text-primary`,title:`Issue Cycle Time`,avg:t?.issueCycleTimeDays?.avg??null,median:t?.issueCycleTimeDays?.median??null,n:t?.issueCycleTimeDays?.n??null,formatValue:k}),(0,v.jsx)(j,{icon:u,iconClass:`text-secondary`,title:`PR Cycle Time`,avg:t?.prCycleTimeDays?.avg??null,median:t?.prCycleTimeDays?.median??null,n:t?.prCycleTimeDays?.n??null,formatValue:k}),(0,v.jsx)(j,{icon:m,iconClass:`text-warning`,title:`Review Turnaround`,avg:t?.reviewTurnaroundDays?.avg??null,median:t?.reviewTurnaroundDays?.median??null,n:t?.reviewTurnaroundDays?.n??null,formatValue:k}),(0,v.jsx)(j,{icon:l,iconClass:`text-info`,title:`PR Size`,avg:t?.prSizeLines?.avg??null,median:t?.prSizeLines?.median??null,n:t?.prSizeLines?.n??null,formatValue:A,unit:`lines`})]})]}):(0,v.jsx)(N,{h:`h-36`})}function L(){let{data:e}=g(),t=e?.topIssues||[];return e?t.length===0?null:(0,v.jsxs)(`section`,{className:`bg-base-200 rounded-box p-5`,children:[(0,v.jsxs)(`h2`,{className:`text-sm font-semibold flex items-center gap-2 mb-4`,children:[(0,v.jsx)(f,{className:`size-4 text-accent`}),`Top Issues by Token Usage`]}),(0,v.jsx)(D,{topIssues:t})]}):(0,v.jsx)(N,{h:`h-40`})}function R(){let{data:e}=g(),t=e?.byModel||{};return e?Object.keys(t).length===0?null:(0,v.jsxs)(`section`,{className:`bg-base-200 rounded-box p-5`,children:[(0,v.jsxs)(`h2`,{className:`text-sm font-semibold flex items-center gap-2 mb-4`,children:[(0,v.jsx)(h,{className:`size-4 text-info`}),`Model Breakdown`]}),(0,v.jsx)(E,{byModel:t})]}):(0,v.jsx)(N,{h:`h-40`})}function z(){return(0,v.jsx)(`div`,{className:`flex-1 flex flex-col min-h-0 px-4 pb-4 pt-3 overflow-y-auto`,children:(0,v.jsxs)(`div`,{className:`max-w-6xl w-full mx-auto space-y-6`,children:[(0,v.jsx)(P,{}),(0,v.jsx)(F,{}),(0,v.jsx)(I,{}),(0,v.jsx)(L,{}),(0,v.jsx)(R,{})]})})}export{M as Route};
1
+ import{n as e}from"./rolldown-runtime-DF2fYuay.js";import{I as t,h as n,o as r}from"./vendor-D-IqxHHu.js";import{R as i,S as a,U as o,V as s,_ as c,g as l,k as u,m as d,n as f,o as p,s as m,x as h,z as g}from"./index-CSquFPSf.js";var _=e(t(),1),v=n();function y(e){return!e||e===0?`0`:e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e)}function b(e){return!e||e===0?`0`:e.toLocaleString()}function x({value:e,format:t=y,className:n=``}){let[r,i]=(0,_.useState)(()=>t(e)),a=(0,_.useRef)(e),o=(0,_.useRef)(null);return(0,_.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,v.jsx)(`span`,{className:`${n} inline-block tabular-nums`,children:r})}var S=[{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 C({byPhase:e}){if(!e)return null;let t=S.reduce((t,n)=>t+(e[n.key]?.totalTokens||0),0);return t===0?null:(0,v.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,v.jsx)(`div`,{className:`flex h-4 rounded-full overflow-hidden bg-base-300 w-full`,children:S.map(n=>{let r=e[n.key]?.totalTokens||0,i=r/t*100;return i===0?null:(0,v.jsx)(`div`,{className:`${n.color} opacity-80 transition-all duration-500`,style:{width:`${i}%`},title:`${n.label}: ${b(r)} (${Math.round(i)}%)`},n.key)})}),(0,v.jsx)(`div`,{className:`flex items-center gap-3 flex-wrap text-xs`,children:S.map(n=>{let r=e[n.key]?.totalTokens||0,i=t>0?Math.round(r/t*100):0;return r===0?null:(0,v.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,v.jsx)(`span`,{className:`inline-block size-2 rounded-full ${n.color} shrink-0`}),(0,v.jsx)(`span`,{className:`opacity-60`,children:n.label}),(0,v.jsx)(`span`,{className:`font-mono font-semibold`,children:y(r)}),(0,v.jsxs)(`span`,{className:`opacity-40`,children:[`(`,i,`%)`]})]},n.key)})})]})}function w({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,v.jsxs)(`div`,{className:`relative`,children:[(0,v.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs opacity-50 mb-2`,children:[(0,v.jsx)(`span`,{className:`inline-block w-2.5 h-2.5 rounded-sm ${n}`}),r]}),f&&(0,v.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,v.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,v.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,v.jsxs)(`span`,{className:`flex items-center gap-1.5 text-xs`,children:[(0,v.jsx)(`span`,{className:`inline-block w-2 h-2 rounded-sm ${n} shrink-0`}),(0,v.jsx)(`span`,{className:`font-mono font-semibold`,children:c?c(f[t]||0):(f[t]||0).toLocaleString()})]})]})}),(0,v.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,v.jsxs)(`div`,{className:`flex-1 relative cursor-default`,onMouseEnter:()=>s?.(r),onMouseLeave:()=>s?.(null),children:[c>0&&(0,v.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,v.jsx)(`div`,{className:`absolute inset-0 bg-base-content/5 rounded-sm`})]},e.date)})}),a&&(0,v.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,v.jsx)(`div`,{className:`flex-1 overflow-hidden`,children:i&&(0,v.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 T({daily:e}){let[t,n]=(0,_.useState)(null),r=e||[];return(0,v.jsxs)(`div`,{className:`space-y-4`,children:[(0,v.jsx)(w,{data:r,valueKey:`totalTokens`,barClass:`bg-primary`,label:`Tokens / day`,height:64,showXAxis:!1,hoveredIdx:t,onHover:n,formatTooltip:e=>e.toLocaleString()}),(0,v.jsx)(w,{data:r,valueKey:`events`,barClass:`bg-secondary`,label:`Events / day`,height:36,showXAxis:!0,hoveredIdx:t,onHover:n})]})}function E({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,v.jsx)(`div`,{className:`overflow-x-auto`,children:(0,v.jsxs)(`table`,{className:`table table-sm`,children:[(0,v.jsx)(`thead`,{children:(0,v.jsxs)(`tr`,{children:[(0,v.jsx)(`th`,{children:`Model`}),(0,v.jsx)(`th`,{className:`text-right`,children:`Input`}),(0,v.jsx)(`th`,{className:`text-right`,children:`Output`}),(0,v.jsx)(`th`,{className:`text-right`,children:`Total`}),(0,v.jsx)(`th`,{className:`text-right`,children:`Share`})]})}),(0,v.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,v.jsxs)(`tr`,{children:[(0,v.jsxs)(`td`,{className:`flex items-center gap-2`,children:[(0,v.jsx)(`span`,{className:`inline-block w-2.5 h-2.5 rounded-full ${r} shrink-0`}),(0,v.jsx)(`span`,{className:`font-mono text-xs`,children:e.model})]}),(0,v.jsx)(`td`,{className:`text-right font-mono text-xs`,children:y(e.inputTokens)}),(0,v.jsx)(`td`,{className:`text-right font-mono text-xs`,children:y(e.outputTokens)}),(0,v.jsx)(`td`,{className:`text-right font-mono text-xs font-semibold`,children:y(e.totalTokens)}),(0,v.jsx)(`td`,{className:`text-right`,children:(0,v.jsxs)(`div`,{className:`flex items-center justify-end gap-1.5`,children:[(0,v.jsx)(`div`,{className:`w-12 h-1.5 bg-base-300 rounded-full overflow-hidden`,children:(0,v.jsx)(`div`,{className:`h-full ${r} rounded-full`,style:{width:`${t}%`}})}),(0,v.jsxs)(`span`,{className:`text-xs opacity-60 w-8 text-right`,children:[t,`%`]})]})})]},e.model)})})]})})}function D({topIssues:e}){return!e||e.length===0?null:(0,v.jsx)(`div`,{className:`overflow-x-auto`,children:(0,v.jsxs)(`table`,{className:`table table-sm`,children:[(0,v.jsx)(`thead`,{children:(0,v.jsxs)(`tr`,{children:[(0,v.jsx)(`th`,{className:`w-20`,children:`Issue`}),(0,v.jsx)(`th`,{children:`Title`}),(0,v.jsx)(`th`,{className:`text-right`,children:`Tokens`}),(0,v.jsx)(`th`,{className:`hidden sm:table-cell`,children:`Phase Split`})]})}),(0,v.jsx)(`tbody`,{children:e.slice(0,10).map(e=>{let t=e.byPhase,n=e.totalTokens||0;return(0,v.jsxs)(`tr`,{children:[(0,v.jsx)(`td`,{className:`font-mono text-xs font-semibold text-primary`,children:e.identifier}),(0,v.jsx)(`td`,{className:`max-w-[200px] truncate text-sm`,title:e.title,children:e.title||`-`}),(0,v.jsx)(`td`,{className:`text-right font-mono text-xs font-semibold`,children:y(n)}),(0,v.jsx)(`td`,{className:`hidden sm:table-cell`,children:t?(0,v.jsx)(`div`,{className:`flex h-1.5 rounded-full overflow-hidden bg-base-300 w-24`,children:S.map(e=>{let r=t[e.key]?.totalTokens||0,i=n>0?r/n*100:0;return i===0?null:(0,v.jsx)(`div`,{className:`${e.color} opacity-80`,style:{width:`${i}%`},title:`${e.label}: ${y(r)}`},e.key)})}):(0,v.jsx)(`span`,{className:`opacity-30 text-xs`,children:`-`})})]},e.id||e.identifier)})})]})})}function O({daily:e}){let t=e||[],[n,r]=(0,_.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,v.jsxs)(`div`,{children:[(0,v.jsxs)(`div`,{className:`flex items-center gap-5 mb-3`,children:[(0,v.jsxs)(`span`,{className:`flex items-center gap-1.5 text-xs opacity-50`,children:[(0,v.jsx)(`span`,{className:`inline-block w-2.5 h-2.5 rounded-sm bg-success`}),`Lines added / day`]}),(0,v.jsxs)(`span`,{className:`flex items-center gap-1.5 text-xs opacity-50`,children:[(0,v.jsx)(`span`,{className:`inline-block w-2.5 h-2.5 rounded-sm bg-error`}),`Lines removed / day`]})]}),(0,v.jsxs)(`div`,{className:`relative`,children:[c&&(0,v.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,v.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,v.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,v.jsxs)(`div`,{className:`flex flex-col gap-0.5`,children:[(0,v.jsxs)(`span`,{className:`flex items-center gap-1.5 text-xs`,children:[(0,v.jsx)(`span`,{className:`inline-block w-2 h-2 rounded-sm bg-success shrink-0`}),(0,v.jsxs)(`span`,{className:`font-mono font-semibold`,children:[`+`,(c.linesAdded||0).toLocaleString()]}),(0,v.jsx)(`span`,{className:`opacity-50`,children:`added`})]}),(0,v.jsxs)(`span`,{className:`flex items-center gap-1.5 text-xs`,children:[(0,v.jsx)(`span`,{className:`inline-block w-2 h-2 rounded-sm bg-error shrink-0`}),(0,v.jsxs)(`span`,{className:`font-mono font-semibold`,children:[`-`,(c.linesRemoved||0).toLocaleString()]}),(0,v.jsx)(`span`,{className:`opacity-50`,children:`removed`})]}),(c.filesChanged||0)>0&&(0,v.jsx)(`span`,{className:`flex items-center gap-1.5 text-xs`,children:(0,v.jsxs)(`span`,{className:`opacity-50`,children:[c.filesChanged,` file`,c.filesChanged===1?``:`s`]})})]})]})}),(0,v.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,v.jsxs)(`div`,{className:`flex-1 flex flex-col cursor-default`,onMouseEnter:()=>r(t),onMouseLeave:()=>r(null),children:[(0,v.jsxs)(`div`,{className:`relative`,style:{height:64},children:[l>0&&(0,v.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,v.jsx)(`div`,{className:`absolute inset-0 bg-base-content/5 rounded-sm`})]}),(0,v.jsx)(`div`,{className:`h-px transition-colors duration-100 ${f?`bg-base-content/20`:`bg-base-300`}`}),(0,v.jsxs)(`div`,{className:`relative`,style:{height:24},children:[u>0&&(0,v.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,v.jsx)(`div`,{className:`absolute inset-0 bg-base-content/5 rounded-sm`})]})]},e.date)})}),(0,v.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,v.jsx)(`div`,{className:`flex-1 overflow-hidden`,children:o&&(0,v.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 k(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 A(e){return e==null||!Number.isFinite(e)?`–`:e>=1e3?`${(e/1e3).toFixed(1)}K`:Math.round(e).toString()}function j({icon:e,iconClass:t,title:n,avg:r,median:i,n:a,formatValue:o,unit:s}){return(0,v.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,v.jsx)(`div`,{className:`stat-figure ${t}`,children:(0,v.jsx)(e,{className:`size-6`})}),(0,v.jsx)(`div`,{className:`stat-title`,children:n}),(0,v.jsxs)(`div`,{className:`stat-value text-2xl ${t}`,children:[o(r),s&&(0,v.jsx)(`span`,{className:`text-base font-normal opacity-50 ml-1`,children:s})]}),(0,v.jsxs)(`div`,{className:`stat-desc`,children:[i==null?`–`:`median ${o(i)}`,a!=null&&(0,v.jsxs)(`span`,{className:`opacity-40`,children:[` · n=`,a]})]})]})}var M=r(`/analytics`)({component:z});function N({h:e=`h-28`}){return(0,v.jsx)(`div`,{className:`skeleton-card ${e} w-full rounded-box`})}function P(){let{data:e}=s(),{data:t}=i(),n=e?.overall?.totalTokens||0,r=e?.byPhase||null,l=o(e?.daily,32),p=new Date().toISOString().slice(0,10),m=l.find(e=>e.date===p),h=m?.totalTokens||0,g=l.reduce((e,t)=>e+(t.totalTokens||0),0),_=l.reduce((e,t)=>e+(t.events||0),0),S=m?.events||0,w=(()=>{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})(),T=w.reduce((e,t)=>e+(t.linesAdded||0),0),E=w.reduce((e,t)=>e+(t.linesRemoved||0),0);return e?(0,v.jsx)(`section`,{children:(0,v.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-7 gap-4`,children:[(0,v.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,v.jsx)(`div`,{className:`stat-figure text-primary`,children:(0,v.jsx)(f,{className:`size-6`})}),(0,v.jsx)(`div`,{className:`stat-title`,children:`Total Tokens`}),(0,v.jsx)(`div`,{className:`stat-value text-2xl`,children:(0,v.jsx)(x,{value:n})}),(0,v.jsx)(`div`,{className:`stat-desc font-mono`,children:b(n)})]}),(0,v.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,v.jsx)(`div`,{className:`stat-figure text-accent`,children:(0,v.jsx)(a,{className:`size-6`})}),(0,v.jsx)(`div`,{className:`stat-title`,children:`Tokens Today`}),(0,v.jsx)(`div`,{className:`stat-value text-2xl`,children:(0,v.jsx)(x,{value:h})}),(0,v.jsxs)(`div`,{className:`stat-desc`,children:[`30d: `,y(g)]})]}),(0,v.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,v.jsx)(`div`,{className:`stat-figure text-secondary`,children:(0,v.jsx)(u,{className:`size-6`})}),(0,v.jsx)(`div`,{className:`stat-title`,children:`Total Events`}),(0,v.jsx)(`div`,{className:`stat-value text-2xl`,children:(0,v.jsx)(x,{value:_,format:e=>String(e||0)})}),(0,v.jsxs)(`div`,{className:`stat-desc`,children:[`Today: `,S]})]}),(0,v.jsxs)(`div`,{className:`stat bg-base-200 rounded-box xl:col-span-2 overflow-hidden`,children:[(0,v.jsx)(`div`,{className:`stat-figure text-info`,children:(0,v.jsx)(d,{className:`size-6`})}),(0,v.jsx)(`div`,{className:`stat-title`,children:`Phase Split`}),(0,v.jsx)(`div`,{className:`stat-value text-2xl p-0`,children:r?(0,v.jsx)(C,{byPhase:r}):(0,v.jsx)(`span`,{className:`opacity-30`,children:`-`})})]}),(0,v.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,v.jsx)(`div`,{className:`stat-figure text-success`,children:(0,v.jsx)(c,{className:`size-6`})}),(0,v.jsx)(`div`,{className:`stat-title`,children:`Lines Added`}),(0,v.jsx)(`div`,{className:`stat-value text-2xl text-success`,children:(0,v.jsx)(x,{value:T,format:e=>e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e||0)})}),(0,v.jsx)(`div`,{className:`stat-desc`,children:`30d total`})]}),(0,v.jsxs)(`div`,{className:`stat bg-base-200 rounded-box`,children:[(0,v.jsx)(`div`,{className:`stat-figure text-error`,children:(0,v.jsx)(c,{className:`size-6`})}),(0,v.jsx)(`div`,{className:`stat-title`,children:`Lines Removed`}),(0,v.jsx)(`div`,{className:`stat-value text-2xl text-error`,children:(0,v.jsx)(x,{value:E,format:e=>e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e||0)})}),(0,v.jsx)(`div`,{className:`stat-desc`,children:`30d total`})]})]})}):(0,v.jsx)(N,{h:`h-32`})}function F(){let{data:e}=s(),{data:t}=i(),n=o(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,v.jsxs)(`section`,{className:`bg-base-200 rounded-box p-5`,children:[(0,v.jsx)(`div`,{className:`flex items-center justify-between mb-4`,children:(0,v.jsxs)(`h2`,{className:`text-sm font-semibold flex items-center gap-2`,children:[(0,v.jsx)(p,{className:`size-4 text-primary`}),`Daily Activity`]})}),(0,v.jsx)(T,{daily:n}),(0,v.jsx)(`div`,{className:`border-t border-base-300 my-5`}),(0,v.jsx)(O,{daily:r})]}):(0,v.jsx)(N,{h:`h-52`})}function I(){let{data:e}=g(),t=e?.ok?e:null;return e?(0,v.jsxs)(`section`,{className:`bg-base-200 rounded-box p-5`,children:[(0,v.jsxs)(`h2`,{className:`text-sm font-semibold flex items-center gap-2 mb-4`,children:[(0,v.jsx)(m,{className:`size-4 text-warning`}),`Engineering KPIs`,t?.sampleSize>0&&(0,v.jsxs)(`span`,{className:`text-xs font-normal opacity-40 ml-1`,children:[`based on `,t.sampleSize,` completed issue`,t.sampleSize===1?``:`s`]})]}),(0,v.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-4 gap-4`,children:[(0,v.jsx)(j,{icon:a,iconClass:`text-primary`,title:`Issue Cycle Time`,avg:t?.issueCycleTimeDays?.avg??null,median:t?.issueCycleTimeDays?.median??null,n:t?.issueCycleTimeDays?.n??null,formatValue:k}),(0,v.jsx)(j,{icon:l,iconClass:`text-secondary`,title:`PR Cycle Time`,avg:t?.prCycleTimeDays?.avg??null,median:t?.prCycleTimeDays?.median??null,n:t?.prCycleTimeDays?.n??null,formatValue:k}),(0,v.jsx)(j,{icon:m,iconClass:`text-warning`,title:`Review Turnaround`,avg:t?.reviewTurnaroundDays?.avg??null,median:t?.reviewTurnaroundDays?.median??null,n:t?.reviewTurnaroundDays?.n??null,formatValue:k}),(0,v.jsx)(j,{icon:c,iconClass:`text-info`,title:`PR Size`,avg:t?.prSizeLines?.avg??null,median:t?.prSizeLines?.median??null,n:t?.prSizeLines?.n??null,formatValue:A,unit:`lines`})]})]}):(0,v.jsx)(N,{h:`h-36`})}function L(){let{data:e}=s(),t=e?.topIssues||[];return e?t.length===0?null:(0,v.jsxs)(`section`,{className:`bg-base-200 rounded-box p-5`,children:[(0,v.jsxs)(`h2`,{className:`text-sm font-semibold flex items-center gap-2 mb-4`,children:[(0,v.jsx)(f,{className:`size-4 text-accent`}),`Top Issues by Token Usage`]}),(0,v.jsx)(D,{topIssues:t})]}):(0,v.jsx)(N,{h:`h-40`})}function R(){let{data:e}=s(),t=e?.byModel||{};return e?Object.keys(t).length===0?null:(0,v.jsxs)(`section`,{className:`bg-base-200 rounded-box p-5`,children:[(0,v.jsxs)(`h2`,{className:`text-sm font-semibold flex items-center gap-2 mb-4`,children:[(0,v.jsx)(h,{className:`size-4 text-info`}),`Model Breakdown`]}),(0,v.jsx)(E,{byModel:t})]}):(0,v.jsx)(N,{h:`h-40`})}function z(){return(0,v.jsx)(`div`,{className:`flex-1 flex flex-col min-h-0 px-4 pb-4 pt-3 overflow-y-auto`,children:(0,v.jsxs)(`div`,{className:`max-w-6xl w-full mx-auto space-y-6`,children:[(0,v.jsx)(P,{}),(0,v.jsx)(F,{}),(0,v.jsx)(I,{}),(0,v.jsx)(L,{}),(0,v.jsx)(R,{})]})})}export{M as Route};
@@ -1 +1 @@
1
- import{n as e}from"./rolldown-runtime-DF2fYuay.js";import{I as t}from"./vendor-BTlTWMUF.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.forwardRef)(({color:e=`currentColor`,size:t=24,strokeWidth:r=2,absoluteStrokeWidth:i,className:a=``,children:l,iconNode:u,...d},f)=>(0,c.createElement)(`svg`,{ref:f,...o,width:t,height:t,stroke:e,strokeWidth:i?Number(r)*24/Number(t):r,className:n(`lucide`,a),...!l&&!s(d)&&{"aria-hidden":`true`},...d},[...u.map(([e,t])=>(0,c.createElement)(e,t)),...Array.isArray(l)?l:[l]])),u=(e,t)=>{let i=(0,c.forwardRef)(({className:i,...o},s)=>(0,c.createElement)(l,{ref:s,iconNode:t,className:n(`lucide-${r(a(e))}`,`lucide-${e}`,i),...o}));return i.displayName=a(e),i};export{u as t};
1
+ import{n as e}from"./rolldown-runtime-DF2fYuay.js";import{I as t}from"./vendor-D-IqxHHu.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.forwardRef)(({color:e=`currentColor`,size:t=24,strokeWidth:r=2,absoluteStrokeWidth:i,className:a=``,children:l,iconNode:u,...d},f)=>(0,c.createElement)(`svg`,{ref:f,...o,width:t,height:t,stroke:e,strokeWidth:i?Number(r)*24/Number(t):r,className:n(`lucide`,a),...!l&&!s(d)&&{"aria-hidden":`true`},...d},[...u.map(([e,t])=>(0,c.createElement)(e,t)),...Array.isArray(l)?l:[l]])),u=(e,t)=>{let i=(0,c.forwardRef)(({className:i,...o},s)=>(0,c.createElement)(l,{ref:s,iconNode:t,className:n(`lucide-${r(a(e))}`,`lucide-${e}`,i),...o}));return i.displayName=a(e),i};export{u as t};