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.
- package/cli/dist/specrails-hub.js +80 -22
- package/client/dist/assets/{ActivityFeedPage-DGG6pwZ4.js → ActivityFeedPage-tERWyUTH.js} +1 -1
- package/client/dist/assets/AnalyticsPage-DUCp-pHx.js +4 -0
- package/client/dist/assets/{DocsDialog-3n-boiJy.js → DocsDialog-C-EhPPrX.js} +2 -2
- package/client/dist/assets/{DocsPage-H0qeQJYd.js → DocsPage-BA5sORSV.js} +2 -2
- package/client/dist/assets/HubAnalyticsPage-Dao1HNci.js +1 -0
- package/client/dist/assets/{JobDetailPage-BXNmkjvi.js → JobDetailPage-CdbcXcfe.js} +4 -4
- package/client/dist/assets/JobsPage-CmgiX4PP.js +1 -0
- package/client/dist/assets/{BarChart-BOsGtbqJ.js → dracula-colors-C67D9ngQ.js} +2 -2
- package/client/dist/assets/index-Bq1AywmF.css +2 -0
- package/client/dist/assets/index-CGeGMvIX.js +112 -0
- package/client/dist/assets/{lib-DnnFAwDK.js → lib-T3dOmNkJ.js} +1 -1
- package/client/dist/assets/{useHub-BeVU84eS.js → useHub-D5e-JfkR.js} +1 -1
- package/client/dist/index.html +4 -6
- package/docs/general/getting-started.md +65 -70
- package/docs/general/platform-overview.md +54 -82
- package/docs/product/features.md +78 -101
- package/docs/product/workflows.md +55 -94
- package/package.json +1 -1
- package/server/dist/docs-router.js +1 -2
- package/server/dist/hub-analytics.js +0 -213
- package/server/dist/hub-router.js +0 -54
- package/server/dist/project-registry.js +15 -3
- package/server/dist/project-router.js +14 -3
- package/server/dist/queue-manager.js +10 -3
- package/client/dist/assets/AnalyticsPage-D3SVaoxG.js +0 -4
- package/client/dist/assets/HubAnalyticsPage-B33p4BG4.js +0 -1
- package/client/dist/assets/HubOverviewPage-CRX2gpc-.js +0 -1
- package/client/dist/assets/JobsPage-bm-srMLz.js +0 -1
- package/client/dist/assets/dracula-colors-B0g266RC.js +0 -1
- package/client/dist/assets/en-US-DUO_uYan.js +0 -1
- package/client/dist/assets/index-94S85Lsd.js +0 -112
- package/client/dist/assets/index-BjiliAvI.css +0 -2
- package/client/dist/assets/x-C53vXlx8.js +0 -1
- package/docs/engineering/engineering-standards.md +0 -67
- package/docs/engineering/specrails-web-status.md +0 -117
- package/docs/ux/hub-audit.md +0 -131
- /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
|
-
'
|
|
47
|
-
'
|
|
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
|
|
170
|
-
specrails-hub
|
|
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
|
|
178
|
-
specrails-hub
|
|
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
|
|
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
|
-
|
|
306
|
-
`
|
|
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-
|
|
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{
|
|
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)(
|
|
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{
|
|
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)(
|
|
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-
|
|
2
|
-
`+e.content:n.push({...e})}let r=H(n);return{processedLines:r,groups:U(r),totalLines:r.length}},[e]),
|
|
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:[
|
|
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)(
|
|
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};
|