{t('routeBudgetForecast', { projected: formatCompactTokens(insight.projectedThirtyDayTokens) })}
\r\n{t('activityIntro')}
\r\n{t('dayDetailsIntro')}
\r\n{t('noContributors')}
: (\r\n{t('trendIntro')}
\r\n{t('peakDayNote', { date: peak.date, total: formatTokens(totalTokens(peak.usage)) })}
}\r\n{t('budgetIntro')}
\r\n{runRateAvailable ? t('budgetRunRate', {\r\n average: formatCompactTokens(Math.round(runRate.averageDailyTokens)),\r\n projected: formatCompactTokens(runRate.projectedThirtyDayTokens),\r\n }) : t(dailyCoverage === 'partial' ? 'dailyCoveragePartial' : 'dailyCoverageUnavailable')}
\r\n {snapshot.status !== 'ready' ?{t('budgetUnavailable')}
\r\n : !enabled ?{t('budgetDisabled')}
\r\n : !runRateAvailable ? null\r\n : <>\r\n{t('budgetExceeded', { excess: formatCompactTokens(used - budget) })}
: null}\r\n {runRateAvailable && ratio <= 1 && runRate.projectedThirtyDayTokens > budget ?{t('budgetForecastExceeded', {\r\n projected: formatCompactTokens(runRate.projectedThirtyDayTokens),\r\n budget: formatCompactTokens(budget),\r\n })}
: null}\r\n >}\r\n{t('efficiencyIntro')}
\r\n{t('noRouteAttribution')}
\r\n :{t('routeConcentration', {\r\n route: `${top.provider}/${top.model}`,\r\n topOne: formatPercent(top.share),\r\n topThree: formatPercent(topThreeShare),\r\n })}
}\r\n {insight.unattributedTokenShare > 0 ?{t('unattributedShare', { share: formatPercent(insight.unattributedTokenShare) })}
: null}\r\n{t('usageSignalsIntro')}
\r\n{t(dailyCoverage === 'partial' ? 'dailyCoveragePartial' : 'dailyCoverageUnavailable')}
\r\n : anomaly === undefined ?{t('anomalyInsufficient')}
\r\n : anomaly.status === 'normal' ?{t('anomalyNormal', {\r\n date: anomaly.date,\r\n baseline: formatCompactTokens(anomaly.baselineMedianTokens),\r\n active: anomaly.activeBaselineDays,\r\n })}
\r\n :{t('anomalyElevated', {\r\n date: anomaly.date,\r\n tokens: formatCompactTokens(anomaly.tokens),\r\n baseline: formatCompactTokens(anomaly.baselineMedianTokens),\r\n ratio: new Intl.NumberFormat(undefined, { maximumFractionDigits: 1 }).format(anomaly.ratio),\r\n excess: formatCompactTokens(anomaly.excessTokens),\r\n active: anomaly.activeBaselineDays,\r\n })}
\r\n \r\n{message}
\r\n{t('analysisModelsLoading')}
{t('analysisModelsFailed', { message: catalog.message })}
{t('analysisModelsUnavailable')}
\r\n {catalogFailures.length === 0 ? null :{t('analysisModelsAllFailed', {\r\n providers: catalogFailures.map(failure => failure.providerName).join(', '),\r\n })}
}\r\n \r\n{t('usageAnalysisIntro')}
\r\n{t('usageAnalysisPrivacy')}
\r\n{t('analysisModelScope')}
\r\n {catalogFailures.length === 0 ? null :{t('analysisModelsPartial', {\r\n providers: catalogFailures.map(failure => failure.providerName).join(', '),\r\n })}
}\r\n \r\n {state.status === 'loading' ?{t('usageAnalysisFailed', { message: state.message })}
: null}\r\n {report === undefined ? null : <>\r\n{t('analysisMeta', {\r\n provider: report.model.provider,\r\n model: report.model.model,\r\n time: new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' }).format(new Date(report.generatedAt)),\r\n })}
\r\n{t('trajectoryAnalysisIntro')}
{t('analysisFailed', { message: state.message })}
{t('analysisMeta', {\r\n provider: analysis.model.provider,\r\n model: analysis.model.model,\r\n time: new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' }).format(new Date(analysis.generatedAt)),\r\n })}
\r\n{t('analysisTruncated')}
: null}\r\n{t('analysisPrivacy')}
\r\n{t('loading')}
\r\n }\r\n\r\n return (\r\n{t('intro')}
\r\n{t('empty')}
: (\r\n <>\r\n{t('pricingIntro', {\r\n asOf: PUBLIC_PRICE_CATALOG_AS_OF,\r\n covered: formatTokens(costSummary.coveredTokens),\r\n total: formatTokens(costSummary.totalTokens),\r\n routes: costSummary.coveredModels,\r\n allRoutes: costSummary.totalModels,\r\n })}
\r\n {t('pricingSource')}\r\n{t('unknownRoute')}
: (\r\n| {t('providerModel')} | \r\n{t('calls')} | \r\n{t('total')} | \r\n{t('input')} | \r\n{t('output')} | \r\n{t('estimatedCost')} | \r\n
|---|---|---|---|---|---|
| {isUnattributed(model)\r\n ? {t('unattributed')}\r\n : <>{model.model}{model.provider}>} | \r\n{isUnattributed(model) ? '—' : (\r\n <>\r\n {t('assistantCalls', { count: model.assistantRequests })}\r\n {model.compactionRequests > 0\r\n ? {t('compactionCalls', { count: model.compactionRequests })}\r\n : null}\r\n >\r\n )} | \r\n\r\n | \r\n {model.totalCostUSD === undefined || model.rate === undefined\r\n ? —\r\n : {formatUSD(model.totalCostUSD)}} | \r\n
{t('analysisPrivacy')}
\r\n {sessionOpenError === undefined ? null :{t('openSessionFailed', { message: sessionOpenError })}
}\r\n {filteredSessions.length === 0 ?{t('emptySearch')}
: (\r\n| {t('analysis')} | \r\n{t('session')} | \r\n{t('updated')} | \r\n{t('routes')} | \r\n{t('total')} | \r\n{t('input')} | \r\n{t('output')} | \r\n
|---|---|---|---|---|---|---|
| \r\n \r\n | \r\n{row.id} | \r\n{new Intl.DateTimeFormat(undefined, {\r\n dateStyle: 'medium',\r\n timeStyle: 'short',\r\n }).format(row.updatedAt)} | \r\n{row.models.length === 0 || row.models.every(isUnattributed)\r\n ? {t('unknownRoute')}\r\n : row.models.filter(model => !isUnattributed(model))\r\n .map(model => {routeLabel(model)})} | \r\n
{t('analysisHistoryLocal')}
{t('analysisHistoryUnavailable')}
\n : null}\n {sessionHistory.length === 0\n ?{t('analysisHistoryEmpty')}
\n :{t('activityIntro')}
\r\n{t('dayDetailsIntro')}
\r\n{t('noContributors')}
: (\r\n{t(modelDailyCoverage === 'partial'\r\n ? 'modelDailyCoveragePartial'\r\n : 'modelDailyCoverageUnavailable')}
\r\n } else if (selectedRoute !== undefined) {\r\n modelCoverageNote ={t('trendModelScope', { route: routeLabel(selectedRoute) })}
\r\n }\r\n return (\r\n{t('trendIntro')}
\r\n{t('peakDayNote', { date: peak.date, total: formatTokens(totalTokens(peak.usage)) })}
}\r\n {modelCoverageNote}\r\n{t('budgetIntro')}
\r\n{runRateAvailable ? t('budgetRunRate', {\r\n average: formatCompactTokens(Math.round(runRate.averageDailyTokens)),\r\n projected: formatCompactTokens(runRate.projectedThirtyDayTokens),\r\n }) : t(dailyCoverage === 'partial' ? 'dailyCoveragePartial' : 'dailyCoverageUnavailable')}
\r\n {snapshot.status !== 'ready' ?{t('budgetUnavailable')}
\r\n : !enabled ?{t('budgetDisabled')}
\r\n : !runRateAvailable ? null\r\n : <>\r\n{t('budgetExceeded', { excess: formatCompactTokens(Math.max(0, used - budget)) })}
: null}\r\n {runRateAvailable && ratio < 1 && runRate.projectedThirtyDayTokens > budget ?{t('budgetForecastExceeded', {\r\n projected: formatCompactTokens(runRate.projectedThirtyDayTokens),\r\n budget: formatCompactTokens(budget),\r\n })}
: null}\r\n >}\r\n{t('routeBudgetsIntro')}
\r\n{t(modelDailyCoverage === 'partial'\r\n ? 'routeBudgetCoveragePartial'\r\n : 'routeBudgetCoverageUnavailable')}
}\r\n {persistedRouteBudgets.length === 0 ?{t('routeBudgetsEmpty')}
:{t('routeBudgetForecast', { projected: formatCompactTokens(insight.projectedThirtyDayTokens) })}
\r\n{t('efficiencyIntro')}
\r\n{t('noRouteAttribution')}
\r\n :{t('routeConcentration', {\r\n route: `${top.provider}/${top.model}`,\r\n topOne: formatPercent(top.share),\r\n topThree: formatPercent(topThreeShare),\r\n })}
}\r\n {insight.unattributedTokenShare > 0 ?{t('unattributedShare', { share: formatPercent(insight.unattributedTokenShare) })}
: null}\r\n{t('usageSignalsIntro')}
\r\n{t(dailyCoverage === 'partial' ? 'dailyCoveragePartial' : 'dailyCoverageUnavailable')}
\r\n : anomaly === undefined ?{t('anomalyInsufficient')}
\r\n : anomaly.status === 'normal' ?{t('anomalyNormal', {\r\n date: anomaly.date,\r\n baseline: formatCompactTokens(anomaly.baselineMedianTokens),\r\n active: anomaly.activeBaselineDays,\r\n })}
\r\n :{t('anomalyElevated', {\r\n date: anomaly.date,\r\n tokens: formatCompactTokens(anomaly.tokens),\r\n baseline: formatCompactTokens(anomaly.baselineMedianTokens),\r\n ratio: new Intl.NumberFormat(undefined, { maximumFractionDigits: 1 }).format(anomaly.ratio),\r\n excess: formatCompactTokens(anomaly.excessTokens),\r\n active: anomaly.activeBaselineDays,\r\n })}
\r\n \r\n{message}
\r\n{t('analysisModelsLoading')}
{t('analysisModelsFailed', { message: catalog.message })}
\r\n \r\n{t('analysisModelsUnavailable')}
\r\n {catalogFailures.length === 0 ? null :{t('analysisModelsAllFailed', {\r\n providers: catalogFailures.map(failure => failure.providerName).join(', '),\r\n })}
}\r\n \r\n{t('usageAnalysisIntro')}
\r\n{t('usageAnalysisPrivacy')}
\r\n{t('analysisModelScope')}
\r\n {catalogFailures.length === 0 ? null :{t('analysisModelsPartial', {\r\n providers: catalogFailures.map(failure => failure.providerName).join(', '),\r\n })}
}\r\n \r\n {state.status === 'loading' ?{t('usageAnalysisFailed', { message: state.message })}
: null}\r\n {report === undefined ? null : <>\r\n{t('analysisMeta', {\r\n provider: report.model.provider,\r\n model: report.model.model,\r\n time: new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' }).format(new Date(report.generatedAt)),\r\n })}
\r\n{t('trajectoryAnalysisIntro')}
{t('analysisFailed', { message: state.message })}
{t('analysisMeta', {\r\n provider: analysis.model.provider,\r\n model: analysis.model.model,\r\n time: new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' }).format(new Date(analysis.generatedAt)),\r\n })}
\r\n{t('analysisTruncated')}
: null}\r\n{t('analysisPrivacy')}
\r\n{t('loading')}
\r\n }\r\n\r\n return (\r\n{t('intro')}
\r\n{t('empty')}
: (\r\n <>\r\n{t('pricingIntro', {\r\n asOf: PUBLIC_PRICE_CATALOG_AS_OF,\r\n covered: formatTokens(costSummary.coveredTokens),\r\n total: formatTokens(costSummary.totalTokens),\r\n routes: costSummary.coveredModels,\r\n allRoutes: costSummary.totalModels,\r\n })}
\r\n {t('pricingSource')}\r\n{t('unknownRoute')}
: (\r\n| {t('providerModel')} | \r\n{t('calls')} | \r\n{t('total')} | \r\n{t('input')} | \r\n{t('output')} | \r\n{t('estimatedCost')} | \r\n
|---|---|---|---|---|---|
| {isUnattributed(model)\r\n ? {t('unattributed')}\r\n : <>{model.model}{model.provider}>} | \r\n{isUnattributed(model) ? '—' : (\r\n <>\r\n {t('assistantCalls', { count: model.assistantRequests })}\r\n {model.compactionRequests > 0\r\n ? {t('compactionCalls', { count: model.compactionRequests })}\r\n : null}\r\n >\r\n )} | \r\n\r\n | \r\n {model.totalCostUSD === undefined || model.rate === undefined\r\n ? —\r\n : {formatUSD(model.totalCostUSD)}} | \r\n
{t('analysisPrivacy')}
\r\n {sessionOpenError === undefined ? null :{t('openSessionFailed', { message: sessionOpenError })}
}\r\n {filteredSessions.length === 0 ?{t('emptySearch')}
: (\r\n| {t('analysis')} | \r\n{t('session')} | \r\n{t('updated')} | \r\n{t('routes')} | \r\n{t('total')} | \r\n{t('input')} | \r\n{t('output')} | \r\n
|---|---|---|---|---|---|---|
| \r\n \r\n | \r\n{row.id} | \r\n{new Intl.DateTimeFormat(undefined, {\r\n dateStyle: 'medium',\r\n timeStyle: 'short',\r\n }).format(row.updatedAt)} | \r\n{row.models.length === 0 || row.models.every(isUnattributed)\r\n ? {t('unknownRoute')}\r\n : row.models.filter(model => !isUnattributed(model))\r\n .map(model => {routeLabel(model)})} | \r\n
{t('analysisHistoryLocal')}
{t('analysisHistoryUnavailable')}
\n : null}\n {sessionHistory.length === 0\n ?{t('analysisHistoryEmpty')}
\n :{t(modelDailyCoverage === 'partial' + ? 'modelDailyCoveragePartial' + : 'modelDailyCoverageUnavailable')}
+ } else if (selectedRoute !== undefined) { + modelCoverageNote ={t('trendModelScope', { route: routeLabel(selectedRoute) })}
+ } return ({t('trendIntro')}
{t('peakDayNote', { date: peak.date, total: formatTokens(totalTokens(peak.usage)) })}
} + {modelCoverageNote}{t('budgetExceeded', { excess: formatCompactTokens(used - budget) })}
: null} - {runRateAvailable && ratio <= 1 && runRate.projectedThirtyDayTokens > budget ?{t('budgetForecastExceeded', { + {ratio >= 1 ?
{t('budgetExceeded', { excess: formatCompactTokens(Math.max(0, used - budget)) })}
: null} + {runRateAvailable && ratio < 1 && runRate.projectedThirtyDayTokens > budget ?{t('budgetForecastExceeded', { projected: formatCompactTokens(runRate.projectedThirtyDayTokens), budget: formatCompactTokens(budget), })}
: null} >} +{t('routeBudgetsIntro')}
+{t(modelDailyCoverage === 'partial' + ? 'routeBudgetCoveragePartial' + : 'routeBudgetCoverageUnavailable')}
} + {persistedRouteBudgets.length === 0 ?{t('routeBudgetsEmpty')}
:{t('routeBudgetForecast', { projected: formatCompactTokens(insight.projectedThirtyDayTokens) })}
+{t('analysisModelsLoading')}
{t('analysisModelsFailed', { message: catalog.message })}
{t('analysisModelsFailed', { message: catalog.message })}
+ +{t('pricingIntro', {
diff --git a/src/client/TrajectoryAnalysisAction.tsx b/src/client/TrajectoryAnalysisAction.tsx
index 0e0a71c..ae70143 100644
--- a/src/client/TrajectoryAnalysisAction.tsx
+++ b/src/client/TrajectoryAnalysisAction.tsx
@@ -93,8 +93,12 @@ export function TrajectoryAnalysisAction({
}
const closeModal = (): void => {
+ catalogController.current?.abort()
+ catalogController.current = undefined
analysisController.current?.abort()
analysisController.current = undefined
+ setSelectedModel(undefined)
+ setCatalog({ status: 'idle' })
setAnalysis(current => current.status === 'loading' ? { status: 'idle' } : current)
setOpen(false)
}
diff --git a/src/client/analysis-progress-client.ts b/src/client/analysis-progress-client.ts
index f69280b..a76b2f9 100644
--- a/src/client/analysis-progress-client.ts
+++ b/src/client/analysis-progress-client.ts
@@ -79,6 +79,7 @@ export async function requestAnalysisWithProgress