specrails-hub 1.25.5 → 1.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/cli/dist/specrails-hub.js +80 -22
  2. package/client/dist/assets/{ActivityFeedPage-DGG6pwZ4.js → ActivityFeedPage-tERWyUTH.js} +1 -1
  3. package/client/dist/assets/AnalyticsPage-DUCp-pHx.js +4 -0
  4. package/client/dist/assets/{DocsDialog-3n-boiJy.js → DocsDialog-C-EhPPrX.js} +2 -2
  5. package/client/dist/assets/{DocsPage-H0qeQJYd.js → DocsPage-BA5sORSV.js} +2 -2
  6. package/client/dist/assets/HubAnalyticsPage-Dao1HNci.js +1 -0
  7. package/client/dist/assets/{JobDetailPage-BXNmkjvi.js → JobDetailPage-CdbcXcfe.js} +4 -4
  8. package/client/dist/assets/JobsPage-CmgiX4PP.js +1 -0
  9. package/client/dist/assets/{BarChart-BOsGtbqJ.js → dracula-colors-C67D9ngQ.js} +2 -2
  10. package/client/dist/assets/index-Bq1AywmF.css +2 -0
  11. package/client/dist/assets/index-CGeGMvIX.js +112 -0
  12. package/client/dist/assets/{lib-DnnFAwDK.js → lib-T3dOmNkJ.js} +1 -1
  13. package/client/dist/assets/{useHub-BeVU84eS.js → useHub-D5e-JfkR.js} +1 -1
  14. package/client/dist/index.html +4 -6
  15. package/docs/general/getting-started.md +65 -70
  16. package/docs/general/platform-overview.md +54 -82
  17. package/docs/product/features.md +78 -101
  18. package/docs/product/workflows.md +55 -94
  19. package/package.json +1 -1
  20. package/server/dist/docs-router.js +1 -2
  21. package/server/dist/hub-analytics.js +0 -213
  22. package/server/dist/hub-router.js +0 -54
  23. package/server/dist/project-registry.js +15 -3
  24. package/server/dist/project-router.js +14 -3
  25. package/server/dist/queue-manager.js +10 -3
  26. package/client/dist/assets/AnalyticsPage-D3SVaoxG.js +0 -4
  27. package/client/dist/assets/HubAnalyticsPage-B33p4BG4.js +0 -1
  28. package/client/dist/assets/HubOverviewPage-CRX2gpc-.js +0 -1
  29. package/client/dist/assets/JobsPage-bm-srMLz.js +0 -1
  30. package/client/dist/assets/dracula-colors-B0g266RC.js +0 -1
  31. package/client/dist/assets/en-US-DUO_uYan.js +0 -1
  32. package/client/dist/assets/index-94S85Lsd.js +0 -112
  33. package/client/dist/assets/index-BjiliAvI.css +0 -2
  34. package/client/dist/assets/x-C53vXlx8.js +0 -1
  35. package/docs/engineering/engineering-standards.md +0 -67
  36. package/docs/engineering/specrails-web-status.md +0 -117
  37. package/docs/ux/hub-audit.md +0 -131
  38. /package/client/dist/assets/{useSharedWebSocket-j0gqXR8o.js → useSharedWebSocket-B3JjQYKi.js} +0 -0
