diff --git a/docs/dashboard-guide.md b/docs/dashboard-guide.md index 69944ffe..3418353b 100644 --- a/docs/dashboard-guide.md +++ b/docs/dashboard-guide.md @@ -162,9 +162,13 @@ Use `Threads` view when you want to understand a work session as a group instead - Threads pages through `/api/threads` on localhost and hydrates the selected thread's supporting calls through `/api/thread-calls`; loaded snapshot rows remain the fallback. -- Click a thread row to expand all of its aggregate calls directly beneath it. +- Click a thread row to load the first 100 aggregate calls directly beneath it. - Only one thread stays expanded at a time. -- Remaining call pages load progressively with visible progress and retry. +- The compact default keeps the most useful comparison columns visible; use + `Columns` to reveal duration, model/effort mix, token breakdowns, and other + advanced fields without making the default leaderboard excessively wide. +- Use `Load 100 more` to request each additional page; visible progress and retry + keep large threads bounded and recoverable. - Parent rows never open a representative call. - Explicit child `Open` and `Copy` actions reach Call Investigator. - Cache Frontier and Lifecycle remain secondary analysis modes. diff --git a/docs/superpowers/plans/2026-07-17-threads-table-compact-redesign.md b/docs/superpowers/plans/2026-07-17-threads-table-compact-redesign.md new file mode 100644 index 00000000..de2d6b14 --- /dev/null +++ b/docs/superpowers/plans/2026-07-17-threads-table-compact-redesign.md @@ -0,0 +1,112 @@ +# Threads Table Compact Redesign Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Make the Threads leaderboard a polished scan-first table without changing its data, virtualization, expansion, or privacy contracts. + +**Architecture:** Keep the existing `ThreadAccordionGrid` and TanStack table model. Define presentation defaults alongside Threads orchestration, give shared thread columns intentional sizes and human-readable cells, and fix alignment/styling inside the Threads CSS module. Version the local preference key so the compact defaults reach existing installations. + +**Tech Stack:** React 19, TypeScript, TanStack React Table, TanStack React Virtual, CSS Modules, Vitest/Testing Library, Playwright, Vite. + +## Global Constraints + +- Keep every advanced column available from **Columns**. +- Preserve aggregate-only data, API schemas, URL state, pagination, exports, and inline call expansion. +- Preserve dense/roomy modes, keyboard interaction, accessible names, and narrow-screen behavior. +- Rebuild packaged dashboard assets instead of editing generated JavaScript. +- Use only synthetic test data and screenshots. + +--- + +### Task 1: Pin The Scan-First Presentation Contract + +**Files:** +- Modify: `frontend/dashboard/src/features/shared/tables.test.ts` +- Modify: `frontend/dashboard/src/features/threads/ThreadAccordionGrid.test.tsx` +- Modify: `frontend/dashboard/src/App.threads.test.tsx` + +**Interfaces:** +- Consumes: `threadColumns`, `ThreadAccordionGrid`, and the Threads workspace. +- Produces: regression coverage for column widths, default visibility, humanized unloaded metadata, and full thread identity access. + +- [ ] **Step 1: Write failing tests** + +Add assertions equivalent to: + +```ts +expect(threadColumns.find(column => column.id === 'name')?.size).toBe(280); +expect(screen.getByRole('columnheader', { name: /Thread/i })).toBeInTheDocument(); +expect(screen.queryByRole('columnheader', { name: /Models/i })).not.toBeInTheDocument(); +expect(screen.getByTitle(fixtureThread.name)).toBeInTheDocument(); +expect(screen.getByText('Mostly user')).toBeInTheDocument(); +``` + +- [ ] **Step 2: Verify RED** + +Run: + +```bash +npm --workspace frontend/dashboard test -- src/features/shared/tables.test.ts src/features/threads/ThreadAccordionGrid.test.tsx src/App.threads.test.tsx +``` + +Expected: FAIL because the columns have default widths, all columns are visible, identifiers lack a title, and initiator text is raw. + +### Task 2: Implement The Compact Grid + +**Files:** +- Modify: `frontend/dashboard/src/features/shared/tables.tsx` +- Modify: `frontend/dashboard/src/features/threads/ThreadsPage.tsx` +- Modify: `frontend/dashboard/src/features/threads/ThreadAccordionGrid.tsx` +- Modify: `frontend/dashboard/src/features/threads/ThreadsPage.module.css` +- Modify: `docs/dashboard-guide.md` +- Regenerate: `src/codex_usage_tracker/plugin_data/dashboard/react/assets/ThreadsPage.js` + +**Interfaces:** +- Produces: `threadDefaultColumnVisibility: VisibilityState` in Threads orchestration. +- Preserves: `ThreadAccordionGridProps`, query paging, row virtualization, and explicit child-call actions. + +- [ ] **Step 1: Add intentional column definitions and defaults** + +Use explicit sizes and cells, for example: + +```tsx +{ + accessorKey: 'name', + header: 'Thread', + size: 280, + minSize: 220, + cell: info => {String(info.getValue())}, +} +``` + +Set nonessential column visibility to `false`, pass it to `useEvidenceGridPreferences`, and use a versioned Threads preference key. + +- [ ] **Step 2: Align and style the custom grid** + +Move the disclosure chevron into the first visible grid cell. Add CSS that resets header buttons, truncates cells, freezes the identity column, preserves hover/expanded backgrounds, and provides `:focus-visible` outlines. + +- [ ] **Step 3: Verify GREEN and rebuild** + +Run: + +```bash +npm --workspace frontend/dashboard test -- src/features/shared/tables.test.ts src/features/threads/ThreadAccordionGrid.test.tsx src/App.threads.test.tsx +npm --workspace frontend/dashboard run typecheck +npm --workspace frontend/dashboard run build +``` + +Expected: all commands PASS and only Threads packaged assets change. + +- [ ] **Step 4: Run browser and full gates** + +Verify the branch dashboard at desktop and narrow widths, then run: + +```bash +/Users/Monsky/.codex/bin/codex-task dashboard-verify --json +``` + +Expected: PASS with no browser console errors and explicit 100-call pagination retained. + +- [ ] **Step 5: Publish and merge** + +Stage only intended files, commit with Conventional Commit style, push the branch, open a ready PR, wait for required checks, and squash merge after they pass. diff --git a/docs/superpowers/specs/2026-07-17-threads-table-compact-redesign-design.md b/docs/superpowers/specs/2026-07-17-threads-table-compact-redesign-design.md new file mode 100644 index 00000000..aaabed3c --- /dev/null +++ b/docs/superpowers/specs/2026-07-17-threads-table-compact-redesign-design.md @@ -0,0 +1,32 @@ +# Threads Table Compact Redesign + +**Date:** 2026-07-17 +**Status:** Approved +**Scope:** React dashboard Threads table presentation + +## Problem + +The custom virtualized Threads grid does not inherit the dashboard's normal sortable-header styling. Native browser buttons therefore appear in the header, the disclosure chevron shifts row cells out of alignment, all twenty columns render by default, and long thread identifiers wrap across multiple lines. Summary-only API rows also show unloaded model and effort values as prominent action-like labels. Together these defects make the table read like an unfinished debug surface. + +## Chosen Design + +The table remains a virtualized, single-open thread accordion. Its default presentation becomes scan-first: + +- show Thread, Latest, Turns, Total Tokens, Cache %, Context %, Est. Cost, Codex Credits, and Cold Resume Risk by default; +- keep every other metric available through the existing **Columns** control; +- reset sortable header buttons to the dashboard visual language, including hover and focus-visible states; +- place the disclosure chevron inside the identity cell so headers and rows share the same column boundaries; +- keep the identity column frozen while horizontally scrolling advanced columns; +- truncate long identifiers to one line and expose the full value through the title tooltip; +- render unavailable model, effort, and initiator metadata as quiet, human-readable placeholders instead of blue action-like pills; +- retain dense/roomy modes, keyboard disclosure, virtualization, URL state, and explicit call actions. + +The preference storage key is versioned for this redesign so existing all-columns-visible state does not prevent the new default from taking effect. Users can still restore or customize visibility normally. + +## Accessibility And Responsive Contract + +Sortable headers retain specific accessible names and `aria-sort`. The frozen identity cell, disclosure state, and full thread-name tooltip do not alter keyboard order. Focus indicators remain visible, color is not the only state signal, and narrow screens continue collapsing the leaderboard to the identity column while expanded call evidence stacks vertically. + +## Verification + +Synthetic tests must cover the new default visibility, column sizing, humanized metadata, full-name access, and disclosure alignment structure. Browser verification must confirm that native gray controls are gone, only the scan-first columns appear initially, long IDs no longer wrap, Columns can reveal advanced metrics, expansion loads 100 calls at a time, horizontal scrolling retains identity, and the console has no errors. diff --git a/frontend/dashboard/src/App.calls-detail.test.tsx b/frontend/dashboard/src/App.calls-detail.test.tsx index b9ebf5d7..d2d86490 100644 --- a/frontend/dashboard/src/App.calls-detail.test.tsx +++ b/frontend/dashboard/src/App.calls-detail.test.tsx @@ -217,16 +217,16 @@ it('sorts table columns through accessible header controls', () => { fireEvent.click(within(screen.getByRole('navigation', { name: 'Primary' })).getByRole('button', { name: /^Threads$/i })); const threadsTable = screen.getByRole('treegrid', { name: 'Thread leaderboard' }); expect(within(threadsTable).getByRole('button', { name: /Sort by Latest/i })).toBeInTheDocument(); - expect(within(threadsTable).getByRole('button', { name: /Sort by Avg Gap/i })).toBeInTheDocument(); - expect(within(threadsTable).getByRole('button', { name: /Sort by Initiated/i })).toBeInTheDocument(); - expect(within(threadsTable).getByRole('button', { name: /Sort by Reasoning Output/i })).toBeInTheDocument(); + expect(within(threadsTable).queryByRole('button', { name: /Sort by Avg Gap/i })).not.toBeInTheDocument(); + expect(within(threadsTable).queryByRole('button', { name: /Sort by Initiated/i })).not.toBeInTheDocument(); + expect(within(threadsTable).queryByRole('button', { name: /Sort by Reasoning Output/i })).not.toBeInTheDocument(); fireEvent.click(screen.getByRole('button', { name: /Columns/i })); expect(screen.getByRole('checkbox', { name: 'Thread' })).toBeDisabled(); - expect(screen.getByRole('checkbox', { name: 'Reasoning Output' })).toBeChecked(); + expect(screen.getByRole('checkbox', { name: 'Reasoning Output' })).not.toBeChecked(); fireEvent.click(screen.getByRole('checkbox', { name: 'Reasoning Output' })); - expect(screen.queryByRole('columnheader', { name: /Reasoning Output/i })).not.toBeInTheDocument(); + expect(screen.getByRole('columnheader', { name: /Reasoning Output/i })).toBeInTheDocument(); fireEvent.click(screen.getByRole('checkbox', { name: 'Productivity' })); - expect(screen.queryByRole('columnheader', { name: /Productivity/i })).not.toBeInTheDocument(); + expect(screen.getByRole('columnheader', { name: /Productivity/i })).toBeInTheDocument(); }); it('keeps selected-call thread context modular in the calls drill-down', () => { diff --git a/frontend/dashboard/src/App.threads-live.test.tsx b/frontend/dashboard/src/App.threads-live.test.tsx index 33804c84..880be7c2 100644 --- a/frontend/dashboard/src/App.threads-live.test.tsx +++ b/frontend/dashboard/src/App.threads-live.test.tsx @@ -129,7 +129,7 @@ describe('React dashboard threads live queries', () => { expect(screen.queryByRole('region', { name: /Calls for never-present-thread/i })).not.toBeInTheDocument(); }); - it('isolates progressive thread call pages and retries a partial result', async () => { + it('loads additional thread calls only on request and retries a partial result', async () => { let resolveOldThread: ((response: Response) => void) | undefined; let newThreadPageTwoAttempts = 0; const callRow = (id: string, thread: string, model: string) => ({ @@ -212,12 +212,14 @@ describe('React dashboard threads live queries', () => { const grid = await screen.findByRole('treegrid', { name: 'Thread leaderboard' }); await within(grid).findByRole('row', { name: /Collapse calls for old-thread/i }); fireEvent.click(await within(grid).findByRole('row', { name: /new-thread/i })); - await screen.findByText(/Partial result:/i, {}, { timeout: 3_000 }); - expect(screen.getByText('2 of 3 calls loaded')).toBeInTheDocument(); + expect(await screen.findByText('2 of 3 calls loaded')).toBeInTheDocument(); + expect(newThreadPageTwoAttempts).toBe(0); resolveOldThread?.(callsPage('old-thread', [callRow('old-1', 'old-thread', 'old-model')], 0, false)); await waitFor(() => expect(screen.queryByText('old-model / high')).not.toBeInTheDocument()); expect(screen.getAllByText('new-model-boundary / high')).toHaveLength(1); + fireEvent.click(screen.getByRole('button', { name: 'Load 100 more thread calls' })); + await screen.findByText(/Partial result:/i, {}, { timeout: 3_000 }); fireEvent.click(await screen.findByRole('button', { name: 'Retry loading thread calls' })); await screen.findByText('3 of 3 calls loaded'); expect(screen.getAllByText('new-model-boundary / high')).toHaveLength(1); diff --git a/frontend/dashboard/src/App.threads.test.tsx b/frontend/dashboard/src/App.threads.test.tsx index 1b15d8bf..60f67156 100644 --- a/frontend/dashboard/src/App.threads.test.tsx +++ b/frontend/dashboard/src/App.threads.test.tsx @@ -63,6 +63,22 @@ describe('React dashboard threads workspace', () => { }); }); + it('starts with scan-first columns while keeping advanced metrics available', () => { + render(); + fireEvent.click(screen.getByRole('button', { name: /^Threads$/i })); + + const table = screen.getByRole('treegrid', { name: 'Thread leaderboard' }); + expect(within(table).getByRole('columnheader', { name: 'Thread' })).toBeInTheDocument(); + expect(within(table).getByRole('columnheader', { name: 'Total Tokens' })).toBeInTheDocument(); + expect(within(table).queryByRole('columnheader', { name: 'Models' })).not.toBeInTheDocument(); + + fireEvent.click(screen.getByRole('button', { name: 'Columns' })); + const modelsToggle = screen.getByRole('checkbox', { name: 'Models' }); + expect(modelsToggle).not.toBeChecked(); + fireEvent.click(modelsToggle); + expect(within(table).getByRole('columnheader', { name: 'Models' })).toBeInTheDocument(); + }); + it('hydrates legacy expanded thread URL state', async () => { window.history.replaceState(null, '', '/?view=threads&threads=thread-7c2b,thread-9f3a'); diff --git a/frontend/dashboard/src/features/shared/tables.test.ts b/frontend/dashboard/src/features/shared/tables.test.ts index e9b1dc6d..c8f5ccb6 100644 --- a/frontend/dashboard/src/features/shared/tables.test.ts +++ b/frontend/dashboard/src/features/shared/tables.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import type { CallRow } from '../../api/types'; -import { callActionColumn, callColumns, callCsvColumns, callSignalPucks } from './tables'; +import { callActionColumn, callColumns, callCsvColumns, callSignalPucks, threadColumns } from './tables'; import { rowsToCsv } from './exportCsv'; describe('call CSV columns', () => { @@ -188,3 +188,17 @@ describe('call signal pucks', () => { expect(pucks.visible.map(puck => puck.label)).toEqual(['Cache Risk', 'Context Heavy', 'High Cost']); }); }); + +describe('thread table columns', () => { + it('uses scan-friendly widths for the compact leaderboard', () => { + const column = (accessorKey: string) => threadColumns.find(candidate => ( + 'accessorKey' in candidate && candidate.accessorKey === accessorKey + )); + + expect(column('name')).toMatchObject({ size: 280, minSize: 220 }); + expect(column('latestActivity')).toMatchObject({ size: 130 }); + expect(column('turns')).toMatchObject({ size: 82 }); + expect(column('totalTokens')).toMatchObject({ size: 118 }); + expect(column('cachePct')).toMatchObject({ size: 92 }); + }); +}); diff --git a/frontend/dashboard/src/features/shared/tables.tsx b/frontend/dashboard/src/features/shared/tables.tsx index c0f4abec..a3437538 100644 --- a/frontend/dashboard/src/features/shared/tables.tsx +++ b/frontend/dashboard/src/features/shared/tables.tsx @@ -271,91 +271,97 @@ function signalPuckAbbreviation(signal: string): string { } export const threadColumns: Array> = [ - { accessorKey: 'name', header: 'Thread' }, - { accessorKey: 'latestActivity', header: 'Latest' }, { - accessorKey: 'turns', - header: 'Turns', + accessorKey: 'name', header: 'Thread', size: 280, minSize: 220, maxSize: 360, + cell: info => { + const value = String(info.getValue()); + return {value}; + }, + }, + { accessorKey: 'latestActivity', header: 'Latest', size: 130, minSize: 116 }, + { + accessorKey: 'turns', header: 'Turns', size: 82, minSize: 72, cell: info => {formatNumber(Number(info.getValue()))}, }, - { accessorKey: 'totalDuration', header: 'Duration' }, + { accessorKey: 'totalDuration', header: 'Duration', size: 110 }, { - accessorKey: 'averageGap', - header: 'Avg Gap', + accessorKey: 'averageGap', header: 'Avg Gap', size: 110, cell: info => {String(info.getValue())}, }, { - accessorKey: 'initiatorSummary', - header: 'Initiated', - cell: info => {String(info.getValue())}, + accessorKey: 'initiatorSummary', header: 'Initiated', size: 116, + cell: info => { + const value = String(info.getValue()); + return {signalLabel(value)}; + }, }, { - accessorKey: 'modelSummary', - header: 'Models', - cell: info => {String(info.getValue())}, + accessorKey: 'modelSummary', header: 'Models', size: 190, + cell: info => { + const value = String(info.getValue()); + return value === 'Load thread calls' + ? + : {value}; + }, }, - { accessorKey: 'effortSummary', header: 'Effort Mix' }, { - accessorKey: 'totalTokens', - header: 'Total Tokens', + accessorKey: 'effortSummary', header: 'Effort Mix', size: 160, + cell: info => { + const value = String(info.getValue()); + return value === 'Load thread calls' + ? + : {value}; + }, + }, + { + accessorKey: 'totalTokens', header: 'Total Tokens', size: 118, cell: info => {formatCompact(Number(info.getValue()))}, }, { - accessorKey: 'cachedInput', - header: 'Cached Input', + accessorKey: 'cachedInput', header: 'Cached Input', size: 118, cell: info => {formatCompact(Number(info.getValue()))}, }, { - accessorKey: 'uncachedInput', - header: 'Uncached Input', + accessorKey: 'uncachedInput', header: 'Uncached Input', size: 124, cell: info => {formatCompact(Number(info.getValue()))}, }, { - accessorKey: 'outputTokens', - header: 'Output Tokens', + accessorKey: 'outputTokens', header: 'Output Tokens', size: 116, cell: info => {formatCompact(Number(info.getValue()))}, }, { - accessorKey: 'reasoningOutput', - header: 'Reasoning Output', + accessorKey: 'reasoningOutput', header: 'Reasoning Output', size: 130, cell: info => {formatCompact(Number(info.getValue()))}, }, { - accessorKey: 'cost', - header: 'Est. Cost', + accessorKey: 'cost', header: 'Est. Cost', size: 100, cell: info => {money(Number(info.getValue()))}, }, { - accessorKey: 'credits', - header: 'Codex Credits', + accessorKey: 'credits', header: 'Codex Credits', size: 112, cell: info => {formatCompact(Number(info.getValue()))}, }, { - accessorKey: 'cachePct', - header: 'Cache %', + accessorKey: 'cachePct', header: 'Cache %', size: 92, cell: info => {pct(Number(info.getValue()))}, }, { - accessorKey: 'contextPct', - header: 'Context %', + accessorKey: 'contextPct', header: 'Context %', size: 100, cell: info => { const value = info.getValue(); return {typeof value === 'number' ? pct(value) : '-'}; }, }, { - accessorKey: 'costPerCall', - header: 'Cost / Call', + accessorKey: 'costPerCall', header: 'Cost / Call', size: 100, cell: info => {money(Number(info.getValue()))}, }, { - accessorKey: 'coldResumeRisk', - header: 'Cold Resume Risk', + accessorKey: 'coldResumeRisk', header: 'Cold Resume Risk', size: 132, cell: info => {String(info.getValue())}, }, { - accessorKey: 'productivity', - header: 'Productivity', + accessorKey: 'productivity', header: 'Productivity', size: 108, cell: info => {Number(info.getValue())}, }, ]; @@ -385,14 +391,8 @@ export const threadColumnChoices: ColumnChoice[] = [ ]; function riskTone(value: string): 'green' | 'orange' | 'red' | 'neutral' { - if (value === 'High') { - return 'red'; - } - if (value === 'Medium') { - return 'orange'; - } - if (value === 'Low') { - return 'green'; - } + if (value === 'High') return 'red'; + if (value === 'Medium') return 'orange'; + if (value === 'Low') return 'green'; return 'neutral'; } diff --git a/frontend/dashboard/src/features/threads/ThreadAccordionGrid.module.css b/frontend/dashboard/src/features/threads/ThreadAccordionGrid.module.css new file mode 100644 index 00000000..444afbd6 --- /dev/null +++ b/frontend/dashboard/src/features/threads/ThreadAccordionGrid.module.css @@ -0,0 +1,239 @@ +.accordionGrid { min-width: 0; } + +.visuallyHidden { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +.accordionScroller { + position: relative; + height: 620px; + overflow: auto; + border: 1px solid var(--line-subtle, var(--dashboard-border)); + border-radius: 8px; + background: var(--surface-panel, var(--dashboard-surface)); +} + +.accordionHeaderGroup { + position: sticky; + z-index: 4; + top: 0; +} + +.accordionHeader { + display: flex; + min-width: max(720px, 100%); + min-height: 42px; + color: var(--ink-muted, var(--dashboard-muted)); + background: var(--surface-subtle, #eef1f5); + border-bottom: 1px solid var(--line-subtle, var(--dashboard-border)); + font-size: 11px; + font-weight: 750; +} + +.accordionHeader > div, +.threadRow > div[role="gridcell"] { + display: flex; + flex: 1 0 auto; + align-items: center; + box-sizing: border-box; + min-width: 0; + overflow: hidden; +} + +.sortHeader { + display: flex; + width: 100%; + min-width: 0; + align-items: center; + gap: 6px; + padding: 0; + color: inherit; + background: transparent; + border: 0; + border-radius: 5px; + font: inherit; + font-weight: inherit; + text-align: left; + cursor: pointer; +} + +.sortHeader:hover { + color: var(--signal-info-ink, var(--dashboard-accent-strong)); +} + +.sortHeader:focus-visible { + outline: 2px solid var(--signal-info, var(--dashboard-accent)); + outline-offset: 2px; +} + +.headerLabel, +.threadCellContent { + display: block; + flex: 1 1 auto; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.sortIndicator { + flex: 0 0 auto; + margin-left: auto; + opacity: .65; +} + +.disclosureSpacer, +.disclosureChevron { + flex: 0 0 16px; + width: 16px; +} + +.identityHeaderCell, +.threadIdentityCell { + position: sticky; + z-index: 5; + left: 0; + background: inherit; + box-shadow: 1px 0 0 var(--line-subtle, var(--dashboard-border)), 8px 0 14px -14px currentColor; +} + +.identityHeaderCell { + z-index: 6; + background: var(--surface-subtle, #eef1f5); +} + +.threadIdentityCell { gap: 6px; } + +.threadRow :global(.thread-name-cell), +.threadRow :global(.model-pill), +.threadRow :global(.status-badge) { + display: block; + width: 100%; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.threadRow :global(.table-placeholder) { + color: var(--ink-muted, var(--dashboard-muted)); + font-weight: 700; +} + +.accordionCanvas { position: relative; min-width: max(720px, 100%); } +.threadCallsRegion { position: relative; } + +.accordionScroller[data-density="compact"] .accordionHeader > div, +.accordionScroller[data-density="compact"] .threadRow > div[role="gridcell"] { padding: 6px 8px; } + +.accordionScroller[data-density="comfortable"] .accordionHeader > div, +.accordionScroller[data-density="comfortable"] .threadRow > div[role="gridcell"] { padding: 12px; } + +.accordionItem { + position: absolute; + inset-inline: 0; + display: grid; + min-width: max(720px, 100%); + box-sizing: border-box; +} + +.threadRow { + display: flex; + min-height: 52px; + cursor: pointer; + background: var(--surface-panel, var(--dashboard-surface)); + border-bottom: 1px solid var(--line-subtle, var(--dashboard-border)); +} + +.threadRow:hover { background: var(--surface-subtle, #f5f7fa); } + +.threadRow:focus-visible { + z-index: 3; + outline: 3px solid var(--signal-info, var(--dashboard-accent)); + outline-offset: -3px; +} + +.expandedThreadRow { + box-shadow: inset 4px 0 0 var(--signal-info, var(--dashboard-accent)); + background: var(--surface-selected, var(--dashboard-surface-soft)); +} + +.disclosureChevron { font-size: 20px; line-height: 1; text-align: center; transition: transform 120ms ease; } +.expandedThreadRow .disclosureChevron { transform: rotate(90deg); } + +.threadExpansionSummary, +.threadCallEvidence, +.threadLoadStatus { + padding: 12px 16px; + border-bottom: 1px solid var(--line-subtle, var(--dashboard-border)); + background: var(--surface-panel, var(--dashboard-surface)); +} + +.accordionScroller[data-density="compact"] .threadExpansionSummary, +.accordionScroller[data-density="compact"] .threadCallEvidence, +.accordionScroller[data-density="compact"] .threadLoadStatus { padding: 8px 12px; } + +.accordionScroller[data-density="comfortable"] .threadExpansionSummary, +.accordionScroller[data-density="comfortable"] .threadCallEvidence, +.accordionScroller[data-density="comfortable"] .threadLoadStatus { padding: 16px 18px; } + +.threadExpansionSummary { display: grid; gap: 10px; } +.threadExpansionHeader { display: flex; justify-content: space-between; gap: 12px; align-items: center; } +.threadExpansionHeader > div:first-child { display: grid; gap: 4px; } +.snapshotLabel { width: fit-content; padding: 2px 7px; border-radius: 999px; background: var(--surface-selected, var(--dashboard-surface-soft)); } +.threadSummaryStrip { display: grid; grid-template-columns: repeat(8, minmax(92px, 1fr)); gap: 8px; margin: 0; } +.threadSummaryStrip > div { min-width: 0; } +.threadSummaryStrip dt { color: var(--ink-muted, var(--dashboard-muted)); font-size: 11px; } +.threadSummaryStrip dd { margin: 2px 0 0; font-size: 12px; font-weight: 600; } +.threadExpansionSummary span, +.threadCallIdentity span, +.threadCallSignals { color: var(--ink-muted, var(--dashboard-muted)); font-size: 12px; } +.threadCallControls { display: flex; gap: 8px; } +.threadCallControls label { display: grid; gap: 4px; font-size: 12px; } + +.threadCallEvidence { + display: grid; + grid-template-columns: minmax(180px, 1.4fr) repeat(3, minmax(100px, .8fr)) auto; + gap: 10px; + align-items: center; +} + +.threadCallIdentity, +.threadCallSignals { display: grid; gap: 4px; } +.threadCallActions { display: flex; gap: 6px; } +.threadCallRecommendation { grid-column: 1 / -1; margin: 0; } +.threadContextBar { grid-column: 1 / -1; height: 4px; overflow: hidden; border-radius: 2px; background: var(--surface-selected, var(--dashboard-surface-soft)); } +.threadContextBar > span { display: block; height: 100%; } +.threadLoadStatus { display: flex; min-height: 52px; gap: 10px; align-items: center; color: var(--ink-muted, var(--dashboard-muted)); } + +@media (prefers-reduced-motion: reduce) { + .disclosureChevron { transition: none; } +} + +@media (max-width: 760px) { + .accordionHeader, + .accordionItem { min-width: 0; } + .threadRow > div[role="gridcell"]:not(:first-of-type), + .accordionHeader > div:not(:first-child) { display: none; } + .threadRow > div[role="gridcell"]:first-of-type, + .accordionHeader > div:first-child { width: 100% !important; } + .identityHeaderCell, + .threadIdentityCell { position: static; } + .threadExpansionSummary, + .threadCallEvidence { grid-template-columns: minmax(0, 1fr); } + .threadExpansionHeader { align-items: stretch; } + .threadSummaryStrip { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .threadCallControls { display: grid; grid-template-columns: 1fr 1fr; } + .threadCallControls select { min-height: 44px; } + .threadCallEvidence button, + .threadExpansionSummary button, + .threadLoadStatus button { min-height: 44px; } +} diff --git a/frontend/dashboard/src/features/threads/ThreadAccordionGrid.test.tsx b/frontend/dashboard/src/features/threads/ThreadAccordionGrid.test.tsx index e8a47c94..f3c16da8 100644 --- a/frontend/dashboard/src/features/threads/ThreadAccordionGrid.test.tsx +++ b/frontend/dashboard/src/features/threads/ThreadAccordionGrid.test.tsx @@ -25,6 +25,8 @@ const defaultProps: ThreadAccordionGridProps = { expandedThreadName: null, expandedCalls: [], totalCallCount: 0, + loadMoreCallCount: 100, + canLoadMoreCalls: false, loadingCalls: false, loadingMoreCalls: false, partialError: null, @@ -32,6 +34,7 @@ const defaultProps: ThreadAccordionGridProps = { callSortDirection: 'desc', onToggleThread: vi.fn(), onRetryCalls: vi.fn(), + onLoadMoreCalls: vi.fn(), onCallSortChange: vi.fn(), onCallSortDirectionChange: vi.fn(), onOpenInvestigator: vi.fn(), @@ -74,6 +77,29 @@ it('treats a real browser double-click sequence as one logical toggle', () => { expect(onOpenInvestigator).not.toHaveBeenCalled(); }); +it('aligns disclosure inside a truncated identity cell and quiets unloaded metadata', () => { + const lazyThread = { + ...fixtureThread, + name: '019f6393-a720-7da2-bb96-5ee5f4b55506', + initiatorSummary: 'mostly_user', + modelSummary: 'Load thread calls', + effortSummary: 'Load thread calls', + }; + renderGrid({ threads: [lazyThread] }); + + const row = screen.getByRole('row', { name: `Expand calls for ${lazyThread.name}` }); + const identityCell = within(row).getAllByRole('gridcell')[0]; + expect(within(identityCell).getByText('›')).toBeInTheDocument(); + expect(screen.getByTitle(lazyThread.name)).toHaveTextContent(lazyThread.name); + expect(screen.getByText('Mostly User')).toBeInTheDocument(); + expect(screen.getByTitle('Expand this thread to load its model mix')).toHaveTextContent('—'); + expect(screen.getByTitle('Expand this thread to load its effort mix')).toHaveTextContent('—'); + expect(screen.queryByText('Load thread calls')).not.toBeInTheDocument(); + + const threadHeader = screen.getByRole('columnheader', { name: 'Thread' }); + expect(threadHeader).toHaveStyle({ width: '280px' }); +}); + it('renders an associated expanded region and explicit child actions', () => { const onOpenInvestigator = vi.fn(); const onCopyCallLink = vi.fn(); diff --git a/frontend/dashboard/src/features/threads/ThreadAccordionGrid.tsx b/frontend/dashboard/src/features/threads/ThreadAccordionGrid.tsx index 0501fd65..142c5204 100644 --- a/frontend/dashboard/src/features/threads/ThreadAccordionGrid.tsx +++ b/frontend/dashboard/src/features/threads/ThreadAccordionGrid.tsx @@ -14,7 +14,7 @@ import { EvidenceGridControls } from '../explore/EvidenceGridControls'; import type { EvidenceGridPreferences } from '../explore/useEvidenceGridPreferences'; import { ThreadCallControls, ThreadCallEvidenceRow } from './ThreadAccordionRows'; import type { ThreadCallSortDirection, ThreadCallSortKey } from './threadsUrlState'; -import styles from './ThreadsPage.module.css'; +import styles from './ThreadAccordionGrid.module.css'; export type ThreadAccordionGridProps = { ariaLabel: string; @@ -26,6 +26,8 @@ export type ThreadAccordionGridProps = { expandedThreadName: string | null; expandedCalls: CallRow[]; totalCallCount: number; + loadMoreCallCount: number; + canLoadMoreCalls: boolean; loadingCalls: boolean; loadingMoreCalls: boolean; initialError?: string | null; @@ -36,6 +38,7 @@ export type ThreadAccordionGridProps = { viewportHeight?: number; onToggleThread(threadName: string): void; onRetryCalls(): void; + onLoadMoreCalls(): void; onCallSortChange(value: string): void; onCallSortDirectionChange(value: string): void; onOpenInvestigator(recordId: string): void; @@ -79,6 +82,8 @@ export function ThreadAccordionGrid({ expandedThreadName, expandedCalls, totalCallCount, + loadMoreCallCount, + canLoadMoreCalls, loadingCalls, loadingMoreCalls, initialError = null, @@ -89,6 +94,7 @@ export function ThreadAccordionGrid({ viewportHeight = 620, onToggleThread, onRetryCalls, + onLoadMoreCalls, onCallSortChange, onCallSortDirectionChange, onOpenInvestigator, @@ -194,10 +200,12 @@ export function ThreadAccordionGrid({ {table.getHeaderGroups()[0]?.headers.map(header => { const sorted = header.column.getIsSorted(); const label = headerText(header.column.columnDef.header, header.column.id); - return
- {header.column.getCanSort() ? : flexRender(header.column.columnDef.header, header.getContext())}
; })} @@ -240,10 +248,13 @@ export function ThreadAccordionGrid({ }} onKeyDown={event => toggleKeyDown(event, item.thread.name, virtualItem.index)} > - - {row.getVisibleCells().map(cell =>
- {flexRender(cell.column.columnDef.cell, cell.getContext())} -
)} + {row.getVisibleCells().map(cell => { + const identity = cell.column.id === 'name'; + return
+ {identity ? : null} + {flexRender(cell.column.columnDef.cell, cell.getContext())} +
; + })} ; } if (item.kind === 'summary') { @@ -280,6 +291,15 @@ export function ThreadAccordionGrid({ {partialError || initialError ? <>{partialError ?? initialError} : null} {!partialError && !initialError && loadingCalls ? Loading calls : null} {!partialError && !initialError && loadingMoreCalls ? Loading more calls : null} + {!partialError && !initialError && !loadingCalls && canLoadMoreCalls ? : null} {!partialError && !initialError && !loadingCalls && !loadingMoreCalls && !expandedCalls.length ? No aggregate calls are available for this thread. : null} {!partialError && !initialError && !loadingCalls && !loadingMoreCalls && expandedCalls.length && expandedCalls.length < totalCallCount ? {totalCallCount - expandedCalls.length} more calls available : null} {!partialError && !initialError && !loadingCalls && !loadingMoreCalls && expandedCalls.length >= totalCallCount && expandedCalls.length ? All loaded calls visible : null} diff --git a/frontend/dashboard/src/features/threads/ThreadAccordionRows.tsx b/frontend/dashboard/src/features/threads/ThreadAccordionRows.tsx index 483873b9..738763a8 100644 --- a/frontend/dashboard/src/features/threads/ThreadAccordionRows.tsx +++ b/frontend/dashboard/src/features/threads/ThreadAccordionRows.tsx @@ -11,7 +11,7 @@ import { timelineWidth, } from './threadAnalysis'; import type { ThreadCallSortDirection, ThreadCallSortKey } from './threadsUrlState'; -import styles from './ThreadsPage.module.css'; +import styles from './ThreadAccordionGrid.module.css'; export type ThreadCallControlsProps = { callSort: ThreadCallSortKey; diff --git a/frontend/dashboard/src/features/threads/ThreadsExplorerView.tsx b/frontend/dashboard/src/features/threads/ThreadsExplorerView.tsx index feaa09af..e8c2be49 100644 --- a/frontend/dashboard/src/features/threads/ThreadsExplorerView.tsx +++ b/frontend/dashboard/src/features/threads/ThreadsExplorerView.tsx @@ -37,6 +37,7 @@ type ThreadsExplorerViewProps = { isFetching: boolean; isFetchingNextPage: boolean; isFetchNextPageError: boolean; + canLoadMore: boolean; count: number; hydrated: boolean; error: string | null; @@ -44,6 +45,7 @@ type ThreadsExplorerViewProps = { storedSnapshot: boolean; }; selectedCalls: CallRow[]; + callPageSize: number; displayedThreads: ThreadRow[]; totalMatchedThreads: number; canLoadMoreThreads: boolean; @@ -64,6 +66,7 @@ type ThreadsExplorerViewProps = { onSortingChange: OnChangeFn; onToggleThread(threadName: string): void; onRetryCalls(): void; + onLoadMoreCalls(): void; onLoadMoreThreads(): void; onCallSortChange(value: string): void; onCallSortDirectionChange(value: string): void; @@ -85,6 +88,7 @@ export function ThreadsExplorerView({ focusedState, selectedCallsState, selectedCalls, + callPageSize, displayedThreads, totalMatchedThreads, canLoadMoreThreads, @@ -105,6 +109,7 @@ export function ThreadsExplorerView({ onSortingChange, onToggleThread, onRetryCalls, + onLoadMoreCalls, onLoadMoreThreads, onCallSortChange, onCallSortDirectionChange, @@ -209,6 +214,8 @@ export function ThreadsExplorerView({ expandedThreadName={selected?.name ?? null} expandedCalls={selectedCalls} totalCallCount={selectedCallsState.count} + loadMoreCallCount={callPageSize} + canLoadMoreCalls={selectedCallsState.canLoadMore} loadingCalls={selectedCallsState.isFetching && !selectedCallsState.hydrated} loadingMoreCalls={selectedCallsState.isFetchingNextPage} initialError={selectedCallsState.initialError} @@ -218,6 +225,7 @@ export function ThreadsExplorerView({ callSortDirection={callSortDirection} onToggleThread={onToggleThread} onRetryCalls={onRetryCalls} + onLoadMoreCalls={onLoadMoreCalls} onCallSortChange={onCallSortChange} onCallSortDirectionChange={onCallSortDirectionChange} onOpenInvestigator={onOpenInvestigator} diff --git a/frontend/dashboard/src/features/threads/ThreadsPage.module.css b/frontend/dashboard/src/features/threads/ThreadsPage.module.css index c86ce1ab..f11b89a3 100644 --- a/frontend/dashboard/src/features/threads/ThreadsPage.module.css +++ b/frontend/dashboard/src/features/threads/ThreadsPage.module.css @@ -90,133 +90,6 @@ min-width: 0; } -.accordionGrid { min-width: 0; } - -.visuallyHidden { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border: 0; -} - -.accordionScroller { - position: relative; - height: 620px; - overflow: auto; - border: 1px solid var(--line-subtle, var(--dashboard-border)); - border-radius: 8px; - background: var(--surface-panel, var(--dashboard-surface)); -} - -.accordionHeaderGroup { - position: sticky; - z-index: 4; - top: 0; -} - -.accordionHeader { - display: flex; - min-width: 720px; - min-height: 42px; - background: var(--surface-panel, var(--dashboard-surface)); - border-bottom: 1px solid var(--line-subtle, var(--dashboard-border)); -} - -.accordionHeader > div, -.threadRow > div[role="gridcell"] { box-sizing: border-box; } -.accordionHeader button { width: 100%; text-align: left; } -.accordionCanvas { position: relative; } -.threadCallsRegion { position: relative; } - -.accordionScroller[data-density="compact"] .accordionHeader > div, -.accordionScroller[data-density="compact"] .threadRow > div[role="gridcell"] { padding: 6px 8px; } - -.accordionScroller[data-density="comfortable"] .accordionHeader > div, -.accordionScroller[data-density="comfortable"] .threadRow > div[role="gridcell"] { padding: 12px; } - -.accordionItem { - position: absolute; - inset-inline: 0; - display: grid; - min-width: 720px; - box-sizing: border-box; -} - -.threadRow { - display: flex; - min-height: 52px; - cursor: pointer; - border-bottom: 1px solid var(--line-subtle, var(--dashboard-border)); -} - -.threadRow:focus-visible { - z-index: 3; - outline: 3px solid var(--signal-info, var(--dashboard-accent)); - outline-offset: -3px; -} - -.expandedThreadRow { - box-shadow: inset 4px 0 0 var(--signal-info, var(--dashboard-accent)); - background: var(--surface-selected, var(--dashboard-surface-soft)); -} - -.disclosureChevron { width: 22px; padding: 10px 0 10px 8px; font-size: 22px; transition: transform 120ms ease; } -.expandedThreadRow .disclosureChevron { transform: rotate(90deg); } - -@media (prefers-reduced-motion: reduce) { - .disclosureChevron { transition: none; } -} - -.threadExpansionSummary, -.threadCallEvidence, -.threadLoadStatus { - padding: 12px 16px; - border-bottom: 1px solid var(--line-subtle, var(--dashboard-border)); - background: var(--surface-panel, var(--dashboard-surface)); -} - -.accordionScroller[data-density="compact"] .threadExpansionSummary, -.accordionScroller[data-density="compact"] .threadCallEvidence, -.accordionScroller[data-density="compact"] .threadLoadStatus { padding: 8px 12px; } - -.accordionScroller[data-density="comfortable"] .threadExpansionSummary, -.accordionScroller[data-density="comfortable"] .threadCallEvidence, -.accordionScroller[data-density="comfortable"] .threadLoadStatus { padding: 16px 18px; } - -.threadExpansionSummary { display: grid; gap: 10px; } -.threadExpansionHeader { display: flex; justify-content: space-between; gap: 12px; align-items: center; } -.threadExpansionHeader > div:first-child { display: grid; gap: 4px; } -.snapshotLabel { width: fit-content; padding: 2px 7px; border-radius: 999px; background: var(--surface-selected, var(--dashboard-surface-soft)); } -.threadSummaryStrip { display: grid; grid-template-columns: repeat(8, minmax(92px, 1fr)); gap: 8px; margin: 0; } -.threadSummaryStrip > div { min-width: 0; } -.threadSummaryStrip dt { color: var(--ink-muted, var(--dashboard-muted)); font-size: 11px; } -.threadSummaryStrip dd { margin: 2px 0 0; font-size: 12px; font-weight: 600; } -.threadExpansionSummary span, -.threadCallIdentity span, -.threadCallSignals { color: var(--ink-muted, var(--dashboard-muted)); font-size: 12px; } -.threadCallControls { display: flex; gap: 8px; } -.threadCallControls label { display: grid; gap: 4px; font-size: 12px; } - -.threadCallEvidence { - display: grid; - grid-template-columns: minmax(180px, 1.4fr) repeat(3, minmax(100px, .8fr)) auto; - gap: 10px; - align-items: center; -} - -.threadCallIdentity, -.threadCallSignals { display: grid; gap: 4px; } -.threadCallActions { display: flex; gap: 6px; } -.threadCallRecommendation { grid-column: 1 / -1; margin: 0; } -.threadContextBar { grid-column: 1 / -1; height: 4px; overflow: hidden; border-radius: 2px; background: var(--surface-selected, var(--dashboard-surface-soft)); } -.threadContextBar > span { display: block; height: 100%; } -.threadLoadStatus { display: flex; min-height: 52px; gap: 10px; align-items: center; color: var(--ink-muted, var(--dashboard-muted)); } - .gridFooter { justify-content: space-between; min-height: 44px; @@ -262,19 +135,4 @@ align-items: flex-start; } - .accordionHeader, - .accordionItem { min-width: 0; } - .threadRow > div[role="gridcell"]:not(:first-of-type), - .accordionHeader > div:not(:first-child) { display: none; } - .threadRow > div[role="gridcell"]:first-of-type, - .accordionHeader > div:first-child { width: 100% !important; } - .threadExpansionSummary, - .threadCallEvidence { grid-template-columns: minmax(0, 1fr); } - .threadExpansionHeader { align-items: stretch; } - .threadSummaryStrip { grid-template-columns: repeat(2, minmax(0, 1fr)); } - .threadCallControls { display: grid; grid-template-columns: 1fr 1fr; } - .threadCallControls select { min-height: 44px; } - .threadCallEvidence button, - .threadExpansionSummary button, - .threadLoadStatus button { min-height: 44px; } } diff --git a/frontend/dashboard/src/features/threads/ThreadsPage.tsx b/frontend/dashboard/src/features/threads/ThreadsPage.tsx index f3220d7c..a6f066fc 100644 --- a/frontend/dashboard/src/features/threads/ThreadsPage.tsx +++ b/frontend/dashboard/src/features/threads/ThreadsPage.tsx @@ -22,7 +22,7 @@ import { threadSummaryToRow, type ExploreThreadRow } from './threadSummaryAdapte import { threadsEndpointState } from './threadsEndpointState'; import { buildCacheFrontierSpec, buildThreadLifecycleSpec } from './threadVisualizations'; import { compareCallTimeDescending, sortThreadCalls, threadLabelsMatch } from './threadAnalysis'; -import { dedupeThreadCallPages, shouldFetchNextThreadCallPage } from './threadCallLoading'; +import { dedupeThreadCallPages } from './threadCallLoading'; import { ThreadsExplorerView } from './ThreadsExplorerView'; import { useThreadsPageControls } from './useThreadsPageControls'; @@ -40,6 +40,21 @@ type ThreadsPageProps = { onNavigateView: (view: 'calls' | 'threads') => void; }; +const threadCallsPageSize = 100; +const threadDefaultColumnVisibility = { + totalDuration: false, + averageGap: false, + initiatorSummary: false, + modelSummary: false, + effortSummary: false, + cachedInput: false, + uncachedInput: false, + outputTokens: false, + reasoningOutput: false, + costPerCall: false, + productivity: false, +}; + export function threadsForCurrentUrl(threads: ThreadRow[], globalQuery = ''): ThreadRow[] { return sortThreads( filterThreads(threads, { @@ -94,9 +109,9 @@ export function ThreadsPage({ updateLocalQuery, updateRiskFilter, updateThreadSorting, clearThreadFilters, toggleThread, updateThreadCallSort, updateThreadCallSortDirection, } = useThreadsPageControls(globalQuery); - const gridPreferences = useEvidenceGridPreferences('codexUsageThreadsEvidenceGrid', { + const gridPreferences = useEvidenceGridPreferences('codexUsageThreadsEvidenceGridV2', { density: 'compact', - columnVisibility: {}, + columnVisibility: threadDefaultColumnVisibility, }); const endpointState = useMemo( @@ -185,6 +200,7 @@ export function ThreadsPage({ threadKey: selectedThreadKey, sort: threadCallSort === 'newest' ? 'time' : threadCallSort, direction: threadCallSortDirection, + pageSize: threadCallsPageSize, }), enabled: selectedThreadQueryEnabled, }); @@ -287,24 +303,6 @@ threadCallSortDirection, selectedThreadName, ]); - useEffect(() => { - if (!shouldFetchNextThreadCallPage({ - expanded: Boolean(selected), - enabled: selectedThreadQueryEnabled, - hasNextPage: Boolean(selectedThreadCallsQuery.hasNextPage), - isFetchingNextPage: selectedThreadCallsQuery.isFetchingNextPage, - isFetchNextPageError: selectedThreadCallsQuery.isFetchNextPageError, - })) return; - void selectedThreadCallsQuery.fetchNextPage(); - }, [ - selected, - selectedThreadCallsQuery.data, - selectedThreadCallsQuery.hasNextPage, - selectedThreadQueryEnabled, - selectedThreadCallsQuery.isFetchNextPageError, - selectedThreadCallsQuery.isFetchingNextPage, - ]); - function loadMoreThreads() { if (usingFocusedThreads && focusedThreadsQuery.hasNextPage) { void focusedThreadsQuery.fetchNextPage(); @@ -321,6 +319,11 @@ threadCallSortDirection, void selectedThreadCallsQuery.refetch(); } + function loadMoreSelectedThreadCalls() { + if (!selectedThreadCallsQuery.hasNextPage || selectedThreadCallsQuery.isFetchingNextPage) return; + void selectedThreadCallsQuery.fetchNextPage(); + } + return ( ({ id } as CallRow); const page = (rows: CallRow[]): ExploreCallsPage => ({ @@ -29,18 +29,4 @@ describe('thread call progressive loading', () => { expect(dedupeThreadCallPages([], [call('snapshot')]).map(row => row.id)).toEqual(['snapshot']); expect(dedupeThreadCallPages([page([call('live')])], [call('snapshot')]).map(row => row.id)).toEqual(['live']); }); - - it('continues only for an expanded, healthy, idle query with another page', () => { - const ready = { - expanded: true, - enabled: true, - hasNextPage: true, - isFetchingNextPage: false, - isFetchNextPageError: false, - }; - expect(shouldFetchNextThreadCallPage(ready)).toBe(true); - expect(shouldFetchNextThreadCallPage({ ...ready, expanded: false })).toBe(false); - expect(shouldFetchNextThreadCallPage({ ...ready, isFetchingNextPage: true })).toBe(false); - expect(shouldFetchNextThreadCallPage({ ...ready, isFetchNextPageError: true })).toBe(false); - }); }); diff --git a/frontend/dashboard/src/features/threads/threadCallLoading.ts b/frontend/dashboard/src/features/threads/threadCallLoading.ts index d02076b5..9750ba06 100644 --- a/frontend/dashboard/src/features/threads/threadCallLoading.ts +++ b/frontend/dashboard/src/features/threads/threadCallLoading.ts @@ -1,14 +1,6 @@ import type { CallRow } from '../../api/types'; import type { ExploreCallsPage } from '../../data/contracts/explore'; -export type ProgressiveThreadCallState = { - expanded: boolean; - enabled: boolean; - hasNextPage: boolean; - isFetchingNextPage: boolean; - isFetchNextPageError: boolean; -}; - export function dedupeThreadCallPages(pages: ExploreCallsPage[], fallback: CallRow[]): CallRow[] { const source = pages.length ? pages.flatMap(page => page.rows) : fallback; const seen = new Set(); @@ -18,11 +10,3 @@ export function dedupeThreadCallPages(pages: ExploreCallsPage[], fallback: CallR return true; }); } - -export function shouldFetchNextThreadCallPage(state: ProgressiveThreadCallState): boolean { - return state.expanded - && state.enabled - && state.hasNextPage - && !state.isFetchingNextPage - && !state.isFetchNextPageError; -} diff --git a/src/codex_usage_tracker/plugin_data/dashboard/react/assets/App.js b/src/codex_usage_tracker/plugin_data/dashboard/react/assets/App.js index b70b4803..bca90290 100644 --- a/src/codex_usage_tracker/plugin_data/dashboard/react/assets/App.js +++ b/src/codex_usage_tracker/plugin_data/dashboard/react/assets/App.js @@ -1,10 +1,10 @@ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ThreadsPage.js","assets/dashboard-react.js","assets/index.css","assets/useInfiniteQuery.js","assets/useBaseQuery.js","assets/exploreQueries.js","assets/queryOptions.js","assets/infiniteQueryOptions.js","assets/ExploreWorkspaceSwitcher.js","assets/Primitives.js","assets/Primitives.css","assets/EvidenceGridControls.js","assets/router.js","assets/EvidenceGridControls.css","assets/filtering.js","assets/threadSummaryAdapter.js","assets/UsageConstellation.js","assets/triangle-alert.js","assets/UsageConstellation.css","assets/StatusBadge.js","assets/PageLoadProgress.js","assets/PageLoadProgress.css","assets/index2.js","assets/rowActionEvents.js","assets/search.js","assets/locale-zh-Hans.js","assets/dashboardRouter.js","assets/ThreadsPage.css","assets/CacheContextPage.js","assets/LineChart.js","assets/DataTable.js","assets/overviewQueries.js","assets/gauge.js","assets/Panel.js","assets/useQuery.js","assets/tableActions.js","assets/UsageDrainPage.js","assets/chevron-right.js","assets/shield-check.js","assets/UsageDrainPage.css","assets/DiagnosticsPage.js","assets/diagnosticsQueries.js","assets/ReportsPage.js","assets/ReportsPage.css","assets/CallsPage.js","assets/EvidenceGrid.js","assets/contextEvidenceState.js","assets/lock-keyhole.js","assets/CallsPage.css","assets/OverviewPage.js","assets/OverviewPage.css","assets/InvestigatorPage.js","assets/InvestigatorPage.css","assets/CompressionLabPage.js","assets/CompressionLabPage.css","assets/ExploreRoutePage.js","assets/ExploreRoutePage.css","assets/CallInvestigatorPage.js","assets/SettingsPage.js","assets/SettingsPage.css"])))=>i.map(i=>d[i]); -var Hn=e=>{throw TypeError(e)};var Kt=(e,t,n)=>t.has(e)||Hn("Cannot "+n);var l=(e,t,n)=>(Kt(e,t,"read from private field"),n?n.call(e):t.get(e)),P=(e,t,n)=>t.has(e)?Hn("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),x=(e,t,n,a)=>(Kt(e,t,"write to private field"),a?a.call(e,n):t.set(e,n),n),V=(e,t,n)=>(Kt(e,t,"access private method"),n);var Ct=(e,t,n,a)=>({set _(r){x(e,t,r,n)},get _(){return l(e,t,a)}});import{r as C,j as c,_ as O}from"./dashboard-react.js";import{t as ys}from"./locale-zh-Hans.js";import{i as _s}from"./dashboardRouter.js";import{a9 as se}from"./router.js";/** +var qa=e=>{throw TypeError(e)};var Kt=(e,t,a)=>t.has(e)||qa("Cannot "+a);var l=(e,t,a)=>(Kt(e,t,"read from private field"),a?a.call(e):t.get(e)),P=(e,t,a)=>t.has(e)?qa("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,a),x=(e,t,a,n)=>(Kt(e,t,"write to private field"),n?n.call(e,a):t.set(e,a),a),V=(e,t,a)=>(Kt(e,t,"access private method"),a);var Ct=(e,t,a,n)=>({set _(r){x(e,t,r,a)},get _(){return l(e,t,n)}});import{r as C,j as c,_ as O}from"./dashboard-react.js";import{t as ys}from"./locale-zh-Hans.js";import{i as _s}from"./dashboardRouter.js";import{a9 as se}from"./router.js";/** * @license lucide-react v0.468.0 - ISC * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const Ss=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Fa=(...e)=>e.filter((t,n,a)=>!!t&&t.trim()!==""&&a.indexOf(t)===n).join(" ").trim();/** + */const Ss=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Dn=(...e)=>e.filter((t,a,n)=>!!t&&t.trim()!==""&&n.indexOf(t)===a).join(" ").trim();/** * @license lucide-react v0.468.0 - ISC * * This source code is licensed under the ISC license. @@ -14,12 +14,12 @@ var Hn=e=>{throw TypeError(e)};var Kt=(e,t,n)=>t.has(e)||Hn("Cannot "+n);var l=( * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const xs=C.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:n=2,absoluteStrokeWidth:a,className:r="",children:s,iconNode:i,...o},d)=>C.createElement("svg",{ref:d,...Cs,width:t,height:t,stroke:e,strokeWidth:a?Number(n)*24/Number(t):n,className:Fa("lucide",r),...o},[...i.map(([f,h])=>C.createElement(f,h)),...Array.isArray(s)?s:[s]]));/** + */const xs=C.forwardRef(({color:e="currentColor",size:t=24,strokeWidth:a=2,absoluteStrokeWidth:n,className:r="",children:s,iconNode:i,...o},d)=>C.createElement("svg",{ref:d,...Cs,width:t,height:t,stroke:e,strokeWidth:n?Number(a)*24/Number(t):a,className:Dn("lucide",r),...o},[...i.map(([f,h])=>C.createElement(f,h)),...Array.isArray(s)?s:[s]]));/** * @license lucide-react v0.468.0 - ISC * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const $=(e,t)=>{const n=C.forwardRef(({className:a,...r},s)=>C.createElement(xs,{ref:s,iconNode:t,className:Fa(`lucide-${Ss(e)}`,a),...r}));return n.displayName=`${e}`,n};/** + */const $=(e,t)=>{const a=C.forwardRef(({className:n,...r},s)=>C.createElement(xs,{ref:s,iconNode:t,className:Dn(`lucide-${Ss(e)}`,n),...r}));return a.displayName=`${e}`,a};/** * @license lucide-react v0.468.0 - ISC * * This source code is licensed under the ISC license. @@ -59,12 +59,12 @@ var Hn=e=>{throw TypeError(e)};var Kt=(e,t,n)=>t.has(e)||Hn("Cannot "+n);var l=( * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const As=$("Database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);/** + */const Ns=$("Database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);/** * @license lucide-react v0.468.0 - ISC * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const Ns=$("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);/** + */const As=$("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]]);/** * @license lucide-react v0.468.0 - ISC * * This source code is licensed under the ISC license. @@ -114,15 +114,15 @@ var Hn=e=>{throw TypeError(e)};var Kt=(e,t,n)=>t.has(e)||Hn("Cannot "+n);var l=( * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const qs=$("TimerReset",[["path",{d:"M10 2h4",key:"n1abiw"}],["path",{d:"M12 14v-4",key:"1evpnu"}],["path",{d:"M4 13a8 8 0 0 1 8-7 8 8 0 1 1-5.3 14L4 17.6",key:"1ts96g"}],["path",{d:"M9 17H4v5",key:"8t5av"}]]);/** + */const zs=$("TimerReset",[["path",{d:"M10 2h4",key:"n1abiw"}],["path",{d:"M12 14v-4",key:"1evpnu"}],["path",{d:"M4 13a8 8 0 0 1 8-7 8 8 0 1 1-5.3 14L4 17.6",key:"1ts96g"}],["path",{d:"M9 17H4v5",key:"8t5av"}]]);/** * @license lucide-react v0.468.0 - ISC * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const Hs=$("Workflow",[["rect",{width:"8",height:"8",x:"3",y:"3",rx:"2",key:"by2w9f"}],["path",{d:"M7 11v4a2 2 0 0 0 2 2h4",key:"xkn7yn"}],["rect",{width:"8",height:"8",x:"13",y:"13",rx:"2",key:"1cgmvn"}]]);/** + */const qs=$("Workflow",[["rect",{width:"8",height:"8",x:"3",y:"3",rx:"2",key:"by2w9f"}],["path",{d:"M7 11v4a2 2 0 0 0 2 2h4",key:"xkn7yn"}],["rect",{width:"8",height:"8",x:"13",y:"13",rx:"2",key:"1cgmvn"}]]);/** * @license lucide-react v0.468.0 - ISC * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const dn=$("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),Da="codex-usage-dashboard-language",Ws={"button.back_to_dashboard":"Back to dashboard","button.clear":"Clear","button.copy_link":"Copy link","button.enable_context_loading":"Enable context loading","button.export_csv":"Export CSV","button.full_serialized_analysis":"Run full serialized analysis","button.hide_details":"Hide details","button.include_tool_output":"Include tool output","button.load_more":"Load more","button.load_older_context":"Load older entries","button.next_call":"Next call","button.no_char_limit":"No char limit","button.open_investigator":"Open investigator","button.previous_call":"Previous call","button.refresh":"Refresh","button.show_compaction_history":"Show compacted replacement","button.show_tool_output":"Show tool output","button.top":"Top","button.show_turn_evidence":"Show turn log evidence","badge.live":"Live","dashboard.eyebrow":"Local Codex analytics","dashboard.call_details":"Call Details","dashboard.title":"Usage Dashboard","dashboard.view.call":"Call Investigator","dashboard.view.calls":"Calls","dashboard.view.insights":"Overview","dashboard.view.overview":"Overview","dashboard.view.threads":"Threads","detail.next_action":"Next action","filter.search":"Search dashboard","filter.search_placeholder":"Search calls, threads, models, diagnostics...","language.label":"Language","nav.history":"History","nav.load":"Load","nav.live":"Live","option.active_sessions_only":"Active","option.all_history":"All history","status.paused":"Paused","status.static":"Static"},Bs={overview:"dashboard.view.overview",calls:"dashboard.view.calls",call:"dashboard.view.call",threads:"dashboard.view.threads"};function Il(e,t){return typeof t=="string"?e.translateText(t):e.formatText(t.template,t.values)}function $a(e,t){const n=Ia(e),a=Oa(t,n),r=(e==null?void 0:e.translation_catalog)??{},s=r[a]??((e==null?void 0:e.language)===a?e==null?void 0:e.translations:void 0)??{},i=r.en??((e==null?void 0:e.language)==="en"?e.translations:void 0)??{},o={...Ws,...i,...s},d=zs(i,s),f=Qs(i,s),h=n.find(p=>p.code===a),v=(h==null?void 0:h.dir)==="rtl"||!h&&(e==null?void 0:e.language_direction)==="rtl"?"rtl":"ltr",u=p=>a==="zh-Hans"?ys(p,d,f):d.get(p)??p;return{language:a,direction:v,languages:n,t:(p,g)=>o[p]??g??p,translateText:u,formatText:(p,g)=>u(p).replace(/\{([A-Za-z][A-Za-z0-9_]*)\}/gu,(b,w)=>String(g[String(w)]??b)),navLabel:(p,g)=>{const b=Bs[p];return b?o[b]??g:g}}}function Qs(e,t){const n=[];for(const[a,r]of Object.entries(e)){const s=t[a];if(!s||s===r||!r.includes("{"))continue;const i=[],o=[];let d=0;for(const f of r.matchAll(/\{([A-Za-z][A-Za-z0-9_]*)\}/gu)){const h=f.index??d;o.push(Wn(r.slice(d,h))),o.push("(.+?)"),i.push(f[1]),d=h+f[0].length}o.push(Wn(r.slice(d))),n.push({pattern:new RegExp(`^${o.join("")}$`,"u"),placeholders:i,translatedTemplate:s})}return n.sort((a,r)=>r.translatedTemplate.length-a.translatedTemplate.length)}function Wn(e){return e.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}function zs(e,t){const n=new Map;for(const[a,r]of Object.entries(e)){const s=t[a];s&&s!==r&&n.set(r,s)}return n}function Ia(e){var n;const t=((n=e==null?void 0:e.available_languages)==null?void 0:n.filter(a=>a.code))??[];return t.length?t:[{code:"en",english_name:"English",native_name:"English",dir:"ltr"}]}function Gs(e){return Oa(Zs()||(e==null?void 0:e.language)||"en",Ia(e))}function Js(e){var t;try{(t=window.localStorage)==null||t.setItem(Da,e)}catch{}}function Zs(){var e;try{return((e=window.localStorage)==null?void 0:e.getItem(Da))??""}catch{return""}}function Oa(e,t){if(new Set(t.map(s=>s.code)).has(e))return e;const a=e.toLowerCase(),r=t.find(s=>s.code.toLowerCase()===a);return(r==null?void 0:r.code)??"en"}const Xs=$a(null,"en"),Ua=C.createContext(Xs);function Ys({value:e,children:t}){return c.jsx(Ua.Provider,{value:e,children:t})}function Va(){return C.useContext(Ua)}var Et=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},Ne,we,ze,Ta,ei=(Ta=class extends Et{constructor(){super();P(this,Ne);P(this,we);P(this,ze);x(this,ze,t=>{if(typeof window<"u"&&window.addEventListener){const n=()=>t();return window.addEventListener("visibilitychange",n,!1),()=>{window.removeEventListener("visibilitychange",n)}}})}onSubscribe(){l(this,we)||this.setEventListener(l(this,ze))}onUnsubscribe(){var t;this.hasListeners()||((t=l(this,we))==null||t.call(this),x(this,we,void 0))}setEventListener(t){var n;x(this,ze,t),(n=l(this,we))==null||n.call(this),x(this,we,t(a=>{typeof a=="boolean"?this.setFocused(a):this.onFocus()}))}setFocused(t){l(this,Ne)!==t&&(x(this,Ne,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(n=>{n(t)})}isFocused(){var t;return typeof l(this,Ne)=="boolean"?l(this,Ne):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},Ne=new WeakMap,we=new WeakMap,ze=new WeakMap,Ta),Ka=new ei,ti={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},ye,un,La,ni=(La=class{constructor(){P(this,ye,ti);P(this,un,!1)}setTimeoutProvider(e){x(this,ye,e)}setTimeout(e,t){return l(this,ye).setTimeout(e,t)}clearTimeout(e){l(this,ye).clearTimeout(e)}setInterval(e,t){return l(this,ye).setInterval(e,t)}clearInterval(e){l(this,ye).clearInterval(e)}},ye=new WeakMap,un=new WeakMap,La),zt=new ni;function ai(e){setTimeout(e,0)}var ri=typeof window>"u"||"Deno"in globalThis;function ne(){}function si(e,t){return typeof e=="function"?e(t):e}function ii(e){return typeof e=="number"&&e>=0&&e!==1/0}function oi(e,t){return Math.max(e+(t||0)-Date.now(),0)}function Gt(e,t){return typeof e=="function"?e(t):e}function ci(e,t){return typeof e=="function"?e(t):e}function Bn(e,t){const{type:n="all",exact:a,fetchStatus:r,predicate:s,queryKey:i,stale:o}=e;if(i){if(a){if(t.queryHash!==hn(i,t.options))return!1}else if(!ut(t.queryKey,i))return!1}if(n!=="all"){const d=t.isActive();if(n==="active"&&!d||n==="inactive"&&d)return!1}return!(typeof o=="boolean"&&t.isStale()!==o||r&&r!==t.state.fetchStatus||s&&!s(t))}function Qn(e,t){const{exact:n,status:a,predicate:r,mutationKey:s}=e;if(s){if(!t.options.mutationKey)return!1;if(n){if(lt(t.options.mutationKey)!==lt(s))return!1}else if(!ut(t.options.mutationKey,s))return!1}return!(a&&t.state.status!==a||r&&!r(t))}function hn(e,t){return((t==null?void 0:t.queryKeyHashFn)||lt)(e)}function lt(e){return JSON.stringify(e,(t,n)=>Jt(n)?Object.keys(n).sort().reduce((a,r)=>(a[r]=n[r],a),{}):n)}function ut(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(t).every(n=>ut(e[n],t[n])):!1}var li=Object.prototype.hasOwnProperty;function qa(e,t,n=0){if(e===t)return e;if(n>500)return t;const a=zn(e)&&zn(t);if(!a&&!(Jt(e)&&Jt(t)))return t;const s=(a?e:Object.keys(e)).length,i=a?t:Object.keys(t),o=i.length,d=a?new Array(o):{};let f=0;for(let h=0;h{zt.setTimeout(t,e)})}function di(e,t,n){return typeof n.structuralSharing=="function"?n.structuralSharing(e,t):n.structuralSharing!==!1?qa(e,t):t}function hi(e,t,n=0){const a=[...e,t];return n&&a.length>n?a.slice(1):a}function fi(e,t,n=0){const a=[t,...e];return n&&a.length>n?a.slice(0,-1):a}var fn=Symbol();function Ha(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===fn?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function Ul(e,t){return typeof e=="function"?e(...t):!!e}function mi(e,t,n){let a=!1,r;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(r??(r=t()),a||(a=!0,r.aborted?n():r.addEventListener("abort",n,{once:!0})),r)}),e}var Wa=(()=>{let e=()=>ri;return{isServer(){return e()},setIsServer(t){e=t}}})();function gi(){let e,t;const n=new Promise((r,s)=>{e=r,t=s});n.status="pending",n.catch(()=>{});function a(r){Object.assign(n,r),delete n.resolve,delete n.reject}return n.resolve=r=>{a({status:"fulfilled",value:r}),e(r)},n.reject=r=>{a({status:"rejected",reason:r}),t(r)},n}var pi=ai;function bi(){let e=[],t=0,n=o=>{o()},a=o=>{o()},r=pi;const s=o=>{t?e.push(o):r(()=>{n(o)})},i=()=>{const o=e;e=[],o.length&&r(()=>{a(()=>{o.forEach(d=>{n(d)})})})};return{batch:o=>{let d;t++;try{d=o()}finally{t--,t||i()}return d},batchCalls:o=>(...d)=>{s(()=>{o(...d)})},schedule:s,setNotifyFunction:o=>{n=o},setBatchNotifyFunction:o=>{a=o},setScheduler:o=>{r=o}}}var Q=bi(),Ge,_e,Je,Ra,vi=(Ra=class extends Et{constructor(){super();P(this,Ge,!0);P(this,_e);P(this,Je);x(this,Je,t=>{if(typeof window<"u"&&window.addEventListener){const n=()=>t(!0),a=()=>t(!1);return window.addEventListener("online",n,!1),window.addEventListener("offline",a,!1),()=>{window.removeEventListener("online",n),window.removeEventListener("offline",a)}}})}onSubscribe(){l(this,_e)||this.setEventListener(l(this,Je))}onUnsubscribe(){var t;this.hasListeners()||((t=l(this,_e))==null||t.call(this),x(this,_e,void 0))}setEventListener(t){var n;x(this,Je,t),(n=l(this,_e))==null||n.call(this),x(this,_e,t(this.setOnline.bind(this)))}setOnline(t){l(this,Ge)!==t&&(x(this,Ge,t),this.listeners.forEach(a=>{a(t)}))}isOnline(){return l(this,Ge)}},Ge=new WeakMap,_e=new WeakMap,Je=new WeakMap,Ra),Tt=new vi;function wi(e){return Math.min(1e3*2**e,3e4)}function Ba(e){return(e??"online")==="online"?Tt.isOnline():!0}var Lt=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function yi(e){return e instanceof Lt}function Qa(e){let t=!1,n=0,a;const r=gi(),s=()=>r.status!=="pending",i=b=>{var w;if(!s()){const T=new Lt(b);u(T),(w=e.onCancel)==null||w.call(e,T)}},o=()=>{t=!0},d=()=>{t=!1},f=()=>Ka.isFocused()&&(e.networkMode==="always"||Tt.isOnline())&&e.canRun(),h=()=>Ba(e.networkMode)&&e.canRun(),v=b=>{s()||(a==null||a(),r.resolve(b))},u=b=>{s()||(a==null||a(),r.reject(b))},p=()=>new Promise(b=>{var w;a=T=>{(s()||f())&&b(T)},(w=e.onPause)==null||w.call(e)}).then(()=>{var b;a=void 0,s()||(b=e.onContinue)==null||b.call(e)}),g=()=>{if(s())return;let b;const w=n===0?e.initialPromise:void 0;try{b=w??e.fn()}catch(T){b=Promise.reject(T)}Promise.resolve(b).then(v).catch(T=>{var y;if(s())return;const N=e.retry??(Wa.isServer()?0:3),R=e.retryDelay??wi,_=typeof R=="function"?R(n,T):R,L=N===!0||typeof N=="number"&&nf()?void 0:p()).then(()=>{t?u(T):g()})})};return{promise:r,status:()=>r.status,cancel:i,continue:()=>(a==null||a(),r),cancelRetry:o,continueRetry:d,canStart:h,start:()=>(h()?g():p().then(g),r)}}var Ee,Ma,za=(Ma=class{constructor(){P(this,Ee)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),ii(this.gcTime)&&x(this,Ee,zt.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(Wa.isServer()?1/0:300*1e3))}clearGcTimeout(){l(this,Ee)!==void 0&&(zt.clearTimeout(l(this,Ee)),x(this,Ee,void 0))}},Ee=new WeakMap,Ma);function _i(e){return{onFetch:(t,n)=>{var h,v,u,p,g;const a=t.options,r=(u=(v=(h=t.fetchOptions)==null?void 0:h.meta)==null?void 0:v.fetchMore)==null?void 0:u.direction,s=((p=t.state.data)==null?void 0:p.pages)||[],i=((g=t.state.data)==null?void 0:g.pageParams)||[];let o={pages:[],pageParams:[]},d=0;const f=async()=>{let b=!1;const w=R=>{mi(R,()=>t.signal,()=>b=!0)},T=Ha(t.options,t.fetchOptions),N=async(R,_,L)=>{if(b)return Promise.reject(t.signal.reason);if(_==null&&R.pages.length)return Promise.resolve(R);const k=(()=>{const me={client:t.client,queryKey:t.queryKey,pageParam:_,direction:L?"backward":"forward",meta:t.options.meta};return w(me),me})(),j=await T(k),{maxPages:E}=t.options,F=L?fi:hi;return{pages:F(R.pages,j,E),pageParams:F(R.pageParams,_,E)}};if(r&&s.length){const R=r==="backward",_=R?Ga:Zt,L={pages:s,pageParams:i},y=_(a,L);o=await N(L,y,R)}else{const R=e??s.length;do{const _=d===0?i[0]??a.initialPageParam:Zt(a,o);if(d>0&&_==null)break;o=await N(o,_),d++}while(d{var b,w;return(w=(b=t.options).persister)==null?void 0:w.call(b,f,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n)}:t.fetchFn=f}}}function Zt(e,{pages:t,pageParams:n}){const a=t.length-1;return t.length>0?e.getNextPageParam(t[a],t,n[a],n):void 0}function Ga(e,{pages:t,pageParams:n}){var a;return t.length>0?(a=e.getPreviousPageParam)==null?void 0:a.call(e,t[0],t,n[0],n):void 0}function Vl(e,t){return t?Zt(e,t)!=null:!1}function Kl(e,t){return!t||!e.getPreviousPageParam?!1:Ga(e,t)!=null}var Ze,Fe,Xe,X,De,U,ft,$e,Z,Ja,he,Pa,Si=(Pa=class extends za{constructor(t){super();P(this,Z);P(this,Ze);P(this,Fe);P(this,Xe);P(this,X);P(this,De);P(this,U);P(this,ft);P(this,$e);x(this,$e,!1),x(this,ft,t.defaultOptions),this.setOptions(t.options),this.observers=[],x(this,De,t.client),x(this,X,l(this,De).getQueryCache()),this.queryKey=t.queryKey,this.queryHash=t.queryHash,x(this,Fe,Zn(this.options)),this.state=t.state??l(this,Fe),this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return l(this,Ze)}get promise(){var t;return(t=l(this,U))==null?void 0:t.promise}setOptions(t){if(this.options={...l(this,ft),...t},t!=null&&t._type&&x(this,Ze,t._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const n=Zn(this.options);n.data!==void 0&&(this.setState(Jn(n.data,n.dataUpdatedAt)),x(this,Fe,n))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&l(this,X).remove(this)}setData(t,n){const a=di(this.state.data,t,this.options);return V(this,Z,he).call(this,{data:a,type:"success",dataUpdatedAt:n==null?void 0:n.updatedAt,manual:n==null?void 0:n.manual}),a}setState(t){V(this,Z,he).call(this,{type:"setState",state:t})}cancel(t){var a,r;const n=(a=l(this,U))==null?void 0:a.promise;return(r=l(this,U))==null||r.cancel(t),n?n.then(ne).catch(ne):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return l(this,Fe)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(t=>ci(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===fn||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>Gt(t.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(t=>t.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(t=0){return this.state.data===void 0?!0:t==="static"?!1:this.state.isInvalidated?!0:!oi(this.state.dataUpdatedAt,t)}onFocus(){var n;const t=this.observers.find(a=>a.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(n=l(this,U))==null||n.continue()}onOnline(){var n;const t=this.observers.find(a=>a.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(n=l(this,U))==null||n.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),l(this,X).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(n=>n!==t),this.observers.length||(l(this,U)&&(l(this,$e)||V(this,Z,Ja).call(this)?l(this,U).cancel({revert:!0}):l(this,U).cancelRetry()),this.scheduleGc()),l(this,X).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||V(this,Z,he).call(this,{type:"invalidate"})}async fetch(t,n){var f,h,v,u,p,g,b,w,T,N,R;if(this.state.fetchStatus!=="idle"&&((f=l(this,U))==null?void 0:f.status())!=="rejected"){if(this.state.data!==void 0&&(n!=null&&n.cancelRefetch))this.cancel({silent:!0});else if(l(this,U))return l(this,U).continueRetry(),l(this,U).promise}if(t&&this.setOptions(t),!this.options.queryFn){const _=this.observers.find(L=>L.options.queryFn);_&&this.setOptions(_.options)}const a=new AbortController,r=_=>{Object.defineProperty(_,"signal",{enumerable:!0,get:()=>(x(this,$e,!0),a.signal)})},s=()=>{const _=Ha(this.options,n),y=(()=>{const k={client:l(this,De),queryKey:this.queryKey,meta:this.meta};return r(k),k})();return x(this,$e,!1),this.options.persister?this.options.persister(_,y,this):_(y)},o=(()=>{const _={fetchOptions:n,options:this.options,queryKey:this.queryKey,client:l(this,De),state:this.state,fetchFn:s};return r(_),_})(),d=l(this,Ze)==="infinite"?_i(this.options.pages):this.options.behavior;d==null||d.onFetch(o,this),x(this,Xe,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((h=o.fetchOptions)==null?void 0:h.meta))&&V(this,Z,he).call(this,{type:"fetch",meta:(v=o.fetchOptions)==null?void 0:v.meta}),x(this,U,Qa({initialPromise:n==null?void 0:n.initialPromise,fn:o.fetchFn,onCancel:_=>{_ instanceof Lt&&_.revert&&this.setState({...l(this,Xe),fetchStatus:"idle"}),a.abort()},onFail:(_,L)=>{V(this,Z,he).call(this,{type:"failed",failureCount:_,error:L})},onPause:()=>{V(this,Z,he).call(this,{type:"pause"})},onContinue:()=>{V(this,Z,he).call(this,{type:"continue"})},retry:o.options.retry,retryDelay:o.options.retryDelay,networkMode:o.options.networkMode,canRun:()=>!0}));try{const _=await l(this,U).start();if(_===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(_),(p=(u=l(this,X).config).onSuccess)==null||p.call(u,_,this),(b=(g=l(this,X).config).onSettled)==null||b.call(g,_,this.state.error,this),_}catch(_){if(_ instanceof Lt){if(_.silent)return l(this,U).promise;if(_.revert){if(this.state.data===void 0)throw _;return this.state.data}}throw V(this,Z,he).call(this,{type:"error",error:_}),(T=(w=l(this,X).config).onError)==null||T.call(w,_,this),(R=(N=l(this,X).config).onSettled)==null||R.call(N,this.state.data,_,this),_}finally{this.scheduleGc()}}},Ze=new WeakMap,Fe=new WeakMap,Xe=new WeakMap,X=new WeakMap,De=new WeakMap,U=new WeakMap,ft=new WeakMap,$e=new WeakMap,Z=new WeakSet,Ja=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},he=function(t){const n=a=>{switch(t.type){case"failed":return{...a,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...a,fetchStatus:"paused"};case"continue":return{...a,fetchStatus:"fetching"};case"fetch":return{...a,...Ci(a.data,this.options),fetchMeta:t.meta??null};case"success":const r={...a,...Jn(t.data,t.dataUpdatedAt),dataUpdateCount:a.dataUpdateCount+1,...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return x(this,Xe,t.manual?r:void 0),r;case"error":const s=t.error;return{...a,error:s,errorUpdateCount:a.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:a.fetchFailureCount+1,fetchFailureReason:s,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...a,isInvalidated:!0};case"setState":return{...a,...t.state}}};this.state=n(this.state),Q.batch(()=>{this.observers.forEach(a=>{a.onQueryUpdate()}),l(this,X).notify({query:this,type:"updated",action:t})})},Pa);function Ci(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Ba(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function Jn(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:"success"}}function Zn(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,n=t!==void 0,a=n?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?a??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?"success":"pending",fetchStatus:"idle"}}var mt,le,K,Ie,ue,be,ja,xi=(ja=class extends za{constructor(t){super();P(this,ue);P(this,mt);P(this,le);P(this,K);P(this,Ie);x(this,mt,t.client),this.mutationId=t.mutationId,x(this,K,t.mutationCache),x(this,le,[]),this.state=t.state||ki(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){l(this,le).includes(t)||(l(this,le).push(t),this.clearGcTimeout(),l(this,K).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){x(this,le,l(this,le).filter(n=>n!==t)),this.scheduleGc(),l(this,K).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){l(this,le).length||(this.state.status==="pending"?this.scheduleGc():l(this,K).remove(this))}continue(){var t;return((t=l(this,Ie))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var i,o,d,f,h,v,u,p,g,b,w,T,N,R,_,L,y,k;const n=()=>{V(this,ue,be).call(this,{type:"continue"})},a={client:l(this,mt),meta:this.options.meta,mutationKey:this.options.mutationKey};x(this,Ie,Qa({fn:()=>this.options.mutationFn?this.options.mutationFn(t,a):Promise.reject(new Error("No mutationFn found")),onFail:(j,E)=>{V(this,ue,be).call(this,{type:"failed",failureCount:j,error:E})},onPause:()=>{V(this,ue,be).call(this,{type:"pause"})},onContinue:n,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>l(this,K).canRun(this)}));const r=this.state.status==="pending",s=!l(this,Ie).canStart();try{if(r)n();else{V(this,ue,be).call(this,{type:"pending",variables:t,isPaused:s}),l(this,K).config.onMutate&&await l(this,K).config.onMutate(t,this,a);const E=await((o=(i=this.options).onMutate)==null?void 0:o.call(i,t,a));E!==this.state.context&&V(this,ue,be).call(this,{type:"pending",context:E,variables:t,isPaused:s})}const j=await l(this,Ie).start();return await((f=(d=l(this,K).config).onSuccess)==null?void 0:f.call(d,j,t,this.state.context,this,a)),await((v=(h=this.options).onSuccess)==null?void 0:v.call(h,j,t,this.state.context,a)),await((p=(u=l(this,K).config).onSettled)==null?void 0:p.call(u,j,null,this.state.variables,this.state.context,this,a)),await((b=(g=this.options).onSettled)==null?void 0:b.call(g,j,null,t,this.state.context,a)),V(this,ue,be).call(this,{type:"success",data:j}),j}catch(j){try{await((T=(w=l(this,K).config).onError)==null?void 0:T.call(w,j,t,this.state.context,this,a))}catch(E){Promise.reject(E)}try{await((R=(N=this.options).onError)==null?void 0:R.call(N,j,t,this.state.context,a))}catch(E){Promise.reject(E)}try{await((L=(_=l(this,K).config).onSettled)==null?void 0:L.call(_,void 0,j,this.state.variables,this.state.context,this,a))}catch(E){Promise.reject(E)}try{await((k=(y=this.options).onSettled)==null?void 0:k.call(y,void 0,j,t,this.state.context,a))}catch(E){Promise.reject(E)}throw V(this,ue,be).call(this,{type:"error",error:j}),j}finally{l(this,K).runNext(this)}}},mt=new WeakMap,le=new WeakMap,K=new WeakMap,Ie=new WeakMap,ue=new WeakSet,be=function(t){const n=a=>{switch(t.type){case"failed":return{...a,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...a,isPaused:!0};case"continue":return{...a,isPaused:!1};case"pending":return{...a,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...a,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...a,data:void 0,error:t.error,failureCount:a.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=n(this.state),Q.batch(()=>{l(this,le).forEach(a=>{a.onMutationUpdate(t)}),l(this,K).notify({mutation:this,type:"updated",action:t})})},ja);function ki(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var fe,ae,gt,Aa,Ti=(Aa=class extends Et{constructor(t={}){super();P(this,fe);P(this,ae);P(this,gt);this.config=t,x(this,fe,new Set),x(this,ae,new Map),x(this,gt,0)}build(t,n,a){const r=new xi({client:t,mutationCache:this,mutationId:++Ct(this,gt)._,options:t.defaultMutationOptions(n),state:a});return this.add(r),r}add(t){l(this,fe).add(t);const n=xt(t);if(typeof n=="string"){const a=l(this,ae).get(n);a?a.push(t):l(this,ae).set(n,[t])}this.notify({type:"added",mutation:t})}remove(t){if(l(this,fe).delete(t)){const n=xt(t);if(typeof n=="string"){const a=l(this,ae).get(n);if(a)if(a.length>1){const r=a.indexOf(t);r!==-1&&a.splice(r,1)}else a[0]===t&&l(this,ae).delete(n)}}this.notify({type:"removed",mutation:t})}canRun(t){const n=xt(t);if(typeof n=="string"){const a=l(this,ae).get(n),r=a==null?void 0:a.find(s=>s.state.status==="pending");return!r||r===t}else return!0}runNext(t){var a;const n=xt(t);if(typeof n=="string"){const r=(a=l(this,ae).get(n))==null?void 0:a.find(s=>s!==t&&s.state.isPaused);return(r==null?void 0:r.continue())??Promise.resolve()}else return Promise.resolve()}clear(){Q.batch(()=>{l(this,fe).forEach(t=>{this.notify({type:"removed",mutation:t})}),l(this,fe).clear(),l(this,ae).clear()})}getAll(){return Array.from(l(this,fe))}find(t){const n={exact:!0,...t};return this.getAll().find(a=>Qn(n,a))}findAll(t={}){return this.getAll().filter(n=>Qn(t,n))}notify(t){Q.batch(()=>{this.listeners.forEach(n=>{n(t)})})}resumePausedMutations(){const t=this.getAll().filter(n=>n.state.isPaused);return Q.batch(()=>Promise.all(t.map(n=>n.continue().catch(ne))))}},fe=new WeakMap,ae=new WeakMap,gt=new WeakMap,Aa);function xt(e){var t;return(t=e.options.scope)==null?void 0:t.id}var de,Na,Li=(Na=class extends Et{constructor(t={}){super();P(this,de);this.config=t,x(this,de,new Map)}build(t,n,a){const r=n.queryKey,s=n.queryHash??hn(r,n);let i=this.get(s);return i||(i=new Si({client:t,queryKey:r,queryHash:s,options:t.defaultQueryOptions(n),state:a,defaultOptions:t.getQueryDefaults(r)}),this.add(i)),i}add(t){l(this,de).has(t.queryHash)||(l(this,de).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const n=l(this,de).get(t.queryHash);n&&(t.destroy(),n===t&&l(this,de).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){Q.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return l(this,de).get(t)}getAll(){return[...l(this,de).values()]}find(t){const n={exact:!0,...t};return this.getAll().find(a=>Bn(n,a))}findAll(t={}){const n=this.getAll();return Object.keys(t).length>0?n.filter(a=>Bn(t,a)):n}notify(t){Q.batch(()=>{this.listeners.forEach(n=>{n(t)})})}onFocus(){Q.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){Q.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},de=new WeakMap,Na),D,Se,Ce,Ye,et,xe,tt,nt,Ea,Ri=(Ea=class{constructor(e={}){P(this,D);P(this,Se);P(this,Ce);P(this,Ye);P(this,et);P(this,xe);P(this,tt);P(this,nt);x(this,D,e.queryCache||new Li),x(this,Se,e.mutationCache||new Ti),x(this,Ce,e.defaultOptions||{}),x(this,Ye,new Map),x(this,et,new Map),x(this,xe,0)}mount(){Ct(this,xe)._++,l(this,xe)===1&&(x(this,tt,Ka.subscribe(async e=>{e&&(await this.resumePausedMutations(),l(this,D).onFocus())})),x(this,nt,Tt.subscribe(async e=>{e&&(await this.resumePausedMutations(),l(this,D).onOnline())})))}unmount(){var e,t;Ct(this,xe)._--,l(this,xe)===0&&((e=l(this,tt))==null||e.call(this),x(this,tt,void 0),(t=l(this,nt))==null||t.call(this),x(this,nt,void 0))}isFetching(e){return l(this,D).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return l(this,Se).findAll({...e,status:"pending"}).length}getQueryData(e){var n;const t=this.defaultQueryOptions({queryKey:e});return(n=l(this,D).get(t.queryHash))==null?void 0:n.state.data}ensureQueryData(e){const t=this.defaultQueryOptions(e),n=l(this,D).build(this,t),a=n.state.data;return a===void 0?this.fetchQuery(e):(e.revalidateIfStale&&n.isStaleByTime(Gt(t.staleTime,n))&&this.prefetchQuery(t),Promise.resolve(a))}getQueriesData(e){return l(this,D).findAll(e).map(({queryKey:t,state:n})=>{const a=n.data;return[t,a]})}setQueryData(e,t,n){const a=this.defaultQueryOptions({queryKey:e}),r=l(this,D).get(a.queryHash),s=r==null?void 0:r.state.data,i=si(t,s);if(i!==void 0)return l(this,D).build(this,a).setData(i,{...n,manual:!0})}setQueriesData(e,t,n){return Q.batch(()=>l(this,D).findAll(e).map(({queryKey:a})=>[a,this.setQueryData(a,t,n)]))}getQueryState(e){var n;const t=this.defaultQueryOptions({queryKey:e});return(n=l(this,D).get(t.queryHash))==null?void 0:n.state}removeQueries(e){const t=l(this,D);Q.batch(()=>{t.findAll(e).forEach(n=>{t.remove(n)})})}resetQueries(e,t){const n=l(this,D);return Q.batch(()=>(n.findAll(e).forEach(a=>{a.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){const n={revert:!0,...t},a=Q.batch(()=>l(this,D).findAll(e).map(r=>r.cancel(n)));return Promise.all(a).then(ne).catch(ne)}invalidateQueries(e,t={}){return Q.batch(()=>(l(this,D).findAll(e).forEach(n=>{n.invalidate()}),(e==null?void 0:e.refetchType)==="none"?Promise.resolve():this.refetchQueries({...e,type:(e==null?void 0:e.refetchType)??(e==null?void 0:e.type)??"active"},t)))}refetchQueries(e,t={}){const n={...t,cancelRefetch:t.cancelRefetch??!0},a=Q.batch(()=>l(this,D).findAll(e).filter(r=>!r.isDisabled()&&!r.isStatic()).map(r=>{let s=r.fetch(void 0,n);return n.throwOnError||(s=s.catch(ne)),r.state.fetchStatus==="paused"?Promise.resolve():s}));return Promise.all(a).then(ne)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const n=l(this,D).build(this,t);return n.isStaleByTime(Gt(t.staleTime,n))?n.fetch(t):Promise.resolve(n.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(ne).catch(ne)}fetchInfiniteQuery(e){return e._type="infinite",this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(ne).catch(ne)}ensureInfiniteQueryData(e){return e._type="infinite",this.ensureQueryData(e)}resumePausedMutations(){return Tt.isOnline()?l(this,Se).resumePausedMutations():Promise.resolve()}getQueryCache(){return l(this,D)}getMutationCache(){return l(this,Se)}getDefaultOptions(){return l(this,Ce)}setDefaultOptions(e){x(this,Ce,e)}setQueryDefaults(e,t){l(this,Ye).set(lt(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...l(this,Ye).values()],n={};return t.forEach(a=>{ut(e,a.queryKey)&&Object.assign(n,a.defaultOptions)}),n}setMutationDefaults(e,t){l(this,et).set(lt(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...l(this,et).values()],n={};return t.forEach(a=>{ut(e,a.mutationKey)&&Object.assign(n,a.defaultOptions)}),n}defaultQueryOptions(e){if(e._defaulted)return e;const t={...l(this,Ce).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=hn(t.queryKey,t)),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!=="always"),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),t.queryFn===fn&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...l(this,Ce).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){l(this,D).clear(),l(this,Se).clear()}},D=new WeakMap,Se=new WeakMap,Ce=new WeakMap,Ye=new WeakMap,et=new WeakMap,xe=new WeakMap,tt=new WeakMap,nt=new WeakMap,Ea),Za=C.createContext(void 0),ql=e=>{const t=C.useContext(Za);if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},Mi=({client:e,children:t})=>(C.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),c.jsx(Za.Provider,{value:e,children:t}));function Pi(e,t=window.location.href){var a;const n=(a=new URL(t).searchParams.get("record"))==null?void 0:a.trim();if(n){const r=e.calls.find(s=>s.id===n);return r?[r]:[]}return e.calls[0]?[e.calls[0]]:[]}function Hl({calls:e,recordId:t,detail:n}){const a=e.findIndex(v=>v.id===t),r=a>=0?a:!t&&e.length?0:-1,s=(n==null?void 0:n.record.id)===t?n:null,i=(s==null?void 0:s.record)??(r>=0?e[r]:null),o=(s==null?void 0:s.previousRecord)??(r>0?e[r-1]:null),d=(s==null?void 0:s.nextRecord)??(r>=0&&r=0?`${r+1} of ${e.length} loaded calls`:"Record outside loaded snapshot";return{modelIndex:a,activeIndex:r,hydratedDetail:s,call:i,previous:o,next:d,threadCalls:f,positionLabel:h}}function ji(e,t,n){const a=e.filter(i=>i.thread===t.thread),r=[n==null?void 0:n.previousRecord,n==null?void 0:n.record,n==null?void 0:n.nextRecord].filter(Ai),s=new Map;for(const i of[...a,...r,t])s.set(i.id,i);return[...s.values()].sort(Ni)}function Ai(e){return!!(e!=null&&e.id)}function Ni(e,t){return Date.parse(t.rawTime||t.time)-Date.parse(e.rawTime||e.time)}function Ei(e,t){const n=t.map(r=>Xn(r.header)).join(","),a=e.map(r=>t.map(s=>Xn(s.value(r))).join(","));return[n,...a].join(` -`)}function Fi(e,t){const n=new Blob([t],{type:"text/csv;charset=utf-8"}),a=typeof URL.createObjectURL=="function"?URL.createObjectURL(n):`data:text/csv;charset=utf-8,${encodeURIComponent(t)}`,r=document.createElement("a");r.href=a,r.download=e,r.rel="noopener",document.body.append(r),r.click(),r.remove(),a.startsWith("blob:")&&typeof URL.revokeObjectURL=="function"&&URL.revokeObjectURL(a)}function Di(e=new Date){return e.toISOString().slice(0,10)}function Xn(e){const t=String(e??"");return/[",\n\r]/.test(t)?`"${t.replaceAll('"','""')}"`:t}function Le(e){return new Intl.NumberFormat("en-US").format(Math.round(e))}function ve(e){return new Intl.NumberFormat("en-US",{notation:"compact",maximumFractionDigits:2}).format(e)}function Xt(e){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}).format(e)}function dt(e){return`${e.toFixed(1)}%`}const $i={priority:"Priority / Fast",fast:"Fast",default:"Default / Standard",standard:"Standard",flex:"Flex",batch:"Batch"};function Xa(e){const t=e.trim().toLowerCase().replace(/[\s_]+/g,"-");if(!t)return null;const n=$i[t];return n||(t.length>48||!/^[a-z0-9.-]+$/.test(t)?"Other":t.split(/[-.]+/).filter(Boolean).map(a=>`${a.charAt(0).toUpperCase()}${a.slice(1)}`).join(" "))}function Yt(e){const t=Xa(e.serviceTier);return t||(e.fast===!0?"Fast":e.fast===!1?"Standard":"Unknown")}function Wl(e){return Xa(e.serviceTier)?`observed ${Yt(e)} · ${e.serviceTierConfidence||"exact"}`:e.fast!==null?`confirmed ${Yt(e)} · ${e.serviceTierConfidence||"exact"}`:e.fastProxyCandidate?"tier unknown · Fast proxy candidate":"tier unknown · normal throughput proxy"}function Bl(e){if(e.billingBasis==="api_tokens"){const t=e.pricingServiceTier.trim();return`API token estimate · ${t?`${t.charAt(0).toUpperCase()}${t.slice(1).toLowerCase()} rates`:"configured rates"}`}return e.billingBasis==="chatgpt_credits"?"API-equivalent scenario · ChatGPT credits selected":"API-equivalent scenario · billing basis unknown"}function Ql(e){return e.cachedPct<25?"cold or weak cache":e.cachedPct<50?"partial cache reuse":"healthy cache reuse"}function zl(e){return e.sourceFile?`${e.sourceFile}${e.lineNumber?`:${e.lineNumber}`:""}`:"Not available"}function Gl(e){if(e.contextWindowPct===null||e.contextWindowPct===void 0)return"Not reported";const t=e.modelContextWindow?` of ${ve(e.modelContextWindow)}`:"";return`${dt(e.contextWindowPct)}${t}`}function Jl(e,{limit:t=2,emptyLabel:n="No related calls",unknownLabel:a="Unknown",style:r="parenthetical"}={}){const s=new Map;for(const o of e){const d=o||a;s.set(d,(s.get(d)??0)+1)}const i=[...s.entries()].sort((o,d)=>d[1]-o[1]||o[0].localeCompare(d[0])).slice(0,t).map(([o,d])=>r==="x"?`${o} x${d}`:`${o} (${d})`);return i.length?i.join(", "):n}const Zl=[{id:"time",accessorFn:e=>Number(Date.parse(e.eventTimestamp||e.callStartedAt||e.rawTime||e.time))||0,header:"Time",cell:e=>e.row.original.time},{accessorKey:"thread",header:"Thread"},{accessorKey:"model",header:"Model"},{accessorKey:"effort",header:"Effort",cell:e=>c.jsx("span",{className:`pill effort-${String(e.getValue())}`,children:String(e.getValue())})},{accessorKey:"input",header:"Input Tokens",cell:e=>c.jsx("span",{className:"num",children:Le(Number(e.getValue()))})},{accessorKey:"totalTokens",header:"Total Tokens",cell:e=>c.jsx("span",{className:"num",children:Le(Number(e.getValue()))})},{accessorKey:"cachedInput",header:"Cached Input",cell:e=>c.jsx("span",{className:"num",children:Le(Number(e.getValue()))})},{accessorKey:"uncachedInput",header:"Uncached Input",cell:e=>c.jsx("span",{className:"num",children:Le(Number(e.getValue()))})},{accessorKey:"output",header:"Output Tokens",cell:e=>c.jsx("span",{className:"num",children:Le(Number(e.getValue()))})},{accessorKey:"reasoningOutput",header:"Reasoning Output",cell:e=>c.jsx("span",{className:"num",children:Le(Number(e.getValue()))})},{accessorKey:"cachedPct",header:"Cached %",cell:e=>c.jsx("span",{className:"cache-pill",children:dt(Number(e.getValue()))})},{accessorKey:"cost",header:"Est. Cost",cell:e=>c.jsx("span",{className:"num",children:Xt(Number(e.getValue()))})},{accessorKey:"credits",header:"Codex Credits",cell:e=>c.jsx("span",{className:"num",children:ve(Number(e.getValue()))})},{accessorKey:"contextWindowPct",header:"Context %",cell:e=>{const t=e.getValue(),n=typeof t=="number"?t:Number.NaN;return c.jsx("span",{className:"num",children:Number.isFinite(n)?dt(n):"-"})}},{accessorKey:"duration",header:"Duration"},{id:"serviceTier",accessorFn:e=>Yt(e),header:"Service Tier",cell:e=>{const t=String(e.getValue()),n=t.includes("Fast")?"green":t.includes("Standard")?"blue":"";return c.jsx("span",{className:`status-badge ${n}`.trim(),children:t})}},{accessorKey:"previousCallGap",header:"Prev Gap",cell:e=>c.jsx("span",{className:"num",children:String(e.getValue())})},{accessorKey:"initiator",header:"Initiated",cell:e=>c.jsx("span",{className:"status-badge blue",children:String(e.getValue())})},{accessorKey:"signal",header:"Signals",cell:e=>c.jsx(Oi,{call:e.row.original})}],ce=[{header:"timestamp",value:e=>e.eventTimestamp||e.rawTime||e.time},{header:"thread",value:e=>e.thread},{header:"call_started_at",value:e=>e.callStartedAt||e.rawTime||e.time},{header:"call_duration_seconds",value:e=>e.durationSeconds},{header:"previous_call_event_timestamp",value:e=>e.previousCallEventTimestamp},{header:"previous_call_delta_seconds",value:e=>e.previousCallGapSeconds},{header:"initiated",value:e=>e.initiator},{header:"initiated_reason",value:e=>e.initiatorReason},{header:"project",value:e=>e.project},{header:"model",value:e=>e.model},{header:"effort",value:e=>e.effort},{header:"total_tokens",value:e=>e.totalTokens},{header:"input_tokens",value:e=>e.input},{header:"cached_input_tokens",value:e=>e.cachedInput},{header:"uncached_input_tokens",value:e=>e.uncachedInput},{header:"output_tokens",value:e=>e.output},{header:"reasoning_output_tokens",value:e=>e.reasoningOutput},{header:"estimated_cost_usd",value:e=>e.cost.toFixed(6)},{header:"standard_cost_usd",value:e=>{var t;return((t=e.standardCost)==null?void 0:t.toFixed(6))??""}},{header:"priority_cost_usd",value:e=>{var t;return((t=e.priorityCost)==null?void 0:t.toFixed(6))??""}},{header:"pricing_service_tier",value:e=>e.pricingServiceTier},{header:"billing_basis",value:e=>e.billingBasis},{header:"cost_semantics",value:e=>e.costSemantics},{header:"usage_credits",value:e=>e.credits.toFixed(6)},{header:"standard_usage_credits",value:e=>e.standardUsageCredits.toFixed(6)},{header:"fast_usage_credits",value:e=>{var t;return((t=e.fastUsageCredits)==null?void 0:t.toFixed(6))??""}},{header:"service_tier",value:e=>e.serviceTier},{header:"fast",value:e=>e.fast===null?"":e.fast?1:0},{header:"service_tier_source",value:e=>e.serviceTierSource},{header:"service_tier_confidence",value:e=>e.serviceTierConfidence},{header:"fast_proxy_candidate",value:e=>String(e.fastProxyCandidate)},{header:"usage_credit_multiplier",value:e=>e.usageCreditMultiplier},{header:"usage_credit_multiplier_source",value:e=>e.usageCreditMultiplierSource},{header:"usage_credit_multiplier_source_url",value:e=>e.usageCreditMultiplierSourceUrl},{header:"usage_credit_multiplier_fetched_at",value:e=>e.usageCreditMultiplierFetchedAt},{header:"usage_credit_multiplier_confidence",value:e=>e.usageCreditMultiplierConfidence},{header:"cache_ratio",value:e=>e.cachedPct.toFixed(2)},{header:"context_window_percent",value:e=>{var t;return((t=e.contextWindowPct)==null?void 0:t.toFixed(2))??""}},{header:"pricing_model",value:e=>e.pricingModel},{header:"usage_credit_confidence",value:e=>e.usageCreditConfidence},{header:"recommendation",value:e=>e.recommendation},{header:"record_id",value:e=>e.id},{header:"thread_attachment",value:e=>e.threadAttachmentLabel},{header:"thread_source",value:e=>e.threadSource},{header:"parent_thread",value:e=>e.parentThread},{header:"session_id",value:e=>e.sessionId},{header:"turn_id",value:e=>e.turnId},{header:"parent_session_id",value:e=>e.parentSessionId},{header:"parent_session_updated_at",value:e=>e.parentSessionUpdatedAt},{header:"project_relative_cwd",value:e=>e.projectRelativeCwd},{header:"cwd",value:e=>e.cwd},{header:"source_file",value:e=>e.sourceFile},{header:"source_line",value:e=>e.lineNumber??""},{header:"git_branch",value:e=>e.gitBranch},{header:"git_remote_label",value:e=>e.gitRemoteLabel},{header:"git_remote_hash",value:e=>e.gitRemoteHash},{header:"pricing_estimated",value:e=>String(e.pricingEstimated)},{header:"usage_credit_model",value:e=>e.usageCreditModel},{header:"usage_credit_source",value:e=>e.usageCreditSource},{header:"usage_credit_tier",value:e=>e.usageCreditTier},{header:"usage_credit_fetched_at",value:e=>e.usageCreditFetchedAt},{header:"usage_credit_note",value:e=>e.usageCreditNote},{header:"model_context_window",value:e=>e.modelContextWindow??""},{header:"cumulative_total_tokens",value:e=>e.cumulativeTotalTokens??""},{header:"estimated_cache_savings_usd",value:e=>e.estimatedCacheSavings.toFixed(6)},{header:"initiated_confidence",value:e=>e.initiatorConfidence},{header:"signal",value:e=>e.signal},{header:"tags",value:e=>e.tags.join("|")},{header:"efficiency_flags",value:e=>e.efficiencyFlags.join("|")}];function Ii(e,t=3){const a=Ui([e.signal,...e.efficiencyFlags]).map((r,s)=>({key:`${r}-${s}`,label:Ya(r),shortLabel:Vi(r)}));return{visible:a.slice(0,t),hidden:a.slice(t)}}function Oi({call:e}){const t=Va(),{visible:n,hidden:a}=Ii(e);if(!n.length)return c.jsx("span",{className:"muted",children:"None"});const r=n.map(o=>({...o,label:t.translateText(o.label),shortLabel:t.translateText(o.shortLabel)})),s=a.map(o=>({...o,label:t.translateText(o.label),shortLabel:t.translateText(o.shortLabel)})),i=s.map(o=>o.label).join("、");return c.jsxs("span",{className:"flags compact-flags","aria-label":t.language==="zh-Hans"?`信号:${[...r,...s].map(o=>o.label).join("、")}`:`Signals: ${[...n,...a].map(o=>o.label).join(", ")}`,children:[r.map(o=>c.jsx("span",{className:"flag signal-puck",title:o.label,children:o.shortLabel},o.key)),s.length?c.jsxs("span",{className:"flag signal-puck more",title:i,children:["+",s.length]}):null]})}function Ui(e){const t=new Set;return e.map(n=>n.trim()).filter(n=>n&&n!=="aggregate").filter(n=>{const a=n.toLowerCase();return t.has(a)?!1:(t.add(a),!0)})}function Ya(e){return e.replace(/[-_]+/g," ").replace(/\b\w/g,t=>t.toUpperCase())}function Vi(e){const t=e.toLowerCase().replace(/[_\s]+/g,"-"),n={"cache-drop":"CACHE","cache-risk":"CACHE","context-bloat":"CTX","context-heavy":"CTX","elevated-context":"CTX","elevated-context-use":"CTX","estimated-pricing":"EST","expensive-low-output-call":"LO","high-context-use":"CTX","high-cost":"$","high-estimated-cost":"$","high-reasoning-share":"RSN","large-thread":"BIG","low-cache":"CACHE","low-cache-reuse":"CACHE","low-output":"LO","pricing-gap":"PRICE","reasoning-spike":"RSN","subagent-attribution":"SUB"};if(n[t])return n[t];const a=Ya(e).split(/\s+/).filter(Boolean);return a.length?a.length===1?a[0].slice(0,4).toUpperCase():a.slice(0,3).map(r=>r[0]).join("").toUpperCase():"?"}const Xl=[{accessorKey:"name",header:"Thread"},{accessorKey:"latestActivity",header:"Latest"},{accessorKey:"turns",header:"Turns",cell:e=>c.jsx("span",{className:"num",children:Le(Number(e.getValue()))})},{accessorKey:"totalDuration",header:"Duration"},{accessorKey:"averageGap",header:"Avg Gap",cell:e=>c.jsx("span",{className:"num",children:String(e.getValue())})},{accessorKey:"initiatorSummary",header:"Initiated",cell:e=>c.jsx("span",{className:"status-badge blue",children:String(e.getValue())})},{accessorKey:"modelSummary",header:"Models",cell:e=>c.jsx("span",{className:"pill model-pill",children:String(e.getValue())})},{accessorKey:"effortSummary",header:"Effort Mix"},{accessorKey:"totalTokens",header:"Total Tokens",cell:e=>c.jsx("span",{className:"num",children:ve(Number(e.getValue()))})},{accessorKey:"cachedInput",header:"Cached Input",cell:e=>c.jsx("span",{className:"num",children:ve(Number(e.getValue()))})},{accessorKey:"uncachedInput",header:"Uncached Input",cell:e=>c.jsx("span",{className:"num",children:ve(Number(e.getValue()))})},{accessorKey:"outputTokens",header:"Output Tokens",cell:e=>c.jsx("span",{className:"num",children:ve(Number(e.getValue()))})},{accessorKey:"reasoningOutput",header:"Reasoning Output",cell:e=>c.jsx("span",{className:"num",children:ve(Number(e.getValue()))})},{accessorKey:"cost",header:"Est. Cost",cell:e=>c.jsx("span",{className:"num",children:Xt(Number(e.getValue()))})},{accessorKey:"credits",header:"Codex Credits",cell:e=>c.jsx("span",{className:"num",children:ve(Number(e.getValue()))})},{accessorKey:"cachePct",header:"Cache %",cell:e=>c.jsx("span",{className:"cache-pill",children:dt(Number(e.getValue()))})},{accessorKey:"contextPct",header:"Context %",cell:e=>{const t=e.getValue();return c.jsx("span",{className:"num",children:typeof t=="number"?dt(t):"-"})}},{accessorKey:"costPerCall",header:"Cost / Call",cell:e=>c.jsx("span",{className:"num",children:Xt(Number(e.getValue()))})},{accessorKey:"coldResumeRisk",header:"Cold Resume Risk",cell:e=>c.jsx("span",{className:`status-badge ${Ki(String(e.getValue()))}`,children:String(e.getValue())})},{accessorKey:"productivity",header:"Productivity",cell:e=>c.jsx("span",{className:"score",children:Number(e.getValue())})}],Yl=[{id:"name",label:"Thread",locked:!0},{id:"latestActivity",label:"Latest"},{id:"turns",label:"Turns"},{id:"totalDuration",label:"Duration"},{id:"averageGap",label:"Avg Gap"},{id:"initiatorSummary",label:"Initiated"},{id:"modelSummary",label:"Models"},{id:"effortSummary",label:"Effort Mix"},{id:"totalTokens",label:"Total Tokens"},{id:"cachedInput",label:"Cached Input"},{id:"uncachedInput",label:"Uncached Input"},{id:"outputTokens",label:"Output Tokens"},{id:"reasoningOutput",label:"Reasoning Output"},{id:"cost",label:"Est. Cost"},{id:"credits",label:"Codex Credits"},{id:"cachePct",label:"Cache %"},{id:"contextPct",label:"Context %"},{id:"costPerCall",label:"Cost / Call"},{id:"coldResumeRisk",label:"Cold Resume Risk"},{id:"productivity",label:"Productivity"},{id:"investigate",label:"Investigate",locked:!0}];function Ki(e){return e==="High"?"red":e==="Medium"?"orange":e==="Low"?"green":"neutral"}const ht=1,re=0,qt=100,er=1e3,tr=500,nr="codexUsageDashboardLoadSettings",qi={day:1440*60*1e3,week:10080*60*1e3};function ct(e,t=tr){if((e==null?void 0:e.limit_label)==="All"||t===re&&(e==null?void 0:e.limit)==null)return re;const n=Number((e==null?void 0:e.limit)??(e==null?void 0:e.loaded_row_count)??t);return Number.isFinite(n)&&n>=0?n:t}function pt(e){return Number.isFinite(e)?e<=re?re:Math.max(ht,Math.round(e)):ht}function je(...e){const t=e.find(n=>typeof n=="number"&&Number.isFinite(n)&&n>0);return t?Math.max(ht,Math.round(t)):ht}function Hi(e,t,n=null,a="rows"){const r=pt(e);return{historyScope:t,loadWindow:a,limit:r===re?null:r,since:n}}function Wi(e){return e.limit??re}function mn(e){return gn(e==null?void 0:e.load_window)?e.load_window:e!=null&&e.since?"week":(e==null?void 0:e.limit_label)==="All"||(e==null?void 0:e.limit)==null?"all":"rows"}function Bi(e){return gn(e==null?void 0:e.default_load_window)?e.default_load_window:mn(e)}function Ht(e,t=new Date){const n=qi[e];if(!n)return null;const a=Math.floor(t.getTime()/6e4)*6e4;return new Date(a-n).toISOString()}function Re(e,t=tr){return e==="day"?"Last 24 hours":e==="week"?"Last 7 days":e==="all"?"All time":`Most recent ${pt(t).toLocaleString()}`}function Qi(e=ar()){if(!e)return null;try{const t=e.getItem(nr);if(!t)return null;const n=JSON.parse(t),a=typeof n.loadLimit=="number"&&Number.isFinite(n.loadLimit)?pt(n.loadLimit):void 0,r=n.historyScope==="active"||n.historyScope==="all"?n.historyScope:void 0,s=gn(n.loadWindow)?n.loadWindow:void 0;return a===void 0&&r===void 0&&s===void 0?null:{loadLimit:a,historyScope:r,loadWindow:s}}catch{return null}}function zi(e,t,n="rows",a=ar()){if(a)try{a.setItem(nr,JSON.stringify({loadLimit:pt(e),historyScope:t,loadWindow:n}))}catch{}}function gn(e){return e==="day"||e==="week"||e==="rows"||e==="all"}function Gi({currentLimit:e,loadedRows:t,pendingLimit:n}){const a=n===re?0:n+qt,s=Math.max(ht,e===re?0:e,a,t);return Math.ceil((s+er)/qt)*qt}function Ji({currentLimit:e,loadedRows:t,pendingLimit:n}){return Math.max(je(e),je(n),je(t))+er}function Zi({loadedRows:e,limit:t,totalRows:n}){return t===re&&e>0?`Loaded all ${e.toLocaleString()}`:n>e?`Loaded ${e.toLocaleString()} of ${n.toLocaleString()}`:`Loaded ${e.toLocaleString()} rows`}function ar(){try{return typeof window>"u"?null:window.sessionStorage}catch{return null}}async function Xi(e,t,n,a="",r=""){const s=Di();switch(e){case"threads":{const{threadCallsForCurrentUrl:i}=await O(async()=>{const{threadCallsForCurrentUrl:o}=await import("./ThreadsPage.js");return{threadCallsForCurrentUrl:o}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]));return te(`codex-thread-filtered-calls-${s}.csv`,i(t,a),ce,"call rows")}case"cache-context":{const{cacheContextCallsForCurrentUrl:i}=await O(async()=>{const{cacheContextCallsForCurrentUrl:o}=await import("./CacheContextPage.js");return{cacheContextCallsForCurrentUrl:o}},__vite__mapDeps([28,1,2,29,30,22,31,32,6,33,19,20,21,9,10,23,34,4,3,5,7,15,35,24,25,26,12]));return te(`codex-${e}-calls-${s}.csv`,i(t),ce,"call rows")}case"usage-drain":{const{usageDrainCallsForCurrentUrl:i}=await O(async()=>{const{usageDrainCallsForCurrentUrl:o}=await import("./UsageDrainPage.js");return{usageDrainCallsForCurrentUrl:o}},__vite__mapDeps([36,1,2,34,4,20,21,9,10,16,17,18,24,37,38,25,26,12,39]));return te(`codex-usage-drain-calls-${s}.csv`,i(t),ce,"call rows")}case"diagnostics":{const{diagnosticsCallsForCurrentUrl:i}=await O(async()=>{const{diagnosticsCallsForCurrentUrl:o}=await import("./DiagnosticsPage.js");return{diagnosticsCallsForCurrentUrl:o}},__vite__mapDeps([40,1,2,29,33,19,20,21,9,10,23,24,41,4,6,7,34,3,25,26,12]));return te(`codex-diagnostics-calls-${s}.csv`,i(t),ce,"call rows")}case"reports":{const{reportCallsForCurrentUrl:i}=await O(async()=>{const{reportCallsForCurrentUrl:o}=await import("./ReportsPage.js");return{reportCallsForCurrentUrl:o}},__vite__mapDeps([42,1,2,34,4,6,33,19,20,21,9,10,16,17,18,30,22,35,23,24,25,26,12,43]));return te(`codex-reports-evidence-${s}.csv`,i(t),ce,"call rows")}case"settings":return te(`codex-dashboard-settings-${s}.csv`,eo(t,n),Yi,"settings rows");case"calls":{const{callsForCurrentUrl:i}=await O(async()=>{const{callsForCurrentUrl:o}=await import("./CallsPage.js");return{callsForCurrentUrl:o}},__vite__mapDeps([44,1,2,3,4,5,6,7,14,29,33,19,45,22,11,12,13,35,23,24,34,46,47,38,25,26,48]));return te(`codex-calls-${s}.csv`,i(t.calls,a,r),ce,"call rows")}case"overview":{const{overviewCallsForQuery:i}=await O(async()=>{const{overviewCallsForQuery:o}=await import("./OverviewPage.js");return{overviewCallsForQuery:o}},__vite__mapDeps([49,1,2,34,4,20,21,9,10,31,32,6,16,17,18,45,22,11,12,13,14,35,23,24,25,26,50]));return te(`codex-overview-calls-${s}.csv`,i(t.calls,a),ce,"call rows")}case"investigator":{const{investigatorCallsForCurrentUrl:i}=await O(async()=>{const{investigatorCallsForCurrentUrl:o}=await import("./InvestigatorPage.js");return{investigatorCallsForCurrentUrl:o}},__vite__mapDeps([51,1,2,34,4,6,41,7,20,21,9,10,16,17,18,45,22,11,12,13,23,24,38,25,26,52]));return te(`codex-investigator-calls-${s}.csv`,i(t),ce,"call rows")}case"compression-lab":return te(`codex-compression-lab-scope-${s}.csv`,t.calls,ce,"call rows");case"call":return te(`codex-call-calls-${s}.csv`,Pi(t),ce,"call rows")}}function te(e,t,n,a){return{filename:e,csv:Ei(t,n),rowCount:t.length,label:a}}const Yi=[{header:"Field",value:e=>e.field},{header:"Value",value:e=>e.value}];function eo(e,t){return[{field:"live_api",value:t.canUseLiveApi?"available":"static snapshot"},{field:"context_api",value:t.contextRuntime.contextApiEnabled?"enabled":"gated"},{field:"history_scope",value:t.historyScope},{field:"data_window",value:Re(t.loadWindow,t.loadLimit)},{field:"scope_since",value:t.scopeSince??"none"},{field:"row_request",value:t.loadLimit===re?"no cap":String(t.loadLimit)},{field:"loaded_rows",value:String(t.loadedRowCount)},{field:"total_available_rows",value:String(t.totalAvailableRows)},{field:"auto_refresh",value:t.autoRefreshEnabled?"enabled":"paused"},{field:"refresh_state",value:t.refreshState},{field:"visible_calls",value:String(e.calls.length)},{field:"visible_threads",value:String(e.threads.length)}]}function to(e){return e instanceof Error?e.message:String(e)}function Yn(e,t){const n=t==="all"?"all history":"active history",a=e.message||"Refreshing usage index",r=typeof e.percent=="number"?` ${Math.round(e.percent)}%`:"";return`${a}${r} (${n})`}function Wt(e,t="active"){return e?typeof e.include_archived=="boolean"?e.include_archived?"all":"active":e.history_scope==="all-history"||e.history_scope==="all"?"all":e.history_scope==="active"?"active":t:t}function no({historyScope:e,activeRows:t,allRows:n,archivedRows:a}){const r=ao({activeRows:t,allRows:n,archivedRows:a});return e==="all"?r===null?"All history selected":r>0?`All history includes ${r.toLocaleString()} archived calls`:"All history selected; no archived calls are indexed yet":r===null||r<=0?"Active sessions only":`Active sessions only; ${r.toLocaleString()} archived calls hidden`}function ao({activeRows:e,allRows:t,archivedRows:n}){const a=Bt(n);if(a!==null)return a;const r=Bt(e),s=Bt(t);return r!==null&&s!==null?Math.max(s-r,0):null}function Bt(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?Math.round(e):null}const rr=["aria-description","aria-label","aria-valuetext","title","placeholder","alt"],ro="data-localization-attributes",so=new Set(["CODE","KBD","PRE","SAMP","SCRIPT","STYLE","TEXTAREA"]),en=new WeakMap,tn=new WeakMap;function io({value:e,children:t}){return c.jsxs(Ys,{value:e,children:[c.jsx(oo,{}),t]})}function oo(){const e=Va();return C.useLayoutEffect(()=>{const t=document.querySelector("[data-dashboard-localization-root]");if(!t)return;if(e.language!=="zh-Hans"){lo(t),document.title="Codex Usage Tracker React Dashboard";return}document.title="Codex Usage Tracker · 用量仪表盘",ea(t,e.translateText);const n=new MutationObserver(a=>{for(const r of a){if(r.type==="characterData"&&r.target instanceof Text){nn(r.target,e.translateText);continue}if(r.type==="attributes"&&r.target instanceof Element){an(r.target,e.translateText);continue}for(const s of r.addedNodes)s instanceof Text?nn(s,e.translateText):s instanceof Element&&ea(s,e.translateText)}});return n.observe(t,{attributes:!0,attributeFilter:[...rr],characterData:!0,childList:!0,subtree:!0}),()=>n.disconnect()},[e]),null}function ea(e,t){if(Rt(e))return;an(e,t);const n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT);let a=n.nextNode();for(;a;){if(a instanceof Element){if(Rt(a)){a=co(n,a,e);continue}an(a,t)}else a instanceof Text&&nn(a,t);a=n.nextNode()}}function co(e,t,n){let a=t;for(;a&&a!==n;){const r=e.nextSibling();if(r)return r;a=a.parentNode,a&&(e.currentNode=a)}return null}function nn(e,t){const n=e.parentElement;if(!n||Rt(n))return;const a=e.nodeValue??"",r=en.get(e),s=r&&(a===r.source||a===r.translated)?r.source:a,i=s.match(/^(\s*)([\s\S]*?)(\s*)$/u);if(!i||!i[2])return;const o=t(i[2]),d=`${i[1]}${o}${i[3]}`;en.set(e,{source:s,translated:d}),d!==a&&(e.nodeValue=d)}function an(e,t){if(Rt(e))return;const n=new Set((e.getAttribute(ro)??"").split(/[\s,]+/u).filter(Boolean));if(!n.size)return;const a=tn.get(e)??new Map;for(const r of rr){if(!n.has(r))continue;const s=e.getAttribute(r);if(!s)continue;const i=a.get(r),o=i&&(s===i.source||s===i.translated)?i.source:s,d=t(o);a.set(r,{source:o,translated:d}),d!==s&&e.setAttribute(r,d)}a.size&&tn.set(e,a)}function lo(e){const t=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT);ta(e);let n=t.nextNode();for(;n;){if(n instanceof Text){const a=en.get(n);a&&n.nodeValue===a.translated&&(n.nodeValue=a.source)}else n instanceof Element&&ta(n);n=t.nextNode()}}function ta(e){const t=tn.get(e);if(t)for(const[n,a]of t)e.getAttribute(n)===a.translated&&e.setAttribute(n,a.source)}function Rt(e){return so.has(e.tagName)||!!e.closest('[data-localization-skip="true"]')}const Mt=["May 12","May 19","May 26","Jun 02","Jun 09","Jun 16","Jun 23","Jun 30"],it=Mt.slice(2),sr={contextRuntime:{apiToken:"",contextApiEnabled:!1,fileMode:!1},cards:[{label:"Total Tokens",value:"24.83M",detail:"7-day total: 12.56M",trend:"up 18.7% vs prior 7 days",tone:"blue"},{label:"Estimated Cost",value:"$42.67",detail:"7-day total: $24.81",trend:"up 14.2% vs prior 7 days",tone:"green"},{label:"Cache Hit Rate",value:"38.7%",detail:"7-day average: 42.3%",trend:"down 3.6pp vs prior 7 days",tone:"purple"},{label:"Total Calls",value:"1,342",detail:"678 calls in last 7 days",trend:"up 11.3% vs prior 7 days",tone:"blue"},{label:"Usage Remaining",value:"32.4%",detail:"~15.9K credits estimated",trend:"resets in 4d 12h",tone:"green"}],tokenSeries:[W("input","Input","#2563eb",[5.2,6.4,7.5,9.2,6.7,7.5,6.6,9],1e6),W("output","Output","#059669",[2.5,3,3.6,5.1,3.7,5,4,5.4],1e6),W("cached","Cached","#7c3aed",[1.1,1.4,1.7,2.4,1.8,2.3,1.8,2.6],1e6,!0)],costSeries:[W("cost","Estimated Cost","#2563eb",[8.4,10.1,14.3,9.9,11.4,7.8,12.7,16.5])],cacheSeries:[W("cache","Cache Hit Rate","#059669",[58,61,39,45,50,44,48,41])],weeklyCreditSeries:[{id:"pro",label:"Pro observed",color:"#2563eb",points:Mt.map((e,t)=>({label:e,value:[59800,44900,45e3,40500,42800,38900,31400,35900][t]??0,low:[52100,38800,38900,34700,36200,32200,26100,29900][t]??0,high:[67400,51200,51100,46800,49200,45100,37300,41900][t]??0}))},W("pro-trend","Pro trend","#1d4ed8",[54.2,51,47.8,44.6,41.4,38.2,35,31.8],1e3,!0),W("prolite","Prolite observed","#0f766e",[15.9,15.8,15.9,16.1,15.7,15.6,15.9,15.8],1e3)],usageRemainingSeries:[W("remaining","Usage remaining","#059669",[87,71,63,56,56,48,50,54]),W("allowance","Allowance guide","#0f766e",[86,85,84,83,82,81,80,79],1,!0)],actualVsPredictedSeries:[W("observed","Observed drain","#2563eb",[18.7,22.1,45.3,31,34.8],1e3),W("predicted","Predicted baseline","#1d4ed8",[17.9,21.4,41.2,29.6,33.9],1e3,!0)],findings:[{rank:1,title:"Long Thread: data-engine-refactor",severity:"High",credits:12847,share:25.6,summary:"Very long duration with high model effort."},{rank:2,title:"Cache Misses (Large Inputs)",severity:"High",credits:9612,share:19.1,summary:"Large uncached inputs across 214 calls."},{rank:3,title:"High Model Effort",severity:"Medium",credits:7404,share:14.7,summary:"Reasoning and output token volume are concentrated."},{rank:4,title:"Tool Output Volume",severity:"Medium",credits:5231,share:10.4,summary:"Large tool outputs returned to the model."}],calls:[["2026-06-01T10:24:00Z","Jun 1, 10:24 AM","thread-9f3a1c","codex-1","high",128542,45231,62,.42,"18.4s",!1,["review"]],["2026-06-01T10:18:00Z","Jun 1, 10:18 AM","thread-7b2e91","o4-mini","medium",98731,32104,41,.31,"12.7s",!0,["analysis"]],["2026-06-01T10:12:00Z","Jun 1, 10:12 AM","thread-3c8d4e","o3","high",64221,18903,28,.12,"9.3s",!0,["uncached"]],["2026-06-01T10:06:00Z","Jun 1, 10:06 AM","thread-1a2b3c","codex-1","high",245123,98112,71,.87,"27.6s",!1,["large"]],["2026-06-01T10:01:00Z","Jun 1, 10:01 AM","thread-8d7c6b","gpt-4.1","low",12543,4231,12,.03,"3.6s",!0,["quick"]],["2026-06-01T09:55:00Z","Jun 1, 09:55 AM","thread-2f9e7d","o4-mini","medium",76881,28442,39,.24,"11.2s",!1,["subagent"]],["2026-06-01T09:50:00Z","Jun 1, 09:50 AM","thread-6a5b4c","codex-1","high",312654,112991,67,1.12,"31.8s",!1,["file-heavy"]],["2026-06-01T09:47:00Z","Jun 1, 09:47 AM","thread-0f1e2d","o3","low",8221,2903,15,.02,"2.8s",!0,["fast"]]].map(([e,t,n,a,r,s,i,o,d,f,h,v],u)=>{const p=Number(s),g=Number(i),b=Number(o),w=Math.round(p*Math.max(100-b,0)/100);return{id:`fixture-call-${u}`,rawTime:String(e),eventTimestamp:String(e),callStartedAt:String(e),time:String(t),thread:String(n),model:String(a),effort:String(r),input:p,output:g,reasoningOutput:Math.round(g*.2),totalTokens:p+g,cachedInput:Math.round(p*b/100),uncachedInput:w,cachedPct:b,cost:u===4?0:Number(d),standardCost:u===4?0:Number(d),priorityCost:u===4?0:Number(d)*2,pricingServiceTier:"standard",billingBasis:"unknown",costSemantics:"api_token_estimate",credits:(u===4?0:Number(d))*25,duration:String(f),durationSeconds:Number.parseFloat(String(f))||0,previousCallGap:u===0?"-":`${u*7}m 0s`,previousCallEventTimestamp:u===0?"":`2026-06-01T09:${String(40+u).padStart(2,"0")}:00Z`,previousCallGapSeconds:u*420,initiator:u%3===0?"user":u%3===1?"assistant":"tool",initiatorReason:u%3===0?"direct user request":u%3===1?"assistant follow-up":"tool-driven continuation",initiatorConfidence:u%2===0?"exact":"estimated",serviceTier:"",fast:null,serviceTierSource:"",serviceTierConfidence:"",fastProxyCandidate:!!h,standardUsageCredits:(u===4?0:Number(d))*25,fastUsageCredits:(u===4?0:Number(d))*50,usageCreditMultiplier:1,usageCreditMultiplierSource:"tier_unknown",usageCreditMultiplierSourceUrl:"https://example.invalid/fixture-fast",usageCreditMultiplierFetchedAt:"2026-07-16",usageCreditMultiplierConfidence:"exact",usageCreditConfidence:u===7?"user_override":u%4===0?"exact":u%4===1?"estimated":u%4===2?"missing":"fixture",usageCreditModel:u===4?"":`${a}-credits`,usageCreditSource:u===4?"":"fixture-rate-card",usageCreditFetchedAt:u===4?"":"2026-06-01T10:00:00Z",usageCreditTier:u%2===0?"standard":"estimated",usageCreditNote:u===2?"fixture inherited rate card":"",pricingModel:u===4?"":`${a}-pricing`,pricingEstimated:u===1||u===5,signal:w>5e4?"cache-risk":"aggregate",recommendation:w>5e4?"Review uncached aggregate input before continuing this thread.":"",tags:v,sessionId:`fixture-session-${u}`,turnId:`fixture-turn-${u}`,parentSessionId:u%3===0?"fixture-parent-session":"",parentSessionUpdatedAt:u%3===0?"2026-06-01T09:30:00Z":"",parentThread:u%3===0?"parent-thread-analysis":"",threadAttachmentLabel:u%3===0?"spawned child thread":"direct active thread",threadSource:u%3===0?"subagent":"user",subagentType:u%3===0?"analysis":"",agentRole:u%3===0?"reviewer":"",agentNickname:u%3===0?"usage-reviewer":"",project:u%2===0?"codex-usage-tracker":"local-ops",projectRelativeCwd:u%2===0?"frontend/dashboard":".",projectTags:u%2===0?["dashboard","rewrite"]:["local"],cwd:`/fixtures/${u%2===0?"codex-usage-tracker":"local-ops"}`,sourceFile:`fixture-thread-${u}.jsonl`,lineNumber:120+u,gitBranch:"experiment/frontend-rewrite",gitRemoteLabel:"origin",gitRemoteHash:`fixture-${u}`,contextWindowPct:Math.min(18+b,96),modelContextWindow:128e3,cumulativeTotalTokens:p+g+u*1e4,estimatedCacheSavings:Math.round((p-w)*1e-5*100)/100,efficiencyFlags:w>5e4?["cache-risk"]:[]}}),threads:[["thread-9f3a",142,58400,8.76,12,1.38,"High",42],["thread-7c2b",87,31200,4.21,22,1.12,"Medium",55],["thread-1a8c",64,22700,3.02,18,.98,"High",48],["thread-d3e1",53,18100,2.11,41,.81,"Low",72],["thread-b7f0",41,13600,1.65,47,.73,"Low",75],["thread-3c5d",36,9900,1.18,35,.66,"Medium",63],["thread-0e16",28,6400,.72,56,.58,"Low",82]].map(([e,t,n,a,r,s,i,o],d)=>{const f=Number(t),h=Number(n),v=Number(r),u=f*48,p=(d+1)*420;return{name:String(e),latestCallId:`fixture-call-${d}`,latestActivity:`Jun ${d+1}, 10:${String(24-d).padStart(2,"0")} AM`,latestActivityRaw:`2026-06-${String(d+1).padStart(2,"0")}T10:${String(24-d).padStart(2,"0")}:00Z`,turns:f,totalDurationSeconds:u,totalDuration:`${Math.floor(u/60)}m ${u%60}s`,averageGapSeconds:p,averageGap:`${Math.floor(p/60)}m ${p%60}s`,initiatorSummary:d%2===0?"user x4, assistant x2":"assistant x3, tool x1",modelSummary:d%2===0?"codex-1 x5, o4-mini x2":"o4-mini x3, o3 x1",effortSummary:d%2===0?"high x5, medium x2":"medium x3, low x1",totalTokens:h,cachedInput:Math.round(h*v/100),uncachedInput:Math.round(h*Math.max(100-v,0)/100),outputTokens:Math.round(h*.28),reasoningOutput:Math.round(h*.08),cost:Number(a),credits:Number(a)*25,cachePct:v,contextPct:Math.min(96,28+d*7),costPerCall:Number(s),coldResumeRisk:i,productivity:Number(o)}}),weeklyWindows:Mt.map((e,t)=>({week:e,plan:t===0?"Prolite":"Pro",observedPct:[61.4,49.2,47.7,48.3,44.5,37.4,40.1,35.8][t]??0,credits:[49812,41275,39887,40563,37284,31420,33842,35900][t]??0,projected:[49812,41275,39887,40563,37284,31420,33842,35900][t]??0,ciLow:[42156,34892,33424,34021,31241,26164,28234,29450][t]??0,ciHigh:[57467,47657,46349,47105,43326,36676,39450,41900][t]??0,confidence:t===0?"Medium":"High",note:["Prolite baseline","Drop in credits","Stable","Slight uptick","Down again","Lowest window","Recovery","Latest"][t]??""})),modelCosts:[{label:"codex-1",value:16.21,color:"#2563eb"},{label:"o3",value:12.43,color:"#1d4ed8"},{label:"o4-mini",value:7.62,color:"#059669"},{label:"gpt-4.1",value:4.91,color:"#f59e0b"},{label:"other",value:1.5,color:"#94a3b8"}],commandActions:[{title:"Show highest uncached calls",status:"Ready",owner:"Calls",description:"214 calls above the uncached threshold."},{title:"Compare Pro weeks",status:"Ready",owner:"Usage Drain",description:"Allowance windows with confidence intervals."},{title:"Find cold resumes",status:"Ready",owner:"Cache",description:"14 threads with long idle gaps."},{title:"Export support bundle",status:"Planned",owner:"Reports",description:"Local aggregate artifacts only."}],cacheSegments:[{label:"Cache read",value:38.7,color:"#2563eb"},{label:"Cache write",value:29.6,color:"#059669"},{label:"Uncached",value:31.7,color:"#7c3aed"}],cacheHeatmap:[{thread:"thread-8c1e",labels:it,values:[62,71,89,82,74,31]},{thread:"thread-2b9d",labels:it,values:[42,58,77,61,51,24]},{thread:"thread-713a",labels:it,values:[78,81,83,66,59,37]},{thread:"thread-4af2",labels:it,values:[24,36,63,54,71,44]},{thread:"thread-f9c3",labels:it,values:[18,25,41,38,52,22]}],diagnostics:[{title:"Usage Drain",status:"Ready",finding:"Projected weekly credits declined from the baseline and partially recovered in the latest window.",confidence:"High",metric:"33,842 credits / week",series:[W("usage-drain","Projected credits","#2563eb",[41.8,46.7,45.9,32.1,33.8],1e3)]},{title:"Cache Behavior",status:"Ready",finding:"Cache hit rate is healthy overall, with spikes aligned to large cache misses and cold resumes.",confidence:"Medium",metric:"41.1% hit rate",series:[W("cache","Cache hit %","#059669",[44,48,38,33,40])]},{title:"Thread Efficiency",status:"Ready",finding:"Long threads account for most estimated cost and are the clearest optimization target.",confidence:"High",metric:"65% cost share",series:[W("threads","Cost share","#1d4ed8",[65,23,8,4])]},{title:"Tool And Command Activity",status:"Stale",finding:"Command volume is stable with a slight upward trend; read and shell commands dominate.",confidence:"Medium",metric:"912 commands",series:[W("commands","Commands","#7c3aed",[542,488,611,883,912])]}],reports:[{title:"Weekly Credits",status:"Ready",owner:"Usage Drain",description:"Plan-specific weekly credits, trend lines, and confidence intervals."},{title:"Usage Remaining",status:"Ready",owner:"Usage Drain",description:"Observed remaining usage over time with reset handling."},{title:"Cost Curves",status:"Ready",owner:"Threads",description:"Cumulative estimated cost by thread and concentration metrics."},{title:"Usage Drain Model",status:"Ready",owner:"Reports",description:"Actual-vs-predicted drain and feature group comparisons."},{title:"Fast Mode Proxy",status:"Planned",owner:"Calls",description:"Candidate detection, speedup histogram, and confidence breakdowns."},{title:"Allowance Change",status:"Planned",owner:"Reports",description:"Week-to-week allowance estimate changes with careful language."}]};function W(e,t,n,a,r=1,s=!1){return{id:e,label:t,color:n,dashed:s,points:a.map((i,o)=>({label:Mt[o]??`Point ${o+1}`,value:i*r}))}}function ir(e){if(window.location.protocol==="file:")throw new Error("Live refresh requires the localhost dashboard server.");if(!(e!=null&&e.api_token))throw new Error("Live refresh requires localhost dashboard API token.")}function pn(e){return{Accept:"application/json","X-Codex-Usage-Token":e.api_token||""}}function uo(e,t){return new Promise((n,a)=>{if(t!=null&&t.aborted){a(na(t));return}const r=window.setTimeout(()=>{t==null||t.removeEventListener("abort",s),n()},e);function s(){window.clearTimeout(r),a(na(t))}t==null||t.addEventListener("abort",s,{once:!0})})}function or(e){return(e instanceof DOMException||e instanceof Error)&&e.name==="AbortError"}function na(e){return(e==null?void 0:e.reason)instanceof Error?e.reason:new DOMException("The request was cancelled.","AbortError")}const ho=["#2563eb","#1d4ed8","#059669","#f59e0b","#94a3b8"];function cr(e){const t=new Map;e.forEach(r=>{const s=r.model||"unknown";t.set(s,(t.get(s)??0)+r.cost)});const n=[...t.entries()].sort((r,s)=>s[1]-r[1]||r[0].localeCompare(s[0]));return(n.length>5?[...n.slice(0,4),["other",n.slice(4).reduce((r,s)=>r+s[1],0)]]:n).map(([r,s],i)=>({label:r,value:s,color:ho[i]??"#94a3b8"}))}function lr(e){if(!e.length)return[];const t=Math.max(e.reduce((n,a)=>n+bt(a),0),1);return[fo(e,t),mo(e,t),go(e,t),po(e,t)].filter(n=>!!n).sort((n,a)=>a.credits-n.credits).map((n,a)=>({...n,rank:a+1}))}function ur(e){if(!e.length)return[];const t=[{title:"Cost Curves",status:"Ready",owner:"Threads",description:"Estimated cost concentration by loaded aggregate thread."},{title:"Usage Drain Model",status:"Ready",owner:"Reports",description:"Highest estimated credit-impact calls from loaded aggregate rows."}];return e.some(n=>n.fastProxyCandidate||n.effort.toLowerCase()==="low")&&t.push({title:"Fast Mode Proxy",status:"Ready",owner:"Calls",description:"Low-effort and fast-call candidates inferred from aggregate rows."}),t}function fo(e,t){const n=new Map;e.forEach(i=>n.set(i.thread,[...n.get(i.thread)??[],i]));const[a,r]=[...n.entries()].sort((i,o)=>Ae(o[1],f=>f.totalTokens)-Ae(i[1],f=>f.totalTokens)||o[1].length-i[1].length)[0]??[];if(!a||!(r!=null&&r.length)||r.length<2)return null;const s=Ae(r,bt);return{rank:0,title:`Long Thread: ${a}`,severity:s/t>=.25||r.length>=8?"High":"Medium",credits:Math.round(s),share:s/t*100,summary:`${r.length.toLocaleString()} loaded calls and ${Ae(r,i=>i.totalTokens).toLocaleString()} tokens in this thread.`}}function mo(e,t){const n=e.filter(r=>r.signal==="cache-risk"||r.cachedPct<35||r.uncachedInput>5e4);if(!n.length)return null;const a=Ae(n,bt);return{rank:0,title:"Cache Misses (Large Inputs)",severity:n.some(r=>r.cachedPct<20||r.uncachedInput>5e4)?"High":"Medium",credits:Math.round(a),share:a/t*100,summary:`${n.length.toLocaleString()} loaded calls show low cache reuse or large uncached input.`}}function go(e,t){const n=e.filter(r=>r.effort.toLowerCase()==="high"||r.reasoningOutput>0);if(!n.length)return null;const a=Ae(n,bt);return{rank:0,title:"High Model Effort",severity:a/t>=.25?"High":"Medium",credits:Math.round(a),share:a/t*100,summary:`${n.length.toLocaleString()} loaded calls use high effort or report reasoning output.`}}function po(e,t){const n=Math.max(25e3,bo(e.map(s=>s.output),.75)),a=e.filter(s=>s.output>=n||s.tags.some(i=>["file-heavy","subagent","large"].includes(i)));if(!a.length)return null;const r=Ae(a,bt);return{rank:0,title:"Tool Output Volume",severity:a.some(s=>s.output>5e4)?"High":"Medium",credits:Math.round(r),share:r/t*100,summary:`${a.length.toLocaleString()} loaded calls have high output volume or file-heavy/subagent tags.`}}function bt(e){return e.credits>0?e.credits:e.cost*25}function Ae(e,t){return e.reduce((n,a)=>n+t(a),0)}function bo(e,t){const n=e.filter(a=>Number.isFinite(a)).sort((a,r)=>a-r);return n.length?n[Math.min(n.length-1,Math.max(0,Math.floor((n.length-1)*t)))]??0:0}function dr(e){const t=new Map;for(const a of e){if(!Number.isFinite(a.timestamp))continue;const r=hr(a.timestamp),s=t.get(r)??{label:fr(a.timestamp),timestamp:wo(a.timestamp),cached:0,cost:0,input:0,output:0};s.cached+=a.cached,s.cost+=a.cost,s.input+=a.input,s.output+=a.output,t.set(r,s)}const n=vo(t);return n.length?{tokenSeries:[{id:"input",label:"Input",color:"#2563eb",points:n.map(a=>({label:a.label,value:a.input}))},{id:"output",label:"Output",color:"#059669",points:n.map(a=>({label:a.label,value:a.output}))},{id:"cached",label:"Cached",color:"#7c3aed",dashed:!0,points:n.map(a=>({label:a.label,value:a.cached}))}],costSeries:[{id:"cost",label:"Estimated Cost",color:"#f59e0b",points:n.map(a=>({label:a.label,value:a.cost}))}],cacheSeries:[{id:"cache",label:"Cache hit %",color:"#2563eb",points:n.map(a=>({label:a.label,value:a.input>0?a.cached/a.input*100:0}))}]}:{tokenSeries:[],costSeries:[],cacheSeries:[]}}function vo(e){const t=[...e.values()].sort((s,i)=>s.timestamp-i.timestamp),n=t.at(0),a=t.at(-1);if(!n||!a)return[];const r=[];for(const s=new Date(n.timestamp);s.getTime()<=a.timestamp;s.setDate(s.getDate()+1)){const i=s.getTime(),o=hr(i);r.push(e.get(o)??{label:fr(i),timestamp:i,cached:0,cost:0,input:0,output:0})}return r}function hr(e){const t=new Date(e),n=String(t.getMonth()+1).padStart(2,"0"),a=String(t.getDate()).padStart(2,"0");return`${t.getFullYear()}-${n}-${a}`}function wo(e){const t=new Date(e);return new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()}function fr(e){return new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric"}).format(new Date(e))}function B(e,t){var a;const n=Number(((a=e.summary)==null?void 0:a[t])??0);return Number.isFinite(n)?n:0}function yo(e){if(!(!e.summary||e.load_window==="rows"))return{visibleCalls:B(e,"visible_calls"),inputTokens:B(e,"input_tokens"),cachedInputTokens:B(e,"cached_input_tokens"),uncachedInputTokens:B(e,"uncached_input_tokens"),outputTokens:B(e,"output_tokens"),reasoningOutputTokens:B(e,"reasoning_output_tokens"),totalTokens:B(e,"total_tokens"),estimatedCostUsd:B(e,"estimated_cost_usd"),usageCredits:B(e,"usage_credits")}}function _o(e){return{cost:Number(e.estimated_cost_usd??0),standardCost:aa(e.standard_cost_usd),priorityCost:aa(e.priority_cost_usd),pricingServiceTier:String(e.pricing_service_tier??""),billingBasis:String(e.billing_basis??"unknown"),costSemantics:String(e.cost_semantics??"api_token_estimate")}}function aa(e){if(e==null||e==="")return null;const t=Number(e);return Number.isFinite(t)?t:null}function So(e,t,n){const a=e.fast,r=a===!0||a===1?!0:a===!1||a===0?!1:null;return{credits:Number(e.usage_credits??0),serviceTier:String(e.service_tier??""),fast:r,serviceTierSource:String(e.service_tier_source??""),serviceTierConfidence:String(e.service_tier_confidence??""),fastProxyCandidate:t>0&&n/Math.max(t,1)>4e3,standardUsageCredits:Number(e.standard_usage_credits??e.usage_credits??0),fastUsageCredits:Co(e.fast_usage_credits),usageCreditMultiplier:Number(e.usage_credit_multiplier??1),usageCreditMultiplierSource:String(e.usage_credit_multiplier_source??""),usageCreditMultiplierSourceUrl:String(e.usage_credit_multiplier_source_url??""),usageCreditMultiplierFetchedAt:String(e.usage_credit_multiplier_fetched_at??""),usageCreditMultiplierConfidence:String(e.usage_credit_multiplier_confidence??"")}}function Co(e){if(e==null||e==="")return null;const t=Number(e);return Number.isFinite(t)?t:null}const xo=1e4,ko=500;async function ra(e,t,n){var s,i;const a=t.limit&&t.limit>0?t.limit:ko,r=await n(e,{...t,limit:a});return(i=t.onProgress)==null||i.call(t,{status:"completed",phase:"loading_rows",message:`Loaded ${t.loadWindow==="all"?"all-history":t.loadWindow} evidence window`,completed:Number(r.loaded_row_count??((s=r.rows)==null?void 0:s.length)??0),total:Number(r.total_available_rows??r.loaded_row_count??0),percent:100}),r}async function sa(e,t,n){var o,d;const a=[];let r=0,s=null,i=Number((e==null?void 0:e.total_available_rows)??0);for(let f=0;f<1e3;f+=1){(o=t.signal)==null||o.throwIfAborted();const h=await n(e,{...t,refresh:f===0?t.refresh:!1,limit:xo,offset:r}),v=h.rows??[];s=h,a.push(...v),i=Number(h.total_available_rows??i??a.length);const u=a.length>=i||!h.has_more;if((d=t.onProgress)==null||d.call(t,{status:u?"completed":"running",phase:"loading_rows",message:"Loading all rows",completed:a.length,total:i,percent:u?100:i>0?Math.min(99,Math.floor(a.length/i*100)):0}),r+=v.length,!h.has_more||v.length===0||a.length>=i)break}return{...s??e??{},rows:a,loaded_row_count:a.length,limit:null,limit_label:"All",has_more:!1,total_available_rows:i||a.length}}function To(){if(window.__CODEX_USAGE_BOOT__)return window.__CODEX_USAGE_BOOT__;const e=document.getElementById("usage-data");if(!(e!=null&&e.textContent))return null;try{return JSON.parse(e.textContent)}catch{return null}}async function Lo(e,t={}){if(t.refresh&&(e!=null&&e.refresh_jobs_available)){const n=await Ro(e,t),a={...t,refresh:!n};return a.loadWindow&&a.loadWindow!=="rows"?ra(e,a,He):a.limit===0?sa(e,a,He):He(e,a)}return t.loadWindow&&t.loadWindow!=="rows"?ra(e,t,He):t.limit===0?sa(e,t,He):He(e,t)}async function Ro(e,t){try{return await Mo(e,t),!0}catch(n){if(or(n)||n instanceof mr)throw n;return!1}}async function He(e,t={}){ir(e);const n=new URLSearchParams({refresh:t.refresh?"1":"0",limit:String(t.limit??(e==null?void 0:e.limit)??(e==null?void 0:e.loaded_row_count)??500),_:String(Date.now())});t.loadWindow&&n.set("load_window",t.loadWindow),t.since&&n.set("since",t.since),t.offset&&t.offset>0&&n.set("offset",String(t.offset)),(t.includeArchived??_r(e))&&n.set("include_archived","1");const r=await fetch(`/api/usage?${n.toString()}`,{headers:pn(e),cache:"no-store",signal:t.signal});return await bn(r,"Usage refresh")}async function Mo(e,t){var o;ir(e);const n=new URLSearchParams({_:String(Date.now())});(t.includeArchived??_r(e))&&n.set("include_archived","1");const r=await fetch(`/api/refresh/start?${n.toString()}`,{headers:pn(e),cache:"no-store",signal:t.signal}),s=await bn(r,"Usage refresh start");(o=t.onProgress)==null||o.call(t,s);const i=typeof s.job_id=="string"?s.job_id:"";if(!i)throw new Error("Usage refresh start did not return a job id.");return Po(e,i,t.onProgress,t.signal)}async function Po(e,t,n,a){for(let r=0;r<600;r+=1){a==null||a.throwIfAborted();const s=new URLSearchParams({job_id:t,_:String(Date.now())}),i=await fetch(`/api/refresh/status?${s.toString()}`,{headers:pn(e),cache:"no-store",signal:a}),o=await bn(i,"Usage refresh status");if(n==null||n(o),o.status==="completed")return o;if(o.status==="failed")throw new mr(o.error||o.message||"Usage refresh failed.");await uo(Math.min(1e3,150+r*50),a)}throw new Error("Usage refresh did not complete before the polling timeout.")}class mr extends Error{}function ia(e){if(!e)return{...sr,contextRuntime:sn(e)};const t=e.rows??[],n=t.map(pr),a=t.length?Te(t,b=>Number(b.total_tokens??0)):B(e,"total_tokens"),r=t.length?Te(t,b=>Number(b.estimated_cost_usd??0)):B(e,"estimated_cost_usd"),s=t.length?Te(t,b=>Number(b.cached_input_tokens??0)):B(e,"cached_input_tokens"),i=t.length?Te(t,b=>Number(b.input_tokens??0)):B(e,"input_tokens"),o=t.length?Te(t,b=>{const w=Number(b.input_tokens??0),T=Number(b.cached_input_tokens??0);return Number(b.uncached_input_tokens??Math.max(w-T,0))}):Math.max(i-s,0),d=t.length?Te(t,b=>Number(b.output_tokens??0)):B(e,"output_tokens"),f=t.length?Te(t,b=>Number(b.reasoning_output_tokens??0)):B(e,"reasoning_output_tokens"),h=i>0?s/i*100:0,v=n.length||Math.max(0,Number(e.loaded_row_count??0)),u=Ao(t),p=No(t),g=$o({cachePct:h,cachedTokens:s,estimatedCost:r,historyScope:e.history_scope??"active",totalCalls:v,totalTokens:a,tokenBreakdown:{cachedInput:s,uncachedInput:o,output:d,reasoningOutput:f},usageRemainingCard:Io(e)});return{...jo(e),contextRuntime:sn(e),scopeSummary:yo(e),cards:g,...u,...p,calls:n,threads:Sr(n),findings:lr(n),modelCosts:cr(n),reports:ur(n),cacheSegments:[{label:"Cache read",value:h,color:"#2563eb"},{label:"Uncached input",value:Math.max(100-h,0),color:"#7c3aed"}]}}function jo(e){return{...sr,contextRuntime:sn(e),tokenSeries:[],costSeries:[],cacheSeries:[],weeklyCreditSeries:[],usageRemainingSeries:[],actualVsPredictedSeries:[],calls:[],threads:[],findings:[],weeklyWindows:[],modelCosts:[],commandActions:[],cacheSegments:[],cacheHeatmap:[],diagnostics:[],reports:[]}}function Ao(e){return dr(e.map(t=>({timestamp:wn(t),cached:Number(t.cached_input_tokens??0),cost:Number(t.estimated_cost_usd??0),input:Number(t.input_tokens??0),output:Number(t.output_tokens??0)})))}function No(e){const t=[...e].map(f=>({row:f,timestamp:wn(f)})).filter(f=>Number.isFinite(f.timestamp)).sort((f,h)=>f.timestamp-h.timestamp),n=new Map;for(const{row:f,timestamp:h}of t){const v=rn(h),u=n.get(v)??{timestamp:h,credits:0,weeklyUsedPercent:null};u.credits+=Math.max(0,Number(f.usage_credits??0));const p=Oe(f.rate_limit_secondary_used_percent);p!==null&&(u.weeklyUsedPercent=p),n.set(v,u)}const a=[...n.entries()].map(([f,h])=>({label:f,...h}));let r=0;const s=a.map(f=>(r+=f.credits,{label:f.label,value:r})),i=s.map((f,h)=>{var v;return{label:f.label,value:s.length>1?(((v=s.at(-1))==null?void 0:v.value)??0)*((h+1)/s.length):f.value}}),o=a.filter(f=>f.weeklyUsedPercent!==null).map(f=>({label:f.label,value:Pt(100-(f.weeklyUsedPercent??0))})),d=Eo(e);return{weeklyCreditSeries:Fo(d),usageRemainingSeries:o.length?[{id:"weekly-remaining",label:"Weekly remaining",color:"#059669",points:o}]:[],actualVsPredictedSeries:s.length?[{id:"observed-drain",label:"Observed drain",color:"#2563eb",points:s},{id:"loaded-baseline",label:"Loaded-row baseline",color:"#1d4ed8",dashed:!0,points:i}]:[],weeklyWindows:d}}function Eo(e){const t=new Map;for(const n of e){const a=wn(n);if(!Number.isFinite(a))continue;const r=Do(n,a),s=t.get(r)??{rows:[],latestTimestamp:0,latestUsedPercent:null};s.rows.push(n),a>=s.latestTimestamp&&(s.latestTimestamp=a,s.latestUsedPercent=Oe(n.rate_limit_secondary_used_percent)),t.set(r,s)}return[...t.entries()].map(([n,a])=>{var i;const r=a.rows.reduce((o,d)=>o+Math.max(0,Number(d.usage_credits??0)),0),s=a.latestUsedPercent??0;return{week:n,plan:String(((i=a.rows[0])==null?void 0:i.rate_limit_plan_type)??"unknown"),observedPct:s,credits:r,projected:s>0?r/(s/100):r,ciLow:s>0?r/(s/100)*.85:r,ciHigh:s>0?r/(s/100)*1.15:r,confidence:a.rows.length>=20?"Medium":"Low",note:`Loaded ${vn(a.rows.length)} rows`}}).sort((n,a)=>n.week.localeCompare(a.week))}function Fo(e){return e.length?[{id:"weekly-projected",label:"Projected weekly credits",color:"#2563eb",points:e.map(t=>({label:t.week,value:t.projected,low:t.ciLow,high:t.ciHigh}))},{id:"loaded-credits",label:"Loaded-row credits",color:"#0f766e",dashed:!0,points:e.map(t=>({label:t.week,value:t.credits}))}]:[]}function Do(e,t){const n=Be(e.rate_limit_secondary_resets_at);return n!==null&&n>0?rn(n*1e3):rn(t)}function rn(e){return new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric"}).format(new Date(e))}function sn(e){return{apiToken:String((e==null?void 0:e.api_token)??""),contextApiEnabled:!!(e!=null&&e.context_api_enabled),fileMode:window.location.protocol==="file:"}}function $o(e){return[{label:"Total Tokens",value:Me(e.totalTokens),detail:`${e.historyScope} history scope`,trend:"loaded aggregate rows",tone:"blue",breakdown:[{label:"Cached",value:Me(e.tokenBreakdown.cachedInput)},{label:"Uncached",value:Me(e.tokenBreakdown.uncachedInput)},{label:"Output",value:Me(e.tokenBreakdown.output)},{label:"Reasoning",value:Me(e.tokenBreakdown.reasoningOutput)}]},{label:"Estimated Cost",value:Wo(e.estimatedCost),detail:"local pricing config",trend:"privacy-safe estimate",tone:"green"},{label:"Cache Hit Rate",value:`${e.cachePct.toFixed(1)}%`,detail:`${Me(e.cachedTokens)} cached input`,trend:e.cachePct>=40?"healthy cache reuse":"cache risk",tone:e.cachePct>=40?"purple":"orange"},{label:"Total Calls",value:vn(e.totalCalls),detail:"loaded calls in this dashboard",trend:"privacy-safe",tone:"blue"},e.usageRemainingCard]}function Io(e){const t=Oo(e.observed_usage);if(t)return t;const n=Uo(e.allowance_windows);return n||{label:"Usage Remaining",value:"Unknown",detail:e.allowance_configured?"allowance configured; no current window":"no observed usage or allowance window",trend:e.allowance_error?`config issue: ${e.allowance_error}`:"not available in payload",tone:e.allowance_error?"red":"orange"}}function Oo(e){const t=Array.isArray(e==null?void 0:e.windows)?e.windows:[];if(!(e!=null&&e.available)||!t.length)return null;const n=gr(t,s=>Oe(s.used_percent)!==null);if(!n)return null;const a=Oe(n.used_percent)??0,r=Pt(100-a);return{label:"Usage Remaining",value:br(r),detail:`${wr(n.label||n.key,"Observed usage")} observed usage`,trend:vr(n.resets_at)||e.source||"observed locally",tone:yr(r)}}function Uo(e){if(!Array.isArray(e)||!e.length)return null;const t=gr(e,o=>{const d=Oe(o.remaining_percent),f=Be(o.remaining_credits),h=Be(o.total_credits);return d!==null||f!==null||h!==null&&h>0});if(!t)return null;const n=Be(t.remaining_credits),a=Be(t.total_credits),r=n!==null&&a!==null&&a>0?n/a*100:null,s=Oe(t.remaining_percent)??r;return{label:"Usage Remaining",value:s!==null?br(Pt(s)):`${oa(n??0)} left`,detail:`${wr(t.label||t.key,"Allowance")} allowance window`,trend:[n===null?"":`${oa(n)} left`,vr(t.reset_at)].filter(Boolean).join(" · ")||"configured allowance",tone:s===null?"green":yr(Pt(s))}}function gr(e,t){const n=e.filter(t);return n.find(Vo)??n[0]??null}function Vo(e){const t=Be(e.window_minutes),n=`${e.key??""} ${e.label??""}`.toLowerCase();return t===10080||/\b(weekly|week|7d|7-day|7 day)\b/.test(n)}function pr(e,t=0){const n=String(e.event_timestamp??e.time??e.turn_timestamp??e.started_at??e.call_started_at??""),a=n,r=String(e.call_started_at??e.started_at??n),s=Number(e.input_tokens??0),i=Number(e.output_tokens??0),o=Number(e.reasoning_output_tokens??0),d=Number(e.cached_input_tokens??0),f=Number(e.cache_hit_ratio??e.cache_ratio??0),h=s>0?d/s*100:f*100,v=Number(e.total_tokens??s+i),u=Number(e.duration_seconds??e.call_duration_seconds??0),p=String(e.previous_call_event_timestamp??""),g=Number(e.previous_call_delta_seconds??0),b=Number(e.uncached_input_tokens??Math.max(s-d,0)),w=String(e.record_id??e.id??`${a||"row"}-${t}`),T=String(e.primary_signal??"").trim(),N=Number(e.line_number),R=Oe(e.context_window_percent),_=Number(e.model_context_window),L=Number(e.cumulative_total_tokens);return{id:w,threadKey:String(e.thread_key??""),rawTime:a,eventTimestamp:n,callStartedAt:r,time:Cr(a),thread:qo(e),model:String(e.model??"unknown"),effort:String(e.effort??"blank"),input:s,output:i,reasoningOutput:o,totalTokens:v,cachedInput:d,uncachedInput:b,cachedPct:h,..._o(e),duration:jt(u),durationSeconds:u,previousCallGap:jt(g),previousCallEventTimestamp:p,previousCallGapSeconds:Number.isFinite(g)?g:0,initiator:String(e.call_initiator??"unknown"),initiatorReason:String(e.call_initiator_reason??""),initiatorConfidence:String(e.call_initiator_confidence??""),...So(e,u,v),usageCreditConfidence:String(e.usage_credit_confidence??"unknown"),usageCreditModel:String(e.usage_credit_model??""),usageCreditSource:String(e.usage_credit_source??""),usageCreditFetchedAt:String(e.usage_credit_fetched_at??""),usageCreditTier:String(e.usage_credit_tier??""),usageCreditNote:String(e.usage_credit_note??""),pricingModel:String(e.pricing_model??""),pricingEstimated:!!e.pricing_estimated,signal:T||(h<25?"cache-risk":"aggregate"),recommendation:String(e.recommended_action??""),tags:h<25?["uncached"]:h>60?["healthy-cache"]:[],sessionId:String(e.session_id??""),turnId:String(e.turn_id??""),parentSessionId:String(e.parent_session_id??""),parentSessionUpdatedAt:String(e.resolved_parent_session_updated_at??e.parent_session_updated_at??""),parentThread:String(e.resolved_parent_thread_name??e.parent_thread_name??""),threadAttachmentLabel:String(e.thread_attachment_label??""),threadSource:String(e.thread_source??""),subagentType:String(e.subagent_type??""),agentRole:String(e.agent_role??""),agentNickname:String(e.agent_nickname??""),project:String(e.project_name??""),projectRelativeCwd:String(e.project_relative_cwd??""),projectTags:Array.isArray(e.project_tags)?e.project_tags.map(y=>String(y)):[],cwd:String(e.cwd??""),sourceFile:String(e.source_file??""),lineNumber:Number.isFinite(N)&&N>0?N:null,gitBranch:String(e.git_branch??""),gitRemoteLabel:String(e.git_remote_label??""),gitRemoteHash:String(e.git_remote_hash??""),contextWindowPct:R,modelContextWindow:Number.isFinite(_)&&_>0?_:null,cumulativeTotalTokens:Number.isFinite(L)&&L>0?L:null,estimatedCacheSavings:Number(e.estimated_cache_savings_usd??0),efficiencyFlags:Array.isArray(e.efficiency_flags)?e.efficiency_flags.map(y=>String(y)):[]}}function Oe(e){const t=Number(e);return Number.isFinite(t)?t<=1?t*100:t:null}function Be(e){const t=Number(e);return Number.isFinite(t)?t:null}function Pt(e){return Math.max(0,Math.min(100,e))}function br(e){const t=Math.abs(e)>=10?0:1;return`${e.toFixed(t)}%`}function oa(e){return`${Me(e)} cr`}function vr(e){if(e==null||e==="")return"";const t=typeof e=="number"?e*1e3:Date.parse(e);return Number.isFinite(t)?`resets ${Ko(t)}`:""}function Ko(e){const t=new Date(e);return Number.isNaN(t.getTime())?String(e):`${t.toISOString().slice(0,16).replace("T"," ")} UTC`}function wr(e,t){return(e==null?void 0:e.trim())||t}function yr(e){return e<20?"red":e<40?"orange":"green"}function _r(e){return typeof e.include_archived=="boolean"?e.include_archived:e.history_scope==="all-history"||e.history_scope==="all"}function qo(e){const t=e.thread_name??e.thread??e.resolved_parent_thread_name??e.parent_thread_name;if(t&&String(t).trim())return String(t);const n=e.project_name??e.project_relative_cwd,a=e.session_id?e.session_id.slice(-6):"";return n&&a?`${n} ${a}`:e.thread_attachment_label?String(e.thread_attachment_label):"Untitled thread"}function Sr(e){const t=new Map;for(const n of e)t.set(n.thread,[...t.get(n.thread)??[],n]);return[...t.entries()].map(([n,a])=>{const r=a.length,i=[...a].sort((y,k)=>ca(k)-ca(y))[0]??null,o=(i==null?void 0:i.rawTime)||(i==null?void 0:i.time)||"",d=a.reduce((y,k)=>y+k.totalTokens,0),f=a.reduce((y,k)=>y+k.cachedInput,0),h=a.reduce((y,k)=>y+k.uncachedInput,0),v=a.reduce((y,k)=>y+k.output,0),u=a.reduce((y,k)=>y+k.reasoningOutput,0),p=a.reduce((y,k)=>y+k.cost,0),g=a.reduce((y,k)=>y+k.credits,0),b=a.reduce((y,k)=>y+k.durationSeconds,0),w=a.filter(y=>y.previousCallGapSeconds>0),T=w.reduce((y,k)=>y+k.previousCallGapSeconds,0)/Math.max(w.length,1),N=f+h,R=N>0?f/N*100:a.reduce((y,k)=>y+k.cachedPct,0)/Math.max(r,1),_=a.map(y=>y.contextWindowPct).filter(y=>typeof y=="number"&&Number.isFinite(y)),L=R<25?"High":R<45?"Medium":"Low";return{name:n,latestCallId:(i==null?void 0:i.id)??"",latestActivity:Cr(o),latestActivityRaw:o,turns:r,totalDurationSeconds:b,totalDuration:jt(b),averageGapSeconds:T,averageGap:jt(T),initiatorSummary:Qt(a.map(y=>y.initiator)),modelSummary:Qt(a.map(y=>y.model)),effortSummary:Qt(a.map(y=>y.effort)),totalTokens:d,cachedInput:f,uncachedInput:h,outputTokens:v,reasoningOutput:u,cost:p,credits:g,cachePct:R,contextPct:_.length?Math.max(..._):null,costPerCall:p/Math.max(r,1),coldResumeRisk:L,productivity:Math.max(20,Math.round(R-p/Math.max(r,1)*4))}}).sort((n,a)=>a.cost-n.cost).slice(0,20)}function ca(e){const t=Date.parse(e.rawTime||e.time);return Number.isFinite(t)?t:0}function Qt(e,t=3){const n=new Map;for(const a of e){const r=a.trim()||"unknown";n.set(r,(n.get(r)??0)+1)}return[...n.entries()].sort((a,r)=>r[1]-a[1]||a[0].localeCompare(r[0])).slice(0,t).map(([a,r])=>`${a} x${vn(r)}`).join(", ")||"unknown"}function Te(e,t){return e.reduce((n,a)=>n+t(a),0)}async function bn(e,t){let n;try{n=await e.json()}catch(a){if(e.ok)throw new Error(`${t} response could not be read as JSON: ${Ho(a)}`);n={}}if(!e.ok){const a=typeof n.error=="string"?n.error:`${t} request failed (${e.status})`;throw new Error(a)}return n}function Ho(e){return e instanceof Error?e.message:String(e)}function vn(e){return new Intl.NumberFormat("en-US").format(Math.round(e))}function Me(e){return new Intl.NumberFormat("en-US",{notation:"compact",maximumFractionDigits:2}).format(e)}function Wo(e){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}).format(e)}function jt(e){if(!Number.isFinite(e)||e<=0)return"-";if(e<60)return`${e.toFixed(0)}s`;const t=Math.floor(e/60),n=Math.round(e%60);return`${t}m ${n}s`}function Cr(e){const t=new Date(e);return Number.isNaN(t.getTime())?e||"-":new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"}).format(t)}function wn(e){return Date.parse(String(e.started_at??e.call_started_at??e.time??e.event_timestamp??e.turn_timestamp??""))}const Pe=1440*60*1e3;function Bo(e,t,n=window.location.search){const a=xr(n);if(!a.active)return e;const r=e.calls.filter(s=>Qo(s,a));return r.length===e.calls.length?e:Yo(e,r,`${t} filtered`)}function xr(e){var d,f,h,v,u,p;const t=new URLSearchParams(e),n=((d=t.get("model"))==null?void 0:d.trim())??"",a=((f=t.get("effort"))==null?void 0:f.trim())??"",r=((h=t.get("confidence")||t.get("pricing"))==null?void 0:h.trim())??"",s=((v=t.get("date")||t.get("time"))==null?void 0:v.trim())??"",i=((u=t.get("from"))==null?void 0:u.trim())??"",o=((p=t.get("to"))==null?void 0:p.trim())??"";return{model:n,effort:a,confidence:r,datePreset:s,dateStart:i,dateEnd:o,active:!!(n||a||r||s||i||o)}}function Qo(e,t){return!(t.model&&e.model!==t.model||t.effort&&e.effort!==t.effort||t.confidence&&!zo(e,t.confidence)||!Go(e,t))}function zo(e,t){return t==="official"||t==="cost-exact"?!!(e.pricingModel&&!e.pricingEstimated):t==="estimated"||t==="cost-estimated"?e.pricingEstimated:t==="unpriced"||t==="cost-unpriced"?!e.pricingModel:t==="credit-exact"?e.usageCreditConfidence==="exact":t==="credit-estimated"?e.usageCreditConfidence==="estimated":t==="credit-override"?e.usageCreditConfidence==="user_override":t==="credit-missing"?e.usageCreditConfidence==="missing"||e.usageCreditConfidence==="unknown":!0}function Go(e,t){const n=Jo(t);if(!n.active)return!0;if(n.invalid)return!1;const a=Date.parse(e.rawTime||e.time);return!(!Number.isFinite(a)||n.start!==null&&a=n.endExclusive)}function Jo(e){if(e.datePreset&&e.datePreset!=="all"&&e.datePreset!=="custom"){const a=Zo(e.datePreset);return a?{active:!0,invalid:!1,...a}:{active:!1,invalid:!1,start:null,endExclusive:null}}const t=la(e.dateStart),n=la(e.dateEnd);return t!==null&&n!==null&&t>n?{active:!0,invalid:!0,start:t,endExclusive:n+Pe}:{active:t!==null||n!==null,invalid:!1,start:t,endExclusive:n===null?null:n+Pe}}function Zo(e){const t=Xo(new Date);if(e==="today")return{start:t,endExclusive:t+Pe};if(e==="last-7-days")return{start:t-6*Pe,endExclusive:t+Pe};if(e==="this-week"){const a=new Date(t).getDay(),r=a===0?-6:1-a,s=t+r*Pe;return{start:s,endExclusive:s+7*Pe}}if(e==="this-month"){const n=new Date(t),a=new Date(n.getFullYear(),n.getMonth(),1).getTime(),r=new Date(n.getFullYear(),n.getMonth()+1,1).getTime();return{start:a,endExclusive:r}}return null}function la(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))return null;const[t,n,a]=e.split("-").map(Number),r=new Date(t,n-1,a);return r.getFullYear()!==t||r.getMonth()!==n-1||r.getDate()!==a?null:r.getTime()}function Xo(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()}function Yo(e,t,n="filtered"){const a=t.reduce((u,p)=>u+p.totalTokens,0),r=t.reduce((u,p)=>u+p.cost,0),s=t.reduce((u,p)=>u+p.cachedInput,0),i=t.reduce((u,p)=>u+p.uncachedInput,0),o=t.reduce((u,p)=>u+p.output,0),d=t.reduce((u,p)=>u+p.reasoningOutput,0),f=t.reduce((u,p)=>u+p.input,0),h=f>0?s/f*100:0,v=e.cards.find(u=>u.label==="Usage Remaining")??{label:"Usage Remaining",value:"Unknown",detail:"not available in filtered view",trend:"not available in payload",tone:"orange"};return{...e,cards:ec({cachePct:h,cachedTokens:s,estimatedCost:r,historyScope:n,totalCalls:t.length,totalTokens:a,tokenBreakdown:{cachedInput:s,uncachedInput:i,output:o,reasoningOutput:d},usageRemainingCard:v}),...tc(t),calls:t,threads:Sr(t),findings:lr(t),modelCosts:cr(t),reports:ur(t),cacheSegments:[{label:"Cache read",value:h,color:"#2563eb"},{label:"Uncached input",value:Math.max(100-h,0),color:"#7c3aed"}]}}function ec({cachePct:e,cachedTokens:t,estimatedCost:n,historyScope:a,totalCalls:r,totalTokens:s,tokenBreakdown:i,usageRemainingCard:o}){return[{label:"Total Tokens",value:We(s),detail:`${a} history scope`,trend:"filtered aggregate rows",tone:"blue",breakdown:[{label:"Cached",value:We(i.cachedInput)},{label:"Uncached",value:We(i.uncachedInput)},{label:"Output",value:We(i.output)},{label:"Reasoning",value:We(i.reasoningOutput)}]},{label:"Estimated Cost",value:ac(n),detail:"local pricing config",trend:"privacy-safe estimate",tone:"green"},{label:"Cache Hit Rate",value:`${e.toFixed(1)}%`,detail:`${We(t)} cached input`,trend:e>=40?"healthy cache reuse":"cache risk",tone:e>=40?"purple":"orange"},{label:"Total Calls",value:nc(r),detail:"loaded calls matching filters",trend:"legacy shell filters",tone:"blue"},o]}function tc(e){return dr(e.map(t=>({timestamp:Date.parse(t.rawTime||t.time),cached:t.cachedInput,cost:t.cost,input:t.input,output:t.output})))}function We(e){return new Intl.NumberFormat("en-US",{notation:"compact",maximumFractionDigits:2}).format(e)}function nc(e){return new Intl.NumberFormat("en-US").format(Math.round(e))}function ac(e){return new Intl.NumberFormat("en-US",{currency:"USD",maximumFractionDigits:2,minimumFractionDigits:2,style:"currency"}).format(e)}const kr=[{id:"overview",label:"Overview",description:"High-level telemetry",icon:$s},{id:"investigator",label:"Investigate",description:"Root-cause evidence",icon:Ds},{id:"compression-lab",label:"Compression Lab",description:"Context savings",icon:Ms},{id:"calls",label:"Calls",description:"Model-call table",icon:Vs},{id:"threads",label:"Threads",description:"Thread efficiency",icon:Hs},{id:"usage-drain",label:"Limits",description:"Allowance intelligence",icon:qs},{id:"cache-context",label:"Cache And Context",description:"Cache and cold resumes",icon:As},{id:"diagnostics",label:"Diagnostics Notebook",description:"Technical report",icon:Ls},{id:"reports",label:"Reports",description:"Generated analyses",icon:Ps},{id:"settings",label:"Settings",description:"Local configuration",icon:Os}],Tr=[{label:"Files",icon:Es,target:"settings"},{label:"Commands",icon:ks,target:"investigator"},{label:"Models",icon:Rs,target:"calls"}];function Lr(e){return _s(e)}const rc=[{value:"day",label:"24 hours",ariaLabel:"Last 24h"},{value:"week",label:"7 days",ariaLabel:"Last 7 days"},{value:"rows",label:"Recent",ariaLabel:"Recent rows"},{value:"all",label:"All time",ariaLabel:"All time"}];function sc(e){const t=e.refreshing||!e.canUseLiveApi,n=e.loadWindow==="rows",a=`${e.loadedRowCount.toLocaleString()} detail row${e.loadedRowCount===1?"":"s"} cached`,r=n?`${e.loadedRowCount.toLocaleString()} loaded / ${e.totalAvailableRows.toLocaleString()} total`:`${e.totalAvailableRows.toLocaleString()} calls analyzed · ${a}`,s=n?`${e.loadedRowCount.toLocaleString()} of ${e.totalAvailableRows.toLocaleString()} evidence rows loaded`:`Focused pages analyze all ${e.totalAvailableRows.toLocaleString()} calls in scope; ${e.loadedRowCount.toLocaleString()} call rows are cached for immediate detail views.`,i=n?e.rowLoadStatus:`${e.rowLoadModeLabel} analysis uses ${e.totalAvailableRows.toLocaleString()} calls; ${a}`;return c.jsxs("section",{className:"data-window-control","aria-label":"Analysis scope",children:[c.jsxs("div",{className:"data-window-summary",children:[c.jsx("span",{children:"Analysis scope"}),c.jsx("strong",{children:e.rowLoadModeLabel}),c.jsx("small",{title:s,children:r})]}),c.jsx("div",{className:"data-window-options",role:"group","aria-label":"Choose loaded call window",children:rc.map(o=>c.jsx("button",{type:"button","aria-label":o.ariaLabel,"aria-pressed":e.loadWindow===o.value,disabled:t,onClick:()=>e.onWindowChange(o.value),children:o.label},o.value))}),e.loadWindow==="rows"?c.jsxs("div",{className:"row-window-editor",children:[c.jsx("input",{"aria-label":"Rows to load slider","aria-valuetext":`${e.finitePendingLoadLimit.toLocaleString()} recent rows`,type:"range",min:1,max:e.rowLimitSliderMax,step:100,value:e.rowLimitSliderValue,onChange:o=>e.onSliderChange(o.target.value),disabled:t}),c.jsx("input",{"aria-label":"Rows to load",type:"number",min:1,step:100,value:e.pendingLoadLimit,onChange:o=>e.onDraftChange(o.target.value),disabled:t}),c.jsx("button",{type:"button","data-primary":"true",onClick:e.onApply,disabled:t||!e.rowLimitChanged,children:e.loadLabel}),c.jsx("button",{type:"button",onClick:e.onLoadMore,disabled:t||!e.hasMoreRows,children:e.loadMoreLabel})]}):null,e.refreshing?c.jsxs("div",{className:"row-load-progress","aria-label":"Row loading progress",children:[c.jsx("div",{className:"row-load-progress-track",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":e.refreshProgressPercent??void 0,children:c.jsx("span",{style:{width:`${e.refreshProgressPercent??8}%`}})}),c.jsxs("span",{children:[e.refreshProgressPercent===null?e.refreshProgressText:`${Math.round(e.refreshProgressPercent)}% loaded`,c.jsx("button",{className:"icon-button",type:"button",onClick:()=>void e.onCancel(),"aria-label":"Cancel refresh",title:"Cancel refresh",children:c.jsx(dn,{size:13})})]})]}):null,c.jsx("span",{className:"sr-only",role:"status","aria-live":"polite",children:i})]})}const yn=[{value:"all",label:"All time"},{value:"today",label:"Today"},{value:"this-week",label:"This week"},{value:"last-7-days",label:"Last 7 days"},{value:"this-month",label:"This month"},{value:"custom",label:"Custom"}],Rr=[{value:"all",label:"All confidence"},{value:"cost-exact",label:"Exact cost"},{value:"cost-estimated",label:"Estimated cost"},{value:"cost-unpriced",label:"Unpriced cost"},{value:"credit-exact",label:"Exact credit"},{value:"credit-estimated",label:"Estimated credit"},{value:"credit-override",label:"Credit override"},{value:"credit-missing",label:"Missing credit"}];function ic({activeView:e,locationSearch:t,model:n,onUrlChange:a}){const r=xr(t),s=C.useMemo(()=>ua(n.calls.map(g=>g.model)),[n.calls]),i=C.useMemo(()=>ua(n.calls.map(g=>g.effort)),[n.calls]),o=r.dateStart||r.dateEnd?"custom":oc(r.datePreset),d=lc(r,o);if(e==="calls"||e==="call"||!n.calls.length)return null;function f(g){const b=new URL(window.location.href);g(b),a(b)}function h(g,b){f(w=>{g==="confidence"&&w.searchParams.delete("pricing"),!b||b==="all"?w.searchParams.delete(g):w.searchParams.set(g,b)})}function v(g){f(b=>{if(!g||g==="all"){b.searchParams.delete("date"),b.searchParams.delete("time"),b.searchParams.delete("from"),b.searchParams.delete("to");return}b.searchParams.set("date",g),b.searchParams.set("time",g),g!=="custom"&&(b.searchParams.delete("from"),b.searchParams.delete("to"))})}function u(g,b){f(w=>{b?(w.searchParams.set(g,b),w.searchParams.set("date","custom"),w.searchParams.set("time","custom")):(w.searchParams.delete(g),!w.searchParams.get("from")&&!w.searchParams.get("to")&&(w.searchParams.delete("date"),w.searchParams.delete("time")))})}function p(){f(g=>{for(const b of["model","effort","confidence","pricing","date","time","from","to"])g.searchParams.delete(b)})}return c.jsxs("section",{className:"global-filter-strip span-all","aria-label":"Dashboard filters",children:[c.jsxs("strong",{children:[c.jsx(Fs,{size:15}),"Filters"]}),c.jsxs("label",{children:[c.jsx("span",{children:"Model"}),c.jsxs("select",{"aria-label":"Global model filter",value:r.model||"all",onChange:g=>h("model",g.target.value),children:[c.jsx("option",{value:"all",children:"All models"}),s.map(g=>c.jsx("option",{value:g,children:g},g))]})]}),c.jsxs("label",{children:[c.jsx("span",{children:"Effort"}),c.jsxs("select",{"aria-label":"Global effort filter",value:r.effort||"all",onChange:g=>h("effort",g.target.value),children:[c.jsx("option",{value:"all",children:"All effort"}),i.map(g=>c.jsx("option",{value:g,children:g},g))]})]}),c.jsxs("label",{children:[c.jsx("span",{children:"Confidence"}),c.jsx("select",{"aria-label":"Global confidence filter",value:cc(r.confidence),onChange:g=>h("confidence",g.target.value),children:Rr.map(g=>c.jsx("option",{value:g.value,children:g.label},g.value))})]}),c.jsxs("label",{children:[c.jsx("span",{children:"Time"}),c.jsx("select",{"aria-label":"Global time filter",value:o,onChange:g=>v(g.target.value),children:yn.map(g=>c.jsx("option",{value:g.value,children:g.label},g.value))}),d?c.jsx("span",{className:"filter-status","data-state":d.state,"aria-live":"polite",children:d.label}):null]}),c.jsxs("label",{children:[c.jsx("span",{children:"Start"}),c.jsx("input",{"aria-label":"Global start date",type:"date",value:r.dateStart,onChange:g=>u("from",g.target.value)})]}),c.jsxs("label",{children:[c.jsx("span",{children:"End"}),c.jsx("input",{"aria-label":"Global end date",type:"date",value:r.dateEnd,onChange:g=>u("to",g.target.value)})]}),c.jsxs("button",{className:"toolbar-button",type:"button",disabled:!r.active,onClick:p,children:[c.jsx(dn,{size:15}),"Clear filters"]})]})}function ua(e){return Array.from(new Set(e.map(t=>t.trim()).filter(Boolean))).sort((t,n)=>t.localeCompare(n))}function oc(e){return yn.some(t=>t.value===e)?e:"all"}function cc(e){return e==="official"?"cost-exact":e==="estimated"?"cost-estimated":e==="unpriced"?"cost-unpriced":Rr.some(t=>t.value===e)?e:"all"}function lc(e,t){var r;const n=ha(e.dateStart),a=ha(e.dateEnd);if(n!==null&&a!==null&&n>a)return{label:"Invalid date range",state:"error"};if(t==="custom"&&(e.dateStart||e.dateEnd))return{label:uc(e.dateStart,e.dateEnd),state:"active"};if(t!=="all"){const s=((r=yn.find(o=>o.value===t))==null?void 0:r.label)??t,i=dc(t);return{label:i?`${s}: ${da(i.start)} to ${da(Qe(i.endExclusive,-1))}`:s,state:"active"}}return null}function uc(e,t){return e&&t?`Custom: ${e} to ${t}`:e?`Custom: from ${e}`:t?`Custom: through ${t}`:"Custom range"}function dc(e){const t=hc();if(e==="today")return{start:t,endExclusive:Qe(t,1)};if(e==="this-week"){const n=fc(t);return{start:n,endExclusive:Qe(n,7)}}return e==="last-7-days"?{start:Qe(t,-6),endExclusive:Qe(t,1)}:e==="this-month"?{start:new Date(t.getFullYear(),t.getMonth(),1),endExclusive:new Date(t.getFullYear(),t.getMonth()+1,1)}:null}function hc(e=new Date){return new Date(e.getFullYear(),e.getMonth(),e.getDate())}function fc(e){const t=e.getDay();return Qe(e,t===0?-6:1-t)}function Qe(e,t){return new Date(e.getFullYear(),e.getMonth(),e.getDate()+t)}function da(e){const t=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0");return`${e.getFullYear()}-${t}-${n}`}function ha(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))return null;const[t,n,a]=e.split("-").map(Number),r=new Date(t,n-1,a);return r.getFullYear()!==t||r.getMonth()!==n-1||r.getDate()!==a?null:r.getTime()}function mc(e){return Lr(e)&&e!=="call"}function on(e,t="overview"){return e==="insights"?"overview":Lr(e)?e:t}function fa(e=window.location.search,t="calls"){const n=new URLSearchParams(e).get("return"),a=on(n,t);return mc(a)?a:t}function ma(e=window.location.search){return new URLSearchParams(e).has("return")}function gc(e){var t,n;return((t=kr.find(a=>a.id===e))==null?void 0:t.label)??((n=Tr.find(a=>a.target===e))==null?void 0:n.label)??"Calls"}function ga(e,t=window.location.search){return new URLSearchParams(t).get("history")==="all"?"all":e}function pa(e,t=window.location.href){const n=new URL(t);return e==="all"?n.searchParams.set("history","all"):n.searchParams.delete("history"),n}const pc={investigator:["finding"],threads:["thread","expand","threads","thread_q","risk","thread_call_sort","thread_call_page"],"cache-context":["cache_thread"],reports:["report"],"usage-drain":["usage_plan","usage_effort","usage_subagents","usage_sample","usage_confidence","limit_window","limit_hypothesis"],diagnostics:["diagnostic_source","diagnostic_fact"],calls:["explore","detail","call_q","source","sort","direction","density","page"],call:["record","return","mode","max_entries","max_chars","include_tool_output","include_compaction_history"]};function kt(e,t,n=[]){const a=new Set([t,...Array.isArray(n)?n:[n]]);for(const[r,s]of Object.entries(pc))if(!a.has(r))for(const i of s)e.searchParams.delete(i)}function ba(e){let t=!1;return e.searchParams.get("view")==="insights"&&(e.searchParams.set("view","overview"),t=!0),e.searchParams.get("return")==="insights"&&(e.searchParams.set("return","overview"),t=!0),t}const Mr=[{key:"overview",title:"Overview",path:"/api/diagnostics/overview",refreshPath:"/api/diagnostics/overview/refresh"},{key:"toolOutput",title:"Tool Output",path:"/api/diagnostics/tool-output",refreshPath:"/api/diagnostics/tool-output/refresh"},{key:"commands",title:"Commands",path:"/api/diagnostics/commands",refreshPath:"/api/diagnostics/commands/refresh"},{key:"gitInteractions",title:"Git Interactions",path:"/api/diagnostics/git-interactions",refreshPath:"/api/diagnostics/git-interactions/refresh"},{key:"fileReads",title:"File Reads",path:"/api/diagnostics/file-reads",refreshPath:"/api/diagnostics/file-reads/refresh"},{key:"fileModifications",title:"File Modifications",path:"/api/diagnostics/file-modifications",refreshPath:"/api/diagnostics/file-modifications/refresh"},{key:"readProductivity",title:"Read Productivity",path:"/api/diagnostics/read-productivity",refreshPath:"/api/diagnostics/read-productivity/refresh"},{key:"concentration",title:"Concentration",path:"/api/diagnostics/concentration",refreshPath:"/api/diagnostics/concentration/refresh"},{key:"guidedSummary",title:"What Is Driving Usage?",path:"/api/diagnostics/guided-summary",refreshPath:"/api/diagnostics/guided-summary/refresh"},{key:"usageDrain",title:"Usage Drain",path:"/api/diagnostics/usage-drain",refreshPath:"/api/diagnostics/usage-drain/refresh"}],At=new Map,Ft=new Map;function bc(){At.clear(),Ft.clear()}async function eu(e,t,n={}){Cn(t);const a=Sc(e);return n.signal?Nt(a,t,n.signal):_c(Ft,Sn(e,t,n.cacheKey),()=>Nt(a,t))}async function tu(e,t={}){Cn(e);const n=await fetch(`/api/diagnostics/refresh?_=${Date.now()}`,{method:"POST",headers:{Accept:"application/json","X-Codex-Usage-Token":e.apiToken},cache:"no-store",signal:t.signal}),a=await Dt(n,"Diagnostic snapshot refresh"),r=a.sections??(jr(a)?await vc(e,await Pr(a,e,t),t.signal):{});At.set(_n(e),r);for(const[s,i]of Object.entries(r))Ft.set(Sn(s,e),i);return r}async function nu(e,t,n={}){Cn(t);const a=await fetch(`${e.refreshPath}?_=${Date.now()}`,{method:"POST",headers:{Accept:"application/json","X-Codex-Usage-Token":t.apiToken},cache:"no-store",signal:n.signal}),r=await Dt(a,e.title),s=jr(r)?await wc(t,e,await Pr(r,t,n),n.signal):r,i=_n(t),o=At.get(i),d=o?await Promise.resolve(o):{};return At.set(i,{...d,[e.key]:s}),Ft.set(Sn(e.key,t),s),s}async function Pr(e,t,n){var r,s,i,o;let a=e;for((r=n.onProgress)==null||r.call(n,a);a.status==="pending"||a.status==="running";){const d=n.pollIntervalMs??((s=a.next)==null?void 0:s.poll_after_ms)??250;await yc(d,n.signal);const f=new URLSearchParams({job_id:a.job_id,_:String(Date.now())}),h=await fetch(`/api/diagnostics/refresh/status?${f.toString()}`,{headers:{Accept:"application/json","X-Codex-Usage-Token":t.apiToken},cache:"no-store",signal:n.signal});a=await Dt(h,"Diagnostic refresh status"),(i=n.onProgress)==null||i.call(n,a)}if(a.status!=="completed")throw new Error(`Diagnostic refresh failed: ${((o=a.error)==null?void 0:o.code)??a.status}`);return a}async function vc(e,t,n){const a=await Promise.all(Mr.map(async r=>[r.key,await Nt(r,e,n)]));return Object.fromEntries(a)}async function wc(e,t,n,a){return Nt(t,e,a)}function jr(e){if(!e||typeof e!="object")return!1;const t=e;return t.schema==="codex-usage-tracker-analysis-job-v1"&&t.job_kind==="diagnostic-refresh"&&typeof t.job_id=="string"}function yc(e,t){return t!=null&&t.aborted?Promise.reject(t.reason??new DOMException("Aborted","AbortError")):e<=0?Promise.resolve():new Promise((n,a)=>{const r=()=>{window.clearTimeout(s),t==null||t.removeEventListener("abort",r),a((t==null?void 0:t.reason)??new DOMException("Aborted","AbortError"))},s=window.setTimeout(()=>{t==null||t.removeEventListener("abort",r),n()},e);t==null||t.addEventListener("abort",r,{once:!0})})}function _c(e,t,n){const a=e.get(t);if(a!==void 0)return Promise.resolve(a);const r=n().then(s=>(e.set(t,s),s)).catch(s=>{throw e.delete(t),s});return e.set(t,r),r}function _n(e){return`${e.fileMode?"file":"live"}:${e.apiToken}`}function Sn(e,t,n=""){return`snapshot:${_n(t)}:${n}:${e}`}function Sc(e){const t=Mr.find(n=>n.key===e);if(!t)throw new Error(`Unknown diagnostic snapshot: ${e}`);return t}async function Nt(e,t,n){const a=await fetch(`${e.path}?_=${Date.now()}`,{headers:{Accept:"application/json","X-Codex-Usage-Token":t.apiToken},cache:"no-store",signal:n});return await Dt(a,e.title)}function Cn(e){if(e.fileMode)throw new Error("Diagnostic facts require localhost dashboard server.");if(!e.apiToken)throw new Error("Diagnostic facts require localhost dashboard API token.")}async function Dt(e,t){if(!e.ok)throw new Error(`${t} request failed with HTTP ${e.status}`);const n=await e.json();if(typeof n.error=="string"&&n.error)throw new Error(n.error);return n}const va=[{key:"facts",label:"Top Facts",title:"Top Diagnostic Facts",path:"/api/diagnostics/facts",limit:50},{key:"tools",label:"Tools",title:"Tool and Function Activity",path:"/api/diagnostics/tools",limit:25},{key:"compactions",label:"Compactions",title:"Compaction Activity",path:"/api/diagnostics/compactions",limit:25}],Ar=new Map,Nr=new Map;function Cc(){bc(),Ar.clear(),Nr.clear()}async function au(e,t,n={}){$r(t);const a=va.find(f=>f.key===e)??va[0],r=kc(n.sort??"uncached"),s=n.direction??"desc",i=Math.max(1,Math.round(n.limit??a.limit)),o=Math.max(0,Math.round(n.offset??0)),d=async()=>{const f=new URLSearchParams({limit:String(i),offset:String(o),sort:r,direction:s});Dr(f,"include_archived",n.includeArchived);const h=await fetch(`${a.path}?${f.toString()}`,{headers:{Accept:"application/json","X-Codex-Usage-Token":t.apiToken},cache:"no-store",signal:n.signal});return await Ir(h,a.title)};return n.signal?d():Er(Ar,xc(a.key,t,i,o,r,s,n.cacheKey,n.includeArchived),d)}async function ru(e,t,n={}){$r(t);const a=Math.max(1,Math.round(n.limit??8)),r=Math.max(0,Math.round(n.offset??0)),s=n.sort??"tokens",i=n.direction??"desc",o=async()=>{const d=String(e.fact_type??""),f=String(e.fact_name??"");if(!d||!f)throw new Error("Diagnostic fact type and name are required.");const h=new URLSearchParams({fact_type:d,fact_name:f,limit:String(a),offset:String(r),sort:s,direction:i});Dr(h,"include_archived",n.includeArchived);const v=await fetch(`/api/diagnostics/fact-calls?${h.toString()}`,{headers:{Accept:"application/json","X-Codex-Usage-Token":t.apiToken},cache:"no-store",signal:n.signal}),u=await Ir(v,"Diagnostic fact calls");return{calls:(u.rows??[]).map((p,g)=>pr(p,g)),rawPayload:u}};return n.signal?o():Er(Nr,Tc(e,t,a,r,s,i,n.cacheKey,n.includeArchived),o)}function Er(e,t,n){const a=e.get(t);if(a!==void 0)return Promise.resolve(a);const r=n().then(s=>(e.set(t,s),s)).catch(s=>{throw e.delete(t),s});return e.set(t,r),r}function Fr(e){return`${e.fileMode?"file":"live"}:${e.apiToken}`}function xc(e,t,n,a,r,s,i="",o){return["facts",e,Fr(t),i,o??"default",n,a,r,s].join(":")}function kc(e){return e==="total"?"tokens":e==="latest"?"time":e}function Tc(e,t,n,a,r,s,i="",o){return["fact-calls",Fr(t),i,o??"default",String(e.fact_type??""),String(e.fact_name??""),n,a,r,s].join(":")}function Dr(e,t,n){n!==void 0&&e.set(t,String(n))}function $r(e){if(e.fileMode)throw new Error("Diagnostic facts require localhost dashboard server.");if(!e.apiToken)throw new Error("Diagnostic facts require localhost dashboard API token.")}async function Ir(e,t){if(!e.ok)throw new Error(`${t} request failed with HTTP ${e.status}`);const n=await e.json();if(n.error)throw new Error(n.error);return n}const Lc=[{id:"usage-snapshot",endpoint:"/api/usage",dataClass:"snapshot",schema:"codex-usage-tracker-dashboard-v1"},{id:"overview-summary",endpoint:"/api/summary",dataClass:"aggregate",schema:"codex-usage-tracker-summary-v1"},{id:"overview-recommendations",endpoint:"/api/recommendations",dataClass:"aggregate",schema:"codex-usage-tracker-recommendations-v1"},{id:"calls",endpoint:"/api/calls",dataClass:"aggregate",schema:"codex-usage-tracker-calls-v1"},{id:"threads",endpoint:"/api/threads",dataClass:"aggregate",schema:"codex-usage-tracker-threads-v1"},{id:"thread-calls",endpoint:"/api/thread-calls",dataClass:"detail",schema:"codex-usage-tracker-thread-calls-v1"},{id:"investigator-agentic",endpoint:"/api/investigations/agentic",dataClass:"aggregate",schema:"codex-usage-tracker-agentic-investigation-v1"},{id:"investigator-walk",endpoint:"/api/investigations/walk",dataClass:"userAction",schema:"codex-usage-tracker-investigation-walk-v1"},{id:"diagnostics-facts",endpoint:"/api/diagnostics/facts",dataClass:"aggregate",schema:null},{id:"diagnostics-fact-calls",endpoint:"/api/diagnostics/fact-calls",dataClass:"detail",schema:null},{id:"diagnostics-dedupe",endpoint:"/api/diagnostics/dedupe",dataClass:"aggregate",schema:"codex-usage-tracker-dedupe-diagnostics-v1"},{id:"diagnostics-snapshot",endpoint:"/api/diagnostics/{snapshot}",dataClass:"aggregate",schema:null},{id:"compression-profile",endpoint:"/api/compression/profile",dataClass:"aggregate",schema:"codex-usage-tracker-compression-api-v1"},{id:"reports",endpoint:"/api/reports/pack",dataClass:"aggregate",schema:"codex-usage-tracker-reports-pack-v1"}],Rc=Lc,Mc=new Map(Rc.map(e=>[e.id,e])),Pc=15*6e4,jc=3e4,Or={snapshot:ot({persistedCache:"aggregate-only"}),aggregate:ot({persistedCache:"aggregate-only"}),detail:ot(),heavyJob:ot({cancellation:"shared-job",staleTime:1e3}),userAction:ot({retry:0,staleTime:0})};function Ac({sourceKey:e,sourceRevision:t}){return{sourceKey:wa(e,"local-api"),sourceRevision:wa(t,"unversioned")}}function Nc(e,t,n={},...a){return["dashboard",e.id,t.sourceKey,t.sourceRevision,Dc(n),...a]}function Ec(e){return["dashboard",e.id]}function Fc(e){const t=Mc.get(e);if(!t)throw new Error(`Unknown dashboard query definition: ${e}`);return t}function Ur(e){const t=Or[e];return{gcTime:t.gcTime,refetchOnReconnect:t.refetchOnReconnect,refetchOnWindowFocus:t.refetchOnWindowFocus,retry:t.retry,staleTime:t.staleTime}}function su({enabled:e,hasData:t,isError:n,isFetching:a,isPending:r}){return e?t?a?"updating":"ready":n?"error":a||r?"loading":"waiting":"waiting"}function iu(e){const t=e.filter(a=>a==="ready"||a==="updating").length,n=e.length;return{ready:t,total:n,percent:n===0?100:Math.round(t/n*100),loading:e.filter(a=>a==="loading").length,errors:e.filter(a=>a==="error").length}}function Dc(e){return{historyScope:e.historyScope??"active",loadWindow:e.loadWindow??"all",limit:e.limit??null,since:e.since??""}}function wa(e,t){return(e==null?void 0:e.trim())||t}function ot(e={}){return{staleTime:jc,gcTime:Pc,retry:1,refetchOnReconnect:!1,refetchOnWindowFocus:!1,cancellation:"observer",persistedCache:"none",...e}}const $c=new Set(["command_text","content_fragment","content_fragments","excerpt","indexed_content","indexed_fragment","indexed_fragments","prompt","raw_context","raw_output","snippet","tool_output"]),Ic=new Set(["includes_indexed_content","includes_raw_fragment","includes_raw_fragments","indexed_content_included","raw_content_included","raw_context_included"]),Oc=new Set(["codex-usage-tracker-context-v1"]);function ya(e){return cn(e,new WeakSet)}function cn(e,t){if(!e||typeof e!="object")return!0;if(t.has(e))return!1;t.add(e);const n=Array.isArray(e)?e.every(a=>cn(a,t)):Object.entries(e).every(([a,r])=>{const s=a.toLowerCase();return $c.has(s)||Ic.has(s)&&r===!0||s==="schema"&&typeof r=="string"&&Oc.has(r)?!1:cn(r,t)});return t.delete(e),n}const Uc="codexUsageDashboard",Vc=1,Y="usageSnapshots",Kc=6,qc=10080*60*1e3,Hc={async read(e){if(!e.sourceRevision)return null;try{const t=await Sa();if(!t)return null;const n=await Vr(t.transaction(Y,"readonly").objectStore(Y).get(_a(e)));return!n||n.sourceRevision!==e.sourceRevision||Date.now()-n.storedAt>qc?null:ya(n.payload)?n.payload:(await Wc(t,n.cacheKey),null)}catch{return null}},async write(e,t){if(!(!e.sourceRevision||!ya(t)))try{const n=await Sa();if(!n)return;const a=n.transaction(Y,"readwrite");a.objectStore(Y).put({...e,cacheKey:_a(e),payload:t,storedAt:Date.now()}),await xn(a),await Bc(n)}catch{}}};async function Wc(e,t){const n=e.transaction(Y,"readwrite");n.objectStore(Y).delete(t),await xn(n)}function _a(e){const{historyScope:t,loadWindow:n,limit:a,since:r}=e.scope;return JSON.stringify([e.sourceKey,t,n,a,r])}function Sa(){return typeof indexedDB>"u"?Promise.resolve(null):new Promise(e=>{const t=indexedDB.open(Uc,Vc);t.onupgradeneeded=()=>{t.result.objectStoreNames.contains(Y)||t.result.createObjectStore(Y,{keyPath:"cacheKey"})},t.onsuccess=()=>e(t.result),t.onerror=()=>e(null),t.onblocked=()=>e(null)})}function Vr(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error??new Error("IndexedDB request failed"))})}function xn(e){return new Promise((t,n)=>{e.oncomplete=()=>t(),e.onerror=()=>n(e.error??new Error("IndexedDB transaction failed")),e.onabort=()=>n(e.error??new Error("IndexedDB transaction aborted"))})}async function Bc(e){const t=e.transaction(Y,"readonly"),a=(await Vr(t.objectStore(Y).getAll())).sort((i,o)=>o.storedAt-i.storedAt).slice(Kc);if(!a.length)return;const r=e.transaction(Y,"readwrite"),s=r.objectStore(Y);a.forEach(i=>s.delete(i.cacheKey)),await xn(r)}const Qc={kind:"production",load:Lo},zc="codexUsageDashboardRuntimeMetadata",Gc=2048,ln=Fc("usage-snapshot"),Kr={all:Ec(ln),snapshot:(e,t,n)=>Nc(ln,Ac({sourceKey:e,sourceRevision:t}),n)};function Jc(){return new Ri({defaultOptions:{queries:{...Ur("aggregate")}}})}const kn=Jc();async function Zc({currentPayload:e,historyScope:t,loadWindow:n,loadLimit:a,since:r=null,onProgress:s,queryClient:i=kn,refresh:o=!1,snapshotStore:d=Hc,transport:f=Qc}){const h=Hi(a,t,r,n),v=Tn(e),u=Kr.snapshot(v.sourceKey,v.sourceRevision,h);!i.getQueryData(u)&&nl(e,h)&&i.setQueryData(u,e),o&&await i.invalidateQueries({queryKey:u,exact:!0});const p=Ca(e,h),g=await i.fetchQuery({queryKey:u,...Ur(ln.dataClass),queryFn:async({signal:b})=>{var R;const w=!o&&p?await d.read(p):null;if(w)return s==null||s({status:"completed",phase:"loading_rows",message:"Loaded cached dashboard snapshot",completed:Number(w.loaded_row_count??((R=w.rows)==null?void 0:R.length)??0),total:Number(w.total_available_rows??w.loaded_row_count??0),percent:100}),w;const T=await f.load(e,{refresh:o,limit:Wi(h),includeArchived:h.historyScope==="all",loadWindow:n,since:h.since,onProgress:s,signal:b}),N=p?{...p,sourceRevision:String(T.latest_refresh_at??p.sourceRevision)}:Ca(T,h);return N&&await d.write(N,T),T},staleTime:o?0:Or.snapshot.staleTime});return tl(el(g,h)),g}function Ca(e,t){if(!(e!=null&&e.api_token))return null;const n=String(e.latest_refresh_at??"");return n?{sourceKey:qr(e),sourceRevision:n,scope:t}:null}async function Xc(e=kn){await e.cancelQueries({queryKey:Kr.all})}function Yc(e){return yi(e)||or(e)}function el(e,t){return{schema:"codex-usage-dashboard-runtime-v1",...Tn(e),scope:t,updatedAt:Date.now()}}function Tn(e){return{sourceKey:qr(e),sourceRevision:al(e)}}function tl(e,t=rl()){if(t)try{const n=JSON.stringify(e);n.length<=Gc&&t.setItem(zc,n)}catch{}}function nl(e,t){var o;if(!e||!(((o=e.rows)==null?void 0:o.length)??0))return!1;const n=ct(e),a=t.limit===null?n===0:n===t.limit,r=(e.since??null)===t.since,s=mn(e)===t.loadWindow,i=e.include_archived||e.history_scope==="all-history"?"all":"active";return a&&r&&s&&i===t.historyScope}function qr(e){const t=e,n=Number((t==null?void 0:t.payload_cache_version)??0),a=String((t==null?void 0:t.payload_cache_key)??(e!=null&&e.api_token?"live":"static"));return`${n}:${a}`}function al(e){return String((e==null?void 0:e.latest_refresh_at)??"unversioned")}function rl(){try{return typeof window>"u"?null:window.sessionStorage}catch{return null}}const sl=new Set(["duplicate_cumulative_total"]);function il({canUseLiveApi:e,payload:t,shellI18n:n}){const a=ol(t,e,n);return c.jsxs("section",{className:"environment-status","aria-label":n.t("aria.dashboard_status","Dashboard status"),children:[c.jsx("span",{className:"environment-status-title",children:n.t("aria.dashboard_status","Dashboard status")}),c.jsx("div",{className:"environment-status-grid",children:a.map(r=>c.jsx("span",{className:"environment-chip","data-state":r.state,title:r.title,children:r.label},r.label))})]})}function ol(e,t,n){const a=hl(e==null?void 0:e.parser_diagnostics,n);return[{label:n.t("badge.unofficial_project","Unofficial project"),state:"neutral",title:n.t("badge.unofficial_project_title","Codex Usage Tracker is independent and is not made by, affiliated with, endorsed by, sponsored by, or supported by OpenAI. OpenAI and Codex are trademarks of OpenAI.")},{label:t?`${n.t("badge.live","Live")} API`:n.t("badge.static","Static"),state:t?"ready":"warn",title:t?"Local API token present for refresh actions.":"Static embedded snapshot; live refresh is unavailable."},ll(e,n),ul(e,n),dl(e,n),cl(e),...a?[a]:[]]}function cl(e){const t=e==null?void 0:e.dedupe,n=Number((t==null?void 0:t.excluded_copied_rows)||0),a=Number((t==null?void 0:t.canonical_rows)||0),r=Number((t==null?void 0:t.physical_rows)||0);return{label:`Deduped · ${n.toLocaleString()} copied excluded`,state:"ready",title:`Billable totals use ${a.toLocaleString()} canonical rows while preserving ${r.toLocaleString()} physical source rows.`}}function ll(e,t){var s;const n=!!(e!=null&&e.pricing_configured),a=((s=e==null?void 0:e.pricing_snapshot_warning)==null?void 0:s.trim())??"",r=Hr(e==null?void 0:e.pricing_source);return{label:n?t.t("badge.costs","Costs"):t.t("badge.no_costs","No costs"),state:n?a?"warn":"ready":"missing",title:n?[r||"Pricing configured",a].filter(Boolean).join(" - "):t.t("pricing.configure_hint","Run codex-usage-tracker update-pricing to configure estimated costs.")}}function ul(e,t){var s,i;const n=((s=e==null?void 0:e.allowance_error)==null?void 0:s.trim())??"",a=((i=e==null?void 0:e.rate_card_error)==null?void 0:i.trim())??"",r=Hr(e==null?void 0:e.allowance_source)||"Codex credit rates";return n?{label:t.t("state.allowance_config_error","Allowance config error"),state:"missing",title:`Config error: ${n}`}:a?{label:"Rate-card error",state:"missing",title:`Rate-card error: ${a}`}:e!=null&&e.allowance_configured?{label:t.t("state.allowance_configured","Allowance configured"),state:"ready",title:r}:e!=null&&e.rate_card_configured?{label:"Credit rates loaded",state:"ready",title:r}:{label:t.t("action.set_limits","Set limits"),state:"warn",title:"No local allowance windows are configured."}}function dl(e,t){const n=e==null?void 0:e.project_metadata_privacy,a=(n==null?void 0:n.mode)||(e==null?void 0:e.privacy_mode)||"normal",r=a==="normal",s=[n!=null&&n.cwd_redacted?"cwd redacted":"",n!=null&&n.project_names_redacted?"project names redacted":"",n!=null&&n.git_remote_label_hidden?"git remote hidden":"",n!=null&&n.relative_cwd_hidden?"relative cwd hidden":"",n!=null&&n.git_branch_hidden?"git branch hidden":"",n!=null&&n.tags_hidden?"tags hidden":""].filter(Boolean);return{label:r?t.t("badge.metadata_normal","Metadata normal"):Wr(t.t("badge.metadata_mode","Metadata {mode}"),{mode:a}),state:r?"ready":"warn",title:r?"Project metadata is shown normally.":[`Metadata mode: ${a}`,...s].join(" - ")}}function hl(e,t){const n=Object.entries(e??{}).filter(([s,i])=>Number(i||0)>0&&!sl.has(s));if(!n.length)return null;const a=n.reduce((s,[,i])=>s+Number(i||0),0),r=n.map(([s,i])=>`${s}=${Number(i||0)}`).join(", ");return{label:t.t("badge.parser_warnings","Parser warnings"),state:"missing",title:Wr(t.t("parser.warnings_title","Latest refresh reported {count} parser diagnostics: {entries}. Run codex-usage-tracker inspect-log to investigate schema drift."),{count:a.toLocaleString(),entries:r})}}function Hr(e){if(!e)return"";if(typeof e=="string")return e;const t=e.label??e.name??e.type??e.path??"";return typeof t=="string"?t:""}function Wr(e,t){return e.replace(/\{([a-zA-Z0-9_]+)\}/g,(n,a)=>t[a]??n)}async function xa(e){var n;if((n=navigator.clipboard)!=null&&n.writeText)return await navigator.clipboard.writeText(e),!0;const t=document.createElement("textarea");t.value=e,t.setAttribute("readonly","readonly"),t.style.position="fixed",t.style.left="-9999px",t.style.top="0",document.body.appendChild(t),t.select();try{return document.execCommand("copy")}finally{t.remove()}}const fl={"highest-cost":"Highest Cost Threads","context-bloat":"Context Bloat","cache-misses":"Cache Misses","pricing-gaps":"Pricing Gaps","codex-credits":"Codex Credits","reasoning-spike":"Reasoning Spike"};function ou(e,t){return t==="context-bloat"?Number(e.contextWindowPct??0)>=60||e.totalTokens>=2e5:t==="cache-misses"?e.signal==="cache-risk"||e.cachedPct<30||e.uncachedInput>=5e4:t==="pricing-gaps"?e.pricingEstimated||!Number.isFinite(e.cost):t==="codex-credits"?e.credits>0:t==="reasoning-spike"?e.reasoningOutput>0:!0}function ml(e){return fl[e]??e}const gl=se(()=>O(()=>import("./OverviewPage.js"),__vite__mapDeps([49,1,2,34,4,20,21,9,10,31,32,6,16,17,18,45,22,11,12,13,14,35,23,24,25,26,50])),"OverviewPage"),pl=se(()=>O(()=>import("./InvestigatorPage.js"),__vite__mapDeps([51,1,2,34,4,6,41,7,20,21,9,10,16,17,18,45,22,11,12,13,23,24,38,25,26,52])),"InvestigatorPage"),bl=se(()=>O(()=>import("./CompressionLabPage.js"),__vite__mapDeps([53,1,2,34,4,6,9,10,17,25,26,12,54])),"CompressionLabPage"),vl=se(()=>O(()=>import("./ExploreRoutePage.js"),__vite__mapDeps([55,1,2,44,3,4,5,6,7,14,29,33,19,45,22,11,12,13,35,23,24,34,46,47,38,25,26,48,8,9,10,56])),"ExploreRoutePage"),wl=se(()=>O(()=>import("./CallInvestigatorPage.js"),__vite__mapDeps([57,1,2,46,33,19,37,38,47,25,26,12])),"CallInvestigatorPage"),yl=se(()=>O(()=>import("./ThreadsPage.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27])),"ThreadsPage"),_l=se(()=>O(()=>import("./UsageDrainPage.js"),__vite__mapDeps([36,1,2,34,4,20,21,9,10,16,17,18,24,37,38,25,26,12,39])),"UsageDrainPage"),Sl=se(()=>O(()=>import("./CacheContextPage.js"),__vite__mapDeps([28,1,2,29,30,22,31,32,6,33,19,20,21,9,10,23,34,4,3,5,7,15,35,24,25,26,12])),"CacheContextPage"),Cl=se(()=>O(()=>import("./DiagnosticsPage.js"),__vite__mapDeps([40,1,2,29,33,19,20,21,9,10,23,24,41,4,6,7,34,3,25,26,12])),"DiagnosticsPage"),xl=se(()=>O(()=>import("./ReportsPage.js"),__vite__mapDeps([42,1,2,34,4,6,33,19,20,21,9,10,16,17,18,30,22,35,23,24,25,26,12,43])),"ReportsPage"),kl=se(()=>O(()=>import("./SettingsPage.js"),__vite__mapDeps([58,1,2,33,19,32,38,47,17,25,26,12,59])),"SettingsPage");function Tl(e){return c.jsx(C.Suspense,{fallback:c.jsx(Rl,{activeView:e.activeView}),children:Ll(e)})}function Ll(e){const{activePreset:t,activeRecordId:n,activeView:a,autoRefreshEnabled:r,applicationI18n:s,backFromCallInvestigator:i,callBackLabel:o,canLoadAllRows:d,canUseLiveApi:f,contextRuntime:h,copyCallInvestigatorLink:v,dashboardPayload:u,globalFilters:p,globalQuery:g,hasMoreRows:b,historyScope:w,loadWindow:T,loadAllRows:N,loadedRowCount:R,loadLimit:_,loadMoreRows:L,scopeSince:y,model:k,navigateView:j,onRefresh:E,openCallInvestigator:F,refreshing:me,refreshState:vt,setContextApiEnabled:wt,sourceIdentity:I,totalAvailableRows:at}=e;switch(a){case"overview":return c.jsx(gl,{model:k,contextRuntime:h,sourceKey:I.sourceKey,sourceRevision:I.sourceRevision,onRefresh:E,globalQuery:g,runtime:{historyScope:w,loadLimit:_,loadWindow:T,loadedRowCount:R,scopeSince:y,totalAvailableRows:at},refreshing:me,canLoadMoreRows:f&&b,onLoadMoreRows:L,onOpenInvestigator:F,onCopyCallLink:v,onNavigateView:j,globalFilters:p});case"investigator":return c.jsx(pl,{model:k,contextRuntime:h,includeArchived:w==="all",sourceKey:I.sourceKey,sourceRevision:I.sourceRevision,onOpenInvestigator:F,onCopyCallLink:v,onNavigateView:j});case"compression-lab":return c.jsx(bl,{contextRuntime:h,includeArchived:w==="all",since:y,sourceKey:I.sourceKey,sourceRevision:I.sourceRevision});case"calls":return c.jsx(vl,{model:k,globalQuery:g,activePreset:t,onRefresh:E,contextRuntime:h,includeArchived:w==="all",scopeSince:y,sourceKey:I.sourceKey,sourceRevision:I.sourceRevision,onContextApiEnabledChange:wt,onOpenInvestigator:F,onCopyCallLink:v,onNavigateView:j});case"call":return c.jsx(wl,{model:k,recordId:n,contextRuntime:h,onContextApiEnabledChange:wt,onNavigateRecord:F,onCopyCallLink:v,onBackToCalls:i,backLabel:o});case"threads":return c.jsx(yl,{model:k,globalQuery:g,onOpenInvestigator:F,onCopyCallLink:v,globalFilters:p,contextRuntime:h,includeArchived:w==="all",sourceKey:I.sourceKey,sourceRevision:I.sourceRevision,onNavigateView:j});case"usage-drain":return c.jsx(_l,{model:k,contextRuntime:h,includeArchived:w==="all",sourceRevision:I.sourceRevision,onOpenInvestigator:F,onCopyCallLink:v});case"cache-context":return c.jsx(Sl,{model:k,contextRuntime:h,includeArchived:w==="all",scopeSince:y,sourceKey:I.sourceKey,sourceRevision:I.sourceRevision,onOpenInvestigator:F,onCopyCallLink:v});case"diagnostics":return c.jsx(Cl,{model:k,contextRuntime:h,includeArchived:w==="all",sourceKey:I.sourceKey,sourceRevision:I.sourceRevision,rowLoadControls:{loadedRowCount:R,totalAvailableRows:at,canLoadMoreRows:f&&b,canLoadAllRows:d,refreshing:me,onLoadMoreRows:L,onLoadAllRows:N},onOpenInvestigator:F,onCopyCallLink:v,globalFilters:p});case"reports":return c.jsx(xl,{model:k,refreshState:vt,includeArchived:w==="all",loadWindow:T,loadLimit:_,sourceKey:I.sourceKey,sourceRevision:I.sourceRevision,onOpenInvestigator:F,onCopyCallLink:v});case"settings":return c.jsx(kl,{model:k,payload:u,historyScope:w,loadWindow:T,loadLimit:_,scopeSince:y,loadedRowCount:R,totalAvailableRows:at,canUseLiveApi:f,autoRefreshEnabled:r,refreshState:vt,applicationI18n:s})}}function Rl({activeView:e}){return c.jsxs("section",{"aria-busy":"true","aria-live":"polite",className:"route-state",role:"status",children:["Loading ",e.replace("-"," "),"..."]})}const ka=1e4,Ml={1:"overview",2:"calls",3:"threads",4:"diagnostics"},Pl=new Set(["call","compression-lab","diagnostics","investigator"]);function Br(e){return!Pl.has(e)}function jl(e){return e instanceof Element?!!e.closest('input, select, textarea, button, [contenteditable="true"]'):!1}function Qr(){var Vn;const e=C.useRef(null),t=C.useMemo(()=>To(),[]),[n,a]=C.useState(t),[r,s]=C.useState(()=>ia(t)),[i,o]=C.useState(()=>{const m=new URLSearchParams(window.location.search);return on(m.get("view"))}),[d,f]=C.useState(()=>new URLSearchParams(window.location.search).get("record")??""),[h,v]=C.useState(()=>fa()),[u,p]=C.useState(()=>ma()),[g,b]=C.useState(()=>new URLSearchParams(window.location.search).get("q")??""),[w,T]=C.useState(()=>new URLSearchParams(window.location.search).get("preset")??""),[N,R]=C.useState(()=>window.location.search),[_,L]=C.useState("Stored snapshot loaded just now"),[y,k]=C.useState(null),[j,E]=C.useState(!1),[F,me]=C.useState(!1),[vt,wt]=C.useState(!1),[I,at]=C.useState(()=>Gs(t)),$t=C.useRef(!1),[G,Ln]=C.useState(()=>je(ct(t),500)),[Ue,yt]=C.useState(()=>je(ct(t),500)),[q,Rn]=C.useState(()=>Bi(t)),[J,_t]=C.useState(()=>ga(Wt(t))),[Mn,Pn]=C.useState(r.contextRuntime.contextApiEnabled),H=!!(n!=null&&n.api_token),zr=C.useMemo(()=>Tn(n),[n]),A=C.useMemo(()=>$a(n,I),[n,I]),jn=C.useMemo(()=>({...r.contextRuntime,contextApiEnabled:Mn}),[Mn,r.contextRuntime]),Gr=C.useMemo(()=>Bo(r,J,N),[J,N,r]),An=i==="calls"||i==="call"?r:Gr,rt=Br(i),It=je(Ue,G,500),ge=Math.max(0,Number((n==null?void 0:n.loaded_row_count)??((Vn=n==null?void 0:n.rows)==null?void 0:Vn.length)??r.calls.length??0)),Ve=Math.max(0,Number((n==null?void 0:n.total_available_rows)??ge)),Jr=Ue!==G,Nn=Gi({currentLimit:G,loadedRows:ge,pendingLimit:Ue}),Zr=Math.min(It,Nn),En=!!(n!=null&&n.has_more)||Ve>0&&ge{const m=new URL(window.location.href);ba(m)&&Ke(m)},[]),C.useEffect(()=>{function m(){const S=window.location.search,M=new URLSearchParams(S);o(on(M.get("view"))),f(M.get("record")??""),v(fa(S)),p(ma(S)),b(M.get("q")??""),T(M.get("preset")??""),_t(ga(Wt(n),S)),R(S)}return window.addEventListener("popstate",m),()=>window.removeEventListener("popstate",m)},[n]),C.useEffect(()=>{function m(S){var oe;if(jl(S.target))return;if(S.key==="/"){S.preventDefault(),(oe=e.current)==null||oe.focus();return}const M=Ml[S.key];M&&(S.preventDefault(),st(M))}return window.addEventListener("keydown",m),()=>window.removeEventListener("keydown",m)},[]),C.useEffect(()=>{function m(){wt(window.scrollY>320)}return m(),window.addEventListener("scroll",m,{passive:!0}),()=>window.removeEventListener("scroll",m)},[]);function rs(m){const S=i==="call"?h:i;v(S),p(i==="call"?u:!0),o("call"),f(m);const M=new URL(window.location.href);kt(M,i,i==="call"?h:[]),M.searchParams.set("view","call"),M.searchParams.set("record",m),M.searchParams.set("return",S),$n(M)}function ss(){st(h)}function is(m){b(m),T("");const S=new URL(window.location.href);S.searchParams.delete("preset"),m?S.searchParams.set("q",m):S.searchParams.delete("q"),Ke(S)}async function ie(m={}){var St;if(j)return;$t.current=!0;const S=m.loadLimit??G,M=m.loadWindow??q,oe=Ht(M),pe=m.historyScope??J,ee=m.refresh??!0,Ot=!!(n!=null&&n.refresh_jobs_available);E(!0),k(Ot?{status:"running",phase:ee?"refreshing_index":"loading_rows",message:`${ee?"Refreshing":"Loading"} ${Re(M,S)}`}:null),L(`${ee?"Refreshing index for":"Loading"} ${Re(M,S)}...`);let qe=!1;try{const z=await Zc({currentPayload:n,refresh:ee,loadLimit:S,loadWindow:M,since:oe,historyScope:pe,onProgress:Vt=>{qe||(qe=Vt.message==="Loaded cached dashboard snapshot"),k(Vt),L(Yn(Vt,pe))}});Cc(),a(z),s(ia(z)),Pn(!!z.context_api_enabled);const ke=M==="rows"?je(ct(z,S),S):S;Ln(ke),yt(ke),Rn(M);const Kn=Wt(z,pe);_t(Kn),zi(ke,Kn,M);const Ut=z.loaded_row_count??((St=z.rows)==null?void 0:St.length)??0,qn=z.total_available_rows??Ut;L(M==="rows"?`${qe?"Cache hit; l":ee?"Refreshed index; l":"L"}oaded ${Ut.toLocaleString()} of ${qn.toLocaleString()} calls from ${Re(M,ke)}`:`${qe?"Cache hit; ":ee?"Refreshed index; ":""}${Re(M,ke)} analysis ready across ${qn.toLocaleString()} calls; ${Ut.toLocaleString()} detail rows cached`)}catch(z){if(k(null),Yc(z)){L("Refresh cancelled; stored snapshot remains visible");return}const ke=new Date().toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"});L(`${to(z)} Stored snapshot kept at ${ke}`)}finally{k(null),E(!1)}}async function os(){await Xc(),k(null),E(!1),L("Refresh cancelled; stored snapshot remains visible")}C.useEffect(()=>{document.documentElement.lang=A.language,document.documentElement.dir=A.direction},[A.direction,A.language]),C.useEffect(()=>{var z;const m=Number((n==null?void 0:n.total_available_rows)??0),S=Number((n==null?void 0:n.loaded_row_count)??((z=n==null?void 0:n.rows)==null?void 0:z.length)??0),M=Qi(),oe=(M==null?void 0:M.historyScope)??J,pe=(M==null?void 0:M.loadLimit)??G,ee=(M==null?void 0:M.loadWindow)??q,Ot=mn(n),qe=oe!==J||ee!==Ot||ee==="rows"&&pe!==ct(n),St=S>0;!H||!qe&&St||m<=0||j||$t.current||($t.current=!0,qe&&(_t(oe),Ln(pe),yt(pe),Rn(ee),Ke(pa(oe))),ie({refresh:!1,historyScope:oe,loadLimit:pe,loadWindow:ee}))},[H,n,J,G,q,j]),C.useEffect(()=>{!H&&F&&me(!1)},[F,H]),C.useEffect(()=>{if(!F||!H||!rt)return;const m=window.setInterval(()=>{ie()},ka);return()=>window.clearInterval(m)},[F,rt,H,n,J,G,q,j]),C.useEffect(()=>{if(!F||!H||!rt)return;function m(){document.visibilityState==="visible"&&ie()}return document.addEventListener("visibilitychange",m),()=>document.removeEventListener("visibilitychange",m)},[F,rt,H,n,J,G,q,j]);function In(m){const S=m.trim();yt(Math.max(1,pt(S===""?Number.NaN:Number(S))))}function cs(m){In(m)}function ls(){ie({refresh:!1,loadLimit:Ue,loadWindow:"rows"})}function us(){ie({refresh:!1,loadWindow:"all"})}function On(){yt(Fn),ie({refresh:!1,loadLimit:Fn,loadWindow:q})}function ds(m){m!==q&&ie({refresh:!1,loadWindow:m})}function hs(m){const S=m==="all"?"all":"active";_t(S),Ke(pa(S)),ie({refresh:!1,historyScope:S})}function fs(m){if(me(m),m){if(!rt){L("Auto refresh pauses on this evidence-heavy view");return}L(`Auto refresh every ${ka/1e3}s`),ie()}else L("Auto refresh paused")}function ms(m){at(m),Js(m)}async function gs(){try{const m=new URL(window.location.href);if(ba(m),kt(m,i,i==="call"?h:[]),!await xa(m.toString()))throw new Error("Clipboard unavailable");L("Copied current view link")}catch{L("Copy unavailable in browser")}}async function ps(m){try{const S=new URL(window.location.href);kt(S,i,i==="call"?h:[]);const M=i==="call"?h:i;if(S.searchParams.set("view","call"),S.searchParams.set("record",m),S.searchParams.set("return",M),!await xa(S.toString()))throw new Error("Clipboard unavailable");L("Copied call investigator link")}catch{L("Copy unavailable in browser")}}async function bs(){const m=await Xi(i,An,{contextRuntime:jn,historyScope:J,loadWindow:q,loadLimit:G,scopeSince:(n==null?void 0:n.since)??Ht(q),loadedRowCount:ge,totalAvailableRows:Ve,canUseLiveApi:H,autoRefreshEnabled:F,refreshState:_},g,w);if(!m.rowCount){L(`No ${m.label} to export`);return}Fi(m.filename,m.csv),L(`Exported ${m.rowCount} ${m.label}`)}function vs(){T("");const m=new URL(window.location.href);m.searchParams.delete("preset"),Ke(m),L("Investigation preset cleared")}function ws(){window.scrollTo({top:0,behavior:"smooth"})}return c.jsx(io,{value:A,children:c.jsxs("div",{className:"app-shell","data-dashboard-localization-root":!0,children:[c.jsxs("aside",{className:"sidebar",children:[c.jsxs("div",{className:"brand",children:[c.jsx("div",{className:"brand-mark",children:c.jsx(Ks,{size:22})}),c.jsxs("div",{children:[c.jsx("strong",{children:"Codex Usage Tracker"}),c.jsx("span",{children:A.t("dashboard.eyebrow","Local telemetry console")})]})]}),c.jsxs("div",{className:"local-pill",children:[c.jsx("span",{"aria-hidden":"true"}),"Local data only"]}),c.jsx(il,{payload:n,canUseLiveApi:H,shellI18n:A}),c.jsx("nav",{className:"primary-nav","aria-label":"Primary",children:kr.map(m=>{const S=m.icon,M=i===m.id||i==="call"&&m.id==="calls";return c.jsxs("button",{type:"button","aria-pressed":M,className:M?"active":"",onClick:()=>st(m.id),children:[c.jsx(S,{size:18}),c.jsx("span",{children:A.navLabel(m.id,m.label)})]},m.id)})}),c.jsxs("div",{className:"secondary-block",role:"group","aria-label":"Quick Links",children:[c.jsx("span",{children:"Quick Links"}),Tr.map(m=>{const S=m.icon;return c.jsxs("button",{type:"button",onClick:()=>st(m.target),children:[c.jsx(S,{size:16}),m.label]},m.label)})]})]}),c.jsxs("main",{className:"workspace",children:[c.jsxs("div",{className:"unofficial-banner",role:"note","aria-label":"Unofficial project notice",children:[c.jsx(Us,{size:16}),c.jsxs("span",{children:[c.jsx("strong",{children:"Unofficial project."})," Not made by, affiliated with, endorsed by, sponsored by, or supported by OpenAI."]})]}),c.jsxs("header",{className:"topbar","aria-label":"Dashboard toolbar",children:[c.jsxs("label",{className:"global-search",children:[c.jsx("span",{className:"sr-only",children:A.t("filter.search","Search dashboard")}),c.jsx("input",{ref:e,"aria-label":A.t("filter.search","Search dashboard"),value:g,onChange:m=>is(m.target.value),placeholder:A.t("filter.search_placeholder","Search calls, threads, models, diagnostics...")})]}),c.jsxs("div",{className:"topbar-actions",children:[c.jsxs("div",{className:"topbar-scope-controls",children:[A.languages.length>1?c.jsxs("label",{className:"topbar-select",children:[c.jsx("span",{children:A.t("language.label","Language")}),c.jsx("select",{"data-localization-skip":"true","aria-label":A.t("language.label","Language"),value:A.language,onChange:m=>ms(m.target.value),children:A.languages.map(m=>c.jsx("option",{value:m.code,children:m.native_name||m.english_name||m.code},m.code))})]}):null,c.jsxs("label",{className:"topbar-select",children:[c.jsx("span",{children:A.t("nav.history","History")}),c.jsxs("select",{"aria-label":"History scope",title:Dn,value:J,onChange:m=>hs(m.target.value),disabled:j||!H,children:[c.jsx("option",{value:"active",children:A.t("option.active_sessions_only","Active")}),c.jsx("option",{value:"all",children:A.t("option.all_history","All history")})]}),c.jsx("small",{className:"sr-only",children:Dn})]})]}),c.jsx(sc,{canUseLiveApi:H,finitePendingLoadLimit:It,hasMoreRows:En,loadLabel:A.t("nav.load","Load"),loadMoreLabel:A.t("button.load_more","Load more"),loadWindow:q,loadedRowCount:ge,pendingLoadLimit:Ue,refreshProgressPercent:ts,refreshProgressText:ns,refreshing:j,rowLimitChanged:Jr,rowLimitSliderMax:Nn,rowLimitSliderValue:Zr,rowLoadModeLabel:Yr,rowLoadStatus:Xr,totalAvailableRows:Ve,onApply:ls,onCancel:os,onDraftChange:In,onLoadMore:On,onSliderChange:cs,onWindowChange:ds}),c.jsxs("div",{className:"topbar-meta",children:[c.jsxs("div",{className:"topbar-statuses",children:[w?c.jsxs("button",{className:"toolbar-button",type:"button",onClick:vs,children:[c.jsx(dn,{size:15}),A.t("button.clear","Clear")," ",ml(w)]}):null,c.jsxs("label",{className:"topbar-toggle",children:[c.jsx("input",{"aria-label":"Auto refresh",type:"checkbox",checked:F,onChange:m=>fs(m.target.checked),disabled:j||!H}),c.jsx("span",{children:"Auto"})]})]}),c.jsxs("div",{className:"topbar-icon-actions",children:[c.jsx("button",{className:"icon-button",type:"button",onClick:gs,"aria-label":A.t("button.copy_link","Copy link"),title:A.t("button.copy_link","Copy link"),children:c.jsx(js,{size:17})}),c.jsx("button",{className:"icon-button",type:"button",onClick:bs,"aria-label":A.t("button.export_csv","Export CSV"),title:A.t("button.export_csv","Export CSV"),children:c.jsx(Ns,{size:17})}),c.jsx("button",{className:"icon-button",type:"button",onClick:Un,"aria-label":A.t("button.refresh","Refresh"),title:A.t("button.refresh","Refresh"),disabled:j,children:c.jsx(Is,{size:17})})]})]})]})]}),c.jsx("p",{className:"sr-only",role:"status","aria-live":"polite",children:_}),c.jsx(Tl,{activeView:i,model:An,navigateView:st,onRefresh:Un,refreshState:_,globalQuery:g,activePreset:w,activeRecordId:d,contextRuntime:jn,setContextApiEnabled:Pn,openCallInvestigator:rs,copyCallInvestigatorLink:ps,callBackLabel:u?`Back to ${gc(h)}`:A.t("button.back_to_dashboard","Back to dashboard"),backFromCallInvestigator:ss,dashboardPayload:n,sourceIdentity:zr,historyScope:J,loadWindow:q,scopeSince:(n==null?void 0:n.since)??Ht(q),loadLimit:G,loadedRowCount:ge,totalAvailableRows:Ve,canUseLiveApi:H,autoRefreshEnabled:F,applicationI18n:A,refreshing:j,hasMoreRows:En,canLoadAllRows:as,loadMoreRows:On,loadAllRows:us,globalFilters:c.jsx(ic,{activeView:i,locationSearch:N,model:r,onUrlChange:Ke})})]}),vt?c.jsxs("button",{className:"to-top-button",type:"button",onClick:ws,"aria-label":"Back to top",children:[c.jsx(Ts,{size:18}),A.t("button.top","Top")]}):null]})});function Un(){ie()}}function Al(){return c.jsx(Mi,{client:kn,children:c.jsx(Qr,{})})}const cu=Object.freeze(Object.defineProperty({__proto__:null,App:Qr,RoutedApp:Al,shouldAutoRefreshUsageView:Br},Symbol.toStringTag,{value:"Module"}));export{Jl as $,Ts as A,Il as B,Oi as C,Ns as D,Zl as E,Ds as F,ks as G,As as H,ya as I,Et as J,Q as K,Ol as L,qa as M,ne as N,au as O,kc as P,eu as Q,Is as R,Os as S,ru as T,Ps as U,Vs as V,ou as W,xa as X,Ql as Y,Bl as Z,Wl as _,js as a,Fs as a0,dn as a1,ml as a2,Kl as a3,Vl as a4,gi as a5,ci as a6,Gt as a7,Wa as a8,ii as a9,oi as aa,zt as ab,Ka as ac,Ci as ad,di as ae,Ul as af,Hl as ag,Gl as ah,kt as ai,fa as aj,zl as ak,Re as al,cu as am,Xl as b,$ as c,Fi as d,ce as e,ve as f,Di as g,iu as h,su as i,Le as j,dr as k,ql as l,Xt as m,Mr as n,nu as o,dt as p,tu as q,Ei as r,va as s,Yl as t,Va as u,pr as v,Ur as w,Nc as x,Ac as y,Fc as z}; + */const ua=$("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),$n="codex-usage-dashboard-language",Hs={"button.back_to_dashboard":"Back to dashboard","button.clear":"Clear","button.copy_link":"Copy link","button.enable_context_loading":"Enable context loading","button.export_csv":"Export CSV","button.full_serialized_analysis":"Run full serialized analysis","button.hide_details":"Hide details","button.include_tool_output":"Include tool output","button.load_more":"Load more","button.load_older_context":"Load older entries","button.next_call":"Next call","button.no_char_limit":"No char limit","button.open_investigator":"Open investigator","button.previous_call":"Previous call","button.refresh":"Refresh","button.show_compaction_history":"Show compacted replacement","button.show_tool_output":"Show tool output","button.top":"Top","button.show_turn_evidence":"Show turn log evidence","badge.live":"Live","dashboard.eyebrow":"Local Codex analytics","dashboard.call_details":"Call Details","dashboard.title":"Usage Dashboard","dashboard.view.call":"Call Investigator","dashboard.view.calls":"Calls","dashboard.view.insights":"Overview","dashboard.view.overview":"Overview","dashboard.view.threads":"Threads","detail.next_action":"Next action","filter.search":"Search dashboard","filter.search_placeholder":"Search calls, threads, models, diagnostics...","language.label":"Language","nav.history":"History","nav.load":"Load","nav.live":"Live","option.active_sessions_only":"Active","option.all_history":"All history","status.paused":"Paused","status.static":"Static"},Ws={overview:"dashboard.view.overview",calls:"dashboard.view.calls",call:"dashboard.view.call",threads:"dashboard.view.threads"};function Il(e,t){return typeof t=="string"?e.translateText(t):e.formatText(t.template,t.values)}function In(e,t){const a=On(e),n=Un(t,a),r=(e==null?void 0:e.translation_catalog)??{},s=r[n]??((e==null?void 0:e.language)===n?e==null?void 0:e.translations:void 0)??{},i=r.en??((e==null?void 0:e.language)==="en"?e.translations:void 0)??{},o={...Hs,...i,...s},d=Qs(i,s),f=Bs(i,s),h=a.find(p=>p.code===n),v=(h==null?void 0:h.dir)==="rtl"||!h&&(e==null?void 0:e.language_direction)==="rtl"?"rtl":"ltr",u=p=>n==="zh-Hans"?ys(p,d,f):d.get(p)??p;return{language:n,direction:v,languages:a,t:(p,g)=>o[p]??g??p,translateText:u,formatText:(p,g)=>u(p).replace(/\{([A-Za-z][A-Za-z0-9_]*)\}/gu,(b,w)=>String(g[String(w)]??b)),navLabel:(p,g)=>{const b=Ws[p];return b?o[b]??g:g}}}function Bs(e,t){const a=[];for(const[n,r]of Object.entries(e)){const s=t[n];if(!s||s===r||!r.includes("{"))continue;const i=[],o=[];let d=0;for(const f of r.matchAll(/\{([A-Za-z][A-Za-z0-9_]*)\}/gu)){const h=f.index??d;o.push(Ha(r.slice(d,h))),o.push("(.+?)"),i.push(f[1]),d=h+f[0].length}o.push(Ha(r.slice(d))),a.push({pattern:new RegExp(`^${o.join("")}$`,"u"),placeholders:i,translatedTemplate:s})}return a.sort((n,r)=>r.translatedTemplate.length-n.translatedTemplate.length)}function Ha(e){return e.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}function Qs(e,t){const a=new Map;for(const[n,r]of Object.entries(e)){const s=t[n];s&&s!==r&&a.set(r,s)}return a}function On(e){var a;const t=((a=e==null?void 0:e.available_languages)==null?void 0:a.filter(n=>n.code))??[];return t.length?t:[{code:"en",english_name:"English",native_name:"English",dir:"ltr"}]}function Gs(e){return Un(Zs()||(e==null?void 0:e.language)||"en",On(e))}function Js(e){var t;try{(t=window.localStorage)==null||t.setItem($n,e)}catch{}}function Zs(){var e;try{return((e=window.localStorage)==null?void 0:e.getItem($n))??""}catch{return""}}function Un(e,t){if(new Set(t.map(s=>s.code)).has(e))return e;const n=e.toLowerCase(),r=t.find(s=>s.code.toLowerCase()===n);return(r==null?void 0:r.code)??"en"}const Xs=In(null,"en"),Vn=C.createContext(Xs);function Ys({value:e,children:t}){return c.jsx(Vn.Provider,{value:e,children:t})}function Kn(){return C.useContext(Vn)}var Et=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},Ae,we,Qe,Ln,ei=(Ln=class extends Et{constructor(){super();P(this,Ae);P(this,we);P(this,Qe);x(this,Qe,t=>{if(typeof window<"u"&&window.addEventListener){const a=()=>t();return window.addEventListener("visibilitychange",a,!1),()=>{window.removeEventListener("visibilitychange",a)}}})}onSubscribe(){l(this,we)||this.setEventListener(l(this,Qe))}onUnsubscribe(){var t;this.hasListeners()||((t=l(this,we))==null||t.call(this),x(this,we,void 0))}setEventListener(t){var a;x(this,Qe,t),(a=l(this,we))==null||a.call(this),x(this,we,t(n=>{typeof n=="boolean"?this.setFocused(n):this.onFocus()}))}setFocused(t){l(this,Ae)!==t&&(x(this,Ae,t),this.onFocus())}onFocus(){const t=this.isFocused();this.listeners.forEach(a=>{a(t)})}isFocused(){var t;return typeof l(this,Ae)=="boolean"?l(this,Ae):((t=globalThis.document)==null?void 0:t.visibilityState)!=="hidden"}},Ae=new WeakMap,we=new WeakMap,Qe=new WeakMap,Ln),zn=new ei,ti={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},ye,la,Rn,ai=(Rn=class{constructor(){P(this,ye,ti);P(this,la,!1)}setTimeoutProvider(e){x(this,ye,e)}setTimeout(e,t){return l(this,ye).setTimeout(e,t)}clearTimeout(e){l(this,ye).clearTimeout(e)}setInterval(e,t){return l(this,ye).setInterval(e,t)}clearInterval(e){l(this,ye).clearInterval(e)}},ye=new WeakMap,la=new WeakMap,Rn),Qt=new ai;function ni(e){setTimeout(e,0)}var ri=typeof window>"u"||"Deno"in globalThis;function ae(){}function si(e,t){return typeof e=="function"?e(t):e}function ii(e){return typeof e=="number"&&e>=0&&e!==1/0}function oi(e,t){return Math.max(e+(t||0)-Date.now(),0)}function Gt(e,t){return typeof e=="function"?e(t):e}function ci(e,t){return typeof e=="function"?e(t):e}function Wa(e,t){const{type:a="all",exact:n,fetchStatus:r,predicate:s,queryKey:i,stale:o}=e;if(i){if(n){if(t.queryHash!==da(i,t.options))return!1}else if(!ut(t.queryKey,i))return!1}if(a!=="all"){const d=t.isActive();if(a==="active"&&!d||a==="inactive"&&d)return!1}return!(typeof o=="boolean"&&t.isStale()!==o||r&&r!==t.state.fetchStatus||s&&!s(t))}function Ba(e,t){const{exact:a,status:n,predicate:r,mutationKey:s}=e;if(s){if(!t.options.mutationKey)return!1;if(a){if(lt(t.options.mutationKey)!==lt(s))return!1}else if(!ut(t.options.mutationKey,s))return!1}return!(n&&t.state.status!==n||r&&!r(t))}function da(e,t){return((t==null?void 0:t.queryKeyHashFn)||lt)(e)}function lt(e){return JSON.stringify(e,(t,a)=>Jt(a)?Object.keys(a).sort().reduce((n,r)=>(n[r]=a[r],n),{}):a)}function ut(e,t){return e===t?!0:typeof e!=typeof t?!1:e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(t).every(a=>ut(e[a],t[a])):!1}var li=Object.prototype.hasOwnProperty;function qn(e,t,a=0){if(e===t)return e;if(a>500)return t;const n=Qa(e)&&Qa(t);if(!n&&!(Jt(e)&&Jt(t)))return t;const s=(n?e:Object.keys(e)).length,i=n?t:Object.keys(t),o=i.length,d=n?new Array(o):{};let f=0;for(let h=0;h{Qt.setTimeout(t,e)})}function di(e,t,a){return typeof a.structuralSharing=="function"?a.structuralSharing(e,t):a.structuralSharing!==!1?qn(e,t):t}function hi(e,t,a=0){const n=[...e,t];return a&&n.length>a?n.slice(1):n}function fi(e,t,a=0){const n=[t,...e];return a&&n.length>a?n.slice(0,-1):n}var ha=Symbol();function Hn(e,t){return!e.queryFn&&(t!=null&&t.initialPromise)?()=>t.initialPromise:!e.queryFn||e.queryFn===ha?()=>Promise.reject(new Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function Ul(e,t){return typeof e=="function"?e(...t):!!e}function mi(e,t,a){let n=!1,r;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(r??(r=t()),n||(n=!0,r.aborted?a():r.addEventListener("abort",a,{once:!0})),r)}),e}var Wn=(()=>{let e=()=>ri;return{isServer(){return e()},setIsServer(t){e=t}}})();function gi(){let e,t;const a=new Promise((r,s)=>{e=r,t=s});a.status="pending",a.catch(()=>{});function n(r){Object.assign(a,r),delete a.resolve,delete a.reject}return a.resolve=r=>{n({status:"fulfilled",value:r}),e(r)},a.reject=r=>{n({status:"rejected",reason:r}),t(r)},a}var pi=ni;function bi(){let e=[],t=0,a=o=>{o()},n=o=>{o()},r=pi;const s=o=>{t?e.push(o):r(()=>{a(o)})},i=()=>{const o=e;e=[],o.length&&r(()=>{n(()=>{o.forEach(d=>{a(d)})})})};return{batch:o=>{let d;t++;try{d=o()}finally{t--,t||i()}return d},batchCalls:o=>(...d)=>{s(()=>{o(...d)})},schedule:s,setNotifyFunction:o=>{a=o},setBatchNotifyFunction:o=>{n=o},setScheduler:o=>{r=o}}}var B=bi(),Ge,_e,Je,Mn,vi=(Mn=class extends Et{constructor(){super();P(this,Ge,!0);P(this,_e);P(this,Je);x(this,Je,t=>{if(typeof window<"u"&&window.addEventListener){const a=()=>t(!0),n=()=>t(!1);return window.addEventListener("online",a,!1),window.addEventListener("offline",n,!1),()=>{window.removeEventListener("online",a),window.removeEventListener("offline",n)}}})}onSubscribe(){l(this,_e)||this.setEventListener(l(this,Je))}onUnsubscribe(){var t;this.hasListeners()||((t=l(this,_e))==null||t.call(this),x(this,_e,void 0))}setEventListener(t){var a;x(this,Je,t),(a=l(this,_e))==null||a.call(this),x(this,_e,t(this.setOnline.bind(this)))}setOnline(t){l(this,Ge)!==t&&(x(this,Ge,t),this.listeners.forEach(n=>{n(t)}))}isOnline(){return l(this,Ge)}},Ge=new WeakMap,_e=new WeakMap,Je=new WeakMap,Mn),Tt=new vi;function wi(e){return Math.min(1e3*2**e,3e4)}function Bn(e){return(e??"online")==="online"?Tt.isOnline():!0}var Lt=class extends Error{constructor(e){super("CancelledError"),this.revert=e==null?void 0:e.revert,this.silent=e==null?void 0:e.silent}};function yi(e){return e instanceof Lt}function Qn(e){let t=!1,a=0,n;const r=gi(),s=()=>r.status!=="pending",i=b=>{var w;if(!s()){const T=new Lt(b);u(T),(w=e.onCancel)==null||w.call(e,T)}},o=()=>{t=!0},d=()=>{t=!1},f=()=>zn.isFocused()&&(e.networkMode==="always"||Tt.isOnline())&&e.canRun(),h=()=>Bn(e.networkMode)&&e.canRun(),v=b=>{s()||(n==null||n(),r.resolve(b))},u=b=>{s()||(n==null||n(),r.reject(b))},p=()=>new Promise(b=>{var w;n=T=>{(s()||f())&&b(T)},(w=e.onPause)==null||w.call(e)}).then(()=>{var b;n=void 0,s()||(b=e.onContinue)==null||b.call(e)}),g=()=>{if(s())return;let b;const w=a===0?e.initialPromise:void 0;try{b=w??e.fn()}catch(T){b=Promise.reject(T)}Promise.resolve(b).then(v).catch(T=>{var y;if(s())return;const A=e.retry??(Wn.isServer()?0:3),R=e.retryDelay??wi,_=typeof R=="function"?R(a,T):R,L=A===!0||typeof A=="number"&&af()?void 0:p()).then(()=>{t?u(T):g()})})};return{promise:r,status:()=>r.status,cancel:i,continue:()=>(n==null||n(),r),cancelRetry:o,continueRetry:d,canStart:h,start:()=>(h()?g():p().then(g),r)}}var Ee,Pn,Gn=(Pn=class{constructor(){P(this,Ee)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),ii(this.gcTime)&&x(this,Ee,Qt.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(Wn.isServer()?1/0:300*1e3))}clearGcTimeout(){l(this,Ee)!==void 0&&(Qt.clearTimeout(l(this,Ee)),x(this,Ee,void 0))}},Ee=new WeakMap,Pn);function _i(e){return{onFetch:(t,a)=>{var h,v,u,p,g;const n=t.options,r=(u=(v=(h=t.fetchOptions)==null?void 0:h.meta)==null?void 0:v.fetchMore)==null?void 0:u.direction,s=((p=t.state.data)==null?void 0:p.pages)||[],i=((g=t.state.data)==null?void 0:g.pageParams)||[];let o={pages:[],pageParams:[]},d=0;const f=async()=>{let b=!1;const w=R=>{mi(R,()=>t.signal,()=>b=!0)},T=Hn(t.options,t.fetchOptions),A=async(R,_,L)=>{if(b)return Promise.reject(t.signal.reason);if(_==null&&R.pages.length)return Promise.resolve(R);const k=(()=>{const me={client:t.client,queryKey:t.queryKey,pageParam:_,direction:L?"backward":"forward",meta:t.options.meta};return w(me),me})(),j=await T(k),{maxPages:E}=t.options,F=L?fi:hi;return{pages:F(R.pages,j,E),pageParams:F(R.pageParams,_,E)}};if(r&&s.length){const R=r==="backward",_=R?Jn:Zt,L={pages:s,pageParams:i},y=_(n,L);o=await A(L,y,R)}else{const R=e??s.length;do{const _=d===0?i[0]??n.initialPageParam:Zt(n,o);if(d>0&&_==null)break;o=await A(o,_),d++}while(d{var b,w;return(w=(b=t.options).persister)==null?void 0:w.call(b,f,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},a)}:t.fetchFn=f}}}function Zt(e,{pages:t,pageParams:a}){const n=t.length-1;return t.length>0?e.getNextPageParam(t[n],t,a[n],a):void 0}function Jn(e,{pages:t,pageParams:a}){var n;return t.length>0?(n=e.getPreviousPageParam)==null?void 0:n.call(e,t[0],t,a[0],a):void 0}function Vl(e,t){return t?Zt(e,t)!=null:!1}function Kl(e,t){return!t||!e.getPreviousPageParam?!1:Jn(e,t)!=null}var Ze,Fe,Xe,X,De,U,ft,$e,Z,Zn,he,jn,Si=(jn=class extends Gn{constructor(t){super();P(this,Z);P(this,Ze);P(this,Fe);P(this,Xe);P(this,X);P(this,De);P(this,U);P(this,ft);P(this,$e);x(this,$e,!1),x(this,ft,t.defaultOptions),this.setOptions(t.options),this.observers=[],x(this,De,t.client),x(this,X,l(this,De).getQueryCache()),this.queryKey=t.queryKey,this.queryHash=t.queryHash,x(this,Fe,Za(this.options)),this.state=t.state??l(this,Fe),this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return l(this,Ze)}get promise(){var t;return(t=l(this,U))==null?void 0:t.promise}setOptions(t){if(this.options={...l(this,ft),...t},t!=null&&t._type&&x(this,Ze,t._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const a=Za(this.options);a.data!==void 0&&(this.setState(Ja(a.data,a.dataUpdatedAt)),x(this,Fe,a))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&l(this,X).remove(this)}setData(t,a){const n=di(this.state.data,t,this.options);return V(this,Z,he).call(this,{data:n,type:"success",dataUpdatedAt:a==null?void 0:a.updatedAt,manual:a==null?void 0:a.manual}),n}setState(t){V(this,Z,he).call(this,{type:"setState",state:t})}cancel(t){var n,r;const a=(n=l(this,U))==null?void 0:n.promise;return(r=l(this,U))==null||r.cancel(t),a?a.then(ae).catch(ae):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return l(this,Fe)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(t=>ci(t.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===ha||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(t=>Gt(t.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(t=>t.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(t=0){return this.state.data===void 0?!0:t==="static"?!1:this.state.isInvalidated?!0:!oi(this.state.dataUpdatedAt,t)}onFocus(){var a;const t=this.observers.find(n=>n.shouldFetchOnWindowFocus());t==null||t.refetch({cancelRefetch:!1}),(a=l(this,U))==null||a.continue()}onOnline(){var a;const t=this.observers.find(n=>n.shouldFetchOnReconnect());t==null||t.refetch({cancelRefetch:!1}),(a=l(this,U))==null||a.continue()}addObserver(t){this.observers.includes(t)||(this.observers.push(t),this.clearGcTimeout(),l(this,X).notify({type:"observerAdded",query:this,observer:t}))}removeObserver(t){this.observers.includes(t)&&(this.observers=this.observers.filter(a=>a!==t),this.observers.length||(l(this,U)&&(l(this,$e)||V(this,Z,Zn).call(this)?l(this,U).cancel({revert:!0}):l(this,U).cancelRetry()),this.scheduleGc()),l(this,X).notify({type:"observerRemoved",query:this,observer:t}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||V(this,Z,he).call(this,{type:"invalidate"})}async fetch(t,a){var f,h,v,u,p,g,b,w,T,A,R;if(this.state.fetchStatus!=="idle"&&((f=l(this,U))==null?void 0:f.status())!=="rejected"){if(this.state.data!==void 0&&(a!=null&&a.cancelRefetch))this.cancel({silent:!0});else if(l(this,U))return l(this,U).continueRetry(),l(this,U).promise}if(t&&this.setOptions(t),!this.options.queryFn){const _=this.observers.find(L=>L.options.queryFn);_&&this.setOptions(_.options)}const n=new AbortController,r=_=>{Object.defineProperty(_,"signal",{enumerable:!0,get:()=>(x(this,$e,!0),n.signal)})},s=()=>{const _=Hn(this.options,a),y=(()=>{const k={client:l(this,De),queryKey:this.queryKey,meta:this.meta};return r(k),k})();return x(this,$e,!1),this.options.persister?this.options.persister(_,y,this):_(y)},o=(()=>{const _={fetchOptions:a,options:this.options,queryKey:this.queryKey,client:l(this,De),state:this.state,fetchFn:s};return r(_),_})(),d=l(this,Ze)==="infinite"?_i(this.options.pages):this.options.behavior;d==null||d.onFetch(o,this),x(this,Xe,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((h=o.fetchOptions)==null?void 0:h.meta))&&V(this,Z,he).call(this,{type:"fetch",meta:(v=o.fetchOptions)==null?void 0:v.meta}),x(this,U,Qn({initialPromise:a==null?void 0:a.initialPromise,fn:o.fetchFn,onCancel:_=>{_ instanceof Lt&&_.revert&&this.setState({...l(this,Xe),fetchStatus:"idle"}),n.abort()},onFail:(_,L)=>{V(this,Z,he).call(this,{type:"failed",failureCount:_,error:L})},onPause:()=>{V(this,Z,he).call(this,{type:"pause"})},onContinue:()=>{V(this,Z,he).call(this,{type:"continue"})},retry:o.options.retry,retryDelay:o.options.retryDelay,networkMode:o.options.networkMode,canRun:()=>!0}));try{const _=await l(this,U).start();if(_===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(_),(p=(u=l(this,X).config).onSuccess)==null||p.call(u,_,this),(b=(g=l(this,X).config).onSettled)==null||b.call(g,_,this.state.error,this),_}catch(_){if(_ instanceof Lt){if(_.silent)return l(this,U).promise;if(_.revert){if(this.state.data===void 0)throw _;return this.state.data}}throw V(this,Z,he).call(this,{type:"error",error:_}),(T=(w=l(this,X).config).onError)==null||T.call(w,_,this),(R=(A=l(this,X).config).onSettled)==null||R.call(A,this.state.data,_,this),_}finally{this.scheduleGc()}}},Ze=new WeakMap,Fe=new WeakMap,Xe=new WeakMap,X=new WeakMap,De=new WeakMap,U=new WeakMap,ft=new WeakMap,$e=new WeakMap,Z=new WeakSet,Zn=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},he=function(t){const a=n=>{switch(t.type){case"failed":return{...n,fetchFailureCount:t.failureCount,fetchFailureReason:t.error};case"pause":return{...n,fetchStatus:"paused"};case"continue":return{...n,fetchStatus:"fetching"};case"fetch":return{...n,...Ci(n.data,this.options),fetchMeta:t.meta??null};case"success":const r={...n,...Ja(t.data,t.dataUpdatedAt),dataUpdateCount:n.dataUpdateCount+1,...!t.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return x(this,Xe,t.manual?r:void 0),r;case"error":const s=t.error;return{...n,error:s,errorUpdateCount:n.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:n.fetchFailureCount+1,fetchFailureReason:s,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...n,isInvalidated:!0};case"setState":return{...n,...t.state}}};this.state=a(this.state),B.batch(()=>{this.observers.forEach(n=>{n.onQueryUpdate()}),l(this,X).notify({query:this,type:"updated",action:t})})},jn);function Ci(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Bn(t.networkMode)?"fetching":"paused",...e===void 0&&{error:null,status:"pending"}}}function Ja(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:"success"}}function Za(e){const t=typeof e.initialData=="function"?e.initialData():e.initialData,a=t!==void 0,n=a?typeof e.initialDataUpdatedAt=="function"?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:a?n??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:a?"success":"pending",fetchStatus:"idle"}}var mt,le,K,Ie,ue,be,Nn,xi=(Nn=class extends Gn{constructor(t){super();P(this,ue);P(this,mt);P(this,le);P(this,K);P(this,Ie);x(this,mt,t.client),this.mutationId=t.mutationId,x(this,K,t.mutationCache),x(this,le,[]),this.state=t.state||ki(),this.setOptions(t.options),this.scheduleGc()}setOptions(t){this.options=t,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(t){l(this,le).includes(t)||(l(this,le).push(t),this.clearGcTimeout(),l(this,K).notify({type:"observerAdded",mutation:this,observer:t}))}removeObserver(t){x(this,le,l(this,le).filter(a=>a!==t)),this.scheduleGc(),l(this,K).notify({type:"observerRemoved",mutation:this,observer:t})}optionalRemove(){l(this,le).length||(this.state.status==="pending"?this.scheduleGc():l(this,K).remove(this))}continue(){var t;return((t=l(this,Ie))==null?void 0:t.continue())??this.execute(this.state.variables)}async execute(t){var i,o,d,f,h,v,u,p,g,b,w,T,A,R,_,L,y,k;const a=()=>{V(this,ue,be).call(this,{type:"continue"})},n={client:l(this,mt),meta:this.options.meta,mutationKey:this.options.mutationKey};x(this,Ie,Qn({fn:()=>this.options.mutationFn?this.options.mutationFn(t,n):Promise.reject(new Error("No mutationFn found")),onFail:(j,E)=>{V(this,ue,be).call(this,{type:"failed",failureCount:j,error:E})},onPause:()=>{V(this,ue,be).call(this,{type:"pause"})},onContinue:a,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>l(this,K).canRun(this)}));const r=this.state.status==="pending",s=!l(this,Ie).canStart();try{if(r)a();else{V(this,ue,be).call(this,{type:"pending",variables:t,isPaused:s}),l(this,K).config.onMutate&&await l(this,K).config.onMutate(t,this,n);const E=await((o=(i=this.options).onMutate)==null?void 0:o.call(i,t,n));E!==this.state.context&&V(this,ue,be).call(this,{type:"pending",context:E,variables:t,isPaused:s})}const j=await l(this,Ie).start();return await((f=(d=l(this,K).config).onSuccess)==null?void 0:f.call(d,j,t,this.state.context,this,n)),await((v=(h=this.options).onSuccess)==null?void 0:v.call(h,j,t,this.state.context,n)),await((p=(u=l(this,K).config).onSettled)==null?void 0:p.call(u,j,null,this.state.variables,this.state.context,this,n)),await((b=(g=this.options).onSettled)==null?void 0:b.call(g,j,null,t,this.state.context,n)),V(this,ue,be).call(this,{type:"success",data:j}),j}catch(j){try{await((T=(w=l(this,K).config).onError)==null?void 0:T.call(w,j,t,this.state.context,this,n))}catch(E){Promise.reject(E)}try{await((R=(A=this.options).onError)==null?void 0:R.call(A,j,t,this.state.context,n))}catch(E){Promise.reject(E)}try{await((L=(_=l(this,K).config).onSettled)==null?void 0:L.call(_,void 0,j,this.state.variables,this.state.context,this,n))}catch(E){Promise.reject(E)}try{await((k=(y=this.options).onSettled)==null?void 0:k.call(y,void 0,j,t,this.state.context,n))}catch(E){Promise.reject(E)}throw V(this,ue,be).call(this,{type:"error",error:j}),j}finally{l(this,K).runNext(this)}}},mt=new WeakMap,le=new WeakMap,K=new WeakMap,Ie=new WeakMap,ue=new WeakSet,be=function(t){const a=n=>{switch(t.type){case"failed":return{...n,failureCount:t.failureCount,failureReason:t.error};case"pause":return{...n,isPaused:!0};case"continue":return{...n,isPaused:!1};case"pending":return{...n,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:"pending",variables:t.variables,submittedAt:Date.now()};case"success":return{...n,data:t.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...n,data:void 0,error:t.error,failureCount:n.failureCount+1,failureReason:t.error,isPaused:!1,status:"error"}}};this.state=a(this.state),B.batch(()=>{l(this,le).forEach(n=>{n.onMutationUpdate(t)}),l(this,K).notify({mutation:this,type:"updated",action:t})})},Nn);function ki(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var fe,ne,gt,An,Ti=(An=class extends Et{constructor(t={}){super();P(this,fe);P(this,ne);P(this,gt);this.config=t,x(this,fe,new Set),x(this,ne,new Map),x(this,gt,0)}build(t,a,n){const r=new xi({client:t,mutationCache:this,mutationId:++Ct(this,gt)._,options:t.defaultMutationOptions(a),state:n});return this.add(r),r}add(t){l(this,fe).add(t);const a=xt(t);if(typeof a=="string"){const n=l(this,ne).get(a);n?n.push(t):l(this,ne).set(a,[t])}this.notify({type:"added",mutation:t})}remove(t){if(l(this,fe).delete(t)){const a=xt(t);if(typeof a=="string"){const n=l(this,ne).get(a);if(n)if(n.length>1){const r=n.indexOf(t);r!==-1&&n.splice(r,1)}else n[0]===t&&l(this,ne).delete(a)}}this.notify({type:"removed",mutation:t})}canRun(t){const a=xt(t);if(typeof a=="string"){const n=l(this,ne).get(a),r=n==null?void 0:n.find(s=>s.state.status==="pending");return!r||r===t}else return!0}runNext(t){var n;const a=xt(t);if(typeof a=="string"){const r=(n=l(this,ne).get(a))==null?void 0:n.find(s=>s!==t&&s.state.isPaused);return(r==null?void 0:r.continue())??Promise.resolve()}else return Promise.resolve()}clear(){B.batch(()=>{l(this,fe).forEach(t=>{this.notify({type:"removed",mutation:t})}),l(this,fe).clear(),l(this,ne).clear()})}getAll(){return Array.from(l(this,fe))}find(t){const a={exact:!0,...t};return this.getAll().find(n=>Ba(a,n))}findAll(t={}){return this.getAll().filter(a=>Ba(t,a))}notify(t){B.batch(()=>{this.listeners.forEach(a=>{a(t)})})}resumePausedMutations(){const t=this.getAll().filter(a=>a.state.isPaused);return B.batch(()=>Promise.all(t.map(a=>a.continue().catch(ae))))}},fe=new WeakMap,ne=new WeakMap,gt=new WeakMap,An);function xt(e){var t;return(t=e.options.scope)==null?void 0:t.id}var de,En,Li=(En=class extends Et{constructor(t={}){super();P(this,de);this.config=t,x(this,de,new Map)}build(t,a,n){const r=a.queryKey,s=a.queryHash??da(r,a);let i=this.get(s);return i||(i=new Si({client:t,queryKey:r,queryHash:s,options:t.defaultQueryOptions(a),state:n,defaultOptions:t.getQueryDefaults(r)}),this.add(i)),i}add(t){l(this,de).has(t.queryHash)||(l(this,de).set(t.queryHash,t),this.notify({type:"added",query:t}))}remove(t){const a=l(this,de).get(t.queryHash);a&&(t.destroy(),a===t&&l(this,de).delete(t.queryHash),this.notify({type:"removed",query:t}))}clear(){B.batch(()=>{this.getAll().forEach(t=>{this.remove(t)})})}get(t){return l(this,de).get(t)}getAll(){return[...l(this,de).values()]}find(t){const a={exact:!0,...t};return this.getAll().find(n=>Wa(a,n))}findAll(t={}){const a=this.getAll();return Object.keys(t).length>0?a.filter(n=>Wa(t,n)):a}notify(t){B.batch(()=>{this.listeners.forEach(a=>{a(t)})})}onFocus(){B.batch(()=>{this.getAll().forEach(t=>{t.onFocus()})})}onOnline(){B.batch(()=>{this.getAll().forEach(t=>{t.onOnline()})})}},de=new WeakMap,En),D,Se,Ce,Ye,et,xe,tt,at,Fn,Ri=(Fn=class{constructor(e={}){P(this,D);P(this,Se);P(this,Ce);P(this,Ye);P(this,et);P(this,xe);P(this,tt);P(this,at);x(this,D,e.queryCache||new Li),x(this,Se,e.mutationCache||new Ti),x(this,Ce,e.defaultOptions||{}),x(this,Ye,new Map),x(this,et,new Map),x(this,xe,0)}mount(){Ct(this,xe)._++,l(this,xe)===1&&(x(this,tt,zn.subscribe(async e=>{e&&(await this.resumePausedMutations(),l(this,D).onFocus())})),x(this,at,Tt.subscribe(async e=>{e&&(await this.resumePausedMutations(),l(this,D).onOnline())})))}unmount(){var e,t;Ct(this,xe)._--,l(this,xe)===0&&((e=l(this,tt))==null||e.call(this),x(this,tt,void 0),(t=l(this,at))==null||t.call(this),x(this,at,void 0))}isFetching(e){return l(this,D).findAll({...e,fetchStatus:"fetching"}).length}isMutating(e){return l(this,Se).findAll({...e,status:"pending"}).length}getQueryData(e){var a;const t=this.defaultQueryOptions({queryKey:e});return(a=l(this,D).get(t.queryHash))==null?void 0:a.state.data}ensureQueryData(e){const t=this.defaultQueryOptions(e),a=l(this,D).build(this,t),n=a.state.data;return n===void 0?this.fetchQuery(e):(e.revalidateIfStale&&a.isStaleByTime(Gt(t.staleTime,a))&&this.prefetchQuery(t),Promise.resolve(n))}getQueriesData(e){return l(this,D).findAll(e).map(({queryKey:t,state:a})=>{const n=a.data;return[t,n]})}setQueryData(e,t,a){const n=this.defaultQueryOptions({queryKey:e}),r=l(this,D).get(n.queryHash),s=r==null?void 0:r.state.data,i=si(t,s);if(i!==void 0)return l(this,D).build(this,n).setData(i,{...a,manual:!0})}setQueriesData(e,t,a){return B.batch(()=>l(this,D).findAll(e).map(({queryKey:n})=>[n,this.setQueryData(n,t,a)]))}getQueryState(e){var a;const t=this.defaultQueryOptions({queryKey:e});return(a=l(this,D).get(t.queryHash))==null?void 0:a.state}removeQueries(e){const t=l(this,D);B.batch(()=>{t.findAll(e).forEach(a=>{t.remove(a)})})}resetQueries(e,t){const a=l(this,D);return B.batch(()=>(a.findAll(e).forEach(n=>{n.reset()}),this.refetchQueries({type:"active",...e},t)))}cancelQueries(e,t={}){const a={revert:!0,...t},n=B.batch(()=>l(this,D).findAll(e).map(r=>r.cancel(a)));return Promise.all(n).then(ae).catch(ae)}invalidateQueries(e,t={}){return B.batch(()=>(l(this,D).findAll(e).forEach(a=>{a.invalidate()}),(e==null?void 0:e.refetchType)==="none"?Promise.resolve():this.refetchQueries({...e,type:(e==null?void 0:e.refetchType)??(e==null?void 0:e.type)??"active"},t)))}refetchQueries(e,t={}){const a={...t,cancelRefetch:t.cancelRefetch??!0},n=B.batch(()=>l(this,D).findAll(e).filter(r=>!r.isDisabled()&&!r.isStatic()).map(r=>{let s=r.fetch(void 0,a);return a.throwOnError||(s=s.catch(ae)),r.state.fetchStatus==="paused"?Promise.resolve():s}));return Promise.all(n).then(ae)}fetchQuery(e){const t=this.defaultQueryOptions(e);t.retry===void 0&&(t.retry=!1);const a=l(this,D).build(this,t);return a.isStaleByTime(Gt(t.staleTime,a))?a.fetch(t):Promise.resolve(a.state.data)}prefetchQuery(e){return this.fetchQuery(e).then(ae).catch(ae)}fetchInfiniteQuery(e){return e._type="infinite",this.fetchQuery(e)}prefetchInfiniteQuery(e){return this.fetchInfiniteQuery(e).then(ae).catch(ae)}ensureInfiniteQueryData(e){return e._type="infinite",this.ensureQueryData(e)}resumePausedMutations(){return Tt.isOnline()?l(this,Se).resumePausedMutations():Promise.resolve()}getQueryCache(){return l(this,D)}getMutationCache(){return l(this,Se)}getDefaultOptions(){return l(this,Ce)}setDefaultOptions(e){x(this,Ce,e)}setQueryDefaults(e,t){l(this,Ye).set(lt(e),{queryKey:e,defaultOptions:t})}getQueryDefaults(e){const t=[...l(this,Ye).values()],a={};return t.forEach(n=>{ut(e,n.queryKey)&&Object.assign(a,n.defaultOptions)}),a}setMutationDefaults(e,t){l(this,et).set(lt(e),{mutationKey:e,defaultOptions:t})}getMutationDefaults(e){const t=[...l(this,et).values()],a={};return t.forEach(n=>{ut(e,n.mutationKey)&&Object.assign(a,n.defaultOptions)}),a}defaultQueryOptions(e){if(e._defaulted)return e;const t={...l(this,Ce).queries,...this.getQueryDefaults(e.queryKey),...e,_defaulted:!0};return t.queryHash||(t.queryHash=da(t.queryKey,t)),t.refetchOnReconnect===void 0&&(t.refetchOnReconnect=t.networkMode!=="always"),t.throwOnError===void 0&&(t.throwOnError=!!t.suspense),!t.networkMode&&t.persister&&(t.networkMode="offlineFirst"),t.queryFn===ha&&(t.enabled=!1),t}defaultMutationOptions(e){return e!=null&&e._defaulted?e:{...l(this,Ce).mutations,...(e==null?void 0:e.mutationKey)&&this.getMutationDefaults(e.mutationKey),...e,_defaulted:!0}}clear(){l(this,D).clear(),l(this,Se).clear()}},D=new WeakMap,Se=new WeakMap,Ce=new WeakMap,Ye=new WeakMap,et=new WeakMap,xe=new WeakMap,tt=new WeakMap,at=new WeakMap,Fn),Xn=C.createContext(void 0),zl=e=>{const t=C.useContext(Xn);if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t},Mi=({client:e,children:t})=>(C.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),c.jsx(Xn.Provider,{value:e,children:t}));function Pi(e,t=window.location.href){var n;const a=(n=new URL(t).searchParams.get("record"))==null?void 0:n.trim();if(a){const r=e.calls.find(s=>s.id===a);return r?[r]:[]}return e.calls[0]?[e.calls[0]]:[]}function ql({calls:e,recordId:t,detail:a}){const n=e.findIndex(v=>v.id===t),r=n>=0?n:!t&&e.length?0:-1,s=(a==null?void 0:a.record.id)===t?a:null,i=(s==null?void 0:s.record)??(r>=0?e[r]:null),o=(s==null?void 0:s.previousRecord)??(r>0?e[r-1]:null),d=(s==null?void 0:s.nextRecord)??(r>=0&&r=0?`${r+1} of ${e.length} loaded calls`:"Record outside loaded snapshot";return{modelIndex:n,activeIndex:r,hydratedDetail:s,call:i,previous:o,next:d,threadCalls:f,positionLabel:h}}function ji(e,t,a){const n=e.filter(i=>i.thread===t.thread),r=[a==null?void 0:a.previousRecord,a==null?void 0:a.record,a==null?void 0:a.nextRecord].filter(Ni),s=new Map;for(const i of[...n,...r,t])s.set(i.id,i);return[...s.values()].sort(Ai)}function Ni(e){return!!(e!=null&&e.id)}function Ai(e,t){return Date.parse(t.rawTime||t.time)-Date.parse(e.rawTime||e.time)}function Ei(e,t){const a=t.map(r=>Xa(r.header)).join(","),n=e.map(r=>t.map(s=>Xa(s.value(r))).join(","));return[a,...n].join(` +`)}function Fi(e,t){const a=new Blob([t],{type:"text/csv;charset=utf-8"}),n=typeof URL.createObjectURL=="function"?URL.createObjectURL(a):`data:text/csv;charset=utf-8,${encodeURIComponent(t)}`,r=document.createElement("a");r.href=n,r.download=e,r.rel="noopener",document.body.append(r),r.click(),r.remove(),n.startsWith("blob:")&&typeof URL.revokeObjectURL=="function"&&URL.revokeObjectURL(n)}function Di(e=new Date){return e.toISOString().slice(0,10)}function Xa(e){const t=String(e??"");return/[",\n\r]/.test(t)?`"${t.replaceAll('"','""')}"`:t}function Le(e){return new Intl.NumberFormat("en-US").format(Math.round(e))}function ve(e){return new Intl.NumberFormat("en-US",{notation:"compact",maximumFractionDigits:2}).format(e)}function Xt(e){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}).format(e)}function dt(e){return`${e.toFixed(1)}%`}const $i={priority:"Priority / Fast",fast:"Fast",default:"Default / Standard",standard:"Standard",flex:"Flex",batch:"Batch"};function Yn(e){const t=e.trim().toLowerCase().replace(/[\s_]+/g,"-");if(!t)return null;const a=$i[t];return a||(t.length>48||!/^[a-z0-9.-]+$/.test(t)?"Other":t.split(/[-.]+/).filter(Boolean).map(n=>`${n.charAt(0).toUpperCase()}${n.slice(1)}`).join(" "))}function Yt(e){const t=Yn(e.serviceTier);return t||(e.fast===!0?"Fast":e.fast===!1?"Standard":"Unknown")}function Hl(e){return Yn(e.serviceTier)?`observed ${Yt(e)} · ${e.serviceTierConfidence||"exact"}`:e.fast!==null?`confirmed ${Yt(e)} · ${e.serviceTierConfidence||"exact"}`:e.fastProxyCandidate?"tier unknown · Fast proxy candidate":"tier unknown · normal throughput proxy"}function Wl(e){if(e.billingBasis==="api_tokens"){const t=e.pricingServiceTier.trim();return`API token estimate · ${t?`${t.charAt(0).toUpperCase()}${t.slice(1).toLowerCase()} rates`:"configured rates"}`}return e.billingBasis==="chatgpt_credits"?"API-equivalent scenario · ChatGPT credits selected":"API-equivalent scenario · billing basis unknown"}function Bl(e){return e.cachedPct<25?"cold or weak cache":e.cachedPct<50?"partial cache reuse":"healthy cache reuse"}function Ql(e){return e.sourceFile?`${e.sourceFile}${e.lineNumber?`:${e.lineNumber}`:""}`:"Not available"}function Gl(e){if(e.contextWindowPct===null||e.contextWindowPct===void 0)return"Not reported";const t=e.modelContextWindow?` of ${ve(e.modelContextWindow)}`:"";return`${dt(e.contextWindowPct)}${t}`}function Jl(e,{limit:t=2,emptyLabel:a="No related calls",unknownLabel:n="Unknown",style:r="parenthetical"}={}){const s=new Map;for(const o of e){const d=o||n;s.set(d,(s.get(d)??0)+1)}const i=[...s.entries()].sort((o,d)=>d[1]-o[1]||o[0].localeCompare(d[0])).slice(0,t).map(([o,d])=>r==="x"?`${o} x${d}`:`${o} (${d})`);return i.length?i.join(", "):a}const Zl=[{id:"time",accessorFn:e=>Number(Date.parse(e.eventTimestamp||e.callStartedAt||e.rawTime||e.time))||0,header:"Time",cell:e=>e.row.original.time},{accessorKey:"thread",header:"Thread"},{accessorKey:"model",header:"Model"},{accessorKey:"effort",header:"Effort",cell:e=>c.jsx("span",{className:`pill effort-${String(e.getValue())}`,children:String(e.getValue())})},{accessorKey:"input",header:"Input Tokens",cell:e=>c.jsx("span",{className:"num",children:Le(Number(e.getValue()))})},{accessorKey:"totalTokens",header:"Total Tokens",cell:e=>c.jsx("span",{className:"num",children:Le(Number(e.getValue()))})},{accessorKey:"cachedInput",header:"Cached Input",cell:e=>c.jsx("span",{className:"num",children:Le(Number(e.getValue()))})},{accessorKey:"uncachedInput",header:"Uncached Input",cell:e=>c.jsx("span",{className:"num",children:Le(Number(e.getValue()))})},{accessorKey:"output",header:"Output Tokens",cell:e=>c.jsx("span",{className:"num",children:Le(Number(e.getValue()))})},{accessorKey:"reasoningOutput",header:"Reasoning Output",cell:e=>c.jsx("span",{className:"num",children:Le(Number(e.getValue()))})},{accessorKey:"cachedPct",header:"Cached %",cell:e=>c.jsx("span",{className:"cache-pill",children:dt(Number(e.getValue()))})},{accessorKey:"cost",header:"Est. Cost",cell:e=>c.jsx("span",{className:"num",children:Xt(Number(e.getValue()))})},{accessorKey:"credits",header:"Codex Credits",cell:e=>c.jsx("span",{className:"num",children:ve(Number(e.getValue()))})},{accessorKey:"contextWindowPct",header:"Context %",cell:e=>{const t=e.getValue(),a=typeof t=="number"?t:Number.NaN;return c.jsx("span",{className:"num",children:Number.isFinite(a)?dt(a):"-"})}},{accessorKey:"duration",header:"Duration"},{id:"serviceTier",accessorFn:e=>Yt(e),header:"Service Tier",cell:e=>{const t=String(e.getValue()),a=t.includes("Fast")?"green":t.includes("Standard")?"blue":"";return c.jsx("span",{className:`status-badge ${a}`.trim(),children:t})}},{accessorKey:"previousCallGap",header:"Prev Gap",cell:e=>c.jsx("span",{className:"num",children:String(e.getValue())})},{accessorKey:"initiator",header:"Initiated",cell:e=>c.jsx("span",{className:"status-badge blue",children:String(e.getValue())})},{accessorKey:"signal",header:"Signals",cell:e=>c.jsx(Oi,{call:e.row.original})}],ce=[{header:"timestamp",value:e=>e.eventTimestamp||e.rawTime||e.time},{header:"thread",value:e=>e.thread},{header:"call_started_at",value:e=>e.callStartedAt||e.rawTime||e.time},{header:"call_duration_seconds",value:e=>e.durationSeconds},{header:"previous_call_event_timestamp",value:e=>e.previousCallEventTimestamp},{header:"previous_call_delta_seconds",value:e=>e.previousCallGapSeconds},{header:"initiated",value:e=>e.initiator},{header:"initiated_reason",value:e=>e.initiatorReason},{header:"project",value:e=>e.project},{header:"model",value:e=>e.model},{header:"effort",value:e=>e.effort},{header:"total_tokens",value:e=>e.totalTokens},{header:"input_tokens",value:e=>e.input},{header:"cached_input_tokens",value:e=>e.cachedInput},{header:"uncached_input_tokens",value:e=>e.uncachedInput},{header:"output_tokens",value:e=>e.output},{header:"reasoning_output_tokens",value:e=>e.reasoningOutput},{header:"estimated_cost_usd",value:e=>e.cost.toFixed(6)},{header:"standard_cost_usd",value:e=>{var t;return((t=e.standardCost)==null?void 0:t.toFixed(6))??""}},{header:"priority_cost_usd",value:e=>{var t;return((t=e.priorityCost)==null?void 0:t.toFixed(6))??""}},{header:"pricing_service_tier",value:e=>e.pricingServiceTier},{header:"billing_basis",value:e=>e.billingBasis},{header:"cost_semantics",value:e=>e.costSemantics},{header:"usage_credits",value:e=>e.credits.toFixed(6)},{header:"standard_usage_credits",value:e=>e.standardUsageCredits.toFixed(6)},{header:"fast_usage_credits",value:e=>{var t;return((t=e.fastUsageCredits)==null?void 0:t.toFixed(6))??""}},{header:"service_tier",value:e=>e.serviceTier},{header:"fast",value:e=>e.fast===null?"":e.fast?1:0},{header:"service_tier_source",value:e=>e.serviceTierSource},{header:"service_tier_confidence",value:e=>e.serviceTierConfidence},{header:"fast_proxy_candidate",value:e=>String(e.fastProxyCandidate)},{header:"usage_credit_multiplier",value:e=>e.usageCreditMultiplier},{header:"usage_credit_multiplier_source",value:e=>e.usageCreditMultiplierSource},{header:"usage_credit_multiplier_source_url",value:e=>e.usageCreditMultiplierSourceUrl},{header:"usage_credit_multiplier_fetched_at",value:e=>e.usageCreditMultiplierFetchedAt},{header:"usage_credit_multiplier_confidence",value:e=>e.usageCreditMultiplierConfidence},{header:"cache_ratio",value:e=>e.cachedPct.toFixed(2)},{header:"context_window_percent",value:e=>{var t;return((t=e.contextWindowPct)==null?void 0:t.toFixed(2))??""}},{header:"pricing_model",value:e=>e.pricingModel},{header:"usage_credit_confidence",value:e=>e.usageCreditConfidence},{header:"recommendation",value:e=>e.recommendation},{header:"record_id",value:e=>e.id},{header:"thread_attachment",value:e=>e.threadAttachmentLabel},{header:"thread_source",value:e=>e.threadSource},{header:"parent_thread",value:e=>e.parentThread},{header:"session_id",value:e=>e.sessionId},{header:"turn_id",value:e=>e.turnId},{header:"parent_session_id",value:e=>e.parentSessionId},{header:"parent_session_updated_at",value:e=>e.parentSessionUpdatedAt},{header:"project_relative_cwd",value:e=>e.projectRelativeCwd},{header:"cwd",value:e=>e.cwd},{header:"source_file",value:e=>e.sourceFile},{header:"source_line",value:e=>e.lineNumber??""},{header:"git_branch",value:e=>e.gitBranch},{header:"git_remote_label",value:e=>e.gitRemoteLabel},{header:"git_remote_hash",value:e=>e.gitRemoteHash},{header:"pricing_estimated",value:e=>String(e.pricingEstimated)},{header:"usage_credit_model",value:e=>e.usageCreditModel},{header:"usage_credit_source",value:e=>e.usageCreditSource},{header:"usage_credit_tier",value:e=>e.usageCreditTier},{header:"usage_credit_fetched_at",value:e=>e.usageCreditFetchedAt},{header:"usage_credit_note",value:e=>e.usageCreditNote},{header:"model_context_window",value:e=>e.modelContextWindow??""},{header:"cumulative_total_tokens",value:e=>e.cumulativeTotalTokens??""},{header:"estimated_cache_savings_usd",value:e=>e.estimatedCacheSavings.toFixed(6)},{header:"initiated_confidence",value:e=>e.initiatorConfidence},{header:"signal",value:e=>e.signal},{header:"tags",value:e=>e.tags.join("|")},{header:"efficiency_flags",value:e=>e.efficiencyFlags.join("|")}];function Ii(e,t=3){const n=Ui([e.signal,...e.efficiencyFlags]).map((r,s)=>({key:`${r}-${s}`,label:fa(r),shortLabel:Vi(r)}));return{visible:n.slice(0,t),hidden:n.slice(t)}}function Oi({call:e}){const t=Kn(),{visible:a,hidden:n}=Ii(e);if(!a.length)return c.jsx("span",{className:"muted",children:"None"});const r=a.map(o=>({...o,label:t.translateText(o.label),shortLabel:t.translateText(o.shortLabel)})),s=n.map(o=>({...o,label:t.translateText(o.label),shortLabel:t.translateText(o.shortLabel)})),i=s.map(o=>o.label).join("、");return c.jsxs("span",{className:"flags compact-flags","aria-label":t.language==="zh-Hans"?`信号:${[...r,...s].map(o=>o.label).join("、")}`:`Signals: ${[...a,...n].map(o=>o.label).join(", ")}`,children:[r.map(o=>c.jsx("span",{className:"flag signal-puck",title:o.label,children:o.shortLabel},o.key)),s.length?c.jsxs("span",{className:"flag signal-puck more",title:i,children:["+",s.length]}):null]})}function Ui(e){const t=new Set;return e.map(a=>a.trim()).filter(a=>a&&a!=="aggregate").filter(a=>{const n=a.toLowerCase();return t.has(n)?!1:(t.add(n),!0)})}function fa(e){return e.replace(/[-_]+/g," ").replace(/\b\w/g,t=>t.toUpperCase())}function Vi(e){const t=e.toLowerCase().replace(/[_\s]+/g,"-"),a={"cache-drop":"CACHE","cache-risk":"CACHE","context-bloat":"CTX","context-heavy":"CTX","elevated-context":"CTX","elevated-context-use":"CTX","estimated-pricing":"EST","expensive-low-output-call":"LO","high-context-use":"CTX","high-cost":"$","high-estimated-cost":"$","high-reasoning-share":"RSN","large-thread":"BIG","low-cache":"CACHE","low-cache-reuse":"CACHE","low-output":"LO","pricing-gap":"PRICE","reasoning-spike":"RSN","subagent-attribution":"SUB"};if(a[t])return a[t];const n=fa(e).split(/\s+/).filter(Boolean);return n.length?n.length===1?n[0].slice(0,4).toUpperCase():n.slice(0,3).map(r=>r[0]).join("").toUpperCase():"?"}const Xl=[{accessorKey:"name",header:"Thread",size:280,minSize:220,maxSize:360,cell:e=>{const t=String(e.getValue());return c.jsx("span",{className:"thread-name-cell",title:t,children:t})}},{accessorKey:"latestActivity",header:"Latest",size:130,minSize:116},{accessorKey:"turns",header:"Turns",size:82,minSize:72,cell:e=>c.jsx("span",{className:"num",children:Le(Number(e.getValue()))})},{accessorKey:"totalDuration",header:"Duration",size:110},{accessorKey:"averageGap",header:"Avg Gap",size:110,cell:e=>c.jsx("span",{className:"num",children:String(e.getValue())})},{accessorKey:"initiatorSummary",header:"Initiated",size:116,cell:e=>{const t=String(e.getValue());return c.jsx("span",{className:`status-badge ${t==="unknown"?"neutral":"blue"}`,children:fa(t)})}},{accessorKey:"modelSummary",header:"Models",size:190,cell:e=>{const t=String(e.getValue());return t==="Load thread calls"?c.jsx("span",{className:"table-placeholder",title:"Expand this thread to load its model mix","aria-label":"Model mix not loaded",children:"—"}):c.jsx("span",{className:"pill model-pill",title:t,children:t})}},{accessorKey:"effortSummary",header:"Effort Mix",size:160,cell:e=>{const t=String(e.getValue());return t==="Load thread calls"?c.jsx("span",{className:"table-placeholder",title:"Expand this thread to load its effort mix","aria-label":"Effort mix not loaded",children:"—"}):c.jsx("span",{title:t,children:t})}},{accessorKey:"totalTokens",header:"Total Tokens",size:118,cell:e=>c.jsx("span",{className:"num",children:ve(Number(e.getValue()))})},{accessorKey:"cachedInput",header:"Cached Input",size:118,cell:e=>c.jsx("span",{className:"num",children:ve(Number(e.getValue()))})},{accessorKey:"uncachedInput",header:"Uncached Input",size:124,cell:e=>c.jsx("span",{className:"num",children:ve(Number(e.getValue()))})},{accessorKey:"outputTokens",header:"Output Tokens",size:116,cell:e=>c.jsx("span",{className:"num",children:ve(Number(e.getValue()))})},{accessorKey:"reasoningOutput",header:"Reasoning Output",size:130,cell:e=>c.jsx("span",{className:"num",children:ve(Number(e.getValue()))})},{accessorKey:"cost",header:"Est. Cost",size:100,cell:e=>c.jsx("span",{className:"num",children:Xt(Number(e.getValue()))})},{accessorKey:"credits",header:"Codex Credits",size:112,cell:e=>c.jsx("span",{className:"num",children:ve(Number(e.getValue()))})},{accessorKey:"cachePct",header:"Cache %",size:92,cell:e=>c.jsx("span",{className:"cache-pill",children:dt(Number(e.getValue()))})},{accessorKey:"contextPct",header:"Context %",size:100,cell:e=>{const t=e.getValue();return c.jsx("span",{className:"num",children:typeof t=="number"?dt(t):"-"})}},{accessorKey:"costPerCall",header:"Cost / Call",size:100,cell:e=>c.jsx("span",{className:"num",children:Xt(Number(e.getValue()))})},{accessorKey:"coldResumeRisk",header:"Cold Resume Risk",size:132,cell:e=>c.jsx("span",{className:`status-badge ${Ki(String(e.getValue()))}`,children:String(e.getValue())})},{accessorKey:"productivity",header:"Productivity",size:108,cell:e=>c.jsx("span",{className:"score",children:Number(e.getValue())})}],Yl=[{id:"name",label:"Thread",locked:!0},{id:"latestActivity",label:"Latest"},{id:"turns",label:"Turns"},{id:"totalDuration",label:"Duration"},{id:"averageGap",label:"Avg Gap"},{id:"initiatorSummary",label:"Initiated"},{id:"modelSummary",label:"Models"},{id:"effortSummary",label:"Effort Mix"},{id:"totalTokens",label:"Total Tokens"},{id:"cachedInput",label:"Cached Input"},{id:"uncachedInput",label:"Uncached Input"},{id:"outputTokens",label:"Output Tokens"},{id:"reasoningOutput",label:"Reasoning Output"},{id:"cost",label:"Est. Cost"},{id:"credits",label:"Codex Credits"},{id:"cachePct",label:"Cache %"},{id:"contextPct",label:"Context %"},{id:"costPerCall",label:"Cost / Call"},{id:"coldResumeRisk",label:"Cold Resume Risk"},{id:"productivity",label:"Productivity"},{id:"investigate",label:"Investigate",locked:!0}];function Ki(e){return e==="High"?"red":e==="Medium"?"orange":e==="Low"?"green":"neutral"}const ht=1,re=0,zt=100,er=1e3,tr=500,ar="codexUsageDashboardLoadSettings",zi={day:1440*60*1e3,week:10080*60*1e3};function ct(e,t=tr){if((e==null?void 0:e.limit_label)==="All"||t===re&&(e==null?void 0:e.limit)==null)return re;const a=Number((e==null?void 0:e.limit)??(e==null?void 0:e.loaded_row_count)??t);return Number.isFinite(a)&&a>=0?a:t}function pt(e){return Number.isFinite(e)?e<=re?re:Math.max(ht,Math.round(e)):ht}function je(...e){const t=e.find(a=>typeof a=="number"&&Number.isFinite(a)&&a>0);return t?Math.max(ht,Math.round(t)):ht}function qi(e,t,a=null,n="rows"){const r=pt(e);return{historyScope:t,loadWindow:n,limit:r===re?null:r,since:a}}function Hi(e){return e.limit??re}function ma(e){return ga(e==null?void 0:e.load_window)?e.load_window:e!=null&&e.since?"week":(e==null?void 0:e.limit_label)==="All"||(e==null?void 0:e.limit)==null?"all":"rows"}function Wi(e){return ga(e==null?void 0:e.default_load_window)?e.default_load_window:ma(e)}function qt(e,t=new Date){const a=zi[e];if(!a)return null;const n=Math.floor(t.getTime()/6e4)*6e4;return new Date(n-a).toISOString()}function Re(e,t=tr){return e==="day"?"Last 24 hours":e==="week"?"Last 7 days":e==="all"?"All time":`Most recent ${pt(t).toLocaleString()}`}function Bi(e=nr()){if(!e)return null;try{const t=e.getItem(ar);if(!t)return null;const a=JSON.parse(t),n=typeof a.loadLimit=="number"&&Number.isFinite(a.loadLimit)?pt(a.loadLimit):void 0,r=a.historyScope==="active"||a.historyScope==="all"?a.historyScope:void 0,s=ga(a.loadWindow)?a.loadWindow:void 0;return n===void 0&&r===void 0&&s===void 0?null:{loadLimit:n,historyScope:r,loadWindow:s}}catch{return null}}function Qi(e,t,a="rows",n=nr()){if(n)try{n.setItem(ar,JSON.stringify({loadLimit:pt(e),historyScope:t,loadWindow:a}))}catch{}}function ga(e){return e==="day"||e==="week"||e==="rows"||e==="all"}function Gi({currentLimit:e,loadedRows:t,pendingLimit:a}){const n=a===re?0:a+zt,s=Math.max(ht,e===re?0:e,n,t);return Math.ceil((s+er)/zt)*zt}function Ji({currentLimit:e,loadedRows:t,pendingLimit:a}){return Math.max(je(e),je(a),je(t))+er}function Zi({loadedRows:e,limit:t,totalRows:a}){return t===re&&e>0?`Loaded all ${e.toLocaleString()}`:a>e?`Loaded ${e.toLocaleString()} of ${a.toLocaleString()}`:`Loaded ${e.toLocaleString()} rows`}function nr(){try{return typeof window>"u"?null:window.sessionStorage}catch{return null}}async function Xi(e,t,a,n="",r=""){const s=Di();switch(e){case"threads":{const{threadCallsForCurrentUrl:i}=await O(async()=>{const{threadCallsForCurrentUrl:o}=await import("./ThreadsPage.js");return{threadCallsForCurrentUrl:o}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]));return te(`codex-thread-filtered-calls-${s}.csv`,i(t,n),ce,"call rows")}case"cache-context":{const{cacheContextCallsForCurrentUrl:i}=await O(async()=>{const{cacheContextCallsForCurrentUrl:o}=await import("./CacheContextPage.js");return{cacheContextCallsForCurrentUrl:o}},__vite__mapDeps([28,1,2,29,30,22,31,32,6,33,19,20,21,9,10,23,34,4,3,5,7,15,35,24,25,26,12]));return te(`codex-${e}-calls-${s}.csv`,i(t),ce,"call rows")}case"usage-drain":{const{usageDrainCallsForCurrentUrl:i}=await O(async()=>{const{usageDrainCallsForCurrentUrl:o}=await import("./UsageDrainPage.js");return{usageDrainCallsForCurrentUrl:o}},__vite__mapDeps([36,1,2,34,4,20,21,9,10,16,17,18,24,37,38,25,26,12,39]));return te(`codex-usage-drain-calls-${s}.csv`,i(t),ce,"call rows")}case"diagnostics":{const{diagnosticsCallsForCurrentUrl:i}=await O(async()=>{const{diagnosticsCallsForCurrentUrl:o}=await import("./DiagnosticsPage.js");return{diagnosticsCallsForCurrentUrl:o}},__vite__mapDeps([40,1,2,29,33,19,20,21,9,10,23,24,41,4,6,7,34,3,25,26,12]));return te(`codex-diagnostics-calls-${s}.csv`,i(t),ce,"call rows")}case"reports":{const{reportCallsForCurrentUrl:i}=await O(async()=>{const{reportCallsForCurrentUrl:o}=await import("./ReportsPage.js");return{reportCallsForCurrentUrl:o}},__vite__mapDeps([42,1,2,34,4,6,33,19,20,21,9,10,16,17,18,30,22,35,23,24,25,26,12,43]));return te(`codex-reports-evidence-${s}.csv`,i(t),ce,"call rows")}case"settings":return te(`codex-dashboard-settings-${s}.csv`,eo(t,a),Yi,"settings rows");case"calls":{const{callsForCurrentUrl:i}=await O(async()=>{const{callsForCurrentUrl:o}=await import("./CallsPage.js");return{callsForCurrentUrl:o}},__vite__mapDeps([44,1,2,3,4,5,6,7,14,29,33,19,45,22,11,12,13,35,23,24,34,46,47,38,25,26,48]));return te(`codex-calls-${s}.csv`,i(t.calls,n,r),ce,"call rows")}case"overview":{const{overviewCallsForQuery:i}=await O(async()=>{const{overviewCallsForQuery:o}=await import("./OverviewPage.js");return{overviewCallsForQuery:o}},__vite__mapDeps([49,1,2,34,4,20,21,9,10,31,32,6,16,17,18,45,22,11,12,13,14,35,23,24,25,26,50]));return te(`codex-overview-calls-${s}.csv`,i(t.calls,n),ce,"call rows")}case"investigator":{const{investigatorCallsForCurrentUrl:i}=await O(async()=>{const{investigatorCallsForCurrentUrl:o}=await import("./InvestigatorPage.js");return{investigatorCallsForCurrentUrl:o}},__vite__mapDeps([51,1,2,34,4,6,41,7,20,21,9,10,16,17,18,45,22,11,12,13,23,24,38,25,26,52]));return te(`codex-investigator-calls-${s}.csv`,i(t),ce,"call rows")}case"compression-lab":return te(`codex-compression-lab-scope-${s}.csv`,t.calls,ce,"call rows");case"call":return te(`codex-call-calls-${s}.csv`,Pi(t),ce,"call rows")}}function te(e,t,a,n){return{filename:e,csv:Ei(t,a),rowCount:t.length,label:n}}const Yi=[{header:"Field",value:e=>e.field},{header:"Value",value:e=>e.value}];function eo(e,t){return[{field:"live_api",value:t.canUseLiveApi?"available":"static snapshot"},{field:"context_api",value:t.contextRuntime.contextApiEnabled?"enabled":"gated"},{field:"history_scope",value:t.historyScope},{field:"data_window",value:Re(t.loadWindow,t.loadLimit)},{field:"scope_since",value:t.scopeSince??"none"},{field:"row_request",value:t.loadLimit===re?"no cap":String(t.loadLimit)},{field:"loaded_rows",value:String(t.loadedRowCount)},{field:"total_available_rows",value:String(t.totalAvailableRows)},{field:"auto_refresh",value:t.autoRefreshEnabled?"enabled":"paused"},{field:"refresh_state",value:t.refreshState},{field:"visible_calls",value:String(e.calls.length)},{field:"visible_threads",value:String(e.threads.length)}]}function to(e){return e instanceof Error?e.message:String(e)}function Ya(e,t){const a=t==="all"?"all history":"active history",n=e.message||"Refreshing usage index",r=typeof e.percent=="number"?` ${Math.round(e.percent)}%`:"";return`${n}${r} (${a})`}function Ht(e,t="active"){return e?typeof e.include_archived=="boolean"?e.include_archived?"all":"active":e.history_scope==="all-history"||e.history_scope==="all"?"all":e.history_scope==="active"?"active":t:t}function ao({historyScope:e,activeRows:t,allRows:a,archivedRows:n}){const r=no({activeRows:t,allRows:a,archivedRows:n});return e==="all"?r===null?"All history selected":r>0?`All history includes ${r.toLocaleString()} archived calls`:"All history selected; no archived calls are indexed yet":r===null||r<=0?"Active sessions only":`Active sessions only; ${r.toLocaleString()} archived calls hidden`}function no({activeRows:e,allRows:t,archivedRows:a}){const n=Wt(a);if(n!==null)return n;const r=Wt(e),s=Wt(t);return r!==null&&s!==null?Math.max(s-r,0):null}function Wt(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?Math.round(e):null}const rr=["aria-description","aria-label","aria-valuetext","title","placeholder","alt"],ro="data-localization-attributes",so=new Set(["CODE","KBD","PRE","SAMP","SCRIPT","STYLE","TEXTAREA"]),ea=new WeakMap,ta=new WeakMap;function io({value:e,children:t}){return c.jsxs(Ys,{value:e,children:[c.jsx(oo,{}),t]})}function oo(){const e=Kn();return C.useLayoutEffect(()=>{const t=document.querySelector("[data-dashboard-localization-root]");if(!t)return;if(e.language!=="zh-Hans"){lo(t),document.title="Codex Usage Tracker React Dashboard";return}document.title="Codex Usage Tracker · 用量仪表盘",en(t,e.translateText);const a=new MutationObserver(n=>{for(const r of n){if(r.type==="characterData"&&r.target instanceof Text){aa(r.target,e.translateText);continue}if(r.type==="attributes"&&r.target instanceof Element){na(r.target,e.translateText);continue}for(const s of r.addedNodes)s instanceof Text?aa(s,e.translateText):s instanceof Element&&en(s,e.translateText)}});return a.observe(t,{attributes:!0,attributeFilter:[...rr],characterData:!0,childList:!0,subtree:!0}),()=>a.disconnect()},[e]),null}function en(e,t){if(Rt(e))return;na(e,t);const a=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT);let n=a.nextNode();for(;n;){if(n instanceof Element){if(Rt(n)){n=co(a,n,e);continue}na(n,t)}else n instanceof Text&&aa(n,t);n=a.nextNode()}}function co(e,t,a){let n=t;for(;n&&n!==a;){const r=e.nextSibling();if(r)return r;n=n.parentNode,n&&(e.currentNode=n)}return null}function aa(e,t){const a=e.parentElement;if(!a||Rt(a))return;const n=e.nodeValue??"",r=ea.get(e),s=r&&(n===r.source||n===r.translated)?r.source:n,i=s.match(/^(\s*)([\s\S]*?)(\s*)$/u);if(!i||!i[2])return;const o=t(i[2]),d=`${i[1]}${o}${i[3]}`;ea.set(e,{source:s,translated:d}),d!==n&&(e.nodeValue=d)}function na(e,t){if(Rt(e))return;const a=new Set((e.getAttribute(ro)??"").split(/[\s,]+/u).filter(Boolean));if(!a.size)return;const n=ta.get(e)??new Map;for(const r of rr){if(!a.has(r))continue;const s=e.getAttribute(r);if(!s)continue;const i=n.get(r),o=i&&(s===i.source||s===i.translated)?i.source:s,d=t(o);n.set(r,{source:o,translated:d}),d!==s&&e.setAttribute(r,d)}n.size&&ta.set(e,n)}function lo(e){const t=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT);tn(e);let a=t.nextNode();for(;a;){if(a instanceof Text){const n=ea.get(a);n&&a.nodeValue===n.translated&&(a.nodeValue=n.source)}else a instanceof Element&&tn(a);a=t.nextNode()}}function tn(e){const t=ta.get(e);if(t)for(const[a,n]of t)e.getAttribute(a)===n.translated&&e.setAttribute(a,n.source)}function Rt(e){return so.has(e.tagName)||!!e.closest('[data-localization-skip="true"]')}const Mt=["May 12","May 19","May 26","Jun 02","Jun 09","Jun 16","Jun 23","Jun 30"],it=Mt.slice(2),sr={contextRuntime:{apiToken:"",contextApiEnabled:!1,fileMode:!1},cards:[{label:"Total Tokens",value:"24.83M",detail:"7-day total: 12.56M",trend:"up 18.7% vs prior 7 days",tone:"blue"},{label:"Estimated Cost",value:"$42.67",detail:"7-day total: $24.81",trend:"up 14.2% vs prior 7 days",tone:"green"},{label:"Cache Hit Rate",value:"38.7%",detail:"7-day average: 42.3%",trend:"down 3.6pp vs prior 7 days",tone:"purple"},{label:"Total Calls",value:"1,342",detail:"678 calls in last 7 days",trend:"up 11.3% vs prior 7 days",tone:"blue"},{label:"Usage Remaining",value:"32.4%",detail:"~15.9K credits estimated",trend:"resets in 4d 12h",tone:"green"}],tokenSeries:[H("input","Input","#2563eb",[5.2,6.4,7.5,9.2,6.7,7.5,6.6,9],1e6),H("output","Output","#059669",[2.5,3,3.6,5.1,3.7,5,4,5.4],1e6),H("cached","Cached","#7c3aed",[1.1,1.4,1.7,2.4,1.8,2.3,1.8,2.6],1e6,!0)],costSeries:[H("cost","Estimated Cost","#2563eb",[8.4,10.1,14.3,9.9,11.4,7.8,12.7,16.5])],cacheSeries:[H("cache","Cache Hit Rate","#059669",[58,61,39,45,50,44,48,41])],weeklyCreditSeries:[{id:"pro",label:"Pro observed",color:"#2563eb",points:Mt.map((e,t)=>({label:e,value:[59800,44900,45e3,40500,42800,38900,31400,35900][t]??0,low:[52100,38800,38900,34700,36200,32200,26100,29900][t]??0,high:[67400,51200,51100,46800,49200,45100,37300,41900][t]??0}))},H("pro-trend","Pro trend","#1d4ed8",[54.2,51,47.8,44.6,41.4,38.2,35,31.8],1e3,!0),H("prolite","Prolite observed","#0f766e",[15.9,15.8,15.9,16.1,15.7,15.6,15.9,15.8],1e3)],usageRemainingSeries:[H("remaining","Usage remaining","#059669",[87,71,63,56,56,48,50,54]),H("allowance","Allowance guide","#0f766e",[86,85,84,83,82,81,80,79],1,!0)],actualVsPredictedSeries:[H("observed","Observed drain","#2563eb",[18.7,22.1,45.3,31,34.8],1e3),H("predicted","Predicted baseline","#1d4ed8",[17.9,21.4,41.2,29.6,33.9],1e3,!0)],findings:[{rank:1,title:"Long Thread: data-engine-refactor",severity:"High",credits:12847,share:25.6,summary:"Very long duration with high model effort."},{rank:2,title:"Cache Misses (Large Inputs)",severity:"High",credits:9612,share:19.1,summary:"Large uncached inputs across 214 calls."},{rank:3,title:"High Model Effort",severity:"Medium",credits:7404,share:14.7,summary:"Reasoning and output token volume are concentrated."},{rank:4,title:"Tool Output Volume",severity:"Medium",credits:5231,share:10.4,summary:"Large tool outputs returned to the model."}],calls:[["2026-06-01T10:24:00Z","Jun 1, 10:24 AM","thread-9f3a1c","codex-1","high",128542,45231,62,.42,"18.4s",!1,["review"]],["2026-06-01T10:18:00Z","Jun 1, 10:18 AM","thread-7b2e91","o4-mini","medium",98731,32104,41,.31,"12.7s",!0,["analysis"]],["2026-06-01T10:12:00Z","Jun 1, 10:12 AM","thread-3c8d4e","o3","high",64221,18903,28,.12,"9.3s",!0,["uncached"]],["2026-06-01T10:06:00Z","Jun 1, 10:06 AM","thread-1a2b3c","codex-1","high",245123,98112,71,.87,"27.6s",!1,["large"]],["2026-06-01T10:01:00Z","Jun 1, 10:01 AM","thread-8d7c6b","gpt-4.1","low",12543,4231,12,.03,"3.6s",!0,["quick"]],["2026-06-01T09:55:00Z","Jun 1, 09:55 AM","thread-2f9e7d","o4-mini","medium",76881,28442,39,.24,"11.2s",!1,["subagent"]],["2026-06-01T09:50:00Z","Jun 1, 09:50 AM","thread-6a5b4c","codex-1","high",312654,112991,67,1.12,"31.8s",!1,["file-heavy"]],["2026-06-01T09:47:00Z","Jun 1, 09:47 AM","thread-0f1e2d","o3","low",8221,2903,15,.02,"2.8s",!0,["fast"]]].map(([e,t,a,n,r,s,i,o,d,f,h,v],u)=>{const p=Number(s),g=Number(i),b=Number(o),w=Math.round(p*Math.max(100-b,0)/100);return{id:`fixture-call-${u}`,rawTime:String(e),eventTimestamp:String(e),callStartedAt:String(e),time:String(t),thread:String(a),model:String(n),effort:String(r),input:p,output:g,reasoningOutput:Math.round(g*.2),totalTokens:p+g,cachedInput:Math.round(p*b/100),uncachedInput:w,cachedPct:b,cost:u===4?0:Number(d),standardCost:u===4?0:Number(d),priorityCost:u===4?0:Number(d)*2,pricingServiceTier:"standard",billingBasis:"unknown",costSemantics:"api_token_estimate",credits:(u===4?0:Number(d))*25,duration:String(f),durationSeconds:Number.parseFloat(String(f))||0,previousCallGap:u===0?"-":`${u*7}m 0s`,previousCallEventTimestamp:u===0?"":`2026-06-01T09:${String(40+u).padStart(2,"0")}:00Z`,previousCallGapSeconds:u*420,initiator:u%3===0?"user":u%3===1?"assistant":"tool",initiatorReason:u%3===0?"direct user request":u%3===1?"assistant follow-up":"tool-driven continuation",initiatorConfidence:u%2===0?"exact":"estimated",serviceTier:"",fast:null,serviceTierSource:"",serviceTierConfidence:"",fastProxyCandidate:!!h,standardUsageCredits:(u===4?0:Number(d))*25,fastUsageCredits:(u===4?0:Number(d))*50,usageCreditMultiplier:1,usageCreditMultiplierSource:"tier_unknown",usageCreditMultiplierSourceUrl:"https://example.invalid/fixture-fast",usageCreditMultiplierFetchedAt:"2026-07-16",usageCreditMultiplierConfidence:"exact",usageCreditConfidence:u===7?"user_override":u%4===0?"exact":u%4===1?"estimated":u%4===2?"missing":"fixture",usageCreditModel:u===4?"":`${n}-credits`,usageCreditSource:u===4?"":"fixture-rate-card",usageCreditFetchedAt:u===4?"":"2026-06-01T10:00:00Z",usageCreditTier:u%2===0?"standard":"estimated",usageCreditNote:u===2?"fixture inherited rate card":"",pricingModel:u===4?"":`${n}-pricing`,pricingEstimated:u===1||u===5,signal:w>5e4?"cache-risk":"aggregate",recommendation:w>5e4?"Review uncached aggregate input before continuing this thread.":"",tags:v,sessionId:`fixture-session-${u}`,turnId:`fixture-turn-${u}`,parentSessionId:u%3===0?"fixture-parent-session":"",parentSessionUpdatedAt:u%3===0?"2026-06-01T09:30:00Z":"",parentThread:u%3===0?"parent-thread-analysis":"",threadAttachmentLabel:u%3===0?"spawned child thread":"direct active thread",threadSource:u%3===0?"subagent":"user",subagentType:u%3===0?"analysis":"",agentRole:u%3===0?"reviewer":"",agentNickname:u%3===0?"usage-reviewer":"",project:u%2===0?"codex-usage-tracker":"local-ops",projectRelativeCwd:u%2===0?"frontend/dashboard":".",projectTags:u%2===0?["dashboard","rewrite"]:["local"],cwd:`/fixtures/${u%2===0?"codex-usage-tracker":"local-ops"}`,sourceFile:`fixture-thread-${u}.jsonl`,lineNumber:120+u,gitBranch:"experiment/frontend-rewrite",gitRemoteLabel:"origin",gitRemoteHash:`fixture-${u}`,contextWindowPct:Math.min(18+b,96),modelContextWindow:128e3,cumulativeTotalTokens:p+g+u*1e4,estimatedCacheSavings:Math.round((p-w)*1e-5*100)/100,efficiencyFlags:w>5e4?["cache-risk"]:[]}}),threads:[["thread-9f3a",142,58400,8.76,12,1.38,"High",42],["thread-7c2b",87,31200,4.21,22,1.12,"Medium",55],["thread-1a8c",64,22700,3.02,18,.98,"High",48],["thread-d3e1",53,18100,2.11,41,.81,"Low",72],["thread-b7f0",41,13600,1.65,47,.73,"Low",75],["thread-3c5d",36,9900,1.18,35,.66,"Medium",63],["thread-0e16",28,6400,.72,56,.58,"Low",82]].map(([e,t,a,n,r,s,i,o],d)=>{const f=Number(t),h=Number(a),v=Number(r),u=f*48,p=(d+1)*420;return{name:String(e),latestCallId:`fixture-call-${d}`,latestActivity:`Jun ${d+1}, 10:${String(24-d).padStart(2,"0")} AM`,latestActivityRaw:`2026-06-${String(d+1).padStart(2,"0")}T10:${String(24-d).padStart(2,"0")}:00Z`,turns:f,totalDurationSeconds:u,totalDuration:`${Math.floor(u/60)}m ${u%60}s`,averageGapSeconds:p,averageGap:`${Math.floor(p/60)}m ${p%60}s`,initiatorSummary:d%2===0?"user x4, assistant x2":"assistant x3, tool x1",modelSummary:d%2===0?"codex-1 x5, o4-mini x2":"o4-mini x3, o3 x1",effortSummary:d%2===0?"high x5, medium x2":"medium x3, low x1",totalTokens:h,cachedInput:Math.round(h*v/100),uncachedInput:Math.round(h*Math.max(100-v,0)/100),outputTokens:Math.round(h*.28),reasoningOutput:Math.round(h*.08),cost:Number(n),credits:Number(n)*25,cachePct:v,contextPct:Math.min(96,28+d*7),costPerCall:Number(s),coldResumeRisk:i,productivity:Number(o)}}),weeklyWindows:Mt.map((e,t)=>({week:e,plan:t===0?"Prolite":"Pro",observedPct:[61.4,49.2,47.7,48.3,44.5,37.4,40.1,35.8][t]??0,credits:[49812,41275,39887,40563,37284,31420,33842,35900][t]??0,projected:[49812,41275,39887,40563,37284,31420,33842,35900][t]??0,ciLow:[42156,34892,33424,34021,31241,26164,28234,29450][t]??0,ciHigh:[57467,47657,46349,47105,43326,36676,39450,41900][t]??0,confidence:t===0?"Medium":"High",note:["Prolite baseline","Drop in credits","Stable","Slight uptick","Down again","Lowest window","Recovery","Latest"][t]??""})),modelCosts:[{label:"codex-1",value:16.21,color:"#2563eb"},{label:"o3",value:12.43,color:"#1d4ed8"},{label:"o4-mini",value:7.62,color:"#059669"},{label:"gpt-4.1",value:4.91,color:"#f59e0b"},{label:"other",value:1.5,color:"#94a3b8"}],commandActions:[{title:"Show highest uncached calls",status:"Ready",owner:"Calls",description:"214 calls above the uncached threshold."},{title:"Compare Pro weeks",status:"Ready",owner:"Usage Drain",description:"Allowance windows with confidence intervals."},{title:"Find cold resumes",status:"Ready",owner:"Cache",description:"14 threads with long idle gaps."},{title:"Export support bundle",status:"Planned",owner:"Reports",description:"Local aggregate artifacts only."}],cacheSegments:[{label:"Cache read",value:38.7,color:"#2563eb"},{label:"Cache write",value:29.6,color:"#059669"},{label:"Uncached",value:31.7,color:"#7c3aed"}],cacheHeatmap:[{thread:"thread-8c1e",labels:it,values:[62,71,89,82,74,31]},{thread:"thread-2b9d",labels:it,values:[42,58,77,61,51,24]},{thread:"thread-713a",labels:it,values:[78,81,83,66,59,37]},{thread:"thread-4af2",labels:it,values:[24,36,63,54,71,44]},{thread:"thread-f9c3",labels:it,values:[18,25,41,38,52,22]}],diagnostics:[{title:"Usage Drain",status:"Ready",finding:"Projected weekly credits declined from the baseline and partially recovered in the latest window.",confidence:"High",metric:"33,842 credits / week",series:[H("usage-drain","Projected credits","#2563eb",[41.8,46.7,45.9,32.1,33.8],1e3)]},{title:"Cache Behavior",status:"Ready",finding:"Cache hit rate is healthy overall, with spikes aligned to large cache misses and cold resumes.",confidence:"Medium",metric:"41.1% hit rate",series:[H("cache","Cache hit %","#059669",[44,48,38,33,40])]},{title:"Thread Efficiency",status:"Ready",finding:"Long threads account for most estimated cost and are the clearest optimization target.",confidence:"High",metric:"65% cost share",series:[H("threads","Cost share","#1d4ed8",[65,23,8,4])]},{title:"Tool And Command Activity",status:"Stale",finding:"Command volume is stable with a slight upward trend; read and shell commands dominate.",confidence:"Medium",metric:"912 commands",series:[H("commands","Commands","#7c3aed",[542,488,611,883,912])]}],reports:[{title:"Weekly Credits",status:"Ready",owner:"Usage Drain",description:"Plan-specific weekly credits, trend lines, and confidence intervals."},{title:"Usage Remaining",status:"Ready",owner:"Usage Drain",description:"Observed remaining usage over time with reset handling."},{title:"Cost Curves",status:"Ready",owner:"Threads",description:"Cumulative estimated cost by thread and concentration metrics."},{title:"Usage Drain Model",status:"Ready",owner:"Reports",description:"Actual-vs-predicted drain and feature group comparisons."},{title:"Fast Mode Proxy",status:"Planned",owner:"Calls",description:"Candidate detection, speedup histogram, and confidence breakdowns."},{title:"Allowance Change",status:"Planned",owner:"Reports",description:"Week-to-week allowance estimate changes with careful language."}]};function H(e,t,a,n,r=1,s=!1){return{id:e,label:t,color:a,dashed:s,points:n.map((i,o)=>({label:Mt[o]??`Point ${o+1}`,value:i*r}))}}function ir(e){if(window.location.protocol==="file:")throw new Error("Live refresh requires the localhost dashboard server.");if(!(e!=null&&e.api_token))throw new Error("Live refresh requires localhost dashboard API token.")}function pa(e){return{Accept:"application/json","X-Codex-Usage-Token":e.api_token||""}}function uo(e,t){return new Promise((a,n)=>{if(t!=null&&t.aborted){n(an(t));return}const r=window.setTimeout(()=>{t==null||t.removeEventListener("abort",s),a()},e);function s(){window.clearTimeout(r),n(an(t))}t==null||t.addEventListener("abort",s,{once:!0})})}function or(e){return(e instanceof DOMException||e instanceof Error)&&e.name==="AbortError"}function an(e){return(e==null?void 0:e.reason)instanceof Error?e.reason:new DOMException("The request was cancelled.","AbortError")}const ho=["#2563eb","#1d4ed8","#059669","#f59e0b","#94a3b8"];function cr(e){const t=new Map;e.forEach(r=>{const s=r.model||"unknown";t.set(s,(t.get(s)??0)+r.cost)});const a=[...t.entries()].sort((r,s)=>s[1]-r[1]||r[0].localeCompare(s[0]));return(a.length>5?[...a.slice(0,4),["other",a.slice(4).reduce((r,s)=>r+s[1],0)]]:a).map(([r,s],i)=>({label:r,value:s,color:ho[i]??"#94a3b8"}))}function lr(e){if(!e.length)return[];const t=Math.max(e.reduce((a,n)=>a+bt(n),0),1);return[fo(e,t),mo(e,t),go(e,t),po(e,t)].filter(a=>!!a).sort((a,n)=>n.credits-a.credits).map((a,n)=>({...a,rank:n+1}))}function ur(e){if(!e.length)return[];const t=[{title:"Cost Curves",status:"Ready",owner:"Threads",description:"Estimated cost concentration by loaded aggregate thread."},{title:"Usage Drain Model",status:"Ready",owner:"Reports",description:"Highest estimated credit-impact calls from loaded aggregate rows."}];return e.some(a=>a.fastProxyCandidate||a.effort.toLowerCase()==="low")&&t.push({title:"Fast Mode Proxy",status:"Ready",owner:"Calls",description:"Low-effort and fast-call candidates inferred from aggregate rows."}),t}function fo(e,t){const a=new Map;e.forEach(i=>a.set(i.thread,[...a.get(i.thread)??[],i]));const[n,r]=[...a.entries()].sort((i,o)=>Ne(o[1],f=>f.totalTokens)-Ne(i[1],f=>f.totalTokens)||o[1].length-i[1].length)[0]??[];if(!n||!(r!=null&&r.length)||r.length<2)return null;const s=Ne(r,bt);return{rank:0,title:`Long Thread: ${n}`,severity:s/t>=.25||r.length>=8?"High":"Medium",credits:Math.round(s),share:s/t*100,summary:`${r.length.toLocaleString()} loaded calls and ${Ne(r,i=>i.totalTokens).toLocaleString()} tokens in this thread.`}}function mo(e,t){const a=e.filter(r=>r.signal==="cache-risk"||r.cachedPct<35||r.uncachedInput>5e4);if(!a.length)return null;const n=Ne(a,bt);return{rank:0,title:"Cache Misses (Large Inputs)",severity:a.some(r=>r.cachedPct<20||r.uncachedInput>5e4)?"High":"Medium",credits:Math.round(n),share:n/t*100,summary:`${a.length.toLocaleString()} loaded calls show low cache reuse or large uncached input.`}}function go(e,t){const a=e.filter(r=>r.effort.toLowerCase()==="high"||r.reasoningOutput>0);if(!a.length)return null;const n=Ne(a,bt);return{rank:0,title:"High Model Effort",severity:n/t>=.25?"High":"Medium",credits:Math.round(n),share:n/t*100,summary:`${a.length.toLocaleString()} loaded calls use high effort or report reasoning output.`}}function po(e,t){const a=Math.max(25e3,bo(e.map(s=>s.output),.75)),n=e.filter(s=>s.output>=a||s.tags.some(i=>["file-heavy","subagent","large"].includes(i)));if(!n.length)return null;const r=Ne(n,bt);return{rank:0,title:"Tool Output Volume",severity:n.some(s=>s.output>5e4)?"High":"Medium",credits:Math.round(r),share:r/t*100,summary:`${n.length.toLocaleString()} loaded calls have high output volume or file-heavy/subagent tags.`}}function bt(e){return e.credits>0?e.credits:e.cost*25}function Ne(e,t){return e.reduce((a,n)=>a+t(n),0)}function bo(e,t){const a=e.filter(n=>Number.isFinite(n)).sort((n,r)=>n-r);return a.length?a[Math.min(a.length-1,Math.max(0,Math.floor((a.length-1)*t)))]??0:0}function dr(e){const t=new Map;for(const n of e){if(!Number.isFinite(n.timestamp))continue;const r=hr(n.timestamp),s=t.get(r)??{label:fr(n.timestamp),timestamp:wo(n.timestamp),cached:0,cost:0,input:0,output:0};s.cached+=n.cached,s.cost+=n.cost,s.input+=n.input,s.output+=n.output,t.set(r,s)}const a=vo(t);return a.length?{tokenSeries:[{id:"input",label:"Input",color:"#2563eb",points:a.map(n=>({label:n.label,value:n.input}))},{id:"output",label:"Output",color:"#059669",points:a.map(n=>({label:n.label,value:n.output}))},{id:"cached",label:"Cached",color:"#7c3aed",dashed:!0,points:a.map(n=>({label:n.label,value:n.cached}))}],costSeries:[{id:"cost",label:"Estimated Cost",color:"#f59e0b",points:a.map(n=>({label:n.label,value:n.cost}))}],cacheSeries:[{id:"cache",label:"Cache hit %",color:"#2563eb",points:a.map(n=>({label:n.label,value:n.input>0?n.cached/n.input*100:0}))}]}:{tokenSeries:[],costSeries:[],cacheSeries:[]}}function vo(e){const t=[...e.values()].sort((s,i)=>s.timestamp-i.timestamp),a=t.at(0),n=t.at(-1);if(!a||!n)return[];const r=[];for(const s=new Date(a.timestamp);s.getTime()<=n.timestamp;s.setDate(s.getDate()+1)){const i=s.getTime(),o=hr(i);r.push(e.get(o)??{label:fr(i),timestamp:i,cached:0,cost:0,input:0,output:0})}return r}function hr(e){const t=new Date(e),a=String(t.getMonth()+1).padStart(2,"0"),n=String(t.getDate()).padStart(2,"0");return`${t.getFullYear()}-${a}-${n}`}function wo(e){const t=new Date(e);return new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()}function fr(e){return new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric"}).format(new Date(e))}function W(e,t){var n;const a=Number(((n=e.summary)==null?void 0:n[t])??0);return Number.isFinite(a)?a:0}function yo(e){if(!(!e.summary||e.load_window==="rows"))return{visibleCalls:W(e,"visible_calls"),inputTokens:W(e,"input_tokens"),cachedInputTokens:W(e,"cached_input_tokens"),uncachedInputTokens:W(e,"uncached_input_tokens"),outputTokens:W(e,"output_tokens"),reasoningOutputTokens:W(e,"reasoning_output_tokens"),totalTokens:W(e,"total_tokens"),estimatedCostUsd:W(e,"estimated_cost_usd"),usageCredits:W(e,"usage_credits")}}function _o(e){return{cost:Number(e.estimated_cost_usd??0),standardCost:nn(e.standard_cost_usd),priorityCost:nn(e.priority_cost_usd),pricingServiceTier:String(e.pricing_service_tier??""),billingBasis:String(e.billing_basis??"unknown"),costSemantics:String(e.cost_semantics??"api_token_estimate")}}function nn(e){if(e==null||e==="")return null;const t=Number(e);return Number.isFinite(t)?t:null}function So(e,t,a){const n=e.fast,r=n===!0||n===1?!0:n===!1||n===0?!1:null;return{credits:Number(e.usage_credits??0),serviceTier:String(e.service_tier??""),fast:r,serviceTierSource:String(e.service_tier_source??""),serviceTierConfidence:String(e.service_tier_confidence??""),fastProxyCandidate:t>0&&a/Math.max(t,1)>4e3,standardUsageCredits:Number(e.standard_usage_credits??e.usage_credits??0),fastUsageCredits:Co(e.fast_usage_credits),usageCreditMultiplier:Number(e.usage_credit_multiplier??1),usageCreditMultiplierSource:String(e.usage_credit_multiplier_source??""),usageCreditMultiplierSourceUrl:String(e.usage_credit_multiplier_source_url??""),usageCreditMultiplierFetchedAt:String(e.usage_credit_multiplier_fetched_at??""),usageCreditMultiplierConfidence:String(e.usage_credit_multiplier_confidence??"")}}function Co(e){if(e==null||e==="")return null;const t=Number(e);return Number.isFinite(t)?t:null}const xo=1e4,ko=500;async function rn(e,t,a){var s,i;const n=t.limit&&t.limit>0?t.limit:ko,r=await a(e,{...t,limit:n});return(i=t.onProgress)==null||i.call(t,{status:"completed",phase:"loading_rows",message:`Loaded ${t.loadWindow==="all"?"all-history":t.loadWindow} evidence window`,completed:Number(r.loaded_row_count??((s=r.rows)==null?void 0:s.length)??0),total:Number(r.total_available_rows??r.loaded_row_count??0),percent:100}),r}async function sn(e,t,a){var o,d;const n=[];let r=0,s=null,i=Number((e==null?void 0:e.total_available_rows)??0);for(let f=0;f<1e3;f+=1){(o=t.signal)==null||o.throwIfAborted();const h=await a(e,{...t,refresh:f===0?t.refresh:!1,limit:xo,offset:r}),v=h.rows??[];s=h,n.push(...v),i=Number(h.total_available_rows??i??n.length);const u=n.length>=i||!h.has_more;if((d=t.onProgress)==null||d.call(t,{status:u?"completed":"running",phase:"loading_rows",message:"Loading all rows",completed:n.length,total:i,percent:u?100:i>0?Math.min(99,Math.floor(n.length/i*100)):0}),r+=v.length,!h.has_more||v.length===0||n.length>=i)break}return{...s??e??{},rows:n,loaded_row_count:n.length,limit:null,limit_label:"All",has_more:!1,total_available_rows:i||n.length}}function To(){if(window.__CODEX_USAGE_BOOT__)return window.__CODEX_USAGE_BOOT__;const e=document.getElementById("usage-data");if(!(e!=null&&e.textContent))return null;try{return JSON.parse(e.textContent)}catch{return null}}async function Lo(e,t={}){if(t.refresh&&(e!=null&&e.refresh_jobs_available)){const a=await Ro(e,t),n={...t,refresh:!a};return n.loadWindow&&n.loadWindow!=="rows"?rn(e,n,qe):n.limit===0?sn(e,n,qe):qe(e,n)}return t.loadWindow&&t.loadWindow!=="rows"?rn(e,t,qe):t.limit===0?sn(e,t,qe):qe(e,t)}async function Ro(e,t){try{return await Mo(e,t),!0}catch(a){if(or(a)||a instanceof mr)throw a;return!1}}async function qe(e,t={}){ir(e);const a=new URLSearchParams({refresh:t.refresh?"1":"0",limit:String(t.limit??(e==null?void 0:e.limit)??(e==null?void 0:e.loaded_row_count)??500),_:String(Date.now())});t.loadWindow&&a.set("load_window",t.loadWindow),t.since&&a.set("since",t.since),t.offset&&t.offset>0&&a.set("offset",String(t.offset)),(t.includeArchived??_r(e))&&a.set("include_archived","1");const r=await fetch(`/api/usage?${a.toString()}`,{headers:pa(e),cache:"no-store",signal:t.signal});return await ba(r,"Usage refresh")}async function Mo(e,t){var o;ir(e);const a=new URLSearchParams({_:String(Date.now())});(t.includeArchived??_r(e))&&a.set("include_archived","1");const r=await fetch(`/api/refresh/start?${a.toString()}`,{headers:pa(e),cache:"no-store",signal:t.signal}),s=await ba(r,"Usage refresh start");(o=t.onProgress)==null||o.call(t,s);const i=typeof s.job_id=="string"?s.job_id:"";if(!i)throw new Error("Usage refresh start did not return a job id.");return Po(e,i,t.onProgress,t.signal)}async function Po(e,t,a,n){for(let r=0;r<600;r+=1){n==null||n.throwIfAborted();const s=new URLSearchParams({job_id:t,_:String(Date.now())}),i=await fetch(`/api/refresh/status?${s.toString()}`,{headers:pa(e),cache:"no-store",signal:n}),o=await ba(i,"Usage refresh status");if(a==null||a(o),o.status==="completed")return o;if(o.status==="failed")throw new mr(o.error||o.message||"Usage refresh failed.");await uo(Math.min(1e3,150+r*50),n)}throw new Error("Usage refresh did not complete before the polling timeout.")}class mr extends Error{}function on(e){if(!e)return{...sr,contextRuntime:sa(e)};const t=e.rows??[],a=t.map(pr),n=t.length?Te(t,b=>Number(b.total_tokens??0)):W(e,"total_tokens"),r=t.length?Te(t,b=>Number(b.estimated_cost_usd??0)):W(e,"estimated_cost_usd"),s=t.length?Te(t,b=>Number(b.cached_input_tokens??0)):W(e,"cached_input_tokens"),i=t.length?Te(t,b=>Number(b.input_tokens??0)):W(e,"input_tokens"),o=t.length?Te(t,b=>{const w=Number(b.input_tokens??0),T=Number(b.cached_input_tokens??0);return Number(b.uncached_input_tokens??Math.max(w-T,0))}):Math.max(i-s,0),d=t.length?Te(t,b=>Number(b.output_tokens??0)):W(e,"output_tokens"),f=t.length?Te(t,b=>Number(b.reasoning_output_tokens??0)):W(e,"reasoning_output_tokens"),h=i>0?s/i*100:0,v=a.length||Math.max(0,Number(e.loaded_row_count??0)),u=No(t),p=Ao(t),g=$o({cachePct:h,cachedTokens:s,estimatedCost:r,historyScope:e.history_scope??"active",totalCalls:v,totalTokens:n,tokenBreakdown:{cachedInput:s,uncachedInput:o,output:d,reasoningOutput:f},usageRemainingCard:Io(e)});return{...jo(e),contextRuntime:sa(e),scopeSummary:yo(e),cards:g,...u,...p,calls:a,threads:Sr(a),findings:lr(a),modelCosts:cr(a),reports:ur(a),cacheSegments:[{label:"Cache read",value:h,color:"#2563eb"},{label:"Uncached input",value:Math.max(100-h,0),color:"#7c3aed"}]}}function jo(e){return{...sr,contextRuntime:sa(e),tokenSeries:[],costSeries:[],cacheSeries:[],weeklyCreditSeries:[],usageRemainingSeries:[],actualVsPredictedSeries:[],calls:[],threads:[],findings:[],weeklyWindows:[],modelCosts:[],commandActions:[],cacheSegments:[],cacheHeatmap:[],diagnostics:[],reports:[]}}function No(e){return dr(e.map(t=>({timestamp:wa(t),cached:Number(t.cached_input_tokens??0),cost:Number(t.estimated_cost_usd??0),input:Number(t.input_tokens??0),output:Number(t.output_tokens??0)})))}function Ao(e){const t=[...e].map(f=>({row:f,timestamp:wa(f)})).filter(f=>Number.isFinite(f.timestamp)).sort((f,h)=>f.timestamp-h.timestamp),a=new Map;for(const{row:f,timestamp:h}of t){const v=ra(h),u=a.get(v)??{timestamp:h,credits:0,weeklyUsedPercent:null};u.credits+=Math.max(0,Number(f.usage_credits??0));const p=Oe(f.rate_limit_secondary_used_percent);p!==null&&(u.weeklyUsedPercent=p),a.set(v,u)}const n=[...a.entries()].map(([f,h])=>({label:f,...h}));let r=0;const s=n.map(f=>(r+=f.credits,{label:f.label,value:r})),i=s.map((f,h)=>{var v;return{label:f.label,value:s.length>1?(((v=s.at(-1))==null?void 0:v.value)??0)*((h+1)/s.length):f.value}}),o=n.filter(f=>f.weeklyUsedPercent!==null).map(f=>({label:f.label,value:Pt(100-(f.weeklyUsedPercent??0))})),d=Eo(e);return{weeklyCreditSeries:Fo(d),usageRemainingSeries:o.length?[{id:"weekly-remaining",label:"Weekly remaining",color:"#059669",points:o}]:[],actualVsPredictedSeries:s.length?[{id:"observed-drain",label:"Observed drain",color:"#2563eb",points:s},{id:"loaded-baseline",label:"Loaded-row baseline",color:"#1d4ed8",dashed:!0,points:i}]:[],weeklyWindows:d}}function Eo(e){const t=new Map;for(const a of e){const n=wa(a);if(!Number.isFinite(n))continue;const r=Do(a,n),s=t.get(r)??{rows:[],latestTimestamp:0,latestUsedPercent:null};s.rows.push(a),n>=s.latestTimestamp&&(s.latestTimestamp=n,s.latestUsedPercent=Oe(a.rate_limit_secondary_used_percent)),t.set(r,s)}return[...t.entries()].map(([a,n])=>{var i;const r=n.rows.reduce((o,d)=>o+Math.max(0,Number(d.usage_credits??0)),0),s=n.latestUsedPercent??0;return{week:a,plan:String(((i=n.rows[0])==null?void 0:i.rate_limit_plan_type)??"unknown"),observedPct:s,credits:r,projected:s>0?r/(s/100):r,ciLow:s>0?r/(s/100)*.85:r,ciHigh:s>0?r/(s/100)*1.15:r,confidence:n.rows.length>=20?"Medium":"Low",note:`Loaded ${va(n.rows.length)} rows`}}).sort((a,n)=>a.week.localeCompare(n.week))}function Fo(e){return e.length?[{id:"weekly-projected",label:"Projected weekly credits",color:"#2563eb",points:e.map(t=>({label:t.week,value:t.projected,low:t.ciLow,high:t.ciHigh}))},{id:"loaded-credits",label:"Loaded-row credits",color:"#0f766e",dashed:!0,points:e.map(t=>({label:t.week,value:t.credits}))}]:[]}function Do(e,t){const a=We(e.rate_limit_secondary_resets_at);return a!==null&&a>0?ra(a*1e3):ra(t)}function ra(e){return new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric"}).format(new Date(e))}function sa(e){return{apiToken:String((e==null?void 0:e.api_token)??""),contextApiEnabled:!!(e!=null&&e.context_api_enabled),fileMode:window.location.protocol==="file:"}}function $o(e){return[{label:"Total Tokens",value:Me(e.totalTokens),detail:`${e.historyScope} history scope`,trend:"loaded aggregate rows",tone:"blue",breakdown:[{label:"Cached",value:Me(e.tokenBreakdown.cachedInput)},{label:"Uncached",value:Me(e.tokenBreakdown.uncachedInput)},{label:"Output",value:Me(e.tokenBreakdown.output)},{label:"Reasoning",value:Me(e.tokenBreakdown.reasoningOutput)}]},{label:"Estimated Cost",value:Ho(e.estimatedCost),detail:"local pricing config",trend:"privacy-safe estimate",tone:"green"},{label:"Cache Hit Rate",value:`${e.cachePct.toFixed(1)}%`,detail:`${Me(e.cachedTokens)} cached input`,trend:e.cachePct>=40?"healthy cache reuse":"cache risk",tone:e.cachePct>=40?"purple":"orange"},{label:"Total Calls",value:va(e.totalCalls),detail:"loaded calls in this dashboard",trend:"privacy-safe",tone:"blue"},e.usageRemainingCard]}function Io(e){const t=Oo(e.observed_usage);if(t)return t;const a=Uo(e.allowance_windows);return a||{label:"Usage Remaining",value:"Unknown",detail:e.allowance_configured?"allowance configured; no current window":"no observed usage or allowance window",trend:e.allowance_error?`config issue: ${e.allowance_error}`:"not available in payload",tone:e.allowance_error?"red":"orange"}}function Oo(e){const t=Array.isArray(e==null?void 0:e.windows)?e.windows:[];if(!(e!=null&&e.available)||!t.length)return null;const a=gr(t,s=>Oe(s.used_percent)!==null);if(!a)return null;const n=Oe(a.used_percent)??0,r=Pt(100-n);return{label:"Usage Remaining",value:br(r),detail:`${wr(a.label||a.key,"Observed usage")} observed usage`,trend:vr(a.resets_at)||e.source||"observed locally",tone:yr(r)}}function Uo(e){if(!Array.isArray(e)||!e.length)return null;const t=gr(e,o=>{const d=Oe(o.remaining_percent),f=We(o.remaining_credits),h=We(o.total_credits);return d!==null||f!==null||h!==null&&h>0});if(!t)return null;const a=We(t.remaining_credits),n=We(t.total_credits),r=a!==null&&n!==null&&n>0?a/n*100:null,s=Oe(t.remaining_percent)??r;return{label:"Usage Remaining",value:s!==null?br(Pt(s)):`${cn(a??0)} left`,detail:`${wr(t.label||t.key,"Allowance")} allowance window`,trend:[a===null?"":`${cn(a)} left`,vr(t.reset_at)].filter(Boolean).join(" · ")||"configured allowance",tone:s===null?"green":yr(Pt(s))}}function gr(e,t){const a=e.filter(t);return a.find(Vo)??a[0]??null}function Vo(e){const t=We(e.window_minutes),a=`${e.key??""} ${e.label??""}`.toLowerCase();return t===10080||/\b(weekly|week|7d|7-day|7 day)\b/.test(a)}function pr(e,t=0){const a=String(e.event_timestamp??e.time??e.turn_timestamp??e.started_at??e.call_started_at??""),n=a,r=String(e.call_started_at??e.started_at??a),s=Number(e.input_tokens??0),i=Number(e.output_tokens??0),o=Number(e.reasoning_output_tokens??0),d=Number(e.cached_input_tokens??0),f=Number(e.cache_hit_ratio??e.cache_ratio??0),h=s>0?d/s*100:f*100,v=Number(e.total_tokens??s+i),u=Number(e.duration_seconds??e.call_duration_seconds??0),p=String(e.previous_call_event_timestamp??""),g=Number(e.previous_call_delta_seconds??0),b=Number(e.uncached_input_tokens??Math.max(s-d,0)),w=String(e.record_id??e.id??`${n||"row"}-${t}`),T=String(e.primary_signal??"").trim(),A=Number(e.line_number),R=Oe(e.context_window_percent),_=Number(e.model_context_window),L=Number(e.cumulative_total_tokens);return{id:w,threadKey:String(e.thread_key??""),rawTime:n,eventTimestamp:a,callStartedAt:r,time:Cr(n),thread:zo(e),model:String(e.model??"unknown"),effort:String(e.effort??"blank"),input:s,output:i,reasoningOutput:o,totalTokens:v,cachedInput:d,uncachedInput:b,cachedPct:h,..._o(e),duration:jt(u),durationSeconds:u,previousCallGap:jt(g),previousCallEventTimestamp:p,previousCallGapSeconds:Number.isFinite(g)?g:0,initiator:String(e.call_initiator??"unknown"),initiatorReason:String(e.call_initiator_reason??""),initiatorConfidence:String(e.call_initiator_confidence??""),...So(e,u,v),usageCreditConfidence:String(e.usage_credit_confidence??"unknown"),usageCreditModel:String(e.usage_credit_model??""),usageCreditSource:String(e.usage_credit_source??""),usageCreditFetchedAt:String(e.usage_credit_fetched_at??""),usageCreditTier:String(e.usage_credit_tier??""),usageCreditNote:String(e.usage_credit_note??""),pricingModel:String(e.pricing_model??""),pricingEstimated:!!e.pricing_estimated,signal:T||(h<25?"cache-risk":"aggregate"),recommendation:String(e.recommended_action??""),tags:h<25?["uncached"]:h>60?["healthy-cache"]:[],sessionId:String(e.session_id??""),turnId:String(e.turn_id??""),parentSessionId:String(e.parent_session_id??""),parentSessionUpdatedAt:String(e.resolved_parent_session_updated_at??e.parent_session_updated_at??""),parentThread:String(e.resolved_parent_thread_name??e.parent_thread_name??""),threadAttachmentLabel:String(e.thread_attachment_label??""),threadSource:String(e.thread_source??""),subagentType:String(e.subagent_type??""),agentRole:String(e.agent_role??""),agentNickname:String(e.agent_nickname??""),project:String(e.project_name??""),projectRelativeCwd:String(e.project_relative_cwd??""),projectTags:Array.isArray(e.project_tags)?e.project_tags.map(y=>String(y)):[],cwd:String(e.cwd??""),sourceFile:String(e.source_file??""),lineNumber:Number.isFinite(A)&&A>0?A:null,gitBranch:String(e.git_branch??""),gitRemoteLabel:String(e.git_remote_label??""),gitRemoteHash:String(e.git_remote_hash??""),contextWindowPct:R,modelContextWindow:Number.isFinite(_)&&_>0?_:null,cumulativeTotalTokens:Number.isFinite(L)&&L>0?L:null,estimatedCacheSavings:Number(e.estimated_cache_savings_usd??0),efficiencyFlags:Array.isArray(e.efficiency_flags)?e.efficiency_flags.map(y=>String(y)):[]}}function Oe(e){const t=Number(e);return Number.isFinite(t)?t<=1?t*100:t:null}function We(e){const t=Number(e);return Number.isFinite(t)?t:null}function Pt(e){return Math.max(0,Math.min(100,e))}function br(e){const t=Math.abs(e)>=10?0:1;return`${e.toFixed(t)}%`}function cn(e){return`${Me(e)} cr`}function vr(e){if(e==null||e==="")return"";const t=typeof e=="number"?e*1e3:Date.parse(e);return Number.isFinite(t)?`resets ${Ko(t)}`:""}function Ko(e){const t=new Date(e);return Number.isNaN(t.getTime())?String(e):`${t.toISOString().slice(0,16).replace("T"," ")} UTC`}function wr(e,t){return(e==null?void 0:e.trim())||t}function yr(e){return e<20?"red":e<40?"orange":"green"}function _r(e){return typeof e.include_archived=="boolean"?e.include_archived:e.history_scope==="all-history"||e.history_scope==="all"}function zo(e){const t=e.thread_name??e.thread??e.resolved_parent_thread_name??e.parent_thread_name;if(t&&String(t).trim())return String(t);const a=e.project_name??e.project_relative_cwd,n=e.session_id?e.session_id.slice(-6):"";return a&&n?`${a} ${n}`:e.thread_attachment_label?String(e.thread_attachment_label):"Untitled thread"}function Sr(e){const t=new Map;for(const a of e)t.set(a.thread,[...t.get(a.thread)??[],a]);return[...t.entries()].map(([a,n])=>{const r=n.length,i=[...n].sort((y,k)=>ln(k)-ln(y))[0]??null,o=(i==null?void 0:i.rawTime)||(i==null?void 0:i.time)||"",d=n.reduce((y,k)=>y+k.totalTokens,0),f=n.reduce((y,k)=>y+k.cachedInput,0),h=n.reduce((y,k)=>y+k.uncachedInput,0),v=n.reduce((y,k)=>y+k.output,0),u=n.reduce((y,k)=>y+k.reasoningOutput,0),p=n.reduce((y,k)=>y+k.cost,0),g=n.reduce((y,k)=>y+k.credits,0),b=n.reduce((y,k)=>y+k.durationSeconds,0),w=n.filter(y=>y.previousCallGapSeconds>0),T=w.reduce((y,k)=>y+k.previousCallGapSeconds,0)/Math.max(w.length,1),A=f+h,R=A>0?f/A*100:n.reduce((y,k)=>y+k.cachedPct,0)/Math.max(r,1),_=n.map(y=>y.contextWindowPct).filter(y=>typeof y=="number"&&Number.isFinite(y)),L=R<25?"High":R<45?"Medium":"Low";return{name:a,latestCallId:(i==null?void 0:i.id)??"",latestActivity:Cr(o),latestActivityRaw:o,turns:r,totalDurationSeconds:b,totalDuration:jt(b),averageGapSeconds:T,averageGap:jt(T),initiatorSummary:Bt(n.map(y=>y.initiator)),modelSummary:Bt(n.map(y=>y.model)),effortSummary:Bt(n.map(y=>y.effort)),totalTokens:d,cachedInput:f,uncachedInput:h,outputTokens:v,reasoningOutput:u,cost:p,credits:g,cachePct:R,contextPct:_.length?Math.max(..._):null,costPerCall:p/Math.max(r,1),coldResumeRisk:L,productivity:Math.max(20,Math.round(R-p/Math.max(r,1)*4))}}).sort((a,n)=>n.cost-a.cost).slice(0,20)}function ln(e){const t=Date.parse(e.rawTime||e.time);return Number.isFinite(t)?t:0}function Bt(e,t=3){const a=new Map;for(const n of e){const r=n.trim()||"unknown";a.set(r,(a.get(r)??0)+1)}return[...a.entries()].sort((n,r)=>r[1]-n[1]||n[0].localeCompare(r[0])).slice(0,t).map(([n,r])=>`${n} x${va(r)}`).join(", ")||"unknown"}function Te(e,t){return e.reduce((a,n)=>a+t(n),0)}async function ba(e,t){let a;try{a=await e.json()}catch(n){if(e.ok)throw new Error(`${t} response could not be read as JSON: ${qo(n)}`);a={}}if(!e.ok){const n=typeof a.error=="string"?a.error:`${t} request failed (${e.status})`;throw new Error(n)}return a}function qo(e){return e instanceof Error?e.message:String(e)}function va(e){return new Intl.NumberFormat("en-US").format(Math.round(e))}function Me(e){return new Intl.NumberFormat("en-US",{notation:"compact",maximumFractionDigits:2}).format(e)}function Ho(e){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}).format(e)}function jt(e){if(!Number.isFinite(e)||e<=0)return"-";if(e<60)return`${e.toFixed(0)}s`;const t=Math.floor(e/60),a=Math.round(e%60);return`${t}m ${a}s`}function Cr(e){const t=new Date(e);return Number.isNaN(t.getTime())?e||"-":new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"}).format(t)}function wa(e){return Date.parse(String(e.started_at??e.call_started_at??e.time??e.event_timestamp??e.turn_timestamp??""))}const Pe=1440*60*1e3;function Wo(e,t,a=window.location.search){const n=xr(a);if(!n.active)return e;const r=e.calls.filter(s=>Bo(s,n));return r.length===e.calls.length?e:Yo(e,r,`${t} filtered`)}function xr(e){var d,f,h,v,u,p;const t=new URLSearchParams(e),a=((d=t.get("model"))==null?void 0:d.trim())??"",n=((f=t.get("effort"))==null?void 0:f.trim())??"",r=((h=t.get("confidence")||t.get("pricing"))==null?void 0:h.trim())??"",s=((v=t.get("date")||t.get("time"))==null?void 0:v.trim())??"",i=((u=t.get("from"))==null?void 0:u.trim())??"",o=((p=t.get("to"))==null?void 0:p.trim())??"";return{model:a,effort:n,confidence:r,datePreset:s,dateStart:i,dateEnd:o,active:!!(a||n||r||s||i||o)}}function Bo(e,t){return!(t.model&&e.model!==t.model||t.effort&&e.effort!==t.effort||t.confidence&&!Qo(e,t.confidence)||!Go(e,t))}function Qo(e,t){return t==="official"||t==="cost-exact"?!!(e.pricingModel&&!e.pricingEstimated):t==="estimated"||t==="cost-estimated"?e.pricingEstimated:t==="unpriced"||t==="cost-unpriced"?!e.pricingModel:t==="credit-exact"?e.usageCreditConfidence==="exact":t==="credit-estimated"?e.usageCreditConfidence==="estimated":t==="credit-override"?e.usageCreditConfidence==="user_override":t==="credit-missing"?e.usageCreditConfidence==="missing"||e.usageCreditConfidence==="unknown":!0}function Go(e,t){const a=Jo(t);if(!a.active)return!0;if(a.invalid)return!1;const n=Date.parse(e.rawTime||e.time);return!(!Number.isFinite(n)||a.start!==null&&n=a.endExclusive)}function Jo(e){if(e.datePreset&&e.datePreset!=="all"&&e.datePreset!=="custom"){const n=Zo(e.datePreset);return n?{active:!0,invalid:!1,...n}:{active:!1,invalid:!1,start:null,endExclusive:null}}const t=un(e.dateStart),a=un(e.dateEnd);return t!==null&&a!==null&&t>a?{active:!0,invalid:!0,start:t,endExclusive:a+Pe}:{active:t!==null||a!==null,invalid:!1,start:t,endExclusive:a===null?null:a+Pe}}function Zo(e){const t=Xo(new Date);if(e==="today")return{start:t,endExclusive:t+Pe};if(e==="last-7-days")return{start:t-6*Pe,endExclusive:t+Pe};if(e==="this-week"){const n=new Date(t).getDay(),r=n===0?-6:1-n,s=t+r*Pe;return{start:s,endExclusive:s+7*Pe}}if(e==="this-month"){const a=new Date(t),n=new Date(a.getFullYear(),a.getMonth(),1).getTime(),r=new Date(a.getFullYear(),a.getMonth()+1,1).getTime();return{start:n,endExclusive:r}}return null}function un(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))return null;const[t,a,n]=e.split("-").map(Number),r=new Date(t,a-1,n);return r.getFullYear()!==t||r.getMonth()!==a-1||r.getDate()!==n?null:r.getTime()}function Xo(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()}function Yo(e,t,a="filtered"){const n=t.reduce((u,p)=>u+p.totalTokens,0),r=t.reduce((u,p)=>u+p.cost,0),s=t.reduce((u,p)=>u+p.cachedInput,0),i=t.reduce((u,p)=>u+p.uncachedInput,0),o=t.reduce((u,p)=>u+p.output,0),d=t.reduce((u,p)=>u+p.reasoningOutput,0),f=t.reduce((u,p)=>u+p.input,0),h=f>0?s/f*100:0,v=e.cards.find(u=>u.label==="Usage Remaining")??{label:"Usage Remaining",value:"Unknown",detail:"not available in filtered view",trend:"not available in payload",tone:"orange"};return{...e,cards:ec({cachePct:h,cachedTokens:s,estimatedCost:r,historyScope:a,totalCalls:t.length,totalTokens:n,tokenBreakdown:{cachedInput:s,uncachedInput:i,output:o,reasoningOutput:d},usageRemainingCard:v}),...tc(t),calls:t,threads:Sr(t),findings:lr(t),modelCosts:cr(t),reports:ur(t),cacheSegments:[{label:"Cache read",value:h,color:"#2563eb"},{label:"Uncached input",value:Math.max(100-h,0),color:"#7c3aed"}]}}function ec({cachePct:e,cachedTokens:t,estimatedCost:a,historyScope:n,totalCalls:r,totalTokens:s,tokenBreakdown:i,usageRemainingCard:o}){return[{label:"Total Tokens",value:He(s),detail:`${n} history scope`,trend:"filtered aggregate rows",tone:"blue",breakdown:[{label:"Cached",value:He(i.cachedInput)},{label:"Uncached",value:He(i.uncachedInput)},{label:"Output",value:He(i.output)},{label:"Reasoning",value:He(i.reasoningOutput)}]},{label:"Estimated Cost",value:nc(a),detail:"local pricing config",trend:"privacy-safe estimate",tone:"green"},{label:"Cache Hit Rate",value:`${e.toFixed(1)}%`,detail:`${He(t)} cached input`,trend:e>=40?"healthy cache reuse":"cache risk",tone:e>=40?"purple":"orange"},{label:"Total Calls",value:ac(r),detail:"loaded calls matching filters",trend:"legacy shell filters",tone:"blue"},o]}function tc(e){return dr(e.map(t=>({timestamp:Date.parse(t.rawTime||t.time),cached:t.cachedInput,cost:t.cost,input:t.input,output:t.output})))}function He(e){return new Intl.NumberFormat("en-US",{notation:"compact",maximumFractionDigits:2}).format(e)}function ac(e){return new Intl.NumberFormat("en-US").format(Math.round(e))}function nc(e){return new Intl.NumberFormat("en-US",{currency:"USD",maximumFractionDigits:2,minimumFractionDigits:2,style:"currency"}).format(e)}const kr=[{id:"overview",label:"Overview",description:"High-level telemetry",icon:$s},{id:"investigator",label:"Investigate",description:"Root-cause evidence",icon:Ds},{id:"compression-lab",label:"Compression Lab",description:"Context savings",icon:Ms},{id:"calls",label:"Calls",description:"Model-call table",icon:Vs},{id:"threads",label:"Threads",description:"Thread efficiency",icon:qs},{id:"usage-drain",label:"Limits",description:"Allowance intelligence",icon:zs},{id:"cache-context",label:"Cache And Context",description:"Cache and cold resumes",icon:Ns},{id:"diagnostics",label:"Diagnostics Notebook",description:"Technical report",icon:Ls},{id:"reports",label:"Reports",description:"Generated analyses",icon:Ps},{id:"settings",label:"Settings",description:"Local configuration",icon:Os}],Tr=[{label:"Files",icon:Es,target:"settings"},{label:"Commands",icon:ks,target:"investigator"},{label:"Models",icon:Rs,target:"calls"}];function Lr(e){return _s(e)}const rc=[{value:"day",label:"24 hours",ariaLabel:"Last 24h"},{value:"week",label:"7 days",ariaLabel:"Last 7 days"},{value:"rows",label:"Recent",ariaLabel:"Recent rows"},{value:"all",label:"All time",ariaLabel:"All time"}];function sc(e){const t=e.refreshing||!e.canUseLiveApi,a=e.loadWindow==="rows",n=`${e.loadedRowCount.toLocaleString()} detail row${e.loadedRowCount===1?"":"s"} cached`,r=a?`${e.loadedRowCount.toLocaleString()} loaded / ${e.totalAvailableRows.toLocaleString()} total`:`${e.totalAvailableRows.toLocaleString()} calls analyzed · ${n}`,s=a?`${e.loadedRowCount.toLocaleString()} of ${e.totalAvailableRows.toLocaleString()} evidence rows loaded`:`Focused pages analyze all ${e.totalAvailableRows.toLocaleString()} calls in scope; ${e.loadedRowCount.toLocaleString()} call rows are cached for immediate detail views.`,i=a?e.rowLoadStatus:`${e.rowLoadModeLabel} analysis uses ${e.totalAvailableRows.toLocaleString()} calls; ${n}`;return c.jsxs("section",{className:"data-window-control","aria-label":"Analysis scope",children:[c.jsxs("div",{className:"data-window-summary",children:[c.jsx("span",{children:"Analysis scope"}),c.jsx("strong",{children:e.rowLoadModeLabel}),c.jsx("small",{title:s,children:r})]}),c.jsx("div",{className:"data-window-options",role:"group","aria-label":"Choose loaded call window",children:rc.map(o=>c.jsx("button",{type:"button","aria-label":o.ariaLabel,"aria-pressed":e.loadWindow===o.value,disabled:t,onClick:()=>e.onWindowChange(o.value),children:o.label},o.value))}),e.loadWindow==="rows"?c.jsxs("div",{className:"row-window-editor",children:[c.jsx("input",{"aria-label":"Rows to load slider","aria-valuetext":`${e.finitePendingLoadLimit.toLocaleString()} recent rows`,type:"range",min:1,max:e.rowLimitSliderMax,step:100,value:e.rowLimitSliderValue,onChange:o=>e.onSliderChange(o.target.value),disabled:t}),c.jsx("input",{"aria-label":"Rows to load",type:"number",min:1,step:100,value:e.pendingLoadLimit,onChange:o=>e.onDraftChange(o.target.value),disabled:t}),c.jsx("button",{type:"button","data-primary":"true",onClick:e.onApply,disabled:t||!e.rowLimitChanged,children:e.loadLabel}),c.jsx("button",{type:"button",onClick:e.onLoadMore,disabled:t||!e.hasMoreRows,children:e.loadMoreLabel})]}):null,e.refreshing?c.jsxs("div",{className:"row-load-progress","aria-label":"Row loading progress",children:[c.jsx("div",{className:"row-load-progress-track",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":e.refreshProgressPercent??void 0,children:c.jsx("span",{style:{width:`${e.refreshProgressPercent??8}%`}})}),c.jsxs("span",{children:[e.refreshProgressPercent===null?e.refreshProgressText:`${Math.round(e.refreshProgressPercent)}% loaded`,c.jsx("button",{className:"icon-button",type:"button",onClick:()=>void e.onCancel(),"aria-label":"Cancel refresh",title:"Cancel refresh",children:c.jsx(ua,{size:13})})]})]}):null,c.jsx("span",{className:"sr-only",role:"status","aria-live":"polite",children:i})]})}const ya=[{value:"all",label:"All time"},{value:"today",label:"Today"},{value:"this-week",label:"This week"},{value:"last-7-days",label:"Last 7 days"},{value:"this-month",label:"This month"},{value:"custom",label:"Custom"}],Rr=[{value:"all",label:"All confidence"},{value:"cost-exact",label:"Exact cost"},{value:"cost-estimated",label:"Estimated cost"},{value:"cost-unpriced",label:"Unpriced cost"},{value:"credit-exact",label:"Exact credit"},{value:"credit-estimated",label:"Estimated credit"},{value:"credit-override",label:"Credit override"},{value:"credit-missing",label:"Missing credit"}];function ic({activeView:e,locationSearch:t,model:a,onUrlChange:n}){const r=xr(t),s=C.useMemo(()=>dn(a.calls.map(g=>g.model)),[a.calls]),i=C.useMemo(()=>dn(a.calls.map(g=>g.effort)),[a.calls]),o=r.dateStart||r.dateEnd?"custom":oc(r.datePreset),d=lc(r,o);if(e==="calls"||e==="call"||!a.calls.length)return null;function f(g){const b=new URL(window.location.href);g(b),n(b)}function h(g,b){f(w=>{g==="confidence"&&w.searchParams.delete("pricing"),!b||b==="all"?w.searchParams.delete(g):w.searchParams.set(g,b)})}function v(g){f(b=>{if(!g||g==="all"){b.searchParams.delete("date"),b.searchParams.delete("time"),b.searchParams.delete("from"),b.searchParams.delete("to");return}b.searchParams.set("date",g),b.searchParams.set("time",g),g!=="custom"&&(b.searchParams.delete("from"),b.searchParams.delete("to"))})}function u(g,b){f(w=>{b?(w.searchParams.set(g,b),w.searchParams.set("date","custom"),w.searchParams.set("time","custom")):(w.searchParams.delete(g),!w.searchParams.get("from")&&!w.searchParams.get("to")&&(w.searchParams.delete("date"),w.searchParams.delete("time")))})}function p(){f(g=>{for(const b of["model","effort","confidence","pricing","date","time","from","to"])g.searchParams.delete(b)})}return c.jsxs("section",{className:"global-filter-strip span-all","aria-label":"Dashboard filters",children:[c.jsxs("strong",{children:[c.jsx(Fs,{size:15}),"Filters"]}),c.jsxs("label",{children:[c.jsx("span",{children:"Model"}),c.jsxs("select",{"aria-label":"Global model filter",value:r.model||"all",onChange:g=>h("model",g.target.value),children:[c.jsx("option",{value:"all",children:"All models"}),s.map(g=>c.jsx("option",{value:g,children:g},g))]})]}),c.jsxs("label",{children:[c.jsx("span",{children:"Effort"}),c.jsxs("select",{"aria-label":"Global effort filter",value:r.effort||"all",onChange:g=>h("effort",g.target.value),children:[c.jsx("option",{value:"all",children:"All effort"}),i.map(g=>c.jsx("option",{value:g,children:g},g))]})]}),c.jsxs("label",{children:[c.jsx("span",{children:"Confidence"}),c.jsx("select",{"aria-label":"Global confidence filter",value:cc(r.confidence),onChange:g=>h("confidence",g.target.value),children:Rr.map(g=>c.jsx("option",{value:g.value,children:g.label},g.value))})]}),c.jsxs("label",{children:[c.jsx("span",{children:"Time"}),c.jsx("select",{"aria-label":"Global time filter",value:o,onChange:g=>v(g.target.value),children:ya.map(g=>c.jsx("option",{value:g.value,children:g.label},g.value))}),d?c.jsx("span",{className:"filter-status","data-state":d.state,"aria-live":"polite",children:d.label}):null]}),c.jsxs("label",{children:[c.jsx("span",{children:"Start"}),c.jsx("input",{"aria-label":"Global start date",type:"date",value:r.dateStart,onChange:g=>u("from",g.target.value)})]}),c.jsxs("label",{children:[c.jsx("span",{children:"End"}),c.jsx("input",{"aria-label":"Global end date",type:"date",value:r.dateEnd,onChange:g=>u("to",g.target.value)})]}),c.jsxs("button",{className:"toolbar-button",type:"button",disabled:!r.active,onClick:p,children:[c.jsx(ua,{size:15}),"Clear filters"]})]})}function dn(e){return Array.from(new Set(e.map(t=>t.trim()).filter(Boolean))).sort((t,a)=>t.localeCompare(a))}function oc(e){return ya.some(t=>t.value===e)?e:"all"}function cc(e){return e==="official"?"cost-exact":e==="estimated"?"cost-estimated":e==="unpriced"?"cost-unpriced":Rr.some(t=>t.value===e)?e:"all"}function lc(e,t){var r;const a=fn(e.dateStart),n=fn(e.dateEnd);if(a!==null&&n!==null&&a>n)return{label:"Invalid date range",state:"error"};if(t==="custom"&&(e.dateStart||e.dateEnd))return{label:uc(e.dateStart,e.dateEnd),state:"active"};if(t!=="all"){const s=((r=ya.find(o=>o.value===t))==null?void 0:r.label)??t,i=dc(t);return{label:i?`${s}: ${hn(i.start)} to ${hn(Be(i.endExclusive,-1))}`:s,state:"active"}}return null}function uc(e,t){return e&&t?`Custom: ${e} to ${t}`:e?`Custom: from ${e}`:t?`Custom: through ${t}`:"Custom range"}function dc(e){const t=hc();if(e==="today")return{start:t,endExclusive:Be(t,1)};if(e==="this-week"){const a=fc(t);return{start:a,endExclusive:Be(a,7)}}return e==="last-7-days"?{start:Be(t,-6),endExclusive:Be(t,1)}:e==="this-month"?{start:new Date(t.getFullYear(),t.getMonth(),1),endExclusive:new Date(t.getFullYear(),t.getMonth()+1,1)}:null}function hc(e=new Date){return new Date(e.getFullYear(),e.getMonth(),e.getDate())}function fc(e){const t=e.getDay();return Be(e,t===0?-6:1-t)}function Be(e,t){return new Date(e.getFullYear(),e.getMonth(),e.getDate()+t)}function hn(e){const t=String(e.getMonth()+1).padStart(2,"0"),a=String(e.getDate()).padStart(2,"0");return`${e.getFullYear()}-${t}-${a}`}function fn(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))return null;const[t,a,n]=e.split("-").map(Number),r=new Date(t,a-1,n);return r.getFullYear()!==t||r.getMonth()!==a-1||r.getDate()!==n?null:r.getTime()}function mc(e){return Lr(e)&&e!=="call"}function ia(e,t="overview"){return e==="insights"?"overview":Lr(e)?e:t}function mn(e=window.location.search,t="calls"){const a=new URLSearchParams(e).get("return"),n=ia(a,t);return mc(n)?n:t}function gn(e=window.location.search){return new URLSearchParams(e).has("return")}function gc(e){var t,a;return((t=kr.find(n=>n.id===e))==null?void 0:t.label)??((a=Tr.find(n=>n.target===e))==null?void 0:a.label)??"Calls"}function pn(e,t=window.location.search){return new URLSearchParams(t).get("history")==="all"?"all":e}function bn(e,t=window.location.href){const a=new URL(t);return e==="all"?a.searchParams.set("history","all"):a.searchParams.delete("history"),a}const pc={investigator:["finding"],threads:["thread","expand","threads","thread_q","risk","thread_call_sort","thread_call_page"],"cache-context":["cache_thread"],reports:["report"],"usage-drain":["usage_plan","usage_effort","usage_subagents","usage_sample","usage_confidence","limit_window","limit_hypothesis"],diagnostics:["diagnostic_source","diagnostic_fact"],calls:["explore","detail","call_q","source","sort","direction","density","page"],call:["record","return","mode","max_entries","max_chars","include_tool_output","include_compaction_history"]};function kt(e,t,a=[]){const n=new Set([t,...Array.isArray(a)?a:[a]]);for(const[r,s]of Object.entries(pc))if(!n.has(r))for(const i of s)e.searchParams.delete(i)}function vn(e){let t=!1;return e.searchParams.get("view")==="insights"&&(e.searchParams.set("view","overview"),t=!0),e.searchParams.get("return")==="insights"&&(e.searchParams.set("return","overview"),t=!0),t}const Mr=[{key:"overview",title:"Overview",path:"/api/diagnostics/overview",refreshPath:"/api/diagnostics/overview/refresh"},{key:"toolOutput",title:"Tool Output",path:"/api/diagnostics/tool-output",refreshPath:"/api/diagnostics/tool-output/refresh"},{key:"commands",title:"Commands",path:"/api/diagnostics/commands",refreshPath:"/api/diagnostics/commands/refresh"},{key:"gitInteractions",title:"Git Interactions",path:"/api/diagnostics/git-interactions",refreshPath:"/api/diagnostics/git-interactions/refresh"},{key:"fileReads",title:"File Reads",path:"/api/diagnostics/file-reads",refreshPath:"/api/diagnostics/file-reads/refresh"},{key:"fileModifications",title:"File Modifications",path:"/api/diagnostics/file-modifications",refreshPath:"/api/diagnostics/file-modifications/refresh"},{key:"readProductivity",title:"Read Productivity",path:"/api/diagnostics/read-productivity",refreshPath:"/api/diagnostics/read-productivity/refresh"},{key:"concentration",title:"Concentration",path:"/api/diagnostics/concentration",refreshPath:"/api/diagnostics/concentration/refresh"},{key:"guidedSummary",title:"What Is Driving Usage?",path:"/api/diagnostics/guided-summary",refreshPath:"/api/diagnostics/guided-summary/refresh"},{key:"usageDrain",title:"Usage Drain",path:"/api/diagnostics/usage-drain",refreshPath:"/api/diagnostics/usage-drain/refresh"}],Nt=new Map,Ft=new Map;function bc(){Nt.clear(),Ft.clear()}async function eu(e,t,a={}){Ca(t);const n=Sc(e);return a.signal?At(n,t,a.signal):_c(Ft,Sa(e,t,a.cacheKey),()=>At(n,t))}async function tu(e,t={}){Ca(e);const a=await fetch(`/api/diagnostics/refresh?_=${Date.now()}`,{method:"POST",headers:{Accept:"application/json","X-Codex-Usage-Token":e.apiToken},cache:"no-store",signal:t.signal}),n=await Dt(a,"Diagnostic snapshot refresh"),r=n.sections??(jr(n)?await vc(e,await Pr(n,e,t),t.signal):{});Nt.set(_a(e),r);for(const[s,i]of Object.entries(r))Ft.set(Sa(s,e),i);return r}async function au(e,t,a={}){Ca(t);const n=await fetch(`${e.refreshPath}?_=${Date.now()}`,{method:"POST",headers:{Accept:"application/json","X-Codex-Usage-Token":t.apiToken},cache:"no-store",signal:a.signal}),r=await Dt(n,e.title),s=jr(r)?await wc(t,e,await Pr(r,t,a),a.signal):r,i=_a(t),o=Nt.get(i),d=o?await Promise.resolve(o):{};return Nt.set(i,{...d,[e.key]:s}),Ft.set(Sa(e.key,t),s),s}async function Pr(e,t,a){var r,s,i,o;let n=e;for((r=a.onProgress)==null||r.call(a,n);n.status==="pending"||n.status==="running";){const d=a.pollIntervalMs??((s=n.next)==null?void 0:s.poll_after_ms)??250;await yc(d,a.signal);const f=new URLSearchParams({job_id:n.job_id,_:String(Date.now())}),h=await fetch(`/api/diagnostics/refresh/status?${f.toString()}`,{headers:{Accept:"application/json","X-Codex-Usage-Token":t.apiToken},cache:"no-store",signal:a.signal});n=await Dt(h,"Diagnostic refresh status"),(i=a.onProgress)==null||i.call(a,n)}if(n.status!=="completed")throw new Error(`Diagnostic refresh failed: ${((o=n.error)==null?void 0:o.code)??n.status}`);return n}async function vc(e,t,a){const n=await Promise.all(Mr.map(async r=>[r.key,await At(r,e,a)]));return Object.fromEntries(n)}async function wc(e,t,a,n){return At(t,e,n)}function jr(e){if(!e||typeof e!="object")return!1;const t=e;return t.schema==="codex-usage-tracker-analysis-job-v1"&&t.job_kind==="diagnostic-refresh"&&typeof t.job_id=="string"}function yc(e,t){return t!=null&&t.aborted?Promise.reject(t.reason??new DOMException("Aborted","AbortError")):e<=0?Promise.resolve():new Promise((a,n)=>{const r=()=>{window.clearTimeout(s),t==null||t.removeEventListener("abort",r),n((t==null?void 0:t.reason)??new DOMException("Aborted","AbortError"))},s=window.setTimeout(()=>{t==null||t.removeEventListener("abort",r),a()},e);t==null||t.addEventListener("abort",r,{once:!0})})}function _c(e,t,a){const n=e.get(t);if(n!==void 0)return Promise.resolve(n);const r=a().then(s=>(e.set(t,s),s)).catch(s=>{throw e.delete(t),s});return e.set(t,r),r}function _a(e){return`${e.fileMode?"file":"live"}:${e.apiToken}`}function Sa(e,t,a=""){return`snapshot:${_a(t)}:${a}:${e}`}function Sc(e){const t=Mr.find(a=>a.key===e);if(!t)throw new Error(`Unknown diagnostic snapshot: ${e}`);return t}async function At(e,t,a){const n=await fetch(`${e.path}?_=${Date.now()}`,{headers:{Accept:"application/json","X-Codex-Usage-Token":t.apiToken},cache:"no-store",signal:a});return await Dt(n,e.title)}function Ca(e){if(e.fileMode)throw new Error("Diagnostic facts require localhost dashboard server.");if(!e.apiToken)throw new Error("Diagnostic facts require localhost dashboard API token.")}async function Dt(e,t){if(!e.ok)throw new Error(`${t} request failed with HTTP ${e.status}`);const a=await e.json();if(typeof a.error=="string"&&a.error)throw new Error(a.error);return a}const wn=[{key:"facts",label:"Top Facts",title:"Top Diagnostic Facts",path:"/api/diagnostics/facts",limit:50},{key:"tools",label:"Tools",title:"Tool and Function Activity",path:"/api/diagnostics/tools",limit:25},{key:"compactions",label:"Compactions",title:"Compaction Activity",path:"/api/diagnostics/compactions",limit:25}],Nr=new Map,Ar=new Map;function Cc(){bc(),Nr.clear(),Ar.clear()}async function nu(e,t,a={}){$r(t);const n=wn.find(f=>f.key===e)??wn[0],r=kc(a.sort??"uncached"),s=a.direction??"desc",i=Math.max(1,Math.round(a.limit??n.limit)),o=Math.max(0,Math.round(a.offset??0)),d=async()=>{const f=new URLSearchParams({limit:String(i),offset:String(o),sort:r,direction:s});Dr(f,"include_archived",a.includeArchived);const h=await fetch(`${n.path}?${f.toString()}`,{headers:{Accept:"application/json","X-Codex-Usage-Token":t.apiToken},cache:"no-store",signal:a.signal});return await Ir(h,n.title)};return a.signal?d():Er(Nr,xc(n.key,t,i,o,r,s,a.cacheKey,a.includeArchived),d)}async function ru(e,t,a={}){$r(t);const n=Math.max(1,Math.round(a.limit??8)),r=Math.max(0,Math.round(a.offset??0)),s=a.sort??"tokens",i=a.direction??"desc",o=async()=>{const d=String(e.fact_type??""),f=String(e.fact_name??"");if(!d||!f)throw new Error("Diagnostic fact type and name are required.");const h=new URLSearchParams({fact_type:d,fact_name:f,limit:String(n),offset:String(r),sort:s,direction:i});Dr(h,"include_archived",a.includeArchived);const v=await fetch(`/api/diagnostics/fact-calls?${h.toString()}`,{headers:{Accept:"application/json","X-Codex-Usage-Token":t.apiToken},cache:"no-store",signal:a.signal}),u=await Ir(v,"Diagnostic fact calls");return{calls:(u.rows??[]).map((p,g)=>pr(p,g)),rawPayload:u}};return a.signal?o():Er(Ar,Tc(e,t,n,r,s,i,a.cacheKey,a.includeArchived),o)}function Er(e,t,a){const n=e.get(t);if(n!==void 0)return Promise.resolve(n);const r=a().then(s=>(e.set(t,s),s)).catch(s=>{throw e.delete(t),s});return e.set(t,r),r}function Fr(e){return`${e.fileMode?"file":"live"}:${e.apiToken}`}function xc(e,t,a,n,r,s,i="",o){return["facts",e,Fr(t),i,o??"default",a,n,r,s].join(":")}function kc(e){return e==="total"?"tokens":e==="latest"?"time":e}function Tc(e,t,a,n,r,s,i="",o){return["fact-calls",Fr(t),i,o??"default",String(e.fact_type??""),String(e.fact_name??""),a,n,r,s].join(":")}function Dr(e,t,a){a!==void 0&&e.set(t,String(a))}function $r(e){if(e.fileMode)throw new Error("Diagnostic facts require localhost dashboard server.");if(!e.apiToken)throw new Error("Diagnostic facts require localhost dashboard API token.")}async function Ir(e,t){if(!e.ok)throw new Error(`${t} request failed with HTTP ${e.status}`);const a=await e.json();if(a.error)throw new Error(a.error);return a}const Lc=[{id:"usage-snapshot",endpoint:"/api/usage",dataClass:"snapshot",schema:"codex-usage-tracker-dashboard-v1"},{id:"overview-summary",endpoint:"/api/summary",dataClass:"aggregate",schema:"codex-usage-tracker-summary-v1"},{id:"overview-recommendations",endpoint:"/api/recommendations",dataClass:"aggregate",schema:"codex-usage-tracker-recommendations-v1"},{id:"calls",endpoint:"/api/calls",dataClass:"aggregate",schema:"codex-usage-tracker-calls-v1"},{id:"threads",endpoint:"/api/threads",dataClass:"aggregate",schema:"codex-usage-tracker-threads-v1"},{id:"thread-calls",endpoint:"/api/thread-calls",dataClass:"detail",schema:"codex-usage-tracker-thread-calls-v1"},{id:"investigator-agentic",endpoint:"/api/investigations/agentic",dataClass:"aggregate",schema:"codex-usage-tracker-agentic-investigation-v1"},{id:"investigator-walk",endpoint:"/api/investigations/walk",dataClass:"userAction",schema:"codex-usage-tracker-investigation-walk-v1"},{id:"diagnostics-facts",endpoint:"/api/diagnostics/facts",dataClass:"aggregate",schema:null},{id:"diagnostics-fact-calls",endpoint:"/api/diagnostics/fact-calls",dataClass:"detail",schema:null},{id:"diagnostics-dedupe",endpoint:"/api/diagnostics/dedupe",dataClass:"aggregate",schema:"codex-usage-tracker-dedupe-diagnostics-v1"},{id:"diagnostics-snapshot",endpoint:"/api/diagnostics/{snapshot}",dataClass:"aggregate",schema:null},{id:"compression-profile",endpoint:"/api/compression/profile",dataClass:"aggregate",schema:"codex-usage-tracker-compression-api-v1"},{id:"reports",endpoint:"/api/reports/pack",dataClass:"aggregate",schema:"codex-usage-tracker-reports-pack-v1"}],Rc=Lc,Mc=new Map(Rc.map(e=>[e.id,e])),Pc=15*6e4,jc=3e4,Or={snapshot:ot({persistedCache:"aggregate-only"}),aggregate:ot({persistedCache:"aggregate-only"}),detail:ot(),heavyJob:ot({cancellation:"shared-job",staleTime:1e3}),userAction:ot({retry:0,staleTime:0})};function Nc({sourceKey:e,sourceRevision:t}){return{sourceKey:yn(e,"local-api"),sourceRevision:yn(t,"unversioned")}}function Ac(e,t,a={},...n){return["dashboard",e.id,t.sourceKey,t.sourceRevision,Dc(a),...n]}function Ec(e){return["dashboard",e.id]}function Fc(e){const t=Mc.get(e);if(!t)throw new Error(`Unknown dashboard query definition: ${e}`);return t}function Ur(e){const t=Or[e];return{gcTime:t.gcTime,refetchOnReconnect:t.refetchOnReconnect,refetchOnWindowFocus:t.refetchOnWindowFocus,retry:t.retry,staleTime:t.staleTime}}function su({enabled:e,hasData:t,isError:a,isFetching:n,isPending:r}){return e?t?n?"updating":"ready":a?"error":n||r?"loading":"waiting":"waiting"}function iu(e){const t=e.filter(n=>n==="ready"||n==="updating").length,a=e.length;return{ready:t,total:a,percent:a===0?100:Math.round(t/a*100),loading:e.filter(n=>n==="loading").length,errors:e.filter(n=>n==="error").length}}function Dc(e){return{historyScope:e.historyScope??"active",loadWindow:e.loadWindow??"all",limit:e.limit??null,since:e.since??""}}function yn(e,t){return(e==null?void 0:e.trim())||t}function ot(e={}){return{staleTime:jc,gcTime:Pc,retry:1,refetchOnReconnect:!1,refetchOnWindowFocus:!1,cancellation:"observer",persistedCache:"none",...e}}const $c=new Set(["command_text","content_fragment","content_fragments","excerpt","indexed_content","indexed_fragment","indexed_fragments","prompt","raw_context","raw_output","snippet","tool_output"]),Ic=new Set(["includes_indexed_content","includes_raw_fragment","includes_raw_fragments","indexed_content_included","raw_content_included","raw_context_included"]),Oc=new Set(["codex-usage-tracker-context-v1"]);function _n(e){return oa(e,new WeakSet)}function oa(e,t){if(!e||typeof e!="object")return!0;if(t.has(e))return!1;t.add(e);const a=Array.isArray(e)?e.every(n=>oa(n,t)):Object.entries(e).every(([n,r])=>{const s=n.toLowerCase();return $c.has(s)||Ic.has(s)&&r===!0||s==="schema"&&typeof r=="string"&&Oc.has(r)?!1:oa(r,t)});return t.delete(e),a}const Uc="codexUsageDashboard",Vc=1,Y="usageSnapshots",Kc=6,zc=10080*60*1e3,qc={async read(e){if(!e.sourceRevision)return null;try{const t=await Cn();if(!t)return null;const a=await Vr(t.transaction(Y,"readonly").objectStore(Y).get(Sn(e)));return!a||a.sourceRevision!==e.sourceRevision||Date.now()-a.storedAt>zc?null:_n(a.payload)?a.payload:(await Hc(t,a.cacheKey),null)}catch{return null}},async write(e,t){if(!(!e.sourceRevision||!_n(t)))try{const a=await Cn();if(!a)return;const n=a.transaction(Y,"readwrite");n.objectStore(Y).put({...e,cacheKey:Sn(e),payload:t,storedAt:Date.now()}),await xa(n),await Wc(a)}catch{}}};async function Hc(e,t){const a=e.transaction(Y,"readwrite");a.objectStore(Y).delete(t),await xa(a)}function Sn(e){const{historyScope:t,loadWindow:a,limit:n,since:r}=e.scope;return JSON.stringify([e.sourceKey,t,a,n,r])}function Cn(){return typeof indexedDB>"u"?Promise.resolve(null):new Promise(e=>{const t=indexedDB.open(Uc,Vc);t.onupgradeneeded=()=>{t.result.objectStoreNames.contains(Y)||t.result.createObjectStore(Y,{keyPath:"cacheKey"})},t.onsuccess=()=>e(t.result),t.onerror=()=>e(null),t.onblocked=()=>e(null)})}function Vr(e){return new Promise((t,a)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>a(e.error??new Error("IndexedDB request failed"))})}function xa(e){return new Promise((t,a)=>{e.oncomplete=()=>t(),e.onerror=()=>a(e.error??new Error("IndexedDB transaction failed")),e.onabort=()=>a(e.error??new Error("IndexedDB transaction aborted"))})}async function Wc(e){const t=e.transaction(Y,"readonly"),n=(await Vr(t.objectStore(Y).getAll())).sort((i,o)=>o.storedAt-i.storedAt).slice(Kc);if(!n.length)return;const r=e.transaction(Y,"readwrite"),s=r.objectStore(Y);n.forEach(i=>s.delete(i.cacheKey)),await xa(r)}const Bc={kind:"production",load:Lo},Qc="codexUsageDashboardRuntimeMetadata",Gc=2048,ca=Fc("usage-snapshot"),Kr={all:Ec(ca),snapshot:(e,t,a)=>Ac(ca,Nc({sourceKey:e,sourceRevision:t}),a)};function Jc(){return new Ri({defaultOptions:{queries:{...Ur("aggregate")}}})}const ka=Jc();async function Zc({currentPayload:e,historyScope:t,loadWindow:a,loadLimit:n,since:r=null,onProgress:s,queryClient:i=ka,refresh:o=!1,snapshotStore:d=qc,transport:f=Bc}){const h=qi(n,t,r,a),v=Ta(e),u=Kr.snapshot(v.sourceKey,v.sourceRevision,h);!i.getQueryData(u)&&al(e,h)&&i.setQueryData(u,e),o&&await i.invalidateQueries({queryKey:u,exact:!0});const p=xn(e,h),g=await i.fetchQuery({queryKey:u,...Ur(ca.dataClass),queryFn:async({signal:b})=>{var R;const w=!o&&p?await d.read(p):null;if(w)return s==null||s({status:"completed",phase:"loading_rows",message:"Loaded cached dashboard snapshot",completed:Number(w.loaded_row_count??((R=w.rows)==null?void 0:R.length)??0),total:Number(w.total_available_rows??w.loaded_row_count??0),percent:100}),w;const T=await f.load(e,{refresh:o,limit:Hi(h),includeArchived:h.historyScope==="all",loadWindow:a,since:h.since,onProgress:s,signal:b}),A=p?{...p,sourceRevision:String(T.latest_refresh_at??p.sourceRevision)}:xn(T,h);return A&&await d.write(A,T),T},staleTime:o?0:Or.snapshot.staleTime});return tl(el(g,h)),g}function xn(e,t){if(!(e!=null&&e.api_token))return null;const a=String(e.latest_refresh_at??"");return a?{sourceKey:zr(e),sourceRevision:a,scope:t}:null}async function Xc(e=ka){await e.cancelQueries({queryKey:Kr.all})}function Yc(e){return yi(e)||or(e)}function el(e,t){return{schema:"codex-usage-dashboard-runtime-v1",...Ta(e),scope:t,updatedAt:Date.now()}}function Ta(e){return{sourceKey:zr(e),sourceRevision:nl(e)}}function tl(e,t=rl()){if(t)try{const a=JSON.stringify(e);a.length<=Gc&&t.setItem(Qc,a)}catch{}}function al(e,t){var o;if(!e||!(((o=e.rows)==null?void 0:o.length)??0))return!1;const a=ct(e),n=t.limit===null?a===0:a===t.limit,r=(e.since??null)===t.since,s=ma(e)===t.loadWindow,i=e.include_archived||e.history_scope==="all-history"?"all":"active";return n&&r&&s&&i===t.historyScope}function zr(e){const t=e,a=Number((t==null?void 0:t.payload_cache_version)??0),n=String((t==null?void 0:t.payload_cache_key)??(e!=null&&e.api_token?"live":"static"));return`${a}:${n}`}function nl(e){return String((e==null?void 0:e.latest_refresh_at)??"unversioned")}function rl(){try{return typeof window>"u"?null:window.sessionStorage}catch{return null}}const sl=new Set(["duplicate_cumulative_total"]);function il({canUseLiveApi:e,payload:t,shellI18n:a}){const n=ol(t,e,a);return c.jsxs("section",{className:"environment-status","aria-label":a.t("aria.dashboard_status","Dashboard status"),children:[c.jsx("span",{className:"environment-status-title",children:a.t("aria.dashboard_status","Dashboard status")}),c.jsx("div",{className:"environment-status-grid",children:n.map(r=>c.jsx("span",{className:"environment-chip","data-state":r.state,title:r.title,children:r.label},r.label))})]})}function ol(e,t,a){const n=hl(e==null?void 0:e.parser_diagnostics,a);return[{label:a.t("badge.unofficial_project","Unofficial project"),state:"neutral",title:a.t("badge.unofficial_project_title","Codex Usage Tracker is independent and is not made by, affiliated with, endorsed by, sponsored by, or supported by OpenAI. OpenAI and Codex are trademarks of OpenAI.")},{label:t?`${a.t("badge.live","Live")} API`:a.t("badge.static","Static"),state:t?"ready":"warn",title:t?"Local API token present for refresh actions.":"Static embedded snapshot; live refresh is unavailable."},ll(e,a),ul(e,a),dl(e,a),cl(e),...n?[n]:[]]}function cl(e){const t=e==null?void 0:e.dedupe,a=Number((t==null?void 0:t.excluded_copied_rows)||0),n=Number((t==null?void 0:t.canonical_rows)||0),r=Number((t==null?void 0:t.physical_rows)||0);return{label:`Deduped · ${a.toLocaleString()} copied excluded`,state:"ready",title:`Billable totals use ${n.toLocaleString()} canonical rows while preserving ${r.toLocaleString()} physical source rows.`}}function ll(e,t){var s;const a=!!(e!=null&&e.pricing_configured),n=((s=e==null?void 0:e.pricing_snapshot_warning)==null?void 0:s.trim())??"",r=qr(e==null?void 0:e.pricing_source);return{label:a?t.t("badge.costs","Costs"):t.t("badge.no_costs","No costs"),state:a?n?"warn":"ready":"missing",title:a?[r||"Pricing configured",n].filter(Boolean).join(" - "):t.t("pricing.configure_hint","Run codex-usage-tracker update-pricing to configure estimated costs.")}}function ul(e,t){var s,i;const a=((s=e==null?void 0:e.allowance_error)==null?void 0:s.trim())??"",n=((i=e==null?void 0:e.rate_card_error)==null?void 0:i.trim())??"",r=qr(e==null?void 0:e.allowance_source)||"Codex credit rates";return a?{label:t.t("state.allowance_config_error","Allowance config error"),state:"missing",title:`Config error: ${a}`}:n?{label:"Rate-card error",state:"missing",title:`Rate-card error: ${n}`}:e!=null&&e.allowance_configured?{label:t.t("state.allowance_configured","Allowance configured"),state:"ready",title:r}:e!=null&&e.rate_card_configured?{label:"Credit rates loaded",state:"ready",title:r}:{label:t.t("action.set_limits","Set limits"),state:"warn",title:"No local allowance windows are configured."}}function dl(e,t){const a=e==null?void 0:e.project_metadata_privacy,n=(a==null?void 0:a.mode)||(e==null?void 0:e.privacy_mode)||"normal",r=n==="normal",s=[a!=null&&a.cwd_redacted?"cwd redacted":"",a!=null&&a.project_names_redacted?"project names redacted":"",a!=null&&a.git_remote_label_hidden?"git remote hidden":"",a!=null&&a.relative_cwd_hidden?"relative cwd hidden":"",a!=null&&a.git_branch_hidden?"git branch hidden":"",a!=null&&a.tags_hidden?"tags hidden":""].filter(Boolean);return{label:r?t.t("badge.metadata_normal","Metadata normal"):Hr(t.t("badge.metadata_mode","Metadata {mode}"),{mode:n}),state:r?"ready":"warn",title:r?"Project metadata is shown normally.":[`Metadata mode: ${n}`,...s].join(" - ")}}function hl(e,t){const a=Object.entries(e??{}).filter(([s,i])=>Number(i||0)>0&&!sl.has(s));if(!a.length)return null;const n=a.reduce((s,[,i])=>s+Number(i||0),0),r=a.map(([s,i])=>`${s}=${Number(i||0)}`).join(", ");return{label:t.t("badge.parser_warnings","Parser warnings"),state:"missing",title:Hr(t.t("parser.warnings_title","Latest refresh reported {count} parser diagnostics: {entries}. Run codex-usage-tracker inspect-log to investigate schema drift."),{count:n.toLocaleString(),entries:r})}}function qr(e){if(!e)return"";if(typeof e=="string")return e;const t=e.label??e.name??e.type??e.path??"";return typeof t=="string"?t:""}function Hr(e,t){return e.replace(/\{([a-zA-Z0-9_]+)\}/g,(a,n)=>t[n]??a)}async function kn(e){var a;if((a=navigator.clipboard)!=null&&a.writeText)return await navigator.clipboard.writeText(e),!0;const t=document.createElement("textarea");t.value=e,t.setAttribute("readonly","readonly"),t.style.position="fixed",t.style.left="-9999px",t.style.top="0",document.body.appendChild(t),t.select();try{return document.execCommand("copy")}finally{t.remove()}}const fl={"highest-cost":"Highest Cost Threads","context-bloat":"Context Bloat","cache-misses":"Cache Misses","pricing-gaps":"Pricing Gaps","codex-credits":"Codex Credits","reasoning-spike":"Reasoning Spike"};function ou(e,t){return t==="context-bloat"?Number(e.contextWindowPct??0)>=60||e.totalTokens>=2e5:t==="cache-misses"?e.signal==="cache-risk"||e.cachedPct<30||e.uncachedInput>=5e4:t==="pricing-gaps"?e.pricingEstimated||!Number.isFinite(e.cost):t==="codex-credits"?e.credits>0:t==="reasoning-spike"?e.reasoningOutput>0:!0}function ml(e){return fl[e]??e}const gl=se(()=>O(()=>import("./OverviewPage.js"),__vite__mapDeps([49,1,2,34,4,20,21,9,10,31,32,6,16,17,18,45,22,11,12,13,14,35,23,24,25,26,50])),"OverviewPage"),pl=se(()=>O(()=>import("./InvestigatorPage.js"),__vite__mapDeps([51,1,2,34,4,6,41,7,20,21,9,10,16,17,18,45,22,11,12,13,23,24,38,25,26,52])),"InvestigatorPage"),bl=se(()=>O(()=>import("./CompressionLabPage.js"),__vite__mapDeps([53,1,2,34,4,6,9,10,17,25,26,12,54])),"CompressionLabPage"),vl=se(()=>O(()=>import("./ExploreRoutePage.js"),__vite__mapDeps([55,1,2,44,3,4,5,6,7,14,29,33,19,45,22,11,12,13,35,23,24,34,46,47,38,25,26,48,8,9,10,56])),"ExploreRoutePage"),wl=se(()=>O(()=>import("./CallInvestigatorPage.js"),__vite__mapDeps([57,1,2,46,33,19,37,38,47,25,26,12])),"CallInvestigatorPage"),yl=se(()=>O(()=>import("./ThreadsPage.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27])),"ThreadsPage"),_l=se(()=>O(()=>import("./UsageDrainPage.js"),__vite__mapDeps([36,1,2,34,4,20,21,9,10,16,17,18,24,37,38,25,26,12,39])),"UsageDrainPage"),Sl=se(()=>O(()=>import("./CacheContextPage.js"),__vite__mapDeps([28,1,2,29,30,22,31,32,6,33,19,20,21,9,10,23,34,4,3,5,7,15,35,24,25,26,12])),"CacheContextPage"),Cl=se(()=>O(()=>import("./DiagnosticsPage.js"),__vite__mapDeps([40,1,2,29,33,19,20,21,9,10,23,24,41,4,6,7,34,3,25,26,12])),"DiagnosticsPage"),xl=se(()=>O(()=>import("./ReportsPage.js"),__vite__mapDeps([42,1,2,34,4,6,33,19,20,21,9,10,16,17,18,30,22,35,23,24,25,26,12,43])),"ReportsPage"),kl=se(()=>O(()=>import("./SettingsPage.js"),__vite__mapDeps([58,1,2,33,19,32,38,47,17,25,26,12,59])),"SettingsPage");function Tl(e){return c.jsx(C.Suspense,{fallback:c.jsx(Rl,{activeView:e.activeView}),children:Ll(e)})}function Ll(e){const{activePreset:t,activeRecordId:a,activeView:n,autoRefreshEnabled:r,applicationI18n:s,backFromCallInvestigator:i,callBackLabel:o,canLoadAllRows:d,canUseLiveApi:f,contextRuntime:h,copyCallInvestigatorLink:v,dashboardPayload:u,globalFilters:p,globalQuery:g,hasMoreRows:b,historyScope:w,loadWindow:T,loadAllRows:A,loadedRowCount:R,loadLimit:_,loadMoreRows:L,scopeSince:y,model:k,navigateView:j,onRefresh:E,openCallInvestigator:F,refreshing:me,refreshState:vt,setContextApiEnabled:wt,sourceIdentity:I,totalAvailableRows:nt}=e;switch(n){case"overview":return c.jsx(gl,{model:k,contextRuntime:h,sourceKey:I.sourceKey,sourceRevision:I.sourceRevision,onRefresh:E,globalQuery:g,runtime:{historyScope:w,loadLimit:_,loadWindow:T,loadedRowCount:R,scopeSince:y,totalAvailableRows:nt},refreshing:me,canLoadMoreRows:f&&b,onLoadMoreRows:L,onOpenInvestigator:F,onCopyCallLink:v,onNavigateView:j,globalFilters:p});case"investigator":return c.jsx(pl,{model:k,contextRuntime:h,includeArchived:w==="all",sourceKey:I.sourceKey,sourceRevision:I.sourceRevision,onOpenInvestigator:F,onCopyCallLink:v,onNavigateView:j});case"compression-lab":return c.jsx(bl,{contextRuntime:h,includeArchived:w==="all",since:y,sourceKey:I.sourceKey,sourceRevision:I.sourceRevision});case"calls":return c.jsx(vl,{model:k,globalQuery:g,activePreset:t,onRefresh:E,contextRuntime:h,includeArchived:w==="all",scopeSince:y,sourceKey:I.sourceKey,sourceRevision:I.sourceRevision,onContextApiEnabledChange:wt,onOpenInvestigator:F,onCopyCallLink:v,onNavigateView:j});case"call":return c.jsx(wl,{model:k,recordId:a,contextRuntime:h,onContextApiEnabledChange:wt,onNavigateRecord:F,onCopyCallLink:v,onBackToCalls:i,backLabel:o});case"threads":return c.jsx(yl,{model:k,globalQuery:g,onOpenInvestigator:F,onCopyCallLink:v,globalFilters:p,contextRuntime:h,includeArchived:w==="all",sourceKey:I.sourceKey,sourceRevision:I.sourceRevision,onNavigateView:j});case"usage-drain":return c.jsx(_l,{model:k,contextRuntime:h,includeArchived:w==="all",sourceRevision:I.sourceRevision,onOpenInvestigator:F,onCopyCallLink:v});case"cache-context":return c.jsx(Sl,{model:k,contextRuntime:h,includeArchived:w==="all",scopeSince:y,sourceKey:I.sourceKey,sourceRevision:I.sourceRevision,onOpenInvestigator:F,onCopyCallLink:v});case"diagnostics":return c.jsx(Cl,{model:k,contextRuntime:h,includeArchived:w==="all",sourceKey:I.sourceKey,sourceRevision:I.sourceRevision,rowLoadControls:{loadedRowCount:R,totalAvailableRows:nt,canLoadMoreRows:f&&b,canLoadAllRows:d,refreshing:me,onLoadMoreRows:L,onLoadAllRows:A},onOpenInvestigator:F,onCopyCallLink:v,globalFilters:p});case"reports":return c.jsx(xl,{model:k,refreshState:vt,includeArchived:w==="all",loadWindow:T,loadLimit:_,sourceKey:I.sourceKey,sourceRevision:I.sourceRevision,onOpenInvestigator:F,onCopyCallLink:v});case"settings":return c.jsx(kl,{model:k,payload:u,historyScope:w,loadWindow:T,loadLimit:_,scopeSince:y,loadedRowCount:R,totalAvailableRows:nt,canUseLiveApi:f,autoRefreshEnabled:r,refreshState:vt,applicationI18n:s})}}function Rl({activeView:e}){return c.jsxs("section",{"aria-busy":"true","aria-live":"polite",className:"route-state",role:"status",children:["Loading ",e.replace("-"," "),"..."]})}const Tn=1e4,Ml={1:"overview",2:"calls",3:"threads",4:"diagnostics"},Pl=new Set(["call","compression-lab","diagnostics","investigator"]);function Wr(e){return!Pl.has(e)}function jl(e){return e instanceof Element?!!e.closest('input, select, textarea, button, [contenteditable="true"]'):!1}function Br(){var Va;const e=C.useRef(null),t=C.useMemo(()=>To(),[]),[a,n]=C.useState(t),[r,s]=C.useState(()=>on(t)),[i,o]=C.useState(()=>{const m=new URLSearchParams(window.location.search);return ia(m.get("view"))}),[d,f]=C.useState(()=>new URLSearchParams(window.location.search).get("record")??""),[h,v]=C.useState(()=>mn()),[u,p]=C.useState(()=>gn()),[g,b]=C.useState(()=>new URLSearchParams(window.location.search).get("q")??""),[w,T]=C.useState(()=>new URLSearchParams(window.location.search).get("preset")??""),[A,R]=C.useState(()=>window.location.search),[_,L]=C.useState("Stored snapshot loaded just now"),[y,k]=C.useState(null),[j,E]=C.useState(!1),[F,me]=C.useState(!1),[vt,wt]=C.useState(!1),[I,nt]=C.useState(()=>Gs(t)),$t=C.useRef(!1),[G,La]=C.useState(()=>je(ct(t),500)),[Ue,yt]=C.useState(()=>je(ct(t),500)),[z,Ra]=C.useState(()=>Wi(t)),[J,_t]=C.useState(()=>pn(Ht(t))),[Ma,Pa]=C.useState(r.contextRuntime.contextApiEnabled),q=!!(a!=null&&a.api_token),Qr=C.useMemo(()=>Ta(a),[a]),N=C.useMemo(()=>In(a,I),[a,I]),ja=C.useMemo(()=>({...r.contextRuntime,contextApiEnabled:Ma}),[Ma,r.contextRuntime]),Gr=C.useMemo(()=>Wo(r,J,A),[J,A,r]),Na=i==="calls"||i==="call"?r:Gr,rt=Wr(i),It=je(Ue,G,500),ge=Math.max(0,Number((a==null?void 0:a.loaded_row_count)??((Va=a==null?void 0:a.rows)==null?void 0:Va.length)??r.calls.length??0)),Ve=Math.max(0,Number((a==null?void 0:a.total_available_rows)??ge)),Jr=Ue!==G,Aa=Gi({currentLimit:G,loadedRows:ge,pendingLimit:Ue}),Zr=Math.min(It,Aa),Ea=!!(a!=null&&a.has_more)||Ve>0&&ge{const m=new URL(window.location.href);vn(m)&&Ke(m)},[]),C.useEffect(()=>{function m(){const S=window.location.search,M=new URLSearchParams(S);o(ia(M.get("view"))),f(M.get("record")??""),v(mn(S)),p(gn(S)),b(M.get("q")??""),T(M.get("preset")??""),_t(pn(Ht(a),S)),R(S)}return window.addEventListener("popstate",m),()=>window.removeEventListener("popstate",m)},[a]),C.useEffect(()=>{function m(S){var oe;if(jl(S.target))return;if(S.key==="/"){S.preventDefault(),(oe=e.current)==null||oe.focus();return}const M=Ml[S.key];M&&(S.preventDefault(),st(M))}return window.addEventListener("keydown",m),()=>window.removeEventListener("keydown",m)},[]),C.useEffect(()=>{function m(){wt(window.scrollY>320)}return m(),window.addEventListener("scroll",m,{passive:!0}),()=>window.removeEventListener("scroll",m)},[]);function rs(m){const S=i==="call"?h:i;v(S),p(i==="call"?u:!0),o("call"),f(m);const M=new URL(window.location.href);kt(M,i,i==="call"?h:[]),M.searchParams.set("view","call"),M.searchParams.set("record",m),M.searchParams.set("return",S),$a(M)}function ss(){st(h)}function is(m){b(m),T("");const S=new URL(window.location.href);S.searchParams.delete("preset"),m?S.searchParams.set("q",m):S.searchParams.delete("q"),Ke(S)}async function ie(m={}){var St;if(j)return;$t.current=!0;const S=m.loadLimit??G,M=m.loadWindow??z,oe=qt(M),pe=m.historyScope??J,ee=m.refresh??!0,Ot=!!(a!=null&&a.refresh_jobs_available);E(!0),k(Ot?{status:"running",phase:ee?"refreshing_index":"loading_rows",message:`${ee?"Refreshing":"Loading"} ${Re(M,S)}`}:null),L(`${ee?"Refreshing index for":"Loading"} ${Re(M,S)}...`);let ze=!1;try{const Q=await Zc({currentPayload:a,refresh:ee,loadLimit:S,loadWindow:M,since:oe,historyScope:pe,onProgress:Vt=>{ze||(ze=Vt.message==="Loaded cached dashboard snapshot"),k(Vt),L(Ya(Vt,pe))}});Cc(),n(Q),s(on(Q)),Pa(!!Q.context_api_enabled);const ke=M==="rows"?je(ct(Q,S),S):S;La(ke),yt(ke),Ra(M);const Ka=Ht(Q,pe);_t(Ka),Qi(ke,Ka,M);const Ut=Q.loaded_row_count??((St=Q.rows)==null?void 0:St.length)??0,za=Q.total_available_rows??Ut;L(M==="rows"?`${ze?"Cache hit; l":ee?"Refreshed index; l":"L"}oaded ${Ut.toLocaleString()} of ${za.toLocaleString()} calls from ${Re(M,ke)}`:`${ze?"Cache hit; ":ee?"Refreshed index; ":""}${Re(M,ke)} analysis ready across ${za.toLocaleString()} calls; ${Ut.toLocaleString()} detail rows cached`)}catch(Q){if(k(null),Yc(Q)){L("Refresh cancelled; stored snapshot remains visible");return}const ke=new Date().toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"});L(`${to(Q)} Stored snapshot kept at ${ke}`)}finally{k(null),E(!1)}}async function os(){await Xc(),k(null),E(!1),L("Refresh cancelled; stored snapshot remains visible")}C.useEffect(()=>{document.documentElement.lang=N.language,document.documentElement.dir=N.direction},[N.direction,N.language]),C.useEffect(()=>{var Q;const m=Number((a==null?void 0:a.total_available_rows)??0),S=Number((a==null?void 0:a.loaded_row_count)??((Q=a==null?void 0:a.rows)==null?void 0:Q.length)??0),M=Bi(),oe=(M==null?void 0:M.historyScope)??J,pe=(M==null?void 0:M.loadLimit)??G,ee=(M==null?void 0:M.loadWindow)??z,Ot=ma(a),ze=oe!==J||ee!==Ot||ee==="rows"&&pe!==ct(a),St=S>0;!q||!ze&&St||m<=0||j||$t.current||($t.current=!0,ze&&(_t(oe),La(pe),yt(pe),Ra(ee),Ke(bn(oe))),ie({refresh:!1,historyScope:oe,loadLimit:pe,loadWindow:ee}))},[q,a,J,G,z,j]),C.useEffect(()=>{!q&&F&&me(!1)},[F,q]),C.useEffect(()=>{if(!F||!q||!rt)return;const m=window.setInterval(()=>{ie()},Tn);return()=>window.clearInterval(m)},[F,rt,q,a,J,G,z,j]),C.useEffect(()=>{if(!F||!q||!rt)return;function m(){document.visibilityState==="visible"&&ie()}return document.addEventListener("visibilitychange",m),()=>document.removeEventListener("visibilitychange",m)},[F,rt,q,a,J,G,z,j]);function Ia(m){const S=m.trim();yt(Math.max(1,pt(S===""?Number.NaN:Number(S))))}function cs(m){Ia(m)}function ls(){ie({refresh:!1,loadLimit:Ue,loadWindow:"rows"})}function us(){ie({refresh:!1,loadWindow:"all"})}function Oa(){yt(Fa),ie({refresh:!1,loadLimit:Fa,loadWindow:z})}function ds(m){m!==z&&ie({refresh:!1,loadWindow:m})}function hs(m){const S=m==="all"?"all":"active";_t(S),Ke(bn(S)),ie({refresh:!1,historyScope:S})}function fs(m){if(me(m),m){if(!rt){L("Auto refresh pauses on this evidence-heavy view");return}L(`Auto refresh every ${Tn/1e3}s`),ie()}else L("Auto refresh paused")}function ms(m){nt(m),Js(m)}async function gs(){try{const m=new URL(window.location.href);if(vn(m),kt(m,i,i==="call"?h:[]),!await kn(m.toString()))throw new Error("Clipboard unavailable");L("Copied current view link")}catch{L("Copy unavailable in browser")}}async function ps(m){try{const S=new URL(window.location.href);kt(S,i,i==="call"?h:[]);const M=i==="call"?h:i;if(S.searchParams.set("view","call"),S.searchParams.set("record",m),S.searchParams.set("return",M),!await kn(S.toString()))throw new Error("Clipboard unavailable");L("Copied call investigator link")}catch{L("Copy unavailable in browser")}}async function bs(){const m=await Xi(i,Na,{contextRuntime:ja,historyScope:J,loadWindow:z,loadLimit:G,scopeSince:(a==null?void 0:a.since)??qt(z),loadedRowCount:ge,totalAvailableRows:Ve,canUseLiveApi:q,autoRefreshEnabled:F,refreshState:_},g,w);if(!m.rowCount){L(`No ${m.label} to export`);return}Fi(m.filename,m.csv),L(`Exported ${m.rowCount} ${m.label}`)}function vs(){T("");const m=new URL(window.location.href);m.searchParams.delete("preset"),Ke(m),L("Investigation preset cleared")}function ws(){window.scrollTo({top:0,behavior:"smooth"})}return c.jsx(io,{value:N,children:c.jsxs("div",{className:"app-shell","data-dashboard-localization-root":!0,children:[c.jsxs("aside",{className:"sidebar",children:[c.jsxs("div",{className:"brand",children:[c.jsx("div",{className:"brand-mark",children:c.jsx(Ks,{size:22})}),c.jsxs("div",{children:[c.jsx("strong",{children:"Codex Usage Tracker"}),c.jsx("span",{children:N.t("dashboard.eyebrow","Local telemetry console")})]})]}),c.jsxs("div",{className:"local-pill",children:[c.jsx("span",{"aria-hidden":"true"}),"Local data only"]}),c.jsx(il,{payload:a,canUseLiveApi:q,shellI18n:N}),c.jsx("nav",{className:"primary-nav","aria-label":"Primary",children:kr.map(m=>{const S=m.icon,M=i===m.id||i==="call"&&m.id==="calls";return c.jsxs("button",{type:"button","aria-pressed":M,className:M?"active":"",onClick:()=>st(m.id),children:[c.jsx(S,{size:18}),c.jsx("span",{children:N.navLabel(m.id,m.label)})]},m.id)})}),c.jsxs("div",{className:"secondary-block",role:"group","aria-label":"Quick Links",children:[c.jsx("span",{children:"Quick Links"}),Tr.map(m=>{const S=m.icon;return c.jsxs("button",{type:"button",onClick:()=>st(m.target),children:[c.jsx(S,{size:16}),m.label]},m.label)})]})]}),c.jsxs("main",{className:"workspace",children:[c.jsxs("div",{className:"unofficial-banner",role:"note","aria-label":"Unofficial project notice",children:[c.jsx(Us,{size:16}),c.jsxs("span",{children:[c.jsx("strong",{children:"Unofficial project."})," Not made by, affiliated with, endorsed by, sponsored by, or supported by OpenAI."]})]}),c.jsxs("header",{className:"topbar","aria-label":"Dashboard toolbar",children:[c.jsxs("label",{className:"global-search",children:[c.jsx("span",{className:"sr-only",children:N.t("filter.search","Search dashboard")}),c.jsx("input",{ref:e,"aria-label":N.t("filter.search","Search dashboard"),value:g,onChange:m=>is(m.target.value),placeholder:N.t("filter.search_placeholder","Search calls, threads, models, diagnostics...")})]}),c.jsxs("div",{className:"topbar-actions",children:[c.jsxs("div",{className:"topbar-scope-controls",children:[N.languages.length>1?c.jsxs("label",{className:"topbar-select",children:[c.jsx("span",{children:N.t("language.label","Language")}),c.jsx("select",{"data-localization-skip":"true","aria-label":N.t("language.label","Language"),value:N.language,onChange:m=>ms(m.target.value),children:N.languages.map(m=>c.jsx("option",{value:m.code,children:m.native_name||m.english_name||m.code},m.code))})]}):null,c.jsxs("label",{className:"topbar-select",children:[c.jsx("span",{children:N.t("nav.history","History")}),c.jsxs("select",{"aria-label":"History scope",title:Da,value:J,onChange:m=>hs(m.target.value),disabled:j||!q,children:[c.jsx("option",{value:"active",children:N.t("option.active_sessions_only","Active")}),c.jsx("option",{value:"all",children:N.t("option.all_history","All history")})]}),c.jsx("small",{className:"sr-only",children:Da})]})]}),c.jsx(sc,{canUseLiveApi:q,finitePendingLoadLimit:It,hasMoreRows:Ea,loadLabel:N.t("nav.load","Load"),loadMoreLabel:N.t("button.load_more","Load more"),loadWindow:z,loadedRowCount:ge,pendingLoadLimit:Ue,refreshProgressPercent:ts,refreshProgressText:as,refreshing:j,rowLimitChanged:Jr,rowLimitSliderMax:Aa,rowLimitSliderValue:Zr,rowLoadModeLabel:Yr,rowLoadStatus:Xr,totalAvailableRows:Ve,onApply:ls,onCancel:os,onDraftChange:Ia,onLoadMore:Oa,onSliderChange:cs,onWindowChange:ds}),c.jsxs("div",{className:"topbar-meta",children:[c.jsxs("div",{className:"topbar-statuses",children:[w?c.jsxs("button",{className:"toolbar-button",type:"button",onClick:vs,children:[c.jsx(ua,{size:15}),N.t("button.clear","Clear")," ",ml(w)]}):null,c.jsxs("label",{className:"topbar-toggle",children:[c.jsx("input",{"aria-label":"Auto refresh",type:"checkbox",checked:F,onChange:m=>fs(m.target.checked),disabled:j||!q}),c.jsx("span",{children:"Auto"})]})]}),c.jsxs("div",{className:"topbar-icon-actions",children:[c.jsx("button",{className:"icon-button",type:"button",onClick:gs,"aria-label":N.t("button.copy_link","Copy link"),title:N.t("button.copy_link","Copy link"),children:c.jsx(js,{size:17})}),c.jsx("button",{className:"icon-button",type:"button",onClick:bs,"aria-label":N.t("button.export_csv","Export CSV"),title:N.t("button.export_csv","Export CSV"),children:c.jsx(As,{size:17})}),c.jsx("button",{className:"icon-button",type:"button",onClick:Ua,"aria-label":N.t("button.refresh","Refresh"),title:N.t("button.refresh","Refresh"),disabled:j,children:c.jsx(Is,{size:17})})]})]})]})]}),c.jsx("p",{className:"sr-only",role:"status","aria-live":"polite",children:_}),c.jsx(Tl,{activeView:i,model:Na,navigateView:st,onRefresh:Ua,refreshState:_,globalQuery:g,activePreset:w,activeRecordId:d,contextRuntime:ja,setContextApiEnabled:Pa,openCallInvestigator:rs,copyCallInvestigatorLink:ps,callBackLabel:u?`Back to ${gc(h)}`:N.t("button.back_to_dashboard","Back to dashboard"),backFromCallInvestigator:ss,dashboardPayload:a,sourceIdentity:Qr,historyScope:J,loadWindow:z,scopeSince:(a==null?void 0:a.since)??qt(z),loadLimit:G,loadedRowCount:ge,totalAvailableRows:Ve,canUseLiveApi:q,autoRefreshEnabled:F,applicationI18n:N,refreshing:j,hasMoreRows:Ea,canLoadAllRows:ns,loadMoreRows:Oa,loadAllRows:us,globalFilters:c.jsx(ic,{activeView:i,locationSearch:A,model:r,onUrlChange:Ke})})]}),vt?c.jsxs("button",{className:"to-top-button",type:"button",onClick:ws,"aria-label":"Back to top",children:[c.jsx(Ts,{size:18}),N.t("button.top","Top")]}):null]})});function Ua(){ie()}}function Nl(){return c.jsx(Mi,{client:ka,children:c.jsx(Br,{})})}const cu=Object.freeze(Object.defineProperty({__proto__:null,App:Br,RoutedApp:Nl,shouldAutoRefreshUsageView:Wr},Symbol.toStringTag,{value:"Module"}));export{Jl as $,Ts as A,Il as B,Oi as C,As as D,Zl as E,Ds as F,ks as G,Ns as H,_n as I,Et as J,B as K,Ol as L,qn as M,ae as N,nu as O,kc as P,eu as Q,Is as R,Os as S,ru as T,Ps as U,Vs as V,ou as W,kn as X,Bl as Y,Wl as Z,Hl as _,js as a,Fs as a0,ua as a1,ml as a2,Kl as a3,Vl as a4,gi as a5,ci as a6,Gt as a7,Wn as a8,ii as a9,oi as aa,Qt as ab,zn as ac,Ci as ad,di as ae,Ul as af,ql as ag,Gl as ah,kt as ai,mn as aj,Ql as ak,Re as al,cu as am,Xl as b,$ as c,Fi as d,ce as e,ve as f,Di as g,iu as h,su as i,Le as j,dr as k,zl as l,Xt as m,Mr as n,au as o,dt as p,tu as q,Ei as r,wn as s,Yl as t,Kn as u,pr as v,Ur as w,Ac as x,Nc as y,Fc as z}; diff --git a/src/codex_usage_tracker/plugin_data/dashboard/react/assets/ThreadsPage.css b/src/codex_usage_tracker/plugin_data/dashboard/react/assets/ThreadsPage.css index 72f2684c..34eb547a 100644 --- a/src/codex_usage_tracker/plugin_data/dashboard/react/assets/ThreadsPage.css +++ b/src/codex_usage_tracker/plugin_data/dashboard/react/assets/ThreadsPage.css @@ -1 +1 @@ -._page_njcbl_1{gap:14px}._pageHeader_njcbl_5,._tableHeading_njcbl_6{display:flex;align-items:center;justify-content:space-between;gap:18px;min-width:0}._pageHeader_njcbl_5>div:first-child{min-width:0;max-width:780px}._pageHeader_njcbl_5 h1,._tableHeading_njcbl_6 h2{margin:0;color:var(--ink-strong, var(--dashboard-text))}._pageHeader_njcbl_5 h1{font-size:28px}._pageHeader_njcbl_5 p:not(._eyebrow_njcbl_29),._tableHeading_njcbl_6 p{margin:5px 0 0;color:var(--ink-muted, var(--dashboard-muted))}._eyebrow_njcbl_29{margin:0 0 4px;color:var(--signal-info-ink, var(--dashboard-accent-strong));font-size:11px;font-weight:800;text-transform:uppercase}._headerActions_njcbl_43,._tableActions_njcbl_44,._gridFooter_njcbl_45{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}._headerActions_njcbl_43{flex-wrap:nowrap}._headerActions_njcbl_43 .toolbar-button{white-space:nowrap}._queryBar_njcbl_61{display:grid;grid-template-columns:minmax(260px,1fr) minmax(150px,220px);gap:10px;align-items:end;padding:10px;border:1px solid var(--line-subtle, var(--dashboard-border));border-radius:8px;background:var(--surface-panel, var(--dashboard-surface))}._queryBar_njcbl_61 .search-box,._queryBar_njcbl_61 .filter-field{min-width:0}._tableHeading_njcbl_6{align-items:end}._tableHeading_njcbl_6 h2{font-size:16px}._tableHeading_njcbl_6 p{font-size:12px}._evidenceSurface_njcbl_89,._accordionGrid_njcbl_93{min-width:0}._visuallyHidden_njcbl_95{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}._accordionScroller_njcbl_107{position:relative;height:620px;overflow:auto;border:1px solid var(--line-subtle, var(--dashboard-border));border-radius:8px;background:var(--surface-panel, var(--dashboard-surface))}._accordionHeaderGroup_njcbl_116{position:sticky;z-index:4;top:0}._accordionHeader_njcbl_116{display:flex;min-width:720px;min-height:42px;background:var(--surface-panel, var(--dashboard-surface));border-bottom:1px solid var(--line-subtle, var(--dashboard-border))}._accordionHeader_njcbl_116>div,._threadRow_njcbl_131>div[role=gridcell]{box-sizing:border-box}._accordionHeader_njcbl_116 button{width:100%;text-align:left}._accordionCanvas_njcbl_133,._threadCallsRegion_njcbl_134{position:relative}._accordionScroller_njcbl_107[data-density=compact] ._accordionHeader_njcbl_116>div,._accordionScroller_njcbl_107[data-density=compact] ._threadRow_njcbl_131>div[role=gridcell]{padding:6px 8px}._accordionScroller_njcbl_107[data-density=comfortable] ._accordionHeader_njcbl_116>div,._accordionScroller_njcbl_107[data-density=comfortable] ._threadRow_njcbl_131>div[role=gridcell]{padding:12px}._accordionItem_njcbl_142{position:absolute;inset-inline:0;display:grid;min-width:720px;box-sizing:border-box}._threadRow_njcbl_131{display:flex;min-height:52px;cursor:pointer;border-bottom:1px solid var(--line-subtle, var(--dashboard-border))}._threadRow_njcbl_131:focus-visible{z-index:3;outline:3px solid var(--signal-info, var(--dashboard-accent));outline-offset:-3px}._expandedThreadRow_njcbl_163{box-shadow:inset 4px 0 0 var(--signal-info, var(--dashboard-accent));background:var(--surface-selected, var(--dashboard-surface-soft))}._disclosureChevron_njcbl_168{width:22px;padding:10px 0 10px 8px;font-size:22px;transition:transform .12s ease}._expandedThreadRow_njcbl_163 ._disclosureChevron_njcbl_168{transform:rotate(90deg)}@media(prefers-reduced-motion:reduce){._disclosureChevron_njcbl_168{transition:none}}._threadExpansionSummary_njcbl_175,._threadCallEvidence_njcbl_176,._threadLoadStatus_njcbl_177{padding:12px 16px;border-bottom:1px solid var(--line-subtle, var(--dashboard-border));background:var(--surface-panel, var(--dashboard-surface))}._accordionScroller_njcbl_107[data-density=compact] ._threadExpansionSummary_njcbl_175,._accordionScroller_njcbl_107[data-density=compact] ._threadCallEvidence_njcbl_176,._accordionScroller_njcbl_107[data-density=compact] ._threadLoadStatus_njcbl_177{padding:8px 12px}._accordionScroller_njcbl_107[data-density=comfortable] ._threadExpansionSummary_njcbl_175,._accordionScroller_njcbl_107[data-density=comfortable] ._threadCallEvidence_njcbl_176,._accordionScroller_njcbl_107[data-density=comfortable] ._threadLoadStatus_njcbl_177{padding:16px 18px}._threadExpansionSummary_njcbl_175{display:grid;gap:10px}._threadExpansionHeader_njcbl_192{display:flex;justify-content:space-between;gap:12px;align-items:center}._threadExpansionHeader_njcbl_192>div:first-child{display:grid;gap:4px}._snapshotLabel_njcbl_194{width:fit-content;padding:2px 7px;border-radius:999px;background:var(--surface-selected, var(--dashboard-surface-soft))}._threadSummaryStrip_njcbl_195{display:grid;grid-template-columns:repeat(8,minmax(92px,1fr));gap:8px;margin:0}._threadSummaryStrip_njcbl_195>div{min-width:0}._threadSummaryStrip_njcbl_195 dt{color:var(--ink-muted, var(--dashboard-muted));font-size:11px}._threadSummaryStrip_njcbl_195 dd{margin:2px 0 0;font-size:12px;font-weight:600}._threadExpansionSummary_njcbl_175 span,._threadCallIdentity_njcbl_200 span,._threadCallSignals_njcbl_201{color:var(--ink-muted, var(--dashboard-muted));font-size:12px}._threadCallControls_njcbl_202{display:flex;gap:8px}._threadCallControls_njcbl_202 label{display:grid;gap:4px;font-size:12px}._threadCallEvidence_njcbl_176{display:grid;grid-template-columns:minmax(180px,1.4fr) repeat(3,minmax(100px,.8fr)) auto;gap:10px;align-items:center}._threadCallIdentity_njcbl_200,._threadCallSignals_njcbl_201{display:grid;gap:4px}._threadCallActions_njcbl_214{display:flex;gap:6px}._threadCallRecommendation_njcbl_215{grid-column:1 / -1;margin:0}._threadContextBar_njcbl_216{grid-column:1 / -1;height:4px;overflow:hidden;border-radius:2px;background:var(--surface-selected, var(--dashboard-surface-soft))}._threadContextBar_njcbl_216>span{display:block;height:100%}._threadLoadStatus_njcbl_177{display:flex;min-height:52px;gap:10px;align-items:center;color:var(--ink-muted, var(--dashboard-muted))}._gridFooter_njcbl_45{justify-content:space-between;min-height:44px;padding:7px 10px;color:var(--ink-muted, var(--dashboard-muted));font-size:12px}@media(max-width:1120px){._headerActions_njcbl_43{flex-wrap:wrap}}@media(max-width:1400px){._pageHeader_njcbl_5{display:grid;gap:10px}._headerActions_njcbl_43{justify-content:flex-start}}@media(max-width:760px){._pageHeader_njcbl_5,._tableHeading_njcbl_6{display:grid}._headerActions_njcbl_43,._tableActions_njcbl_44{justify-content:flex-start}._queryBar_njcbl_61{grid-template-columns:minmax(0,1fr)}._gridFooter_njcbl_45{align-items:flex-start}._accordionHeader_njcbl_116,._accordionItem_njcbl_142{min-width:0}._threadRow_njcbl_131>div[role=gridcell]:not(:first-of-type),._accordionHeader_njcbl_116>div:not(:first-child){display:none}._threadRow_njcbl_131>div[role=gridcell]:first-of-type,._accordionHeader_njcbl_116>div:first-child{width:100%!important}._threadExpansionSummary_njcbl_175,._threadCallEvidence_njcbl_176{grid-template-columns:minmax(0,1fr)}._threadExpansionHeader_njcbl_192{align-items:stretch}._threadSummaryStrip_njcbl_195{grid-template-columns:repeat(2,minmax(0,1fr))}._threadCallControls_njcbl_202{display:grid;grid-template-columns:1fr 1fr}._threadCallControls_njcbl_202 select,._threadCallEvidence_njcbl_176 button,._threadExpansionSummary_njcbl_175 button,._threadLoadStatus_njcbl_177 button{min-height:44px}} +._accordionGrid_11j7i_1{min-width:0}._visuallyHidden_11j7i_3{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}._accordionScroller_11j7i_15{position:relative;height:620px;overflow:auto;border:1px solid var(--line-subtle, var(--dashboard-border));border-radius:8px;background:var(--surface-panel, var(--dashboard-surface))}._accordionHeaderGroup_11j7i_24{position:sticky;z-index:4;top:0}._accordionHeader_11j7i_24{display:flex;min-width:max(720px,100%);min-height:42px;color:var(--ink-muted, var(--dashboard-muted));background:var(--surface-subtle, #eef1f5);border-bottom:1px solid var(--line-subtle, var(--dashboard-border));font-size:11px;font-weight:750}._accordionHeader_11j7i_24>div,._threadRow_11j7i_42>div[role=gridcell]{display:flex;flex:1 0 auto;align-items:center;box-sizing:border-box;min-width:0;overflow:hidden}._sortHeader_11j7i_51{display:flex;width:100%;min-width:0;align-items:center;gap:6px;padding:0;color:inherit;background:transparent;border:0;border-radius:5px;font:inherit;font-weight:inherit;text-align:left;cursor:pointer}._sortHeader_11j7i_51:hover{color:var(--signal-info-ink, var(--dashboard-accent-strong))}._sortHeader_11j7i_51:focus-visible{outline:2px solid var(--signal-info, var(--dashboard-accent));outline-offset:2px}._headerLabel_11j7i_77,._threadCellContent_11j7i_78{display:block;flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._sortIndicator_11j7i_87{flex:0 0 auto;margin-left:auto;opacity:.65}._disclosureSpacer_11j7i_93,._disclosureChevron_11j7i_94{flex:0 0 16px;width:16px}._identityHeaderCell_11j7i_99,._threadIdentityCell_11j7i_100{position:sticky;z-index:5;left:0;background:inherit;box-shadow:1px 0 0 var(--line-subtle, var(--dashboard-border)),8px 0 14px -14px currentColor}._identityHeaderCell_11j7i_99{z-index:6;background:var(--surface-subtle, #eef1f5)}._threadIdentityCell_11j7i_100{gap:6px}._threadRow_11j7i_42 .thread-name-cell,._threadRow_11j7i_42 .model-pill,._threadRow_11j7i_42 .status-badge{display:block;width:100%;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._threadRow_11j7i_42 .table-placeholder{color:var(--ink-muted, var(--dashboard-muted));font-weight:700}._accordionCanvas_11j7i_131{position:relative;min-width:max(720px,100%)}._threadCallsRegion_11j7i_132{position:relative}._accordionScroller_11j7i_15[data-density=compact] ._accordionHeader_11j7i_24>div,._accordionScroller_11j7i_15[data-density=compact] ._threadRow_11j7i_42>div[role=gridcell]{padding:6px 8px}._accordionScroller_11j7i_15[data-density=comfortable] ._accordionHeader_11j7i_24>div,._accordionScroller_11j7i_15[data-density=comfortable] ._threadRow_11j7i_42>div[role=gridcell]{padding:12px}._accordionItem_11j7i_140{position:absolute;inset-inline:0;display:grid;min-width:max(720px,100%);box-sizing:border-box}._threadRow_11j7i_42{display:flex;min-height:52px;cursor:pointer;background:var(--surface-panel, var(--dashboard-surface));border-bottom:1px solid var(--line-subtle, var(--dashboard-border))}._threadRow_11j7i_42:hover{background:var(--surface-subtle, #f5f7fa)}._threadRow_11j7i_42:focus-visible{z-index:3;outline:3px solid var(--signal-info, var(--dashboard-accent));outline-offset:-3px}._expandedThreadRow_11j7i_164{box-shadow:inset 4px 0 0 var(--signal-info, var(--dashboard-accent));background:var(--surface-selected, var(--dashboard-surface-soft))}._disclosureChevron_11j7i_94{font-size:20px;line-height:1;text-align:center;transition:transform .12s ease}._expandedThreadRow_11j7i_164 ._disclosureChevron_11j7i_94{transform:rotate(90deg)}._threadExpansionSummary_11j7i_172,._threadCallEvidence_11j7i_173,._threadLoadStatus_11j7i_174{padding:12px 16px;border-bottom:1px solid var(--line-subtle, var(--dashboard-border));background:var(--surface-panel, var(--dashboard-surface))}._accordionScroller_11j7i_15[data-density=compact] ._threadExpansionSummary_11j7i_172,._accordionScroller_11j7i_15[data-density=compact] ._threadCallEvidence_11j7i_173,._accordionScroller_11j7i_15[data-density=compact] ._threadLoadStatus_11j7i_174{padding:8px 12px}._accordionScroller_11j7i_15[data-density=comfortable] ._threadExpansionSummary_11j7i_172,._accordionScroller_11j7i_15[data-density=comfortable] ._threadCallEvidence_11j7i_173,._accordionScroller_11j7i_15[data-density=comfortable] ._threadLoadStatus_11j7i_174{padding:16px 18px}._threadExpansionSummary_11j7i_172{display:grid;gap:10px}._threadExpansionHeader_11j7i_189{display:flex;justify-content:space-between;gap:12px;align-items:center}._threadExpansionHeader_11j7i_189>div:first-child{display:grid;gap:4px}._snapshotLabel_11j7i_191{width:fit-content;padding:2px 7px;border-radius:999px;background:var(--surface-selected, var(--dashboard-surface-soft))}._threadSummaryStrip_11j7i_192{display:grid;grid-template-columns:repeat(8,minmax(92px,1fr));gap:8px;margin:0}._threadSummaryStrip_11j7i_192>div{min-width:0}._threadSummaryStrip_11j7i_192 dt{color:var(--ink-muted, var(--dashboard-muted));font-size:11px}._threadSummaryStrip_11j7i_192 dd{margin:2px 0 0;font-size:12px;font-weight:600}._threadExpansionSummary_11j7i_172 span,._threadCallIdentity_11j7i_197 span,._threadCallSignals_11j7i_198{color:var(--ink-muted, var(--dashboard-muted));font-size:12px}._threadCallControls_11j7i_199{display:flex;gap:8px}._threadCallControls_11j7i_199 label{display:grid;gap:4px;font-size:12px}._threadCallEvidence_11j7i_173{display:grid;grid-template-columns:minmax(180px,1.4fr) repeat(3,minmax(100px,.8fr)) auto;gap:10px;align-items:center}._threadCallIdentity_11j7i_197,._threadCallSignals_11j7i_198{display:grid;gap:4px}._threadCallActions_11j7i_211{display:flex;gap:6px}._threadCallRecommendation_11j7i_212{grid-column:1 / -1;margin:0}._threadContextBar_11j7i_213{grid-column:1 / -1;height:4px;overflow:hidden;border-radius:2px;background:var(--surface-selected, var(--dashboard-surface-soft))}._threadContextBar_11j7i_213>span{display:block;height:100%}._threadLoadStatus_11j7i_174{display:flex;min-height:52px;gap:10px;align-items:center;color:var(--ink-muted, var(--dashboard-muted))}@media(prefers-reduced-motion:reduce){._disclosureChevron_11j7i_94{transition:none}}@media(max-width:760px){._accordionHeader_11j7i_24,._accordionItem_11j7i_140{min-width:0}._threadRow_11j7i_42>div[role=gridcell]:not(:first-of-type),._accordionHeader_11j7i_24>div:not(:first-child){display:none}._threadRow_11j7i_42>div[role=gridcell]:first-of-type,._accordionHeader_11j7i_24>div:first-child{width:100%!important}._identityHeaderCell_11j7i_99,._threadIdentityCell_11j7i_100{position:static}._threadExpansionSummary_11j7i_172,._threadCallEvidence_11j7i_173{grid-template-columns:minmax(0,1fr)}._threadExpansionHeader_11j7i_189{align-items:stretch}._threadSummaryStrip_11j7i_192{grid-template-columns:repeat(2,minmax(0,1fr))}._threadCallControls_11j7i_199{display:grid;grid-template-columns:1fr 1fr}._threadCallControls_11j7i_199 select,._threadCallEvidence_11j7i_173 button,._threadExpansionSummary_11j7i_172 button,._threadLoadStatus_11j7i_174 button{min-height:44px}}._page_19h34_1{gap:14px}._pageHeader_19h34_5,._tableHeading_19h34_6{display:flex;align-items:center;justify-content:space-between;gap:18px;min-width:0}._pageHeader_19h34_5>div:first-child{min-width:0;max-width:780px}._pageHeader_19h34_5 h1,._tableHeading_19h34_6 h2{margin:0;color:var(--ink-strong, var(--dashboard-text))}._pageHeader_19h34_5 h1{font-size:28px}._pageHeader_19h34_5 p:not(._eyebrow_19h34_29),._tableHeading_19h34_6 p{margin:5px 0 0;color:var(--ink-muted, var(--dashboard-muted))}._eyebrow_19h34_29{margin:0 0 4px;color:var(--signal-info-ink, var(--dashboard-accent-strong));font-size:11px;font-weight:800;text-transform:uppercase}._headerActions_19h34_43,._tableActions_19h34_44,._gridFooter_19h34_45{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}._headerActions_19h34_43{flex-wrap:nowrap}._headerActions_19h34_43 .toolbar-button{white-space:nowrap}._queryBar_19h34_61{display:grid;grid-template-columns:minmax(260px,1fr) minmax(150px,220px);gap:10px;align-items:end;padding:10px;border:1px solid var(--line-subtle, var(--dashboard-border));border-radius:8px;background:var(--surface-panel, var(--dashboard-surface))}._queryBar_19h34_61 .search-box,._queryBar_19h34_61 .filter-field{min-width:0}._tableHeading_19h34_6{align-items:end}._tableHeading_19h34_6 h2{font-size:16px}._tableHeading_19h34_6 p{font-size:12px}._evidenceSurface_19h34_89{min-width:0}._gridFooter_19h34_45{justify-content:space-between;min-height:44px;padding:7px 10px;color:var(--ink-muted, var(--dashboard-muted));font-size:12px}@media(max-width:1120px){._headerActions_19h34_43{flex-wrap:wrap}}@media(max-width:1400px){._pageHeader_19h34_5{display:grid;gap:10px}._headerActions_19h34_43{justify-content:flex-start}}@media(max-width:760px){._pageHeader_19h34_5,._tableHeading_19h34_6{display:grid}._headerActions_19h34_43,._tableActions_19h34_44{justify-content:flex-start}._queryBar_19h34_61{grid-template-columns:minmax(0,1fr)}._gridFooter_19h34_45{align-items:flex-start}} diff --git a/src/codex_usage_tracker/plugin_data/dashboard/react/assets/ThreadsPage.js b/src/codex_usage_tracker/plugin_data/dashboard/react/assets/ThreadsPage.js index 64a9c673..a9325bff 100644 --- a/src/codex_usage_tracker/plugin_data/dashboard/react/assets/ThreadsPage.js +++ b/src/codex_usage_tracker/plugin_data/dashboard/react/assets/ThreadsPage.js @@ -1,6 +1,6 @@ -import{j as t,r as m}from"./dashboard-react.js";import{u as Te}from"./useInfiniteQuery.js";import{c as at,t as rt,p as Me,f as nt,m as ot,C as it,a as st,u as $e,D as lt,b as ct,d as dt,r as ht,e as ut,g as mt}from"./App.js";import{t as ft,a as gt}from"./exploreQueries.js";import{E as pt,e as xt}from"./ExploreWorkspaceSwitcher.js";import{u as bt,E as yt,a as jt}from"./EvidenceGridControls.js";import{r as wt}from"./filtering.js";import{t as Ct}from"./threadSummaryAdapter.js";import{v as Ee,V as ke}from"./UsageConstellation.js";import{S as _e}from"./StatusBadge.js";import{P as St}from"./PageLoadProgress.js";import{S as vt}from"./Primitives.js";import{u as Tt,g as kt,a as _t,f as ue}from"./index2.js";import{s as Pe}from"./rowActionEvents.js";import{S as De}from"./search.js";import"./useBaseQuery.js";import"./locale-zh-Hans.js";import"./dashboardRouter.js";import"./router.js";import"./queryOptions.js";import"./infiniteQueryOptions.js";import"./triangle-alert.js";/** +import{j as t,r as m}from"./dashboard-react.js";import{u as Te}from"./useInfiniteQuery.js";import{c as ot,t as it,p as Ie,f as st,m as lt,C as ct,a as dt,u as De,D as ht,b as ut,d as mt,r as ft,e as pt,g as gt}from"./App.js";import{t as xt,a as bt}from"./exploreQueries.js";import{E as yt,e as Ct}from"./ExploreWorkspaceSwitcher.js";import{u as jt,E as wt,a as St}from"./EvidenceGridControls.js";import{r as vt}from"./filtering.js";import{t as _t}from"./threadSummaryAdapter.js";import{v as Ee,V as ke}from"./UsageConstellation.js";import{S as Pe}from"./StatusBadge.js";import{P as Tt}from"./PageLoadProgress.js";import{S as kt}from"./Primitives.js";import{u as Pt,g as Nt,a as Ft,f as fe}from"./index2.js";import{s as Ne}from"./rowActionEvents.js";import{S as He}from"./search.js";import"./useBaseQuery.js";import"./locale-zh-Hans.js";import"./dashboardRouter.js";import"./router.js";import"./queryOptions.js";import"./infiniteQueryOptions.js";import"./triangle-alert.js";/** * @license lucide-react v0.468.0 - ISC * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. - */const Pt=at("RotateCcw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]),Nt=new Set(["all","High","Medium","Low"]);function Ft(e){const a=[],r=[e.localQuery.trim(),e.globalQuery.trim()].filter(Boolean);r.length&&a.push(`Search ${r.map(o=>`"${o}"`).join(" + ")}`),e.riskFilter!=="all"&&a.push(`Cold risk ${e.riskFilter}`),e.selectedThreadName&&a.push(`Selected ${e.selectedThreadName}`);const n=`Showing ${e.shownCount.toLocaleString()} of ${e.totalCount.toLocaleString()} grouped threads`;return a.length?`${n} - Filters: ${a.join("; ")}`:n}function Rt(e,{localQuery:a,globalQuery:r,riskFilter:n}){if(n!=="all"&&e.coldResumeRisk!==n)return!1;const o=[e.name,e.coldResumeRisk,e.totalTokens,e.cost,e.cachePct];return[r,a].every(l=>wt(o,l))}function Ie(e){return Nt.has(e)?e:"all"}const q=250,re="__detail_first__",Lt=new Set(["newest","duration","gap","initiator","model","effort","tokens","cached","uncached","output","reasoning","cost","cache"]),pe=new Set(rt.map(e=>e.id).filter(e=>e!=="investigate"));function Mt(e=window.location.href){var a;return((a=new URL(e).searchParams.get("thread"))==null?void 0:a.trim())||null}function $t(e=window.location.href){const a=Mt(e);if(a)return a;const r=Vt(e);return r||(O("detail",e)==="first"?re:null)}function O(e,a=window.location.href){var r;return((r=new URL(a).searchParams.get(e))==null?void 0:r.trim())??""}function He(e=window.location.href){return Ie(O("risk",e))}function Ve(e,a){return e.filter(r=>Rt(r,a))}function fe(e,a){const r=a[0];return!r||!pe.has(r.id)?[...e]:[...e].sort((n,o)=>Bt(n,o,r.id,r.desc))}function ze(e=window.location.href){const a=zt(O("sort",e));return pe.has(a)?[{id:a,desc:O("direction",e)==="desc"}]:[]}function Et(e,a=window.location.href){const r=Number(O("page",a)||1);return Number.isFinite(r)&&r>1?Math.floor(r)*e:e}function Dt(e=window.location.href){return Ae(O("thread_call_sort",e))}function It(e,a=window.location.href){const r=O("thread_call_direction",a).toLowerCase();return r==="asc"||r==="desc"?r:ie(e)}function Ae(e){const a=At(e);return Lt.has(a)?a:"newest"}function ie(e){return e==="cache"||e==="effort"||e==="initiator"||e==="model"?"asc":"desc"}function Be(e,a=window.location.href){const r=new URL(a);r.searchParams.set("view","threads"),r.searchParams.delete("record"),r.searchParams.delete("detail"),r.searchParams.delete("expand"),r.searchParams.delete("threads"),r.searchParams.delete("thread_call_page");const n=e.sorting[0],o=n&&pe.has(n.id)?n.id:"";return ee(r,"thread_q",e.localQuery.trim(),""),ee(r,"risk",e.riskFilter,"all"),ee(r,"thread",e.selectedThreadName??"",""),ee(r,"sort",o,""),ee(r,"direction",o?n!=null&&n.desc?"desc":"asc":"",""),ee(r,"page",String(Ht(e.visibleRowCount,q)),"1"),ee(r,"thread_call_sort",e.selectedThreadName?e.threadCallSort:"","newest"),ee(r,"thread_call_direction",e.selectedThreadName?e.threadCallSortDirection:"",ie(e.threadCallSort)),r}function Ht(e,a){return Math.max(1,Math.ceil(Math.max(e,a)/a))}function Vt(e){var o,l;const a=new URL(e).searchParams,r=(o=a.get("expand"))==null?void 0:o.trim();if(r==="first"||r==="all")return re;const n=(l=a.get("threads"))==null?void 0:l.split(",").map(c=>c.trim()).filter(Boolean);return(n==null?void 0:n[0])??null}function zt(e){return e==="total"?"totalTokens":e==="usage"?"credits":e==="cache"?"cachePct":e==="context"?"contextPct":e}function At(e){return e==="time"?"newest":e==="total"?"tokens":e}function Bt(e,a,r,n){const o=Ut(Ne(e,r),Ne(a,r));return(n?-o:o)||e.name.localeCompare(a.name)}function Ne(e,a){if(a==="latestActivity")return e.latestActivityRaw||e.latestActivity;if(a==="totalDuration")return e.totalDurationSeconds;if(a==="averageGap")return e.averageGapSeconds;const r=e[a];return typeof r=="number"||typeof r=="string"?typeof r=="string"?r.toLowerCase():r:null}function Ut(e,a){return e===null&&a===null?0:e===null?1:a===null?-1:typeof e=="string"||typeof a=="string"?String(e).localeCompare(String(a)):e-a}function ee(e,a,r,n){if(!r||r===n){e.searchParams.delete(a);return}e.searchParams.set(a,r)}const Gt={name:"thread",latestActivity:"time",turns:"calls",totalTokens:"tokens",cachePct:"cache"};function Wt(e){const a=e.sorting[0],r=a?Gt[a.id]:"tokens",n=Qt(e,r);return{enabled:!n,reason:n,query:e.localQuery.trim()||e.globalQuery.trim(),sort:r??"tokens",direction:a?a.desc?"desc":"asc":"desc"}}function Qt(e,a){return!e.enabled||e.runtime.fileMode||!e.runtime.apiToken?"Stored snapshot":e.globalQuery.trim()&&e.localQuery.trim()?"Multiple searches use loaded snapshot":e.riskFilter!=="all"?"Risk filter uses loaded snapshot":a?"":"This sort uses loaded snapshot"}function qt(e,a,r){const n=e.map(o=>({id:o.name,thread:o.name,inputTokens:o.cachedInput+o.uncachedInput,cachePercent:o.cachePct,credits:o.credits,totalTokens:o.totalTokens}));return{schema:Ee,id:"thread-cache-frontier",title:"Cache efficiency frontier",description:"Threads further right carry more input; threads lower on the plot reuse less of it.",state:Ue(n.length,"No threads match the current scope."),scope:{label:`${e.length.toLocaleString()} loaded threads`,rowCount:n.length,historyScope:a},freshness:{generatedAt:r||Yt(e),sourceRevision:r},caveats:["Credits and cost remain estimates when exact rate metadata is unavailable."],accessibility:{summary:Jt(e),keyboardInstructions:"Use arrow keys to move between threads; press Enter to synchronize the selected row."},table:{caption:"Cache efficiency by thread",columns:[{field:"thread",label:"Thread",type:"text"},{field:"inputTokens",label:"Input tokens",type:"number",unit:"tokens",align:"right"},{field:"cachePercent",label:"Cache",type:"number",unit:"percent",align:"right"},{field:"credits",label:"Credits",type:"number",unit:"credits",align:"right"},{field:"totalTokens",label:"Total tokens",type:"number",unit:"tokens",align:"right"}],defaultSort:{field:"totalTokens",direction:"desc"}},interactions:{selection:{keyField:"id",labelField:"thread"},zoom:{axis:"both"},brush:{axis:"both"}},annotations:[{id:"cache-floor",label:"35% review floor",kind:"reference-line",axis:"y",value:35,severity:"warning"}],kind:"cartesian",data:{rows:n},axes:{x:{field:"inputTokens",label:"Input tokens",type:"number",unit:"tokens",min:0},y:{field:"cachePercent",label:"Cache reuse",type:"number",unit:"percent",min:0,max:100}},series:[{id:"threads",label:"Threads",mark:"point",xField:"inputTokens",yField:"cachePercent",color:"#2f6fed"}]}}function Ot(e,a,r,n){var S;const o=[...e].sort((g,f)=>ce(g)-ce(f)),l=ce(o[0]),c=o.map((g,f)=>({id:g.id,call:`Call ${f+1}`,elapsedMinutes:Math.max(0,Math.round((ce(g)-l)/6e4)),contextPercent:g.contextWindowPct,cachePercent:g.cachedPct,totalTokens:g.totalTokens,event:Xt(g,f)})),C=c.filter(g=>typeof g.contextPercent=="number");return{schema:Ee,id:"selected-thread-lifecycle",title:"Thread lifecycle",description:"Context pressure and cache reuse across the selected thread.",state:Ue(C.length,"Context-window evidence is unavailable for this thread."),scope:{label:a||"No thread selected",rowCount:c.length,historyScope:r},freshness:{generatedAt:n||((S=o.at(-1))==null?void 0:S.eventTimestamp)||"",sourceRevision:n},caveats:["Lifecycle labels are inferred from aggregate timing, cache, and context fields."],accessibility:{summary:Kt(o,a),keyboardInstructions:"Use left and right arrow keys to move through calls in lifecycle order."},table:{caption:"Selected thread lifecycle calls",columns:[{field:"call",label:"Call",type:"text"},{field:"elapsedMinutes",label:"Elapsed",type:"number",unit:"count",align:"right"},{field:"contextPercent",label:"Context",type:"number",unit:"percent",align:"right"},{field:"cachePercent",label:"Cache",type:"number",unit:"percent",align:"right"},{field:"totalTokens",label:"Tokens",type:"number",unit:"tokens",align:"right"},{field:"event",label:"Lifecycle event",type:"text",localizeValues:!0}]},interactions:{selection:{keyField:"id",labelField:"call"},zoom:{axis:"x"}},kind:"cartesian",data:{rows:c},axes:{x:{field:"elapsedMinutes",label:"Minutes since first call",type:"number",unit:"count",min:0},y:{field:"contextPercent",label:"Context / cache",type:"number",unit:"percent",min:0,max:100}},series:[{id:"context",label:"Context window",mark:"line",xField:"elapsedMinutes",yField:"contextPercent",color:"#7651c9"},{id:"cache",label:"Cache reuse",mark:"line",xField:"elapsedMinutes",yField:"cachePercent",color:"#16866b"}]}}function Ue(e,a){return e?{kind:"ready"}:{kind:"empty",message:a}}function Yt(e){var a;return((a=[...e].sort((r,n)=>Date.parse(n.latestActivityRaw)-Date.parse(r.latestActivityRaw))[0])==null?void 0:a.latestActivityRaw)||""}function Jt(e){const a=e.filter(r=>r.cachePct<35&&r.totalTokens>=5e4).length;return a?`${a} loaded threads combine at least 50,000 tokens with less than 35 percent cache reuse.`:"No loaded high-token thread falls below the 35 percent cache review floor."}function Kt(e,a){if(!e.length)return`No loaded calls are available for ${a||"the selected thread"}.`;const r=Math.max(...e.map(n=>n.contextWindowPct??0));return`${e.length} calls are available for ${a}; peak observed context use is ${r.toFixed(1)} percent.`}function Xt(e,a){return a===0?"Thread start":e.previousCallGapSeconds>=3600?"Cold resume":(e.contextWindowPct??0)>=80?"Context pressure":e.cachedPct>=60?"Warm continuation":"Continuation"}function ce(e){if(!e)return 0;const a=Date.parse(e.eventTimestamp||e.rawTime||e.time);return Number.isFinite(a)?a:0}function Ge(e,a){return ge(a)-ge(e)}function Zt(e,a,r){return[...e].sort((n,o)=>{const l=na(Le(n,a),Le(o,a));return(r==="asc"?l:-l)||Ge(n,o)||n.id.localeCompare(o.id)})}function Fe(e,a){const r=e.trim(),n=a.trim();return r===n||r.startsWith(n)||n.startsWith(r)}function ea(e){return`${new Intl.NumberFormat("en-US",{maximumFractionDigits:2}).format(e)} credits`}function Re(e){return e.contextWindowPct==null?"-":Me(e.contextWindowPct)}function ta(e){return e.cost<=0?"No configured price":e.pricingEstimated?"Best-guess estimate":"Configured price"}function aa(e){return e==null?"low":e>=65?"high":e>=35?"medium":"low"}function ra(e){return e==null||!Number.isFinite(e)?"0%":`${Math.round(oa(e,0,100))}%`}function ge(e){const a=Date.parse(e.rawTime||e.time);return Number.isFinite(a)?a:0}function Le(e,a){return a==="duration"?e.durationSeconds:a==="gap"?e.previousCallGapSeconds:a==="initiator"?e.initiator.toLowerCase():a==="model"?e.model.toLowerCase():a==="effort"?e.effort.toLowerCase():a==="tokens"?e.totalTokens:a==="cached"?e.cachedInput:a==="uncached"?e.uncachedInput:a==="output"?e.output:a==="reasoning"?e.reasoningOutput:a==="cost"?e.cost:a==="cache"?e.cachedPct:ge(e)}function na(e,a){return typeof e=="number"&&typeof a=="number"?e-a:String(e).localeCompare(String(a))}function oa(e,a,r){return Math.min(Math.max(e,a),r)}function ia(e,a){const r=e.length?e.flatMap(o=>o.rows):a,n=new Set;return r.filter(o=>n.has(o.id)?!1:(n.add(o.id),!0))}function sa(e){return e.expanded&&e.enabled&&e.hasNextPage&&!e.isFetchingNextPage&&!e.isFetchNextPageError}const la="_page_njcbl_1",ca="_pageHeader_njcbl_5",da="_tableHeading_njcbl_6",ha="_eyebrow_njcbl_29",ua="_headerActions_njcbl_43",ma="_tableActions_njcbl_44",fa="_gridFooter_njcbl_45",ga="_queryBar_njcbl_61",pa="_evidenceSurface_njcbl_89",xa="_accordionGrid_njcbl_93",ba="_visuallyHidden_njcbl_95",ya="_accordionScroller_njcbl_107",ja="_accordionHeaderGroup_njcbl_116",wa="_accordionHeader_njcbl_116",Ca="_threadRow_njcbl_131",Sa="_accordionCanvas_njcbl_133",va="_threadCallsRegion_njcbl_134",Ta="_accordionItem_njcbl_142",ka="_expandedThreadRow_njcbl_163",_a="_disclosureChevron_njcbl_168",Pa="_threadExpansionSummary_njcbl_175",Na="_threadCallEvidence_njcbl_176",Fa="_threadLoadStatus_njcbl_177",Ra="_threadExpansionHeader_njcbl_192",La="_snapshotLabel_njcbl_194",Ma="_threadSummaryStrip_njcbl_195",$a="_threadCallIdentity_njcbl_200",Ea="_threadCallSignals_njcbl_201",Da="_threadCallControls_njcbl_202",Ia="_threadCallActions_njcbl_214",Ha="_threadCallRecommendation_njcbl_215",Va="_threadContextBar_njcbl_216",d={page:la,pageHeader:ca,tableHeading:da,eyebrow:ha,headerActions:ua,tableActions:ma,gridFooter:fa,queryBar:ga,evidenceSurface:pa,accordionGrid:xa,visuallyHidden:ba,accordionScroller:ya,accordionHeaderGroup:ja,accordionHeader:wa,threadRow:Ca,accordionCanvas:Sa,threadCallsRegion:va,accordionItem:Ta,expandedThreadRow:ka,disclosureChevron:_a,threadExpansionSummary:Pa,threadCallEvidence:Na,threadLoadStatus:Fa,threadExpansionHeader:Ra,snapshotLabel:La,threadSummaryStrip:Ma,threadCallIdentity:$a,threadCallSignals:Ea,threadCallControls:Da,threadCallActions:Ia,threadCallRecommendation:Ha,threadContextBar:Va};function za({callSort:e,callSortDirection:a,onCallSortChange:r,onCallSortDirectionChange:n}){return t.jsxs("div",{className:d.threadCallControls,children:[t.jsxs("label",{children:[t.jsx("span",{children:"Sort calls"}),t.jsxs("select",{"aria-label":"Sort thread calls",value:e,onChange:o=>r(o.target.value),children:[t.jsx("option",{value:"newest",children:"Newest"}),t.jsx("option",{value:"duration",children:"Duration"}),t.jsx("option",{value:"gap",children:"Previous gap"}),t.jsx("option",{value:"initiator",children:"Initiator"}),t.jsx("option",{value:"model",children:"Model"}),t.jsx("option",{value:"effort",children:"Effort"}),t.jsx("option",{value:"tokens",children:"Most tokens"}),t.jsx("option",{value:"cached",children:"Cached input"}),t.jsx("option",{value:"uncached",children:"Uncached input"}),t.jsx("option",{value:"output",children:"Output"}),t.jsx("option",{value:"reasoning",children:"Reasoning"}),t.jsx("option",{value:"cost",children:"Highest cost"}),t.jsx("option",{value:"cache",children:"Lowest cache"})]})]}),t.jsxs("label",{children:[t.jsx("span",{children:"Direction"}),t.jsxs("select",{"aria-label":"Sort thread calls direction",value:a,onChange:o=>n(o.target.value),children:[t.jsx("option",{value:"desc",children:"Descending"}),t.jsx("option",{value:"asc",children:"Ascending"})]})]})]})}function Aa({call:e,onOpenInvestigator:a,onCopyCallLink:r}){const n=`Open investigator for thread call ${e.thread} ${e.model}`,o=`Copy link for thread call ${e.thread} ${e.model}`;return t.jsxs("div",{className:d.threadCallEvidence,children:[t.jsxs("div",{className:d.threadCallIdentity,children:[t.jsx("span",{children:e.time}),t.jsxs("strong",{children:[e.model," / ",e.effort]}),t.jsxs("span",{children:[nt(e.totalTokens)," tokens · ",Me(e.cachedPct)," cache · ",ot(e.cost)]})]}),t.jsxs("div",{className:d.threadCallSignals,children:[t.jsx(it,{call:e}),t.jsxs("span",{children:["Context ",Re(e)]}),t.jsx("span",{children:ta(e)})]}),t.jsx("span",{children:e.duration}),t.jsxs("span",{children:["Prev ",e.previousCallGap]}),t.jsxs("span",{children:[e.initiator||"unknown"," initiated · ",ea(e.credits)]}),t.jsxs("div",{className:d.threadCallActions,children:[t.jsxs("button",{className:"table-action-button",type:"button","aria-label":n,onKeyDown:Pe,onClick:()=>a(e.id),children:[t.jsx(De,{size:14,"aria-hidden":"true"})," Open"]}),t.jsxs("button",{className:"table-action-button",type:"button","aria-label":o,onKeyDown:Pe,onClick:()=>r(e.id),children:[t.jsx(st,{size:14,"aria-hidden":"true"})," Copy"]})]}),e.recommendation?t.jsx("p",{className:d.threadCallRecommendation,children:e.recommendation}):null,t.jsx("div",{className:d.threadContextBar,role:"img","aria-label":`Context use ${Re(e)}`,children:t.jsx("span",{className:aa(e.contextWindowPct),style:{width:ra(e.contextWindowPct)}})})]})}function Ba(e,a,r){return e.flatMap(n=>{const o={key:`thread:${n.name}`,kind:"thread",thread:n};return n.name!==a?[o]:[o,{key:`summary:${n.name}`,kind:"summary",thread:n},...r.map(l=>({key:`call:${l.id}`,kind:"call",call:l})),{key:`status:${n.name}`,kind:"status"}]})}function Ua(e,a){return typeof e=="string"?e:a}function Ga({ariaLabel:e,threads:a,columns:r,sorting:n,onSortingChange:o,preferences:l,expandedThreadName:c,expandedCalls:C,totalCallCount:S,loadingCalls:g,loadingMoreCalls:f,initialError:u=null,storedSnapshot:N=!1,partialError:b,callSort:w,callSortDirection:k,viewportHeight:H=620,onToggleThread:F,onRetryCalls:E,onCallSortChange:W,onCallSortDirectionChange:te,onOpenInvestigator:ae,onCopyCallLink:Q}){var ne;const V=m.useRef(null),A=Tt({columns:r,data:a,state:{sorting:n,columnVisibility:l.columnVisibility},onSortingChange:o,onColumnVisibilityChange:l.setColumnVisibility,getCoreRowModel:_t(),getSortedRowModel:kt(),getRowId:i=>i.name,enableSortingRemoval:!1}),Y=A.getRowModel().rows,_=Ba(Y.map(i=>i.original),c,C),B=l.density==="comfortable",D=i=>{var v;const s=(v=_[i])==null?void 0:v.kind;return s==="call"?B?128:96:s==="summary"?B?140:116:s==="status"?B?56:48:B?56:44},R=bt({count:_.length,getScrollElement:()=>V.current,getItemKey:i=>{var s;return((s=_[i])==null?void 0:s.key)??i},estimateSize:D,measureElement:i=>i.getBoundingClientRect().height,overscan:8,initialRect:{width:1e3,height:H}});m.useEffect(()=>R.measure(),[_.length,l.density,R]);const J=R.getVirtualItems();let y=0;const I=_.map((i,s)=>{const v=D(s),p={key:i.key,index:s,start:y,end:y+v,size:v,lane:0};return y+=v,p}),oe=J.length?J:I.filter(i=>i.start{var X,P;return(P=(X=V.current)==null?void 0:X.querySelector(`[data-item-index="${T}"]`))==null?void 0:P.focus()})}}return t.jsxs("section",{className:d.accordionGrid,children:[t.jsx(yt,{ariaLabel:e,table:A,lockedColumnIds:new Set(["name"]),density:l.density,onDensityChange:l.setDensity,onRestoreDefaults:l.restoreDefaults}),t.jsxs("div",{ref:V,className:d.accordionScroller,style:{height:H},role:"treegrid","aria-label":e,"aria-rowcount":_.length+1,"data-density":l.density,"data-testid":"thread-accordion-scroller","data-layout-scroll":"true","data-virtualized":"true",children:[t.jsx("div",{role:"rowgroup",className:d.accordionHeaderGroup,children:t.jsx("div",{className:d.accordionHeader,role:"row",style:{width:h},children:(ne=A.getHeaderGroups()[0])==null?void 0:ne.headers.map(i=>{const s=i.column.getIsSorted(),v=Ua(i.column.columnDef.header,i.column.id);return t.jsx("div",{role:"columnheader","aria-sort":s==="asc"?"ascending":s==="desc"?"descending":void 0,style:{width:i.getSize()},children:i.column.getCanSort()?t.jsxs("button",{type:"button","aria-label":`Sort by ${v}`,onClick:i.column.getToggleSortingHandler(),children:[ue(i.column.columnDef.header,i.getContext()),t.jsx("span",{"aria-hidden":"true",children:s==="asc"?" ↑":s==="desc"?" ↓":" ↕"})]}):ue(i.column.columnDef.header,i.getContext())},i.id)})})}),t.jsxs("section",{className:d.threadCallsRegion,role:c?"region":void 0,"aria-labelledby":c?M:void 0,"aria-describedby":c?U:void 0,children:[c?t.jsxs("span",{id:M,className:d.visuallyHidden,children:["Calls for ",c]}):null,t.jsx("div",{className:d.accordionCanvas,role:"rowgroup",style:{height:L,width:h},children:oe.map(i=>{const s=_[i.index];if(!s)return null;const v={transform:`translateY(${i.start}px)`,width:h};if(s.kind==="thread"){const p=Y.find(P=>P.original.name===s.thread.name);if(!p)return null;const T=s.thread.name===c,X=`thread-row-${encodeURIComponent(s.thread.name)}`;return t.jsxs("div",{ref:R.measureElement,id:X,role:"row",className:`${d.accordionItem} ${d.threadRow} ${T?d.expandedThreadRow:""}`,style:{...v,minHeight:D(i.index)},tabIndex:0,"aria-label":`${T?"Collapse":"Expand"} calls for ${s.thread.name}`,"aria-expanded":T,"aria-level":1,"aria-controls":T?G:void 0,"data-accordion-item":!0,"data-index":i.index,"data-item-index":i.index,onClick:P=>{P.detail<2&&F(s.thread.name)},onKeyDown:P=>$(P,s.thread.name,i.index),children:[t.jsx("span",{className:d.disclosureChevron,"aria-hidden":"true",children:"›"}),p.getVisibleCells().map(P=>t.jsx("div",{role:"gridcell",style:{width:P.column.getSize()},children:ue(P.column.columnDef.cell,P.getContext())},P.id))]},s.key)}return s.kind==="summary"?t.jsx("div",{ref:R.measureElement,id:`${G}-summary-row`,role:"row","aria-level":2,"aria-describedby":U,className:d.accordionItem,style:{...v,minHeight:D(i.index)},"data-accordion-item":!0,"data-index":i.index,children:t.jsx("div",{role:"gridcell",children:t.jsxs("section",{id:G,className:d.threadExpansionSummary,children:[t.jsxs("div",{className:d.threadExpansionHeader,children:[t.jsxs("div",{children:[t.jsx("strong",{children:s.thread.name}),t.jsxs("span",{role:"status","aria-live":"polite",children:[t.jsx("span",{children:z}),K?t.jsx("span",{className:d.visuallyHidden,children:K}):null]})]}),t.jsx("button",{type:"button",className:"toolbar-button",onClick:()=>F(s.thread.name),"aria-label":`Collapse calls for ${s.thread.name}`,children:"Collapse"})]}),N?t.jsx("span",{className:d.snapshotLabel,children:"Stored snapshot"}):null,t.jsxs("dl",{className:d.threadSummaryStrip,children:[t.jsxs("div",{children:[t.jsx("dt",{children:"Calls"}),t.jsx("dd",{children:s.thread.turns.toLocaleString()})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Total tokens"}),t.jsx("dd",{children:s.thread.totalTokens.toLocaleString()})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Cached / uncached"}),t.jsxs("dd",{children:[s.thread.cachedInput.toLocaleString()," / ",s.thread.uncachedInput.toLocaleString()]})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Cache ratio"}),t.jsxs("dd",{children:[s.thread.cachePct.toFixed(1),"%"]})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Cost / credits"}),t.jsxs("dd",{children:["$",s.thread.cost.toFixed(2)," / ",s.thread.credits.toLocaleString()]})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Peak context"}),t.jsx("dd",{children:s.thread.contextPct==null?"-":`${s.thread.contextPct.toFixed(1)}%`})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Duration"}),t.jsx("dd",{children:s.thread.totalDuration})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Latest"}),t.jsx("dd",{children:s.thread.latestActivity})]})]}),t.jsx(za,{callSort:w,callSortDirection:k,onCallSortChange:W,onCallSortDirectionChange:te})]})})},s.key):s.kind==="call"?t.jsx("div",{ref:R.measureElement,id:`thread-call-row-${encodeURIComponent(s.call.id)}`,role:"row","aria-level":2,"aria-describedby":U,className:d.accordionItem,style:{...v,minHeight:D(i.index)},"data-accordion-item":!0,"data-index":i.index,children:t.jsx("div",{role:"gridcell",children:t.jsx(Aa,{call:s.call,onOpenInvestigator:ae,onCopyCallLink:Q})})},s.key):t.jsx("div",{ref:R.measureElement,id:`${G}-status-row`,role:"row","aria-level":2,"aria-describedby":U,className:d.accordionItem,style:{...v,minHeight:D(i.index)},"data-accordion-item":!0,"data-index":i.index,children:t.jsx("div",{role:"gridcell",children:t.jsxs("div",{className:d.threadLoadStatus,children:[b||u?t.jsxs(t.Fragment,{children:[t.jsx("span",{children:b??u}),t.jsx("button",{type:"button",onClick:E,"aria-label":"Retry loading thread calls",children:"Retry"})]}):null,!b&&!u&&g?t.jsx("span",{children:"Loading calls"}):null,!b&&!u&&f?t.jsx("span",{children:"Loading more calls"}):null,!b&&!u&&!g&&!f&&!C.length?t.jsx("span",{children:"No aggregate calls are available for this thread."}):null,!b&&!u&&!g&&!f&&C.length&&C.length=S&&C.length?t.jsx("span",{children:"All loaded calls visible"}):null]})})},s.key)})})]})]})]})}function Wa({globalFilters:e,localQuery:a,riskFilter:r,exportDisabled:n,exportStatus:o,filterStatus:l,tableSubtitle:c,tableTitle:C,tableLabel:S,viewMode:g,focusedState:f,selectedCallsState:u,selectedCalls:N,displayedThreads:b,totalMatchedThreads:w,canLoadMoreThreads:k,columns:H,sorting:F,gridPreferences:E,selected:W,frontierSpec:te,lifecycleSpec:ae,callSort:Q,callSortDirection:V,onWorkspaceChange:A,onExport:Y,onClearFilters:_,onLocalQueryChange:B,onRiskFilterChange:D,onViewModeChange:R,onSortingChange:J,onToggleThread:y,onRetryCalls:I,onLoadMoreThreads:oe,onCallSortChange:L,onCallSortDirectionChange:h,onOpenInvestigator:U,onCopyCallLink:G}){const M=$e();return t.jsxs("div",{className:`${d.page} page-grid`,children:[t.jsxs("header",{className:d.pageHeader,children:[t.jsxs("div",{children:[t.jsx("p",{className:d.eyebrow,children:"Evidence explorer"}),t.jsx("h1",{children:"Threads"}),t.jsx("p",{children:"Compare work units, follow lifecycle pressure, and open supporting calls without leaving the evidence surface."})]}),t.jsxs("div",{className:d.headerActions,children:[t.jsx(pt,{current:"threads",onValueChange:z=>{z!=="threads"&&A(z)}}),t.jsxs("button",{className:"toolbar-button",type:"button",onClick:Y,disabled:n,children:[t.jsx(lt,{size:16}),"Export thread calls"]}),t.jsxs("button",{className:"toolbar-button",type:"button","aria-label":"Reset thread view",onClick:_,children:[t.jsx(Pt,{size:16}),"Reset view"]})]})]}),t.jsx(St,{active:f.isFetching||u.isFetching,completed:Number(f.usingFocused)+Number(u.hydrated),total:2,label:"Loading thread summaries and selected calls",error:f.error??u.error,updating:f.usingFocused||u.hydrated}),e,t.jsxs("section",{className:d.queryBar,"aria-label":"Thread filters",children:[t.jsxs("label",{className:"search-box",children:[t.jsx("span",{className:"sr-only",children:"Search threads"}),t.jsx(De,{size:16,"aria-hidden":"true"}),t.jsx("input",{value:a,onChange:z=>B(z.target.value),placeholder:"Search threads, risks, token totals..."})]}),t.jsxs("label",{className:"filter-field",children:[t.jsx("span",{children:"Cold risk"}),t.jsxs("select",{value:r,onChange:z=>D(z.target.value),children:[t.jsx("option",{value:"all",children:"All risks"}),t.jsx("option",{value:"High",children:"High"}),t.jsx("option",{value:"Medium",children:"Medium"}),t.jsx("option",{value:"Low",children:"Low"})]})]})]}),t.jsxs("div",{className:d.tableHeading,children:[t.jsxs("div",{children:[t.jsx("h2",{children:C}),t.jsx("p",{children:o||l||c})]}),t.jsxs("div",{className:d.tableActions,children:[t.jsx(vt,{label:"Thread evidence view",value:g,onValueChange:R,options:[{value:"table",label:M.translateText("Table")},{value:"frontier",label:"Cache frontier"},{value:"lifecycle",label:M.translateText("Lifecycle")}]}),t.jsx(_e,{label:Qa(f.isFetching,f.usingFocused,f.fallbackReason),tone:f.usingFocused?"green":"blue"}),t.jsx(_e,{label:u.isFetching?"Updating thread calls":`${u.count.toLocaleString()} selected calls`,tone:u.hydrated?"green":"blue"})]})]}),t.jsx("div",{children:t.jsxs("section",{className:d.evidenceSurface,"aria-label":"Thread evidence",children:[g==="table"?t.jsxs(t.Fragment,{children:[t.jsx(Ga,{ariaLabel:S,columns:H,threads:b,sorting:F,onSortingChange:J,preferences:E,expandedThreadName:(W==null?void 0:W.name)??null,expandedCalls:N,totalCallCount:u.count,loadingCalls:u.isFetching&&!u.hydrated,loadingMoreCalls:u.isFetchingNextPage,initialError:u.initialError,storedSnapshot:u.storedSnapshot,partialError:u.isFetchNextPageError?`Partial result: ${u.error??"Unable to load remaining calls."}`:null,callSort:Q,callSortDirection:V,onToggleThread:y,onRetryCalls:I,onCallSortChange:L,onCallSortDirectionChange:h,onOpenInvestigator:U,onCopyCallLink:G,viewportHeight:560}),t.jsxs("div",{className:d.gridFooter,"aria-live":"polite",children:[t.jsx("span",{children:M.translateText(`${b.length.toLocaleString()} loaded / ${w.toLocaleString()} matched`)}),k?t.jsx("button",{className:"toolbar-button",type:"button",onClick:oe,disabled:f.isFetchingNextPage,children:f.isFetchingNextPage?"Loading more...":`Load ${q.toLocaleString()} more`}):null]})]}):null,g==="frontier"?t.jsx(ke,{spec:te,height:520,onSelectionChange:y}):null,g==="lifecycle"?t.jsx(ke,{spec:ae,height:520}):null]})})]})}function Qa(e,a,r){return e&&a?"Updating focused threads":e?"Loading focused threads":a?"Focused paged API":r||"Stored snapshot"}function qa(e){const[a,r]=m.useState(()=>O("thread_q")),[n,o]=m.useState(()=>He()),[l,c]=m.useState(()=>$t()),[C,S]=m.useState(()=>ze()),[g,f]=m.useState(()=>Et(q)),u=Dt(),[N,b]=m.useState(()=>u),[w,k]=m.useState(()=>It(u)),[H,F]=m.useState(""),[E,W]=m.useState(""),[te,ae]=m.useState("table"),Q=m.useRef(e);m.useEffect(()=>{Q.current!==e&&(Q.current=e,f(q))},[e]);function V(){f(q)}function A(y){r(y),V()}function Y(y){o(Ie(y)),V()}function _(y){S(I=>typeof y=="function"?y(I):y),V()}function B(){r(""),o("all"),c(null),f(q),b("newest"),k(ie("newest")),window.history.replaceState(null,"",Be({localQuery:"",riskFilter:"all",selectedThreadName:null,sorting:C,visibleRowCount:q,threadCallSort:"newest",threadCallSortDirection:ie("newest")})),W("Thread filters cleared")}function D(y){c(I=>I===y?null:y)}function R(y){const I=Ae(y);b(I),k(ie(I))}function J(y){k(y==="asc"?"asc":"desc")}return{localQuery:a,riskFilter:n,selectedThreadName:l,threadSorting:C,visibleThreadRows:g,threadCallSort:N,threadCallSortDirection:w,exportStatus:H,filterStatus:E,viewMode:te,setSelectedThreadName:c,setVisibleThreadRows:f,setExportStatus:F,setViewMode:ae,updateLocalQuery:A,updateRiskFilter:Y,updateThreadSorting:_,clearThreadFilters:B,toggleThread:D,updateThreadCallSort:R,updateThreadCallSortDirection:J}}function Oa(e,a=""){return fe(Ve(e,{globalQuery:a,localQuery:O("thread_q"),riskFilter:He()}),ze())}function xr(e,a=""){return We(e.calls,Oa(e.threads,a))}function We(e,a){const r=new Map(a.map((l,c)=>[l.name,c])),n=new Map(a.filter(l=>l.latestCallId).map((l,c)=>[l.latestCallId,c])),o=new Map(e.map((l,c)=>[l.id,c]));return e.filter(l=>r.has(l.thread)||n.has(l.id)).sort((l,c)=>(r.get(l.thread)??n.get(l.id)??0)-(r.get(c.thread)??n.get(c.id)??0)||(o.get(l.id)??0)-(o.get(c.id)??0))}function br({model:e,globalQuery:a,onOpenInvestigator:r,onCopyCallLink:n,globalFilters:o,contextRuntime:l,includeArchived:c=!1,sourceKey:C,sourceRevision:S="",focusedEndpointsEnabled:g=!0,onNavigateView:f}){var ye,je,we,Ce,Se,ve;const u=$e(),{localQuery:N,riskFilter:b,selectedThreadName:w,threadSorting:k,visibleThreadRows:H,threadCallSort:F,threadCallSortDirection:E,exportStatus:W,filterStatus:te,viewMode:ae,setSelectedThreadName:Q,setVisibleThreadRows:V,setExportStatus:A,setViewMode:Y,updateLocalQuery:_,updateRiskFilter:B,updateThreadSorting:D,clearThreadFilters:R,toggleThread:J,updateThreadCallSort:y,updateThreadCallSortDirection:I}=qa(a),oe=jt("codexUsageThreadsEvidenceGrid",{density:"compact",columnVisibility:{}}),L=m.useMemo(()=>Wt({runtime:l,enabled:g,globalQuery:a,localQuery:N,riskFilter:b,sorting:k}),[l,g,a,N,b,k]),h=Te({...ft({runtime:l,includeArchived:c,sourceKey:C,sourceRevision:S,query:L.query,sort:L.sort,direction:L.direction,pageSize:q}),enabled:L.enabled,placeholderData:x=>x}),U=m.useMemo(()=>new Map(e.threads.map(x=>[x.name,x])),[e.threads]),G=m.useMemo(()=>{var x;return((x=h.data)==null?void 0:x.pages.flatMap(tt=>tt.rows.map(he=>Ct(he,U.get(he.threadLabel)??U.get(he.threadKey)))))??[]},[h.data,U]),M=L.enabled&&!!h.data,z=M?G:e.threads,K=m.useMemo(()=>Ve(z,{localQuery:N,globalQuery:a,riskFilter:b}),[a,N,b,z]),$=m.useMemo(()=>fe(K,k),[K,k]),ne=M?((je=(ye=h.data)==null?void 0:ye.pages[0])==null?void 0:je.totalMatchedRows)??$.length:e.threads.length,i=m.useMemo(()=>Ft({shownCount:K.length,totalCount:ne,localQuery:N,globalQuery:a,riskFilter:b,selectedThreadName:w}),[a,N,b,w,$.length,ne]),s=u.t("dashboard.top_threads_by_attention","Thread Leaderboard"),v=u.t("dashboard.top_threads_by_attention","Thread leaderboard"),p=w===re?$[0]??null:$.find(x=>x.name===w)??null,T=w===re?(p==null?void 0:p.name)??null:w,X=m.useMemo(()=>p?Zt(e.calls.filter(x=>Fe(x.thread,p.name)),F,E):[],[e.calls,p,F,E]),P=(p==null?void 0:p.threadKey)||((we=X[0])==null?void 0:we.threadKey)||(p==null?void 0:p.name)||"",de=g&&!l.fileMode&&!!l.apiToken&&!!P,j=Te({...gt({runtime:l,includeArchived:c,sourceKey:C,sourceRevision:S,threadKey:P,sort:F==="newest"?"time":F,direction:E}),enabled:de}),xe=((Ce=j.data)==null?void 0:Ce.pages)??[],se=m.useMemo(()=>ia(xe,X),[xe,X]),Qe=((ve=(Se=j.data)==null?void 0:Se.pages[0])==null?void 0:ve.totalMatchedRows)??se.length,qe=ct,Oe=m.useMemo(()=>qt($,c?"all":"active",S),[c,$,S]),Z=p??$[0]??null,be=p?se:Z?e.calls.filter(x=>Fe(x.thread,Z.name)).sort(Ge):[],Ye=m.useMemo(()=>Ot(be,(Z==null?void 0:Z.name)??"",c?"all":"active",S),[c,be,Z==null?void 0:Z.name,S]);m.useEffect(()=>{w===re&&T&&Q(T)},[w,T]),m.useEffect(()=>{const x=Be({localQuery:N,riskFilter:b,selectedThreadName:T,sorting:k,visibleRowCount:H,threadCallSort:F,threadCallSortDirection:E});x.toString()!==window.location.href&&window.history.replaceState(null,"",x)},[N,b,T,F,E,k,H]);function Je(){const x=We(e.calls,fe(K,k));dt(`codex-thread-filtered-calls-${mt()}.csv`,ht(x,ut)),A(`Exported ${x.length} calls`)}function Ke(x){x!=="threads"&&(window.history.replaceState(null,"",xt(x)),f("calls"))}const le=M?$:$.slice(0,H),Xe=M?!!h.hasNextPage:le.length<$.length;m.useEffect(()=>{!L.enabled||!h.data||!w||w===re||p||!h.hasNextPage||h.isFetchingNextPage||h.isFetchNextPageError||h.fetchNextPage()},[L.enabled,h.data,h.hasNextPage,h.isFetchNextPageError,h.isFetchingNextPage,p,w]),m.useEffect(()=>{L.enabled&&(!h.data||h.isFetching||h.isFetchingNextPage||h.hasNextPage)||w&&w!==re&&!le.some(x=>x.name===w)&&Q(null)},[le,L.enabled,h.data,h.hasNextPage,h.isFetching,h.isFetchingNextPage,w]),m.useEffect(()=>{sa({expanded:!!p,enabled:de,hasNextPage:!!j.hasNextPage,isFetchingNextPage:j.isFetchingNextPage,isFetchNextPageError:j.isFetchNextPageError})&&j.fetchNextPage()},[p,j.data,j.hasNextPage,de,j.isFetchNextPageError,j.isFetchingNextPage]);function Ze(){if(M&&h.hasNextPage){h.fetchNextPage();return}V(x=>Math.min(x+q,$.length))}function et(){if(j.isFetchNextPageError){j.fetchNextPage();return}j.refetch()}return t.jsx(Wa,{globalFilters:o,localQuery:N,riskFilter:b,exportDisabled:!K.length,exportStatus:W,filterStatus:te,tableSubtitle:i,tableTitle:s,tableLabel:v,viewMode:ae,focusedState:{isFetching:h.isFetching,isFetchingNextPage:h.isFetchingNextPage,usingFocused:M,fallbackReason:L.reason,error:h.error?me(h.error):null},selectedCallsState:{isFetching:j.isFetching,isFetchingNextPage:j.isFetchingNextPage,isFetchNextPageError:j.isFetchNextPageError,count:Qe,hydrated:!!j.data,error:j.error?me(j.error):null,initialError:j.isError&&!j.data?me(j.error):null,storedSnapshot:!!(se.length&&!j.data)},selectedCalls:se,displayedThreads:le,totalMatchedThreads:ne,canLoadMoreThreads:Xe,columns:qe,sorting:k,gridPreferences:oe,selected:p,frontierSpec:Oe,lifecycleSpec:Ye,callSort:F,callSortDirection:E,onWorkspaceChange:Ke,onExport:Je,onClearFilters:R,onLocalQueryChange:_,onRiskFilterChange:B,onViewModeChange:Y,onSortingChange:D,onToggleThread:J,onRetryCalls:et,onLoadMoreThreads:Ze,onCallSortChange:y,onCallSortDirectionChange:I,onOpenInvestigator:r,onCopyCallLink:n})}function me(e){return e instanceof Error?e.message:String(e)}export{br as ThreadsPage,xr as threadCallsForCurrentUrl,Oa as threadsForCurrentUrl}; + */const Lt=ot("RotateCcw",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]]),Rt=new Set(["all","High","Medium","Low"]);function Mt(e){const a=[],r=[e.localQuery.trim(),e.globalQuery.trim()].filter(Boolean);r.length&&a.push(`Search ${r.map(i=>`"${i}"`).join(" + ")}`),e.riskFilter!=="all"&&a.push(`Cold risk ${e.riskFilter}`),e.selectedThreadName&&a.push(`Selected ${e.selectedThreadName}`);const n=`Showing ${e.shownCount.toLocaleString()} of ${e.totalCount.toLocaleString()} grouped threads`;return a.length?`${n} - Filters: ${a.join("; ")}`:n}function $t(e,{localQuery:a,globalQuery:r,riskFilter:n}){if(n!=="all"&&e.coldResumeRisk!==n)return!1;const i=[e.name,e.coldResumeRisk,e.totalTokens,e.cost,e.cachePct];return[r,a].every(l=>vt(i,l))}function Ve(e){return Rt.has(e)?e:"all"}const q=250,re="__detail_first__",It=new Set(["newest","duration","gap","initiator","model","effort","tokens","cached","uncached","output","reasoning","cost","cache"]),be=new Set(it.map(e=>e.id).filter(e=>e!=="investigate"));function Dt(e=window.location.href){var a;return((a=new URL(e).searchParams.get("thread"))==null?void 0:a.trim())||null}function Et(e=window.location.href){const a=Dt(e);if(a)return a;const r=Bt(e);return r||(O("detail",e)==="first"?re:null)}function O(e,a=window.location.href){var r;return((r=new URL(a).searchParams.get(e))==null?void 0:r.trim())??""}function ze(e=window.location.href){return Ve(O("risk",e))}function Ae(e,a){return e.filter(r=>$t(r,a))}function ge(e,a){const r=a[0];return!r||!be.has(r.id)?[...e]:[...e].sort((n,i)=>Wt(n,i,r.id,r.desc))}function Be(e=window.location.href){const a=Ut(O("sort",e));return be.has(a)?[{id:a,desc:O("direction",e)==="desc"}]:[]}function Ht(e,a=window.location.href){const r=Number(O("page",a)||1);return Number.isFinite(r)&&r>1?Math.floor(r)*e:e}function Vt(e=window.location.href){return Ue(O("thread_call_sort",e))}function zt(e,a=window.location.href){const r=O("thread_call_direction",a).toLowerCase();return r==="asc"||r==="desc"?r:se(e)}function Ue(e){const a=Gt(e);return It.has(a)?a:"newest"}function se(e){return e==="cache"||e==="effort"||e==="initiator"||e==="model"?"asc":"desc"}function Ge(e,a=window.location.href){const r=new URL(a);r.searchParams.set("view","threads"),r.searchParams.delete("record"),r.searchParams.delete("detail"),r.searchParams.delete("expand"),r.searchParams.delete("threads"),r.searchParams.delete("thread_call_page");const n=e.sorting[0],i=n&&be.has(n.id)?n.id:"";return K(r,"thread_q",e.localQuery.trim(),""),K(r,"risk",e.riskFilter,"all"),K(r,"thread",e.selectedThreadName??"",""),K(r,"sort",i,""),K(r,"direction",i?n!=null&&n.desc?"desc":"asc":"",""),K(r,"page",String(At(e.visibleRowCount,q)),"1"),K(r,"thread_call_sort",e.selectedThreadName?e.threadCallSort:"","newest"),K(r,"thread_call_direction",e.selectedThreadName?e.threadCallSortDirection:"",se(e.threadCallSort)),r}function At(e,a){return Math.max(1,Math.ceil(Math.max(e,a)/a))}function Bt(e){var i,l;const a=new URL(e).searchParams,r=(i=a.get("expand"))==null?void 0:i.trim();if(r==="first"||r==="all")return re;const n=(l=a.get("threads"))==null?void 0:l.split(",").map(c=>c.trim()).filter(Boolean);return(n==null?void 0:n[0])??null}function Ut(e){return e==="total"?"totalTokens":e==="usage"?"credits":e==="cache"?"cachePct":e==="context"?"contextPct":e}function Gt(e){return e==="time"?"newest":e==="total"?"tokens":e}function Wt(e,a,r,n){const i=Qt(Fe(e,r),Fe(a,r));return(n?-i:i)||e.name.localeCompare(a.name)}function Fe(e,a){if(a==="latestActivity")return e.latestActivityRaw||e.latestActivity;if(a==="totalDuration")return e.totalDurationSeconds;if(a==="averageGap")return e.averageGapSeconds;const r=e[a];return typeof r=="number"||typeof r=="string"?typeof r=="string"?r.toLowerCase():r:null}function Qt(e,a){return e===null&&a===null?0:e===null?1:a===null?-1:typeof e=="string"||typeof a=="string"?String(e).localeCompare(String(a)):e-a}function K(e,a,r,n){if(!r||r===n){e.searchParams.delete(a);return}e.searchParams.set(a,r)}const qt={name:"thread",latestActivity:"time",turns:"calls",totalTokens:"tokens",cachePct:"cache"};function Ot(e){const a=e.sorting[0],r=a?qt[a.id]:"tokens",n=Yt(e,r);return{enabled:!n,reason:n,query:e.localQuery.trim()||e.globalQuery.trim(),sort:r??"tokens",direction:a?a.desc?"desc":"asc":"desc"}}function Yt(e,a){return!e.enabled||e.runtime.fileMode||!e.runtime.apiToken?"Stored snapshot":e.globalQuery.trim()&&e.localQuery.trim()?"Multiple searches use loaded snapshot":e.riskFilter!=="all"?"Risk filter uses loaded snapshot":a?"":"This sort uses loaded snapshot"}function Jt(e,a,r){const n=e.map(i=>({id:i.name,thread:i.name,inputTokens:i.cachedInput+i.uncachedInput,cachePercent:i.cachePct,credits:i.credits,totalTokens:i.totalTokens}));return{schema:Ee,id:"thread-cache-frontier",title:"Cache efficiency frontier",description:"Threads further right carry more input; threads lower on the plot reuse less of it.",state:We(n.length,"No threads match the current scope."),scope:{label:`${e.length.toLocaleString()} loaded threads`,rowCount:n.length,historyScope:a},freshness:{generatedAt:r||Xt(e),sourceRevision:r},caveats:["Credits and cost remain estimates when exact rate metadata is unavailable."],accessibility:{summary:Zt(e),keyboardInstructions:"Use arrow keys to move between threads; press Enter to synchronize the selected row."},table:{caption:"Cache efficiency by thread",columns:[{field:"thread",label:"Thread",type:"text"},{field:"inputTokens",label:"Input tokens",type:"number",unit:"tokens",align:"right"},{field:"cachePercent",label:"Cache",type:"number",unit:"percent",align:"right"},{field:"credits",label:"Credits",type:"number",unit:"credits",align:"right"},{field:"totalTokens",label:"Total tokens",type:"number",unit:"tokens",align:"right"}],defaultSort:{field:"totalTokens",direction:"desc"}},interactions:{selection:{keyField:"id",labelField:"thread"},zoom:{axis:"both"},brush:{axis:"both"}},annotations:[{id:"cache-floor",label:"35% review floor",kind:"reference-line",axis:"y",value:35,severity:"warning"}],kind:"cartesian",data:{rows:n},axes:{x:{field:"inputTokens",label:"Input tokens",type:"number",unit:"tokens",min:0},y:{field:"cachePercent",label:"Cache reuse",type:"number",unit:"percent",min:0,max:100}},series:[{id:"threads",label:"Threads",mark:"point",xField:"inputTokens",yField:"cachePercent",color:"#2f6fed"}]}}function Kt(e,a,r,n){var k;const i=[...e].sort((g,x)=>he(g)-he(x)),l=he(i[0]),c=i.map((g,x)=>({id:g.id,call:`Call ${x+1}`,elapsedMinutes:Math.max(0,Math.round((he(g)-l)/6e4)),contextPercent:g.contextWindowPct,cachePercent:g.cachedPct,totalTokens:g.totalTokens,event:ta(g,x)})),T=c.filter(g=>typeof g.contextPercent=="number");return{schema:Ee,id:"selected-thread-lifecycle",title:"Thread lifecycle",description:"Context pressure and cache reuse across the selected thread.",state:We(T.length,"Context-window evidence is unavailable for this thread."),scope:{label:a||"No thread selected",rowCount:c.length,historyScope:r},freshness:{generatedAt:n||((k=i.at(-1))==null?void 0:k.eventTimestamp)||"",sourceRevision:n},caveats:["Lifecycle labels are inferred from aggregate timing, cache, and context fields."],accessibility:{summary:ea(i,a),keyboardInstructions:"Use left and right arrow keys to move through calls in lifecycle order."},table:{caption:"Selected thread lifecycle calls",columns:[{field:"call",label:"Call",type:"text"},{field:"elapsedMinutes",label:"Elapsed",type:"number",unit:"count",align:"right"},{field:"contextPercent",label:"Context",type:"number",unit:"percent",align:"right"},{field:"cachePercent",label:"Cache",type:"number",unit:"percent",align:"right"},{field:"totalTokens",label:"Tokens",type:"number",unit:"tokens",align:"right"},{field:"event",label:"Lifecycle event",type:"text",localizeValues:!0}]},interactions:{selection:{keyField:"id",labelField:"call"},zoom:{axis:"x"}},kind:"cartesian",data:{rows:c},axes:{x:{field:"elapsedMinutes",label:"Minutes since first call",type:"number",unit:"count",min:0},y:{field:"contextPercent",label:"Context / cache",type:"number",unit:"percent",min:0,max:100}},series:[{id:"context",label:"Context window",mark:"line",xField:"elapsedMinutes",yField:"contextPercent",color:"#7651c9"},{id:"cache",label:"Cache reuse",mark:"line",xField:"elapsedMinutes",yField:"cachePercent",color:"#16866b"}]}}function We(e,a){return e?{kind:"ready"}:{kind:"empty",message:a}}function Xt(e){var a;return((a=[...e].sort((r,n)=>Date.parse(n.latestActivityRaw)-Date.parse(r.latestActivityRaw))[0])==null?void 0:a.latestActivityRaw)||""}function Zt(e){const a=e.filter(r=>r.cachePct<35&&r.totalTokens>=5e4).length;return a?`${a} loaded threads combine at least 50,000 tokens with less than 35 percent cache reuse.`:"No loaded high-token thread falls below the 35 percent cache review floor."}function ea(e,a){if(!e.length)return`No loaded calls are available for ${a||"the selected thread"}.`;const r=Math.max(...e.map(n=>n.contextWindowPct??0));return`${e.length} calls are available for ${a}; peak observed context use is ${r.toFixed(1)} percent.`}function ta(e,a){return a===0?"Thread start":e.previousCallGapSeconds>=3600?"Cold resume":(e.contextWindowPct??0)>=80?"Context pressure":e.cachedPct>=60?"Warm continuation":"Continuation"}function he(e){if(!e)return 0;const a=Date.parse(e.eventTimestamp||e.rawTime||e.time);return Number.isFinite(a)?a:0}function Qe(e,a){return xe(a)-xe(e)}function aa(e,a,r){return[...e].sort((n,i)=>{const l=sa(Me(n,a),Me(i,a));return(r==="asc"?l:-l)||Qe(n,i)||n.id.localeCompare(i.id)})}function Le(e,a){const r=e.trim(),n=a.trim();return r===n||r.startsWith(n)||n.startsWith(r)}function ra(e){return`${new Intl.NumberFormat("en-US",{maximumFractionDigits:2}).format(e)} credits`}function Re(e){return e.contextWindowPct==null?"-":Ie(e.contextWindowPct)}function na(e){return e.cost<=0?"No configured price":e.pricingEstimated?"Best-guess estimate":"Configured price"}function oa(e){return e==null?"low":e>=65?"high":e>=35?"medium":"low"}function ia(e){return e==null||!Number.isFinite(e)?"0%":`${Math.round(la(e,0,100))}%`}function xe(e){const a=Date.parse(e.rawTime||e.time);return Number.isFinite(a)?a:0}function Me(e,a){return a==="duration"?e.durationSeconds:a==="gap"?e.previousCallGapSeconds:a==="initiator"?e.initiator.toLowerCase():a==="model"?e.model.toLowerCase():a==="effort"?e.effort.toLowerCase():a==="tokens"?e.totalTokens:a==="cached"?e.cachedInput:a==="uncached"?e.uncachedInput:a==="output"?e.output:a==="reasoning"?e.reasoningOutput:a==="cost"?e.cost:a==="cache"?e.cachedPct:xe(e)}function sa(e,a){return typeof e=="number"&&typeof a=="number"?e-a:String(e).localeCompare(String(a))}function la(e,a,r){return Math.min(Math.max(e,a),r)}function ca(e,a){const r=e.length?e.flatMap(i=>i.rows):a,n=new Set;return r.filter(i=>n.has(i.id)?!1:(n.add(i.id),!0))}const da="_accordionGrid_11j7i_1",ha="_visuallyHidden_11j7i_3",ua="_accordionScroller_11j7i_15",ma="_accordionHeaderGroup_11j7i_24",fa="_accordionHeader_11j7i_24",pa="_threadRow_11j7i_42",ga="_sortHeader_11j7i_51",xa="_headerLabel_11j7i_77",ba="_threadCellContent_11j7i_78",ya="_sortIndicator_11j7i_87",Ca="_disclosureSpacer_11j7i_93",ja="_disclosureChevron_11j7i_94",wa="_identityHeaderCell_11j7i_99",Sa="_threadIdentityCell_11j7i_100",va="_accordionCanvas_11j7i_131",_a="_threadCallsRegion_11j7i_132",Ta="_accordionItem_11j7i_140",ka="_expandedThreadRow_11j7i_164",Pa="_threadExpansionSummary_11j7i_172",Na="_threadCallEvidence_11j7i_173",Fa="_threadLoadStatus_11j7i_174",La="_threadExpansionHeader_11j7i_189",Ra="_snapshotLabel_11j7i_191",Ma="_threadSummaryStrip_11j7i_192",$a="_threadCallIdentity_11j7i_197",Ia="_threadCallSignals_11j7i_198",Da="_threadCallControls_11j7i_199",Ea="_threadCallActions_11j7i_211",Ha="_threadCallRecommendation_11j7i_212",Va="_threadContextBar_11j7i_213",d={accordionGrid:da,visuallyHidden:ha,accordionScroller:ua,accordionHeaderGroup:ma,accordionHeader:fa,threadRow:pa,sortHeader:ga,headerLabel:xa,threadCellContent:ba,sortIndicator:ya,disclosureSpacer:Ca,disclosureChevron:ja,identityHeaderCell:wa,threadIdentityCell:Sa,accordionCanvas:va,threadCallsRegion:_a,accordionItem:Ta,expandedThreadRow:ka,threadExpansionSummary:Pa,threadCallEvidence:Na,threadLoadStatus:Fa,threadExpansionHeader:La,snapshotLabel:Ra,threadSummaryStrip:Ma,threadCallIdentity:$a,threadCallSignals:Ia,threadCallControls:Da,threadCallActions:Ea,threadCallRecommendation:Ha,threadContextBar:Va};function za({callSort:e,callSortDirection:a,onCallSortChange:r,onCallSortDirectionChange:n}){return t.jsxs("div",{className:d.threadCallControls,children:[t.jsxs("label",{children:[t.jsx("span",{children:"Sort calls"}),t.jsxs("select",{"aria-label":"Sort thread calls",value:e,onChange:i=>r(i.target.value),children:[t.jsx("option",{value:"newest",children:"Newest"}),t.jsx("option",{value:"duration",children:"Duration"}),t.jsx("option",{value:"gap",children:"Previous gap"}),t.jsx("option",{value:"initiator",children:"Initiator"}),t.jsx("option",{value:"model",children:"Model"}),t.jsx("option",{value:"effort",children:"Effort"}),t.jsx("option",{value:"tokens",children:"Most tokens"}),t.jsx("option",{value:"cached",children:"Cached input"}),t.jsx("option",{value:"uncached",children:"Uncached input"}),t.jsx("option",{value:"output",children:"Output"}),t.jsx("option",{value:"reasoning",children:"Reasoning"}),t.jsx("option",{value:"cost",children:"Highest cost"}),t.jsx("option",{value:"cache",children:"Lowest cache"})]})]}),t.jsxs("label",{children:[t.jsx("span",{children:"Direction"}),t.jsxs("select",{"aria-label":"Sort thread calls direction",value:a,onChange:i=>n(i.target.value),children:[t.jsx("option",{value:"desc",children:"Descending"}),t.jsx("option",{value:"asc",children:"Ascending"})]})]})]})}function Aa({call:e,onOpenInvestigator:a,onCopyCallLink:r}){const n=`Open investigator for thread call ${e.thread} ${e.model}`,i=`Copy link for thread call ${e.thread} ${e.model}`;return t.jsxs("div",{className:d.threadCallEvidence,children:[t.jsxs("div",{className:d.threadCallIdentity,children:[t.jsx("span",{children:e.time}),t.jsxs("strong",{children:[e.model," / ",e.effort]}),t.jsxs("span",{children:[st(e.totalTokens)," tokens · ",Ie(e.cachedPct)," cache · ",lt(e.cost)]})]}),t.jsxs("div",{className:d.threadCallSignals,children:[t.jsx(ct,{call:e}),t.jsxs("span",{children:["Context ",Re(e)]}),t.jsx("span",{children:na(e)})]}),t.jsx("span",{children:e.duration}),t.jsxs("span",{children:["Prev ",e.previousCallGap]}),t.jsxs("span",{children:[e.initiator||"unknown"," initiated · ",ra(e.credits)]}),t.jsxs("div",{className:d.threadCallActions,children:[t.jsxs("button",{className:"table-action-button",type:"button","aria-label":n,onKeyDown:Ne,onClick:()=>a(e.id),children:[t.jsx(He,{size:14,"aria-hidden":"true"})," Open"]}),t.jsxs("button",{className:"table-action-button",type:"button","aria-label":i,onKeyDown:Ne,onClick:()=>r(e.id),children:[t.jsx(dt,{size:14,"aria-hidden":"true"})," Copy"]})]}),e.recommendation?t.jsx("p",{className:d.threadCallRecommendation,children:e.recommendation}):null,t.jsx("div",{className:d.threadContextBar,role:"img","aria-label":`Context use ${Re(e)}`,children:t.jsx("span",{className:oa(e.contextWindowPct),style:{width:ia(e.contextWindowPct)}})})]})}function Ba(e,a,r){return e.flatMap(n=>{const i={key:`thread:${n.name}`,kind:"thread",thread:n};return n.name!==a?[i]:[i,{key:`summary:${n.name}`,kind:"summary",thread:n},...r.map(l=>({key:`call:${l.id}`,kind:"call",call:l})),{key:`status:${n.name}`,kind:"status"}]})}function Ua(e,a){return typeof e=="string"?e:a}function Ga({ariaLabel:e,threads:a,columns:r,sorting:n,onSortingChange:i,preferences:l,expandedThreadName:c,expandedCalls:T,totalCallCount:k,loadMoreCallCount:g,canLoadMoreCalls:x,loadingCalls:u,loadingMoreCalls:w,initialError:b=null,storedSnapshot:j=!1,partialError:y,callSort:V,callSortDirection:M,viewportHeight:R=620,onToggleThread:z,onRetryCalls:A,onLoadMoreCalls:X,onCallSortChange:B,onCallSortDirectionChange:U,onOpenInvestigator:Z,onCopyCallLink:ee}){var ce;const G=m.useRef(null),E=Pt({columns:r,data:a,state:{sorting:n,columnVisibility:l.columnVisibility},onSortingChange:i,onColumnVisibilityChange:l.setColumnVisibility,getCoreRowModel:Ft(),getSortedRowModel:Nt(),getRowId:o=>o.name,enableSortingRemoval:!1}),Y=E.getRowModel().rows,F=Ba(Y.map(o=>o.original),c,T),H=l.density==="comfortable",p=o=>{var _;const s=(_=F[o])==null?void 0:_.kind;return s==="call"?H?128:96:s==="summary"?H?140:116:s==="status"?H?56:48:H?56:44},S=jt({count:F.length,getScrollElement:()=>G.current,getItemKey:o=>{var s;return((s=F[o])==null?void 0:s.key)??o},estimateSize:p,measureElement:o=>o.getBoundingClientRect().height,overscan:8,initialRect:{width:1e3,height:R}});m.useEffect(()=>S.measure(),[F.length,l.density,S]);const ne=S.getVirtualItems();let P=0;const h=F.map((o,s)=>{const _=p(s),$={key:o.key,index:s,start:P,end:P+_,size:_,lane:0};return P+=_,$}),te=ne.length?ne:h.filter(o=>o.start{var C,N;return(N=(C=G.current)==null?void 0:C.querySelector(`[data-item-index="${I}"]`))==null?void 0:N.focus()})}}return t.jsxs("section",{className:d.accordionGrid,children:[t.jsx(wt,{ariaLabel:e,table:E,lockedColumnIds:new Set(["name"]),density:l.density,onDensityChange:l.setDensity,onRestoreDefaults:l.restoreDefaults}),t.jsxs("div",{ref:G,className:d.accordionScroller,style:{height:R},role:"treegrid","aria-label":e,"aria-rowcount":F.length+1,"data-density":l.density,"data-testid":"thread-accordion-scroller","data-layout-scroll":"true","data-virtualized":"true",children:[t.jsx("div",{role:"rowgroup",className:d.accordionHeaderGroup,children:t.jsx("div",{className:d.accordionHeader,role:"row",style:{width:D},children:(ce=E.getHeaderGroups()[0])==null?void 0:ce.headers.map(o=>{const s=o.column.getIsSorted(),_=Ua(o.column.columnDef.header,o.column.id),$=o.column.id==="name";return t.jsx("div",{className:$?d.identityHeaderCell:void 0,role:"columnheader","aria-sort":s==="asc"?"ascending":s==="desc"?"descending":void 0,style:{width:o.getSize()},children:o.column.getCanSort()?t.jsxs("button",{className:d.sortHeader,type:"button","aria-label":`Sort by ${_}`,onClick:o.column.getToggleSortingHandler(),children:[$?t.jsx("span",{className:d.disclosureSpacer,"aria-hidden":"true"}):null,t.jsx("span",{className:d.headerLabel,children:fe(o.column.columnDef.header,o.getContext())}),t.jsx("span",{className:d.sortIndicator,"aria-hidden":"true",children:s==="asc"?"↑":s==="desc"?"↓":"↕"})]}):fe(o.column.columnDef.header,o.getContext())},o.id)})})}),t.jsxs("section",{className:d.threadCallsRegion,role:c?"region":void 0,"aria-labelledby":c?v:void 0,"aria-describedby":c?W:void 0,children:[c?t.jsxs("span",{id:v,className:d.visuallyHidden,children:["Calls for ",c]}):null,t.jsx("div",{className:d.accordionCanvas,role:"rowgroup",style:{height:oe,width:D},children:te.map(o=>{const s=F[o.index];if(!s)return null;const _={transform:`translateY(${o.start}px)`,width:D};if(s.kind==="thread"){const $=Y.find(N=>N.original.name===s.thread.name);if(!$)return null;const I=s.thread.name===c,C=`thread-row-${encodeURIComponent(s.thread.name)}`;return t.jsx("div",{ref:S.measureElement,id:C,role:"row",className:`${d.accordionItem} ${d.threadRow} ${I?d.expandedThreadRow:""}`,style:{..._,minHeight:p(o.index)},tabIndex:0,"aria-label":`${I?"Collapse":"Expand"} calls for ${s.thread.name}`,"aria-expanded":I,"aria-level":1,"aria-controls":I?L:void 0,"data-accordion-item":!0,"data-index":o.index,"data-item-index":o.index,onClick:N=>{N.detail<2&&z(s.thread.name)},onKeyDown:N=>ue(N,s.thread.name,o.index),children:$.getVisibleCells().map(N=>{const ae=N.column.id==="name";return t.jsxs("div",{className:ae?d.threadIdentityCell:void 0,role:"gridcell",style:{width:N.column.getSize()},children:[ae?t.jsx("span",{className:d.disclosureChevron,"aria-hidden":"true",children:"›"}):null,t.jsx("span",{className:d.threadCellContent,children:fe(N.column.columnDef.cell,N.getContext())})]},N.id)})},s.key)}return s.kind==="summary"?t.jsx("div",{ref:S.measureElement,id:`${L}-summary-row`,role:"row","aria-level":2,"aria-describedby":W,className:d.accordionItem,style:{..._,minHeight:p(o.index)},"data-accordion-item":!0,"data-index":o.index,children:t.jsx("div",{role:"gridcell",children:t.jsxs("section",{id:L,className:d.threadExpansionSummary,children:[t.jsxs("div",{className:d.threadExpansionHeader,children:[t.jsxs("div",{children:[t.jsx("strong",{children:s.thread.name}),t.jsxs("span",{role:"status","aria-live":"polite",children:[t.jsx("span",{children:ie}),le?t.jsx("span",{className:d.visuallyHidden,children:le}):null]})]}),t.jsx("button",{type:"button",className:"toolbar-button",onClick:()=>z(s.thread.name),"aria-label":`Collapse calls for ${s.thread.name}`,children:"Collapse"})]}),j?t.jsx("span",{className:d.snapshotLabel,children:"Stored snapshot"}):null,t.jsxs("dl",{className:d.threadSummaryStrip,children:[t.jsxs("div",{children:[t.jsx("dt",{children:"Calls"}),t.jsx("dd",{children:s.thread.turns.toLocaleString()})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Total tokens"}),t.jsx("dd",{children:s.thread.totalTokens.toLocaleString()})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Cached / uncached"}),t.jsxs("dd",{children:[s.thread.cachedInput.toLocaleString()," / ",s.thread.uncachedInput.toLocaleString()]})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Cache ratio"}),t.jsxs("dd",{children:[s.thread.cachePct.toFixed(1),"%"]})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Cost / credits"}),t.jsxs("dd",{children:["$",s.thread.cost.toFixed(2)," / ",s.thread.credits.toLocaleString()]})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Peak context"}),t.jsx("dd",{children:s.thread.contextPct==null?"-":`${s.thread.contextPct.toFixed(1)}%`})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Duration"}),t.jsx("dd",{children:s.thread.totalDuration})]}),t.jsxs("div",{children:[t.jsx("dt",{children:"Latest"}),t.jsx("dd",{children:s.thread.latestActivity})]})]}),t.jsx(za,{callSort:V,callSortDirection:M,onCallSortChange:B,onCallSortDirectionChange:U})]})})},s.key):s.kind==="call"?t.jsx("div",{ref:S.measureElement,id:`thread-call-row-${encodeURIComponent(s.call.id)}`,role:"row","aria-level":2,"aria-describedby":W,className:d.accordionItem,style:{..._,minHeight:p(o.index)},"data-accordion-item":!0,"data-index":o.index,children:t.jsx("div",{role:"gridcell",children:t.jsx(Aa,{call:s.call,onOpenInvestigator:Z,onCopyCallLink:ee})})},s.key):t.jsx("div",{ref:S.measureElement,id:`${L}-status-row`,role:"row","aria-level":2,"aria-describedby":W,className:d.accordionItem,style:{..._,minHeight:p(o.index)},"data-accordion-item":!0,"data-index":o.index,children:t.jsx("div",{role:"gridcell",children:t.jsxs("div",{className:d.threadLoadStatus,children:[y||b?t.jsxs(t.Fragment,{children:[t.jsx("span",{children:y??b}),t.jsx("button",{type:"button",onClick:A,"aria-label":"Retry loading thread calls",children:"Retry"})]}):null,!y&&!b&&u?t.jsx("span",{children:"Loading calls"}):null,!y&&!b&&w?t.jsx("span",{children:"Loading more calls"}):null,!y&&!b&&!u&&x?t.jsx("button",{className:"toolbar-button",type:"button",onClick:X,disabled:w,"aria-label":`Load ${g} more thread calls`,children:w?"Loading more...":`Load ${g} more`}):null,!y&&!b&&!u&&!w&&!T.length?t.jsx("span",{children:"No aggregate calls are available for this thread."}):null,!y&&!b&&!u&&!w&&T.length&&T.length=k&&T.length?t.jsx("span",{children:"All loaded calls visible"}):null]})})},s.key)})})]})]})]})}const Wa="_page_19h34_1",Qa="_pageHeader_19h34_5",qa="_tableHeading_19h34_6",Oa="_eyebrow_19h34_29",Ya="_headerActions_19h34_43",Ja="_tableActions_19h34_44",Ka="_gridFooter_19h34_45",Xa="_queryBar_19h34_61",Za="_evidenceSurface_19h34_89",Q={page:Wa,pageHeader:Qa,tableHeading:qa,eyebrow:Oa,headerActions:Ya,tableActions:Ja,gridFooter:Ka,queryBar:Xa,evidenceSurface:Za};function er({globalFilters:e,localQuery:a,riskFilter:r,exportDisabled:n,exportStatus:i,filterStatus:l,tableSubtitle:c,tableTitle:T,tableLabel:k,viewMode:g,focusedState:x,selectedCallsState:u,selectedCalls:w,callPageSize:b,displayedThreads:j,totalMatchedThreads:y,canLoadMoreThreads:V,columns:M,sorting:R,gridPreferences:z,selected:A,frontierSpec:X,lifecycleSpec:B,callSort:U,callSortDirection:Z,onWorkspaceChange:ee,onExport:G,onClearFilters:E,onLocalQueryChange:Y,onRiskFilterChange:F,onViewModeChange:H,onSortingChange:p,onToggleThread:S,onRetryCalls:ne,onLoadMoreCalls:P,onLoadMoreThreads:h,onCallSortChange:te,onCallSortDirectionChange:oe,onOpenInvestigator:D,onCopyCallLink:W}){const L=De();return t.jsxs("div",{className:`${Q.page} page-grid`,children:[t.jsxs("header",{className:Q.pageHeader,children:[t.jsxs("div",{children:[t.jsx("p",{className:Q.eyebrow,children:"Evidence explorer"}),t.jsx("h1",{children:"Threads"}),t.jsx("p",{children:"Compare work units, follow lifecycle pressure, and open supporting calls without leaving the evidence surface."})]}),t.jsxs("div",{className:Q.headerActions,children:[t.jsx(yt,{current:"threads",onValueChange:v=>{v!=="threads"&&ee(v)}}),t.jsxs("button",{className:"toolbar-button",type:"button",onClick:G,disabled:n,children:[t.jsx(ht,{size:16}),"Export thread calls"]}),t.jsxs("button",{className:"toolbar-button",type:"button","aria-label":"Reset thread view",onClick:E,children:[t.jsx(Lt,{size:16}),"Reset view"]})]})]}),t.jsx(Tt,{active:x.isFetching||u.isFetching,completed:Number(x.usingFocused)+Number(u.hydrated),total:2,label:"Loading thread summaries and selected calls",error:x.error??u.error,updating:x.usingFocused||u.hydrated}),e,t.jsxs("section",{className:Q.queryBar,"aria-label":"Thread filters",children:[t.jsxs("label",{className:"search-box",children:[t.jsx("span",{className:"sr-only",children:"Search threads"}),t.jsx(He,{size:16,"aria-hidden":"true"}),t.jsx("input",{value:a,onChange:v=>Y(v.target.value),placeholder:"Search threads, risks, token totals..."})]}),t.jsxs("label",{className:"filter-field",children:[t.jsx("span",{children:"Cold risk"}),t.jsxs("select",{value:r,onChange:v=>F(v.target.value),children:[t.jsx("option",{value:"all",children:"All risks"}),t.jsx("option",{value:"High",children:"High"}),t.jsx("option",{value:"Medium",children:"Medium"}),t.jsx("option",{value:"Low",children:"Low"})]})]})]}),t.jsxs("div",{className:Q.tableHeading,children:[t.jsxs("div",{children:[t.jsx("h2",{children:T}),t.jsx("p",{children:i||l||c})]}),t.jsxs("div",{className:Q.tableActions,children:[t.jsx(kt,{label:"Thread evidence view",value:g,onValueChange:H,options:[{value:"table",label:L.translateText("Table")},{value:"frontier",label:"Cache frontier"},{value:"lifecycle",label:L.translateText("Lifecycle")}]}),t.jsx(Pe,{label:tr(x.isFetching,x.usingFocused,x.fallbackReason),tone:x.usingFocused?"green":"blue"}),t.jsx(Pe,{label:u.isFetching?"Updating thread calls":`${u.count.toLocaleString()} selected calls`,tone:u.hydrated?"green":"blue"})]})]}),t.jsx("div",{children:t.jsxs("section",{className:Q.evidenceSurface,"aria-label":"Thread evidence",children:[g==="table"?t.jsxs(t.Fragment,{children:[t.jsx(Ga,{ariaLabel:k,columns:M,threads:j,sorting:R,onSortingChange:p,preferences:z,expandedThreadName:(A==null?void 0:A.name)??null,expandedCalls:w,totalCallCount:u.count,loadMoreCallCount:b,canLoadMoreCalls:u.canLoadMore,loadingCalls:u.isFetching&&!u.hydrated,loadingMoreCalls:u.isFetchingNextPage,initialError:u.initialError,storedSnapshot:u.storedSnapshot,partialError:u.isFetchNextPageError?`Partial result: ${u.error??"Unable to load remaining calls."}`:null,callSort:U,callSortDirection:Z,onToggleThread:S,onRetryCalls:ne,onLoadMoreCalls:P,onCallSortChange:te,onCallSortDirectionChange:oe,onOpenInvestigator:D,onCopyCallLink:W,viewportHeight:560}),t.jsxs("div",{className:Q.gridFooter,"aria-live":"polite",children:[t.jsx("span",{children:L.translateText(`${j.length.toLocaleString()} loaded / ${y.toLocaleString()} matched`)}),V?t.jsx("button",{className:"toolbar-button",type:"button",onClick:h,disabled:x.isFetchingNextPage,children:x.isFetchingNextPage?"Loading more...":`Load ${q.toLocaleString()} more`}):null]})]}):null,g==="frontier"?t.jsx(ke,{spec:X,height:520,onSelectionChange:S}):null,g==="lifecycle"?t.jsx(ke,{spec:B,height:520}):null]})})]})}function tr(e,a,r){return e&&a?"Updating focused threads":e?"Loading focused threads":a?"Focused paged API":r||"Stored snapshot"}function ar(e){const[a,r]=m.useState(()=>O("thread_q")),[n,i]=m.useState(()=>ze()),[l,c]=m.useState(()=>Et()),[T,k]=m.useState(()=>Be()),[g,x]=m.useState(()=>Ht(q)),u=Vt(),[w,b]=m.useState(()=>u),[j,y]=m.useState(()=>zt(u)),[V,M]=m.useState(""),[R,z]=m.useState(""),[A,X]=m.useState("table"),B=m.useRef(e);m.useEffect(()=>{B.current!==e&&(B.current=e,x(q))},[e]);function U(){x(q)}function Z(p){r(p),U()}function ee(p){i(Ve(p)),U()}function G(p){k(S=>typeof p=="function"?p(S):p),U()}function E(){r(""),i("all"),c(null),x(q),b("newest"),y(se("newest")),window.history.replaceState(null,"",Ge({localQuery:"",riskFilter:"all",selectedThreadName:null,sorting:T,visibleRowCount:q,threadCallSort:"newest",threadCallSortDirection:se("newest")})),z("Thread filters cleared")}function Y(p){c(S=>S===p?null:p)}function F(p){const S=Ue(p);b(S),y(se(S))}function H(p){y(p==="asc"?"asc":"desc")}return{localQuery:a,riskFilter:n,selectedThreadName:l,threadSorting:T,visibleThreadRows:g,threadCallSort:w,threadCallSortDirection:j,exportStatus:V,filterStatus:R,viewMode:A,setSelectedThreadName:c,setVisibleThreadRows:x,setExportStatus:M,setViewMode:X,updateLocalQuery:Z,updateRiskFilter:ee,updateThreadSorting:G,clearThreadFilters:E,toggleThread:Y,updateThreadCallSort:F,updateThreadCallSortDirection:H}}const $e=100,rr={totalDuration:!1,averageGap:!1,initiatorSummary:!1,modelSummary:!1,effortSummary:!1,cachedInput:!1,uncachedInput:!1,outputTokens:!1,reasoningOutput:!1,costPerCall:!1,productivity:!1};function nr(e,a=""){return ge(Ae(e,{globalQuery:a,localQuery:O("thread_q"),riskFilter:ze()}),Be())}function kr(e,a=""){return qe(e.calls,nr(e.threads,a))}function qe(e,a){const r=new Map(a.map((l,c)=>[l.name,c])),n=new Map(a.filter(l=>l.latestCallId).map((l,c)=>[l.latestCallId,c])),i=new Map(e.map((l,c)=>[l.id,c]));return e.filter(l=>r.has(l.thread)||n.has(l.id)).sort((l,c)=>(r.get(l.thread)??n.get(l.id)??0)-(r.get(c.thread)??n.get(c.id)??0)||(i.get(l.id)??0)-(i.get(c.id)??0))}function Pr({model:e,globalQuery:a,onOpenInvestigator:r,onCopyCallLink:n,globalFilters:i,contextRuntime:l,includeArchived:c=!1,sourceKey:T,sourceRevision:k="",focusedEndpointsEnabled:g=!0,onNavigateView:x}){var Ce,je,we,Se,ve,_e;const u=De(),{localQuery:w,riskFilter:b,selectedThreadName:j,threadSorting:y,visibleThreadRows:V,threadCallSort:M,threadCallSortDirection:R,exportStatus:z,filterStatus:A,viewMode:X,setSelectedThreadName:B,setVisibleThreadRows:U,setExportStatus:Z,setViewMode:ee,updateLocalQuery:G,updateRiskFilter:E,updateThreadSorting:Y,clearThreadFilters:F,toggleThread:H,updateThreadCallSort:p,updateThreadCallSortDirection:S}=ar(a),ne=St("codexUsageThreadsEvidenceGridV2",{density:"compact",columnVisibility:rr}),P=m.useMemo(()=>Ot({runtime:l,enabled:g,globalQuery:a,localQuery:w,riskFilter:b,sorting:y}),[l,g,a,w,b,y]),h=Te({...xt({runtime:l,includeArchived:c,sourceKey:T,sourceRevision:k,query:P.query,sort:P.sort,direction:P.direction,pageSize:q}),enabled:P.enabled,placeholderData:f=>f}),te=m.useMemo(()=>new Map(e.threads.map(f=>[f.name,f])),[e.threads]),oe=m.useMemo(()=>{var f;return((f=h.data)==null?void 0:f.pages.flatMap(nt=>nt.rows.map(me=>_t(me,te.get(me.threadLabel)??te.get(me.threadKey)))))??[]},[h.data,te]),D=P.enabled&&!!h.data,W=D?oe:e.threads,L=m.useMemo(()=>Ae(W,{localQuery:w,globalQuery:a,riskFilter:b}),[a,w,b,W]),v=m.useMemo(()=>ge(L,y),[L,y]),ie=D?((je=(Ce=h.data)==null?void 0:Ce.pages[0])==null?void 0:je.totalMatchedRows)??v.length:e.threads.length,le=m.useMemo(()=>Mt({shownCount:L.length,totalCount:ie,localQuery:w,globalQuery:a,riskFilter:b,selectedThreadName:j}),[a,w,b,j,v.length,ie]),ue=u.t("dashboard.top_threads_by_attention","Thread Leaderboard"),ce=u.t("dashboard.top_threads_by_attention","Thread leaderboard"),o=j===re?v[0]??null:v.find(f=>f.name===j)??null,s=j===re?(o==null?void 0:o.name)??null:j,_=m.useMemo(()=>o?aa(e.calls.filter(f=>Le(f.thread,o.name)),M,R):[],[e.calls,o,M,R]),$=(o==null?void 0:o.threadKey)||((we=_[0])==null?void 0:we.threadKey)||(o==null?void 0:o.name)||"",I=g&&!l.fileMode&&!!l.apiToken&&!!$,C=Te({...bt({runtime:l,includeArchived:c,sourceKey:T,sourceRevision:k,threadKey:$,sort:M==="newest"?"time":M,direction:R,pageSize:$e}),enabled:I}),N=((Se=C.data)==null?void 0:Se.pages)??[],ae=m.useMemo(()=>ca(N,_),[N,_]),Oe=((_e=(ve=C.data)==null?void 0:ve.pages[0])==null?void 0:_e.totalMatchedRows)??ae.length,Ye=ut,Je=m.useMemo(()=>Jt(v,c?"all":"active",k),[c,v,k]),J=o??v[0]??null,ye=o?ae:J?e.calls.filter(f=>Le(f.thread,J.name)).sort(Qe):[],Ke=m.useMemo(()=>Kt(ye,(J==null?void 0:J.name)??"",c?"all":"active",k),[c,ye,J==null?void 0:J.name,k]);m.useEffect(()=>{j===re&&s&&B(s)},[j,s]),m.useEffect(()=>{const f=Ge({localQuery:w,riskFilter:b,selectedThreadName:s,sorting:y,visibleRowCount:V,threadCallSort:M,threadCallSortDirection:R});f.toString()!==window.location.href&&window.history.replaceState(null,"",f)},[w,b,s,M,R,y,V]);function Xe(){const f=qe(e.calls,ge(L,y));mt(`codex-thread-filtered-calls-${gt()}.csv`,ft(f,pt)),Z(`Exported ${f.length} calls`)}function Ze(f){f!=="threads"&&(window.history.replaceState(null,"",Ct(f)),x("calls"))}const de=D?v:v.slice(0,V),et=D?!!h.hasNextPage:de.length{!P.enabled||!h.data||!j||j===re||o||!h.hasNextPage||h.isFetchingNextPage||h.isFetchNextPageError||h.fetchNextPage()},[P.enabled,h.data,h.hasNextPage,h.isFetchNextPageError,h.isFetchingNextPage,o,j]),m.useEffect(()=>{P.enabled&&(!h.data||h.isFetching||h.isFetchingNextPage||h.hasNextPage)||j&&j!==re&&!de.some(f=>f.name===j)&&B(null)},[de,P.enabled,h.data,h.hasNextPage,h.isFetching,h.isFetchingNextPage,j]);function tt(){if(D&&h.hasNextPage){h.fetchNextPage();return}U(f=>Math.min(f+q,v.length))}function at(){if(C.isFetchNextPageError){C.fetchNextPage();return}C.refetch()}function rt(){!C.hasNextPage||C.isFetchingNextPage||C.fetchNextPage()}return t.jsx(er,{globalFilters:i,localQuery:w,riskFilter:b,exportDisabled:!L.length,exportStatus:z,filterStatus:A,tableSubtitle:le,tableTitle:ue,tableLabel:ce,viewMode:X,focusedState:{isFetching:h.isFetching,isFetchingNextPage:h.isFetchingNextPage,usingFocused:D,fallbackReason:P.reason,error:h.error?pe(h.error):null},selectedCallsState:{isFetching:C.isFetching,isFetchingNextPage:C.isFetchingNextPage,isFetchNextPageError:C.isFetchNextPageError,canLoadMore:!!C.hasNextPage,count:Oe,hydrated:!!C.data,error:C.error?pe(C.error):null,initialError:C.isError&&!C.data?pe(C.error):null,storedSnapshot:!!(ae.length&&!C.data)},selectedCalls:ae,callPageSize:$e,displayedThreads:de,totalMatchedThreads:ie,canLoadMoreThreads:et,columns:Ye,sorting:y,gridPreferences:ne,selected:o,frontierSpec:Je,lifecycleSpec:Ke,callSort:M,callSortDirection:R,onWorkspaceChange:Ze,onExport:Xe,onClearFilters:F,onLocalQueryChange:G,onRiskFilterChange:E,onViewModeChange:ee,onSortingChange:Y,onToggleThread:H,onRetryCalls:at,onLoadMoreCalls:rt,onLoadMoreThreads:tt,onCallSortChange:p,onCallSortDirectionChange:S,onOpenInvestigator:r,onCopyCallLink:n})}function pe(e){return e instanceof Error?e.message:String(e)}export{Pr as ThreadsPage,kr as threadCallsForCurrentUrl,nr as threadsForCurrentUrl};