fleetlens 0.13.0 → 0.13.2
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/app/apps/web/.next/BUILD_ID +1 -1
- package/app/apps/web/.next/build-manifest.json +8 -8
- package/app/apps/web/.next/prerender-manifest.json +3 -3
- package/app/apps/web/.next/server/app/_global-error/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/_global-error.html +1 -1
- package/app/apps/web/.next/server/app/_global-error.rsc +7 -7
- package/app/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/app/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/app/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/app/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/app/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/apps/web/.next/server/app/_not-found/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/_not-found/page.js +1 -1
- package/app/apps/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/api/ask/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/digest/day/[date]/route.js +1 -1
- package/app/apps/web/.next/server/app/api/digest/day/[date]/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route.js +1 -1
- package/app/apps/web/.next/server/app/api/digest/month/[yearMonth]/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/digest/month-index/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/digest/week/[startDate]/route.js +1 -1
- package/app/apps/web/.next/server/app/api/digest/week/[startDate]/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/digest/week-index/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/events/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/jobs/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/pdf/[key]/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/runs/[runId]/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/runs/[runId]/stream/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/runs/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/team-config/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/api/workflow-agent/route.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/changelog/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/changelog/page.js +1 -1
- package/app/apps/web/.next/server/app/changelog/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/day/[date]/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/day/[date]/page.js +1 -1
- package/app/apps/web/.next/server/app/day/[date]/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/day/[date]/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/day/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/day/page.js +1 -1
- package/app/apps/web/.next/server/app/day/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/day/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/digest/[date]/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/digest/[date]/page.js +1 -1
- package/app/apps/web/.next/server/app/digest/[date]/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/digest/[date]/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/digest/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/digest/page.js +1 -1
- package/app/apps/web/.next/server/app/digest/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/digest/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/insights/[key]/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/insights/[key]/page.js +1 -1
- package/app/apps/web/.next/server/app/insights/[key]/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/insights/[key]/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/insights/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/insights/page.js +3 -2
- package/app/apps/web/.next/server/app/insights/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/insights/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/page.js +1 -1
- package/app/apps/web/.next/server/app/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/parallelism/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/parallelism/page.js +1 -1
- package/app/apps/web/.next/server/app/parallelism/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/parallelism/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/print/[key]/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/print/[key]/page.js +1 -1
- package/app/apps/web/.next/server/app/print/[key]/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/print/[key]/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/projects/[slug]/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/projects/[slug]/page.js +1 -1
- package/app/apps/web/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/projects/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/projects/page.js +1 -1
- package/app/apps/web/.next/server/app/projects/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/runs/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/runs/page.js +1 -1
- package/app/apps/web/.next/server/app/runs/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/runs/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/sessions/[id]/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/sessions/[id]/page.js +1 -1
- package/app/apps/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/sessions/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/sessions/page.js +1 -1
- package/app/apps/web/.next/server/app/sessions/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/settings/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/settings/page.js +1 -1
- package/app/apps/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/team/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/team/page.js +1 -1
- package/app/apps/web/.next/server/app/team/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/team/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/app/usage/page/build-manifest.json +5 -5
- package/app/apps/web/.next/server/app/usage/page.js +1 -1
- package/app/apps/web/.next/server/app/usage/page.js.nft.json +1 -1
- package/app/apps/web/.next/server/app/usage/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__0gril0u._.js +9 -0
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__0n79hpm._.js +9 -0
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__0~utv~v._.js +9 -0
- package/app/apps/web/.next/server/chunks/packages_parser_dist_06d9se1._.js +1 -1
- package/app/apps/web/.next/server/chunks/packages_parser_dist_10ihc3~._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0exckd4._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__0-1_njm._.js → [root-of-the-server]__0k1x-c9._.js} +2 -2
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0lhwp-k._.js +8 -0
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0n-ax-5._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__0~.f_3z._.js +3 -3
- package/app/apps/web/.next/server/chunks/ssr/_0kajk31._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/_0s3n5mz._.js +8 -0
- package/app/apps/web/.next/server/chunks/ssr/_0xu2pvc._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/{_0jw2sm7._.js → _12mbgs5._.js} +2 -2
- package/app/apps/web/.next/server/chunks/ssr/apps_web_app_day_[date]_day-view_tsx_0wjoe1u._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/apps_web_app_insights_page_tsx_071kwyw._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/apps_web_app_sessions_sessions-grid_tsx_0bri5x.._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/apps_web_components_0l6hsch._.js +6 -0
- package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_changelog_ts_0n7_p1d._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/apps_web_lib_changelog_ts_0nb5_-s._.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0cepfi8._.js +3 -0
- package/app/apps/web/.next/server/chunks/ssr/packages_entries_dist_node_0_271yr.js +1 -1
- package/app/apps/web/.next/server/chunks/ssr/packages_parser_dist_0mx_509._.js +1 -1
- package/app/apps/web/.next/server/middleware-build-manifest.js +8 -8
- package/app/apps/web/.next/server/middleware-manifest.json +5 -5
- package/app/apps/web/.next/server/pages/500.html +1 -1
- package/app/apps/web/.next/server/server-reference-manifest.js +1 -1
- package/app/apps/web/.next/server/server-reference-manifest.json +1 -1
- package/app/apps/web/.next/static/chunks/02xxpexzk3rf-.js +1 -0
- package/app/apps/web/.next/static/chunks/{07lbm-sdh9c2j.js → 0389wb_f0j78j.js} +1 -1
- package/app/apps/web/.next/static/chunks/03gy1evbn94qu.js +6 -0
- package/app/apps/web/.next/static/chunks/03rd.3cc_t~yf.js +4 -0
- package/app/apps/web/.next/static/chunks/{0l4e3as18eexy.js → 0g223u9amib0q.js} +1 -1
- package/app/apps/web/.next/static/chunks/{0h3.-_s-k0mj3.js → 0i.hc~2bj0_3d.js} +1 -1
- package/app/apps/web/.next/static/chunks/0m7dd-2zd9vl2.js +4 -0
- package/app/apps/web/.next/static/chunks/0nqklmbs5s3ax.js +6 -0
- package/app/apps/web/.next/static/chunks/{073081qv4uyn8.js → 0p--hzrway8~3.js} +1 -1
- package/app/apps/web/.next/static/chunks/{0gblp_v.kiu-..js → 0qv-gw888_5nu.js} +1 -1
- package/app/apps/web/.next/static/chunks/{14bjditmmrn7l.js → 0tirv_vo6q8uc.js} +1 -1
- package/app/apps/web/.next/static/chunks/0uyctl-m8iydb.js +1 -0
- package/app/apps/web/.next/static/chunks/0~qdw1b2uz._5.js +10 -0
- package/app/apps/web/.next/static/chunks/{0n0n.0279ot6c.js → 14vx702c32kn6.js} +1 -1
- package/app/apps/web/.next/static/chunks/{turbopack-0lb9w090w5ezx.js → turbopack-0mxu3~9vk.brh.js} +1 -1
- package/app/apps/web/app/api/digest/_shared/digest-route-helpers.ts +178 -0
- package/app/apps/web/app/api/digest/day/[date]/route.ts +34 -128
- package/app/apps/web/app/api/digest/month/[yearMonth]/route.ts +36 -121
- package/app/apps/web/app/api/digest/week/[startDate]/route.ts +36 -123
- package/app/apps/web/app/insights/page.tsx +20 -5
- package/app/apps/web/app/parallelism/burst-detail-modal.tsx +637 -0
- package/app/apps/web/app/parallelism/concurrency-info-modal.tsx +228 -0
- package/app/apps/web/app/parallelism/gantt-chart-utils.ts +49 -0
- package/app/apps/web/app/parallelism/gantt-chart.tsx +24 -903
- package/app/apps/web/app/sessions/[id]/session-view/colors.ts +31 -0
- package/app/apps/web/app/sessions/[id]/session-view/debug-list.tsx +78 -0
- package/app/apps/web/app/sessions/[id]/session-view/drawer.tsx +414 -0
- package/app/apps/web/app/sessions/[id]/session-view/entry-day-strip.tsx +124 -0
- package/app/apps/web/app/sessions/[id]/session-view/header-stats.tsx +217 -0
- package/app/apps/web/app/sessions/[id]/session-view/helpers.ts +135 -0
- package/app/apps/web/app/sessions/[id]/session-view/minimap.tsx +1587 -0
- package/app/apps/web/app/sessions/[id]/session-view/subagent-drawer.tsx +339 -0
- package/app/apps/web/app/sessions/[id]/session-view/token-stats.tsx +111 -0
- package/app/apps/web/app/sessions/[id]/session-view/tooltip.tsx +63 -0
- package/app/apps/web/app/sessions/[id]/session-view/types.ts +46 -0
- package/app/apps/web/app/sessions/[id]/session-view/workflows-panel.tsx +944 -0
- package/app/apps/web/app/sessions/[id]/session-view/workflows-shared.tsx +104 -0
- package/app/apps/web/app/sessions/[id]/session-view.tsx +1513 -5018
- package/app/apps/web/app/sessions/[id]/team-tab/minimap-hover-card.tsx +201 -0
- package/app/apps/web/app/sessions/[id]/team-tab/minimap-idle-band.tsx +53 -0
- package/app/apps/web/app/sessions/[id]/team-tab/minimap-shared.ts +20 -0
- package/app/apps/web/app/sessions/[id]/team-tab/team-minimap.tsx +10 -265
- package/app/apps/web/app/sessions/sessions-grid.tsx +10 -10
- package/app/apps/web/components/digest-actions.tsx +103 -0
- package/app/apps/web/components/job-queue-widget.tsx +1 -1
- package/app/apps/web/components/month-digest-view.tsx +19 -64
- package/app/apps/web/components/searchable-select.tsx +215 -0
- package/app/apps/web/components/tail-mode.tsx +46 -9
- package/app/apps/web/components/week-digest-view.tsx +16 -71
- package/app/apps/web/lib/changelog-data.generated.ts +1 -1
- package/app/apps/web/lib/entries-index.ts +7 -8
- package/app/apps/web/lib/entries.ts +0 -9
- package/app/apps/web/lib/format.test.ts +221 -0
- package/app/apps/web/lib/format.ts +17 -0
- package/app/apps/web/lib/utilization-tone.test.ts +56 -0
- package/app/apps/web/package.json +1 -1
- package/app/apps/web/tsconfig.tsbuildinfo +1 -1
- package/dist/daemon-worker.js +35 -43
- package/dist/index.js +37 -49
- package/package.json +1 -1
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__04j3tng._.js +0 -9
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__0cnh3k4._.js +0 -9
- package/app/apps/web/.next/server/chunks/[root-of-the-server]__132eosx._.js +0 -9
- package/app/apps/web/.next/server/chunks/ssr/[root-of-the-server]__136-0me._.js +0 -8
- package/app/apps/web/.next/server/chunks/ssr/_0w.cv64._.js +0 -8
- package/app/apps/web/.next/server/chunks/ssr/apps_web_components_01d-iwx._.js +0 -6
- package/app/apps/web/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_0-lmm4p._.js +0 -3
- package/app/apps/web/.next/static/chunks/05k84gif3ucxm.js +0 -6
- package/app/apps/web/.next/static/chunks/0nnjldasalwdu.js +0 -4
- package/app/apps/web/.next/static/chunks/0okg13phslr1..js +0 -4
- package/app/apps/web/.next/static/chunks/0pzt9vemtzct8.js +0 -10
- package/app/apps/web/.next/static/chunks/0qmh5da6gfm56.js +0 -1
- package/app/apps/web/.next/static/chunks/0rnay-a.-jr8-.js +0 -1
- package/app/apps/web/.next/static/chunks/0snv3-2ux2xvv.js +0 -6
- /package/app/apps/web/.next/static/{rbp9x3iPbzrz-wxS-DAU5 → bZs5UyzsYBqC6MFY5n-M_}/_buildManifest.js +0 -0
- /package/app/apps/web/.next/static/{rbp9x3iPbzrz-wxS-DAU5 → bZs5UyzsYBqC6MFY5n-M_}/_clientMiddlewareManifest.js +0 -0
- /package/app/apps/web/.next/static/{rbp9x3iPbzrz-wxS-DAU5 → bZs5UyzsYBqC6MFY5n-M_}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,63059,e=>{"use strict";let t=(0,e.i(75254).default)("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);e.s(["ChevronRight",0,t],63059)},37727,e=>{"use strict";let t=(0,e.i(75254).default)("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);e.s(["X",0,t],37727)},64659,e=>{"use strict";let t=(0,e.i(75254).default)("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);e.s(["ChevronDown",0,t],64659)},36373,e=>{"use strict";var t=e.i(18050),r=e.i(71645),a=e.i(37727);let n=(0,e.i(75254).default)("Maximize2",[["polyline",{points:"15 3 21 3 21 9",key:"mznyad"}],["polyline",{points:"9 21 3 21 3 15",key:"1avn1i"}],["line",{x1:"21",x2:"14",y1:"3",y2:"10",key:"ota7mn"}],["line",{x1:"3",x2:"10",y1:"21",y2:"14",key:"1atl0r"}]]);var i=e.i(88137);function s({snapshots:e,seriesKey:a,windowMs:d,colorVar:c,predictedSeries:x,onExpand:u}){let p=(0,r.useMemo)(()=>{let t=e.map(e=>({capturedAt:new Date(e.captured_at).getTime(),window:e[a]})).filter(e=>null!==e.window&&null!==e.window.utilization);if(0===t.length)return null;let r=t[t.length-1],n=r.window.resets_at?new Date(r.window.resets_at).getTime():null;if(!n)return null;let i=n-d,s=Date.now(),l=100-(r.window.utilization??0);return{points:t.filter(e=>e.capturedAt>=i&&e.capturedAt<=n).map(e=>[e.capturedAt,100-(e.window.utilization??0)]),predicted:(x??[]).filter(e=>e.capturedAt>=i&&e.capturedAt<=n).map(e=>[e.capturedAt,100-Math.max(0,Math.min(100,e.util))]).sort((e,t)=>e[0]-t[0]),windowStart:i,windowEnd:n,now:s,currentRemaining:l,latest:r}},[e,a,d,x]),f=1190,h=148,[y,g]=(0,r.useState)(null),[v,m]=(0,r.useState)(!1);if((0,r.useEffect)(()=>m(!0),[]),!p)return(0,t.jsx)("div",{className:"af-card",style:{padding:"14px 18px",textAlign:"center",fontSize:12,color:"var(--af-text-tertiary)"},children:"No data for this window yet."});let{points:b,predicted:j,windowStart:k,windowEnd:w,now:M,currentRemaining:S,latest:$}=p,D=e=>64+(e-k)/(w-k)*f,z=e=>20+h-e/100*h,A=e=>Math.max(0,Math.min(100,100-(e-k)/(w-k)*100)),W=S-A(M),F=(0,i.paceLabel)(W),L=(0,i.toneVar)(F.tone),C=F.label,T=b.length>0?b.map(([e,t],r)=>`${0===r?"M":"L"} ${D(e).toFixed(1)} ${z(t).toFixed(1)}`).join(" "):"",N=j.length>1?j.map(([e,t],r)=>`${0===r?"M":"L"} ${D(e).toFixed(1)} ${z(t).toFixed(1)}`).join(" "):"",R=b.length>0?`${T} L ${D(b[b.length-1][0]).toFixed(1)} ${z(0).toFixed(1)} L ${D(b[0][0]).toFixed(1)} ${z(0).toFixed(1)} Z`:"";return(0,t.jsxs)("div",{className:"af-card",style:{padding:"14px 18px"},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"baseline",gap:14,flexWrap:"wrap",marginBottom:8},children:[(0,t.jsxs)("div",{style:{fontSize:18,fontWeight:700,letterSpacing:"-0.01em",color:c,fontVariantNumeric:"tabular-nums"},children:[S.toFixed(1),"%",(0,t.jsx)("span",{style:{fontSize:11,fontWeight:500,color:"var(--af-text-tertiary)",marginLeft:4,letterSpacing:0},children:"remaining"})]}),(0,t.jsx)("div",{suppressHydrationWarning:!0,style:{fontSize:11,color:L,fontWeight:500},children:v&&(0,t.jsxs)(t.Fragment,{children:[C," (",W>=0?"+":"",W.toFixed(1),"pp)"]})}),(0,t.jsxs)("div",{suppressHydrationWarning:!0,style:{fontSize:11,color:"var(--af-text-tertiary)",marginLeft:"auto"},children:[function(e){let t=e/36e5;if(t<24)return`${t} hour${1===t?"":"s"}`;let r=t/24;return`${r} day${1===r?"":"s"}`}(d)," · resets"," ",o(new Date(w).toISOString())]}),u&&(0,t.jsx)("button",{type:"button",onClick:u,"aria-label":"Expand chart",title:"Expand",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:24,height:24,borderRadius:5,background:"transparent",border:"1px solid var(--af-border-subtle)",color:"var(--af-text-tertiary)",cursor:"pointer",marginLeft:4},children:(0,t.jsx)(n,{size:12})})]}),(0,t.jsxs)("div",{style:{position:"relative"},children:[(0,t.jsxs)("svg",{viewBox:"0 0 1280 200",style:{width:"100%",aspectRatio:"1280 / 200",display:"block"},onMouseMove:e=>{let t=e.currentTarget.getBoundingClientRect(),r=(e.clientX-t.left)/t.width*1280;if(r<64||r>1254)return void g(null);let a=k+(r-64)/f*(w-k),n=b[0],i=Math.abs(n[0]-a);for(let e of b){let t=Math.abs(e[0]-a);t<i&&(n=e,i=t)}let s=null;if(j.length>0){let e=j[0],t=Math.abs(e[0]-n[0]);for(let r of j){let a=Math.abs(r[0]-n[0]);a<t&&(e=r,t=a)}s=e[1]}g({x:D(n[0]),t:n[0],actual:n[1],ideal:A(n[0]),predicted:s})},onMouseLeave:()=>g(null),children:[[0,25,50,75,100].map(e=>{let r=z(e);return(0,t.jsxs)("g",{children:[(0,t.jsx)("line",{x1:64,x2:1254,y1:r,y2:r,stroke:"var(--af-border-subtle)",strokeWidth:"1"}),(0,t.jsxs)("text",{x:56,y:r+4,textAnchor:"end",fontSize:"13",fill:"var(--af-text-tertiary)",children:[e,"%"]})]},e)}),(0,t.jsx)("text",{x:14,y:20+h/2,textAnchor:"middle",transform:`rotate(-90, 14, ${20+h/2})`,fontSize:"12",fill:"var(--af-text-tertiary)",children:"Remaining budget (%)"}),(0,t.jsx)("text",{x:64,y:180,textAnchor:"start",fontSize:"12",fill:"var(--af-text-tertiary)",suppressHydrationWarning:!0,children:l(k)}),(0,t.jsx)("text",{x:1254,y:180,textAnchor:"end",fontSize:"12",fill:"var(--af-text-tertiary)",suppressHydrationWarning:!0,children:l(w)}),(0,t.jsx)("path",{d:R,fill:c,fillOpacity:"0.1"}),(0,t.jsx)("line",{x1:D(k),y1:z(100),x2:D(w),y2:z(0),stroke:"var(--af-text-tertiary)",strokeOpacity:"0.5",strokeWidth:"1.5",strokeDasharray:"4 3"}),v&&M>=k&&M<=w&&(0,t.jsxs)("g",{children:[(0,t.jsx)("line",{x1:D(M),y1:20,x2:D(M),y2:20+h,stroke:"var(--af-text-secondary)",strokeOpacity:"0.5",strokeWidth:"1"}),(0,t.jsx)("text",{x:D(M),y:14,textAnchor:"middle",fontSize:"12",fontWeight:"600",fill:"var(--af-text-secondary)",children:"now"})]}),(0,t.jsx)("path",{d:T,fill:"none",stroke:c,strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"}),b.map(([e,r],a)=>(0,t.jsx)("circle",{cx:D(e),cy:z(r),r:"3",fill:c},a)),N&&(0,t.jsx)("path",{d:N,fill:"none",stroke:"#ff7a00",strokeOpacity:"0.9",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:"5 4"}),y&&(0,t.jsxs)("g",{children:[(0,t.jsx)("line",{x1:y.x,y1:20,x2:y.x,y2:20+h,stroke:"var(--af-text-secondary)",strokeOpacity:"0.7",strokeWidth:"1",strokeDasharray:"2 2"}),(0,t.jsx)("circle",{cx:y.x,cy:z(y.actual),r:"5",fill:c,stroke:"var(--af-surface)",strokeWidth:"1.5"})]})]}),y&&(0,t.jsxs)("div",{style:{pointerEvents:"none",position:"absolute",left:`${y.x/1280*100}%`,top:4,transform:"translateX(-50%)",background:"var(--af-surface-elevated)",border:"1px solid var(--af-border-subtle)",borderRadius:8,padding:"8px 12px",fontSize:11,boxShadow:"0 6px 24px rgba(0, 0, 0, 0.24)",whiteSpace:"nowrap",color:"var(--af-text)"},children:[(0,t.jsx)("div",{style:{fontWeight:600},children:new Date(y.t).toLocaleString()}),(0,t.jsxs)("div",{style:{marginTop:4,display:"flex",gap:12},children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{style:{color:"var(--af-text-tertiary)"},children:"Actual"})," ",(0,t.jsxs)("span",{style:{fontWeight:600,fontVariantNumeric:"tabular-nums",color:c},children:[y.actual.toFixed(1),"%"]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{style:{color:"var(--af-text-tertiary)"},children:"Ideal"})," ",(0,t.jsxs)("span",{style:{fontWeight:600,fontVariantNumeric:"tabular-nums"},children:[y.ideal.toFixed(1),"%"]})]}),null!==y.predicted&&(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{style:{color:"var(--af-text-tertiary)"},children:"Estimated"})," ",(0,t.jsxs)("span",{style:{fontWeight:600,fontVariantNumeric:"tabular-nums",color:"#b58400"},children:[y.predicted.toFixed(1),"%"]})]})]}),(0,t.jsxs)("div",{style:{marginTop:2,color:"var(--af-text-tertiary)"},children:["Δ ",y.actual-y.ideal>=0?"+":"",(y.actual-y.ideal).toFixed(1),"%",null!==y.predicted&&(0,t.jsxs)("span",{style:{marginLeft:8},children:["· estimate ",y.predicted>=y.actual?"+":"",(y.predicted-y.actual).toFixed(1),"pp vs actual"]})]})]})]}),(0,t.jsxs)("div",{style:{marginTop:4,fontSize:9,color:"var(--af-text-tertiary)",fontFamily:"var(--font-mono)",textAlign:"right"},suppressHydrationWarning:!0,children:[b.length," snapshot",1===b.length?"":"s"," · last"," ",o(new Date($.capturedAt).toISOString()),j.length>0&&(0,t.jsxs)("span",{style:{marginLeft:8,color:"#ff7a00"},children:["· ",j.length," estimate",1===j.length?"":"s"," overlaid"]})]})]})}function l(e){return new Date(e).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function o(e){let t,r=Math.round((new Date(e).getTime()-Date.now())/1e3),a=Math.abs(r);if(a<60)t=`${a}s`;else if(a<3600)t=`${Math.floor(a/60)}m`;else if(a<86400){let e=Math.floor(a/3600),r=Math.floor(a%3600/60);t=r>0?`${e}h${r}m`:`${e}h`}else{let e=Math.floor(a/86400),r=Math.floor(a%86400/3600);t=r>0?`${e}d${r}h`:`${e}d`}return r<0?`${t} ago`:`in ${t}`}function d({snapshots:e,seriesKey:a,startMs:n,endMs:i,windowMs:s,colorVar:l,predictedSeries:o}){var u,p;let f,h,y,g,v=(0,r.useMemo)(()=>{let t=[];for(let r of e){let e=new Date(r.captured_at).getTime(),n=r[a];n&&null!==n.utilization&&t.push({t:e,u:n.utilization,resetsAt:n.resets_at})}if(0===t.length)return null;let r=new Map;for(let e of t){if(!e.resetsAt)continue;let t=new Date(e.resetsAt).getTime();if(Number.isNaN(t))continue;let a=36e5*Math.round(t/36e5),n=r.get(a);n||(n=[],r.set(a,n)),n.push(e)}let l=[];for(let[e,t]of r){let r=e-s;t.sort((e,t)=>e.t-t.t);let a=t.map(e=>({t:e.t,u:e.u,remaining:100-e.u})),n=0;for(let e=1;e<a.length;e++)a[e].u>a[n].u&&(n=e);l.push({resetsAtMs:e,startMs:r,points:a,peak:a[n].u,peakT:a[n].t})}let o=l.filter(e=>e.resetsAtMs>=n&&e.startMs<=i).sort((e,t)=>e.resetsAtMs-t.resetsAtMs);if(0===o.length)return null;let d=o.flatMap(e=>e.points),c=Math.max(...d.map(e=>e.u)),x=o.filter(e=>e.resetsAtMs<=i&&e.resetsAtMs<Date.now()).length,u=o.length>0?o.reduce((e,t)=>e+t.peak,0)/o.length:0;return{cycles:o,allPoints:d,peakOverall:c,avgPeak:u,completeCycles:x}},[e,a,n,i,s]),[m,b]=(0,r.useState)(null);if(!v)return(0,t.jsx)("div",{className:"af-card",style:{padding:"40px 32px",textAlign:"center",fontSize:12,color:"var(--af-text-tertiary)"},children:"No usage data in the selected range."});let{cycles:j,allPoints:k,peakOverall:w,avgPeak:M,completeCycles:S}=v,$=1188,D=252,z=e=>60+(e-n)/(i-n)*$,A=e=>24+D-e/100*D,W=e=>n+(e-60)/$*(i-n),F=e=>{let t=z(e);return t<60?60:t>1248?1248:t};return(0,t.jsxs)("div",{className:"af-card",style:{padding:"14px 18px",display:"flex",flexDirection:"column",gap:10},children:[(0,t.jsx)("div",{suppressHydrationWarning:!0,style:{fontSize:11,color:"var(--af-text-tertiary)",fontFamily:"var(--font-mono)"},children:(u=n,p=i,h=new Date(u).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}),y=new Date(p).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}),f=(g=p-u)<36e5?`${Math.round(g/6e4)}m`:g<864e5?`${(g/36e5).toFixed(1).replace(/\.0$/,"")}h`:`${(g/864e5).toFixed(1).replace(/\.0$/,"")}d`,`${h} → ${y} (${f})`)}),(0,t.jsxs)("div",{style:{display:"flex",gap:28,fontSize:11,color:"var(--af-text-tertiary)",flexWrap:"wrap"},children:[(0,t.jsx)(c,{label:"Peak utilization",value:`${w.toFixed(1)}%`,color:l}),(0,t.jsx)(c,{label:"Avg peak / cycle",value:j.length>0?`${M.toFixed(1)}%`:"—",color:l}),(0,t.jsx)(c,{label:"Complete cycles",value:String(S),color:"var(--af-text)"}),(0,t.jsx)(c,{label:"Data points",value:String(k.length),color:"var(--af-text)"})]}),(0,t.jsxs)("div",{style:{position:"relative"},children:[(0,t.jsxs)("svg",{viewBox:"0 0 1280 320",style:{width:"100%",aspectRatio:"1280 / 320",display:"block"},onMouseMove:e=>{let t=e.currentTarget.getBoundingClientRect(),r=(e.clientX-t.left)/t.width*1280;if(r<60||r>1248)return void b(null);let a=W(r),n=k[0],i=Math.abs(n.t-a);for(let e of k){let t=Math.abs(e.t-a);t<i&&(n=e,i=t)}b({x:z(n.t),t:n.t,u:n.u,remaining:n.remaining})},onMouseLeave:()=>b(null),children:[[0,25,50,75,100].map(e=>{let r=A(e);return(0,t.jsxs)("g",{children:[(0,t.jsx)("line",{x1:60,x2:1248,y1:r,y2:r,stroke:"var(--af-border-subtle)",strokeWidth:"1"}),(0,t.jsxs)("text",{x:50,y:r+4,textAnchor:"end",fontSize:"12",fill:"var(--af-text-tertiary)",children:[e,"%"]})]},e)}),(0,t.jsx)("text",{x:16,y:24+D/2,textAnchor:"middle",transform:`rotate(-90, 16, ${24+D/2})`,fontSize:"12",fill:"var(--af-text-tertiary)",children:"Remaining budget (%)"}),(0,t.jsx)("rect",{x:60,y:A(10),width:$,height:A(0)-A(10),fill:"var(--af-danger)",fillOpacity:"0.07"}),(0,t.jsx)("rect",{x:60,y:A(30),width:$,height:A(10)-A(30),fill:"var(--af-warning)",fillOpacity:"0.05"}),j.map((e,r)=>{let a=F(e.startMs),o=F(e.resetsAtMs),d=A(100-100*(W(a)-e.startMs)/s),c=A(100-100*(W(o)-e.startMs)/s),x=e.points.filter(e=>e.t>=n&&e.t<=i),u=function(e,t,r){if(0===e.length)return"";let a=[],n=!1;for(let i=0;i<e.length;i++){let s=e[i],l=i>0?e[i-1]:null,o=!!l&&s.t-l.t>9e5,d=!n||o?"M":"L";a.push(`${d} ${t(s.t).toFixed(1)} ${r(s.remaining).toFixed(1)}`),n=!0}return a.join(" ")}(x,z,A),p=e.resetsAtMs>=n&&e.resetsAtMs<=i&&e.resetsAtMs<=Date.now();return(0,t.jsxs)("g",{children:[(0,t.jsx)("line",{x1:a,y1:d,x2:o,y2:c,stroke:"var(--af-text-tertiary)",strokeOpacity:"0.35",strokeWidth:"1",strokeDasharray:"3 3"}),u&&(0,t.jsx)("path",{d:u,fill:"none",stroke:l,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),x.map((e,a)=>(0,t.jsx)("circle",{cx:z(e.t),cy:A(e.remaining),r:"1.8",fill:l,fillOpacity:"0.9"},`${r}-${a}`)),e.peakT>=n&&e.peakT<=i&&(0,t.jsx)("circle",{cx:z(e.peakT),cy:A(100-e.peak),r:"3",fill:l,stroke:"var(--background)",strokeWidth:"1.5"}),p&&(0,t.jsx)("line",{x1:z(e.resetsAtMs),y1:24,x2:z(e.resetsAtMs),y2:24+D,stroke:"var(--af-text-tertiary)",strokeOpacity:"0.25",strokeWidth:"1",strokeDasharray:"1 3"})]},`cycle-${r}`)}),(()=>{let e=(o??[]).filter(e=>e.capturedAt>=n&&e.capturedAt<=i).sort((e,t)=>e.capturedAt-t.capturedAt);if(e.length<2)return null;let r=[],a=!1,s=e[0].util;for(let t=0;t<e.length;t++){let n=e[t],i=Math.max(0,Math.min(100,n.util)),l=100-i,o=s-i,d=t>0&&o>=50,c=t>0&&n.capturedAt-e[t-1].capturedAt>36e5,x=!a||d||c?"M":"L";r.push(`${x} ${z(n.capturedAt).toFixed(1)} ${A(l).toFixed(1)}`),a=!0,s=i}return(0,t.jsx)("path",{d:r.join(" "),fill:"none",stroke:"#ff7a00",strokeOpacity:"0.85",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:"5 4"})})(),Date.now()>=n&&Date.now()<=i&&(0,t.jsx)("line",{x1:z(Date.now()),y1:24,x2:z(Date.now()),y2:24+D,stroke:"var(--af-text-secondary)",strokeOpacity:"0.5",strokeWidth:"1"}),m&&(0,t.jsxs)("g",{children:[(0,t.jsx)("line",{x1:m.x,y1:24,x2:m.x,y2:24+D,stroke:"var(--af-text-secondary)",strokeOpacity:"0.6",strokeWidth:"1",strokeDasharray:"2 2"}),(0,t.jsx)("circle",{cx:m.x,cy:A(m.remaining),r:"5",fill:l,stroke:"var(--background)",strokeWidth:"2"})]}),(0,t.jsx)("text",{x:60,y:300,textAnchor:"start",fontSize:"11",fill:"var(--af-text-tertiary)",suppressHydrationWarning:!0,children:x(n,i-n)}),(0,t.jsx)("text",{x:1248,y:300,textAnchor:"end",fontSize:"11",fill:"var(--af-text-tertiary)",suppressHydrationWarning:!0,children:x(i,i-n)}),(0,t.jsxs)("text",{x:60+$/2,y:314,textAnchor:"middle",fontSize:"11",fill:"var(--af-text-tertiary)",children:["Time · ",j.length," cycle",1===j.length?"":"s"," in view"]})]}),m&&(0,t.jsxs)("div",{suppressHydrationWarning:!0,style:{pointerEvents:"none",position:"absolute",left:`${m.x/1280*100}%`,top:6,transform:"translateX(-50%)",background:"var(--af-surface-elevated)",border:"1px solid var(--af-border-subtle)",borderRadius:8,padding:"8px 12px",fontSize:11,boxShadow:"0 6px 24px rgba(0, 0, 0, 0.24)",whiteSpace:"nowrap",color:"var(--af-text)"},children:[(0,t.jsx)("div",{style:{fontWeight:600},children:new Date(m.t).toLocaleString()}),(0,t.jsxs)("div",{style:{marginTop:2,display:"flex",gap:10},children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{style:{color:"var(--af-text-tertiary)"},children:"Remaining"})," ",(0,t.jsxs)("span",{style:{fontWeight:600,fontVariantNumeric:"tabular-nums",color:l},children:[m.remaining.toFixed(1),"%"]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{style:{color:"var(--af-text-tertiary)"},children:"Used"})," ",(0,t.jsxs)("span",{style:{fontWeight:600,fontVariantNumeric:"tabular-nums"},children:[m.u.toFixed(1),"%"]})]})]})]})]})]})}function c({label:e,value:r,color:a}){return(0,t.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:2},children:[(0,t.jsx)("span",{style:{fontSize:9,textTransform:"uppercase",letterSpacing:"0.06em",color:"var(--af-text-tertiary)",fontWeight:600},children:e}),(0,t.jsx)("span",{style:{fontSize:18,fontWeight:700,letterSpacing:"-0.01em",color:a,fontVariantNumeric:"tabular-nums"},children:r})]})}function x(e,t){let r=new Date(e);return t<=12096e5?r.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):r.toLocaleDateString(void 0,{month:"short",day:"numeric"})}var u=e.i(64659),p=e.i(63059),f=e.i(86619);function h({storageKey:e,label:r,children:a}){let[n,i,s]=(0,f.usePersistentBoolean)(e,!1);return(0,t.jsxs)("div",{children:[(0,t.jsxs)("button",{type:"button",onClick:()=>i(!n),style:{display:"inline-flex",alignItems:"center",gap:6,padding:"6px 10px",marginBottom:12*!!n,background:"transparent",border:"1px solid var(--af-border-subtle)",borderRadius:6,fontSize:11,fontWeight:600,color:"var(--af-text-secondary)",textTransform:"uppercase",letterSpacing:"0.04em",cursor:"pointer",transition:"background 0.12s, border-color 0.12s"},children:[n?(0,t.jsx)(u.ChevronDown,{size:12}):(0,t.jsx)(p.ChevronRight,{size:12}),n?`Hide ${r}`:`Show ${r}`]}),s&&n&&a]})}let y=[{key:"current",label:"Current cycle"},{key:"24h",label:"24H"},{key:"7d",label:"7D"},{key:"30d",label:"30D"},{key:"90d",label:"90D"},{key:"custom",label:"Custom"}];function g({value:e,onChange:a,windowType:n="short"}){let i="long"===n?y.filter(e=>"24h"!==e.key):y,[s,l]=(0,r.useState)(()=>m(e.startMs??Date.now()-6048e5)),[o,d]=(0,r.useState)(()=>m(e.endMs??Date.now()));return(0,r.useEffect)(()=>{if("custom"!==e.preset)return;let t=b(s),r=b(o);Number.isNaN(t)||Number.isNaN(r)||t>=r||(t!==e.startMs||r!==e.endMs)&&a({preset:"custom",startMs:t,endMs:r})},[s,o,e.preset]),(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap"},children:[(0,t.jsx)("div",{style:{display:"inline-flex",borderRadius:6,border:"1px solid var(--af-border-subtle)",overflow:"hidden"},children:i.map((r,n)=>(0,t.jsx)("button",{type:"button",onClick:()=>{var e;"custom"===(e=r.key)?a({preset:e,startMs:b(s),endMs:b(o)}):a({preset:e})},style:{padding:"6px 12px",fontSize:11,fontWeight:500,background:e.preset===r.key?"var(--af-accent-subtle)":"transparent",color:e.preset===r.key?"var(--af-accent)":"var(--af-text-secondary)",border:"none",borderRight:n<i.length-1?"1px solid var(--af-border-subtle)":"none",cursor:"pointer",letterSpacing:"0.02em"},children:r.label},r.key))}),"custom"===e.preset&&(0,t.jsxs)("div",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[(0,t.jsx)("input",{type:"datetime-local",value:s,onChange:e=>l(e.target.value),style:v}),(0,t.jsx)("span",{style:{fontSize:11,color:"var(--af-text-tertiary)"},children:"→"}),(0,t.jsx)("input",{type:"datetime-local",value:o,onChange:e=>d(e.target.value),style:v})]})]})}let v={padding:"5px 8px",fontSize:11,background:"var(--background)",color:"var(--af-text)",border:"1px solid var(--af-border-subtle)",borderRadius:5,fontFamily:"var(--font-mono)"};function m(e){let t=new Date(e),r=t.getFullYear(),a=String(t.getMonth()+1).padStart(2,"0"),n=String(t.getDate()).padStart(2,"0"),i=String(t.getHours()).padStart(2,"0"),s=String(t.getMinutes()).padStart(2,"0");return`${r}-${a}-${n}T${i}:${s}`}function b(e){return new Date(e).getTime()}let j=[{key:"seven_day",label:"7d utilization",windowMs:6048e5,colorVar:"var(--af-accent)"},{key:"five_hour",label:"5h utilization",windowMs:18e6,colorVar:"var(--af-success)"}],k={key:"seven_day_sonnet",label:"7d utilization (Sonnet)",windowMs:6048e5,colorVar:"var(--af-warning)"};function w({config:e,snapshots:n,predictedSeries:i,onClose:s}){let[l,o]=(0,r.useState)({preset:"current"}),c=(0,r.useMemo)(()=>{for(let t=n.length-1;t>=0;t--){let r=n[t][e.key];if(r&&r.resets_at){let t=new Date(r.resets_at).getTime();return{startMs:t-e.windowMs,endMs:t}}}return null},[n,e.key,e.windowMs]),x=function(e){let t=Date.now();switch(e.preset){case"current":return{};case"24h":return{startMs:t-864e5,endMs:t};case"7d":return{startMs:t-6048e5,endMs:t};case"30d":return{startMs:t-2592e6,endMs:t};case"90d":return{startMs:t-7776e6,endMs:t};case"custom":return{startMs:e.startMs,endMs:e.endMs}}}(l),u="current"===l.preset&&c?c:x;return(0,t.jsx)("div",{onClick:s,style:{position:"fixed",inset:0,background:"rgba(0, 0, 0, 0.55)",backdropFilter:"blur(4px)",zIndex:100,display:"flex",alignItems:"center",justifyContent:"center",padding:32},children:(0,t.jsxs)("div",{onClick:e=>e.stopPropagation(),style:{width:"100%",maxWidth:1600,maxHeight:"calc(100vh - 64px)",background:"var(--background)",border:"1px solid var(--af-border-subtle)",borderRadius:12,boxShadow:"0 24px 64px rgba(0, 0, 0, 0.4)",display:"flex",flexDirection:"column",overflow:"hidden"},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:16,padding:"14px 20px",borderBottom:"1px solid var(--af-border-subtle)",flexWrap:"wrap"},children:[(0,t.jsx)("div",{style:{fontSize:14,fontWeight:600,textTransform:"uppercase",letterSpacing:"0.04em",color:"var(--af-text)"},children:e.label}),(0,t.jsx)(g,{value:l,onChange:o,windowType:e.windowMs>=864e5?"long":"short"}),(0,t.jsx)("button",{type:"button",onClick:s,"aria-label":"Close",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:28,height:28,borderRadius:6,background:"transparent",border:"1px solid var(--af-border-subtle)",color:"var(--af-text-secondary)",cursor:"pointer"},children:(0,t.jsx)(a.X,{size:14})})]}),(0,t.jsx)("div",{style:{padding:20,overflow:"auto",flex:1},children:u.startMs&&u.endMs?(0,t.jsx)(d,{snapshots:n,seriesKey:e.key,startMs:u.startMs,endMs:u.endMs,windowMs:e.windowMs,colorVar:e.colorVar,predictedSeries:i}):(0,t.jsx)("div",{className:"af-card",style:{padding:"40px 32px",textAlign:"center",fontSize:12,color:"var(--af-text-tertiary)"},children:"No data available for this window."})})]})})}function M({children:e}){return(0,t.jsx)("div",{style:{fontSize:11,fontWeight:600,color:"var(--af-text)",textTransform:"uppercase",letterSpacing:"0.04em"},children:e})}e.s(["UsageChartsDashboard",0,function({snapshots:e,predicted:a}){let[n,i]=(0,r.useState)(null),l=a??{five_hour:[],seven_day:[],seven_day_sonnet:[]};return(0,r.useEffect)(()=>{if(!n)return;let e=e=>{"Escape"===e.key&&i(null)};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[n]),(0,r.useEffect)(()=>{if(!n)return;let e=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=e}},[n]),(0,t.jsxs)(t.Fragment,{children:[j.map(r=>(0,t.jsxs)("section",{style:{display:"flex",flexDirection:"column",gap:6},children:[(0,t.jsx)(M,{children:r.label}),(0,t.jsx)(s,{snapshots:e,seriesKey:r.key,windowMs:r.windowMs,colorVar:r.colorVar,predictedSeries:l[r.key],onExpand:()=>i(r)})]},r.key)),(0,t.jsx)(h,{storageKey:"cclens:usage:show-sonnet",label:"Sonnet 7d utilization",children:(0,t.jsxs)("section",{style:{display:"flex",flexDirection:"column",gap:6},children:[(0,t.jsx)(M,{children:k.label}),(0,t.jsx)(s,{snapshots:e,seriesKey:k.key,windowMs:k.windowMs,colorVar:k.colorVar,predictedSeries:l[k.key],onExpand:()=>i(k)})]})}),n&&(0,t.jsx)(w,{config:n,snapshots:e,predictedSeries:l[n.key],onClose:()=>i(null)})]})}],36373)}]);
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,64659,e=>{"use strict";let t=(0,e.i(75254).default)("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);e.s(["ChevronDown",0,t],64659)},63059,e=>{"use strict";let t=(0,e.i(75254).default)("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);e.s(["ChevronRight",0,t],63059)},37727,e=>{"use strict";let t=(0,e.i(75254).default)("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);e.s(["X",0,t],37727)},36373,e=>{"use strict";var t=e.i(18050),r=e.i(71645),a=e.i(37727);let n=(0,e.i(75254).default)("Maximize2",[["polyline",{points:"15 3 21 3 21 9",key:"mznyad"}],["polyline",{points:"9 21 3 21 3 15",key:"1avn1i"}],["line",{x1:"21",x2:"14",y1:"3",y2:"10",key:"ota7mn"}],["line",{x1:"3",x2:"10",y1:"21",y2:"14",key:"1atl0r"}]]);var i=e.i(88137);function s({snapshots:e,seriesKey:a,windowMs:d,colorVar:c,predictedSeries:x,onExpand:u}){let p=(0,r.useMemo)(()=>{let t=e.map(e=>({capturedAt:new Date(e.captured_at).getTime(),window:e[a]})).filter(e=>null!==e.window&&null!==e.window.utilization);if(0===t.length)return null;let r=t[t.length-1],n=r.window.resets_at?new Date(r.window.resets_at).getTime():null;if(!n)return null;let i=n-d,s=Date.now(),l=100-(r.window.utilization??0);return{points:t.filter(e=>e.capturedAt>=i&&e.capturedAt<=n).map(e=>[e.capturedAt,100-(e.window.utilization??0)]),predicted:(x??[]).filter(e=>e.capturedAt>=i&&e.capturedAt<=n).map(e=>[e.capturedAt,100-Math.max(0,Math.min(100,e.util))]).sort((e,t)=>e[0]-t[0]),windowStart:i,windowEnd:n,now:s,currentRemaining:l,latest:r}},[e,a,d,x]),f=1190,h=148,[y,g]=(0,r.useState)(null),[v,m]=(0,r.useState)(!1);if((0,r.useEffect)(()=>m(!0),[]),!p)return(0,t.jsx)("div",{className:"af-card",style:{padding:"14px 18px",textAlign:"center",fontSize:12,color:"var(--af-text-tertiary)"},children:"No data for this window yet."});let{points:b,predicted:j,windowStart:k,windowEnd:w,now:M,currentRemaining:S,latest:$}=p,D=e=>64+(e-k)/(w-k)*f,z=e=>20+h-e/100*h,A=e=>Math.max(0,Math.min(100,100-(e-k)/(w-k)*100)),W=S-A(M),F=(0,i.paceLabel)(W),L=(0,i.toneVar)(F.tone),C=F.label,T=b.length>0?b.map(([e,t],r)=>`${0===r?"M":"L"} ${D(e).toFixed(1)} ${z(t).toFixed(1)}`).join(" "):"",N=j.length>1?j.map(([e,t],r)=>`${0===r?"M":"L"} ${D(e).toFixed(1)} ${z(t).toFixed(1)}`).join(" "):"",R=b.length>0?`${T} L ${D(b[b.length-1][0]).toFixed(1)} ${z(0).toFixed(1)} L ${D(b[0][0]).toFixed(1)} ${z(0).toFixed(1)} Z`:"";return(0,t.jsxs)("div",{className:"af-card",style:{padding:"14px 18px"},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"baseline",gap:14,flexWrap:"wrap",marginBottom:8},children:[(0,t.jsxs)("div",{style:{fontSize:18,fontWeight:700,letterSpacing:"-0.01em",color:c,fontVariantNumeric:"tabular-nums"},children:[S.toFixed(1),"%",(0,t.jsx)("span",{style:{fontSize:11,fontWeight:500,color:"var(--af-text-tertiary)",marginLeft:4,letterSpacing:0},children:"remaining"})]}),(0,t.jsx)("div",{suppressHydrationWarning:!0,style:{fontSize:11,color:L,fontWeight:500},children:v&&(0,t.jsxs)(t.Fragment,{children:[C," (",W>=0?"+":"",W.toFixed(1),"pp)"]})}),(0,t.jsxs)("div",{suppressHydrationWarning:!0,style:{fontSize:11,color:"var(--af-text-tertiary)",marginLeft:"auto"},children:[function(e){let t=e/36e5;if(t<24)return`${t} hour${1===t?"":"s"}`;let r=t/24;return`${r} day${1===r?"":"s"}`}(d)," · resets"," ",o(new Date(w).toISOString())]}),u&&(0,t.jsx)("button",{type:"button",onClick:u,"aria-label":"Expand chart",title:"Expand",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:24,height:24,borderRadius:5,background:"transparent",border:"1px solid var(--af-border-subtle)",color:"var(--af-text-tertiary)",cursor:"pointer",marginLeft:4},children:(0,t.jsx)(n,{size:12})})]}),(0,t.jsxs)("div",{style:{position:"relative"},children:[(0,t.jsxs)("svg",{viewBox:"0 0 1280 200",style:{width:"100%",aspectRatio:"1280 / 200",display:"block"},onMouseMove:e=>{let t=e.currentTarget.getBoundingClientRect(),r=(e.clientX-t.left)/t.width*1280;if(r<64||r>1254)return void g(null);let a=k+(r-64)/f*(w-k),n=b[0],i=Math.abs(n[0]-a);for(let e of b){let t=Math.abs(e[0]-a);t<i&&(n=e,i=t)}let s=null;if(j.length>0){let e=j[0],t=Math.abs(e[0]-n[0]);for(let r of j){let a=Math.abs(r[0]-n[0]);a<t&&(e=r,t=a)}s=e[1]}g({x:D(n[0]),t:n[0],actual:n[1],ideal:A(n[0]),predicted:s})},onMouseLeave:()=>g(null),children:[[0,25,50,75,100].map(e=>{let r=z(e);return(0,t.jsxs)("g",{children:[(0,t.jsx)("line",{x1:64,x2:1254,y1:r,y2:r,stroke:"var(--af-border-subtle)",strokeWidth:"1"}),(0,t.jsxs)("text",{x:56,y:r+4,textAnchor:"end",fontSize:"13",fill:"var(--af-text-tertiary)",children:[e,"%"]})]},e)}),(0,t.jsx)("text",{x:14,y:20+h/2,textAnchor:"middle",transform:`rotate(-90, 14, ${20+h/2})`,fontSize:"12",fill:"var(--af-text-tertiary)",children:"Remaining budget (%)"}),(0,t.jsx)("text",{x:64,y:180,textAnchor:"start",fontSize:"12",fill:"var(--af-text-tertiary)",suppressHydrationWarning:!0,children:l(k)}),(0,t.jsx)("text",{x:1254,y:180,textAnchor:"end",fontSize:"12",fill:"var(--af-text-tertiary)",suppressHydrationWarning:!0,children:l(w)}),(0,t.jsx)("path",{d:R,fill:c,fillOpacity:"0.1"}),(0,t.jsx)("line",{x1:D(k),y1:z(100),x2:D(w),y2:z(0),stroke:"var(--af-text-tertiary)",strokeOpacity:"0.5",strokeWidth:"1.5",strokeDasharray:"4 3"}),v&&M>=k&&M<=w&&(0,t.jsxs)("g",{children:[(0,t.jsx)("line",{x1:D(M),y1:20,x2:D(M),y2:20+h,stroke:"var(--af-text-secondary)",strokeOpacity:"0.5",strokeWidth:"1"}),(0,t.jsx)("text",{x:D(M),y:14,textAnchor:"middle",fontSize:"12",fontWeight:"600",fill:"var(--af-text-secondary)",children:"now"})]}),(0,t.jsx)("path",{d:T,fill:"none",stroke:c,strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"}),b.map(([e,r],a)=>(0,t.jsx)("circle",{cx:D(e),cy:z(r),r:"3",fill:c},a)),N&&(0,t.jsx)("path",{d:N,fill:"none",stroke:"#ff7a00",strokeOpacity:"0.9",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:"5 4"}),y&&(0,t.jsxs)("g",{children:[(0,t.jsx)("line",{x1:y.x,y1:20,x2:y.x,y2:20+h,stroke:"var(--af-text-secondary)",strokeOpacity:"0.7",strokeWidth:"1",strokeDasharray:"2 2"}),(0,t.jsx)("circle",{cx:y.x,cy:z(y.actual),r:"5",fill:c,stroke:"var(--af-surface)",strokeWidth:"1.5"})]})]}),y&&(0,t.jsxs)("div",{style:{pointerEvents:"none",position:"absolute",left:`${y.x/1280*100}%`,top:4,transform:"translateX(-50%)",background:"var(--af-surface-elevated)",border:"1px solid var(--af-border-subtle)",borderRadius:8,padding:"8px 12px",fontSize:11,boxShadow:"0 6px 24px rgba(0, 0, 0, 0.24)",whiteSpace:"nowrap",color:"var(--af-text)"},children:[(0,t.jsx)("div",{style:{fontWeight:600},children:new Date(y.t).toLocaleString()}),(0,t.jsxs)("div",{style:{marginTop:4,display:"flex",gap:12},children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{style:{color:"var(--af-text-tertiary)"},children:"Actual"})," ",(0,t.jsxs)("span",{style:{fontWeight:600,fontVariantNumeric:"tabular-nums",color:c},children:[y.actual.toFixed(1),"%"]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{style:{color:"var(--af-text-tertiary)"},children:"Ideal"})," ",(0,t.jsxs)("span",{style:{fontWeight:600,fontVariantNumeric:"tabular-nums"},children:[y.ideal.toFixed(1),"%"]})]}),null!==y.predicted&&(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{style:{color:"var(--af-text-tertiary)"},children:"Estimated"})," ",(0,t.jsxs)("span",{style:{fontWeight:600,fontVariantNumeric:"tabular-nums",color:"#b58400"},children:[y.predicted.toFixed(1),"%"]})]})]}),(0,t.jsxs)("div",{style:{marginTop:2,color:"var(--af-text-tertiary)"},children:["Δ ",y.actual-y.ideal>=0?"+":"",(y.actual-y.ideal).toFixed(1),"%",null!==y.predicted&&(0,t.jsxs)("span",{style:{marginLeft:8},children:["· estimate ",y.predicted>=y.actual?"+":"",(y.predicted-y.actual).toFixed(1),"pp vs actual"]})]})]})]}),(0,t.jsxs)("div",{style:{marginTop:4,fontSize:9,color:"var(--af-text-tertiary)",fontFamily:"var(--font-mono)",textAlign:"right"},suppressHydrationWarning:!0,children:[b.length," snapshot",1===b.length?"":"s"," · last"," ",o(new Date($.capturedAt).toISOString()),j.length>0&&(0,t.jsxs)("span",{style:{marginLeft:8,color:"#ff7a00"},children:["· ",j.length," estimate",1===j.length?"":"s"," overlaid"]})]})]})}function l(e){return new Date(e).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function o(e){let t,r=Math.round((new Date(e).getTime()-Date.now())/1e3),a=Math.abs(r);if(a<60)t=`${a}s`;else if(a<3600)t=`${Math.floor(a/60)}m`;else if(a<86400){let e=Math.floor(a/3600),r=Math.floor(a%3600/60);t=r>0?`${e}h${r}m`:`${e}h`}else{let e=Math.floor(a/86400),r=Math.floor(a%86400/3600);t=r>0?`${e}d${r}h`:`${e}d`}return r<0?`${t} ago`:`in ${t}`}function d({snapshots:e,seriesKey:a,startMs:n,endMs:i,windowMs:s,colorVar:l,predictedSeries:o}){var u,p;let f,h,y,g,v=(0,r.useMemo)(()=>{let t=[];for(let r of e){let e=new Date(r.captured_at).getTime(),n=r[a];n&&null!==n.utilization&&t.push({t:e,u:n.utilization,resetsAt:n.resets_at})}if(0===t.length)return null;let r=new Map;for(let e of t){if(!e.resetsAt)continue;let t=new Date(e.resetsAt).getTime();if(Number.isNaN(t))continue;let a=36e5*Math.round(t/36e5),n=r.get(a);n||(n=[],r.set(a,n)),n.push(e)}let l=[];for(let[e,t]of r){let r=e-s;t.sort((e,t)=>e.t-t.t);let a=t.map(e=>({t:e.t,u:e.u,remaining:100-e.u})),n=0;for(let e=1;e<a.length;e++)a[e].u>a[n].u&&(n=e);l.push({resetsAtMs:e,startMs:r,points:a,peak:a[n].u,peakT:a[n].t})}let o=l.filter(e=>e.resetsAtMs>=n&&e.startMs<=i).sort((e,t)=>e.resetsAtMs-t.resetsAtMs);if(0===o.length)return null;let d=o.flatMap(e=>e.points),c=Math.max(...d.map(e=>e.u)),x=o.filter(e=>e.resetsAtMs<=i&&e.resetsAtMs<Date.now()).length,u=o.length>0?o.reduce((e,t)=>e+t.peak,0)/o.length:0;return{cycles:o,allPoints:d,peakOverall:c,avgPeak:u,completeCycles:x}},[e,a,n,i,s]),[m,b]=(0,r.useState)(null);if(!v)return(0,t.jsx)("div",{className:"af-card",style:{padding:"40px 32px",textAlign:"center",fontSize:12,color:"var(--af-text-tertiary)"},children:"No usage data in the selected range."});let{cycles:j,allPoints:k,peakOverall:w,avgPeak:M,completeCycles:S}=v,$=1188,D=252,z=e=>60+(e-n)/(i-n)*$,A=e=>24+D-e/100*D,W=e=>n+(e-60)/$*(i-n),F=e=>{let t=z(e);return t<60?60:t>1248?1248:t};return(0,t.jsxs)("div",{className:"af-card",style:{padding:"14px 18px",display:"flex",flexDirection:"column",gap:10},children:[(0,t.jsx)("div",{suppressHydrationWarning:!0,style:{fontSize:11,color:"var(--af-text-tertiary)",fontFamily:"var(--font-mono)"},children:(u=n,p=i,h=new Date(u).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}),y=new Date(p).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}),f=(g=p-u)<36e5?`${Math.round(g/6e4)}m`:g<864e5?`${(g/36e5).toFixed(1).replace(/\.0$/,"")}h`:`${(g/864e5).toFixed(1).replace(/\.0$/,"")}d`,`${h} → ${y} (${f})`)}),(0,t.jsxs)("div",{style:{display:"flex",gap:28,fontSize:11,color:"var(--af-text-tertiary)",flexWrap:"wrap"},children:[(0,t.jsx)(c,{label:"Peak utilization",value:`${w.toFixed(1)}%`,color:l}),(0,t.jsx)(c,{label:"Avg peak / cycle",value:j.length>0?`${M.toFixed(1)}%`:"—",color:l}),(0,t.jsx)(c,{label:"Complete cycles",value:String(S),color:"var(--af-text)"}),(0,t.jsx)(c,{label:"Data points",value:String(k.length),color:"var(--af-text)"})]}),(0,t.jsxs)("div",{style:{position:"relative"},children:[(0,t.jsxs)("svg",{viewBox:"0 0 1280 320",style:{width:"100%",aspectRatio:"1280 / 320",display:"block"},onMouseMove:e=>{let t=e.currentTarget.getBoundingClientRect(),r=(e.clientX-t.left)/t.width*1280;if(r<60||r>1248)return void b(null);let a=W(r),n=k[0],i=Math.abs(n.t-a);for(let e of k){let t=Math.abs(e.t-a);t<i&&(n=e,i=t)}b({x:z(n.t),t:n.t,u:n.u,remaining:n.remaining})},onMouseLeave:()=>b(null),children:[[0,25,50,75,100].map(e=>{let r=A(e);return(0,t.jsxs)("g",{children:[(0,t.jsx)("line",{x1:60,x2:1248,y1:r,y2:r,stroke:"var(--af-border-subtle)",strokeWidth:"1"}),(0,t.jsxs)("text",{x:50,y:r+4,textAnchor:"end",fontSize:"12",fill:"var(--af-text-tertiary)",children:[e,"%"]})]},e)}),(0,t.jsx)("text",{x:16,y:24+D/2,textAnchor:"middle",transform:`rotate(-90, 16, ${24+D/2})`,fontSize:"12",fill:"var(--af-text-tertiary)",children:"Remaining budget (%)"}),(0,t.jsx)("rect",{x:60,y:A(10),width:$,height:A(0)-A(10),fill:"var(--af-danger)",fillOpacity:"0.07"}),(0,t.jsx)("rect",{x:60,y:A(30),width:$,height:A(10)-A(30),fill:"var(--af-warning)",fillOpacity:"0.05"}),j.map((e,r)=>{let a=F(e.startMs),o=F(e.resetsAtMs),d=A(100-100*(W(a)-e.startMs)/s),c=A(100-100*(W(o)-e.startMs)/s),x=e.points.filter(e=>e.t>=n&&e.t<=i),u=function(e,t,r){if(0===e.length)return"";let a=[],n=!1;for(let i=0;i<e.length;i++){let s=e[i],l=i>0?e[i-1]:null,o=!!l&&s.t-l.t>9e5,d=!n||o?"M":"L";a.push(`${d} ${t(s.t).toFixed(1)} ${r(s.remaining).toFixed(1)}`),n=!0}return a.join(" ")}(x,z,A),p=e.resetsAtMs>=n&&e.resetsAtMs<=i&&e.resetsAtMs<=Date.now();return(0,t.jsxs)("g",{children:[(0,t.jsx)("line",{x1:a,y1:d,x2:o,y2:c,stroke:"var(--af-text-tertiary)",strokeOpacity:"0.35",strokeWidth:"1",strokeDasharray:"3 3"}),u&&(0,t.jsx)("path",{d:u,fill:"none",stroke:l,strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),x.map((e,a)=>(0,t.jsx)("circle",{cx:z(e.t),cy:A(e.remaining),r:"1.8",fill:l,fillOpacity:"0.9"},`${r}-${a}`)),e.peakT>=n&&e.peakT<=i&&(0,t.jsx)("circle",{cx:z(e.peakT),cy:A(100-e.peak),r:"3",fill:l,stroke:"var(--background)",strokeWidth:"1.5"}),p&&(0,t.jsx)("line",{x1:z(e.resetsAtMs),y1:24,x2:z(e.resetsAtMs),y2:24+D,stroke:"var(--af-text-tertiary)",strokeOpacity:"0.25",strokeWidth:"1",strokeDasharray:"1 3"})]},`cycle-${r}`)}),(()=>{let e=(o??[]).filter(e=>e.capturedAt>=n&&e.capturedAt<=i).sort((e,t)=>e.capturedAt-t.capturedAt);if(e.length<2)return null;let r=[],a=!1,s=e[0].util;for(let t=0;t<e.length;t++){let n=e[t],i=Math.max(0,Math.min(100,n.util)),l=100-i,o=s-i,d=t>0&&o>=50,c=t>0&&n.capturedAt-e[t-1].capturedAt>36e5,x=!a||d||c?"M":"L";r.push(`${x} ${z(n.capturedAt).toFixed(1)} ${A(l).toFixed(1)}`),a=!0,s=i}return(0,t.jsx)("path",{d:r.join(" "),fill:"none",stroke:"#ff7a00",strokeOpacity:"0.85",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:"5 4"})})(),Date.now()>=n&&Date.now()<=i&&(0,t.jsx)("line",{x1:z(Date.now()),y1:24,x2:z(Date.now()),y2:24+D,stroke:"var(--af-text-secondary)",strokeOpacity:"0.5",strokeWidth:"1"}),m&&(0,t.jsxs)("g",{children:[(0,t.jsx)("line",{x1:m.x,y1:24,x2:m.x,y2:24+D,stroke:"var(--af-text-secondary)",strokeOpacity:"0.6",strokeWidth:"1",strokeDasharray:"2 2"}),(0,t.jsx)("circle",{cx:m.x,cy:A(m.remaining),r:"5",fill:l,stroke:"var(--background)",strokeWidth:"2"})]}),(0,t.jsx)("text",{x:60,y:300,textAnchor:"start",fontSize:"11",fill:"var(--af-text-tertiary)",suppressHydrationWarning:!0,children:x(n,i-n)}),(0,t.jsx)("text",{x:1248,y:300,textAnchor:"end",fontSize:"11",fill:"var(--af-text-tertiary)",suppressHydrationWarning:!0,children:x(i,i-n)}),(0,t.jsxs)("text",{x:60+$/2,y:314,textAnchor:"middle",fontSize:"11",fill:"var(--af-text-tertiary)",children:["Time · ",j.length," cycle",1===j.length?"":"s"," in view"]})]}),m&&(0,t.jsxs)("div",{suppressHydrationWarning:!0,style:{pointerEvents:"none",position:"absolute",left:`${m.x/1280*100}%`,top:6,transform:"translateX(-50%)",background:"var(--af-surface-elevated)",border:"1px solid var(--af-border-subtle)",borderRadius:8,padding:"8px 12px",fontSize:11,boxShadow:"0 6px 24px rgba(0, 0, 0, 0.24)",whiteSpace:"nowrap",color:"var(--af-text)"},children:[(0,t.jsx)("div",{style:{fontWeight:600},children:new Date(m.t).toLocaleString()}),(0,t.jsxs)("div",{style:{marginTop:2,display:"flex",gap:10},children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{style:{color:"var(--af-text-tertiary)"},children:"Remaining"})," ",(0,t.jsxs)("span",{style:{fontWeight:600,fontVariantNumeric:"tabular-nums",color:l},children:[m.remaining.toFixed(1),"%"]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{style:{color:"var(--af-text-tertiary)"},children:"Used"})," ",(0,t.jsxs)("span",{style:{fontWeight:600,fontVariantNumeric:"tabular-nums"},children:[m.u.toFixed(1),"%"]})]})]})]})]})]})}function c({label:e,value:r,color:a}){return(0,t.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:2},children:[(0,t.jsx)("span",{style:{fontSize:9,textTransform:"uppercase",letterSpacing:"0.06em",color:"var(--af-text-tertiary)",fontWeight:600},children:e}),(0,t.jsx)("span",{style:{fontSize:18,fontWeight:700,letterSpacing:"-0.01em",color:a,fontVariantNumeric:"tabular-nums"},children:r})]})}function x(e,t){let r=new Date(e);return t<=12096e5?r.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):r.toLocaleDateString(void 0,{month:"short",day:"numeric"})}var u=e.i(64659),p=e.i(63059),f=e.i(86619);function h({storageKey:e,label:r,children:a}){let[n,i,s]=(0,f.usePersistentBoolean)(e,!1);return(0,t.jsxs)("div",{children:[(0,t.jsxs)("button",{type:"button",onClick:()=>i(!n),style:{display:"inline-flex",alignItems:"center",gap:6,padding:"6px 10px",marginBottom:12*!!n,background:"transparent",border:"1px solid var(--af-border-subtle)",borderRadius:6,fontSize:11,fontWeight:600,color:"var(--af-text-secondary)",textTransform:"uppercase",letterSpacing:"0.04em",cursor:"pointer",transition:"background 0.12s, border-color 0.12s"},children:[n?(0,t.jsx)(u.ChevronDown,{size:12}):(0,t.jsx)(p.ChevronRight,{size:12}),n?`Hide ${r}`:`Show ${r}`]}),s&&n&&a]})}let y=[{key:"current",label:"Current cycle"},{key:"24h",label:"24H"},{key:"7d",label:"7D"},{key:"30d",label:"30D"},{key:"90d",label:"90D"},{key:"custom",label:"Custom"}];function g({value:e,onChange:a,windowType:n="short"}){let i="long"===n?y.filter(e=>"24h"!==e.key):y,[s,l]=(0,r.useState)(()=>m(e.startMs??Date.now()-6048e5)),[o,d]=(0,r.useState)(()=>m(e.endMs??Date.now()));return(0,r.useEffect)(()=>{if("custom"!==e.preset)return;let t=b(s),r=b(o);Number.isNaN(t)||Number.isNaN(r)||t>=r||(t!==e.startMs||r!==e.endMs)&&a({preset:"custom",startMs:t,endMs:r})},[s,o,e.preset]),(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap"},children:[(0,t.jsx)("div",{style:{display:"inline-flex",borderRadius:6,border:"1px solid var(--af-border-subtle)",overflow:"hidden"},children:i.map((r,n)=>(0,t.jsx)("button",{type:"button",onClick:()=>{var e;"custom"===(e=r.key)?a({preset:e,startMs:b(s),endMs:b(o)}):a({preset:e})},style:{padding:"6px 12px",fontSize:11,fontWeight:500,background:e.preset===r.key?"var(--af-accent-subtle)":"transparent",color:e.preset===r.key?"var(--af-accent)":"var(--af-text-secondary)",border:"none",borderRight:n<i.length-1?"1px solid var(--af-border-subtle)":"none",cursor:"pointer",letterSpacing:"0.02em"},children:r.label},r.key))}),"custom"===e.preset&&(0,t.jsxs)("div",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[(0,t.jsx)("input",{type:"datetime-local",value:s,onChange:e=>l(e.target.value),style:v}),(0,t.jsx)("span",{style:{fontSize:11,color:"var(--af-text-tertiary)"},children:"→"}),(0,t.jsx)("input",{type:"datetime-local",value:o,onChange:e=>d(e.target.value),style:v})]})]})}let v={padding:"5px 8px",fontSize:11,background:"var(--background)",color:"var(--af-text)",border:"1px solid var(--af-border-subtle)",borderRadius:5,fontFamily:"var(--font-mono)"};function m(e){let t=new Date(e),r=t.getFullYear(),a=String(t.getMonth()+1).padStart(2,"0"),n=String(t.getDate()).padStart(2,"0"),i=String(t.getHours()).padStart(2,"0"),s=String(t.getMinutes()).padStart(2,"0");return`${r}-${a}-${n}T${i}:${s}`}function b(e){return new Date(e).getTime()}let j=[{key:"seven_day",label:"7d utilization",windowMs:6048e5,colorVar:"var(--af-accent)"},{key:"five_hour",label:"5h utilization",windowMs:18e6,colorVar:"var(--af-success)"}],k={key:"seven_day_sonnet",label:"7d utilization (Sonnet)",windowMs:6048e5,colorVar:"var(--af-warning)"};function w({config:e,snapshots:n,predictedSeries:i,onClose:s}){let[l,o]=(0,r.useState)({preset:"current"}),c=(0,r.useMemo)(()=>{for(let t=n.length-1;t>=0;t--){let r=n[t][e.key];if(r&&r.resets_at){let t=new Date(r.resets_at).getTime();return{startMs:t-e.windowMs,endMs:t}}}return null},[n,e.key,e.windowMs]),x=function(e){let t=Date.now();switch(e.preset){case"current":return{};case"24h":return{startMs:t-864e5,endMs:t};case"7d":return{startMs:t-6048e5,endMs:t};case"30d":return{startMs:t-2592e6,endMs:t};case"90d":return{startMs:t-7776e6,endMs:t};case"custom":return{startMs:e.startMs,endMs:e.endMs}}}(l),u="current"===l.preset&&c?c:x;return(0,t.jsx)("div",{onClick:s,style:{position:"fixed",inset:0,background:"rgba(0, 0, 0, 0.55)",backdropFilter:"blur(4px)",zIndex:100,display:"flex",alignItems:"center",justifyContent:"center",padding:32},children:(0,t.jsxs)("div",{onClick:e=>e.stopPropagation(),style:{width:"100%",maxWidth:1600,maxHeight:"calc(100vh - 64px)",background:"var(--background)",border:"1px solid var(--af-border-subtle)",borderRadius:12,boxShadow:"0 24px 64px rgba(0, 0, 0, 0.4)",display:"flex",flexDirection:"column",overflow:"hidden"},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:16,padding:"14px 20px",borderBottom:"1px solid var(--af-border-subtle)",flexWrap:"wrap"},children:[(0,t.jsx)("div",{style:{fontSize:14,fontWeight:600,textTransform:"uppercase",letterSpacing:"0.04em",color:"var(--af-text)"},children:e.label}),(0,t.jsx)(g,{value:l,onChange:o,windowType:e.windowMs>=864e5?"long":"short"}),(0,t.jsx)("button",{type:"button",onClick:s,"aria-label":"Close",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:28,height:28,borderRadius:6,background:"transparent",border:"1px solid var(--af-border-subtle)",color:"var(--af-text-secondary)",cursor:"pointer"},children:(0,t.jsx)(a.X,{size:14})})]}),(0,t.jsx)("div",{style:{padding:20,overflow:"auto",flex:1},children:u.startMs&&u.endMs?(0,t.jsx)(d,{snapshots:n,seriesKey:e.key,startMs:u.startMs,endMs:u.endMs,windowMs:e.windowMs,colorVar:e.colorVar,predictedSeries:i}):(0,t.jsx)("div",{className:"af-card",style:{padding:"40px 32px",textAlign:"center",fontSize:12,color:"var(--af-text-tertiary)"},children:"No data available for this window."})})]})})}function M({children:e}){return(0,t.jsx)("div",{style:{fontSize:11,fontWeight:600,color:"var(--af-text)",textTransform:"uppercase",letterSpacing:"0.04em"},children:e})}e.s(["UsageChartsDashboard",0,function({snapshots:e,predicted:a}){let[n,i]=(0,r.useState)(null),l=a??{five_hour:[],seven_day:[],seven_day_sonnet:[]};return(0,r.useEffect)(()=>{if(!n)return;let e=e=>{"Escape"===e.key&&i(null)};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[n]),(0,r.useEffect)(()=>{if(!n)return;let e=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=e}},[n]),(0,t.jsxs)(t.Fragment,{children:[j.map(r=>(0,t.jsxs)("section",{style:{display:"flex",flexDirection:"column",gap:6},children:[(0,t.jsx)(M,{children:r.label}),(0,t.jsx)(s,{snapshots:e,seriesKey:r.key,windowMs:r.windowMs,colorVar:r.colorVar,predictedSeries:l[r.key],onExpand:()=>i(r)})]},r.key)),(0,t.jsx)(h,{storageKey:"cclens:usage:show-sonnet",label:"Sonnet 7d utilization",children:(0,t.jsxs)("section",{style:{display:"flex",flexDirection:"column",gap:6},children:[(0,t.jsx)(M,{children:k.label}),(0,t.jsx)(s,{snapshots:e,seriesKey:k.key,windowMs:k.windowMs,colorVar:k.colorVar,predictedSeries:l[k.key],onExpand:()=>i(k)})]})}),n&&(0,t.jsx)(w,{config:n,snapshots:e,predictedSeries:l[n.key],onClose:()=>i(null)})]})}],36373)}]);
|
package/app/apps/web/.next/static/chunks/{turbopack-0lb9w090w5ezx.js → turbopack-0mxu3~9vk.brh.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,{otherChunks:["static/chunks/0h3.-_s-k0mj3.js","static/chunks/073081qv4uyn8.js","static/chunks/0l4e3as18eexy.js","static/chunks/0gblp_v.kiu-..js"],runtimeModuleIds:[94553]}]),(()=>{let e;if(!Array.isArray(globalThis.TURBOPACK))return;let t="/_next/",r=function(){if(null!=self.TURBOPACK_ASSET_SUFFIX)return self.TURBOPACK_ASSET_SUFFIX;let e=document?.currentScript?.getAttribute?.("src")??"",t=e.indexOf("?");return t>=0?e.slice(t):""}(),n=["NEXT_DEPLOYMENT_ID","NEXT_CLIENT_ASSET_SUFFIX"];var o,i=((o=i||{})[o.Runtime=0]="Runtime",o[o.Parent=1]="Parent",o[o.Update=2]="Update",o);let l=new WeakMap;function s(e,t){this.m=e,this.e=t}let u=s.prototype,a=Object.prototype.hasOwnProperty,c="u">typeof Symbol&&Symbol.toStringTag;function f(e,t,r){a.call(e,t)||Object.defineProperty(e,t,r)}function p(e,t){let r=e[t];return r||(r=h(t),e[t]=r),r}function h(e){return{exports:{},error:void 0,id:e,namespaceObject:void 0}}function d(e,t){f(e,"__esModule",{value:!0}),c&&f(e,c,{value:"Module"});let r=0;for(;r<t.length;){let n=t[r++],o=t[r++];if("number"==typeof o)if(0===o)f(e,n,{value:t[r++],enumerable:!0,writable:!1});else throw Error(`unexpected tag: ${o}`);else"function"==typeof t[r]?f(e,n,{get:o,set:t[r++],enumerable:!0}):f(e,n,{get:o,enumerable:!0})}Object.seal(e)}function m(e,t){(null!=t?p(this.c,t):this.m).exports=e}u.s=function(e,t){let r,n;null!=t?n=(r=p(this.c,t)).exports:(r=this.m,n=this.e),r.namespaceObject=n,d(n,e)},u.j=function(e,t){var r,n;let o,i,s;null!=t?i=(o=p(this.c,t)).exports:(o=this.m,i=this.e);let u=(r=o,n=i,(s=l.get(r))||(l.set(r,s=[]),r.exports=r.namespaceObject=new Proxy(n,{get(e,t){if(a.call(e,t)||"default"===t||"__esModule"===t)return Reflect.get(e,t);for(let e of s){let r=Reflect.get(e,t);if(void 0!==r)return r}},ownKeys(e){let t=Reflect.ownKeys(e);for(let e of s)for(let r of Reflect.ownKeys(e))"default"===r||t.includes(r)||t.push(r);return t}})),s);"object"==typeof e&&null!==e&&u.push(e)},u.v=m,u.n=function(e,t){let r;(r=null!=t?p(this.c,t):this.m).exports=r.namespaceObject=e};let b=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,y=[null,b({}),b([]),b(b)];function g(e,t,r){let n=[],o=-1;for(let t=e;("object"==typeof t||"function"==typeof t)&&!y.includes(t);t=b(t))for(let r of Object.getOwnPropertyNames(t))n.push(r,function(e,t){return()=>e[t]}(e,r)),-1===o&&"default"===r&&(o=n.length-1);return r&&o>=0||(o>=0?n.splice(o,1,0,e):n.push("default",0,e)),d(t,n),t}function O(e){let t=B(e,this.m);if(t.namespaceObject)return t.namespaceObject;let r=t.exports;return t.namespaceObject=g(r,"function"==typeof r?function(...e){return r.apply(this,e)}:Object.create(null),r&&r.__esModule)}function w(e){let t=e.indexOf("#");-1!==t&&(e=e.substring(0,t));let r=e.indexOf("?");return -1!==r&&(e=e.substring(0,r)),e}function k(){let e,t;return{promise:new Promise((r,n)=>{t=n,e=r}),resolve:e,reject:t}}u.i=O,u.A=function(e){return this.r(e)(O.bind(this))},u.t="function"==typeof require?require:function(){throw Error("Unexpected use of runtime require")},u.r=function(e){return B(e,this.m).exports},u.f=function(e){function t(t){if(t=w(t),a.call(e,t))return e[t].module();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r}return t.keys=()=>Object.keys(e),t.resolve=t=>{if(t=w(t),a.call(e,t))return e[t].id();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r},t.import=async e=>await t(e),t};let j=Symbol("turbopack queues"),v=Symbol("turbopack exports"),U=Symbol("turbopack error");function C(e){e&&1!==e.status&&(e.status=1,e.forEach(e=>e.queueCount--),e.forEach(e=>e.queueCount--?e.queueCount++:e()))}u.a=function(e,t){let r=this.m,n=t?Object.assign([],{status:-1}):void 0,o=new Set,{resolve:i,reject:l,promise:s}=k(),u=Object.assign(s,{[v]:r.exports,[j]:e=>{n&&e(n),o.forEach(e),u.catch(()=>{})}}),a={get:()=>u,set(e){e!==u&&(u[v]=e)}};Object.defineProperty(r,"exports",a),Object.defineProperty(r,"namespaceObject",a),e(function(e){let t=e.map(e=>{if(null!==e&&"object"==typeof e){if(j in e)return e;if(null!=e&&"object"==typeof e&&"then"in e&&"function"==typeof e.then){let t=Object.assign([],{status:0}),r={[v]:{},[j]:e=>e(t)};return e.then(e=>{r[v]=e,C(t)},e=>{r[U]=e,C(t)}),r}}return{[v]:e,[j]:()=>{}}}),r=()=>t.map(e=>{if(e[U])throw e[U];return e[v]}),{promise:i,resolve:l}=k(),s=Object.assign(()=>l(r),{queueCount:0});function u(e){e!==n&&!o.has(e)&&(o.add(e),e&&0===e.status&&(s.queueCount++,e.push(s)))}return t.map(e=>e[j](u)),s.queueCount?i:r()},function(e){e?l(u[U]=e):i(u[v]),C(n)}),n&&-1===n.status&&(n.status=0)};let P=function(e){let t=new URL(e,"x:/"),r={};for(let e in t)r[e]=t[e];for(let t in r.href=e,r.pathname=e.replace(/[?#].*/,""),r.origin=r.protocol="",r.toString=r.toJSON=(...t)=>e,r)Object.defineProperty(this,t,{enumerable:!0,configurable:!0,value:r[t]})};function R(e,t){throw Error(`Invariant: ${t(e)}`)}P.prototype=URL.prototype,u.U=P,u.z=function(e){throw Error("dynamic usage of require is not supported")},u.g=globalThis;let S=s.prototype,$=new Map;u.M=$;let _=new Map,E=new Map;async function T(e,t,r){let n;if("string"==typeof r)return M(e,t,N(r));let o=r.included||[],i=o.map(e=>!!$.has(e)||_.get(e));if(i.length>0&&i.every(e=>e))return void await Promise.all(i);let l=r.moduleChunks||[],s=l.map(e=>E.get(e)).filter(e=>e);if(s.length>0){if(s.length===l.length)return void await Promise.all(s);let r=new Set;for(let e of l)E.has(e)||r.add(e);for(let n of r){let r=M(e,t,N(n));E.set(n,r),s.push(r)}n=Promise.all(s)}else{for(let o of(n=M(e,t,N(r.path)),l))E.has(o)||E.set(o,n)}for(let e of o)_.has(e)||_.set(e,n);await n}S.l=function(e){return T(i.Parent,this.m.id,e)};let A=Promise.resolve(void 0),x=new WeakMap;function M(t,r,n){let o=e.loadChunkCached(t,n),l=x.get(o);if(void 0===l){let e=x.set.bind(x,o,A);l=o.then(e).catch(e=>{let o;switch(t){case i.Runtime:o=`as a runtime dependency of chunk ${r}`;break;case i.Parent:o=`from module ${r}`;break;case i.Update:o="from an HMR update";break;default:R(t,e=>`Unknown source type: ${e}`)}let l=Error(`Failed to load chunk ${n} ${o}${e?`: ${e}`:""}`,e?{cause:e}:void 0);throw l.name="ChunkLoadError",l}),x.set(o,l)}return l}function N(e){return`${t}${e.split("/").map(e=>encodeURIComponent(e)).join("/")}${r}`}S.L=function(e){return M(i.Parent,this.m.id,e)},S.R=function(e){let t=this.r(e);return t?.default??t},S.P=function(e){return`/ROOT/${e??""}`},S.q=function(e,t){m.call(this,`${e}${r}`,t)},S.b=function(e,t,o,i){let l="SharedWorker"===e.name,s=[o.map(e=>N(e)).reverse(),r];for(let e of n)s.push(globalThis[e]);let u=new URL(N(t),location.origin),a=JSON.stringify(s);return l?u.searchParams.set("params",a):u.hash="#params="+encodeURIComponent(a),new e(u,i?{...i,type:void 0}:void 0)};let q=/\.js(?:\?[^#]*)?(?:#.*)?$/,K=/\.css(?:\?[^#]*)?(?:#.*)?$/;function L(e){return K.test(e)}u.w=function(t,r,n){return e.loadWebAssembly(i.Parent,this.m.id,t,r,n)},u.u=function(t,r){return e.loadWebAssemblyModule(i.Parent,this.m.id,t,r)};let I={};u.c=I;let B=(e,t)=>{let r=I[e];if(r){if(r.error)throw r.error;return r}return W(e,i.Parent,t.id)};function W(e,t,r){let n=$.get(e);if("function"!=typeof n)throw Error(function(e,t,r){let n;switch(t){case 0:n=`as a runtime entry of chunk ${r}`;break;case 1:n=`because it was required from module ${r}`;break;case 2:n="because of an HMR update";break;default:R(t,e=>`Unknown source type: ${e}`)}return`Module ${e} was instantiated ${n}, but the module factory is not available.`}(e,t,r));let o=h(e),i=o.exports;I[e]=o;let l=new s(o,i);try{n(l,o,i)}catch(e){throw o.error=e,e}return o.namespaceObject&&o.exports!==o.namespaceObject&&g(o.exports,o.namespaceObject),o}function F(t){let r,n=function(e){if("string"==typeof e)return e;if(e)return{src:e.getAttribute("src")};if("u">typeof TURBOPACK_NEXT_CHUNK_URLS)return{src:TURBOPACK_NEXT_CHUNK_URLS.pop()};throw Error("chunk path empty but not in a worker")}(t[0]);return 2===t.length?r=t[1]:(r=void 0,!function(e,t){let r=1;for(;r<e.length;){let n,o=r+1;for(;o<e.length&&"function"!=typeof e[o];)o++;if(o===e.length)throw Error("malformed chunk format, expected a factory function");let i=e[o];for(let i=r;i<o;i++){let r=e[i],o=t.get(r);if(o){n=o;break}}let l=n??i,s=!1;for(let n=r;n<o;n++){let r=e[n];t.has(r)||(s||(l===i&&Object.defineProperty(i,"name",{value:"module evaluation"}),s=!0),t.set(r,l))}r=o+1}}(t,$)),e.registerChunk(n,r)}let X=new Map;function D(e){let t=X.get(e);if(!t){let r,n;t={resolved:!1,loadingStarted:!1,promise:new Promise((e,t)=>{r=e,n=t}),resolve:()=>{t.resolved=!0,r()},reject:n},X.set(e,t)}return t}e={async registerChunk(e,r){let n=function(e){if("string"==typeof e)return e;let r=decodeURIComponent(e.src.replace(/[?#].*$/,""));return r.startsWith(t)?r.slice(t.length):r}(e);if(D("string"==typeof e?N(e):e.src).resolve(),null!=r){for(let e of r.otherChunks)D(N("string"==typeof e?e:e.path));if(await Promise.all(r.otherChunks.map(e=>T(i.Runtime,n,e))),r.runtimeModuleIds.length>0)for(let e of r.runtimeModuleIds)!function(e,t){let r=I[t];if(r){if(r.error)throw r.error;return}W(t,i.Runtime,e)}(n,e)}},loadChunkCached:(e,t)=>(function(e,t){let r=D(t);if(r.loadingStarted)return r.promise;if(e===i.Runtime)return r.loadingStarted=!0,L(t)&&r.resolve(),r.promise;if("function"==typeof importScripts)if(L(t));else if(q.test(t))self.TURBOPACK_NEXT_CHUNK_URLS.push(t),importScripts(t);else throw Error(`can't infer type of chunk from URL ${t} in worker`);else{let e=decodeURI(t);if(L(t))if(document.querySelectorAll(`link[rel=stylesheet][href="${t}"],link[rel=stylesheet][href^="${t}?"],link[rel=stylesheet][href="${e}"],link[rel=stylesheet][href^="${e}?"]`).length>0)r.resolve();else{let e=document.createElement("link");e.rel="stylesheet",e.href=t,e.onerror=()=>{r.reject()},e.onload=()=>{r.resolve()},document.head.appendChild(e)}else if(q.test(t)){let n=document.querySelectorAll(`script[src="${t}"],script[src^="${t}?"],script[src="${e}"],script[src^="${e}?"]`);if(n.length>0)for(let e of Array.from(n))e.addEventListener("error",()=>{r.reject()});else{let e=document.createElement("script");e.src=t,e.onerror=()=>{r.reject()},document.head.appendChild(e)}}else throw Error(`can't infer type of chunk from URL ${t}`)}return r.loadingStarted=!0,r.promise})(e,t),async loadWebAssembly(e,t,r,n,o){let i=fetch(N(r)),{instance:l}=await WebAssembly.instantiateStreaming(i,o);return l.exports},async loadWebAssemblyModule(e,t,r,n){let o=fetch(N(r));return await WebAssembly.compileStreaming(o)}};let H=globalThis.TURBOPACK;globalThis.TURBOPACK={push:F},H.forEach(F)})();
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,{otherChunks:["static/chunks/0i.hc~2bj0_3d.js","static/chunks/0p--hzrway8~3.js","static/chunks/0g223u9amib0q.js","static/chunks/0qv-gw888_5nu.js"],runtimeModuleIds:[94553]}]),(()=>{let e;if(!Array.isArray(globalThis.TURBOPACK))return;let t="/_next/",r=function(){if(null!=self.TURBOPACK_ASSET_SUFFIX)return self.TURBOPACK_ASSET_SUFFIX;let e=document?.currentScript?.getAttribute?.("src")??"",t=e.indexOf("?");return t>=0?e.slice(t):""}(),n=["NEXT_DEPLOYMENT_ID","NEXT_CLIENT_ASSET_SUFFIX"];var o,i=((o=i||{})[o.Runtime=0]="Runtime",o[o.Parent=1]="Parent",o[o.Update=2]="Update",o);let l=new WeakMap;function s(e,t){this.m=e,this.e=t}let u=s.prototype,a=Object.prototype.hasOwnProperty,c="u">typeof Symbol&&Symbol.toStringTag;function f(e,t,r){a.call(e,t)||Object.defineProperty(e,t,r)}function p(e,t){let r=e[t];return r||(r=h(t),e[t]=r),r}function h(e){return{exports:{},error:void 0,id:e,namespaceObject:void 0}}function d(e,t){f(e,"__esModule",{value:!0}),c&&f(e,c,{value:"Module"});let r=0;for(;r<t.length;){let n=t[r++],o=t[r++];if("number"==typeof o)if(0===o)f(e,n,{value:t[r++],enumerable:!0,writable:!1});else throw Error(`unexpected tag: ${o}`);else"function"==typeof t[r]?f(e,n,{get:o,set:t[r++],enumerable:!0}):f(e,n,{get:o,enumerable:!0})}Object.seal(e)}function m(e,t){(null!=t?p(this.c,t):this.m).exports=e}u.s=function(e,t){let r,n;null!=t?n=(r=p(this.c,t)).exports:(r=this.m,n=this.e),r.namespaceObject=n,d(n,e)},u.j=function(e,t){var r,n;let o,i,s;null!=t?i=(o=p(this.c,t)).exports:(o=this.m,i=this.e);let u=(r=o,n=i,(s=l.get(r))||(l.set(r,s=[]),r.exports=r.namespaceObject=new Proxy(n,{get(e,t){if(a.call(e,t)||"default"===t||"__esModule"===t)return Reflect.get(e,t);for(let e of s){let r=Reflect.get(e,t);if(void 0!==r)return r}},ownKeys(e){let t=Reflect.ownKeys(e);for(let e of s)for(let r of Reflect.ownKeys(e))"default"===r||t.includes(r)||t.push(r);return t}})),s);"object"==typeof e&&null!==e&&u.push(e)},u.v=m,u.n=function(e,t){let r;(r=null!=t?p(this.c,t):this.m).exports=r.namespaceObject=e};let b=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,y=[null,b({}),b([]),b(b)];function g(e,t,r){let n=[],o=-1;for(let t=e;("object"==typeof t||"function"==typeof t)&&!y.includes(t);t=b(t))for(let r of Object.getOwnPropertyNames(t))n.push(r,function(e,t){return()=>e[t]}(e,r)),-1===o&&"default"===r&&(o=n.length-1);return r&&o>=0||(o>=0?n.splice(o,1,0,e):n.push("default",0,e)),d(t,n),t}function w(e){let t=B(e,this.m);if(t.namespaceObject)return t.namespaceObject;let r=t.exports;return t.namespaceObject=g(r,"function"==typeof r?function(...e){return r.apply(this,e)}:Object.create(null),r&&r.__esModule)}function O(e){let t=e.indexOf("#");-1!==t&&(e=e.substring(0,t));let r=e.indexOf("?");return -1!==r&&(e=e.substring(0,r)),e}function j(){let e,t;return{promise:new Promise((r,n)=>{t=n,e=r}),resolve:e,reject:t}}u.i=w,u.A=function(e){return this.r(e)(w.bind(this))},u.t="function"==typeof require?require:function(){throw Error("Unexpected use of runtime require")},u.r=function(e){return B(e,this.m).exports},u.f=function(e){function t(t){if(t=O(t),a.call(e,t))return e[t].module();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r}return t.keys=()=>Object.keys(e),t.resolve=t=>{if(t=O(t),a.call(e,t))return e[t].id();let r=Error(`Cannot find module '${t}'`);throw r.code="MODULE_NOT_FOUND",r},t.import=async e=>await t(e),t};let k=Symbol("turbopack queues"),U=Symbol("turbopack exports"),v=Symbol("turbopack error");function C(e){e&&1!==e.status&&(e.status=1,e.forEach(e=>e.queueCount--),e.forEach(e=>e.queueCount--?e.queueCount++:e()))}u.a=function(e,t){let r=this.m,n=t?Object.assign([],{status:-1}):void 0,o=new Set,{resolve:i,reject:l,promise:s}=j(),u=Object.assign(s,{[U]:r.exports,[k]:e=>{n&&e(n),o.forEach(e),u.catch(()=>{})}}),a={get:()=>u,set(e){e!==u&&(u[U]=e)}};Object.defineProperty(r,"exports",a),Object.defineProperty(r,"namespaceObject",a),e(function(e){let t=e.map(e=>{if(null!==e&&"object"==typeof e){if(k in e)return e;if(null!=e&&"object"==typeof e&&"then"in e&&"function"==typeof e.then){let t=Object.assign([],{status:0}),r={[U]:{},[k]:e=>e(t)};return e.then(e=>{r[U]=e,C(t)},e=>{r[v]=e,C(t)}),r}}return{[U]:e,[k]:()=>{}}}),r=()=>t.map(e=>{if(e[v])throw e[v];return e[U]}),{promise:i,resolve:l}=j(),s=Object.assign(()=>l(r),{queueCount:0});function u(e){e!==n&&!o.has(e)&&(o.add(e),e&&0===e.status&&(s.queueCount++,e.push(s)))}return t.map(e=>e[k](u)),s.queueCount?i:r()},function(e){e?l(u[v]=e):i(u[U]),C(n)}),n&&-1===n.status&&(n.status=0)};let P=function(e){let t=new URL(e,"x:/"),r={};for(let e in t)r[e]=t[e];for(let t in r.href=e,r.pathname=e.replace(/[?#].*/,""),r.origin=r.protocol="",r.toString=r.toJSON=(...t)=>e,r)Object.defineProperty(this,t,{enumerable:!0,configurable:!0,value:r[t]})};function R(e,t){throw Error(`Invariant: ${t(e)}`)}P.prototype=URL.prototype,u.U=P,u.z=function(e){throw Error("dynamic usage of require is not supported")},u.g=globalThis;let S=s.prototype,$=new Map;u.M=$;let _=new Map,E=new Map;async function T(e,t,r){let n;if("string"==typeof r)return M(e,t,q(r));let o=r.included||[],i=o.map(e=>!!$.has(e)||_.get(e));if(i.length>0&&i.every(e=>e))return void await Promise.all(i);let l=r.moduleChunks||[],s=l.map(e=>E.get(e)).filter(e=>e);if(s.length>0){if(s.length===l.length)return void await Promise.all(s);let r=new Set;for(let e of l)E.has(e)||r.add(e);for(let n of r){let r=M(e,t,q(n));E.set(n,r),s.push(r)}n=Promise.all(s)}else{for(let o of(n=M(e,t,q(r.path)),l))E.has(o)||E.set(o,n)}for(let e of o)_.has(e)||_.set(e,n);await n}S.l=function(e){return T(i.Parent,this.m.id,e)};let A=Promise.resolve(void 0),x=new WeakMap;function M(t,r,n){let o=e.loadChunkCached(t,n),l=x.get(o);if(void 0===l){let e=x.set.bind(x,o,A);l=o.then(e).catch(e=>{let o;switch(t){case i.Runtime:o=`as a runtime dependency of chunk ${r}`;break;case i.Parent:o=`from module ${r}`;break;case i.Update:o="from an HMR update";break;default:R(t,e=>`Unknown source type: ${e}`)}let l=Error(`Failed to load chunk ${n} ${o}${e?`: ${e}`:""}`,e?{cause:e}:void 0);throw l.name="ChunkLoadError",l}),x.set(o,l)}return l}function q(e){return`${t}${e.split("/").map(e=>encodeURIComponent(e)).join("/")}${r}`}S.L=function(e){return M(i.Parent,this.m.id,e)},S.R=function(e){let t=this.r(e);return t?.default??t},S.P=function(e){return`/ROOT/${e??""}`},S.q=function(e,t){m.call(this,`${e}${r}`,t)},S.b=function(e,t,o,i){let l="SharedWorker"===e.name,s=[o.map(e=>q(e)).reverse(),r];for(let e of n)s.push(globalThis[e]);let u=new URL(q(t),location.origin),a=JSON.stringify(s);return l?u.searchParams.set("params",a):u.hash="#params="+encodeURIComponent(a),new e(u,i?{...i,type:void 0}:void 0)};let N=/\.js(?:\?[^#]*)?(?:#.*)?$/,K=/\.css(?:\?[^#]*)?(?:#.*)?$/;function L(e){return K.test(e)}u.w=function(t,r,n){return e.loadWebAssembly(i.Parent,this.m.id,t,r,n)},u.u=function(t,r){return e.loadWebAssemblyModule(i.Parent,this.m.id,t,r)};let I={};u.c=I;let B=(e,t)=>{let r=I[e];if(r){if(r.error)throw r.error;return r}return W(e,i.Parent,t.id)};function W(e,t,r){let n=$.get(e);if("function"!=typeof n)throw Error(function(e,t,r){let n;switch(t){case 0:n=`as a runtime entry of chunk ${r}`;break;case 1:n=`because it was required from module ${r}`;break;case 2:n="because of an HMR update";break;default:R(t,e=>`Unknown source type: ${e}`)}return`Module ${e} was instantiated ${n}, but the module factory is not available.`}(e,t,r));let o=h(e),i=o.exports;I[e]=o;let l=new s(o,i);try{n(l,o,i)}catch(e){throw o.error=e,e}return o.namespaceObject&&o.exports!==o.namespaceObject&&g(o.exports,o.namespaceObject),o}function F(t){let r,n=function(e){if("string"==typeof e)return e;if(e)return{src:e.getAttribute("src")};if("u">typeof TURBOPACK_NEXT_CHUNK_URLS)return{src:TURBOPACK_NEXT_CHUNK_URLS.pop()};throw Error("chunk path empty but not in a worker")}(t[0]);return 2===t.length?r=t[1]:(r=void 0,!function(e,t){let r=1;for(;r<e.length;){let n,o=r+1;for(;o<e.length&&"function"!=typeof e[o];)o++;if(o===e.length)throw Error("malformed chunk format, expected a factory function");let i=e[o];for(let i=r;i<o;i++){let r=e[i],o=t.get(r);if(o){n=o;break}}let l=n??i,s=!1;for(let n=r;n<o;n++){let r=e[n];t.has(r)||(s||(l===i&&Object.defineProperty(i,"name",{value:"module evaluation"}),s=!0),t.set(r,l))}r=o+1}}(t,$)),e.registerChunk(n,r)}let X=new Map;function D(e){let t=X.get(e);if(!t){let r,n;t={resolved:!1,loadingStarted:!1,promise:new Promise((e,t)=>{r=e,n=t}),resolve:()=>{t.resolved=!0,r()},reject:n},X.set(e,t)}return t}e={async registerChunk(e,r){let n=function(e){if("string"==typeof e)return e;let r=decodeURIComponent(e.src.replace(/[?#].*$/,""));return r.startsWith(t)?r.slice(t.length):r}(e);if(D("string"==typeof e?q(e):e.src).resolve(),null!=r){for(let e of r.otherChunks)D(q("string"==typeof e?e:e.path));if(await Promise.all(r.otherChunks.map(e=>T(i.Runtime,n,e))),r.runtimeModuleIds.length>0)for(let e of r.runtimeModuleIds)!function(e,t){let r=I[t];if(r){if(r.error)throw r.error;return}W(t,i.Runtime,e)}(n,e)}},loadChunkCached:(e,t)=>(function(e,t){let r=D(t);if(r.loadingStarted)return r.promise;if(e===i.Runtime)return r.loadingStarted=!0,L(t)&&r.resolve(),r.promise;if("function"==typeof importScripts)if(L(t));else if(N.test(t))self.TURBOPACK_NEXT_CHUNK_URLS.push(t),importScripts(t);else throw Error(`can't infer type of chunk from URL ${t} in worker`);else{let e=decodeURI(t);if(L(t))if(document.querySelectorAll(`link[rel=stylesheet][href="${t}"],link[rel=stylesheet][href^="${t}?"],link[rel=stylesheet][href="${e}"],link[rel=stylesheet][href^="${e}?"]`).length>0)r.resolve();else{let e=document.createElement("link");e.rel="stylesheet",e.href=t,e.onerror=()=>{r.reject()},e.onload=()=>{r.resolve()},document.head.appendChild(e)}else if(N.test(t)){let n=document.querySelectorAll(`script[src="${t}"],script[src^="${t}?"],script[src="${e}"],script[src^="${e}?"]`);if(n.length>0)for(let e of Array.from(n))e.addEventListener("error",()=>{r.reject()});else{let e=document.createElement("script");e.src=t,e.onerror=()=>{r.reject()},document.head.appendChild(e)}}else throw Error(`can't infer type of chunk from URL ${t}`)}return r.loadingStarted=!0,r.promise})(e,t),async loadWebAssembly(e,t,r,n,o){let i=fetch(q(r)),{instance:l}=await WebAssembly.instantiateStreaming(i,o);return l.exports},async loadWebAssemblyModule(e,t,r,n){let o=fetch(q(r));return await WebAssembly.compileStreaming(o)}};let H=globalThis.TURBOPACK;globalThis.TURBOPACK={push:F},H.forEach(F)})();
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import "server-only";
|
|
2
|
+
import type {
|
|
3
|
+
DayDigest, MonthDigest, WeekDigest,
|
|
4
|
+
} from "@claude-lens/entries";
|
|
5
|
+
import type { PipelineEvent } from "@claude-lens/entries/node";
|
|
6
|
+
import { InflightCoalescer } from "@/lib/inflight-coalesce";
|
|
7
|
+
import {
|
|
8
|
+
type JobKind,
|
|
9
|
+
registerJob, updateJob, completeJob, failJob,
|
|
10
|
+
} from "@/lib/jobs";
|
|
11
|
+
|
|
12
|
+
type AnyDigest = DayDigest | WeekDigest | MonthDigest;
|
|
13
|
+
|
|
14
|
+
// Shared coalescer instance for all digest periods. Per-period keys are
|
|
15
|
+
// already prefixed (day|/week|/month|) so a single instance is equivalent
|
|
16
|
+
// to the previous one-per-route setup.
|
|
17
|
+
const coalescer = new InflightCoalescer<string, void>();
|
|
18
|
+
|
|
19
|
+
export function updateJobFromEvent(jobId: string, ev: PipelineEvent): void {
|
|
20
|
+
if (ev.type === "status") {
|
|
21
|
+
updateJob(jobId, { progress: { phase: ev.phase, text: ev.text } });
|
|
22
|
+
} else if (ev.type === "entry") {
|
|
23
|
+
updateJob(jobId, { progress: { phase: "enrich", index: ev.index, total: ev.total } });
|
|
24
|
+
} else if (ev.type === "progress") {
|
|
25
|
+
updateJob(jobId, { progress: { phase: ev.phase, bytes: ev.bytes } });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function jsonResponse(body: unknown, status: number): Response {
|
|
30
|
+
return new Response(JSON.stringify(body), {
|
|
31
|
+
status, headers: { "content-type": "application/json" },
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// 400 without content-type header — preserves byte-equality for the routes
|
|
36
|
+
// whose POST validation paths historically omitted it.
|
|
37
|
+
function jsonResponseBare(body: unknown, status: number): Response {
|
|
38
|
+
return new Response(JSON.stringify(body), { status });
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export type DigestGetSpec = {
|
|
42
|
+
// Parsed/validated key for cache reads. null = invalid input.
|
|
43
|
+
key: string | null;
|
|
44
|
+
// Validation error response when key is null.
|
|
45
|
+
invalidResponse: Response;
|
|
46
|
+
// True if the key represents a future date/period.
|
|
47
|
+
isFuture: boolean;
|
|
48
|
+
futureResponse: Response;
|
|
49
|
+
// True if the key represents the current (in-progress) period.
|
|
50
|
+
isCurrent: boolean;
|
|
51
|
+
// Lookup for the in-memory current-period cache (only consulted when isCurrent).
|
|
52
|
+
readCurrentCache: () => AnyDigest | null | undefined;
|
|
53
|
+
// Persisted-disk lookup (consulted for past periods, and as a fallback for
|
|
54
|
+
// current periods that have already been persisted — week uses this fallback,
|
|
55
|
+
// day and month do not).
|
|
56
|
+
readPersisted: () => AnyDigest | null | undefined;
|
|
57
|
+
// Payload shape for the "no cache yet" current-period response. Day uses
|
|
58
|
+
// {pending:true, today:true}; week and month use {pending:true, current:true}.
|
|
59
|
+
pendingCurrentPayload: Record<string, unknown>;
|
|
60
|
+
// True if the current-period branch should also fall back to readPersisted
|
|
61
|
+
// when the in-memory cache is empty. Week does this; day and month do not.
|
|
62
|
+
currentFallsBackToPersisted: boolean;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export function handleDigestGet(spec: DigestGetSpec): Response {
|
|
66
|
+
if (spec.key === null) return spec.invalidResponse;
|
|
67
|
+
if (spec.isFuture) return spec.futureResponse;
|
|
68
|
+
|
|
69
|
+
if (spec.isCurrent) {
|
|
70
|
+
const cached = spec.currentFallsBackToPersisted
|
|
71
|
+
? (spec.readCurrentCache() ?? spec.readPersisted())
|
|
72
|
+
: spec.readCurrentCache();
|
|
73
|
+
if (cached) return jsonResponse(cached, 200);
|
|
74
|
+
return jsonResponse(spec.pendingCurrentPayload, 200);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const cached = spec.readPersisted();
|
|
78
|
+
if (cached) return jsonResponse(cached, 200);
|
|
79
|
+
return jsonResponse({ pending: true }, 200);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export type DigestPostSpec = {
|
|
83
|
+
// Parsed/validated key — feeds cache key, job target, resultUrl. null = invalid.
|
|
84
|
+
key: string | null;
|
|
85
|
+
invalidResponse: Response;
|
|
86
|
+
isFuture: boolean;
|
|
87
|
+
futureResponse: Response;
|
|
88
|
+
// Coalescer key prefix: "day" / "week" / "month".
|
|
89
|
+
coalesceScope: string;
|
|
90
|
+
// ?force=1
|
|
91
|
+
force: boolean;
|
|
92
|
+
// Job-tracking fields.
|
|
93
|
+
jobKind: JobKind;
|
|
94
|
+
jobLabel: string;
|
|
95
|
+
// resultUrl for completeJob.
|
|
96
|
+
resultUrl: string;
|
|
97
|
+
// Pre-bound pipeline factory — the helper never sees the per-period option shape.
|
|
98
|
+
runPipeline: () => AsyncIterable<PipelineEvent>;
|
|
99
|
+
// Fallback to deliver a final digest to a request that coalesced onto an
|
|
100
|
+
// in-flight run. Returns the digest if available, else null/undefined.
|
|
101
|
+
readDigestForCoalescedRequest: () => AnyDigest | null | undefined;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
export function handleDigestPost(spec: DigestPostSpec): Response {
|
|
105
|
+
if (spec.key === null) return spec.invalidResponse;
|
|
106
|
+
if (spec.isFuture) return spec.futureResponse;
|
|
107
|
+
|
|
108
|
+
const coalesceKey = `${spec.coalesceScope}|${spec.key}|${spec.force ? 1 : 0}`;
|
|
109
|
+
const encoder = new TextEncoder();
|
|
110
|
+
|
|
111
|
+
const stream = new ReadableStream({
|
|
112
|
+
async start(controller) {
|
|
113
|
+
let closed = false;
|
|
114
|
+
function send(event: PipelineEvent) {
|
|
115
|
+
if (closed) return;
|
|
116
|
+
try {
|
|
117
|
+
controller.enqueue(
|
|
118
|
+
encoder.encode(`event: ${event.type}\ndata: ${JSON.stringify(event)}\n\n`),
|
|
119
|
+
);
|
|
120
|
+
} catch {
|
|
121
|
+
closed = true;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function finish() {
|
|
125
|
+
if (!closed) {
|
|
126
|
+
try { controller.close(); } catch { /* already */ }
|
|
127
|
+
closed = true;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const alreadyInflight = coalescer.inflight(coalesceKey);
|
|
132
|
+
let jobId: string | null = null;
|
|
133
|
+
|
|
134
|
+
try {
|
|
135
|
+
await coalescer.run(coalesceKey, async () => {
|
|
136
|
+
if (alreadyInflight) return;
|
|
137
|
+
jobId = registerJob({
|
|
138
|
+
kind: spec.jobKind,
|
|
139
|
+
label: spec.jobLabel,
|
|
140
|
+
target: spec.key as string,
|
|
141
|
+
caller: "user",
|
|
142
|
+
});
|
|
143
|
+
updateJob(jobId, { status: "running" });
|
|
144
|
+
for await (const ev of spec.runPipeline()) {
|
|
145
|
+
send(ev);
|
|
146
|
+
if (jobId) updateJobFromEvent(jobId, ev);
|
|
147
|
+
}
|
|
148
|
+
if (jobId) completeJob(jobId, spec.resultUrl);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
if (alreadyInflight) {
|
|
152
|
+
const d = spec.readDigestForCoalescedRequest();
|
|
153
|
+
if (d) send({ type: "digest", digest: d });
|
|
154
|
+
send({ type: "status", phase: "persist", text: "coalesced with in-flight request" });
|
|
155
|
+
}
|
|
156
|
+
} catch (err) {
|
|
157
|
+
send({ type: "error", message: (err as Error).message });
|
|
158
|
+
if (jobId) failJob(jobId, (err as Error).message);
|
|
159
|
+
} finally {
|
|
160
|
+
try { controller.enqueue(encoder.encode(`event: done\ndata: {}\n\n`)); } catch { /* ignore */ }
|
|
161
|
+
finish();
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
return new Response(stream, {
|
|
167
|
+
headers: {
|
|
168
|
+
"Content-Type": "text/event-stream",
|
|
169
|
+
"Cache-Control": "no-cache, no-transform",
|
|
170
|
+
Connection: "keep-alive",
|
|
171
|
+
"X-Accel-Buffering": "no",
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Re-export so route files can build their own validation responses without
|
|
177
|
+
// duplicating the JSON-body Response idiom.
|
|
178
|
+
export { jsonResponse, jsonResponseBare };
|
|
@@ -1,152 +1,58 @@
|
|
|
1
1
|
import {
|
|
2
2
|
runDayDigestPipeline, readSettings, getTodayDigestFromCache,
|
|
3
3
|
} from "@claude-lens/entries/node";
|
|
4
|
-
import type { PipelineEvent } from "@claude-lens/entries/node";
|
|
5
4
|
import { readDayDigest } from "@claude-lens/entries/fs";
|
|
6
|
-
import { InflightCoalescer } from "@/lib/inflight-coalesce";
|
|
7
5
|
import { isValidDate, todayLocal } from "@/lib/entries";
|
|
8
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
handleDigestGet, handleDigestPost, jsonResponse, jsonResponseBare,
|
|
8
|
+
} from "../../_shared/digest-route-helpers";
|
|
9
9
|
|
|
10
10
|
export const runtime = "nodejs";
|
|
11
11
|
export const dynamic = "force-dynamic";
|
|
12
12
|
|
|
13
13
|
type Params = { params: Promise<{ date: string }> };
|
|
14
14
|
|
|
15
|
-
// Keyed by `${date}|${force ? 1 : 0}` — force=1 requests never coalesce
|
|
16
|
-
// with force=0 (different key), matching spec §S2.
|
|
17
|
-
const coalescer = new InflightCoalescer<string, void>();
|
|
18
|
-
|
|
19
|
-
function updateJobFromEvent(jobId: string, ev: PipelineEvent): void {
|
|
20
|
-
if (ev.type === "status") {
|
|
21
|
-
updateJob(jobId, { progress: { phase: ev.phase, text: ev.text } });
|
|
22
|
-
} else if (ev.type === "entry") {
|
|
23
|
-
updateJob(jobId, {
|
|
24
|
-
progress: { phase: "enrich", index: ev.index, total: ev.total },
|
|
25
|
-
});
|
|
26
|
-
} else if (ev.type === "progress") {
|
|
27
|
-
updateJob(jobId, {
|
|
28
|
-
progress: { phase: ev.phase, bytes: ev.bytes },
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
15
|
export async function GET(_req: Request, ctx: Params) {
|
|
34
16
|
const { date } = await ctx.params;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const cached = getTodayDigestFromCache(date, Date.now());
|
|
48
|
-
if (cached) {
|
|
49
|
-
return new Response(JSON.stringify(cached), {
|
|
50
|
-
status: 200, headers: { "content-type": "application/json" },
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
return new Response(JSON.stringify({ pending: true, today: true }), {
|
|
54
|
-
status: 200, headers: { "content-type": "application/json" },
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const cached = readDayDigest(date);
|
|
59
|
-
if (cached) {
|
|
60
|
-
return new Response(JSON.stringify(cached), {
|
|
61
|
-
status: 200, headers: { "content-type": "application/json" },
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
return new Response(JSON.stringify({ pending: true }), {
|
|
65
|
-
status: 200, headers: { "content-type": "application/json" },
|
|
17
|
+
const valid = isValidDate(date);
|
|
18
|
+
const isFuture = valid && date > todayLocal();
|
|
19
|
+
return handleDigestGet({
|
|
20
|
+
key: valid ? date : null,
|
|
21
|
+
invalidResponse: jsonResponse({ error: "invalid date" }, 400),
|
|
22
|
+
isFuture,
|
|
23
|
+
futureResponse: jsonResponse({ error: "future date" }, 400),
|
|
24
|
+
isCurrent: valid && date === todayLocal(),
|
|
25
|
+
readCurrentCache: () => getTodayDigestFromCache(date, Date.now()),
|
|
26
|
+
readPersisted: () => readDayDigest(date),
|
|
27
|
+
pendingCurrentPayload: { pending: true, today: true },
|
|
28
|
+
currentFallsBackToPersisted: false,
|
|
66
29
|
});
|
|
67
30
|
}
|
|
68
31
|
|
|
69
32
|
export async function POST(req: Request, ctx: Params) {
|
|
70
33
|
const { date } = await ctx.params;
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
}
|
|
74
|
-
if (date > todayLocal()) {
|
|
75
|
-
return new Response(JSON.stringify({ error: "future date" }), { status: 400 });
|
|
76
|
-
}
|
|
77
|
-
|
|
34
|
+
const valid = isValidDate(date);
|
|
35
|
+
const isFuture = valid && date > todayLocal();
|
|
78
36
|
const url = new URL(req.url);
|
|
79
37
|
const force = url.searchParams.get("force") === "1";
|
|
80
|
-
const key = `day|${date}|${force ? 1 : 0}`;
|
|
81
|
-
|
|
82
|
-
const encoder = new TextEncoder();
|
|
83
38
|
const settings = readSettings();
|
|
84
39
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const alreadyInflight = coalescer.inflight(key);
|
|
106
|
-
let jobId: string | null = null;
|
|
107
|
-
|
|
108
|
-
try {
|
|
109
|
-
await coalescer.run(key, async () => {
|
|
110
|
-
if (alreadyInflight) return;
|
|
111
|
-
jobId = registerJob({
|
|
112
|
-
kind: "digest.day",
|
|
113
|
-
label: `Day digest · ${date}`,
|
|
114
|
-
target: date,
|
|
115
|
-
caller: "user",
|
|
116
|
-
});
|
|
117
|
-
updateJob(jobId, { status: "running" });
|
|
118
|
-
for await (const ev of runDayDigestPipeline(date, {
|
|
119
|
-
settings: settings.ai_features,
|
|
120
|
-
force,
|
|
121
|
-
todayLocalDay: todayLocal(),
|
|
122
|
-
})) {
|
|
123
|
-
send(ev);
|
|
124
|
-
if (jobId) updateJobFromEvent(jobId, ev);
|
|
125
|
-
}
|
|
126
|
-
if (jobId) completeJob(jobId, `/day/${date}`);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
if (alreadyInflight) {
|
|
130
|
-
const d = readDayDigest(date) ?? getTodayDigestFromCache(date, Date.now());
|
|
131
|
-
if (d) send({ type: "digest", digest: d });
|
|
132
|
-
send({ type: "status", phase: "persist", text: "coalesced with in-flight request" });
|
|
133
|
-
}
|
|
134
|
-
} catch (err) {
|
|
135
|
-
send({ type: "error", message: (err as Error).message });
|
|
136
|
-
if (jobId) failJob(jobId, (err as Error).message);
|
|
137
|
-
} finally {
|
|
138
|
-
try { controller.enqueue(encoder.encode(`event: done\ndata: {}\n\n`)); } catch { /* ignore */ }
|
|
139
|
-
finish();
|
|
140
|
-
}
|
|
141
|
-
},
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
return new Response(stream, {
|
|
145
|
-
headers: {
|
|
146
|
-
"Content-Type": "text/event-stream",
|
|
147
|
-
"Cache-Control": "no-cache, no-transform",
|
|
148
|
-
Connection: "keep-alive",
|
|
149
|
-
"X-Accel-Buffering": "no",
|
|
150
|
-
},
|
|
40
|
+
return handleDigestPost({
|
|
41
|
+
key: valid ? date : null,
|
|
42
|
+
invalidResponse: jsonResponseBare({ error: "invalid date" }, 400),
|
|
43
|
+
isFuture,
|
|
44
|
+
futureResponse: jsonResponseBare({ error: "future date" }, 400),
|
|
45
|
+
coalesceScope: "day",
|
|
46
|
+
force,
|
|
47
|
+
jobKind: "digest.day",
|
|
48
|
+
jobLabel: `Day digest · ${date}`,
|
|
49
|
+
resultUrl: `/day/${date}`,
|
|
50
|
+
runPipeline: () => runDayDigestPipeline(date, {
|
|
51
|
+
settings: settings.ai_features,
|
|
52
|
+
force,
|
|
53
|
+
todayLocalDay: todayLocal(),
|
|
54
|
+
}),
|
|
55
|
+
readDigestForCoalescedRequest: () =>
|
|
56
|
+
readDayDigest(date) ?? getTodayDigestFromCache(date, Date.now()),
|
|
151
57
|
});
|
|
152
58
|
}
|