@@ -43,8 +43,9 @@ exports.KNOWN_VERBS = new Set([
43
43
  'implement',
44
44
  'batch-implement',
45
45
  'why',
46
- 'product-backlog',
47
- 'update-product-driven-backlog',
46
+ 'get-backlog-specs',
47
+ 'auto-propose-backlog-specs',
48
+ 'propose-spec',
48
49
  'refactor-recommender',
49
50
  'health-check',
50
51
  'compat-check',
@@ -79,8 +80,9 @@ function cliWarn(msg) {
79
80
  function parseArgs(argv) {
80
81
  // argv is process.argv.slice(2)
81
82
  let port = DEFAULT_PORT;
83
+ let projectOverride;
82
84
  const args = [...argv];
83
- // Extract --port <n> from any position
85
+ // Extract --port <n> and --project <name|path> from any position
84
86
  for (let i = 0; i < args.length; i++) {
85
87
  if (args[i] === '--port' && i + 1 < args.length) {
86
88
  const parsed = parseInt(args[i + 1], 10);
@@ -90,6 +92,11 @@ function parseArgs(argv) {
90
92
  args.splice(i, 2);
91
93
  i--;
92
94
  }
95
+ else if (args[i] === '--project' && i + 1 < args.length) {
96
+ projectOverride = args[i + 1];
97
+ args.splice(i, 2);
98
+ i--;
99
+ }
93
100
  }
94
101
  if (args[0] === '--version' || args[0] === '-v') {
95
102
  return { mode: 'version' };
@@ -119,16 +126,16 @@ function parseArgs(argv) {
119
126
  // Slash-prefixed command: pass through unchanged
120
127
  if (first.startsWith('/')) {
121
128
  const resolved = args.join(' ');
122
- return { mode: 'raw', resolved, port };
129
+ return { mode: 'raw', resolved, port, projectOverride };
123
130
  }
124
131
  // Known verb: inject /sr: prefix
125
132
  if (exports.KNOWN_VERBS.has(first)) {
126
133
  const resolved = `/sr:${args.join(' ')}`;
127
- return { mode: 'command', resolved, port };
134
+ return { mode: 'command', resolved, port, projectOverride };
128
135
  }
129
136
  // Unknown first token: treat as raw prompt
130
137
  const resolved = args.join(' ');
131
- return { mode: 'raw', resolved, port };
138
+ return { mode: 'raw', resolved, port, projectOverride };
132
139
  }
133
140
  function getVersion() {
134
141
  for (const rel of ['../package.json', '../../package.json']) {
@@ -166,16 +173,17 @@ ${bold('Usage:')}
166
173
  specrails-hub implement #42 Run a known specrails verb (prepends /sr:)
167
174
  specrails-hub batch-implement #40 #41 Batch implementation across issues
168
175
  specrails-hub why Explain recent changes
169
- specrails-hub product-backlog View prioritized product backlog
170
- specrails-hub update-product-driven-backlog Generate new feature ideas
176
+ specrails-hub get-backlog-specs View prioritized spec backlog
177
+ specrails-hub auto-propose-backlog-specs Generate new spec ideas
178
+ specrails-hub propose-spec Explore an idea and produce a spec
171
179
  specrails-hub refactor-recommender Find refactoring opportunities
172
180
  specrails-hub health-check Run codebase health check
173
181
  specrails-hub compat-check Check for breaking API changes
174
182
  specrails-hub "any raw prompt" Pass a raw prompt directly to claude
175
183
  specrails-hub --status Print manager status and exit
176
184
  specrails-hub --jobs Print recent job history and exit
177
- specrails-hub start|stop|add|remove|list Manage the hub (shorthand, no 'hub' prefix)
178
- specrails-hub hub <subcommand> Same, with explicit 'hub' prefix
185
+ specrails-hub start|stop|add|remove|list Manage the hub
186
+ specrails-hub --project <name|path> Override project (default: current directory)
179
187
  specrails-hub --port <n> Override default port (${DEFAULT_PORT})
180
188
  specrails-hub --version, -v Print version and exit
181
189
  specrails-hub --help, -h Show this help text
@@ -216,9 +224,30 @@ function detectWebManager(port) {
216
224
  // ---------------------------------------------------------------------------
217
225
  // HTTP helpers
218
226
  // ---------------------------------------------------------------------------
227
+ function loadHubToken() {
228
+ try {
229
+ const tokenPath = path_1.default.join(os_1.default.homedir(), '.specrails', 'hub.token');
230
+ const t = fs_1.default.readFileSync(tokenPath, 'utf-8').trim();
231
+ return t.length >= 32 ? t : null;
232
+ }
233
+ catch {
234
+ return null;
235
+ }
236
+ }
219
237
  function httpGet(url) {
220
238
  return new Promise((resolve, reject) => {
221
- const req = http_1.default.get(url, (res) => {
239
+ const token = loadHubToken();
240
+ const parsed = new URL(url);
241
+ const headers = {};
242
+ if (token)
243
+ headers['Authorization'] = `Bearer ${token}`;
244
+ const options = {
245
+ hostname: parsed.hostname,
246
+ port: parsed.port,
247
+ path: parsed.pathname + parsed.search,
248
+ headers,
249
+ };
250
+ const req = http_1.default.get(options, (res) => {
222
251
  let body = '';
223
252
  res.on('data', (chunk) => { body += chunk; });
224
253
  res.on('end', () => resolve({ status: res.statusCode ?? 0, body }));
@@ -230,15 +259,19 @@ function httpPost(url, payload) {
230
259
  return new Promise((resolve, reject) => {
231
260
  const data = JSON.stringify(payload);
232
261
  const urlObj = new URL(url);
262
+ const token = loadHubToken();
263
+ const headers = {
264
+ 'Content-Type': 'application/json',
265
+ 'Content-Length': Buffer.byteLength(data),
266
+ };
267
+ if (token)
268
+ headers['Authorization'] = `Bearer ${token}`;
233
269
  const options = {
234
270
  hostname: urlObj.hostname,
235
271
  port: urlObj.port,
236
272
  path: urlObj.pathname,
237
273
  method: 'POST',
238
- headers: {
239
- 'Content-Type': 'application/json',
240
- 'Content-Length': Buffer.byteLength(data),
241
- },
274
+ headers,
242
275
  };
243
276
  const req = http_1.default.request(options, (res) => {
244
277
  let body = '';
@@ -278,8 +311,30 @@ function printSummary(data) {
278
311
  const exitPart = ` exit: ${data.exitCode}`;
279
312
  process.stdout.write(`${doneLabel} ${durationPart}${costPart}${tokenPart}${exitPart}\n`);
280
313
  }
281
- async function resolveProjectFromCwd(baseUrl) {
314
+ async function resolveProjectFromCwd(baseUrl, projectOverride) {
282
315
  try {
316
+ // --project flag: resolve by path (absolute/relative) or by name
317
+ if (projectOverride) {
318
+ const isPathLike = projectOverride.startsWith('/') || projectOverride.startsWith('.');
319
+ if (isPathLike) {
320
+ const res = await httpGet(`${baseUrl}/api/hub/resolve?path=${encodeURIComponent(projectOverride)}`);
321
+ if (res.status === 200) {
322
+ const data = JSON.parse(res.body);
323
+ return data.project ?? null;
324
+ }
325
+ }
326
+ else {
327
+ // Resolve by name: fetch all projects and match
328
+ const res = await httpGet(`${baseUrl}/api/hub/projects`);
329
+ if (res.status === 200) {
330
+ const data = JSON.parse(res.body);
331
+ const match = (data.projects ?? []).find((p) => p.name.toLowerCase() === projectOverride.toLowerCase());
332
+ return match ?? null;
333
+ }
334
+ }
335
+ return null;
336
+ }
337
+ // Default: resolve from CWD
283
338
  const cwd = process.cwd();
284
339
  const res = await httpGet(`${baseUrl}/api/hub/resolve?path=${encodeURIComponent(cwd)}`);
285
340
  if (res.status === 200) {
@@ -292,18 +347,20 @@ async function resolveProjectFromCwd(baseUrl) {
292
347
  }
293
348
  return null;
294
349
  }
295
- async function runViaWebManager(command, baseUrl) {
350
+ async function runViaWebManager(command, baseUrl, projectOverride) {
296
351
  // Detect hub mode: check if /api/hub/state is reachable
297
352
  let spawnUrl = `${baseUrl}/api/spawn`;
298
353
  let jobApiBase = `${baseUrl}/api`;
299
354
  try {
300
355
  const hubCheck = await httpGet(`${baseUrl}/api/hub/state`);
301
356
  if (hubCheck.status === 200) {
302
- // Hub mode: resolve project from CWD
303
- const project = await resolveProjectFromCwd(baseUrl);
357
+ // Hub mode: resolve project from CWD or --project override
358
+ const project = await resolveProjectFromCwd(baseUrl, projectOverride);
304
359
  if (!project) {
305
- cliError('hub is running but no project registered for the current directory.\n' +
306
- ` Run: specrails-hub add ${process.cwd()}`);
360
+ const hint = projectOverride
361
+ ? `no project found matching: ${projectOverride}`
362
+ : `no project registered for the current directory.\n Run: specrails-hub add ${process.cwd()}`;
363
+ cliError(`hub is running but ${hint}`);
307
364
  return 1;
308
365
  }
309
366
  spawnUrl = `${baseUrl}/api/projects/${project.id}/spawn`;
@@ -994,9 +1051,10 @@ async function main() {
994
1051
  cliLog(`running: ${command}`);
995
1052
  const detection = await detectWebManager(port);
996
1053
  let exitCode;
1054
+ const projectOverride = (parsed.mode === 'command' || parsed.mode === 'raw') ? parsed.projectOverride : undefined;
997
1055
  if (detection.running) {
998
1056
  cliLog(`routing via manager at ${detection.baseUrl}`);
999
- exitCode = await runViaWebManager(command, detection.baseUrl);
1057
+ exitCode = await runViaWebManager(command, detection.baseUrl, projectOverride);
1000
1058
  }
1001
1059
  else {
1002
1060
  cliLog('manager not running — invoking claude directly');
@@ -1 +1 @@
1
- import{n as e,o as t,r as n}from"./createLucideIcon-j4o5em8U.js";import"./react-dom-CzrF8Nvy.js";import{n as r}from"./useHub-BeVU84eS.js";import"./useSharedWebSocket-j0gqXR8o.js";import{C as i,D as a,F as o,O as s,P as c,t as l,v as u}from"./index-94S85Lsd.js";var d=t(n(),1),f=e();function p(e){let t=Date.now()-new Date(e).getTime(),n=Math.floor(t/1e3);if(n<60)return`${n}s ago`;let r=Math.floor(n/60);if(r<60)return`${r}m ago`;let i=Math.floor(r/60);return i<24?`${i}h ago`:`${Math.floor(i/24)}d ago`}function m({type:e}){switch(e){case`job_completed`:return(0,f.jsx)(s,{className:`w-4 h-4 text-green-500 flex-shrink-0`});case`job_failed`:return(0,f.jsx)(a,{className:`w-4 h-4 text-red-500 flex-shrink-0`});case`job_canceled`:return(0,f.jsx)(c,{className:`w-4 h-4 text-muted-foreground flex-shrink-0`});default:return(0,f.jsx)(u,{className:`w-4 h-4 text-blue-500 flex-shrink-0`})}}function h(e){switch(e){case`job_completed`:return`Completed`;case`job_failed`:return`Failed`;case`job_canceled`:return`Canceled`;default:return`Started`}}function g(e){switch(e){case`job_completed`:return`text-green-500`;case`job_failed`:return`text-red-500`;case`job_canceled`:return`text-muted-foreground`;default:return`text-blue-500`}}function _(){let{activeProjectId:e}=r(),{items:t,loading:n,hasMore:a,loadMore:s}=l({activeProjectId:e}),c=(0,d.useRef)(null);return(0,d.useEffect)(()=>{let e=c.current;if(!e)return;let t=new IntersectionObserver(e=>{e[0].isIntersecting&&a&&!n&&s()},{threshold:.1});return t.observe(e),()=>t.disconnect()},[a,n,s]),(0,f.jsxs)(`div`,{className:`flex flex-col h-full overflow-hidden`,children:[(0,f.jsxs)(`div`,{className:`flex items-center gap-2 px-4 py-3 border-b border-border bg-background/50`,children:[(0,f.jsx)(o,{className:`w-4 h-4 text-muted-foreground`}),(0,f.jsx)(`h1`,{className:`text-sm font-medium`,children:`Activity`})]}),(0,f.jsxs)(`div`,{className:`flex-1 overflow-y-auto`,children:[n&&t.length===0?(0,f.jsx)(`div`,{className:`flex items-center justify-center h-32`,children:(0,f.jsx)(i,{className:`w-4 h-4 animate-spin text-muted-foreground`})}):t.length===0?(0,f.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-48 gap-2 text-muted-foreground`,children:[(0,f.jsx)(o,{className:`w-8 h-8 opacity-40`}),(0,f.jsx)(`p`,{className:`text-sm`,children:`No activity yet`}),(0,f.jsx)(`p`,{className:`text-xs opacity-70`,children:`Job events will appear here when jobs run`})]}):(0,f.jsx)(`ul`,{className:`divide-y divide-border/50`,children:t.map(e=>(0,f.jsxs)(`li`,{className:`flex items-center gap-3 px-4 py-2.5 hover:bg-accent/30 transition-colors`,children:[(0,f.jsx)(m,{type:e.type}),(0,f.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,f.jsx)(`p`,{className:`text-xs text-foreground truncate`,title:e.jobCommand,children:e.jobCommand}),(0,f.jsxs)(`div`,{className:`flex items-center gap-2 mt-0.5`,children:[(0,f.jsx)(`span`,{className:`text-xs font-medium ${g(e.type)}`,children:h(e.type)}),e.costUsd!=null&&(0,f.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`$`,e.costUsd.toFixed(4)]})]})]}),(0,f.jsx)(`span`,{className:`text-xs text-muted-foreground flex-shrink-0 tabular-nums`,children:p(e.timestamp)})]},`${e.type}:${e.jobId}`))}),(0,f.jsx)(`div`,{ref:c,className:`h-1`}),n&&t.length>0&&(0,f.jsx)(`div`,{className:`flex justify-center py-3`,children:(0,f.jsx)(i,{className:`w-4 h-4 animate-spin text-muted-foreground`})}),!a&&t.length>0&&(0,f.jsx)(`p`,{className:`text-center text-xs text-muted-foreground py-3`,children:`All activity loaded`})]})]})}export{_ as default};
1
+ import{n as e,o as t,r as n}from"./createLucideIcon-j4o5em8U.js";import"./react-dom-CzrF8Nvy.js";import{n as r}from"./useHub-D5e-JfkR.js";import"./useSharedWebSocket-B3JjQYKi.js";import{B as i,E as a,F as o,M as s,P as c,T as l,V as u}from"./index-CGeGMvIX.js";var d=t(n(),1),f=e();function p(e){let t=Date.now()-new Date(e).getTime(),n=Math.floor(t/1e3);if(n<60)return`${n}s ago`;let r=Math.floor(n/60);if(r<60)return`${r}m ago`;let i=Math.floor(r/60);return i<24?`${i}h ago`:`${Math.floor(i/24)}d ago`}function m({type:e}){switch(e){case`job_completed`:return(0,f.jsx)(o,{className:`w-4 h-4 text-green-500 flex-shrink-0`});case`job_failed`:return(0,f.jsx)(c,{className:`w-4 h-4 text-red-500 flex-shrink-0`});case`job_canceled`:return(0,f.jsx)(i,{className:`w-4 h-4 text-muted-foreground flex-shrink-0`});default:return(0,f.jsx)(a,{className:`w-4 h-4 text-blue-500 flex-shrink-0`})}}function h(e){switch(e){case`job_completed`:return`Completed`;case`job_failed`:return`Failed`;case`job_canceled`:return`Canceled`;default:return`Started`}}function g(e){switch(e){case`job_completed`:return`text-green-500`;case`job_failed`:return`text-red-500`;case`job_canceled`:return`text-muted-foreground`;default:return`text-blue-500`}}function _(){let{activeProjectId:e}=r(),{items:t,loading:n,hasMore:i,loadMore:a}=l({activeProjectId:e}),o=(0,d.useRef)(null);return(0,d.useEffect)(()=>{let e=o.current;if(!e)return;let t=new IntersectionObserver(e=>{e[0].isIntersecting&&i&&!n&&a()},{threshold:.1});return t.observe(e),()=>t.disconnect()},[i,n,a]),(0,f.jsxs)(`div`,{className:`flex flex-col h-full overflow-hidden`,children:[(0,f.jsxs)(`div`,{className:`flex items-center gap-2 px-4 py-3 border-b border-border bg-background/50`,children:[(0,f.jsx)(u,{className:`w-4 h-4 text-muted-foreground`}),(0,f.jsx)(`h1`,{className:`text-sm font-medium`,children:`Activity`})]}),(0,f.jsxs)(`div`,{className:`flex-1 overflow-y-auto`,children:[n&&t.length===0?(0,f.jsx)(`div`,{className:`flex items-center justify-center h-32`,children:(0,f.jsx)(s,{className:`w-4 h-4 animate-spin text-muted-foreground`})}):t.length===0?(0,f.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-48 gap-2 text-muted-foreground`,children:[(0,f.jsx)(u,{className:`w-8 h-8 opacity-40`}),(0,f.jsx)(`p`,{className:`text-sm`,children:`No activity yet`}),(0,f.jsx)(`p`,{className:`text-xs opacity-70`,children:`Job events will appear here when jobs run`})]}):(0,f.jsx)(`ul`,{className:`divide-y divide-border/50`,children:t.map(e=>(0,f.jsxs)(`li`,{className:`flex items-center gap-3 px-4 py-2.5 hover:bg-accent/30 transition-colors`,children:[(0,f.jsx)(m,{type:e.type}),(0,f.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,f.jsx)(`p`,{className:`text-xs text-foreground truncate`,title:e.jobCommand,children:e.jobCommand}),(0,f.jsxs)(`div`,{className:`flex items-center gap-2 mt-0.5`,children:[(0,f.jsx)(`span`,{className:`text-xs font-medium ${g(e.type)}`,children:h(e.type)}),e.costUsd!=null&&(0,f.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`$`,e.costUsd.toFixed(4)]})]})]}),(0,f.jsx)(`span`,{className:`text-xs text-muted-foreground flex-shrink-0 tabular-nums`,children:p(e.timestamp)})]},`${e.type}:${e.jobId}`))}),(0,f.jsx)(`div`,{ref:o,className:`h-1`}),n&&t.length>0&&(0,f.jsx)(`div`,{className:`flex justify-center py-3`,children:(0,f.jsx)(s,{className:`w-4 h-4 animate-spin text-muted-foreground`})}),!i&&t.length>0&&(0,f.jsx)(`p`,{className:`text-center text-xs text-muted-foreground py-3`,children:`All activity loaded`})]})]})}export{_ as default};
@@ -0,0 +1,4 @@
1
+ import{i as e,n as t,o as n,r,t as i}from"./createLucideIcon-j4o5em8U.js";import{t as a}from"./react-dom-CzrF8Nvy.js";import{n as o,r as s}from"./useHub-D5e-JfkR.js";import{n as c,t as l}from"./utils-DSsSbmuB.js";import{t as u}from"./ExportDropdown-DrRETS4C.js";import{$ as d,$t as f,A as p,At as m,B as h,Bt as g,C as _,Ct as v,D as y,Dt as b,E as x,Et as S,F as C,Ft as w,G as ee,Gt as te,H as ne,Ht as T,I as E,It as re,J as ie,Jt as ae,K as oe,Kt as se,L as ce,Lt as le,M as ue,Mt as D,N as de,Nt as fe,O as pe,Ot as me,P as he,Pt as ge,Q as _e,Qt as ve,R as ye,Rt as O,S as be,St as xe,T as Se,Tt as Ce,U as we,Ut as k,V as Te,Vt as Ee,W as De,Wt as A,X as Oe,Xt as j,Y as ke,Yt as Ae,Z as je,Zt as Me,_ as Ne,_n as Pe,_t as Fe,a as Ie,an as Le,at as Re,b as ze,bn as Be,bt as Ve,c as He,cn as Ue,ct as We,d as Ge,dn as Ke,dt as qe,en as Je,et as Ye,f as Xe,fn as Ze,ft as Qe,g as M,gn as $e,gt as et,h as N,hn as tt,ht as nt,i as rt,in as it,it as at,j as ot,jt as st,k as ct,kt as lt,l as ut,ln as dt,lt as P,m as F,mn as I,mt as ft,n as L,nn as pt,nt as R,o as mt,on as ht,ot as gt,p as _t,pn as vt,pt as yt,q as bt,qt as xt,r as St,rn as Ct,rt as wt,s as Tt,sn as Et,st as Dt,t as Ot,tn as kt,tt as At,u as jt,un as Mt,ut as Nt,v as z,vn as Pt,vt as Ft,w as It,wt as Lt,x as Rt,xn as zt,xt as Bt,y as Vt,yn as Ht,yt as Ut,z as Wt,zt as Gt}from"./dracula-colors-C67D9ngQ.js";import"./useSharedWebSocket-B3JjQYKi.js";import{I as Kt,R as qt,j as Jt}from"./index-CGeGMvIX.js";var Yt=i(`chevrons-up-down`,[[`path`,{d:`m7 15 5 5 5-5`,key:`1hf1tw`}],[`path`,{d:`m7 9 5-5 5 5`,key:`sgt6xg`}]]),Xt=i(`minus`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}]]),Zt=i(`trending-down`,[[`path`,{d:`M16 17h6v-6`,key:`t6n2it`}],[`path`,{d:`m22 17-8.5-8.5-5 5L2 7`,key:`x473p`}]]),B=n(r()),V=t();function Qt(e){return`$${e.toFixed(4)}`}function $t(e){if(e===null)return`—`;let t=Math.round(e/1e3),n=Math.floor(t/60),r=t%60;return n===0?`${r}s`:`${n}m ${r}s`}function en(e){return`${(e*100).toFixed(1)}%`}function tn(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e)}function nn(e){return e===null?null:`${e>0?`+`:``}${e.toFixed(1)}%`}function H({delta:e,deltaPct:t,lowerIsBetter:n=!1,formatter:r}){if(e===null)return null;let i=e>0,a=n?e<0:e>0,o=e===0,s=r?r(Math.abs(e)):e>0?`+${e}`:`${e}`,c=nn(t);return(0,V.jsxs)(`span`,{className:l(`inline-flex items-center gap-0.5 text-[10px] font-medium px-1.5 py-0.5 rounded`,o?`text-muted-foreground bg-muted/40`:a?`text-green-400 bg-green-400/10`:`text-red-400 bg-red-400/10`),children:[o?(0,V.jsx)(Xt,{className:`w-2.5 h-2.5`}):i?(0,V.jsx)(zt,{className:`w-2.5 h-2.5`}):(0,V.jsx)(Zt,{className:`w-2.5 h-2.5`}),c??s]})}function U({label:e,value:t,previousValue:n,badge:r}){return(0,V.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4 space-y-1`,children:[(0,V.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e}),(0,V.jsxs)(`div`,{className:`flex items-end justify-between gap-2`,children:[(0,V.jsxs)(`div`,{children:[(0,V.jsx)(`p`,{className:`text-xl font-semibold tabular-nums`,children:t}),n!=null&&(0,V.jsxs)(`p`,{className:`text-[10px] text-muted-foreground tabular-nums`,children:[`prev: `,n]})]}),r]})]})}function rn({kpi:e}){let t=e.previousPeriod;return(0,V.jsxs)(`div`,{className:`grid grid-cols-2 lg:grid-cols-5 gap-3`,children:[(0,V.jsx)(U,{label:`Total Cost`,value:Qt(e.totalCostUsd),previousValue:t?Qt(t.totalCostUsd):null,badge:(0,V.jsx)(H,{delta:e.costDelta,deltaPct:e.costDeltaPct,lowerIsBetter:!0,formatter:e=>`$${e.toFixed(4)}`})}),(0,V.jsx)(U,{label:`Total Jobs`,value:String(e.totalJobs),previousValue:t?String(t.totalJobs):null,badge:(0,V.jsx)(H,{delta:e.jobsDelta,deltaPct:e.jobsDeltaPct,lowerIsBetter:!1,formatter:e=>`+${e}`})}),(0,V.jsx)(U,{label:`Success Rate`,value:en(e.successRate),previousValue:t?en(t.successRate):null,badge:(0,V.jsx)(H,{delta:e.successRateDelta,deltaPct:e.successRateDeltaPct,lowerIsBetter:!1,formatter:e=>`${(e*100).toFixed(1)}%`})}),(0,V.jsx)(U,{label:`Avg Duration`,value:$t(e.avgDurationMs),previousValue:t?$t(t.avgDurationMs):null,badge:(0,V.jsx)(H,{delta:e.avgDurationDelta,deltaPct:e.avgDurationDeltaPct,lowerIsBetter:!0,formatter:e=>$t(e)})}),(0,V.jsx)(U,{label:`Total Tokens`,value:tn(e.totalTokens),previousValue:t?tn(t.totalTokens):null,badge:(0,V.jsx)(H,{delta:e.totalTokensDelta,deltaPct:e.totalTokensDeltaPct,lowerIsBetter:!0,formatter:e=>tn(e)})})]})}function an(){return an=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},an.apply(null,arguments)}function on(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function sn(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?on(Object(n),!0).forEach(function(t){cn(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):on(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function cn(e,t,n){return(t=ln(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ln(e){var t=un(e,`string`);return typeof t==`symbol`?t:t+``}function un(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}var W=32,dn={align:`center`,iconSize:14,inactiveColor:`#ccc`,layout:`horizontal`,verticalAlign:`middle`,labelStyle:{}};function fn(e){if(typeof e==`object`&&e&&`strokeDasharray`in e)return String(e.strokeDasharray)}function pn(e){var{data:t,iconType:n,inactiveColor:r}=e,i=W/2,a=W/6,o=W/3,s=t.inactive?r:t.color,c=n??t.type;if(c===`none`)return null;if(c===`plainline`)return B.createElement(`line`,{strokeWidth:4,fill:`none`,stroke:s,strokeDasharray:fn(t.payload),x1:0,y1:i,x2:W,y2:i,className:`recharts-legend-icon`});if(c===`line`)return B.createElement(`path`,{strokeWidth:4,fill:`none`,stroke:s,d:`M0,${i}h${o}
2
+ A${a},${a},0,1,1,${2*o},${i}
3
+ H${W}M${2*o},${i}
4
+ A${a},${a},0,1,1,${o},${i}`,className:`recharts-legend-icon`});if(c===`rect`)return B.createElement(`path`,{stroke:`none`,fill:s,d:`M0,${W/8}h${W}v${W*3/4}h${-W}z`,className:`recharts-legend-icon`});if(B.isValidElement(t.legendIcon)){var l=sn({},t);return delete l.legendIcon,B.cloneElement(t.legendIcon,l)}return B.createElement(ve,{fill:s,cx:i,cy:i,size:W,sizeType:`diameter`,type:c})}function mn(e){var{payload:t,iconSize:n,layout:r,formatter:i,inactiveColor:a,iconType:o,labelStyle:s}=e,l={x:0,y:0,width:W,height:W},u={display:r===`horizontal`?`inline-block`:`block`,marginRight:10},d={display:`inline-block`,verticalAlign:`middle`,marginRight:4};return t.map((t,r)=>{var f=t.formatter||i,p=c({"recharts-legend-item":!0,[`legend-item-${r}`]:!0,inactive:t.inactive});if(t.type===`none`)return null;var m=typeof s==`object`?sn({},s):{};m.color=t.inactive?a:m.color||t.color;var h=f?f(t.value,t,r):t.value;return B.createElement(`li`,an({className:p,style:u,key:`legend-item-${r}`},Me(e,t,r)),B.createElement(tt,{width:n,height:n,viewBox:l,style:d,"aria-label":`${h} legend icon`},B.createElement(pn,{data:t,iconType:o,inactiveColor:a})),B.createElement(`span`,{className:`recharts-legend-item-text`,style:m},h))})}var hn=e=>{var t=j(e,dn),{payload:n,layout:r,align:i}=t;if(!n||!n.length)return null;var a={padding:0,margin:0,textAlign:r===`horizontal`?i:`left`};return B.createElement(`ul`,{className:`recharts-default-legend`,style:a},B.createElement(mn,an({},t,{payload:n})))};function gn(){return A(Ee)}var _n=n(a()),vn=[`contextPayload`];function yn(){return yn=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},yn.apply(null,arguments)}function bn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function G(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?bn(Object(n),!0).forEach(function(t){xn(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):bn(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function xn(e,t,n){return(t=Sn(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Sn(e){var t=Cn(e,`string`);return typeof t==`symbol`?t:t+``}function Cn(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function wn(e,t){if(e==null)return{};var n,r,i=Tn(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function Tn(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function En(e){return e.value}function Dn(e){var{contextPayload:t}=e,n=wn(e,vn),r=te(t,e.payloadUniqBy,En),i=G(G({},n),{},{payload:r});return B.isValidElement(e.content)?B.cloneElement(e.content,i):typeof e.content==`function`?B.createElement(e.content,i):B.createElement(hn,i)}function On(e,t,n,r,i,a){var{layout:o,align:s,verticalAlign:c}=t,l,u;return(!e||(e.left===void 0||e.left===null)&&(e.right===void 0||e.right===null))&&(l=s===`center`&&o===`vertical`?{left:((r||0)-a.width)/2}:s===`right`?{right:n&&n.right||0}:{left:n&&n.left||0}),(!e||(e.top===void 0||e.top===null)&&(e.bottom===void 0||e.bottom===null))&&(u=c===`middle`?{top:((i||0)-a.height)/2}:c===`bottom`?{bottom:n&&n.bottom||0}:{top:n&&n.top||0}),G(G({},l),u)}function kn(e){var t=k();return(0,B.useEffect)(()=>{t(Ce(e))},[t,e]),null}function An(e){var t=k();return(0,B.useEffect)(()=>(t(S(e)),()=>{t(S({width:0,height:0}))}),[t,e]),null}function jn(e,t,n,r){return e===`vertical`&&t!=null?{height:t}:e===`horizontal`?{width:n||r}:null}var Mn={align:`center`,iconSize:14,inactiveColor:`#ccc`,itemSorter:`value`,layout:`horizontal`,verticalAlign:`bottom`};function Nn(e){var t=j(e,Mn),n=gn(),r=vt(),i=st(),{width:a,height:o,wrapperStyle:s,portal:c}=t,[l,u]=g([n]),d=m(),f=lt();if(d==null||f==null)return null;var p=d-(i?.left||0)-(i?.right||0),h=jn(t.layout,o,a,p),_=c?s:G(G({position:`absolute`,width:h?.width||a||`auto`,height:h?.height||o||`auto`},On(s,t,i,d,f,l)),s),v=c??r;return v==null||n==null?null:(0,_n.createPortal)(B.createElement(`div`,{className:`recharts-legend-wrapper`,style:_,ref:u},B.createElement(kn,{layout:t.layout,align:t.align,verticalAlign:t.verticalAlign,itemSorter:t.itemSorter}),!c&&B.createElement(An,{width:l.width,height:l.height}),B.createElement(Dn,yn({},t,h,{margin:i,chartWidth:d,chartHeight:f,contextPayload:n}))),v)}var K=B.memo(Nn,Lt);K.displayName=`Legend`;var Pn=[`points`,`className`,`baseLinePoints`,`connectNulls`],Fn;function q(){return q=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},q.apply(null,arguments)}function In(e,t){if(e==null)return{};var n,r,i=Ln(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function Ln(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function Rn(e,t){return t||=e.slice(0),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}var zn=e=>e!=null&&e.x===+e.x&&e.y===+e.y,Bn=function(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],t=[[]];e.forEach(e=>{var n=t[t.length-1];zn(e)?n&&n.push(e):n&&n.length>0&&t.push([])});var n=e[0],r=t[t.length-1];zn(n)&&r&&r.push(n);var i=t[t.length-1];return i&&i.length<=0&&(t=t.slice(0,-1)),t},J=(e,t)=>{var n=Bn(e);t&&(n=[n.reduce((e,t)=>[...e,...t],[])]);var r=n.map(e=>e.reduce((e,t,n)=>ht(Fn||=Rn([``,``,``,`,`,``]),e,n===0?`M`:`L`,t.x,t.y),``)).join(``);return n.length===1?`${r}Z`:r},Vn=(e,t,n)=>{var r=J(e,n);return`${r.slice(-1)===`Z`?r.slice(0,-1):r}L${J(Array.from(t).reverse(),n).slice(1)}`},Hn=e=>{var{points:t,className:n,baseLinePoints:r,connectNulls:i}=e,a=In(e,Pn);if(!t||!t.length)return null;var o=c(`recharts-polygon`,n);if(r&&r.length){var s=a.stroke&&a.stroke!==`none`,l=Vn(t,r,i);return B.createElement(`g`,{className:o},B.createElement(`path`,q({},$e(a),{fill:l.slice(-1)===`Z`?a.fill:`none`,stroke:`none`,d:l})),s?B.createElement(`path`,q({},$e(a),{fill:`none`,d:J(t,i)})):null,s?B.createElement(`path`,q({},$e(a),{fill:`none`,d:J(r,i)})):null)}var u=J(t,i);return B.createElement(`path`,q({},$e(a),{fill:u.slice(-1)===`Z`?a.fill:`none`,className:o,d:u}))},Un=e=>e.graphicalItems.polarItems,Wn=T([Un,R,T([P,We],Ye)],je),Gn=T([T([Wn],Oe),Qe],ie),Kn=T([Gn,R,Wn],ee);T([Gn,R,Wn],(e,t,n)=>n.length>0?e.flatMap(e=>n.flatMap(n=>({value:O(e,t.dataKey??n.dataKey),errorDomain:[]}))).filter(Boolean):t?.dataKey==null?e.map(e=>({value:e,errorDomain:[]})):e.map(e=>({value:O(e,t.dataKey),errorDomain:[]})));var qn=()=>void 0,Jn=T([R,me,Gn,Kn,qe,P,T([R,wt,at,qn,T([Gn,R,Wn,At,P],ke),qn,me,P],d)],oe);T([Re,T([R,Jn,T([Jn,gt,Re],_e),P],bt)],Dt);function Yn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function Xn(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?Yn(Object(n),!0).forEach(function(t){Zn(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Yn(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function Zn(e,t,n){return(t=Qn(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Qn(e){var t=$n(e,`string`);return typeof t==`symbol`?t:t+``}function $n(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}var er=T([Un,(e,t)=>t],(e,t)=>e.filter(e=>e.type===`pie`).find(e=>e.id===t)),tr=[],nr=(e,t,n)=>n?.length===0?tr:n,rr=T([Qe,er,nr],(e,t,n)=>{var{chartData:r}=e;if(t!=null){var i=t?.data!=null&&t.data.length>0?t.data:r;if((!i||!i.length)&&n!=null&&(i=n.map(e=>Xn(Xn({},t.presentationProps),e.props))),i!=null)return i}}),ir=T([rr,er,nr],(e,t,n)=>{if(!(e==null||t==null))return e.map((e,r)=>{var i,a=O(e,t.nameKey,t.name),o=n!=null&&(i=n[r])!=null&&(i=i.props)!=null&&i.fill?n[r].props.fill:typeof e==`object`&&e&&`fill`in e?e.fill:t.fill;return{value:le(a,t.dataKey),color:o,payload:e,type:t.legendType}})}),ar=T([rr,er,nr,fe],(e,t,n,r)=>{if(!(t==null||e==null))return kr({offset:r,pieSettings:t,displayedData:e,cells:n})}),or=n(Et()),sr=[`key`],cr=[`onMouseEnter`,`onClick`,`onMouseLeave`],lr=[`id`],ur=[`id`];function Y(){return Y=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},Y.apply(null,arguments)}function dr(e,t){if(e==null)return{};var n,r,i=fr(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function fr(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function pr(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function X(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?pr(Object(n),!0).forEach(function(t){mr(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):pr(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function mr(e,t,n){return(t=hr(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function hr(e){var t=gr(e,`string`);return typeof t==`symbol`?t:t+``}function gr(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function _r(e){var t=(0,B.useMemo)(()=>ct(e.children,C),[e.children]),n=A(n=>ir(n,e.id,t));return n==null?null:B.createElement(be,{legendPayload:n})}function vr(e){if(!(e==null||typeof e==`boolean`||typeof e==`function`)){if(B.isValidElement(e)){var t=e.props?.fill;return typeof t==`string`?t:void 0}var{fill:n}=e;return typeof n==`string`?n:void 0}}var yr=B.memo(e=>{var{dataKey:t,nameKey:n,sectors:r,stroke:i,strokeWidth:a,fill:o,name:s,hide:c,tooltipType:l,id:u,activeShape:d}=e,f=vr(d),p={dataDefinedOnItem:r.map(e=>{var t=e.tooltipPayload;return f==null||t==null?t:t.map(e=>X(X({},e),{},{color:f,fill:f}))}),getPosition:e=>r[Number(e)]?.tooltipPosition,settings:{stroke:i,strokeWidth:a,fill:o,dataKey:t,nameKey:n,name:le(s,t),hide:c,type:l,color:o,unit:``,graphicalItemId:u}};return B.createElement(_,{tooltipEntrySettings:p})}),br=(e,t)=>e>t?`start`:e<t?`end`:`middle`,xr=(e,t,n)=>f(typeof t==`function`?t(e):t,n,n*.8),Sr=(e,t,n)=>{var{top:r,left:i,width:a,height:o}=t,s=ft(a,o);return{cx:i+f(e.cx,a,a/2),cy:r+f(e.cy,o,o/2),innerRadius:f(e.innerRadius,s,0),outerRadius:xr(n,e.outerRadius,s),maxRadius:e.maxRadius||Math.sqrt(a*a+o*o)/2}},Cr=(e,t)=>Ct(t-e)*Math.min(Math.abs(t-e),360),wr=(e,t)=>{if(B.isValidElement(e))return B.cloneElement(e,t);if(typeof e==`function`)return e(t);var n=c(`recharts-pie-label-line`,typeof e==`boolean`?``:e.className),{key:r}=t,i=dr(t,sr);return B.createElement(Bt,Y({},i,{type:`linear`,className:n}))},Tr=(e,t,n)=>{if(B.isValidElement(e))return B.cloneElement(e,t);var r=n;if(typeof e==`function`&&(r=e(t),B.isValidElement(r)))return r;var i=c(`recharts-pie-label-text`,p(e));return B.createElement(de,Y({},t,{alignmentBaseline:`middle`,className:i}),r)};function Er(e){var{sectors:t,props:n,showLabels:r}=e,{label:i,labelLine:a,dataKey:o}=n;if(!r||!i||!t)return null;var s=Pe(n),c=Pt(i),l=Pt(a),u=typeof i==`object`&&`offsetRadius`in i&&typeof i.offsetRadius==`number`&&i.offsetRadius||20,d=t.map((e,t)=>{var n=(e.startAngle+e.endAngle)/2,r=nt(e.cx,e.cy,e.outerRadius+u,n),d=X(X(X(X({},s),e),{},{stroke:`none`},c),{},{index:t,textAnchor:br(r.x,e.cx)},r),f=X(X(X(X({},s),e),{},{fill:`none`,stroke:e.fill},l),{},{index:t,points:[nt(e.cx,e.cy,e.outerRadius,n),r],key:`line`});return B.createElement(Wt,{zIndex:Nt.label,key:`label-${e.startAngle}-${e.endAngle}-${e.midAngle}-${t}`},B.createElement(I,null,a&&wr(a,f),Tr(i,d,O(e,o))))});return B.createElement(I,{className:`recharts-pie-labels`},d)}function Dr(e){var{sectors:t,props:n,showLabels:r}=e,{label:i}=n;return typeof i==`object`&&i&&`position`in i?B.createElement(ot,{label:i}):B.createElement(Er,{sectors:t,props:n,showLabels:r})}function Or(e){var{sectors:t,activeShape:n,inactiveShape:r,allOtherPieProps:i,shape:a,id:o}=e,s=A(ne),c=A(h),l=A(Te),{onMouseEnter:u,onClick:d,onMouseLeave:f}=i,p=dr(i,cr),m=Se(u,i.dataKey,o),g=x(f),_=It(d,i.dataKey,o);return t==null||t.length===0?null:B.createElement(B.Fragment,null,t.map((e,u)=>{if(e?.startAngle===0&&e?.endAngle===0&&t.length!==1)return null;var d=l==null||l===o,f=String(u)===s&&(c==null||i.dataKey===c)&&d,h=n&&f?n:s?r:null,v=X(X({},e),{},{stroke:e.stroke,tabIndex:-1,[re]:u,[w]:o});return B.createElement(I,Y({key:`sector-${e?.startAngle}-${e?.endAngle}-${e.midAngle}-${u}`,tabIndex:-1,className:`recharts-pie-sector`},Me(p,e,u),{onMouseEnter:m(e,u),onMouseLeave:g(e,u),onClick:_(e,u)}),B.createElement(y,Y({option:a??h,index:u,shapeType:`sector`,isActive:f},v)))}))}function kr(e){var{pieSettings:t,displayedData:n,cells:r,offset:i}=e,{cornerRadius:a,startAngle:o,endAngle:s,dataKey:c,nameKey:l,tooltipType:u}=t,d=Math.abs(t.minAngle),f=Cr(o,s),p=Math.abs(f),m=n.length<=1?0:t.paddingAngle??0,h=n.filter(e=>O(e,c,0)!==0).length,g=(p>=360?h:h-1)*m,_=p-h*d-g,v=n.reduce((e,t)=>{var n=O(t,c,0);return e+(pt(n)?n:0)},0),y;if(v>0){var b;y=n.map((e,n)=>{var s=O(e,c,0),p=O(e,l,n),h=Sr(t,i,e),g=(pt(s)?s:0)/v,y,x=X(X({},e),r&&r[n]&&r[n].props),S=x!=null&&`fill`in x&&typeof x.fill==`string`?x.fill:t.fill;y=n?b.endAngle+Ct(f)*m*(s===0?0:1):o;var C=y+Ct(f)*((s===0?0:d)+g*_),w=(y+C)/2,ee=(h.innerRadius+h.outerRadius)/2,te=[{name:p,value:s,payload:x,dataKey:c,type:u,color:S,fill:S,graphicalItemId:t.id}],ne=nt(h.cx,h.cy,ee,w);return b=X(X(X(X({},t.presentationProps),{},{percent:g,cornerRadius:typeof a==`string`?parseFloat(a):a,name:p,tooltipPayload:te,midAngle:w,middleRadius:ee,tooltipPosition:ne},x),h),{},{value:s,dataKey:c,startAngle:y,endAngle:C,payload:x,paddingAngle:Ct(f)*m}),b})}return y}function Ar(e){var{showLabels:t,sectors:n,children:r}=e,i=(0,B.useMemo)(()=>!t||!n?[]:n.map(e=>({value:e.value,payload:e.payload,clockWise:!1,parentViewBox:void 0,viewBox:{cx:e.cx,cy:e.cy,innerRadius:e.innerRadius,outerRadius:e.outerRadius,startAngle:e.startAngle,endAngle:e.endAngle,clockWise:!1},fill:e.fill})),[n,t]);return B.createElement(ue,{value:t?i:void 0},r)}function jr(e){var{props:t,previousSectorsRef:n,id:r}=e,{sectors:i,isAnimationActive:a,animationBegin:o,animationDuration:s,animationEasing:c,activeShape:l,inactiveShape:u,onAnimationStart:d,onAnimationEnd:f}=t,p=Fe(t,`recharts-pie-`),m=n.current,[h,g]=(0,B.useState)(!1),_=(0,B.useCallback)(()=>{typeof f==`function`&&f(),g(!1)},[f]),v=(0,B.useCallback)(()=>{typeof d==`function`&&d(),g(!0)},[d]);return B.createElement(Ar,{showLabels:!h,sectors:i},B.createElement(Ft,{animationId:p,begin:o,duration:s,isActive:a,easing:c,onAnimationStart:v,onAnimationEnd:_,key:p},e=>{var a=[],o=(i&&i[0])?.startAngle??0;return i?.forEach((t,n)=>{var r=m&&m[n],i=n>0?(0,or.default)(t,`paddingAngle`,0):0;if(r){var s=Je(r.endAngle-r.startAngle,t.endAngle-t.startAngle,e),c=X(X({},t),{},{startAngle:o+i,endAngle:o+s+i});a.push(c),o=c.endAngle}else{var{endAngle:l,startAngle:u}=t,d=Je(0,l-u,e),f=X(X({},t),{},{startAngle:o+i,endAngle:o+d+i});a.push(f),o=f.endAngle}}),n.current=a,B.createElement(I,null,B.createElement(Or,{sectors:a,activeShape:l,inactiveShape:u,allOtherPieProps:t,shape:t.shape,id:r}))}),B.createElement(Dr,{showLabels:!h,sectors:i,props:t}),t.children)}var Mr={animationBegin:400,animationDuration:1500,animationEasing:`ease`,cx:`50%`,cy:`50%`,dataKey:`value`,endAngle:360,fill:`#808080`,hide:!1,innerRadius:0,isAnimationActive:`auto`,label:!1,labelLine:!0,legendType:`rect`,minAngle:0,nameKey:`name`,outerRadius:`80%`,paddingAngle:0,rootTabIndex:0,startAngle:0,stroke:`#fff`,zIndex:Nt.area};function Nr(e){var{id:t}=e,n=dr(e,lr),{hide:r,className:i,rootTabIndex:a}=e,o=(0,B.useMemo)(()=>ct(e.children,C),[e.children]),s=A(e=>ar(e,t,o)),l=(0,B.useRef)(null),u=c(`recharts-pie`,i);return r||s==null?(l.current=null,B.createElement(I,{tabIndex:a,className:u})):B.createElement(Wt,{zIndex:e.zIndex},B.createElement(yr,{dataKey:e.dataKey,nameKey:e.nameKey,sectors:s,stroke:e.stroke,strokeWidth:e.strokeWidth,fill:e.fill,name:e.name,hide:e.hide,tooltipType:e.tooltipType,id:t,activeShape:e.activeShape}),B.createElement(I,{tabIndex:a,className:u},B.createElement(jr,{props:X(X({},n),{},{sectors:s}),previousSectorsRef:l,id:t})))}function Pr(e){var t=j(e,Mr),{id:n}=t,r=dr(t,ur),i=Pe(r);return B.createElement(Rt,{id:n,type:`pie`},e=>B.createElement(B.Fragment,null,B.createElement(ze,{type:`pie`,id:e,data:r.data,dataKey:r.dataKey,hide:r.hide,angleAxisId:0,radiusAxisId:0,name:r.name,nameKey:r.nameKey,tooltipType:r.tooltipType,legendType:r.legendType,fill:r.fill,cx:r.cx,cy:r.cy,startAngle:r.startAngle,endAngle:r.endAngle,paddingAngle:r.paddingAngle,minAngle:r.minAngle,innerRadius:r.innerRadius,outerRadius:r.outerRadius,cornerRadius:r.cornerRadius,presentationProps:i,maxRadius:t.maxRadius}),B.createElement(_r,Y({},r,{id:e})),B.createElement(Nr,Y({},r,{id:e}))))}var Fr=Pr;Fr.displayName=`Pie`;var Ir={begin:0,duration:1e3,easing:`ease`,isActive:!0,canBegin:!0,onAnimationEnd:()=>{},onAnimationStart:()=>{}};function Lr(e){var t=j(e,Ir),{animationId:n,from:r,to:i,attributeName:a,isActive:o,canBegin:s,duration:c,easing:l,begin:u,onAnimationEnd:d,onAnimationStart:f,children:p}=t,m=xe(),h=o===`auto`?!v.isSsr&&!m:o,g=Ut(n+a,t.animationManager),[_,y]=(0,B.useState)(()=>h?r:i),b=(0,B.useRef)(!1),x=(0,B.useCallback)(()=>{y(r),f()},[r,f]);return(0,B.useEffect)(()=>{if(!h||!s)return it;b.current=!0;var e=g.subscribe(y);return g.start([x,u,i,c,d]),()=>{g.stop(),e&&e(),d()}},[h,s,c,l,u,x,d,g,i,r]),h?s&&b.current?p({transition:Ve([a],c,l),[a]:_}):p({[a]:r}):p({[a]:i})}function Rr(e){var t=k();return(0,B.useEffect)(()=>{t(_t(e))},[t,e]),null}var zr=[`layout`];function Br(){return Br=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},Br.apply(null,arguments)}function Vr(e,t){if(e==null)return{};var n,r,i=Hr(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function Hr(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function Ur(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function Wr(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?Ur(Object(n),!0).forEach(function(t){Gr(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Ur(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function Gr(e,t,n){return(t=Kr(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Kr(e){var t=qr(e,`string`);return typeof t==`symbol`?t:t+``}function qr(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}var Jr=Wr({accessibilityLayer:!0,stackOffset:`none`,barCategoryGap:`10%`,barGap:4,margin:{top:5,right:5,bottom:5,left:5},reverseStackOrder:!1,syncMethod:`index`,layout:`radial`,responsive:!1,cx:`50%`,cy:`50%`,innerRadius:0,outerRadius:`80%`},Xe),Yr=(0,B.forwardRef)(function(e,t){var n=j(e.categoricalChartProps,Jr),{layout:r}=n,i=Vr(n,zr),{chartName:a,defaultTooltipEventType:o,validateTooltipEventTypes:s,tooltipPayloadSearcher:c}=e,l={chartName:a,defaultTooltipEventType:o,validateTooltipEventTypes:s,tooltipPayloadSearcher:c,eventEmitter:void 0};return B.createElement(Ge,{preloadedState:{options:l},reduxStoreName:n.id??a},B.createElement(Vt,{chartData:n.data}),B.createElement(jt,{layout:r,margin:n.margin}),B.createElement(He,{throttleDelay:n.throttleDelay,throttledEvents:n.throttledEvents}),B.createElement(ut,{baseValue:void 0,accessibilityLayer:n.accessibilityLayer,barCategoryGap:n.barCategoryGap,maxBarSize:n.maxBarSize,stackOffset:n.stackOffset,barGap:n.barGap,barSize:n.barSize,syncId:n.syncId,syncMethod:n.syncMethod,className:n.className,reverseStackOrder:n.reverseStackOrder}),B.createElement(Rr,{cx:n.cx,cy:n.cy,startAngle:n.startAngle,endAngle:n.endAngle,innerRadius:n.innerRadius,outerRadius:n.outerRadius}),B.createElement(mt,Br({},i,{ref:t})))});function Xr(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function Zr(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?Xr(Object(n),!0).forEach(function(t){Qr(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Xr(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function Qr(e,t,n){return(t=$r(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function $r(e){var t=ei(e,`string`);return typeof t==`symbol`?t:t+``}function ei(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}var ti=[`item`],ni=Zr(Zr({},Jr),{},{layout:`centric`,startAngle:0,endAngle:360}),ri=(0,B.forwardRef)((e,t)=>{var n=j(e,ni);return B.createElement(Yr,{chartName:`PieChart`,defaultTooltipEventType:`item`,validateTooltipEventTypes:ti,tooltipPayloadSearcher:ce,categoricalChartProps:n,ref:t})}),ii=e((e=>{Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});function t(e){return typeof Buffer<`u`&&Buffer.isBuffer(e)}e.isBuffer=t})),ai=e((e=>{Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});function t(e){let t=e?.constructor;return e===(typeof t==`function`?t.prototype:Object.prototype)}e.isPrototype=t})),oi=e((e=>{Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=xt();function n(e){return t.isTypedArray(e)}e.isTypedArray=n})),si=e((e=>{Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=yt();function n(e){let n=t.toFinite(e),r=n%1;return r?n-r:n}e.toInteger=n})),ci=e((e=>{Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=si();function n(e,n){if(e=t.toInteger(e),e<1||!Number.isSafeInteger(e))return[];let r=Array(e);for(let t=0;t<e;t++)r[t]=typeof n==`function`?n(t):t;return r}e.times=n})),li=e((e=>{Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=ii(),n=ai(),r=Ae(),i=oi(),a=ci();function o(e){if(e==null)return[];switch(typeof e){case`object`:case`function`:return r.isArrayLike(e)?l(e):n.isPrototype(e)?c(e):s(e);default:return s(Object(e))}}function s(e){let t=[];for(let n in e)t.push(n);return t}function c(e){return s(e).filter(e=>e!==`constructor`)}function l(e){let n=a.times(e.length,e=>`${e}`),r=new Set(n);t.isBuffer(e)&&(r.add(`offset`),r.add(`parent`)),i.isTypedArray(e)&&(r.add(`buffer`),r.add(`byteLength`),r.add(`byteOffset`));let o=s(e).filter(e=>!r.has(e));return Array.isArray(e)?[...n,...o]:[...n.filter(t=>Object.hasOwn(e,t)),...o]}e.keysIn=o})),ui=e((e=>{Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=Ue(),n=Ze(),r=Ke(),i=Mt(),a=dt();function o(e,t){if(e==null)return!0;switch(typeof t){case`symbol`:case`number`:case`object`:if(Array.isArray(t))return s(e,t);if(typeof t==`number`?t=i.toKey(t):typeof t==`object`&&(t=Object.is(t?.valueOf(),-0)?`-0`:String(t)),n.isUnsafeProperty(t))return!1;if(e?.[t]===void 0)return!0;try{return delete e[t],!0}catch{return!1}case`string`:if(e?.[t]===void 0&&r.isDeepKey(t))return s(e,a.toPath(t));if(n.isUnsafeProperty(t))return!1;try{return delete e[t],!0}catch{return!1}}}function s(e,r){let i=r.length===1?e:t.get(e,r.slice(0,-1)),a=r[r.length-1];if(i?.[a]===void 0)return!0;if(n.isUnsafeProperty(a))return!1;try{return delete i[a],!0}catch{return!1}}e.unset=o})),di=e((e=>{Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=ae();function n(e){let n=[];for(;e;)n.push(...t.getSymbols(e)),e=Object.getPrototypeOf(e);return n}e.getSymbolsIn=n})),fi=e((e=>{Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=Ae();function n(e,n=1){let r=[],i=Math.floor(n);if(!t.isArrayLike(e))return r;let a=(e,t)=>{for(let n=0;n<e.length;n++){let o=e[n];t<i&&(Array.isArray(o)||o?.[Symbol.isConcatSpreadable]||typeof o==`object`&&o&&Object.prototype.toString.call(o)===`[object Arguments]`)?a(Array.isArray(o)?o:Array.from(o),t+1):r.push(o)}};return a(Array.from(e),0),r}e.flatten=n})),pi=e((e=>{Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=se(),n=li(),r=ui(),i=di(),a=Ke(),o=fi(),s=pe();function c(e,...t){if(e==null)return{};t=o.flatten(t);let n=l(e,t);for(let e=0;e<t.length;e++){let i=t[e];switch(typeof i){case`object`:Array.isArray(i)||(i=Array.from(i));for(let e=0;e<i.length;e++){let t=i[e];r.unset(n,t)}break;case`string`:case`symbol`:case`number`:r.unset(n,i);break}}return n}function l(e,t){return t.some(e=>Array.isArray(e)||a.isDeepKey(e))?d(e):u(e)}function u(e){let t={},r=[...n.keysIn(e),...i.getSymbolsIn(e)];for(let n=0;n<r.length;n++){let i=r[n];t[i]=e[i]}return t}function d(e){let r={},a=[...n.keysIn(e),...i.getSymbolsIn(e)];for(let n=0;n<a.length;n++){let i=a[n];r[i]=t.cloneDeepWith(e[i],e=>{if(!s.isPlainObject(e))return e})}return r}e.omit=c})),mi=n(e(((e,t)=>{t.exports=pi().omit}))()),hi=[`width`,`height`,`className`,`style`,`children`,`type`];function gi(e,t){if(e==null)return{};var n,r,i=_i(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)===-1&&{}.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function _i(e,t){if(e==null)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.indexOf(r)!==-1)continue;n[r]=e[r]}return n}function Z(){return Z=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},Z.apply(null,arguments)}function vi(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function Q(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?vi(Object(n),!0).forEach(function(t){yi(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):vi(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function yi(e,t,n){return(t=bi(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function bi(e){var t=xi(e,`string`);return typeof t==`symbol`?t:t+``}function xi(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}var Si=`value`;function Ci(e){return typeof e==`object`&&!!e&&`x`in e&&`y`in e&&`width`in e&&`height`in e&&typeof e.x==`number`&&typeof e.y==`number`&&typeof e.width==`number`&&typeof e.height==`number`}var wi=(e,t)=>{if(!(!e||!t))return(0,or.default)(e,t)},Ti=function(e){return`${arguments.length>1&&arguments[1]!==void 0?arguments[1]:``}children[${e}]`},Ei={chartName:`Treemap`,defaultTooltipEventType:`item`,validateTooltipEventTypes:[`item`],tooltipPayloadSearcher:wi,eventEmitter:void 0},Di=e=>{var{depth:t,node:n,index:r,dataKey:i,nameKey:a,nestedActiveTooltipIndex:o}=e,s=t===0?``:Ti(r,o),{children:c}=n,l=t+1,u=c&&c.length?c.map((e,t)=>Di({depth:l,node:e,index:t,dataKey:i,nameKey:a,nestedActiveTooltipIndex:s})):null,d;if(u&&u.length)d=u.reduce((e,t)=>e+t.value,0);else{var f=n[i],p=typeof f==`number`?f:0;d=kt(p)||p<=0?0:p}return Q(Q({},n),{},{children:u,name:O(n,a,``),[Si]:d,depth:t,index:r,tooltipIndex:s})},Oi=e=>({x:e.x,y:e.y,width:e.width,height:e.height}),ki=(e,t)=>{var n=t<0?0:t;return e.map(e=>{var t=e[Si]*n;return Q(Q({},e),{},{area:kt(t)||t<=0?0:t})})},Ai=(e,t,n)=>{var r=t*t,i=e.area*e.area,{min:a,max:o}=e.reduce((e,t)=>({min:Math.min(e.min,t.area),max:Math.max(e.max,t.area)}),{min:1/0,max:0});return i?Math.max(r*o*n/i,i/(r*a*n)):1/0},ji=(e,t,n,r)=>{var i=t?Math.round(e.area/t):0;(r||i>n.height)&&(i=n.height);for(var a=n.x,o,s=0,c=e.length;s<c;s++)o=e[s],o!=null&&(o.x=a,o.y=n.y,o.height=i,o.width=Math.min(i?Math.round(o.area/i):0,n.x+n.width-a),a+=o.width);return o!=null&&(o.width+=n.x+n.width-a),Q(Q({},n),{},{y:n.y+i,height:n.height-i})},Mi=(e,t,n,r)=>{var i=t?Math.round(e.area/t):0;(r||i>n.width)&&(i=n.width);for(var a=n.y,o,s=0,c=e.length;s<c;s++)o=e[s],o!=null&&(o.x=n.x,o.y=a,o.width=i,o.height=Math.min(i?Math.round(o.area/i):0,n.y+n.height-a),a+=o.height);return o&&(o.height+=n.y+n.height-a),Q(Q({},n),{},{x:n.x+i,width:n.width-i})},Ni=(e,t,n,r)=>t===n.width?ji(e,t,n,r):Mi(e,t,n,r),Pi=(e,t)=>{var{children:n}=e;if(n&&n.length){var r=Oi(e),i=[],a=1/0,o,s,c=Math.min(r.width,r.height),l=ki(n,r.width*r.height/e[Si]),u=l.slice();for(i.area=0;u.length>0;)[o]=u,o!=null&&(i.push(o),i.area+=o.area,s=Ai(i,c,t),s<=a?(u.shift(),a=s):(i.area-=i.pop()?.area??0,r=Ni(i,c,r,!1),c=Math.min(r.width,r.height),i.length=i.area=0,a=1/0));return i.length&&=(r=Ni(i,c,r,!0),i.area=0),Q(Q({},e),{},{children:l.map(e=>Pi(e,t))})}return e},Fi=Q({aspectRatio:.5*(1+Math.sqrt(5)),dataKey:`value`,nameKey:`name`,type:`flat`,isAnimationActive:`auto`,isUpdateAnimationActive:`auto`,animationBegin:0,animationDuration:1500,animationEasing:`linear`},Xe),Ii={isAnimationFinished:!1,formatRoot:null,currentRoot:void 0,nestIndex:[],prevAspectRatio:Fi.aspectRatio,prevDataKey:Fi.dataKey};function Li(e){var{content:t,nodeProps:n,type:r,colorPanel:i,onMouseEnter:a,onMouseLeave:o,onClick:s}=e;if(B.isValidElement(t))return B.createElement(I,{onMouseEnter:a,onMouseLeave:o,onClick:s},B.cloneElement(t,n));if(typeof t==`function`)return B.createElement(I,{onMouseEnter:a,onMouseLeave:o,onClick:s},t(n));var{x:c,y:l,width:u,height:d,index:f}=n,p=null;u>10&&d>10&&n.children&&r===`nest`&&(p=B.createElement(Hn,{points:[{x:c+2,y:l+d/2},{x:c+6,y:l+d/2+3},{x:c+2,y:l+d/2+6}]}));var m=null,h=he(n.name);u>20&&d>20&&h.width<u&&h.height<d&&(m=B.createElement(`text`,{x:c+8,y:l+d/2+7,fontSize:14},n.name));var g=i||ge;return B.createElement(`g`,null,B.createElement(et,Z({fill:n.depth<2?g[f%g.length]:`rgba(255,255,255,0)`,stroke:`#fff`},(0,mi.default)(n,[`children`]),{onMouseEnter:a,onMouseLeave:o,onClick:s,"data-recharts-item-index":n.tooltipIndex})),p,m)}function Ri(e){var t=k(),n={x:e.nodeProps.x+e.nodeProps.width/2,y:e.nodeProps.y+e.nodeProps.height/2};return B.createElement(Li,Z({},e,{onMouseEnter:()=>{t(De({activeIndex:e.nodeProps.tooltipIndex,activeDataKey:e.dataKey,activeCoordinate:n,activeGraphicalItemId:e.id}))},onMouseLeave:()=>{},onClick:()=>{t(we({activeIndex:e.nodeProps.tooltipIndex,activeDataKey:e.dataKey,activeCoordinate:n,activeGraphicalItemId:e.id}))}}))}var zi=B.memo(e=>{var{dataKey:t,nameKey:n,stroke:r,fill:i,currentRoot:a,id:o}=e,s={dataDefinedOnItem:a,getPosition:it,settings:{stroke:r,strokeWidth:void 0,fill:i,dataKey:t,nameKey:n,name:void 0,hide:!1,type:void 0,color:i,unit:``,graphicalItemId:o}};return B.createElement(_,{tooltipEntrySettings:s})}),Bi={top:0,right:0,bottom:0,left:0};function Vi(e){var{content:t,nodeProps:n,isLeaf:r,treemapProps:i,onNestClick:a}=e,{id:o,isAnimationActive:s,animationBegin:c,animationDuration:l,animationEasing:u,isUpdateAnimationActive:d,type:f,colorPanel:p,dataKey:m,onAnimationStart:h,onAnimationEnd:g,onMouseEnter:_,onClick:v,onMouseLeave:y}=i,{width:b,height:x,x:S,y:C}=n,w=-S-b,ee=0,te=e=>{(r||f===`nest`)&&typeof _==`function`&&_(n,e)},ne=e=>{(r||f===`nest`)&&typeof y==`function`&&y(n,e)},T=()=>{f===`nest`&&a(n),(r||f===`nest`)&&typeof v==`function`&&v(n)},E=(0,B.useCallback)(()=>{typeof g==`function`&&g()},[g]),re=(0,B.useCallback)(()=>{typeof h==`function`&&h()},[h]);return B.createElement(Lr,{animationId:`treemap-${n.tooltipIndex}`,from:`translate(${w}px, ${ee}px)`,to:`translate(0, 0)`,attributeName:`transform`,begin:c,easing:u,isActive:s,duration:l,onAnimationStart:re,onAnimationEnd:E},e=>B.createElement(I,{onMouseEnter:te,onMouseLeave:ne,onClick:T,style:Q(Q({},e),{},{transformOrigin:`${S} ${C}`})},B.createElement(Ri,{id:o,content:t,dataKey:m,nodeProps:Q(Q({},n),{},{isAnimationActive:s,isUpdateAnimationActive:!d,width:b,height:x,x:S,y:C}),type:f,colorPanel:p})))}var Hi=class extends B.PureComponent{constructor(){super(...arguments),yi(this,`state`,Q({},Ii)),yi(this,`handleClick`,e=>{var{onClick:t,type:n}=this.props;if(n===`nest`&&e.children){var{width:r,height:i,dataKey:a,nameKey:o,aspectRatio:s}=this.props,c=Di({depth:0,node:Q(Q({},e),{},{x:0,y:0,width:r,height:i}),index:0,dataKey:a,nameKey:o,nestedActiveTooltipIndex:e.tooltipIndex}),l=Pi(c,s),{nestIndex:u}=this.state;u.push(e),this.setState({formatRoot:l,currentRoot:c,nestIndex:u})}t&&t(e)}),yi(this,`handleTouchMove`,e=>{var t=e.touches[0];if(t!=null){var n=document.elementFromPoint(t.clientX,t.clientY);if(!(!n||!n.getAttribute||this.state.formatRoot==null)){var r=n.getAttribute(`data-recharts-item-index`),i=wi(this.state.formatRoot,r);if(Ci(i)){var{dataKey:a,dispatch:o}=this.props;o(De({activeIndex:r,activeDataKey:a,activeCoordinate:{x:i.x+i.width/2,y:i.y+i.height/2},activeGraphicalItemId:this.props.id}))}}}})}static getDerivedStateFromProps(e,t){if(e.data!==t.prevData||e.type!==t.prevType||e.width!==t.prevWidth||e.height!==t.prevHeight||e.dataKey!==t.prevDataKey||e.aspectRatio!==t.prevAspectRatio){var n=Di({depth:0,node:{children:e.data,x:0,y:0,width:e.width,height:e.height},index:0,dataKey:e.dataKey,nameKey:e.nameKey}),r=Pi(n,e.aspectRatio);return Q(Q({},t),{},{formatRoot:r,currentRoot:n,nestIndex:[n],prevAspectRatio:e.aspectRatio,prevData:e.data,prevWidth:e.width,prevHeight:e.height,prevDataKey:e.dataKey,prevType:e.type})}return null}handleNestIndex(e,t){var{nestIndex:n}=this.state,{width:r,height:i,dataKey:a,nameKey:o,aspectRatio:s}=this.props,c=Pi(Di({depth:0,node:Q(Q({},e),{},{x:0,y:0,width:r,height:i}),index:0,dataKey:a,nameKey:o,nestedActiveTooltipIndex:e.tooltipIndex}),s);n=n.slice(0,t+1),this.setState({formatRoot:c,currentRoot:e,nestIndex:n})}renderNode(e,t){var{content:n,type:r}=this.props,i=Q(Q(Q({},Pe(this.props)),t),{},{root:e}),a=!t.children||!t.children.length,{currentRoot:o}=this.state;return!(o?.children||[]).filter(e=>e.depth===t.depth&&e.name===t.name).length&&e.depth&&r===`nest`?null:B.createElement(I,{key:`recharts-treemap-node-${i.x}-${i.y}-${i.name}`,className:`recharts-treemap-depth-${t.depth}`},B.createElement(Vi,{isLeaf:a,content:n,nodeProps:i,treemapProps:this.props,onNestClick:this.handleClick}),t.children&&t.children.length?t.children.map(e=>this.renderNode(t,e)):null)}renderAllNodes(){var{formatRoot:e}=this.state;return e?this.renderNode(e,e):null}renderNestIndex(){var{nameKey:e,nestIndexContent:t}=this.props,{nestIndex:n}=this.state;return B.createElement(`div`,{className:`recharts-treemap-nest-index-wrapper`,style:{marginTop:`8px`,textAlign:`center`}},n.map((n,r)=>{var i=(0,or.default)(n,e,`root`),a=typeof i==`string`?i:`root`,o;return B.isValidElement(t)&&(o=B.cloneElement(t,n,r)),o=typeof t==`function`?t(n,r):a,B.createElement(`div`,{onClick:this.handleNestIndex.bind(this,n,r),key:`nest-index-${Le()}`,className:`recharts-treemap-nest-index-box`,style:{cursor:`pointer`,display:`inline-block`,padding:`0 7px`,background:`#000`,color:`#fff`,marginRight:`3px`}},o)}))}render(){var e=this.props,{width:t,height:n,className:r,style:i,children:a,type:o}=e,s=Pe(gi(e,hi));return B.createElement(B.Fragment,null,B.createElement(zi,{dataKey:this.props.dataKey,nameKey:this.props.nameKey,stroke:this.props.stroke,fill:this.props.fill,currentRoot:this.state.currentRoot,id:this.props.id}),B.createElement(tt,Z({},s,{width:t,height:o===`nest`?n-30:n,onTouchMove:this.handleTouchMove}),this.renderAllNodes(),a),o===`nest`&&this.renderNestIndex())}};yi(Hi,`displayName`,`Treemap`);function Ui(e){var t=k(),n=m(),r=lt();if(!Gt(n)||!Gt(r))return null;var{id:i}=e;return B.createElement(Rt,{id:i,type:`treemap`},i=>B.createElement(Hi,Z({},e,{id:i,width:n,height:r,dispatch:t})))}function Wi(e){var t=j(e,Fi),{className:n,style:r,width:i,height:a,throttleDelay:o,throttledEvents:s}=t,[c,l]=(0,B.useState)(null);return B.createElement(Ge,{preloadedState:{options:Ei},reduxStoreName:t.className??`Treemap`},B.createElement(b,{margin:Bi}),B.createElement(He,{throttleDelay:o,throttledEvents:s}),B.createElement(Tt,{dispatchTouchEvents:!1,className:n,style:r,width:i,height:a,responsive:!1,ref:e=>{c==null&&e!=null&&l(e)},onMouseEnter:void 0,onMouseLeave:void 0,onClick:void 0,onMouseMove:void 0,onMouseDown:void 0,onMouseUp:void 0,onContextMenu:void 0,onDoubleClick:void 0,onTouchStart:void 0,onTouchMove:void 0,onTouchEnd:void 0},B.createElement(ye.Provider,{value:c},B.createElement(Ui,t))))}function Gi({active:e,payload:t,label:n}){return!e||!t?.length?null:(0,V.jsxs)(`div`,{className:`bg-popover border border-border/30 rounded-lg p-2 text-xs shadow-lg`,children:[(0,V.jsx)(`p`,{className:`text-muted-foreground mb-1`,children:n}),(0,V.jsxs)(`p`,{className:`font-medium`,children:[`$`,t[0].value.toFixed(4)]})]})}function Ki(e){try{return Be(new Date(e),`MMM d`)}catch{return e}}function qi({data:e}){if(!(e.length>0&&e.some(e=>e.costUsd>0)))return(0,V.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium mb-3`,children:`Cost Over Time`}),(0,V.jsx)(`div`,{className:`h-[220px] flex items-center justify-center text-xs text-muted-foreground`,children:`No cost data for this period`})]});let t=Math.max(1,Math.floor(e.length/7)),n=e.filter((e,n)=>n%t===0).map(e=>e.date);return(0,V.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium mb-3`,children:`Cost Over Time`}),(0,V.jsx)(D,{width:`100%`,height:220,children:(0,V.jsxs)(Ie,{data:e,margin:{top:4,right:8,left:0,bottom:0},children:[(0,V.jsx)(z,{strokeDasharray:`3 3`,stroke:`var(--color-border)`}),(0,V.jsx)(N,{dataKey:`date`,ticks:n,tickFormatter:Ki,tick:{fontSize:10,fill:`var(--color-muted-foreground)`},axisLine:!1,tickLine:!1}),(0,V.jsx)(F,{tickFormatter:e=>`$${e.toFixed(2)}`,tick:{fontSize:10,fill:`var(--color-muted-foreground)`},axisLine:!1,tickLine:!1,width:55}),(0,V.jsx)(E,{content:(0,V.jsx)(Gi,{})}),(0,V.jsx)(Ne,{type:`monotone`,dataKey:`costUsd`,stroke:L.purple,strokeWidth:2,dot:!1,activeDot:{r:3,fill:L.purple}})]})})]})}function Ji({active:e,payload:t}){if(!e||!t?.length)return null;let n=t[0];return(0,V.jsxs)(`div`,{className:`bg-popover border border-border/30 rounded-lg p-2 text-xs shadow-lg`,children:[(0,V.jsx)(`p`,{className:`capitalize font-medium`,children:n.name}),(0,V.jsxs)(`p`,{className:`text-muted-foreground`,children:[n.value,` jobs`]})]})}function Yi({data:e}){if(e.length===0)return(0,V.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium mb-3`,children:`Jobs by Status`}),(0,V.jsx)(`div`,{className:`h-[220px] flex items-center justify-center text-xs text-muted-foreground`,children:`No jobs in this period`})]});let t=e.reduce((e,t)=>e+t.count,0);return(0,V.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium mb-3`,children:`Jobs by Status`}),(0,V.jsx)(D,{width:`100%`,height:220,children:(0,V.jsxs)(ri,{children:[(0,V.jsx)(Fr,{data:e,dataKey:`count`,nameKey:`status`,cx:`50%`,cy:`50%`,innerRadius:60,outerRadius:90,paddingAngle:2,children:e.map(e=>(0,V.jsx)(C,{fill:St[e.status]??`var(--color-muted-foreground)`},e.status))}),(0,V.jsx)(E,{content:(0,V.jsx)(Ji,{})}),(0,V.jsx)(K,{formatter:n=>{let r=e.find(e=>e.status===n),i=r?(r.count/t*100).toFixed(0):`0`;return(0,V.jsxs)(`span`,{className:`text-xs capitalize`,children:[n,` (`,r?.count??0,`, `,i,`%)`]})}})]})})]})}var Xi=[`<1m`,`1-3m`,`3-5m`,`5-10m`,`>10m`];function Zi(e){if(e===null)return`—`;let t=Math.round(e/1e3),n=Math.floor(t/60),r=t%60;return n===0?`${r}s`:`${n}m ${r}s`}function Qi({active:e,payload:t,label:n}){return!e||!t?.length?null:(0,V.jsxs)(`div`,{className:`bg-popover border border-border/30 rounded-lg p-2 text-xs shadow-lg`,children:[(0,V.jsx)(`p`,{className:`text-muted-foreground mb-1`,children:n}),(0,V.jsxs)(`p`,{className:`font-medium`,children:[t[0].value,` jobs`]})]})}function $i({data:e,percentiles:t}){let n=Xi.map(t=>({bucket:t,count:e.find(e=>e.bucket===t)?.count??0}));return n.some(e=>e.count>0)?(0,V.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium mb-3`,children:`Duration Distribution`}),(0,V.jsx)(D,{width:`100%`,height:180,children:(0,V.jsxs)(rt,{data:n,margin:{top:4,right:8,left:0,bottom:0},children:[(0,V.jsx)(z,{strokeDasharray:`3 3`,stroke:`var(--color-border)`,vertical:!1}),(0,V.jsx)(N,{dataKey:`bucket`,tick:{fontSize:10,fill:`var(--color-muted-foreground)`},axisLine:!1,tickLine:!1}),(0,V.jsx)(F,{allowDecimals:!1,tick:{fontSize:10,fill:`var(--color-muted-foreground)`},axisLine:!1,tickLine:!1,width:30}),(0,V.jsx)(E,{content:(0,V.jsx)(Qi,{})}),(0,V.jsx)(M,{dataKey:`count`,fill:L.cyan,radius:[3,3,0,0]})]})}),(0,V.jsx)(`div`,{className:`flex items-center gap-3 mt-2`,children:[`p50`,`p75`,`p95`].map(e=>(0,V.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,V.jsxs)(`span`,{className:`text-[10px] text-muted-foreground uppercase`,children:[e,`:`]}),(0,V.jsx)(`span`,{className:`text-[10px] font-medium tabular-nums`,children:Zi(t[e])})]},e))})]}):(0,V.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium mb-3`,children:`Duration Distribution`}),(0,V.jsx)(`div`,{className:`h-[220px] flex items-center justify-center text-xs text-muted-foreground`,children:`No duration data available`})]})}function ea({active:e,payload:t,label:n}){return!e||!t?.length?null:(0,V.jsxs)(`div`,{className:`bg-popover border border-border/30 rounded-lg p-2 text-xs shadow-lg`,children:[(0,V.jsx)(`p`,{className:`text-muted-foreground mb-1 font-mono truncate max-w-48`,children:n}),t.map(e=>(0,V.jsxs)(`p`,{style:{color:e.color},children:[e.name,`: `,e.value.toLocaleString()]},e.name))]})}function ta({data:e}){if(e.length===0)return(0,V.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium mb-3`,children:`Token Efficiency`}),(0,V.jsx)(`div`,{className:`h-[220px] flex items-center justify-center text-xs text-muted-foreground`,children:`No token data for this period`})]});let t=e.map(e=>({...e,name:e.command.length>20?`…${e.command.slice(-18)}`:e.command}));return(0,V.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium mb-3`,children:`Token Efficiency`}),(0,V.jsx)(D,{width:`100%`,height:220,children:(0,V.jsxs)(rt,{layout:`vertical`,data:t,margin:{top:4,right:8,left:0,bottom:0},children:[(0,V.jsx)(z,{strokeDasharray:`3 3`,stroke:`var(--color-border)`,horizontal:!1}),(0,V.jsx)(N,{type:`number`,tick:{fontSize:10,fill:`var(--color-muted-foreground)`},axisLine:!1,tickLine:!1,tickFormatter:e=>e>=1e3?`${(e/1e3).toFixed(0)}k`:String(e)}),(0,V.jsx)(F,{type:`category`,dataKey:`name`,width:110,tick:{fontSize:9,fill:`var(--color-muted-foreground)`,fontFamily:`monospace`},axisLine:!1,tickLine:!1}),(0,V.jsx)(E,{content:(0,V.jsx)(ea,{})}),(0,V.jsx)(K,{formatter:e=>(0,V.jsx)(`span`,{className:`text-xs`,children:e})}),(0,V.jsx)(M,{dataKey:`tokensOut`,name:`Output tokens`,fill:L.purple,stackId:`a`,radius:[0,3,3,0]}),(0,V.jsx)(M,{dataKey:`tokensCacheRead`,name:`Cached tokens`,fill:L.cyan,stackId:`a`,radius:[0,3,3,0]})]})})]})}function na(e){return e===null?`—`:`$${e.toFixed(4)}`}function ra(e){if(e===null)return`—`;let t=Math.round(e/1e3),n=Math.floor(t/60),r=t%60;return n===0?`${r}s`:`${n}m ${r}s`}function ia({rate:e}){let t=(e*100).toFixed(0);return(0,V.jsxs)(`span`,{className:l(`inline-block px-1.5 py-0.5 rounded text-[10px] font-medium`,e>=.8?`bg-green-400/10 text-green-400`:e>=.5?`bg-orange-400/10 text-orange-400`:`bg-red-400/10 text-red-400`),children:[t,`%`]})}function $({label:e,sortKey:t,current:n,dir:r,onSort:i}){return(0,V.jsx)(`th`,{onClick:()=>i(t),className:`px-3 py-2 text-left text-[10px] font-medium text-muted-foreground uppercase tracking-wide cursor-pointer select-none hover:text-foreground whitespace-nowrap`,children:(0,V.jsxs)(`span`,{className:`inline-flex items-center gap-1`,children:[e,n===t?r===`asc`?(0,V.jsx)(Kt,{className:`w-3 h-3`}):(0,V.jsx)(qt,{className:`w-3 h-3`}):(0,V.jsx)(Yt,{className:`w-3 h-3 opacity-40`})]})})}function aa({data:e}){let[t,n]=(0,B.useState)(`totalCostUsd`),[r,i]=(0,B.useState)(`desc`);function a(e){e===t?i(e=>e===`asc`?`desc`:`asc`):(n(e),i(`desc`))}let o=[...e].sort((e,n)=>{let i=e[t]??-1/0,a=n[t]??-1/0,o=typeof i==`string`?i.localeCompare(a):i-a;return r===`asc`?o:-o});return e.length===0?(0,V.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium mb-3`,children:`Command Performance`}),(0,V.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No command data for this period`})]}):(0,V.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium mb-3`,children:`Command Performance`}),(0,V.jsx)(`div`,{className:`overflow-x-auto`,children:(0,V.jsxs)(`table`,{className:`w-full text-xs`,children:[(0,V.jsx)(`thead`,{children:(0,V.jsxs)(`tr`,{className:`border-b border-border/30`,children:[(0,V.jsx)($,{label:`Command`,sortKey:`command`,current:t,dir:r,onSort:a}),(0,V.jsx)($,{label:`Runs`,sortKey:`totalRuns`,current:t,dir:r,onSort:a}),(0,V.jsx)($,{label:`Success Rate`,sortKey:`successRate`,current:t,dir:r,onSort:a}),(0,V.jsx)($,{label:`Avg Cost`,sortKey:`avgCostUsd`,current:t,dir:r,onSort:a}),(0,V.jsx)($,{label:`Avg Duration`,sortKey:`avgDurationMs`,current:t,dir:r,onSort:a}),(0,V.jsx)($,{label:`Total Cost`,sortKey:`totalCostUsd`,current:t,dir:r,onSort:a})]})}),(0,V.jsx)(`tbody`,{children:o.map(e=>(0,V.jsxs)(`tr`,{className:`border-b border-border/20 hover:bg-accent/20 transition-colors`,children:[(0,V.jsx)(`td`,{className:`px-3 py-2 font-mono text-[10px] text-foreground`,children:e.command}),(0,V.jsx)(`td`,{className:`px-3 py-2 tabular-nums`,children:e.totalRuns}),(0,V.jsx)(`td`,{className:`px-3 py-2`,children:(0,V.jsx)(ia,{rate:e.successRate})}),(0,V.jsx)(`td`,{className:`px-3 py-2 tabular-nums`,children:na(e.avgCostUsd)}),(0,V.jsx)(`td`,{className:`px-3 py-2 tabular-nums`,children:ra(e.avgDurationMs)}),(0,V.jsx)(`td`,{className:`px-3 py-2 tabular-nums font-medium`,children:na(e.totalCostUsd)})]},e.command))})]})})]})}function oa({active:e,payload:t,label:n}){return!e||!t?.length?null:(0,V.jsxs)(`div`,{className:`bg-popover border border-border/30 rounded-lg p-2 text-xs shadow-lg`,children:[(0,V.jsx)(`p`,{className:`text-muted-foreground mb-1`,children:n}),t.map(e=>(0,V.jsxs)(`p`,{style:{color:e.color},children:[e.name,`: `,e.value]},e.name))]})}function sa(e){try{return Be(new Date(e),`MMM d`)}catch{return e}}function ca({data:e}){if(!(e.length>0&&e.some(e=>e.completed+e.failed+e.canceled>0)))return(0,V.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium mb-3`,children:`Daily Throughput`}),(0,V.jsx)(`div`,{className:`h-[220px] flex items-center justify-center text-xs text-muted-foreground`,children:`No throughput data for this period`})]});let t=Math.max(1,Math.floor(e.length/7)),n=e.filter((e,n)=>n%t===0).map(e=>e.date);return(0,V.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium mb-3`,children:`Daily Throughput`}),(0,V.jsx)(D,{width:`100%`,height:220,children:(0,V.jsxs)(rt,{data:e,margin:{top:4,right:8,left:0,bottom:0},children:[(0,V.jsx)(z,{strokeDasharray:`3 3`,stroke:`var(--color-border)`,vertical:!1}),(0,V.jsx)(N,{dataKey:`date`,ticks:n,tickFormatter:sa,tick:{fontSize:10,fill:`var(--color-muted-foreground)`},axisLine:!1,tickLine:!1}),(0,V.jsx)(F,{allowDecimals:!1,tick:{fontSize:10,fill:`var(--color-muted-foreground)`},axisLine:!1,tickLine:!1,width:30}),(0,V.jsx)(E,{content:(0,V.jsx)(oa,{})}),(0,V.jsx)(K,{formatter:e=>(0,V.jsx)(`span`,{className:`text-xs capitalize`,children:e})}),(0,V.jsx)(M,{dataKey:`completed`,name:`Completed`,stackId:`a`,fill:L.purple}),(0,V.jsx)(M,{dataKey:`failed`,name:`Failed`,stackId:`a`,fill:L.pink}),(0,V.jsx)(M,{dataKey:`canceled`,name:`Canceled`,stackId:`a`,fill:L.orange,radius:[3,3,0,0]})]})})]})}function la({x:e=0,y:t=0,width:n=0,height:r=0,name:i=``,size:a=0,colorIndex:o=0}){let s=Ot[o%Ot.length];return(0,V.jsxs)(`g`,{children:[(0,V.jsx)(`rect`,{x:e,y:t,width:n,height:r,style:{fill:s,fillOpacity:.8,stroke:`var(--color-background)`,strokeWidth:2},rx:4}),n>50&&r>30&&(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`text`,{x:e+6,y:t+16,fill:`var(--color-background)`,fontSize:10,fontFamily:`monospace`,style:{overflow:`hidden`},children:i.length>Math.floor(n/6)?i.slice(0,Math.floor(n/6)-1)+`…`:i}),r>45&&(0,V.jsxs)(`text`,{x:e+6,y:t+30,fill:`hsl(231 15% 18% / 0.7)`,fontSize:9,children:[`$`,a.toFixed(4)]})]})]})}function ua({active:e,payload:t}){if(!e||!t?.length)return null;let n=t[0].payload;return n?(0,V.jsxs)(`div`,{className:`bg-popover border border-border/30 rounded-lg p-2 text-xs shadow-lg`,children:[(0,V.jsx)(`p`,{className:`font-mono font-medium mb-1`,children:n.name}),(0,V.jsxs)(`p`,{className:`text-muted-foreground`,children:[`Cost: $`,n.size.toFixed(4)]}),(0,V.jsxs)(`p`,{className:`text-muted-foreground`,children:[`Jobs: `,n.jobCount]})]}):null}function da({data:e}){let t=e.filter(e=>e.totalCostUsd>0);if(t.length===0)return(0,V.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium mb-3`,children:`Cost per Command`}),(0,V.jsx)(`div`,{className:`h-[220px] flex items-center justify-center text-xs text-muted-foreground`,children:`No cost data for this period`})]});let n=t.map((e,t)=>({name:e.command,size:e.totalCostUsd,jobCount:e.jobCount,colorIndex:t}));return(0,V.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium mb-3`,children:`Cost per Command`}),(0,V.jsx)(D,{width:`100%`,height:220,children:(0,V.jsx)(Wi,{data:n,dataKey:`size`,content:(0,V.jsx)(la,{}),children:(0,V.jsx)(E,{content:(0,V.jsx)(ua,{})})})})]})}function fa({label:e,value:t}){return(0,V.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-3 space-y-1`,children:[(0,V.jsx)(`p`,{className:`text-[10px] text-muted-foreground uppercase tracking-wide`,children:e}),(0,V.jsx)(`p`,{className:`text-base font-semibold tabular-nums`,children:t})]})}function pa({data:e}){let t=e.costPerSuccess===null?`—`:`$${e.costPerSuccess.toFixed(4)}`,n=e.apiEfficiencyPct===null?`—`:`${e.apiEfficiencyPct.toFixed(0)}%`,r=`$${e.failureCostUsd.toFixed(4)}`;return(0,V.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4 space-y-4`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium`,children:`Bonus Metrics`}),(0,V.jsxs)(`div`,{className:`grid grid-cols-3 gap-3`,children:[(0,V.jsx)(fa,{label:`Cost per Success`,value:t}),(0,V.jsx)(fa,{label:`API Efficiency`,value:n}),(0,V.jsx)(fa,{label:`Failure Cost`,value:r})]}),(0,V.jsxs)(`div`,{children:[(0,V.jsx)(`h4`,{className:`text-xs font-medium text-muted-foreground mb-2`,children:`Model Breakdown`}),e.modelBreakdown.length===0?(0,V.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No model data for this period`}):(0,V.jsx)(`div`,{className:`overflow-x-auto`,children:(0,V.jsxs)(`table`,{className:`w-full text-xs`,children:[(0,V.jsx)(`thead`,{children:(0,V.jsxs)(`tr`,{className:`border-b border-border/30`,children:[(0,V.jsx)(`th`,{className:`px-3 py-1.5 text-left text-[10px] font-medium text-muted-foreground uppercase tracking-wide`,children:`Model`}),(0,V.jsx)(`th`,{className:`px-3 py-1.5 text-left text-[10px] font-medium text-muted-foreground uppercase tracking-wide`,children:`Jobs`}),(0,V.jsx)(`th`,{className:`px-3 py-1.5 text-left text-[10px] font-medium text-muted-foreground uppercase tracking-wide`,children:`Total Cost`})]})}),(0,V.jsx)(`tbody`,{children:e.modelBreakdown.map(e=>(0,V.jsxs)(`tr`,{className:`border-b border-border/20`,children:[(0,V.jsx)(`td`,{className:`px-3 py-1.5 font-mono text-[10px]`,children:e.model}),(0,V.jsx)(`td`,{className:`px-3 py-1.5 tabular-nums`,children:e.jobCount}),(0,V.jsxs)(`td`,{className:`px-3 py-1.5 tabular-nums`,children:[`$`,e.totalCostUsd.toFixed(4)]})]},e.model))})]})})]})]})}var ma=[{key:`cost`,label:`Avg Cost ($)`,color:L.purple},{key:`duration`,label:`Avg Duration (min)`,color:L.cyan},{key:`successRate`,label:`Success Rate (%)`,color:L.green}];function ha({active:e,payload:t,label:n}){return!e||!t?.length?null:(0,V.jsxs)(`div`,{className:`bg-popover border border-border/30 rounded-lg p-2 text-xs shadow-lg space-y-1`,children:[(0,V.jsx)(`p`,{className:`text-muted-foreground mb-1`,children:n}),t.map(e=>(0,V.jsxs)(`p`,{style:{color:e.color},children:[e.name,`: `,(0,V.jsx)(`span`,{className:`font-medium`,children:e.value})]},e.name))]})}function ga(e){try{return Be(new Date(e),`MMM d`)}catch{return e}}function _a({points:e}){let[t,n]=(0,B.useState)(new Set([`cost`,`successRate`])),r=e.some(e=>e.jobCount>0),i=e.map(e=>({date:e.date,cost:e.avgCostUsd===null?0:parseFloat(e.avgCostUsd.toFixed(4)),duration:e.avgDurationMs===null?0:parseFloat((e.avgDurationMs/6e4).toFixed(2)),successRate:parseFloat((e.successRate*100).toFixed(1)),jobCount:e.jobCount})),a=Math.max(1,Math.floor(e.length/7)),o=e.filter((e,t)=>t%a===0).map(e=>e.date);function s(e){n(t=>{let n=new Set(t);return n.has(e)?n.size>1&&n.delete(e):n.add(e),n})}return(0,V.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,V.jsxs)(`div`,{className:`flex items-center justify-between mb-3`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium`,children:`Performance Trends`}),(0,V.jsx)(`div`,{className:`flex items-center gap-2`,children:ma.map(e=>(0,V.jsxs)(`button`,{type:`button`,onClick:()=>s(e.key),className:`flex items-center gap-1 text-[10px] px-2 py-0.5 rounded transition-colors ${t.has(e.key)?`bg-accent text-foreground`:`text-muted-foreground hover:text-foreground hover:bg-accent/50`}`,children:[(0,V.jsx)(`span`,{className:`w-2 h-2 rounded-full inline-block shrink-0`,style:{background:e.color}}),e.label]},e.key))})]}),r?(0,V.jsx)(D,{width:`100%`,height:220,children:(0,V.jsxs)(Ie,{data:i,margin:{top:4,right:8,left:0,bottom:0},children:[(0,V.jsx)(z,{strokeDasharray:`3 3`,stroke:`var(--color-border)`}),(0,V.jsx)(N,{dataKey:`date`,ticks:o,tickFormatter:ga,tick:{fontSize:10,fill:`var(--color-muted-foreground)`},axisLine:!1,tickLine:!1}),(0,V.jsx)(F,{tick:{fontSize:10,fill:`var(--color-muted-foreground)`},axisLine:!1,tickLine:!1,width:40}),(0,V.jsx)(E,{content:(0,V.jsx)(ha,{})}),(0,V.jsx)(K,{wrapperStyle:{fontSize:`10px`,paddingTop:`8px`}}),t.has(`cost`)&&(0,V.jsx)(Ne,{type:`monotone`,dataKey:`cost`,name:`Avg Cost ($)`,stroke:L.purple,strokeWidth:2,dot:!1,activeDot:{r:3,fill:L.purple}}),t.has(`duration`)&&(0,V.jsx)(Ne,{type:`monotone`,dataKey:`duration`,name:`Avg Duration (min)`,stroke:L.cyan,strokeWidth:2,dot:!1,activeDot:{r:3,fill:L.cyan}}),t.has(`successRate`)&&(0,V.jsx)(Ne,{type:`monotone`,dataKey:`successRate`,name:`Success Rate (%)`,stroke:L.green,strokeWidth:2,dot:!1,activeDot:{r:3,fill:L.green}})]})}):(0,V.jsx)(`div`,{className:`h-[220px] flex items-center justify-center text-xs text-muted-foreground`,children:`No job data for this period`})]})}function va(){return(0,V.jsxs)(`div`,{className:`space-y-4`,children:[(0,V.jsx)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3`,children:Array.from({length:4}).map((e,t)=>(0,V.jsx)(`div`,{className:`h-20 rounded-lg border border-border/40 bg-card/50 animate-pulse`},t))}),(0,V.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:Array.from({length:4}).map((e,t)=>(0,V.jsx)(`div`,{className:`h-[260px] rounded-lg border border-border/40 bg-card/50 animate-pulse`},t))}),(0,V.jsx)(`div`,{className:`h-[180px] rounded-lg border border-border/40 bg-card/50 animate-pulse`})]})}function ya({message:e,onRetry:t}){return(0,V.jsxs)(`div`,{className:`rounded-lg border border-red-400/30 bg-red-400/10 p-4 flex items-center justify-between`,children:[(0,V.jsx)(`p`,{className:`text-sm text-red-400`,children:e}),(0,V.jsxs)(`button`,{onClick:t,className:`flex items-center gap-1.5 h-7 px-3 rounded-md text-xs text-red-400 border border-red-400/30 hover:bg-red-400/10 transition-colors`,children:[(0,V.jsx)(Jt,{className:`w-3 h-3`}),`Retry`]})]})}var ba=[{value:`1d`,label:`1d`},{value:`7d`,label:`7d`},{value:`30d`,label:`30d`}];function xa(){let{activeProjectId:e}=o(),[t,n]=(0,B.useState)(`7d`),[r,i]=(0,B.useState)(``),[a,c]=(0,B.useState)(``),[l,d]=(0,B.useState)(null),[f,p]=(0,B.useState)(!0),[m,h]=(0,B.useState)(null),[g,_]=(0,B.useState)(0),[v,y]=(0,B.useState)(`7d`),[b,x]=(0,B.useState)(null),S=(0,B.useRef)(new Map);(0,B.useEffect)(()=>{if(e){let t=S.current.get(e);t&&(d(t),p(!1))}let n=new AbortController;!l&&!S.current.get(e??``)&&p(!0),h(null);let i=new URLSearchParams({period:t});if(t===`custom`){if(!r||!a){p(!1);return}i.set(`from`,r),i.set(`to`,a)}return fetch(`${s()}/analytics?${i}`,{signal:n.signal}).then(e=>{if(!e.ok)throw Error(`HTTP ${e.status}`);return e.json()}).then(t=>{d(t),e&&S.current.set(e,t),p(!1)}).catch(e=>{e.name!==`AbortError`&&(h(e.message),p(!1))}),()=>n.abort()},[t,r,a,g,e]),(0,B.useEffect)(()=>{let e=new AbortController;return fetch(`${s()}/trends?period=${v}`,{signal:e.signal}).then(e=>e.ok?e.json():Promise.reject(Error(`HTTP ${e.status}`))).then(e=>x(e)).catch(e=>{e.name!==`AbortError`&&console.warn(`[analytics] trends fetch failed:`,e.message)}),()=>e.abort()},[v,e]);function C(e,t,r){n(e),i(t??``),c(r??``)}function w(){_(e=>e+1)}return(0,V.jsxs)(`div`,{className:`flex flex-col gap-4 p-4`,children:[(0,V.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,V.jsxs)(`div`,{children:[(0,V.jsx)(`h1`,{className:`text-base font-semibold`,children:`Project Analytics`}),l&&(0,V.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:l.period.label})]}),(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,V.jsx)(Ht,{period:t,from:r,to:a,onChange:C}),(0,V.jsx)(u,{baseUrl:`${s()}/analytics/export`,params:{period:t,...r?{from:r}:{},...a?{to:a}:{}}})]})]}),f&&(0,V.jsx)(va,{}),!f&&m&&(0,V.jsx)(ya,{message:`Failed to load analytics: ${m}`,onRetry:w}),!f&&!m&&l&&(0,V.jsxs)(`div`,{className:`space-y-6`,children:[(0,V.jsx)(rn,{kpi:l.kpi}),(0,V.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:[(0,V.jsx)(qi,{data:l.costTimeline}),(0,V.jsx)(Yi,{data:l.statusBreakdown}),(0,V.jsx)($i,{data:l.durationHistogram,percentiles:l.durationPercentiles}),(0,V.jsx)(ta,{data:l.tokenEfficiency})]}),(0,V.jsx)(aa,{data:l.commandPerformance}),(0,V.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:[(0,V.jsx)(ca,{data:l.dailyThroughput}),(0,V.jsx)(da,{data:l.costPerCommand})]}),(0,V.jsx)(pa,{data:l.bonusMetrics}),b&&(0,V.jsxs)(`div`,{children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-2 mb-2`,children:[(0,V.jsx)(`h2`,{className:`text-sm font-medium`,children:`Trends`}),(0,V.jsx)(`div`,{className:`flex items-center gap-1`,children:ba.map(e=>(0,V.jsx)(`button`,{type:`button`,onClick:()=>y(e.value),className:`px-2 py-0.5 rounded text-[10px] font-medium transition-colors ${v===e.value?`bg-accent text-foreground`:`text-muted-foreground hover:text-foreground hover:bg-accent/50`}`,children:e.label},e.value))})]}),(0,V.jsx)(_a,{points:b.points})]})]})]})}export{xa as default};
@@ -1,4 +1,4 @@
1
- import{n as e,o as t,r as n}from"./createLucideIcon-j4o5em8U.js";import"./react-dom-CzrF8Nvy.js";import{t as r}from"./utils-DSsSbmuB.js";import{C as i,N as a,T as o,a as s,f as c,i as l,j as u,p as d}from"./index-94S85Lsd.js";import{t as f}from"./lib-DnnFAwDK.js";/* empty css */var p=t(n(),1),m=e();function h({categories:e,activeCategory:t,activeSlug:n,onSelect:i,onHome:s}){return(0,m.jsxs)(`nav`,{className:`w-56 flex-shrink-0 border-r border-border overflow-y-auto py-4 px-3`,children:[(0,m.jsxs)(`button`,{onClick:s,className:`flex items-center gap-2 mb-4 px-2 text-xs font-bold text-muted-foreground hover:text-foreground transition-colors`,children:[(0,m.jsx)(a,{className:`w-3.5 h-3.5`}),`Documentation`]}),(0,m.jsx)(`div`,{className:`space-y-4`,children:e.map(e=>(0,m.jsxs)(`div`,{children:[(0,m.jsxs)(`div`,{className:`px-2 mb-1 flex items-center justify-between`,children:[(0,m.jsx)(`span`,{className:`text-xs font-semibold text-muted-foreground uppercase tracking-wider`,children:e.name}),e.docs.length>0&&(0,m.jsx)(`span`,{className:`text-[9px] font-medium text-muted-foreground/60 bg-muted/40 rounded px-1 py-0.5 leading-none`,children:e.docs.length})]}),e.docs.length===0?(0,m.jsx)(`p`,{className:`px-2 text-xs text-muted-foreground italic`,children:`No docs yet`}):(0,m.jsx)(`ul`,{className:`space-y-0.5`,children:e.docs.map(a=>(0,m.jsx)(`li`,{children:(0,m.jsxs)(`button`,{onClick:()=>i(e.slug,a.slug),className:r(`w-full flex items-center gap-1.5 px-2 py-1 rounded-md text-xs transition-colors text-left`,t===e.slug&&n===a.slug?`bg-accent text-foreground`:`text-muted-foreground hover:text-foreground hover:bg-accent/50`),children:[(0,m.jsx)(o,{className:`w-3 h-3 flex-shrink-0`}),a.title]})},a.slug))})]},e.slug))})]})}function g({categories:e,onSelect:t}){let n=e.reduce((e,t)=>e+t.docs.length,0);return(0,m.jsxs)(`div`,{className:`max-w-2xl mx-auto py-8 px-6`,children:[(0,m.jsxs)(`div`,{className:`mb-8`,children:[(0,m.jsx)(`h1`,{className:`text-xl font-bold mb-2`,children:`Documentation`}),(0,m.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n===0?`No documents yet. Add Markdown files to ~/.specrails/docs/ to get started.`:`${n} document${n===1?``:`s`} across ${e.filter(e=>e.docs.length>0).length} categories.`})]}),(0,m.jsx)(`div`,{className:`space-y-6`,children:e.map(e=>(0,m.jsxs)(`div`,{children:[(0,m.jsx)(`h2`,{className:`text-sm font-semibold text-muted-foreground uppercase tracking-wider mb-2`,children:e.name}),e.docs.length===0?(0,m.jsx)(`p`,{className:`text-xs text-muted-foreground italic pl-2`,children:`No documents in this category yet.`}):(0,m.jsx)(`ul`,{className:`space-y-1`,children:e.docs.map(n=>(0,m.jsx)(`li`,{children:(0,m.jsxs)(`button`,{onClick:()=>t(e.slug,n.slug),className:`w-full flex items-center gap-2 px-3 py-2 rounded-md text-sm hover:bg-accent transition-colors group text-left`,children:[(0,m.jsx)(o,{className:`w-3.5 h-3.5 text-muted-foreground flex-shrink-0`}),(0,m.jsx)(`span`,{className:`text-foreground group-hover:text-foreground`,children:n.title}),(0,m.jsx)(u,{className:`w-3 h-3 text-muted-foreground ml-auto md:opacity-0 md:group-hover:opacity-100 transition-opacity`})]})},n.slug))})]},e.slug))})]})}function _({category:e,slug:t,onNotFound:n}){let[r,a]=(0,p.useState)(null),[o,s]=(0,p.useState)(!0),[l,u]=(0,p.useState)(null);return(0,p.useEffect)(()=>{s(!0),u(null),a(null),fetch(`/api/docs/${e}/${t}`).then(async e=>{if(e.status===404){n();return}if(!e.ok)throw Error(`HTTP ${e.status}`);return e.json()}).then(e=>{e&&a(e)}).catch(e=>{u(e instanceof Error?e.message:`Failed to load document`)}).finally(()=>s(!1))},[e,t,n]),o?(0,m.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,m.jsx)(i,{className:`w-4 h-4 animate-spin text-muted-foreground`})}):l?(0,m.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,m.jsx)(`p`,{className:`text-sm text-destructive`,children:l})}):r?(0,m.jsx)(`article`,{className:`max-w-2xl mx-auto py-8 px-6`,children:(0,m.jsx)(`div`,{className:`prose prose-sm max-w-none
1
+ import{n as e,o as t,r as n}from"./createLucideIcon-j4o5em8U.js";import"./react-dom-CzrF8Nvy.js";import{t as r}from"./utils-DSsSbmuB.js";import{L as i,M as a,N as o,b as s,d as c,f as l,y as u,z as d}from"./index-CGeGMvIX.js";import{t as f}from"./lib-T3dOmNkJ.js";/* empty css */var p=t(n(),1),m=e();function h({categories:e,activeCategory:t,activeSlug:n,onSelect:i,onHome:a}){return(0,m.jsxs)(`nav`,{className:`w-56 flex-shrink-0 border-r border-border overflow-y-auto py-4 px-3`,children:[(0,m.jsxs)(`button`,{onClick:a,className:`flex items-center gap-2 mb-4 px-2 text-xs font-bold text-muted-foreground hover:text-foreground transition-colors`,children:[(0,m.jsx)(d,{className:`w-3.5 h-3.5`}),`Documentation`]}),(0,m.jsx)(`div`,{className:`space-y-4`,children:e.map(e=>(0,m.jsxs)(`div`,{children:[(0,m.jsxs)(`div`,{className:`px-2 mb-1 flex items-center justify-between`,children:[(0,m.jsx)(`span`,{className:`text-xs font-semibold text-muted-foreground uppercase tracking-wider`,children:e.name}),e.docs.length>0&&(0,m.jsx)(`span`,{className:`text-[9px] font-medium text-muted-foreground/60 bg-muted/40 rounded px-1 py-0.5 leading-none`,children:e.docs.length})]}),e.docs.length===0?(0,m.jsx)(`p`,{className:`px-2 text-xs text-muted-foreground italic`,children:`No docs yet`}):(0,m.jsx)(`ul`,{className:`space-y-0.5`,children:e.docs.map(a=>(0,m.jsx)(`li`,{children:(0,m.jsxs)(`button`,{onClick:()=>i(e.slug,a.slug),className:r(`w-full flex items-center gap-1.5 px-2 py-1 rounded-md text-xs transition-colors text-left`,t===e.slug&&n===a.slug?`bg-accent text-foreground`:`text-muted-foreground hover:text-foreground hover:bg-accent/50`),children:[(0,m.jsx)(o,{className:`w-3 h-3 flex-shrink-0`}),a.title]})},a.slug))})]},e.slug))})]})}function g({categories:e,onSelect:t}){let n=e.reduce((e,t)=>e+t.docs.length,0);return(0,m.jsxs)(`div`,{className:`max-w-2xl mx-auto py-8 px-6`,children:[(0,m.jsxs)(`div`,{className:`mb-8`,children:[(0,m.jsx)(`h1`,{className:`text-xl font-bold mb-2`,children:`Documentation`}),(0,m.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n===0?`No documents yet. Add Markdown files to ~/.specrails/docs/ to get started.`:`${n} document${n===1?``:`s`} across ${e.filter(e=>e.docs.length>0).length} categories.`})]}),(0,m.jsx)(`div`,{className:`space-y-6`,children:e.map(e=>(0,m.jsxs)(`div`,{children:[(0,m.jsx)(`h2`,{className:`text-sm font-semibold text-muted-foreground uppercase tracking-wider mb-2`,children:e.name}),e.docs.length===0?(0,m.jsx)(`p`,{className:`text-xs text-muted-foreground italic pl-2`,children:`No documents in this category yet.`}):(0,m.jsx)(`ul`,{className:`space-y-1`,children:e.docs.map(n=>(0,m.jsx)(`li`,{children:(0,m.jsxs)(`button`,{onClick:()=>t(e.slug,n.slug),className:`w-full flex items-center gap-2 px-3 py-2 rounded-md text-sm hover:bg-accent transition-colors group text-left`,children:[(0,m.jsx)(o,{className:`w-3.5 h-3.5 text-muted-foreground flex-shrink-0`}),(0,m.jsx)(`span`,{className:`text-foreground group-hover:text-foreground`,children:n.title}),(0,m.jsx)(i,{className:`w-3 h-3 text-muted-foreground ml-auto md:opacity-0 md:group-hover:opacity-100 transition-opacity`})]})},n.slug))})]},e.slug))})]})}function _({category:e,slug:t,onNotFound:n}){let[r,i]=(0,p.useState)(null),[o,c]=(0,p.useState)(!0),[l,d]=(0,p.useState)(null);return(0,p.useEffect)(()=>{c(!0),d(null),i(null),fetch(`/api/docs/${e}/${t}`).then(async e=>{if(e.status===404){n();return}if(!e.ok)throw Error(`HTTP ${e.status}`);return e.json()}).then(e=>{e&&i(e)}).catch(e=>{d(e instanceof Error?e.message:`Failed to load document`)}).finally(()=>c(!1))},[e,t,n]),o?(0,m.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,m.jsx)(a,{className:`w-4 h-4 animate-spin text-muted-foreground`})}):l?(0,m.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,m.jsx)(`p`,{className:`text-sm text-destructive`,children:l})}):r?(0,m.jsx)(`article`,{className:`max-w-2xl mx-auto py-8 px-6`,children:(0,m.jsx)(`div`,{className:`prose prose-sm max-w-none
2
2
  prose-headings:text-foreground prose-headings:font-bold
3
3
  prose-p:text-foreground/90
4
4
  prose-a:text-dracula-purple prose-a:no-underline hover:prose-a:underline
@@ -8,4 +8,4 @@ import{n as e,o as t,r as n}from"./createLucideIcon-j4o5em8U.js";import"./react-
8
8
  prose-blockquote:border-l-dracula-purple prose-blockquote:text-muted-foreground
9
9
  prose-hr:border-border
10
10
  prose-th:text-foreground prose-td:text-foreground/90
11
- prose-li:text-foreground/90`,children:(0,m.jsx)(d,{remarkPlugins:[c],rehypePlugins:[f],children:r.content})})}):null}function v({open:e,onClose:t}){let[n,r]=(0,p.useState)(null),[a,o]=(0,p.useState)(!0),[c,u]=(0,p.useState)(),[d,f]=(0,p.useState)();(0,p.useEffect)(()=>{e&&(o(!0),fetch(`/api/docs`).then(e=>e.json()).then(e=>r(e)).catch(()=>r({categories:[]})).finally(()=>o(!1)))},[e]);function v(e,t){u(e),f(t)}function y(){u(void 0),f(void 0)}let b=!!(c&&d);return(0,m.jsx)(l,{open:e,onOpenChange:e=>{e||t()},children:(0,m.jsx)(s,{className:`max-w-5xl max-h-[90vh] overflow-hidden p-0 flex flex-col`,children:(0,m.jsxs)(`div`,{className:`flex flex-1 overflow-hidden`,children:[a?(0,m.jsx)(`div`,{className:`w-56 flex-shrink-0 border-r border-border flex items-center justify-center`,children:(0,m.jsx)(i,{className:`w-3.5 h-3.5 animate-spin text-muted-foreground`})}):(0,m.jsx)(h,{categories:n?.categories??[],activeCategory:c,activeSlug:d,onSelect:v,onHome:y}),(0,m.jsx)(`main`,{className:`flex-1 overflow-y-auto`,children:b&&c&&d?(0,m.jsx)(_,{category:c,slug:d,onNotFound:y}):n&&(0,m.jsx)(g,{categories:n.categories,onSelect:v})})]})})})}export{v as default};
11
+ prose-li:text-foreground/90`,children:(0,m.jsx)(s,{remarkPlugins:[u],rehypePlugins:[f],children:r.content})})}):null}function v({open:e,onClose:t}){let[n,r]=(0,p.useState)(null),[i,o]=(0,p.useState)(!0),[s,u]=(0,p.useState)(),[d,f]=(0,p.useState)();(0,p.useEffect)(()=>{e&&(o(!0),fetch(`/api/docs`).then(e=>e.json()).then(e=>r(e)).catch(()=>r({categories:[]})).finally(()=>o(!1)))},[e]);function v(e,t){u(e),f(t)}function y(){u(void 0),f(void 0)}let b=!!(s&&d);return(0,m.jsx)(c,{open:e,onOpenChange:e=>{e||t()},children:(0,m.jsx)(l,{className:`max-w-5xl max-h-[90vh] overflow-hidden p-0 flex flex-col`,children:(0,m.jsxs)(`div`,{className:`flex flex-1 overflow-hidden`,children:[i?(0,m.jsx)(`div`,{className:`w-56 flex-shrink-0 border-r border-border flex items-center justify-center`,children:(0,m.jsx)(a,{className:`w-3.5 h-3.5 animate-spin text-muted-foreground`})}):(0,m.jsx)(h,{categories:n?.categories??[],activeCategory:s,activeSlug:d,onSelect:v,onHome:y}),(0,m.jsx)(`main`,{className:`flex-1 overflow-y-auto`,children:b&&s&&d?(0,m.jsx)(_,{category:s,slug:d,onNotFound:y}):n&&(0,m.jsx)(g,{categories:n.categories,onSelect:v})})]})})})}export{v as default};
@@ -1,4 +1,4 @@
1
- import{n as e,o as t,r as n}from"./createLucideIcon-j4o5em8U.js";import{t as r}from"./utils-DSsSbmuB.js";import{B as i,C as a,N as o,T as s,V as c,f as l,j as u,p as d,z as f}from"./index-94S85Lsd.js";import{t as p}from"./lib-DnnFAwDK.js";/* empty css */var m=t(n(),1),h=e();function g({categories:e,activeCategory:t,activeSlug:n}){return(0,h.jsxs)(`nav`,{className:`w-56 flex-shrink-0 border-r border-border overflow-y-auto py-4 px-3`,children:[(0,h.jsxs)(f,{to:`/docs`,className:`flex items-center gap-2 mb-4 px-2 text-xs font-bold text-muted-foreground hover:text-foreground transition-colors`,children:[(0,h.jsx)(o,{className:`w-3.5 h-3.5`}),`Documentation`]}),(0,h.jsx)(`div`,{className:`space-y-4`,children:e.map(e=>(0,h.jsxs)(`div`,{children:[(0,h.jsxs)(`div`,{className:`px-2 mb-1 flex items-center justify-between`,children:[(0,h.jsx)(`span`,{className:`text-xs font-semibold text-muted-foreground uppercase tracking-wider`,children:e.name}),e.docs.length>0&&(0,h.jsx)(`span`,{className:`text-[9px] font-medium text-muted-foreground/60 bg-muted/40 rounded px-1 py-0.5 leading-none`,children:e.docs.length})]}),e.docs.length===0?(0,h.jsx)(`p`,{className:`px-2 text-xs text-muted-foreground italic`,children:`No docs yet`}):(0,h.jsx)(`ul`,{className:`space-y-0.5`,children:e.docs.map(i=>{let a=t===e.slug&&n===i.slug;return(0,h.jsx)(`li`,{children:(0,h.jsxs)(f,{to:`/docs/${e.slug}/${i.slug}`,className:r(`flex items-center gap-1.5 px-2 py-1 rounded-md text-xs transition-colors`,a?`bg-accent text-foreground`:`text-muted-foreground hover:text-foreground hover:bg-accent/50`),children:[(0,h.jsx)(s,{className:`w-3 h-3 flex-shrink-0`}),i.title]})},i.slug)})})]},e.slug))})]})}function _({categories:e}){let t=e.reduce((e,t)=>e+t.docs.length,0);return(0,h.jsxs)(`div`,{className:`max-w-2xl mx-auto py-8 px-6`,children:[(0,h.jsxs)(`div`,{className:`mb-8`,children:[(0,h.jsx)(`h1`,{className:`text-xl font-bold mb-2`,children:`Documentation`}),(0,h.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:t===0?`No documents yet. Add Markdown files to ~/.specrails/docs/ to get started.`:`${t} document${t===1?``:`s`} across ${e.filter(e=>e.docs.length>0).length} categories.`})]}),(0,h.jsx)(`div`,{className:`space-y-6`,children:e.map(e=>(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`h2`,{className:`text-sm font-semibold text-muted-foreground uppercase tracking-wider mb-2`,children:e.name}),e.docs.length===0?(0,h.jsx)(`p`,{className:`text-xs text-muted-foreground italic pl-2`,children:`No documents in this category yet.`}):(0,h.jsx)(`ul`,{className:`space-y-1`,children:e.docs.map(t=>(0,h.jsx)(`li`,{children:(0,h.jsxs)(f,{to:`/docs/${e.slug}/${t.slug}`,className:`flex items-center gap-2 px-3 py-2 rounded-md text-sm hover:bg-accent transition-colors group`,children:[(0,h.jsx)(s,{className:`w-3.5 h-3.5 text-muted-foreground flex-shrink-0`}),(0,h.jsx)(`span`,{className:`text-foreground group-hover:text-foreground`,children:t.title}),(0,h.jsx)(u,{className:`w-3 h-3 text-muted-foreground ml-auto md:opacity-0 md:group-hover:opacity-100 transition-opacity`})]})},t.slug))})]},e.slug))})]})}function v({category:e,slug:t}){let[n,r]=(0,m.useState)(null),[o,s]=(0,m.useState)(!0),[c,u]=(0,m.useState)(null),f=i();return(0,m.useEffect)(()=>{s(!0),u(null),r(null),fetch(`/api/docs/${e}/${t}`).then(async e=>{if(e.status===404){f(`/docs`,{replace:!0});return}if(!e.ok)throw Error(`HTTP ${e.status}`);return e.json()}).then(e=>{e&&r(e)}).catch(e=>{u(e instanceof Error?e.message:`Failed to load document`)}).finally(()=>s(!1))},[e,t,f]),o?(0,h.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,h.jsx)(a,{className:`w-4 h-4 animate-spin text-muted-foreground`})}):c?(0,h.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,h.jsx)(`p`,{className:`text-sm text-destructive`,children:c})}):n?(0,h.jsx)(`article`,{className:`max-w-2xl mx-auto py-8 px-6`,children:(0,h.jsx)(`div`,{className:`prose prose-sm max-w-none
1
+ import{n as e,o as t,r as n}from"./createLucideIcon-j4o5em8U.js";import{t as r}from"./utils-DSsSbmuB.js";import{G as i,K as a,L as o,M as s,N as c,b as l,q as u,y as d,z as f}from"./index-CGeGMvIX.js";import{t as p}from"./lib-T3dOmNkJ.js";/* empty css */var m=t(n(),1),h=e();function g({categories:e,activeCategory:t,activeSlug:n}){return(0,h.jsxs)(`nav`,{className:`w-56 flex-shrink-0 border-r border-border overflow-y-auto py-4 px-3`,children:[(0,h.jsxs)(i,{to:`/docs`,className:`flex items-center gap-2 mb-4 px-2 text-xs font-bold text-muted-foreground hover:text-foreground transition-colors`,children:[(0,h.jsx)(f,{className:`w-3.5 h-3.5`}),`Documentation`]}),(0,h.jsx)(`div`,{className:`space-y-4`,children:e.map(e=>(0,h.jsxs)(`div`,{children:[(0,h.jsxs)(`div`,{className:`px-2 mb-1 flex items-center justify-between`,children:[(0,h.jsx)(`span`,{className:`text-xs font-semibold text-muted-foreground uppercase tracking-wider`,children:e.name}),e.docs.length>0&&(0,h.jsx)(`span`,{className:`text-[9px] font-medium text-muted-foreground/60 bg-muted/40 rounded px-1 py-0.5 leading-none`,children:e.docs.length})]}),e.docs.length===0?(0,h.jsx)(`p`,{className:`px-2 text-xs text-muted-foreground italic`,children:`No docs yet`}):(0,h.jsx)(`ul`,{className:`space-y-0.5`,children:e.docs.map(a=>{let o=t===e.slug&&n===a.slug;return(0,h.jsx)(`li`,{children:(0,h.jsxs)(i,{to:`/docs/${e.slug}/${a.slug}`,className:r(`flex items-center gap-1.5 px-2 py-1 rounded-md text-xs transition-colors`,o?`bg-accent text-foreground`:`text-muted-foreground hover:text-foreground hover:bg-accent/50`),children:[(0,h.jsx)(c,{className:`w-3 h-3 flex-shrink-0`}),a.title]})},a.slug)})})]},e.slug))})]})}function _({categories:e}){let t=e.reduce((e,t)=>e+t.docs.length,0);return(0,h.jsxs)(`div`,{className:`max-w-2xl mx-auto py-8 px-6`,children:[(0,h.jsxs)(`div`,{className:`mb-8`,children:[(0,h.jsx)(`h1`,{className:`text-xl font-bold mb-2`,children:`Documentation`}),(0,h.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:t===0?`No documents yet. Add Markdown files to ~/.specrails/docs/ to get started.`:`${t} document${t===1?``:`s`} across ${e.filter(e=>e.docs.length>0).length} categories.`})]}),(0,h.jsx)(`div`,{className:`space-y-6`,children:e.map(e=>(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`h2`,{className:`text-sm font-semibold text-muted-foreground uppercase tracking-wider mb-2`,children:e.name}),e.docs.length===0?(0,h.jsx)(`p`,{className:`text-xs text-muted-foreground italic pl-2`,children:`No documents in this category yet.`}):(0,h.jsx)(`ul`,{className:`space-y-1`,children:e.docs.map(t=>(0,h.jsx)(`li`,{children:(0,h.jsxs)(i,{to:`/docs/${e.slug}/${t.slug}`,className:`flex items-center gap-2 px-3 py-2 rounded-md text-sm hover:bg-accent transition-colors group`,children:[(0,h.jsx)(c,{className:`w-3.5 h-3.5 text-muted-foreground flex-shrink-0`}),(0,h.jsx)(`span`,{className:`text-foreground group-hover:text-foreground`,children:t.title}),(0,h.jsx)(o,{className:`w-3 h-3 text-muted-foreground ml-auto md:opacity-0 md:group-hover:opacity-100 transition-opacity`})]})},t.slug))})]},e.slug))})]})}function v({category:e,slug:t}){let[n,r]=(0,m.useState)(null),[i,o]=(0,m.useState)(!0),[c,u]=(0,m.useState)(null),f=a();return(0,m.useEffect)(()=>{o(!0),u(null),r(null),fetch(`/api/docs/${e}/${t}`).then(async e=>{if(e.status===404){f(`/docs`,{replace:!0});return}if(!e.ok)throw Error(`HTTP ${e.status}`);return e.json()}).then(e=>{e&&r(e)}).catch(e=>{u(e instanceof Error?e.message:`Failed to load document`)}).finally(()=>o(!1))},[e,t,f]),i?(0,h.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,h.jsx)(s,{className:`w-4 h-4 animate-spin text-muted-foreground`})}):c?(0,h.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,h.jsx)(`p`,{className:`text-sm text-destructive`,children:c})}):n?(0,h.jsx)(`article`,{className:`max-w-2xl mx-auto py-8 px-6`,children:(0,h.jsx)(`div`,{className:`prose prose-sm max-w-none
2
2
  prose-headings:text-foreground prose-headings:font-bold
3
3
  prose-p:text-foreground/90
4
4
  prose-a:text-dracula-purple prose-a:no-underline hover:prose-a:underline
@@ -8,4 +8,4 @@ import{n as e,o as t,r as n}from"./createLucideIcon-j4o5em8U.js";import{t as r}f
8
8
  prose-blockquote:border-l-dracula-purple prose-blockquote:text-muted-foreground
9
9
  prose-hr:border-border
10
10
  prose-th:text-foreground prose-td:text-foreground/90
11
- prose-li:text-foreground/90`,children:(0,h.jsx)(d,{remarkPlugins:[l],rehypePlugins:[p],children:n.content})})}):null}function y(){let{category:e,slug:t}=c(),[n,r]=(0,m.useState)(null),[i,o]=(0,m.useState)(!0);(0,m.useEffect)(()=>{fetch(`/api/docs`).then(e=>e.json()).then(e=>r(e)).catch(()=>r({categories:[]})).finally(()=>o(!1))},[]);let s=!!(e&&t);return(0,h.jsxs)(`div`,{className:`flex h-full overflow-hidden`,children:[i?(0,h.jsx)(`div`,{className:`w-56 flex-shrink-0 border-r border-border flex items-center justify-center`,children:(0,h.jsx)(a,{className:`w-3.5 h-3.5 animate-spin text-muted-foreground`})}):(0,h.jsx)(g,{categories:n?.categories??[],activeCategory:e,activeSlug:t}),(0,h.jsx)(`main`,{className:`flex-1 overflow-y-auto`,children:s&&e&&t?(0,h.jsx)(v,{category:e,slug:t}):n&&(0,h.jsx)(_,{categories:n.categories})})]})}export{y as default};
11
+ prose-li:text-foreground/90`,children:(0,h.jsx)(l,{remarkPlugins:[d],rehypePlugins:[p],children:n.content})})}):null}function y(){let{category:e,slug:t}=u(),[n,r]=(0,m.useState)(null),[i,a]=(0,m.useState)(!0);(0,m.useEffect)(()=>{fetch(`/api/docs`).then(e=>e.json()).then(e=>r(e)).catch(()=>r({categories:[]})).finally(()=>a(!1))},[]);let o=!!(e&&t);return(0,h.jsxs)(`div`,{className:`flex h-full overflow-hidden`,children:[i?(0,h.jsx)(`div`,{className:`w-56 flex-shrink-0 border-r border-border flex items-center justify-center`,children:(0,h.jsx)(s,{className:`w-3.5 h-3.5 animate-spin text-muted-foreground`})}):(0,h.jsx)(g,{categories:n?.categories??[],activeCategory:e,activeSlug:t}),(0,h.jsx)(`main`,{className:`flex-1 overflow-y-auto`,children:o&&e&&t?(0,h.jsx)(v,{category:e,slug:t}):n&&(0,h.jsx)(_,{categories:n.categories})})]})}export{y as default};
@@ -0,0 +1 @@
1
+ import{n as e,o as t,r as n}from"./createLucideIcon-j4o5em8U.js";import"./react-dom-CzrF8Nvy.js";import{I as r,Mt as i,_ as a,a as o,bn as s,g as c,h as l,i as u,m as d,n as f,t as p,v as m,xn as h,yn as g}from"./dracula-colors-C67D9ngQ.js";import{n as _}from"./useSharedWebSocket-B3JjQYKi.js";import{j as v}from"./index-CGeGMvIX.js";var y=t(n(),1),b=e();function x({kpi:e}){return(0,b.jsx)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3`,children:[{label:`Total Cost`,value:`$${e.totalCostUsd.toFixed(4)}`,sub:`$${e.costToday.toFixed(4)} today`},{label:`Total Jobs`,value:e.totalJobs.toLocaleString(),sub:`${e.jobsToday} today`},{label:`Success Rate`,value:`${(e.successRate*100).toFixed(1)}%`,sub:`across all projects`},{label:`Avg Cost / Job`,value:e.totalJobs>0?`$${(e.totalCostUsd/e.totalJobs).toFixed(5)}`:`—`,sub:`period average`}].map(e=>(0,b.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,b.jsx)(`p`,{className:`text-xs text-muted-foreground mb-1`,children:e.label}),(0,b.jsx)(`p`,{className:`text-xl font-semibold font-mono`,children:e.value}),(0,b.jsx)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:e.sub})]},e.label))})}function S({data:e}){let t=e.length>0&&e.some(e=>e.costUsd>0),n=Math.max(1,Math.floor(e.length/7)),c=e.filter((e,t)=>t%n===0).map(e=>e.date);return(0,b.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,b.jsx)(`h3`,{className:`text-sm font-medium mb-3`,children:`Cross-Project Cost Over Time`}),t?(0,b.jsx)(i,{width:`100%`,height:200,children:(0,b.jsxs)(o,{data:e,margin:{top:4,right:8,left:0,bottom:0},children:[(0,b.jsx)(m,{strokeDasharray:`3 3`,stroke:`var(--color-border)`}),(0,b.jsx)(l,{dataKey:`date`,ticks:c,tickFormatter:e=>{try{return s(new Date(e),`MMM d`)}catch{return e}},tick:{fontSize:10,fill:`var(--color-muted-foreground)`},axisLine:!1,tickLine:!1}),(0,b.jsx)(d,{tickFormatter:e=>`$${e.toFixed(2)}`,tick:{fontSize:10,fill:`var(--color-muted-foreground)`},axisLine:!1,tickLine:!1,width:55}),(0,b.jsx)(r,{content:({active:e,payload:t,label:n})=>e&&t?.length?(0,b.jsxs)(`div`,{className:`bg-popover border border-border/30 rounded-lg p-2 text-xs shadow-lg`,children:[(0,b.jsx)(`p`,{className:`text-muted-foreground mb-1`,children:n}),(0,b.jsxs)(`p`,{className:`font-medium`,children:[`$`,t[0].value.toFixed(4)]})]}):null}),(0,b.jsx)(a,{type:`monotone`,dataKey:`costUsd`,stroke:f.purple,strokeWidth:2,dot:!1,activeDot:{r:3,fill:f.purple}})]})}):(0,b.jsx)(`div`,{className:`h-[200px] flex items-center justify-center text-xs text-muted-foreground`,children:`No cost data for this period`})]})}function C({projects:e}){if(e.length===0)return(0,b.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,b.jsx)(`h3`,{className:`text-sm font-medium mb-3`,children:`Project Comparison`}),(0,b.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No projects registered.`})]});let t=Math.max(...e.map(e=>e.totalCostUsd),1e-4);return(0,b.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,b.jsx)(`h3`,{className:`text-sm font-medium mb-4`,children:`Project Comparison`}),(0,b.jsx)(`div`,{className:`space-y-3`,children:e.map((e,n)=>(0,b.jsxs)(`div`,{className:`space-y-1`,children:[(0,b.jsxs)(`div`,{className:`flex items-center justify-between text-xs`,children:[(0,b.jsx)(`span`,{className:`font-medium truncate max-w-[160px]`,title:e.projectName,children:e.projectName}),(0,b.jsxs)(`div`,{className:`flex items-center gap-4 text-muted-foreground`,children:[(0,b.jsxs)(`span`,{children:[e.totalJobs,` jobs`]}),(0,b.jsxs)(`span`,{children:[(e.successRate*100).toFixed(0),`% success`]}),(0,b.jsxs)(`span`,{className:`font-mono text-foreground`,children:[`$`,e.totalCostUsd.toFixed(4)]})]})]}),(0,b.jsx)(`div`,{className:`h-1.5 rounded-full bg-border/30 overflow-hidden`,children:(0,b.jsx)(`div`,{className:`h-full rounded-full transition-all duration-500`,style:{width:`${e.totalCostUsd/t*100}%`,backgroundColor:p[n%p.length]}})})]},e.projectId))})]})}function w({projects:e}){if(e.length===0)return null;let t=e.map(e=>({name:e.projectName.slice(0,12),costUsd:e.totalCostUsd}));return(0,b.jsxs)(`div`,{className:`rounded-lg border border-border/40 bg-card/50 p-4`,children:[(0,b.jsx)(`h3`,{className:`text-sm font-medium mb-3`,children:`Cost by Project`}),(0,b.jsx)(i,{width:`100%`,height:180,children:(0,b.jsxs)(u,{data:t,margin:{top:4,right:8,left:0,bottom:0},children:[(0,b.jsx)(m,{strokeDasharray:`3 3`,stroke:`var(--color-border)`}),(0,b.jsx)(l,{dataKey:`name`,tick:{fontSize:10,fill:`var(--color-muted-foreground)`},axisLine:!1,tickLine:!1}),(0,b.jsx)(d,{tickFormatter:e=>`$${e.toFixed(2)}`,tick:{fontSize:10,fill:`var(--color-muted-foreground)`},axisLine:!1,tickLine:!1,width:55}),(0,b.jsx)(r,{content:({active:e,payload:t,label:n})=>e&&t?.length?(0,b.jsxs)(`div`,{className:`bg-popover border border-border/30 rounded-lg p-2 text-xs shadow-lg`,children:[(0,b.jsx)(`p`,{className:`text-muted-foreground mb-1`,children:n}),(0,b.jsxs)(`p`,{className:`font-medium`,children:[`$`,t[0].value.toFixed(4)]})]}):null}),(0,b.jsx)(c,{dataKey:`costUsd`,fill:f.cyan,radius:[3,3,0,0]})]})})]})}function T(){let[e,t]=(0,y.useState)(`7d`),[n,r]=(0,y.useState)(``),[i,a]=(0,y.useState)(``),[o,s]=(0,y.useState)(null),[c,l]=(0,y.useState)(!0),[u,d]=(0,y.useState)(null),{registerHandler:f,unregisterHandler:p}=_(),m=(0,y.useCallback)(t=>{let r=t;r.type===`log`&&r.event_type===`job_done`&&T(e,n,i)},[e,n,i]);(0,y.useEffect)(()=>(f(`hub-analytics`,m),()=>p(`hub-analytics`)),[m,f,p]);async function T(e,t,n){l(!0),d(null);try{let r=new URLSearchParams({period:e});e===`custom`&&t&&n&&(r.set(`from`,t),r.set(`to`,n));let i=await fetch(`/api/hub/analytics?${r}`);if(!i.ok)throw Error(`HTTP ${i.status}`);s(await i.json())}catch(e){d(e.message)}finally{l(!1)}}(0,y.useEffect)(()=>{T(e,n,i)},[e,n,i]);function E(e,n,i){t(e),n!==void 0&&r(n),i!==void 0&&a(i)}return(0,b.jsx)(`div`,{className:`flex flex-col h-full overflow-auto bg-background`,children:(0,b.jsxs)(`div`,{className:`p-4 space-y-4`,children:[(0,b.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,b.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,b.jsx)(h,{className:`w-4 h-4 text-muted-foreground`}),(0,b.jsx)(`h1`,{className:`text-sm font-semibold`,children:`Hub Analytics`}),o&&(0,b.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:o.period.label})]}),(0,b.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,b.jsx)(g,{period:e,from:n,to:i,onChange:E}),(0,b.jsx)(`button`,{onClick:()=>T(e,n,i),disabled:c,className:`flex items-center gap-1.5 h-7 px-2 rounded-md text-xs text-muted-foreground hover:text-foreground hover:bg-accent transition-colors disabled:opacity-50`,"aria-label":`Refresh analytics`,children:(0,b.jsx)(v,{className:`w-3 h-3 ${c?`animate-spin`:``}`})})]})]}),u&&(0,b.jsxs)(`div`,{className:`rounded-lg border border-red-400/30 bg-red-400/10 p-3 text-xs text-red-400`,children:[`Failed to load analytics: `,u]}),c&&!o&&(0,b.jsxs)(`div`,{className:`space-y-3`,children:[(0,b.jsx)(`div`,{className:`grid grid-cols-2 lg:grid-cols-4 gap-3`,children:Array.from({length:4}).map((e,t)=>(0,b.jsx)(`div`,{className:`h-20 rounded-lg border border-border/40 bg-card/50 animate-pulse`},t))}),(0,b.jsx)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-3`,children:Array.from({length:2}).map((e,t)=>(0,b.jsx)(`div`,{className:`h-[220px] rounded-lg border border-border/40 bg-card/50 animate-pulse`},t))})]}),o&&(0,b.jsxs)(`div`,{className:`space-y-3`,children:[(0,b.jsx)(x,{kpi:o.kpi}),(0,b.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-3`,children:[(0,b.jsx)(S,{data:o.costTimeline}),(0,b.jsx)(w,{projects:o.projectBreakdown})]}),(0,b.jsx)(C,{projects:o.projectBreakdown})]})]})})}export{T as default};
@@ -1,6 +1,6 @@
1
- import{n as e,o as t,r as n,t as r}from"./createLucideIcon-j4o5em8U.js";import"./react-dom-CzrF8Nvy.js";import{a as i,n as a,r as o}from"./useHub-BeVU84eS.js";import{t as s}from"./utils-DSsSbmuB.js";import{n as c}from"./useSharedWebSocket-j0gqXR8o.js";import{B as l,C as u,D as d,I as f,L as p,M as m,O as h,R as g,V as _,_ as v,b as y,f as b,j as x,n as S,p as C,r as w,u as T,x as E,z as D}from"./index-94S85Lsd.js";import{t as O}from"./lib-DnnFAwDK.js";var k=r(`circle`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),A=r(`copy`,[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]),j=r(`house`,[[`path`,{d:`M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8`,key:`5wwlr5`}],[`path`,{d:`M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z`,key:`r6nss1`}]]),M=t(n(),1),N=e();function P({phases:e,phaseDefinitions:t}){return t.length===0?null:(0,N.jsx)(`div`,{className:`flex items-center`,children:t.map((n,r)=>{let i=e[n.key]??`idle`,a=r<t.length-1?e[t[r+1].key]??`idle`:null;return(0,N.jsxs)(`div`,{className:`flex items-center`,children:[(0,N.jsxs)(f,{children:[(0,N.jsx)(g,{asChild:!0,children:(0,N.jsxs)(`div`,{className:`flex flex-col items-center gap-1.5 cursor-default px-4`,children:[(0,N.jsx)(F,{state:i}),(0,N.jsx)(`span`,{className:s(`text-xs font-medium transition-colors`,i===`running`?`text-blue-400`:i===`done`?`text-emerald-400`:i===`error`?`text-red-400`:`text-muted-foreground/40`),children:n.label})]})}),(0,N.jsxs)(p,{side:`bottom`,className:`max-w-[200px]`,children:[(0,N.jsx)(`p`,{className:`font-medium`,children:n.label}),(0,N.jsx)(`p`,{className:`text-muted-foreground mt-0.5`,children:n.description})]})]}),a!==null&&(0,N.jsx)(`div`,{className:s(`h-px w-12 -mt-5 shrink-0 transition-all duration-300`,a===`done`||i===`done`?`bg-emerald-500/30`:a===`running`?`bg-blue-400/40`:`bg-border/30`)})]},n.key)})})}function F({state:e}){return(0,N.jsxs)(`div`,{className:s(`flex items-center justify-center w-10 h-10 rounded-full transition-all duration-300`,e===`running`?`bg-blue-500/10 ring-1 ring-blue-400/30 animate-pulse`:e===`done`?`bg-emerald-500/10`:e===`error`?`bg-red-500/10`:`bg-muted/20`),children:[e===`running`&&(0,N.jsx)(u,{className:`w-6 h-6 text-blue-400 animate-spin`}),e===`done`&&(0,N.jsx)(h,{className:`w-6 h-6 text-emerald-400`}),e===`error`&&(0,N.jsx)(d,{className:`w-6 h-6 text-red-400`}),e===`idle`&&(0,N.jsx)(k,{className:`w-6 h-6 text-muted-foreground/20`})]})}function I(e,t){let n=new Date(t).getTime()-new Date(e).getTime();if(n<0)return`—`;let r=Math.round(n/1e3);if(r<60)return`${r}s`;let i=Math.floor(r/60),a=r%60;return i<60?`${i}m ${a}s`:`${Math.floor(i/60)}h ${i%60}m`}function L(e){let t=new Set;for(let n of e)if(n.event_type===`log`)try{let e=(JSON.parse(n.payload).line??``).match(/(?:Writing|Editing|Created?|Updated?)\s+(?:file:\s*)?([\w./\-]+\.\w+)/i);e&&t.add(e[1])}catch{}return Array.from(t).slice(0,20)}function R({job:e,events:t,defaultOpen:n=!0}){let[r,i]=(0,M.useState)(n),a=(0,M.useMemo)(()=>L(t),[t]),o=e.status===`completed`;return(0,N.jsxs)(`div`,{className:s(`mx-4 my-2 rounded-xl border`,o?`border-emerald-500/20 bg-emerald-500/5`:`border-red-500/20 bg-red-500/5`),children:[(0,N.jsxs)(`button`,{type:`button`,onClick:()=>i(!r),className:`w-full flex items-center gap-3 px-4 py-3`,children:[o?(0,N.jsx)(h,{className:`w-4 h-4 text-emerald-400 shrink-0`}):(0,N.jsx)(d,{className:`w-4 h-4 text-red-400 shrink-0`}),(0,N.jsx)(`span`,{className:`text-sm font-semibold flex-1 text-left`,children:o?`Job completed`:`Job failed`}),(0,N.jsxs)(`div`,{className:`flex items-center gap-3 text-[11px] text-muted-foreground`,children:[e.finished_at&&(0,N.jsx)(`span`,{className:`tabular-nums`,children:I(e.started_at,e.finished_at)}),e.total_cost_usd!=null&&(0,N.jsxs)(`span`,{className:`tabular-nums text-yellow-400`,children:[`$`,e.total_cost_usd.toFixed(4)]}),a.length>0&&(0,N.jsxs)(`span`,{children:[a.length,` file`,a.length===1?``:`s`]})]}),(0,N.jsx)(m,{className:s(`w-4 h-4 text-muted-foreground/40 transition-transform duration-150 shrink-0`,r&&`rotate-180`)})]}),r&&(0,N.jsxs)(`div`,{className:`px-4 pb-4 space-y-3 border-t border-border/20`,children:[(0,N.jsxs)(`div`,{className:`grid grid-cols-2 sm:grid-cols-4 gap-2 pt-3`,children:[(0,N.jsx)(z,{label:`Duration`,value:e.finished_at?I(e.started_at,e.finished_at):`—`}),(0,N.jsx)(z,{label:`Cost`,value:e.total_cost_usd==null?`—`:`$${e.total_cost_usd.toFixed(4)}`,valueClass:`text-yellow-400`}),(0,N.jsx)(z,{label:`Turns`,value:e.num_turns==null?`—`:`${e.num_turns}`}),(0,N.jsx)(z,{label:`Tokens`,value:e.tokens_in==null?`—`:`${(((e.tokens_in??0)+(e.tokens_out??0))/1e3).toFixed(1)}k`})]}),a.length>0&&(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`p`,{className:`text-[10px] text-muted-foreground/50 uppercase tracking-wider mb-1.5`,children:`Files modified`}),(0,N.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:a.map(e=>(0,N.jsx)(`code`,{className:`text-[10px] font-mono bg-muted/30 px-2 py-0.5 rounded text-cyan-400/80`,children:e},e))})]})]})]})}function z({label:e,value:t,valueClass:n}){return(0,N.jsxs)(`div`,{className:`bg-muted/20 rounded-lg px-3 py-2`,children:[(0,N.jsx)(`p`,{className:`text-[10px] text-muted-foreground/50 uppercase tracking-wider`,children:e}),(0,N.jsx)(`p`,{className:s(`text-sm font-semibold tabular-nums mt-0.5`,n),children:t})]})}function B(e){let t=e.trimStart();return!!(/^#{1,6}\s/.test(t)||/^[-*+]\s/.test(t)||/^\d+\.\s/.test(t)||/^\|.+\|/.test(t)||t.startsWith("```")||t.startsWith(`> `)||/\*\*[^*]+\*\*/.test(e)||/`[^`]+`/.test(e)||/\[.+\]\(.+\)/.test(e)||/^(-{3,}|_{3,}|\*{3,})$/.test(t)||/^- \[[ x]\]\s/.test(t))}function V(e,t){let n=`${e.id??t}`,r=e.timestamp;if(e.event_type===`log`)try{let t=JSON.parse(e.payload).line??``;return t.trim()?t.startsWith(`▸`)||t.match(/^(architect|developer|reviewer|ship|analyst)\s*:/i)?{id:n,content:t,type:`phase`,timestamp:r}:e.source===`stderr`?{id:n,content:t,type:`stderr`,timestamp:r}:B(t)?{id:n,content:t,type:`assistant`,timestamp:r}:{id:n,content:t,type:`plain`,timestamp:r}:null}catch{return null}if(e.event_type!==`log`&&e.event_type!==`result`)return null;if(e.event_type===`result`)try{let t=JSON.parse(e.payload),i=[];return t.duration_ms&&i.push(`${(t.duration_ms/1e3).toFixed(1)}s`),t.total_cost_usd&&i.push(`$${t.total_cost_usd.toFixed(4)}`),t.num_turns&&i.push(`${t.num_turns} turns`),{id:n,content:`▸ Completed${i.length?` — ${i.join(` · `)}`:``}`,type:`result`,timestamp:r}}catch{return null}return null}function H(e){let t=`none`,n=[];for(let r of e){let e=r.type;if(e!==`plain`&&e!==`log`){t=`none`,n.push(r);continue}let i=r.content;i.startsWith(`--- `)?(t=`saw_minus`,n.push({...r,type:`diff-meta`})):t===`saw_minus`&&i.startsWith(`+++ `)?(t=`active`,n.push({...r,type:`diff-meta`})):t===`active`&&i.startsWith(`@@ `)?n.push({...r,type:`diff-hunk`}):t===`active`&&i.startsWith(`+`)&&!i.startsWith(`+++`)?n.push({...r,type:`diff-add`}):t===`active`&&i.startsWith(`-`)&&!i.startsWith(`---`)?n.push({...r,type:`diff-remove`}):(t===`active`&&(i.startsWith(` `)||i===``)||(t=`none`),n.push(r))}return n}function U(e){let t=[{key:`__preamble__`,header:null,lines:[]}];for(let n of e)n.type===`phase`?t.push({key:n.id,header:n,lines:[]}):t[t.length-1].lines.push(n);return t.filter(e=>e.header!==null||e.lines.length>0)}function W({events:e,isLoading:t}){let[n,r]=(0,M.useState)(``),[a,o]=(0,M.useState)(!0),[s,c]=(0,M.useState)(new Set),l=(0,M.useRef)(null),u=(0,M.useRef)(null),{processedLines:d,groups:f,totalLines:p}=(0,M.useMemo)(()=>{let t=e.map((e,t)=>V(e,t)).filter(e=>e!==null),n=[];for(let e of t){let t=n.length>0?n[n.length-1]:null;e.type===`assistant`&&t?.type===`assistant`?t.content+=`
2
- `+e.content:n.push({...e})}let r=H(n);return{processedLines:r,groups:U(r),totalLines:r.length}},[e]),h=(0,M.useMemo)(()=>{if(!n)return p;let e=n.toLowerCase();return d.filter(t=>t.content.toLowerCase().includes(e)).length},[n,d,p]),g=(0,M.useCallback)(()=>{let e=u.current;e&&(e.scrollTop=e.scrollHeight)},[]);(0,M.useEffect)(()=>{a&&g()},[e.length,a,g]);function _(){let e=u.current;e&&o(e.scrollHeight-e.scrollTop-e.clientHeight<50)}function b(e){c(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}return t?(0,N.jsx)(`div`,{className:`flex-1 flex items-center justify-center`,children:(0,N.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Loading logs...`})}):p===0?(0,N.jsx)(`div`,{className:`flex-1 flex items-center justify-center`,children:(0,N.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No log output yet`})}):(0,N.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,N.jsxs)(`div`,{className:`px-4 py-2 border-b border-border flex items-center gap-2`,children:[(0,N.jsxs)(`div`,{className:`relative flex-1 max-w-xs`,children:[(0,N.jsx)(y,{className:`absolute left-2.5 top-1/2 -translate-y-1/2 w-3 h-3 text-muted-foreground`}),(0,N.jsx)(S,{placeholder:`Filter logs...`,value:n,onChange:e=>r(e.target.value),className:`pl-7 h-7`})]}),(0,N.jsx)(v,{variant:`ghost`,size:`sm`,className:`h-7 px-2 text-muted-foreground/50 hover:text-foreground`,onClick:()=>{let e=d.map(e=>e.content).join(`
3
- `);navigator.clipboard.writeText(e).then(()=>{i.success(`Log copied to clipboard`)}).catch(()=>{i.error(`Failed to copy log`)})},children:(0,N.jsx)(A,{className:`w-3.5 h-3.5`})}),(0,N.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[h,` / `,p,` lines`]})]}),(0,N.jsxs)(`div`,{ref:u,className:`flex-1 overflow-y-auto p-2 text-xs relative`,onScroll:_,children:[f.map(e=>(0,N.jsx)(G,{group:e,filter:n,collapsed:s.has(e.key),onToggle:()=>b(e.key)},e.key)),(0,N.jsx)(`div`,{ref:l})]}),!a&&(0,N.jsxs)(v,{size:`sm`,variant:`secondary`,onClick:()=>{o(!0),g()},className:`absolute bottom-16 right-6 h-7 gap-1 shadow-lg`,children:[(0,N.jsx)(m,{className:`w-3 h-3`}),`Jump to bottom`]})]})}var G=(0,M.memo)(function({group:e,filter:t,collapsed:n,onToggle:r}){let i=t?e.lines.filter(e=>e.content.toLowerCase().includes(t.toLowerCase())):e.lines;if(e.header===null)return i.length===0?null:(0,N.jsx)(`div`,{children:i.map((e,t)=>(0,N.jsx)(q,{line:e,even:t%2==0},e.id))});let a=e.header.content;return(0,N.jsxs)(`div`,{className:`mt-3 rounded-md overflow-hidden border border-border/20`,children:[(0,N.jsxs)(`button`,{type:`button`,onClick:r,className:s(`flex items-center gap-2 w-full text-left px-3 py-2`,`bg-primary/5 border-b border-primary/20`,`hover:bg-primary/10 transition-colors duration-150 cursor-pointer`),children:[(0,N.jsx)(x,{className:s(`w-3 h-3 text-primary/60 shrink-0 transition-transform duration-150`,!n&&`rotate-90`)}),(0,N.jsx)(`span`,{className:`flex-1 text-[12px] font-semibold text-foreground leading-none`,children:a}),e.header.timestamp&&(0,N.jsx)(`span`,{className:`text-[10px] text-muted-foreground/40 font-mono tabular-nums shrink-0`,children:new Date(e.header.timestamp).toLocaleTimeString(`en`,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1})}),(0,N.jsxs)(`span`,{className:`text-[10px] text-muted-foreground/40 shrink-0`,children:[e.lines.length,` lines`]})]}),!n&&(0,N.jsx)(`div`,{className:`bg-muted/5`,children:i.length===0?(0,N.jsx)(`p`,{className:`px-4 py-2 text-[10px] text-muted-foreground/40 italic`,children:t?`No matching lines`:`No output`}):i.map((e,t)=>(0,N.jsx)(q,{line:e,even:t%2==0},e.id))})]})}),K=[O],q=(0,M.memo)(function({line:e,even:t}){let n=e.type===`assistant`,r=e.type===`diff-add`,i=e.type===`diff-remove`,a=e.type===`diff-meta`,o=e.type===`diff-hunk`;return(0,N.jsxs)(`div`,{className:s(`flex items-start gap-2 group px-2 py-0.5 rounded-sm`,!(r||i||a||o)&&(t?`bg-muted/20`:`bg-transparent`),e.type===`result`&&`bg-emerald-500/5 border-l-2 border-emerald-500/40 mt-2 py-2`,r&&`bg-emerald-500/8 border-l-2 border-emerald-500/50`,i&&`bg-red-500/8 border-l-2 border-red-500/50`,a&&`bg-dracula-purple/5 border-l-2 border-dracula-purple/30`,o&&`bg-dracula-cyan/5 border-l-2 border-dracula-cyan/30`),children:[e.timestamp&&(0,N.jsx)(`span`,{className:`text-[10px] text-muted-foreground/40 shrink-0 mt-0.5 w-[52px] font-mono tabular-nums`,children:new Date(e.timestamp).toLocaleTimeString(`en`,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1})}),n?(0,N.jsx)(`div`,{className:`flex-1 min-w-0 prose prose-invert prose-xs max-w-none
1
+ import{n as e,o as t,r as n,t as r}from"./createLucideIcon-j4o5em8U.js";import"./react-dom-CzrF8Nvy.js";import{a as i,n as a,r as o}from"./useHub-D5e-JfkR.js";import{t as s}from"./utils-DSsSbmuB.js";import{n as c}from"./useSharedWebSocket-B3JjQYKi.js";import{A as l,F as u,G as d,H as f,K as p,L as m,M as h,P as g,R as _,U as v,W as y,_ as b,b as x,k as S,n as C,q as w,t as T,w as E,y as D}from"./index-CGeGMvIX.js";import{t as O}from"./lib-T3dOmNkJ.js";var k=r(`circle`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),A=r(`copy`,[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]),j=r(`house`,[[`path`,{d:`M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8`,key:`5wwlr5`}],[`path`,{d:`M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z`,key:`r6nss1`}]]),M=t(n(),1),N=e();function P({phases:e,phaseDefinitions:t}){return t.length===0?null:(0,N.jsx)(`div`,{className:`flex items-center`,children:t.map((n,r)=>{let i=e[n.key]??`idle`,a=r<t.length-1?e[t[r+1].key]??`idle`:null;return(0,N.jsxs)(`div`,{className:`flex items-center`,children:[(0,N.jsxs)(f,{children:[(0,N.jsx)(y,{asChild:!0,children:(0,N.jsxs)(`div`,{className:`flex flex-col items-center gap-1.5 cursor-default px-4`,children:[(0,N.jsx)(F,{state:i}),(0,N.jsx)(`span`,{className:s(`text-xs font-medium transition-colors`,i===`running`?`text-blue-400`:i===`done`?`text-emerald-400`:i===`error`?`text-red-400`:`text-muted-foreground/40`),children:n.label})]})}),(0,N.jsxs)(v,{side:`bottom`,className:`max-w-[200px]`,children:[(0,N.jsx)(`p`,{className:`font-medium`,children:n.label}),(0,N.jsx)(`p`,{className:`text-muted-foreground mt-0.5`,children:n.description})]})]}),a!==null&&(0,N.jsx)(`div`,{className:s(`h-px w-12 -mt-5 shrink-0 transition-all duration-300`,a===`done`||i===`done`?`bg-emerald-500/30`:a===`running`?`bg-blue-400/40`:`bg-border/30`)})]},n.key)})})}function F({state:e}){return(0,N.jsxs)(`div`,{className:s(`flex items-center justify-center w-10 h-10 rounded-full transition-all duration-300`,e===`running`?`bg-blue-500/10 ring-1 ring-blue-400/30 animate-pulse`:e===`done`?`bg-emerald-500/10`:e===`error`?`bg-red-500/10`:`bg-muted/20`),children:[e===`running`&&(0,N.jsx)(h,{className:`w-6 h-6 text-blue-400 animate-spin`}),e===`done`&&(0,N.jsx)(u,{className:`w-6 h-6 text-emerald-400`}),e===`error`&&(0,N.jsx)(g,{className:`w-6 h-6 text-red-400`}),e===`idle`&&(0,N.jsx)(k,{className:`w-6 h-6 text-muted-foreground/20`})]})}function I(e,t){let n=new Date(t).getTime()-new Date(e).getTime();if(n<0)return`—`;let r=Math.round(n/1e3);if(r<60)return`${r}s`;let i=Math.floor(r/60),a=r%60;return i<60?`${i}m ${a}s`:`${Math.floor(i/60)}h ${i%60}m`}function L(e){let t=new Set;for(let n of e)if(n.event_type===`log`)try{let e=(JSON.parse(n.payload).line??``).match(/(?:Writing|Editing|Created?|Updated?)\s+(?:file:\s*)?([\w./\-]+\.\w+)/i);e&&t.add(e[1])}catch{}return Array.from(t).slice(0,20)}function R({job:e,events:t,defaultOpen:n=!0}){let[r,i]=(0,M.useState)(n),a=(0,M.useMemo)(()=>L(t),[t]),o=e.status===`completed`;return(0,N.jsxs)(`div`,{className:s(`mx-4 my-2 rounded-xl border`,o?`border-emerald-500/20 bg-emerald-500/5`:`border-red-500/20 bg-red-500/5`),children:[(0,N.jsxs)(`button`,{type:`button`,onClick:()=>i(!r),className:`w-full flex items-center gap-3 px-4 py-3`,children:[o?(0,N.jsx)(u,{className:`w-4 h-4 text-emerald-400 shrink-0`}):(0,N.jsx)(g,{className:`w-4 h-4 text-red-400 shrink-0`}),(0,N.jsx)(`span`,{className:`text-sm font-semibold flex-1 text-left`,children:o?`Job completed`:`Job failed`}),(0,N.jsxs)(`div`,{className:`flex items-center gap-3 text-[11px] text-muted-foreground`,children:[e.finished_at&&(0,N.jsx)(`span`,{className:`tabular-nums`,children:I(e.started_at,e.finished_at)}),e.total_cost_usd!=null&&(0,N.jsxs)(`span`,{className:`tabular-nums text-yellow-400`,children:[`$`,e.total_cost_usd.toFixed(4)]}),a.length>0&&(0,N.jsxs)(`span`,{children:[a.length,` file`,a.length===1?``:`s`]})]}),(0,N.jsx)(_,{className:s(`w-4 h-4 text-muted-foreground/40 transition-transform duration-150 shrink-0`,r&&`rotate-180`)})]}),r&&(0,N.jsxs)(`div`,{className:`px-4 pb-4 space-y-3 border-t border-border/20`,children:[(0,N.jsxs)(`div`,{className:`grid grid-cols-2 sm:grid-cols-4 gap-2 pt-3`,children:[(0,N.jsx)(z,{label:`Duration`,value:e.finished_at?I(e.started_at,e.finished_at):`—`}),(0,N.jsx)(z,{label:`Cost`,value:e.total_cost_usd==null?`—`:`$${e.total_cost_usd.toFixed(4)}`,valueClass:`text-yellow-400`}),(0,N.jsx)(z,{label:`Turns`,value:e.num_turns==null?`—`:`${e.num_turns}`}),(0,N.jsx)(z,{label:`Tokens`,value:e.tokens_in==null?`—`:`${(((e.tokens_in??0)+(e.tokens_out??0))/1e3).toFixed(1)}k`})]}),a.length>0&&(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`p`,{className:`text-[10px] text-muted-foreground/50 uppercase tracking-wider mb-1.5`,children:`Files modified`}),(0,N.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:a.map(e=>(0,N.jsx)(`code`,{className:`text-[10px] font-mono bg-muted/30 px-2 py-0.5 rounded text-cyan-400/80`,children:e},e))})]})]})]})}function z({label:e,value:t,valueClass:n}){return(0,N.jsxs)(`div`,{className:`bg-muted/20 rounded-lg px-3 py-2`,children:[(0,N.jsx)(`p`,{className:`text-[10px] text-muted-foreground/50 uppercase tracking-wider`,children:e}),(0,N.jsx)(`p`,{className:s(`text-sm font-semibold tabular-nums mt-0.5`,n),children:t})]})}function B(e){let t=e.trimStart();return!!(/^#{1,6}\s/.test(t)||/^[-*+]\s/.test(t)||/^\d+\.\s/.test(t)||/^\|.+\|/.test(t)||t.startsWith("```")||t.startsWith(`> `)||/\*\*[^*]+\*\*/.test(e)||/`[^`]+`/.test(e)||/\[.+\]\(.+\)/.test(e)||/^(-{3,}|_{3,}|\*{3,})$/.test(t)||/^- \[[ x]\]\s/.test(t))}function V(e,t){let n=`${e.id??t}`,r=e.timestamp;if(e.event_type===`log`)try{let t=JSON.parse(e.payload).line??``;return t.trim()?t.startsWith(`▸`)||t.match(/^(architect|developer|reviewer|ship|analyst)\s*:/i)?{id:n,content:t,type:`phase`,timestamp:r}:e.source===`stderr`?{id:n,content:t,type:`stderr`,timestamp:r}:B(t)?{id:n,content:t,type:`assistant`,timestamp:r}:{id:n,content:t,type:`plain`,timestamp:r}:null}catch{return null}if(e.event_type!==`log`&&e.event_type!==`result`)return null;if(e.event_type===`result`)try{let t=JSON.parse(e.payload),i=[];return t.duration_ms&&i.push(`${(t.duration_ms/1e3).toFixed(1)}s`),t.total_cost_usd&&i.push(`$${t.total_cost_usd.toFixed(4)}`),t.num_turns&&i.push(`${t.num_turns} turns`),{id:n,content:`▸ Completed${i.length?` — ${i.join(` · `)}`:``}`,type:`result`,timestamp:r}}catch{return null}return null}function H(e){let t=`none`,n=[];for(let r of e){let e=r.type;if(e!==`plain`&&e!==`log`){t=`none`,n.push(r);continue}let i=r.content;i.startsWith(`--- `)?(t=`saw_minus`,n.push({...r,type:`diff-meta`})):t===`saw_minus`&&i.startsWith(`+++ `)?(t=`active`,n.push({...r,type:`diff-meta`})):t===`active`&&i.startsWith(`@@ `)?n.push({...r,type:`diff-hunk`}):t===`active`&&i.startsWith(`+`)&&!i.startsWith(`+++`)?n.push({...r,type:`diff-add`}):t===`active`&&i.startsWith(`-`)&&!i.startsWith(`---`)?n.push({...r,type:`diff-remove`}):(t===`active`&&(i.startsWith(` `)||i===``)||(t=`none`),n.push(r))}return n}function U(e){let t=[{key:`__preamble__`,header:null,lines:[]}];for(let n of e)n.type===`phase`?t.push({key:n.id,header:n,lines:[]}):t[t.length-1].lines.push(n);return t.filter(e=>e.header!==null||e.lines.length>0)}function W({events:e,isLoading:t}){let[n,r]=(0,M.useState)(``),[a,o]=(0,M.useState)(!0),[s,c]=(0,M.useState)(new Set),l=(0,M.useRef)(null),u=(0,M.useRef)(null),{processedLines:d,groups:f,totalLines:p}=(0,M.useMemo)(()=>{let t=e.map((e,t)=>V(e,t)).filter(e=>e!==null),n=[];for(let e of t){let t=n.length>0?n[n.length-1]:null;e.type===`assistant`&&t?.type===`assistant`?t.content+=`
2
+ `+e.content:n.push({...e})}let r=H(n);return{processedLines:r,groups:U(r),totalLines:r.length}},[e]),m=(0,M.useMemo)(()=>{if(!n)return p;let e=n.toLowerCase();return d.filter(t=>t.content.toLowerCase().includes(e)).length},[n,d,p]),h=(0,M.useCallback)(()=>{let e=u.current;e&&(e.scrollTop=e.scrollHeight)},[]);(0,M.useEffect)(()=>{a&&h()},[e.length,a,h]);function g(){let e=u.current;e&&o(e.scrollHeight-e.scrollTop-e.clientHeight<50)}function v(e){c(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}return t?(0,N.jsx)(`div`,{className:`flex-1 flex items-center justify-center`,children:(0,N.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Loading logs...`})}):p===0?(0,N.jsx)(`div`,{className:`flex-1 flex items-center justify-center`,children:(0,N.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No log output yet`})}):(0,N.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,N.jsxs)(`div`,{className:`px-4 py-2 border-b border-border flex items-center gap-2`,children:[(0,N.jsxs)(`div`,{className:`relative flex-1 max-w-xs`,children:[(0,N.jsx)(S,{className:`absolute left-2.5 top-1/2 -translate-y-1/2 w-3 h-3 text-muted-foreground`}),(0,N.jsx)(T,{placeholder:`Filter logs...`,value:n,onChange:e=>r(e.target.value),className:`pl-7 h-7`})]}),(0,N.jsx)(E,{variant:`ghost`,size:`sm`,className:`h-7 px-2 text-muted-foreground/50 hover:text-foreground`,onClick:()=>{let e=d.map(e=>e.content).join(`
3
+ `);navigator.clipboard.writeText(e).then(()=>{i.success(`Log copied to clipboard`)}).catch(()=>{i.error(`Failed to copy log`)})},children:(0,N.jsx)(A,{className:`w-3.5 h-3.5`})}),(0,N.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[m,` / `,p,` lines`]})]}),(0,N.jsxs)(`div`,{ref:u,className:`flex-1 overflow-y-auto p-2 text-xs relative`,onScroll:g,children:[f.map(e=>(0,N.jsx)(G,{group:e,filter:n,collapsed:s.has(e.key),onToggle:()=>v(e.key)},e.key)),(0,N.jsx)(`div`,{ref:l})]}),!a&&(0,N.jsxs)(E,{size:`sm`,variant:`secondary`,onClick:()=>{o(!0),h()},className:`absolute bottom-16 right-6 h-7 gap-1 shadow-lg`,children:[(0,N.jsx)(_,{className:`w-3 h-3`}),`Jump to bottom`]})]})}var G=(0,M.memo)(function({group:e,filter:t,collapsed:n,onToggle:r}){let i=t?e.lines.filter(e=>e.content.toLowerCase().includes(t.toLowerCase())):e.lines;if(e.header===null)return i.length===0?null:(0,N.jsx)(`div`,{children:i.map((e,t)=>(0,N.jsx)(q,{line:e,even:t%2==0},e.id))});let a=e.header.content;return(0,N.jsxs)(`div`,{className:`mt-3 rounded-md overflow-hidden border border-border/20`,children:[(0,N.jsxs)(`button`,{type:`button`,onClick:r,className:s(`flex items-center gap-2 w-full text-left px-3 py-2`,`bg-primary/5 border-b border-primary/20`,`hover:bg-primary/10 transition-colors duration-150 cursor-pointer`),children:[(0,N.jsx)(m,{className:s(`w-3 h-3 text-primary/60 shrink-0 transition-transform duration-150`,!n&&`rotate-90`)}),(0,N.jsx)(`span`,{className:`flex-1 text-[12px] font-semibold text-foreground leading-none`,children:a}),e.header.timestamp&&(0,N.jsx)(`span`,{className:`text-[10px] text-muted-foreground/40 font-mono tabular-nums shrink-0`,children:new Date(e.header.timestamp).toLocaleTimeString(`en`,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1})}),(0,N.jsxs)(`span`,{className:`text-[10px] text-muted-foreground/40 shrink-0`,children:[e.lines.length,` lines`]})]}),!n&&(0,N.jsx)(`div`,{className:`bg-muted/5`,children:i.length===0?(0,N.jsx)(`p`,{className:`px-4 py-2 text-[10px] text-muted-foreground/40 italic`,children:t?`No matching lines`:`No output`}):i.map((e,t)=>(0,N.jsx)(q,{line:e,even:t%2==0},e.id))})]})}),K=[O],q=(0,M.memo)(function({line:e,even:t}){let n=e.type===`assistant`,r=e.type===`diff-add`,i=e.type===`diff-remove`,a=e.type===`diff-meta`,o=e.type===`diff-hunk`;return(0,N.jsxs)(`div`,{className:s(`flex items-start gap-2 group px-2 py-0.5 rounded-sm`,!(r||i||a||o)&&(t?`bg-muted/20`:`bg-transparent`),e.type===`result`&&`bg-emerald-500/5 border-l-2 border-emerald-500/40 mt-2 py-2`,r&&`bg-emerald-500/8 border-l-2 border-emerald-500/50`,i&&`bg-red-500/8 border-l-2 border-red-500/50`,a&&`bg-dracula-purple/5 border-l-2 border-dracula-purple/30`,o&&`bg-dracula-cyan/5 border-l-2 border-dracula-cyan/30`),children:[e.timestamp&&(0,N.jsx)(`span`,{className:`text-[10px] text-muted-foreground/40 shrink-0 mt-0.5 w-[52px] font-mono tabular-nums`,children:new Date(e.timestamp).toLocaleTimeString(`en`,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1})}),n?(0,N.jsx)(`div`,{className:`flex-1 min-w-0 prose prose-invert prose-xs max-w-none
4
4
  prose-p:my-1 prose-p:leading-relaxed
5
5
  prose-headings:mt-2 prose-headings:mb-1 prose-headings:text-sm prose-headings:font-semibold
6
6
  prose-ul:my-1 prose-ol:my-1 prose-li:my-0
@@ -13,4 +13,4 @@ import{n as e,o as t,r as n,t as r}from"./createLucideIcon-j4o5em8U.js";import".
13
13
  prose-th:px-3 prose-th:py-1.5 prose-th:text-left prose-th:font-semibold prose-th:text-foreground/90
14
14
  prose-td:px-3 prose-td:py-1.5 prose-td:border-border
15
15
  prose-tr:border-border
16
- text-foreground/80`,children:(0,N.jsx)(C,{remarkPlugins:[b],rehypePlugins:K,children:e.content})}):(0,N.jsx)(`span`,{className:s(`flex-1 break-all leading-relaxed whitespace-pre-wrap font-mono`,e.type===`tool-use`&&`text-cyan-400/80 text-[11px]`,e.type===`stderr`&&`text-orange-400`,e.type===`result`&&`text-emerald-400 font-medium`,e.type===`log`&&`text-foreground/60`,e.type===`plain`&&`text-foreground/70`,e.type===`tool-result`&&`text-muted-foreground/50`,r&&`text-emerald-400`,i&&`text-red-400`,a&&`text-dracula-purple/80`,o&&`text-dracula-cyan/80`),children:e.content})]})}),J={running:{variant:`running`,label:`running`,tooltip:`Job is actively executing`},completed:{variant:`success`,label:`completed`,tooltip:`Job completed successfully`},failed:{variant:`failed`,label:`failed`,tooltip:`Job exited with a non-zero code`},canceled:{variant:`canceled`,label:`canceled`,tooltip:`Job was manually canceled`},queued:{variant:`queued`,label:`queued`,tooltip:`Job is waiting in the queue`}};function Y(){let{id:e}=_(),{activeProjectId:t}=a(),n=l(),[r,s]=(0,M.useState)(null),[u,d]=(0,M.useState)([]),[m,h]=(0,M.useState)([]),[y,b]=(0,M.useState)({}),[S,C]=(0,M.useState)(!0),[O,k]=(0,M.useState)(!1);(0,M.useEffect)(()=>{if(!e)return;let t=new AbortController;s(null),d([]),h([]),b({}),C(!0),k(!1);async function n(){try{let n=await fetch(`${o()}/jobs/${e}`,{signal:t.signal});if(n.status===404){k(!0);return}if(!n.ok)throw Error(`Failed to fetch job`);let r=await n.json();s(r.job),d(r.events)}catch(e){if(e.name===`AbortError`)return;k(!0)}finally{t.signal.aborted||C(!1)}}return n(),()=>t.abort()},[e,t]);let A=(0,M.useRef)(t);A.current=t;let F=(0,M.useRef)([]),I=(0,M.useRef)(null),L=(0,M.useCallback)(()=>{I.current=null;let e=F.current;e.length!==0&&(F.current=[],d(t=>{let n=[...t,...e];return n.length>1e4?n.slice(n.length-8e3):n}))},[]);(0,M.useEffect)(()=>()=>{I.current&&cancelAnimationFrame(I.current)},[]);let z=(0,M.useCallback)(t=>{let n=t;if(!(A.current&&n.projectId&&n.projectId!==A.current)){if(n.type===`init`){let e=n.phaseDefinitions??[];h(e);let t={};for(let r of e)t[r.key]=n.phases?.[r.key]??`idle`;b(t)}else if(n.type===`log`&&n.processId===e){let t={id:Date.now(),job_id:e??``,seq:0,event_type:`log`,source:n.source,payload:JSON.stringify({line:n.line}),timestamp:n.timestamp};F.current.push(t),I.current||=requestAnimationFrame(L)}else if(n.type===`phase`){let e=n.phase,t=n.state;b(n=>({...n,[e]:t}))}else if(n.type===`queue`){let t=n.jobs?.find(t=>t.id===e);t&&s(e=>e&&{...e,status:t.status})}}},[e,L]),{registerHandler:B,unregisterHandler:V}=c();(0,M.useEffect)(()=>(B(`job-detail-${e}`,z),()=>V(`job-detail-${e}`)),[e,z,B,V]);async function H(){if(e)try{let t=await fetch(`${o()}/jobs/${e}`,{method:`DELETE`});if(t.ok)(await t.json()).status===`deleted`?(i.success(`Job deleted`),n(`/jobs`)):i.success(`Cancel signal sent`,{description:`Job will stop at the next safe point`});else{let e=await t.json();i.error(`Failed`,{description:e.error})}}catch{i.error(`Network error`)}}async function U(){if(r)try{let e=await fetch(`${o()}/spawn`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({command:r.command})}),t=await e.json();if(!e.ok)throw Error(t.error??`Failed to spawn job`);i.success(`Job re-queued`),n(`/jobs/${t.jobId}`)}catch(e){i.error(e.message)}}if(S)return(0,N.jsx)(`div`,{className:`max-w-5xl mx-auto px-4 py-6`,children:(0,N.jsxs)(`div`,{className:`space-y-3`,children:[(0,N.jsx)(`div`,{className:`h-4 w-48 bg-muted/30 rounded animate-pulse`}),(0,N.jsx)(`div`,{className:`h-20 bg-muted/30 rounded-lg animate-pulse`}),(0,N.jsx)(`div`,{className:`h-64 bg-muted/30 rounded-lg animate-pulse`})]})});if(O||!r)return(0,N.jsxs)(`div`,{className:`max-w-5xl mx-auto px-4 py-6 flex flex-col items-center gap-3 mt-12`,children:[(0,N.jsx)(`p`,{className:`text-lg font-semibold`,children:`Job not found`}),(0,N.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`The job ID "`,e,`" doesn't exist`]}),(0,N.jsx)(v,{asChild:!0,variant:`outline`,size:`sm`,children:(0,N.jsxs)(D,{to:`/`,children:[(0,N.jsx)(j,{className:`w-3.5 h-3.5 mr-1.5`}),`Back to Dashboard`]})})]});let G=J[r.status]??J.queued,K=r.status===`running`,q=r.status===`completed`||r.status===`failed`;return(0,N.jsxs)(`div`,{className:`flex flex-col h-full max-w-5xl mx-auto w-full`,children:[(0,N.jsxs)(`div`,{className:`px-4 py-4 border-b border-border space-y-3`,children:[(0,N.jsxs)(`div`,{className:`flex items-center gap-1 text-xs text-muted-foreground`,children:[(0,N.jsxs)(D,{to:`/`,className:`hover:text-foreground transition-colors flex items-center gap-1`,children:[(0,N.jsx)(j,{className:`w-3 h-3`}),`Dashboard`]}),(0,N.jsx)(x,{className:`w-3 h-3`}),(0,N.jsxs)(`span`,{className:`text-foreground font-mono`,children:[`Job #`,e?.slice(0,8)]})]}),(0,N.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,N.jsxs)(`div`,{className:`space-y-1 min-w-0`,children:[(0,N.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,N.jsxs)(f,{children:[(0,N.jsx)(g,{asChild:!0,children:(0,N.jsx)(`div`,{children:(0,N.jsx)(T,{variant:G.variant,children:G.label})})}),(0,N.jsx)(p,{children:G.tooltip})]}),(0,N.jsx)(`code`,{className:`text-sm font-mono text-foreground/90 truncate`,children:r.command})]}),(0,N.jsxs)(`div`,{className:`flex items-center gap-3 text-xs text-muted-foreground flex-wrap`,children:[(0,N.jsxs)(`span`,{children:[`Started `,w(new Date(r.started_at),{addSuffix:!0})]}),r.model&&(0,N.jsx)(`span`,{className:`text-muted-foreground/40`,children:r.model})]})]}),(0,N.jsxs)(`div`,{className:`flex items-center gap-2 shrink-0`,children:[q&&(0,N.jsxs)(f,{children:[(0,N.jsx)(g,{asChild:!0,children:(0,N.jsxs)(v,{variant:`outline`,size:`sm`,onClick:U,className:`h-7`,children:[(0,N.jsx)(E,{className:`w-3.5 h-3.5 mr-1.5`}),`Re-execute`]})}),(0,N.jsx)(p,{children:`Spawn a new job with the same command`})]}),K&&(0,N.jsxs)(f,{children:[(0,N.jsx)(g,{asChild:!0,children:(0,N.jsx)(v,{variant:`outline`,size:`sm`,onClick:H,className:`h-7 border-destructive/30 text-destructive hover:bg-destructive/10`,children:`Cancel Job`})}),(0,N.jsx)(p,{children:`Send SIGTERM to the running process. The job will be marked as canceled.`})]})]})]}),(0,N.jsx)(P,{phases:y,phaseDefinitions:m})]}),(r.status===`completed`||r.status===`failed`)&&(0,N.jsx)(R,{job:r,events:u,defaultOpen:r.status===`completed`}),(0,N.jsx)(`div`,{className:`flex-1 overflow-hidden relative`,children:(0,N.jsx)(W,{events:u})})]})}export{Y as default};
16
+ text-foreground/80`,children:(0,N.jsx)(x,{remarkPlugins:[D],rehypePlugins:K,children:e.content})}):(0,N.jsx)(`span`,{className:s(`flex-1 break-all leading-relaxed whitespace-pre-wrap font-mono`,e.type===`tool-use`&&`text-cyan-400/80 text-[11px]`,e.type===`stderr`&&`text-orange-400`,e.type===`result`&&`text-emerald-400 font-medium`,e.type===`log`&&`text-foreground/60`,e.type===`plain`&&`text-foreground/70`,e.type===`tool-result`&&`text-muted-foreground/50`,r&&`text-emerald-400`,i&&`text-red-400`,a&&`text-dracula-purple/80`,o&&`text-dracula-cyan/80`),children:e.content})]})}),J={running:{variant:`running`,label:`running`,tooltip:`Job is actively executing`},completed:{variant:`success`,label:`completed`,tooltip:`Job completed successfully`},failed:{variant:`failed`,label:`failed`,tooltip:`Job exited with a non-zero code`},canceled:{variant:`canceled`,label:`canceled`,tooltip:`Job was manually canceled`},queued:{variant:`queued`,label:`queued`,tooltip:`Job is waiting in the queue`}};function Y(){let{id:e}=w(),{activeProjectId:t}=a(),n=p(),[r,s]=(0,M.useState)(null),[u,h]=(0,M.useState)([]),[g,_]=(0,M.useState)([]),[x,S]=(0,M.useState)({}),[T,D]=(0,M.useState)(!0),[O,k]=(0,M.useState)(!1);(0,M.useEffect)(()=>{if(!e)return;let t=new AbortController;s(null),h([]),_([]),S({}),D(!0),k(!1);async function n(){try{let n=await fetch(`${o()}/jobs/${e}`,{signal:t.signal});if(n.status===404){k(!0);return}if(!n.ok)throw Error(`Failed to fetch job`);let r=await n.json();s(r.job),h(r.events)}catch(e){if(e.name===`AbortError`)return;k(!0)}finally{t.signal.aborted||D(!1)}}return n(),()=>t.abort()},[e,t]);let A=(0,M.useRef)(t);A.current=t;let F=(0,M.useRef)([]),I=(0,M.useRef)(null),L=(0,M.useCallback)(()=>{I.current=null;let e=F.current;e.length!==0&&(F.current=[],h(t=>{let n=[...t,...e];return n.length>1e4?n.slice(n.length-8e3):n}))},[]);(0,M.useEffect)(()=>()=>{I.current&&cancelAnimationFrame(I.current)},[]);let z=(0,M.useCallback)(t=>{let n=t;if(!(A.current&&n.projectId&&n.projectId!==A.current)){if(n.type===`init`){let e=n.phaseDefinitions??[];_(e);let t={};for(let r of e)t[r.key]=n.phases?.[r.key]??`idle`;S(t)}else if(n.type===`log`&&n.processId===e){let t={id:Date.now(),job_id:e??``,seq:0,event_type:`log`,source:n.source,payload:JSON.stringify({line:n.line}),timestamp:n.timestamp};F.current.push(t),I.current||=requestAnimationFrame(L)}else if(n.type===`phase`){let e=n.phase,t=n.state;S(n=>({...n,[e]:t}))}else if(n.type===`queue`){let t=n.jobs?.find(t=>t.id===e);t&&s(e=>e&&{...e,status:t.status})}}},[e,L]),{registerHandler:B,unregisterHandler:V}=c();(0,M.useEffect)(()=>(B(`job-detail-${e}`,z),()=>V(`job-detail-${e}`)),[e,z,B,V]);async function H(){if(e)try{let t=await fetch(`${o()}/jobs/${e}`,{method:`DELETE`});if(t.ok)(await t.json()).status===`deleted`?(i.success(`Job deleted`),n(`/jobs`)):i.success(`Cancel signal sent`,{description:`Job will stop at the next safe point`});else{let e=await t.json();i.error(`Failed`,{description:e.error})}}catch{i.error(`Network error`)}}async function U(){if(r)try{let e=await fetch(`${o()}/spawn`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({command:r.command})}),t=await e.json();if(!e.ok)throw Error(t.error??`Failed to spawn job`);i.success(`Job re-queued`),n(`/jobs/${t.jobId}`)}catch(e){i.error(e.message)}}if(T)return(0,N.jsx)(`div`,{className:`max-w-5xl mx-auto px-4 py-6`,children:(0,N.jsxs)(`div`,{className:`space-y-3`,children:[(0,N.jsx)(`div`,{className:`h-4 w-48 bg-muted/30 rounded animate-pulse`}),(0,N.jsx)(`div`,{className:`h-20 bg-muted/30 rounded-lg animate-pulse`}),(0,N.jsx)(`div`,{className:`h-64 bg-muted/30 rounded-lg animate-pulse`})]})});if(O||!r)return(0,N.jsxs)(`div`,{className:`max-w-5xl mx-auto px-4 py-6 flex flex-col items-center gap-3 mt-12`,children:[(0,N.jsx)(`p`,{className:`text-lg font-semibold`,children:`Job not found`}),(0,N.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`The job ID "`,e,`" doesn't exist`]}),(0,N.jsx)(E,{asChild:!0,variant:`outline`,size:`sm`,children:(0,N.jsxs)(d,{to:`/`,children:[(0,N.jsx)(j,{className:`w-3.5 h-3.5 mr-1.5`}),`Back to Dashboard`]})})]});let G=J[r.status]??J.queued,K=r.status===`running`,q=r.status===`completed`||r.status===`failed`;return(0,N.jsxs)(`div`,{className:`flex flex-col h-full max-w-5xl mx-auto w-full`,children:[(0,N.jsxs)(`div`,{className:`px-4 py-4 border-b border-border space-y-3`,children:[(0,N.jsxs)(`div`,{className:`flex items-center gap-1 text-xs text-muted-foreground`,children:[(0,N.jsxs)(d,{to:`/`,className:`hover:text-foreground transition-colors flex items-center gap-1`,children:[(0,N.jsx)(j,{className:`w-3 h-3`}),`Dashboard`]}),(0,N.jsx)(m,{className:`w-3 h-3`}),(0,N.jsxs)(`span`,{className:`text-foreground font-mono`,children:[`Job #`,e?.slice(0,8)]})]}),(0,N.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,N.jsxs)(`div`,{className:`space-y-1 min-w-0`,children:[(0,N.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,N.jsxs)(f,{children:[(0,N.jsx)(y,{asChild:!0,children:(0,N.jsx)(`div`,{children:(0,N.jsx)(b,{variant:G.variant,children:G.label})})}),(0,N.jsx)(v,{children:G.tooltip})]}),(0,N.jsx)(`code`,{className:`text-sm font-mono text-foreground/90 truncate`,children:r.command})]}),(0,N.jsxs)(`div`,{className:`flex items-center gap-3 text-xs text-muted-foreground flex-wrap`,children:[(0,N.jsxs)(`span`,{children:[`Started `,C(new Date(r.started_at),{addSuffix:!0})]}),r.model&&(0,N.jsx)(`span`,{className:`text-muted-foreground/40`,children:r.model})]})]}),(0,N.jsxs)(`div`,{className:`flex items-center gap-2 shrink-0`,children:[q&&(0,N.jsxs)(f,{children:[(0,N.jsx)(y,{asChild:!0,children:(0,N.jsxs)(E,{variant:`outline`,size:`sm`,onClick:U,className:`h-7`,children:[(0,N.jsx)(l,{className:`w-3.5 h-3.5 mr-1.5`}),`Re-execute`]})}),(0,N.jsx)(v,{children:`Spawn a new job with the same command`})]}),K&&(0,N.jsxs)(f,{children:[(0,N.jsx)(y,{asChild:!0,children:(0,N.jsx)(E,{variant:`outline`,size:`sm`,onClick:H,className:`h-7 border-destructive/30 text-destructive hover:bg-destructive/10`,children:`Cancel Job`})}),(0,N.jsx)(v,{children:`Send SIGTERM to the running process. The job will be marked as canceled.`})]})]})]}),(0,N.jsx)(P,{phases:x,phaseDefinitions:g})]}),(r.status===`completed`||r.status===`failed`)&&(0,N.jsx)(R,{job:r,events:u,defaultOpen:r.status===`completed`}),(0,N.jsx)(`div`,{className:`flex-1 overflow-hidden relative`,children:(0,N.jsx)(W,{events:u})})]})}export{Y as default};