repospend 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/README.md +8 -0
- package/dist/cli.js +116 -36
- package/docs/llms.txt +4 -0
- package/docs/pricing.md +20 -1
- package/package.json +1 -1
- package/web-dist/assets/index-C3XBInjD.css +1 -0
- package/web-dist/assets/{index-B2mGGjf_.js → index-D4cLshng.js} +89 -89
- package/web-dist/index.html +2 -2
- package/web-dist/assets/index-Bzdfbi5w.css +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to RepoSpend will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## Unreleased
|
|
6
|
+
|
|
7
|
+
## 0.1.7
|
|
8
|
+
|
|
9
|
+
- Correct Claude Sonnet 5.5 cache reads to $0.10 per million tokens following the October 7 price reduction, without changing Sonnet 5 or intentional custom overrides.
|
|
10
|
+
- Add Claude Haiku 5.5 pricing for prompts up to and over 100,000 tokens, including both cache-write TTLs. Price deduplicated Claude and Copilot inference requests before summing session costs; leave aggregate-only Haiku usage unpriced when request lengths are unknown.
|
|
11
|
+
- Add Gemini 4 Argon and Copilot aliases at introductory $2 input / $0.10 cached input / $10 output rates, with the November 30 promotion expiry recorded in pricing documentation.
|
|
12
|
+
- Preserve exact custom snapshot cards and migrate unchanged Sonnet 5.5 rows in legacy full-table pricing settings.
|
|
13
|
+
- Sum unrounded request costs before rounding the session estimate to six decimal places.
|
|
14
|
+
- Keep inherited Haiku snapshot edits on the shared base card, expose the higher-tier card alongside used models, and explain missing request context and auxiliary model rates in pricing triage.
|
|
15
|
+
- Preserve Haiku rate-card identity while typing or clearing numeric fields, keep pricing columns compact, and show readable request-pricing diagnostics across repo views.
|
|
16
|
+
- Cache model resolution within each session's cost calculation and preserve tolerated numeric-string Claude input counts during deduplication.
|
|
17
|
+
|
|
5
18
|
## 0.1.6
|
|
6
19
|
|
|
7
20
|
- Add explicit GPT-6.1 Sol Standard API-equivalent pricing, including its lower $0.10 cached-input rate, without changing GPT-6 Sol estimates.
|
package/README.md
CHANGED
|
@@ -21,6 +21,14 @@ Project links:
|
|
|
21
21
|
|
|
22
22
|
## Model pricing and usage guides
|
|
23
23
|
|
|
24
|
+
The 0.1.7 pricing update (October 17) adds Claude Haiku 5.5's two prompt-length tiers,
|
|
25
|
+
reduces Sonnet 5.5 cache reads to $0.10 per million tokens, and adds Gemini 4
|
|
26
|
+
Argon's introductory rates through November 30. Claude and Copilot inference
|
|
27
|
+
records are priced per request; aggregate-only Haiku usage stays unpriced when
|
|
28
|
+
request lengths are unavailable. These are current API-equivalent estimates,
|
|
29
|
+
not historical invoices. See [pricing methodology](docs/pricing.md) for rates,
|
|
30
|
+
promotion dates, and custom overrides.
|
|
31
|
+
|
|
24
32
|
RepoSpend includes explicit **GPT-6.1 Sol** API-equivalent pricing: $2 input,
|
|
25
33
|
$0.10 cached input, $2.50 cache writes, and $10 output per million tokens at
|
|
26
34
|
Standard short-context rates. GPT-6 Sol keeps its separate $0.20 cache-read rate.
|
package/dist/cli.js
CHANGED
|
@@ -253,9 +253,11 @@ function claudePricingFamilyModel(model, isUsable = () => true) {
|
|
|
253
253
|
"claude-sonnet-4-5",
|
|
254
254
|
"claude-sonnet-4",
|
|
255
255
|
"claude-haiku-4-5",
|
|
256
|
+
"claude-haiku-5-5",
|
|
256
257
|
"claude-3-5-haiku"
|
|
257
258
|
];
|
|
258
259
|
const normalized = normalizePricingModelId(model);
|
|
260
|
+
if (normalized.includes("-long-context")) return void 0;
|
|
259
261
|
const matchesFamily = (candidate) => normalized === candidate || normalized.startsWith(`${candidate}-`) || normalized.startsWith(`${candidate}.`);
|
|
260
262
|
if (normalized.includes("fast-mode")) {
|
|
261
263
|
return families.find((candidate) => candidate.includes("fast-mode") && matchesFamily(candidate) && isUsable(candidate));
|
|
@@ -271,7 +273,7 @@ function copilotPricingFamilyModel(model, isUsable = () => true) {
|
|
|
271
273
|
if ((normalized === "gemini-3-flash" || normalized.startsWith("gemini-3-flash-")) && isUsable("gemini-3-flash")) return "gemini-3-flash";
|
|
272
274
|
if ((normalized === "gemini-3.1-pro" || normalized.startsWith("gemini-3.1-pro-")) && isUsable("gemini-3.1-pro")) return "gemini-3.1-pro";
|
|
273
275
|
if ((normalized === "gemini-3.5-flash" || normalized.startsWith("gemini-3.5-flash-")) && isUsable("gemini-3.5-flash")) return "gemini-3.5-flash";
|
|
274
|
-
for (const candidate of ["gemini-3.6-flash", "gemini-3.7-flash", "gemini-3.8-flash", "grok-4.5", "grok-4.6", "grok-4.7", "mai-code-1.1-flash", "kimi-k3"]) {
|
|
276
|
+
for (const candidate of ["gemini-3.6-flash", "gemini-3.7-flash", "gemini-3.8-flash", "gemini-4-argon", "grok-4.5", "grok-4.6", "grok-4.7", "mai-code-1.1-flash", "kimi-k3"]) {
|
|
275
277
|
if ((normalized === candidate || normalized.startsWith(`${candidate}-`)) && isUsable(candidate)) return candidate;
|
|
276
278
|
}
|
|
277
279
|
if ((normalized === "raptor-mini" || normalized.startsWith("raptor-mini-") || normalized.startsWith("oswe-vscode")) && isUsable("raptor-mini")) return "raptor-mini";
|
|
@@ -282,7 +284,7 @@ function copilotPricingFamilyModel(model, isUsable = () => true) {
|
|
|
282
284
|
return void 0;
|
|
283
285
|
}
|
|
284
286
|
function parseVersionedModel(normalized) {
|
|
285
|
-
if (normalized.includes("fast-mode")) return void 0;
|
|
287
|
+
if (normalized.includes("fast-mode") || normalized.includes("-long-context")) return void 0;
|
|
286
288
|
const claude = normalized.match(/^(claude-(?:fable|mythos|opus|sonnet|haiku))-(\d+)(?:-(\d{1,2}))?(?!\d)/);
|
|
287
289
|
if (claude) {
|
|
288
290
|
const minor = claude[3] ? Number(claude[3]) : 0;
|
|
@@ -318,17 +320,36 @@ function positiveRate(value) {
|
|
|
318
320
|
function isUsableModelPricing(pricing) {
|
|
319
321
|
return positiveRate(pricing?.inputPerMillion) && positiveRate(pricing?.outputPerMillion);
|
|
320
322
|
}
|
|
321
|
-
function
|
|
323
|
+
function resolvePricingForModel(model, table) {
|
|
322
324
|
const lower = normalizePricingModelId(model);
|
|
323
|
-
const
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
325
|
+
const exactModel = table[model] ? model : table[lower] ? lower : void 0;
|
|
326
|
+
const exactPricing = exactModel ? table[exactModel] : void 0;
|
|
327
|
+
if (isUsableModelPricing(exactPricing)) {
|
|
328
|
+
return { pricing: exactPricing, sourceModel: exactModel, inherited: false };
|
|
329
|
+
}
|
|
330
|
+
const versioned = versionedFallbackModel(lower, Object.keys(table), (candidate) => isUsableModelPricing(table[candidate]));
|
|
331
|
+
if (versioned) {
|
|
332
|
+
return { pricing: table[versioned], sourceModel: versioned, inherited: versioned !== model && versioned !== lower };
|
|
333
|
+
}
|
|
334
|
+
const claudeFamily = claudePricingFamilyModel(lower, (candidate) => isUsableModelPricing(table[candidate]));
|
|
335
|
+
if (claudeFamily) {
|
|
336
|
+
return { pricing: table[claudeFamily], sourceModel: claudeFamily, inherited: claudeFamily !== model && claudeFamily !== lower };
|
|
337
|
+
}
|
|
338
|
+
const copilotFamily = copilotPricingFamilyModel(lower, (candidate) => isUsableModelPricing(table[candidate]));
|
|
339
|
+
if (copilotFamily) {
|
|
340
|
+
return { pricing: table[copilotFamily], sourceModel: copilotFamily, inherited: copilotFamily !== model && copilotFamily !== lower };
|
|
341
|
+
}
|
|
342
|
+
return {
|
|
343
|
+
pricing: exactPricing ?? {
|
|
344
|
+
inputPerMillion: 0,
|
|
345
|
+
cacheCreationInputPerMillion: 0,
|
|
346
|
+
cachedInputPerMillion: 0,
|
|
347
|
+
outputPerMillion: 0,
|
|
348
|
+
reasoningOutputPerMillion: 0
|
|
349
|
+
},
|
|
350
|
+
sourceModel: exactModel,
|
|
351
|
+
inherited: false
|
|
352
|
+
};
|
|
332
353
|
}
|
|
333
354
|
|
|
334
355
|
// packages/core/src/pricing.ts
|
|
@@ -342,10 +363,12 @@ var pricingInfo = {
|
|
|
342
363
|
{ label: "OpenAI GPT-5.6 preview pricing", url: "https://openai.com/index/previewing-gpt-5-6-sol/" },
|
|
343
364
|
{ label: "OpenAI GPT-5.6 price update", url: "https://openai.com/index/advancing-the-price-performance-frontier-with-gpt-5-6/" },
|
|
344
365
|
{ label: "Claude pricing reference", url: "https://platform.claude.com/docs/en/about-claude/pricing" },
|
|
366
|
+
{ label: "Claude Haiku 5.5 and Sonnet cache update", url: "https://www.anthropic.com/claude-haiku-5-5" },
|
|
367
|
+
{ label: "Gemini 4 Argon pricing", url: "https://ai.google.dev/gemini-api/docs/latest-model?hl=en" },
|
|
345
368
|
{ label: "GitHub Copilot model pricing reference", url: "https://docs.github.com/en/copilot/reference/copilot-billing/models-and-pricing" }
|
|
346
369
|
],
|
|
347
370
|
unit: "USD per 1M tokens",
|
|
348
|
-
updatedAt: "2026-
|
|
371
|
+
updatedAt: "2026-10-17",
|
|
349
372
|
note: "RepoSpend estimates API-equivalent cost from local token counts and public Standard pricing. GPT-6 defaults use short-context rates. Claude transcript fast-mode speeds use explicit published cards. Long-context, other processing modes, regional, and account-specific pricing can differ. This is not your actual bill."
|
|
350
373
|
};
|
|
351
374
|
var defaultPricing = {
|
|
@@ -387,6 +410,7 @@ var defaultPricing = {
|
|
|
387
410
|
"gemini-3.6-flash": { inputPerMillion: 0.75, cachedInputPerMillion: 0.075, outputPerMillion: 3.75, note: "GitHub Copilot promotional rates through December 31, 2026; API-equivalent estimate." },
|
|
388
411
|
"gemini-3.7-flash": { inputPerMillion: 0.75, cachedInputPerMillion: 0.075, outputPerMillion: 3.75, note: "GitHub Copilot promotional rates through December 31, 2026; API-equivalent estimate." },
|
|
389
412
|
"gemini-3.8-flash": { inputPerMillion: 0.75, cachedInputPerMillion: 0.075, outputPerMillion: 3.75, note: "GitHub Copilot promotional rates through December 31, 2026; API-equivalent estimate." },
|
|
413
|
+
"gemini-4-argon": { inputPerMillion: 2, cachedInputPerMillion: 0.1, outputPerMillion: 10, reasoningOutputPerMillion: 10, note: "Introductory rates through November 30, 2026. From December 1: $4 input / $0.20 cached input / $20 output (including thinking) per 1M tokens. No explicit cache-write charge. Bundled prices are a dated snapshot, not an automatic future rate switch." },
|
|
390
414
|
"grok-4.5": { inputPerMillion: 2, cachedInputPerMillion: 0.5, outputPerMillion: 6, note: "GitHub Copilot Standard rates up to 200K input tokens; longer requests use different rates." },
|
|
391
415
|
"grok-4.6": { inputPerMillion: 2, cachedInputPerMillion: 0.5, outputPerMillion: 6, note: "GitHub Copilot Standard rates up to 200K input tokens; longer requests use different rates." },
|
|
392
416
|
"grok-4.7": { inputPerMillion: 2, cachedInputPerMillion: 0.5, outputPerMillion: 6, note: "GitHub Copilot Standard rates up to 200K input tokens; longer requests use different rates." },
|
|
@@ -414,15 +438,18 @@ var defaultPricing = {
|
|
|
414
438
|
"claude-opus-4-5": { inputPerMillion: 5, cacheCreationInput5mPerMillion: 6.25, cacheCreationInput1hPerMillion: 10, cacheCreationInputPerMillion: 10, cachedInputPerMillion: 0.5, outputPerMillion: 25 },
|
|
415
439
|
"claude-opus-4-1": { inputPerMillion: 15, cacheCreationInput5mPerMillion: 18.75, cacheCreationInput1hPerMillion: 30, cacheCreationInputPerMillion: 30, cachedInputPerMillion: 1.5, outputPerMillion: 75 },
|
|
416
440
|
"claude-opus-4": { inputPerMillion: 15, cacheCreationInput5mPerMillion: 18.75, cacheCreationInput1hPerMillion: 30, cacheCreationInputPerMillion: 30, cachedInputPerMillion: 1.5, outputPerMillion: 75 },
|
|
417
|
-
"claude-sonnet-5-5": { inputPerMillion: 2, cacheCreationInput5mPerMillion: 2.5, cacheCreationInput1hPerMillion: 4, cacheCreationInputPerMillion: 4, cachedInputPerMillion: 0.
|
|
441
|
+
"claude-sonnet-5-5": { inputPerMillion: 2, cacheCreationInput5mPerMillion: 2.5, cacheCreationInput1hPerMillion: 4, cacheCreationInputPerMillion: 4, cachedInputPerMillion: 0.1, outputPerMillion: 10 },
|
|
418
442
|
"claude-sonnet-5": { inputPerMillion: 2, cacheCreationInput5mPerMillion: 2.5, cacheCreationInput1hPerMillion: 4, cacheCreationInputPerMillion: 4, cachedInputPerMillion: 0.2, outputPerMillion: 10, note: "Anthropic made the $2 input / $10 output introductory pricing permanent on August 10, 2026." },
|
|
419
443
|
"claude-sonnet-4-6": { inputPerMillion: 3, cacheCreationInput5mPerMillion: 3.75, cacheCreationInput1hPerMillion: 6, cacheCreationInputPerMillion: 6, cachedInputPerMillion: 0.3, outputPerMillion: 15 },
|
|
420
444
|
"claude-sonnet-4-5": { inputPerMillion: 3, cacheCreationInput5mPerMillion: 3.75, cacheCreationInput1hPerMillion: 6, cacheCreationInputPerMillion: 6, cachedInputPerMillion: 0.3, outputPerMillion: 15 },
|
|
421
445
|
"claude-sonnet-4": { inputPerMillion: 3, cacheCreationInput5mPerMillion: 3.75, cacheCreationInput1hPerMillion: 6, cacheCreationInputPerMillion: 6, cachedInputPerMillion: 0.3, outputPerMillion: 15 },
|
|
422
446
|
"claude-haiku-4-5": { inputPerMillion: 1, cacheCreationInput5mPerMillion: 1.25, cacheCreationInput1hPerMillion: 2, cacheCreationInputPerMillion: 2, cachedInputPerMillion: 0.1, outputPerMillion: 5 },
|
|
447
|
+
"claude-haiku-5-5": { inputPerMillion: 0.1, cacheCreationInput5mPerMillion: 0.125, cacheCreationInput1hPerMillion: 0.2, cacheCreationInputPerMillion: 0.2, cachedInputPerMillion: 0.01, outputPerMillion: 0.5, note: "Prompts up to 100,000 input tokens per request, including cache reads and writes. Larger prompts use the separately editable claude-haiku-5-5-long-context card. Aggregate-only usage stays unpriced when request lengths are unknown." },
|
|
448
|
+
"claude-haiku-5-5-long-context": { inputPerMillion: 0.5, cacheCreationInput5mPerMillion: 0.625, cacheCreationInput1hPerMillion: 1, cacheCreationInputPerMillion: 1, cachedInputPerMillion: 0.05, outputPerMillion: 2.5, note: "RepoSpend pricing card, not a provider model ID. Applied to the whole Haiku 5.5 request when total prompt length exceeds 100,000 tokens." },
|
|
423
449
|
"claude-3-5-haiku": { inputPerMillion: 0.8, cacheCreationInput5mPerMillion: 1, cacheCreationInput1hPerMillion: 1.6, cacheCreationInputPerMillion: 1.6, cachedInputPerMillion: 0.08, outputPerMillion: 4 }
|
|
424
450
|
};
|
|
425
451
|
var legacyBundledPricing = {
|
|
452
|
+
"claude-sonnet-5-5": { inputPerMillion: 2, cacheCreationInput5mPerMillion: 2.5, cacheCreationInput1hPerMillion: 4, cacheCreationInputPerMillion: 4, cachedInputPerMillion: 0.2, outputPerMillion: 10 },
|
|
426
453
|
"gpt-5.6": { inputPerMillion: 5, cachedInputPerMillion: 0.5, cacheCreationInputPerMillion: 6.25, outputPerMillion: 30, reasoningOutputPerMillion: 30, note: "GPT-5.6 Sol flagship tier. OpenAI preview pricing lists Sol at $5 input / $30 output per 1M tokens, cache writes at 1.25x input, and cache reads at a 90% discount." },
|
|
427
454
|
"gpt-5.6-sol": { inputPerMillion: 5, cachedInputPerMillion: 0.5, cacheCreationInputPerMillion: 6.25, outputPerMillion: 30, reasoningOutputPerMillion: 30 },
|
|
428
455
|
"gpt-5.6-terra": { inputPerMillion: 2.5, cachedInputPerMillion: 0.25, cacheCreationInputPerMillion: 3.125, outputPerMillion: 15, reasoningOutputPerMillion: 15 },
|
|
@@ -529,12 +556,43 @@ function savePricingTable(pricingPath, pricing) {
|
|
|
529
556
|
function repospendHome() {
|
|
530
557
|
return process.env.REPOSPEND_HOME || path.join(os.homedir(), ".repospend");
|
|
531
558
|
}
|
|
532
|
-
function calculateCostUsd(usage, pricing) {
|
|
559
|
+
function calculateCostUsd(usage, pricing, requestInputTokens) {
|
|
560
|
+
const cost = unroundedCostUsd(usage, pricing, requestInputTokens);
|
|
561
|
+
return cost === void 0 ? void 0 : Number((cost + Number.EPSILON).toFixed(6));
|
|
562
|
+
}
|
|
563
|
+
function calculateRequestCosts(requests, pricing) {
|
|
564
|
+
const resolutions = /* @__PURE__ */ new Map();
|
|
565
|
+
const warnings = /* @__PURE__ */ new Set();
|
|
566
|
+
let total = 0;
|
|
567
|
+
for (const request of requests) {
|
|
568
|
+
let resolution = request.model ? resolutions.get(request.model) : void 0;
|
|
569
|
+
if (request.model && !resolution) {
|
|
570
|
+
resolution = resolvePricingForModel(request.model, pricing);
|
|
571
|
+
resolutions.set(request.model, resolution);
|
|
572
|
+
}
|
|
573
|
+
const cost = unroundedCostUsd(request, pricing, request.requestInputTokens, resolution);
|
|
574
|
+
if (cost !== void 0) total += cost;
|
|
575
|
+
else if (request.model && resolution) {
|
|
576
|
+
const missingContext = needsHaikuContext(request.model, resolution) && (request.requestInputTokens === void 0 || !Number.isFinite(request.requestInputTokens) || request.requestInputTokens < 0);
|
|
577
|
+
warnings.add(missingContext ? "unknown_request_context" : `unknown_pricing_model:${normalizePricingModelId(request.model)}`);
|
|
578
|
+
} else warnings.add("unknown_pricing");
|
|
579
|
+
}
|
|
580
|
+
return { costUsd: requests.length && !warnings.size ? Number((total + Number.EPSILON).toFixed(6)) : void 0, warnings: [...warnings] };
|
|
581
|
+
}
|
|
582
|
+
function needsHaikuContext(model, resolution) {
|
|
583
|
+
return resolution.sourceModel === "claude-haiku-5-5" || resolution.inherited && /^claude-haiku-5-5(?:$|[-.@[])/.test(normalizePricingModelId(model));
|
|
584
|
+
}
|
|
585
|
+
function unroundedCostUsd(usage, pricing, requestInputTokens, cachedResolution) {
|
|
533
586
|
if (!usage.model) {
|
|
534
587
|
return void 0;
|
|
535
588
|
}
|
|
536
|
-
const
|
|
537
|
-
|
|
589
|
+
const resolution = cachedResolution ?? resolvePricingForModel(usage.model, pricing);
|
|
590
|
+
let modelPricing = resolution.pricing;
|
|
591
|
+
if (needsHaikuContext(usage.model, resolution)) {
|
|
592
|
+
if (requestInputTokens === void 0 || !Number.isFinite(requestInputTokens) || requestInputTokens < 0) return void 0;
|
|
593
|
+
modelPricing = pricing[requestInputTokens > 1e5 ? "claude-haiku-5-5-long-context" : "claude-haiku-5-5"];
|
|
594
|
+
}
|
|
595
|
+
if (!isUsableModelPricing(modelPricing)) {
|
|
538
596
|
return void 0;
|
|
539
597
|
}
|
|
540
598
|
const cacheCreationInput5m = usage.cacheCreationInputTokens5m ?? 0;
|
|
@@ -549,7 +607,7 @@ function calculateCostUsd(usage, pricing) {
|
|
|
549
607
|
const cacheCreation1hRate = firstPositiveRate(modelPricing.cacheCreationInput1hPerMillion, modelPricing.cacheCreationInputPerMillion, modelPricing.inputPerMillion);
|
|
550
608
|
const reasoningRate = modelPricing.reasoningOutputPerMillion ?? modelPricing.outputPerMillion;
|
|
551
609
|
const cost = billableInput / 1e6 * modelPricing.inputPerMillion + usage.cachedInputTokens / 1e6 * cachedRate + cacheCreationInput5m / 1e6 * cacheCreation5mRate + cacheCreationInput1h / 1e6 * cacheCreation1hRate + unclassifiedCacheCreationInput / 1e6 * cacheCreationRate + usage.outputTokens / 1e6 * modelPricing.outputPerMillion + usage.reasoningTokens / 1e6 * reasoningRate;
|
|
552
|
-
return
|
|
610
|
+
return cost;
|
|
553
611
|
}
|
|
554
612
|
function firstPositiveRate(...rates) {
|
|
555
613
|
return rates.find((rate) => typeof rate === "number" && Number.isFinite(rate) && rate > 0) ?? 0;
|
|
@@ -2288,12 +2346,13 @@ function threadToUsage(row, index, sessionFiles, options, importedModels = /* @_
|
|
|
2288
2346
|
sessionOutcome: inferOutcome(sessionBreakdown),
|
|
2289
2347
|
compaction: sessionBreakdown.compaction
|
|
2290
2348
|
};
|
|
2291
|
-
const
|
|
2349
|
+
const estimate = hasPricedBreakdown ? calculateRequestCosts([usage], options.pricing) : void 0;
|
|
2350
|
+
const cost = estimate?.costUsd;
|
|
2292
2351
|
const costWarnings = hasPricedBreakdown ? warnings : [...warnings, "missing_token_breakdown"];
|
|
2293
2352
|
return {
|
|
2294
2353
|
...usage,
|
|
2295
2354
|
estimatedCostUsd: cost,
|
|
2296
|
-
warnings: cost === void 0 ? [...costWarnings, "unknown_pricing"] : warnings
|
|
2355
|
+
warnings: cost === void 0 ? [.../* @__PURE__ */ new Set([...costWarnings, "unknown_pricing", ...estimate?.warnings ?? []])] : warnings
|
|
2297
2356
|
};
|
|
2298
2357
|
}
|
|
2299
2358
|
function readStandaloneSessions(sessionFiles, options) {
|
|
@@ -2363,11 +2422,12 @@ function readStandaloneSessions(sessionFiles, options) {
|
|
|
2363
2422
|
compaction: breakdown.compaction
|
|
2364
2423
|
};
|
|
2365
2424
|
const hasPricedBreakdown = breakdown.inputTokens + breakdown.cachedInputTokens + breakdown.outputTokens + breakdown.reasoningTokens > 0;
|
|
2366
|
-
const
|
|
2425
|
+
const estimate = hasPricedBreakdown ? calculateRequestCosts([usage], options.pricing) : void 0;
|
|
2426
|
+
const cost = estimate?.costUsd;
|
|
2367
2427
|
return {
|
|
2368
2428
|
...usage,
|
|
2369
2429
|
estimatedCostUsd: cost,
|
|
2370
|
-
warnings: cost === void 0 ? [...usage.warnings, hasPricedBreakdown ? "unknown_pricing" : "missing_token_breakdown"] : usage.warnings
|
|
2430
|
+
warnings: cost === void 0 ? [.../* @__PURE__ */ new Set([...usage.warnings, hasPricedBreakdown ? "unknown_pricing" : "missing_token_breakdown", ...estimate?.warnings ?? []])] : usage.warnings
|
|
2371
2431
|
};
|
|
2372
2432
|
});
|
|
2373
2433
|
}
|
|
@@ -3053,21 +3113,30 @@ function claudeBreakdownToUsage(file, index, options, breakdown, idSuffix = "")
|
|
|
3053
3113
|
promptTimeline: breakdown.promptTimeline,
|
|
3054
3114
|
sessionOutcome: inferOutcome2(breakdown)
|
|
3055
3115
|
};
|
|
3056
|
-
const
|
|
3057
|
-
for (const event of breakdown.usageEvents) {
|
|
3116
|
+
const requests = breakdown.usageEvents.map((event) => {
|
|
3058
3117
|
const model = event.model ?? breakdown.model;
|
|
3059
3118
|
const normalized = model ? normalizePricingModelId(model) : void 0;
|
|
3060
3119
|
const pricingModel = normalized && normalizedServiceTier(event.usage.speed) === "fast" && !normalized.includes("fast-mode") && !/^claude-opus-4-6(?:$|-)/.test(normalized) ? `${normalized}-fast-mode` : model;
|
|
3061
|
-
const totals =
|
|
3120
|
+
const totals = emptyBreakdown2();
|
|
3062
3121
|
applyUsage(totals, event.usage);
|
|
3063
|
-
|
|
3064
|
-
|
|
3065
|
-
|
|
3066
|
-
|
|
3122
|
+
return {
|
|
3123
|
+
model: pricingModel,
|
|
3124
|
+
inputTokens: totals.inputTokens,
|
|
3125
|
+
cachedInputTokens: totals.cachedInputTokens,
|
|
3126
|
+
cacheCreationInputTokens: totals.cacheCreationInputTokens,
|
|
3127
|
+
cacheCreationInputTokens5m: totals.cacheCreationInputTokens5m,
|
|
3128
|
+
cacheCreationInputTokens1h: totals.cacheCreationInputTokens1h,
|
|
3129
|
+
outputTokens: totals.outputTokens,
|
|
3130
|
+
reasoningTokens: 0,
|
|
3131
|
+
requestInputTokens: hasInputTokenCount(event.usage) ? totals.inputTokens : void 0
|
|
3132
|
+
};
|
|
3133
|
+
});
|
|
3134
|
+
const estimate = hasTokenBreakdown ? calculateRequestCosts(requests, options.pricing) : void 0;
|
|
3135
|
+
const cost = estimate?.costUsd;
|
|
3067
3136
|
return {
|
|
3068
3137
|
...usage,
|
|
3069
3138
|
estimatedCostUsd: cost,
|
|
3070
|
-
warnings: cost === void 0 ? [...usage.warnings, "unknown_pricing", ...
|
|
3139
|
+
warnings: cost === void 0 ? [.../* @__PURE__ */ new Set([...usage.warnings, "unknown_pricing", ...estimate?.warnings ?? [], ...estimate?.warnings.some((warning) => warning.startsWith("unknown_pricing_model:") && warning.includes("fast-mode")) ? ["unknown_fast_mode_pricing"] : []])] : usage.warnings
|
|
3071
3140
|
};
|
|
3072
3141
|
}
|
|
3073
3142
|
function inferClaudeEntrypointFromPath(filePath) {
|
|
@@ -3169,10 +3238,14 @@ function usageDedupKey(record, message) {
|
|
|
3169
3238
|
function occurrenceKey(filePath, recordIndex) {
|
|
3170
3239
|
return `${path6.resolve(filePath)}:${recordIndex}`;
|
|
3171
3240
|
}
|
|
3241
|
+
function hasInputTokenCount(usage) {
|
|
3242
|
+
const value = usage.input_tokens;
|
|
3243
|
+
return (typeof value === "number" || typeof value === "string" && value.trim() !== "") && Number.isFinite(Number(value)) && Number(value) >= 0;
|
|
3244
|
+
}
|
|
3172
3245
|
function cloneUsage(usage) {
|
|
3173
3246
|
const cacheCreation = firstObject4(usage.cache_creation);
|
|
3174
3247
|
return {
|
|
3175
|
-
input_tokens: numberValue(usage.input_tokens),
|
|
3248
|
+
input_tokens: hasInputTokenCount(usage) ? numberValue(usage.input_tokens) : void 0,
|
|
3176
3249
|
cache_read_input_tokens: numberValue(usage.cache_read_input_tokens),
|
|
3177
3250
|
cache_creation_input_tokens: numberValue(usage.cache_creation_input_tokens),
|
|
3178
3251
|
cache_creation: cacheCreation ? {
|
|
@@ -3187,7 +3260,7 @@ function cloneUsage(usage) {
|
|
|
3187
3260
|
function mergeUsageMax(target, usage) {
|
|
3188
3261
|
const targetCacheCreation = firstObject4(target.cache_creation) ?? {};
|
|
3189
3262
|
const usageCacheCreation = firstObject4(usage.cache_creation) ?? {};
|
|
3190
|
-
target.input_tokens = Math.max(numberValue(target.input_tokens), numberValue(usage.input_tokens));
|
|
3263
|
+
if (hasInputTokenCount(target) || hasInputTokenCount(usage)) target.input_tokens = Math.max(numberValue(target.input_tokens), numberValue(usage.input_tokens));
|
|
3191
3264
|
target.cache_read_input_tokens = Math.max(numberValue(target.cache_read_input_tokens), numberValue(usage.cache_read_input_tokens));
|
|
3192
3265
|
target.cache_creation_input_tokens = Math.max(numberValue(target.cache_creation_input_tokens), numberValue(usage.cache_creation_input_tokens));
|
|
3193
3266
|
target.cache_creation = {
|
|
@@ -3770,6 +3843,8 @@ function usageCandidateFromRecord(record, index, fallbackTimestamp, traceContext
|
|
|
3770
3843
|
const output = numberValue2(attributes["gen_ai.usage.output_tokens"]);
|
|
3771
3844
|
const cached = numberValue2(attributes["gen_ai.usage.cache_read.input_tokens"]);
|
|
3772
3845
|
const cacheCreation = firstPositiveNumber(attributes, ["gen_ai.usage.cache_write.input_tokens", "gen_ai.usage.cache_creation.input_tokens"]);
|
|
3846
|
+
const rawInput = attributes["gen_ai.usage.input_tokens"];
|
|
3847
|
+
const requestInputTokens = typeof rawInput === "number" && Number.isFinite(rawInput) && rawInput >= cached + cacheCreation ? rawInput : void 0;
|
|
3773
3848
|
const reasoning = firstPositiveNumber(attributes, ["gen_ai.usage.reasoning.output_tokens", "gen_ai.usage.reasoning_tokens"]);
|
|
3774
3849
|
const total = firstPositiveNumber(attributes, ["gen_ai.usage.total_tokens", "gen_ai.usage.total.token_count"]);
|
|
3775
3850
|
const outputWithFallback = output || outputTokensFromTotal(total, input, reasoning);
|
|
@@ -3786,6 +3861,7 @@ function usageCandidateFromRecord(record, index, fallbackTimestamp, traceContext
|
|
|
3786
3861
|
model: firstNonEmptyAttr(attributes, modelAttrs) ?? traceContext?.model,
|
|
3787
3862
|
timestamp: timestamp3,
|
|
3788
3863
|
durationMs: durationMsFromRecord(record),
|
|
3864
|
+
requestInputTokens,
|
|
3789
3865
|
inputTokens: input,
|
|
3790
3866
|
cachedInputTokens: cached,
|
|
3791
3867
|
cacheCreationInputTokens: cacheCreation,
|
|
@@ -3848,6 +3924,8 @@ function applyCandidate(breakdown, candidate) {
|
|
|
3848
3924
|
breakdown.endedAt = maxDate2(breakdown.endedAt, candidate.timestamp);
|
|
3849
3925
|
applyTokenEvent(breakdown, {
|
|
3850
3926
|
dedupKey: candidate.dedupKey,
|
|
3927
|
+
model: candidate.model,
|
|
3928
|
+
requestInputTokens: candidate.source === "chat_span" || candidate.source === "inference_log" ? candidate.requestInputTokens : void 0,
|
|
3851
3929
|
detailed: candidate.inputTokens > 0 || candidate.cachedInputTokens > 0 || candidate.cacheCreationInputTokens > 0 || candidate.reasoningTokens > 0,
|
|
3852
3930
|
inputTokens: candidate.inputTokens,
|
|
3853
3931
|
cachedInputTokens: candidate.cachedInputTokens,
|
|
@@ -3969,8 +4047,9 @@ function breakdownToUsage(breakdown, index, options) {
|
|
|
3969
4047
|
fileEditCount: breakdown.fileEditCount,
|
|
3970
4048
|
sourceMetadata: { copilot: { sourcePaths: breakdown.sourcePaths, surface: breakdown.surface } }
|
|
3971
4049
|
};
|
|
3972
|
-
const
|
|
3973
|
-
|
|
4050
|
+
const estimate = hasPricedBreakdown ? calculateRequestCosts(breakdown.tokenEvents.map((event) => ({ ...event, model: normalizeCopilotModel(hasKnownModel(event.model) ? event.model : breakdown.model) })), options.pricing) : void 0;
|
|
4051
|
+
const cost = estimate?.costUsd;
|
|
4052
|
+
return { ...usage, estimatedCostUsd: cost, warnings: hasPricedBreakdown && cost === void 0 ? [.../* @__PURE__ */ new Set([...usage.warnings, "unknown_pricing", ...estimate?.warnings ?? []])] : usage.warnings };
|
|
3974
4053
|
}
|
|
3975
4054
|
function unknownCopilotRepoInfo() {
|
|
3976
4055
|
return {
|
|
@@ -4875,12 +4954,13 @@ function candidateToUsage(candidate, index, options) {
|
|
|
4875
4954
|
}
|
|
4876
4955
|
}
|
|
4877
4956
|
};
|
|
4878
|
-
const
|
|
4957
|
+
const estimate = hasTokenBreakdown ? calculateRequestCosts([usage], options.pricing) : void 0;
|
|
4958
|
+
const pricedCost = estimate?.costUsd;
|
|
4879
4959
|
const estimatedCostUsd = pricedCost ?? breakdown.estimatedCostUsd;
|
|
4880
4960
|
return {
|
|
4881
4961
|
...usage,
|
|
4882
4962
|
estimatedCostUsd,
|
|
4883
|
-
warnings: estimatedCostUsd === void 0 ? [...usage.warnings, breakdown.hasEstimatedPromptTokens ? "cursor_cost_not_estimated_from_prompt_tokens" : hasTokenBreakdown ? "unknown_pricing" : "unknown_cost"] : usage.warnings
|
|
4963
|
+
warnings: estimatedCostUsd === void 0 ? [.../* @__PURE__ */ new Set([...usage.warnings, breakdown.hasEstimatedPromptTokens ? "cursor_cost_not_estimated_from_prompt_tokens" : hasTokenBreakdown ? "unknown_pricing" : "unknown_cost", ...estimate?.warnings ?? []])] : usage.warnings
|
|
4884
4964
|
};
|
|
4885
4965
|
}
|
|
4886
4966
|
function inferProjectPathFromCursorPath(filePath, cursorHome) {
|
package/docs/llms.txt
CHANGED
|
@@ -58,6 +58,10 @@ Positioning:
|
|
|
58
58
|
- RepoSpend totals can intentionally differ from ccusage or Tokscale because it includes Claude Desktop/local-agent session roots when present, treats cache reads/writes as input sub-buckets, prices Claude cache writes by recorded 5-minute vs 1-hour TTL, and separates Codex visible output from reasoning output.
|
|
59
59
|
|
|
60
60
|
Cost language:
|
|
61
|
+
- October 17, 2026 pricing update: Sonnet 5.5 cache reads are $0.10 per million tokens; Sonnet 5 remains at $0.20.
|
|
62
|
+
- Haiku 5.5 has two per-request prompt-length tiers: input/cache read/output $0.10/$0.01/$0.50 up to 100K, and $0.50/$0.05/$2.50 above 100K. Cache writes have separate 5-minute and 1-hour rates. Unknown request lengths stay unpriced.
|
|
63
|
+
- Gemini 4 Argon introductory input/cache read/output rates are $2/$0.10/$10 through November 30, 2026, then published rates become $4/$0.20/$20. Bundled tables are a dated snapshot, not an automatic future rate switch.
|
|
64
|
+
- Current API-equivalent pricing applied to older usage is not historical billing reconstruction.
|
|
61
65
|
- GPT-6.1 Sol has an explicit Standard short-context card: $2 input, $0.10 cached input, $2.50 cache writes, $10 output per million tokens, checked September 29, 2026.
|
|
62
66
|
- RepoSpend shows estimated API-equivalent cost.
|
|
63
67
|
- RepoSpend does not claim to show actual bills, invoices, subscription usage, savings, credits, or account-specific charges.
|
package/docs/pricing.md
CHANGED
|
@@ -4,7 +4,26 @@ RepoSpend estimates API-equivalent cost from a local pricing table. The bundled
|
|
|
4
4
|
|
|
5
5
|
The bundled table is seeded from public OpenAI, Anthropic, Google, and GitHub Copilot model references and is expressed as USD per 1M tokens. Pricing changes over time, so treat RepoSpend costs as API-equivalent estimates rather than invoice-grade accounting.
|
|
6
6
|
|
|
7
|
-
The GPT-6.1 Sol card was checked on September 29
|
|
7
|
+
The October 17, 2026 update checks Claude Haiku 5.5, Sonnet 5.5, and Gemini 4 Argon against provider documentation. The GPT-6.1 Sol card was checked on September 29; the other bundled defaults retain the September 28 snapshot. Defaults use published Standard API prices. Sonnet 5.5 cache reads fell from $0.20 to $0.10 per 1M tokens on October 7; its $2 input, $10 output, $2.50 5-minute writes, and $4 1-hour writes are unchanged. Sonnet 5 retains its $0.20 cache-read rate.
|
|
8
|
+
|
|
9
|
+
### Claude Haiku 5.5 and request-length pricing
|
|
10
|
+
|
|
11
|
+
All rates are USD per 1M tokens, using Anthropic's global Standard API prices:
|
|
12
|
+
|
|
13
|
+
| Prompt length per request | Input | Cache reads | 5m writes | 1h writes | Output |
|
|
14
|
+
| --- | ---: | ---: | ---: | ---: | ---: |
|
|
15
|
+
| Up to and including 100,000 tokens | $0.10 | $0.01 | $0.125 | $0.20 | $0.50 |
|
|
16
|
+
| Over 100,000 tokens | $0.50 | $0.05 | $0.625 | $1 | $2.50 |
|
|
17
|
+
|
|
18
|
+
Prompt length includes uncached input, cache reads, and cache writes. The higher rates apply to the whole qualifying request, not just tokens above 100K. Multiple short requests keep the lower rates even when combined session input exceeds 100K. Claude's deduplicated usage events and Copilot chat/inference records are priced individually, then their unrounded costs are summed before rounding the session estimate once.
|
|
19
|
+
|
|
20
|
+
Settings exposes `claude-haiku-5-5` for the lower tier and `claude-haiku-5-5-long-context` for the higher tier. The latter is a RepoSpend rate card, not a provider model ID; both can be edited separately. The higher-tier card appears with used Haiku models. Editing an inherited Haiku snapshot updates the shared base card and retains automatic tier selection. Use Add model to intentionally create an exact custom snapshot with flat rates; such overrides remain authoritative. Haiku usage without a known request length (including aggregate-only Copilot, Codex, or experimental Cursor totals) stays unpriced unless an explicit custom flat snapshot card or recorded Cursor cost is available. Pricing triage distinguishes missing request lengths from missing rates and exposes any unpriced auxiliary request models. Unknown fast-mode cards remain unpriced.
|
|
21
|
+
|
|
22
|
+
These are current API-equivalent rates applied to the selected usage window, not historical date-effective billing. The Sonnet reduction does not claim that pre-October 7 API requests were billed at the new price. Sources: [Anthropic pricing](https://platform.claude.com/docs/en/about-claude/pricing), [October 7 announcement](https://www.anthropic.com/claude-haiku-5-5).
|
|
23
|
+
|
|
24
|
+
### Gemini 4 Argon introductory rates
|
|
25
|
+
|
|
26
|
+
`gemini-4-argon`, including Copilot-prefixed/suffixed aliases, uses $2 input, $0.10 cached input, and $10 output (including thinking) per 1M tokens through November 30, 2026. Google lists $4 input, $0.20 cached input, and $20 output from December 1. Argon has no explicit cache-write charge. Bundled rates are a verified snapshot: the application does not silently switch prices based on the machine clock. Refresh the table at the promotion boundary or save intentional overrides. Source: [Google's model and pricing guide](https://ai.google.dev/gemini-api/docs/latest-model?hl=en).
|
|
8
27
|
|
|
9
28
|
GPT-6 Astra, Sol, and Luna use OpenAI's Standard short-context rates. Their long-context requests above 272,000 input tokens use different rates, and local session totals do not identify every request's pricing tier. Fast, batch, and regional processing can also differ from these defaults. RepoSpend keeps the result labeled as an API-equivalent estimate.
|
|
10
29
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "repospend",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"description": "Local-first dashboard for tracking AI coding token usage and API-equivalent spend by repository, session, model, and tool.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Mehmet Mustafa Demir",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.visible{visibility:visible}.absolute{position:absolute}.mb-2{margin-bottom:.5rem}.ml-1{margin-left:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.max-w-72{max-width:18rem}.max-w-80{max-width:20rem}.max-w-96{max-width:24rem}.shrink-0{flex-shrink:0}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.resize{resize:both}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.border{border-width:1px}.border-line{--tw-border-opacity: 1;border-color:rgb(217 221 229 / var(--tw-border-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.text-amber{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-plum{--tw-text-opacity: 1;color:rgb(124 58 237 / var(--tw-text-opacity, 1))}.text-slate-100{--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-teal{--tw-text-opacity: 1;color:rgb(15 118 110 / var(--tw-text-opacity, 1))}.\!filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}*{box-sizing:border-box}body{margin:0;background:radial-gradient(circle at 18% 0%,rgba(37,99,235,.12),transparent 26rem),radial-gradient(circle at 88% 8%,rgba(20,184,166,.08),transparent 24rem),#060b12;color:#e5e7eb;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}button,select,input{font:inherit}.panel{border:1px solid rgba(148,163,184,.18);background:linear-gradient(180deg,#0f172ae0,#0a121dd1);border-radius:8px;box-shadow:0 14px 42px #0000003d,inset 0 1px #ffffff08}.panel-heading{display:flex;min-height:56px;align-items:center;justify-content:space-between;gap:12px;border-bottom:1px solid rgba(148,163,184,.16);padding:12px 16px}.panel-heading h2{font-size:15px;font-weight:650;color:#f8fafc}.panel-actions{display:flex;align-items:center;justify-content:flex-end;gap:10px;flex-wrap:wrap}.chart-panel{display:flex;min-width:0;flex-direction:column}.chart-panel-body{flex:1;min-height:0}.app-shell{display:grid;min-height:100vh;grid-template-columns:260px minmax(0,1fr)}.app-shell.sidebar-collapsed{grid-template-columns:72px minmax(0,1fr)}.sidebar{position:sticky;top:0;display:flex;height:100vh;flex-direction:column;gap:22px;border-right:1px solid rgba(148,163,184,.18);background:#030712d1;padding:22px 16px;transition:width .16s ease,padding .16s ease;overflow:hidden}.sidebar-collapsed .sidebar{align-items:center;padding:18px 10px}.brand-lockup{display:flex;align-items:center;gap:12px;padding:4px;min-width:0;width:100%}.brand-mark{display:grid;height:38px;width:38px;place-items:center;border-radius:10px;background:linear-gradient(135deg,#6d5dfc,#2dd4bf);color:#fff}.brand-lockup h1{color:#fff;font-size:19px;font-weight:760;letter-spacing:0}.brand-lockup p{color:#94a3b8;font-size:12px}.brand-text{min-width:0}.sidebar-toggle{display:grid;height:30px;width:30px;flex:0 0 auto;place-items:center;border:1px solid rgba(148,163,184,.18);border-radius:8px;background:#0f172ad1;color:#cbd5e1;cursor:pointer;margin-left:auto}.sidebar-toggle:hover{background:#1e293beb;color:#fff}.sidebar-collapsed .brand-lockup{justify-content:center;flex-direction:column;gap:8px}.sidebar-collapsed .brand-text,.sidebar-collapsed .nav-item span,.sidebar-collapsed .sidebar-label,.sidebar-collapsed .sidebar-status div,.sidebar-collapsed .quick-link-label,.sidebar-collapsed .quick-link-external{display:none}.sidebar-collapsed .sidebar-toggle{margin-left:0}.sidebar-nav{display:grid;gap:6px}.nav-item{position:relative;display:flex;min-height:40px;align-items:center;gap:10px;border:1px solid transparent;border-radius:8px;background:transparent;color:#cbd5e1;cursor:pointer;padding:0 11px;text-align:left}.nav-badge{display:inline-flex;min-width:22px;height:22px;align-items:center;justify-content:center;border:1px solid rgba(245,158,11,.36);border-radius:999px;background:#f59e0b1f;color:#fbbf24;font-size:11px;font-weight:800;margin-left:auto;padding:0 6px}.sidebar-collapsed .nav-item{width:42px;justify-content:center;padding:0}.sidebar-collapsed .nav-badge{position:absolute;right:4px;top:4px;min-width:16px;height:16px;font-size:9px;padding:0 4px}.sidebar-collapsed .quick-link{width:42px;justify-content:center;padding:0}.nav-item:hover{background:#94a3b814;color:#fff}.nav-item.active{border-color:#2dd4bf75;background:linear-gradient(135deg,#0d9488eb,#1e40afc2);color:#fff}.sidebar-section{display:grid;gap:8px;border-top:1px solid rgba(148,163,184,.14);padding-top:16px;width:100%}.quick-links{display:grid;gap:7px}.quick-link{--quick-link-accent: #94a3b8;position:relative;display:flex;min-height:38px;min-width:0;align-items:center;gap:9px;overflow:hidden;border:1px solid rgba(148,163,184,.16);border-radius:8px;background:linear-gradient(135deg,#0f172ac7,#020617e6);color:#dbeafe;padding:0 9px;text-decoration:none;transition:background-color .14s ease,border-color .14s ease,color .14s ease,transform .14s ease}.quick-link:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(90deg,color-mix(in srgb,var(--quick-link-accent) 18%,transparent),transparent 56%);opacity:0;transition:opacity .14s ease}.quick-link:hover{border-color:color-mix(in srgb,var(--quick-link-accent) 48%,rgba(148,163,184,.2));color:#fff;transform:translateY(-1px)}.quick-link:hover:before{opacity:1}.quick-link-icon,.quick-link-label,.quick-link-external{position:relative;z-index:1}.quick-link-icon{display:grid;width:24px;height:24px;flex:0 0 auto;place-items:center;border:1px solid color-mix(in srgb,var(--quick-link-accent) 36%,transparent);border-radius:7px;background:color-mix(in srgb,var(--quick-link-accent) 12%,rgba(15,23,42,.88));color:var(--quick-link-accent)}.quick-link-label{min-width:0;flex:1 1 auto;overflow:hidden;font-size:13px;font-weight:720;text-overflow:ellipsis;white-space:nowrap}.quick-link-external{flex:0 0 auto;color:#64748b;transition:color .14s ease,transform .14s ease}.quick-link:hover .quick-link-external{color:var(--quick-link-accent);transform:translate(1px,-1px)}.quick-link-codex{--quick-link-accent: #5eead4}.quick-link-claude{--quick-link-accent: #fb923c}.quick-link-cursor{--quick-link-accent: #38bdf8}.quick-link-github{--quick-link-accent: #c4b5fd}.quick-link-npm{--quick-link-accent: #cb3837}.sidebar-label{color:#64748b;font-size:11px;font-weight:700;text-transform:uppercase}.sidebar-status{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px;margin-top:auto;border-top:1px solid rgba(148,163,184,.14);color:#e2e8f0;font-size:13px;padding-top:16px}.sidebar-collapsed .sidebar-status{grid-template-columns:1fr;justify-items:center;width:100%}.sidebar-collapsed .sidebar-status .icon-button{margin-top:8px}.sidebar-status span:not(.status-dot){color:#64748b;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:11px}.status-dot{display:inline-block;height:9px;width:9px;border-radius:999px;background:#22c55e;box-shadow:0 0 16px #22c55ebf}.icon-button{display:grid;height:34px;width:34px;place-items:center;border:1px solid rgba(148,163,184,.18);border-radius:8px;background:#0f172ae6;color:#cbd5e1;cursor:pointer}.content-shell{min-width:0;width:100%;max-width:2400px;padding:24px}.page-header{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:16px}.page-title-lockup{display:flex;min-width:0;align-items:center;gap:12px}.page-title-icon{display:grid;height:40px;width:40px;flex:0 0 auto;place-items:center;border:1px solid rgba(45,212,191,.2);border-radius:8px;background:#0f172ab8;color:#5eead4}.page-header h2{color:#fff;font-size:22px;font-weight:760}.page-header p{color:#94a3b8;font-size:13px}.page-header-actions{display:flex;flex:0 0 auto;align-items:center;gap:8px}.page-filter-notice{display:inline-flex;max-width:100%;align-items:center;gap:8px;border:1px solid rgba(245,158,11,.26);border-radius:999px;background:#f59e0b14;color:#fcd34d;font-size:12px;font-weight:700;margin-top:9px;padding:4px 9px}.page-filter-notice span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.page-header-badge{display:inline-flex;align-items:center;gap:8px;border:1px solid rgba(148,163,184,.16);border-radius:8px;background:#0f172ab8;color:#cbd5e1;font-size:12px;padding:8px 10px}.page-summary-panel{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}.dashboard-grid{display:grid;grid-template-columns:minmax(0,1fr) 340px;gap:16px}.overview-chart-stack{display:grid;align-items:stretch;gap:16px}.overview-chart-panel{height:100%;min-height:332px}.model-chart-panel{min-height:340px}.model-shape-panel{overflow:hidden}.chart-panel-actions .field{min-width:220px}.model-shape-list{display:grid;gap:12px;grid-template-columns:repeat(2,minmax(0,1fr));padding:14px}.model-share-list{display:grid;gap:10px;border-bottom:1px solid rgba(148,163,184,.12);padding:14px}.model-share-row{display:grid;min-width:0;align-items:center;gap:8px;grid-template-columns:minmax(0,1fr) 56px}.model-share-copy{display:flex;min-width:0;align-items:center;justify-content:space-between;gap:10px}.model-share-copy strong,.model-share-row>span{color:#cbd5e1;font-size:12px;font-variant-numeric:tabular-nums;font-weight:700;text-align:right}.model-share-track{grid-column:1 / -1;height:8px;overflow:hidden;border-radius:999px;background:#94a3b81f}.model-share-track div{height:100%;border-radius:inherit;background:linear-gradient(90deg,#2dd4bf,#6d5dfc)}.model-share-empty{color:#94a3b8;font-size:13px;padding:14px}.overview-chart-pair{display:grid;align-items:stretch;gap:16px;grid-template-columns:repeat(2,minmax(0,1fr))}.timeline-context-row{display:grid;gap:10px;grid-template-columns:repeat(3,minmax(0,1fr));border-bottom:1px solid rgba(148,163,184,.12);margin:-2px 0 12px;padding:0 2px 12px}.timeline-context-item{min-width:0}.timeline-context-item span{display:block;color:#64748b;font-size:11px;font-weight:750;text-transform:uppercase}.timeline-context-item strong{display:block;overflow:hidden;color:#e2e8f0;font-size:13px;font-weight:700;margin-top:3px;text-overflow:ellipsis;white-space:nowrap}.primary-kpi-grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.top-actions-card{border-color:#f59e0b47;background:linear-gradient(135deg,rgba(245,158,11,.1),transparent 42%),linear-gradient(180deg,#0f172af5,#080d19f0);overflow:hidden}.top-actions-list{display:grid;gap:10px;grid-template-columns:repeat(3,minmax(0,1fr));padding:12px}.top-action-row{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:start;gap:10px;min-height:72px;border:1px solid rgba(148,163,184,.18);border-radius:8px;background:#0206176b;color:#e2e8f0;cursor:pointer;padding:12px;text-align:left}.top-action-row:hover,.top-action-row:focus-visible{border-color:#2dd4bf57;background:#2dd4bf14;outline:none}.top-action-row strong,.top-action-row small{display:block;min-width:0}.top-action-row strong{color:#f8fafc;font-size:13px;font-weight:760}.top-action-row small{color:#94a3b8;font-size:12px;margin-top:3px}.top-action-icon{display:grid;height:30px;width:30px;place-items:center;border-radius:8px}.top-action-attention{background:#f59e0b1f;color:#fbbf24}.top-action-good{background:#22c55e1f;color:#86efac}.top-action-neutral{background:#6d5dfc24;color:#a78bfa}.kpi-card{overflow:hidden;padding:14px}.kpi-card-strong{border-color:#2dd4bf57;background:linear-gradient(180deg,#0e242ff5,#0b1422e6)}.kpi-label{display:inline-flex;align-items:center;gap:6px;color:#cbd5e1;font-size:12px}.kpi-icon{display:grid;height:28px;width:28px;place-items:center;border:1px solid rgba(45,212,191,.24);border-radius:8px;background:#2dd4bf1f;color:#5eead4}.kpi-value{margin-top:8px;color:#fff;font-size:24px;font-weight:760;line-height:1.1;overflow-wrap:anywhere}.kpi-detail{margin-top:6px;color:#94a3b8;font-size:12px}.kpi-detail-stack{display:flex;min-width:0;flex-wrap:wrap;align-items:center;gap:6px}.kpi-link{max-width:100%;overflow:hidden;color:inherit;cursor:pointer;font:inherit;text-align:left;text-overflow:ellipsis;white-space:nowrap}.kpi-link:hover,.kpi-link:focus-visible{color:#5eead4;outline:none}.secondary-metric-grid,.data-health-grid,.waste-grid{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}.source-breakdown-panel{overflow:hidden}.source-breakdown-grid{display:grid;gap:10px;padding:12px}.source-breakdown-row{display:grid;grid-template-columns:160px repeat(4,minmax(0,1fr));align-items:center;gap:10px;border:1px solid rgba(148,163,184,.12);border-radius:8px;background:#0206173d;padding:10px}.source-note{border-top:1px solid rgba(148,163,184,.12);color:#94a3b8;font-size:12px;padding:10px 14px 12px}.breakdown-heading{display:grid;grid-template-columns:1fr auto 1fr;align-items:center}.breakdown-heading-text{justify-self:start}.breakdown-tabs{display:inline-flex;gap:4px;border:1px solid rgba(148,163,184,.16);border-radius:8px;background:#02061747;justify-self:center;padding:4px}.breakdown-tabs button{border:0;border-radius:6px;background:transparent;color:#94a3b8;cursor:pointer;font-size:12px;font-weight:700;padding:6px 10px}.breakdown-tabs button:hover{color:#f8fafc}.breakdown-tabs button.active{background:#2dd4bf1f;color:#5eead4}.data-health-card{overflow:hidden;padding:14px}.data-health-main{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:2px 2px 14px}.data-health-main h2{color:#f8fafc;font-size:15px;font-weight:650}.data-health-main p{color:#94a3b8;font-size:13px}.confidence-issue-list{display:grid;gap:10px}.compact-confidence-list{margin-top:12px}.confidence-issue-row{display:flex;align-items:flex-start;gap:10px;border:1px solid rgba(148,163,184,.12);border-radius:8px;background:#02061738;color:#cbd5e1;font-size:13px;line-height:1.45;padding:10px}.confidence-issue-row strong{color:#f8fafc;font-size:13px}.confidence-issue-row p{color:#94a3b8;margin-top:3px}.confidence-issue-row span:last-child{color:#64748b;font-size:12px}.confidence-critical{border-color:#f8717147}.confidence-attention{border-color:#f59e0b3d}.token-accuracy-card{padding:14px}.token-accuracy-main{padding:2px 2px 14px}.token-accuracy-main h2{color:#f8fafc;font-size:15px;font-weight:650}.token-accuracy-main p{color:#94a3b8;font-size:13px}.token-accuracy-grid,.parser-health-grid{display:grid;gap:12px;grid-template-columns:repeat(5,minmax(0,1fr))}.parser-health-grid{grid-template-columns:repeat(4,minmax(0,1fr))}.panel-inline-heading{display:flex;align-items:center;gap:8px}.panel-inline-heading h2{color:#f8fafc;font-size:15px;font-weight:650}.empty-panel{padding:18px}.loading-state{border-color:#2dd4bf57;margin-top:16px;padding:18px}.loading-state-compact{position:sticky;top:12px;z-index:15;margin-top:12px;padding:12px 14px;box-shadow:0 14px 38px #0000005c,0 0 0 1px #2dd4bf1f}.loading-state-inner{display:flex;align-items:flex-start;gap:12px}.loading-state-icon{height:20px;width:20px;color:#2dd4bf;margin-top:2px}.loading-state h2{color:#f8fafc;font-size:15px;font-weight:760}.loading-state p{color:#94a3b8;font-size:13px;margin-top:3px}.loading-source-grid{display:grid;gap:8px;grid-template-columns:repeat(4,minmax(0,1fr));margin-top:14px}.loading-source-row{display:flex;align-items:flex-start;gap:8px;min-width:0;border:1px solid rgba(148,163,184,.14);border-radius:8px;background:#0206174d;padding:9px}.loading-source-row strong,.loading-stage-row strong{display:block;color:#e2e8f0;font-size:12px;font-weight:720}.loading-source-row small,.loading-stage-row small{display:block;color:#94a3b8;font-size:11px;line-height:1.35;margin-top:2px}.loading-source-dot{flex:0 0 auto;width:8px;height:8px;border-radius:999px;background:#2dd4bf;margin-top:5px;box-shadow:0 0 0 4px #2dd4bf1a}.loading-source-dot-claude{background:#f59e0b;box-shadow:0 0 0 4px #f59e0b1a}.loading-source-dot-cursor{background:#8b5cf6;box-shadow:0 0 0 4px #8b5cf61a}.loading-source-dot-rtk{background:#38bdf8;box-shadow:0 0 0 4px #38bdf81a}.loading-stage-list{display:grid;gap:8px;margin-top:12px}.loading-stage-row{display:flex;align-items:flex-start;gap:9px;color:#64748b}.loading-stage-row>span{display:grid;place-items:center;flex:0 0 auto;width:22px;height:22px;border:1px solid rgba(148,163,184,.18);border-radius:999px;background:#0f172ab3;color:#94a3b8;font-size:11px;font-weight:800}.loading-stage-row>span:after{content:"";width:6px;height:6px;border-radius:inherit;background:#64748b}.loading-state-note{border-top:1px solid rgba(148,163,184,.12);padding-top:10px}.key-insights-grid{display:grid;gap:10px;grid-template-columns:repeat(3,minmax(0,1fr))}.key-insights-list{display:grid;gap:10px}.key-insight{border:1px solid rgba(148,163,184,.14);border-radius:8px;background:#0206176b;color:#dbeafe;font-size:13px;line-height:1.45;padding:12px}.key-insight-topline{display:flex;align-items:center;justify-content:space-between;gap:10px;color:#94a3b8;font-size:11px;font-weight:750;text-transform:uppercase}.key-insight-topline strong{color:#f8fafc;font-size:12px;text-transform:none}.key-insight p{margin-top:7px}.key-insight-good{border-color:#2dd4bf42}.key-insight-attention{border-color:#f59e0b4d}.waste-card{border:1px solid rgba(245,158,11,.24);border-radius:8px;background:#f59e0b14;padding:12px}.waste-good{border-color:#2dd4bf42;background:#2dd4bf12}.button{display:inline-flex;min-height:36px;align-items:center;gap:8px;border:1px solid rgba(148,163,184,.18);border-radius:8px;background:#0f172ad1;color:#dbeafe;padding:7px 10px;text-decoration:none;cursor:pointer;transition:background-color .14s ease,border-color .14s ease,color .14s ease}.button:hover{background:#1e293be6}.compact-button{min-height:30px;padding:5px 9px}.danger-button{border-color:#ef44446b;background:#7f1d1d47;color:#fecaca}.danger-button:hover{background:#7f1d1d6b;color:#fff1f2}.active-button{border-color:#6d5dfc8c;background:#6d5dfc2e;color:#c4b5fd;font-weight:650}.red-zone{display:flex;align-items:center;justify-content:space-between;gap:16px;border-color:#ef444452}.red-zone h2{color:#fecaca;font-size:15px;font-weight:760}.red-zone p{color:#cbd5e1;font-size:13px;line-height:1.55;margin-top:4px}.red-zone code{color:#fca5a5}.text-button{border:0;background:transparent;color:#2dd4bf;cursor:pointer;font-size:12px;font-weight:700;padding:0;text-decoration:none}.text-button:focus-visible,.button:focus-visible,.icon-button:focus-visible,.sidebar-toggle:focus-visible,.nav-item:focus-visible,.quick-filter:focus-visible,.settings-tab:focus-visible,.repo-detail-tabs button:focus-visible,.session-detail-tabs button:focus-visible,.date-range-shortcuts button:focus-visible,.breakdown-tabs button:focus-visible{outline:2px solid rgba(45,212,191,.76);outline-offset:2px}.row-link-button{border:0;background:transparent;color:inherit;cursor:pointer;font:inherit;font-weight:700;padding:0;text-align:left}.row-link-button:hover,.row-link-button:focus-visible{color:#5eead4;text-decoration:underline;text-decoration-style:dotted;text-underline-offset:4px}.field{display:flex;min-width:0;flex-direction:column;gap:6px}.filter-grid{display:grid;align-items:start;gap:10px;grid-template-columns:repeat(4,minmax(164px,1fr)) minmax(190px,.8fr)}.field>span{display:flex;align-items:center;gap:6px;font-size:12px;font-weight:650;color:#94a3b8}.field select,.field input{min-width:0;height:38px;border:1px solid rgba(148,163,184,.2);border-radius:8px;background:#020617ad;color:#f8fafc;padding:0 10px}.display-control-row,.settings-control-grid{display:grid;gap:12px;grid-template-columns:repeat(2,minmax(0,1fr))}.settings-toggle-card{display:flex;min-width:0;align-items:flex-start;gap:10px;border:1px solid rgba(148,163,184,.16);border-radius:8px;background:#0206176b;color:#e2e8f0;cursor:pointer;padding:12px}.settings-toggle-card:hover{border-color:#2dd4bf47}.settings-toggle-card input{width:16px;height:16px;margin-top:2px;accent-color:#2dd4bf}.settings-toggle-copy{display:grid;gap:4px}.settings-toggle-copy strong{color:#f8fafc;font-size:13px;font-weight:750}.settings-toggle-copy span{color:#94a3b8;font-size:12px;line-height:1.45}.limit-select{display:grid;gap:6px}.limit-select span{color:#94a3b8;font-size:12px;font-weight:700;text-transform:uppercase}.limit-select select{min-height:38px;border:1px solid rgba(148,163,184,.22);border-radius:8px;background:#0206176b;color:#f8fafc;padding:0 10px}.app-picker-field{min-width:0}.filter-dropdown{position:relative;min-width:0}.filter-dropdown summary{display:grid;min-height:54px;align-content:center;gap:4px;border:1px solid rgba(148,163,184,.18);border-radius:8px;background:#02061780;color:#cbd5e1;cursor:pointer;list-style:none;padding:8px 10px}.filter-dropdown summary::-webkit-details-marker{display:none}.filter-dropdown summary:hover,.filter-dropdown[open] summary{border-color:#2dd4bf4d;background:#0f172ab8}.filter-dropdown-label,.filter-dropdown-value{display:flex;min-width:0;align-items:center;gap:6px}.filter-dropdown-label{color:#94a3b8;font-size:11px;font-weight:760;text-transform:uppercase}.filter-dropdown-value{overflow:hidden;color:#e2e8f0;font-size:13px;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.filter-dropdown-value.active{color:#99f6e4}.filter-dropdown-body{position:absolute;z-index:30;top:calc(100% + 8px);left:0;width:min(460px,calc(100vw - 32px));border:1px solid rgba(148,163,184,.2);border-radius:8px;background:#030712fa;box-shadow:0 24px 80px #0000006b;padding:12px}.filter-dropdown-align-end .filter-dropdown-body{right:0;left:auto}.filter-dropdown-body .app-picker-field>span{color:#e2e8f0}.app-picker{display:flex;min-height:38px;min-width:0;flex-wrap:wrap;gap:6px;align-content:flex-start;border:1px solid rgba(148,163,184,.2);border-radius:8px;background:#02061775;overflow:visible;padding:5px}.filter-search-field{display:flex;min-height:32px;align-items:center;gap:7px;border:1px solid rgba(148,163,184,.18);border-radius:8px;background:#02061761;color:#94a3b8;margin-bottom:6px;padding:0 8px}.filter-search-field input{min-width:0;width:100%;border:0;background:transparent;color:#f8fafc;font-size:12px;outline:none}.filter-search-field input::-moz-placeholder{color:#64748b}.filter-search-field input::placeholder{color:#64748b}.filter-empty{align-self:center;color:#94a3b8;font-size:12px;padding:4px 8px}.app-pill{display:inline-flex;max-width:100%;min-height:28px;align-items:center;gap:6px;border:1px solid transparent;border-radius:7px;background:transparent;color:#cbd5e1;cursor:pointer;font-size:12px;font-weight:650;padding:4px 8px}.app-pill:hover{background:#94a3b81a;color:#f8fafc}.app-pill.active{border-color:#2dd4bf57;background:#2dd4bf1f;color:#5eead4}.app-pill span{color:inherit;font-size:inherit;font-weight:inherit;line-height:1.2;overflow-wrap:anywhere;white-space:normal}.date-range-picker{min-width:240px}.date-range-select-row{display:grid}.date-range-shortcuts{display:flex;flex-wrap:wrap;gap:6px}.date-range-shortcuts button{min-height:28px;border:1px solid rgba(148,163,184,.16);border-radius:999px;background:#0f172a8a;color:#94a3b8;cursor:pointer;font-size:12px;font-weight:700;padding:4px 10px}.date-range-shortcuts button:hover,.date-range-shortcuts button.active{border-color:#2dd4bf57;background:#2dd4bf1a;color:#5eead4}.app-label{display:inline-flex;align-items:center;gap:7px;color:#e2e8f0}.source-badge{display:inline-flex;align-items:center;gap:7px;width:-moz-max-content;width:max-content;max-width:100%;border:1px solid rgba(148,163,184,.16);border-radius:999px;background:#0f172ab8;color:#e2e8f0;font-size:12px;font-weight:700;padding:5px 8px}.source-app-cell{display:flex;min-width:0;flex-direction:column;gap:5px}.combo-icon{position:relative;display:inline-flex;width:25px;height:18px;flex:0 0 25px;align-items:center}.combo-icon-main{display:grid;width:18px;height:18px;place-items:center}.combo-icon-main .brand-icon{width:18px;height:18px}.combo-icon-corner{position:absolute;right:0;bottom:-1px;display:grid;width:13px;height:13px;place-items:center;border:1px solid rgba(15,23,42,.96);border-radius:5px;background:#0f172a;box-shadow:0 1px 5px #00000059}.combo-icon-corner .brand-icon{width:11px;height:11px}.combo-icon-claude-vscode .combo-icon-corner,.combo-icon-claude-terminal .combo-icon-corner{background:#fff7ed;border-color:#0f172ae0}.combo-icon-codex-vscode .combo-icon-corner,.combo-icon-codex-terminal .combo-icon-corner{background:#042f2e;border-color:#0f172ae0}.combo-icon-copilot-vscode .combo-icon-corner,.combo-icon-copilot-terminal .combo-icon-corner{background:#312e81;border-color:#0f172ae0}.terminal-combo-icon{color:#cbd5e1}.brand-icon{height:16px;width:16px;flex:0 0 auto}.vscode-icon{color:#1f9cf0}.codex-icon{color:#5eead4}.codex-app-icon{filter:drop-shadow(0 1px 2px rgba(99,102,241,.45))}.claude-icon{color:#e8643a}.claude-desktop-icon{color:#f59e0b}.active-filters{display:flex;flex-wrap:wrap;align-items:center;gap:7px;border-top:1px solid rgba(148,163,184,.12);margin-top:12px;padding-top:12px}.active-filter-label{color:#94a3b8;font-size:11px;font-weight:750;text-transform:uppercase}.active-filter-chip{display:inline-flex;min-height:28px;align-items:center;gap:6px;border:1px solid rgba(45,212,191,.28);border-radius:999px;background:#2dd4bf14;color:#dbeafe;cursor:pointer;font-size:12px;font-weight:650;padding:4px 9px}.active-filter-chip.muted{border-color:#94a3b829;background:#0f172a8a;color:#94a3b8;cursor:default}.active-filter-empty{color:#64748b;font-size:12px}.active-filter-reset{margin-left:auto}.filter-panel{position:relative;z-index:20}.source-checklist{display:grid;gap:8px}.source-check-row{display:grid;grid-template-columns:minmax(160px,1.4fr) auto auto minmax(180px,1.6fr);align-items:center;gap:10px;border:1px solid rgba(148,163,184,.14);border-radius:8px;background:#02061742;padding:10px}.source-check-row strong,.source-check-row span{display:block;min-width:0}.source-check-row strong{color:#f8fafc;font-size:13px;font-weight:760}.source-check-row span{color:#94a3b8;font-size:12px;overflow-wrap:anywhere}.source-check-fix{color:#cbd5e1!important}.repo-compact-filters{padding:10px}.repo-compact-filter-row{display:grid;align-items:start;gap:10px;grid-template-columns:repeat(4,minmax(150px,1fr)) auto}.repo-more-filters{position:relative}.repo-more-filters summary{display:inline-flex;min-height:38px;align-items:center;gap:8px;border:1px solid rgba(148,163,184,.18);border-radius:8px;background:#0f172ab8;color:#cbd5e1;cursor:pointer;font-size:12px;font-weight:750;padding:0 12px;list-style:none}.repo-more-filters summary::-webkit-details-marker{display:none}.repo-more-filter-body{position:absolute;right:0;top:calc(100% + 8px);z-index:20;width:min(640px,calc(100vw - 32px));display:grid;gap:12px;border:1px solid rgba(148,163,184,.24);border-radius:10px;background:#111827;box-shadow:0 18px 45px #00000061;padding:12px}.repo-custom-dates{display:grid;gap:10px;grid-template-columns:repeat(2,minmax(0,1fr))}.repo-filter-date-note{color:#94a3b8;font-size:11px;margin-top:8px}.input{min-width:0;height:38px;border:1px solid rgba(148,163,184,.2);border-radius:8px;background:#020617ad;color:#f8fafc;padding:0 10px}.pricing-table{min-width:860px}.session-controls{display:grid;gap:10px;border-bottom:1px solid rgba(148,163,184,.12);padding:12px 16px}.session-table-legend{display:flex;flex-wrap:wrap;gap:8px}.session-legend-item{display:inline-flex;align-items:center;gap:6px;color:#cbd5e1;font-size:12px;font-weight:650}.session-legend-swatch{display:inline-block;height:14px;width:4px;border-radius:999px}.session-legend-cost{background:#f59e0b}.search-field{display:flex;min-height:38px;align-items:center;gap:8px;border:1px solid rgba(148,163,184,.18);border-radius:8px;background:#02061785;color:#94a3b8;padding:0 10px}.search-field input{min-width:0;width:100%;border:0;background:transparent;color:#f8fafc;outline:none}.quick-filter-row{display:flex;flex-wrap:wrap;gap:7px}.quick-filter{min-height:28px;border:1px solid rgba(148,163,184,.18);border-radius:999px;background:#0f172a9e;color:#cbd5e1;cursor:pointer;font-size:12px;font-weight:650;padding:4px 9px}.quick-filter span{color:#94a3b8;font-size:11px;font-weight:760;margin-left:3px}.quick-filter:hover:not(:disabled),.quick-filter.active{border-color:#2dd4bf57;background:#2dd4bf1f;color:#5eead4}.quick-filter:hover:not(:disabled) span,.quick-filter.active span{color:#99f6e4}.quick-filter:disabled{cursor:not-allowed;opacity:.38}.price-input{width:100px;height:38px;border:1px solid rgba(148,163,184,.2);border-radius:7px;background:#020617ad;color:#f8fafc;padding:0 8px}.table-wrap{width:100%;overflow-x:auto}.panel>.table-wrap{scrollbar-color:rgba(45,212,191,.42) rgba(15,23,42,.72)}.settings-page{display:grid;gap:16px}.settings-status-banner{display:flex;align-items:center;justify-content:space-between;gap:16px;border:1px solid rgba(45,212,191,.18);border-radius:10px;background:linear-gradient(180deg,#0d222dc7,#09121dc7);padding:14px 16px}.settings-status-title{color:#f8fafc;font-size:14px;font-weight:760}.settings-status-banner p{color:#94a3b8;font-size:13px;margin-top:2px}.settings-tabs{display:flex;flex-wrap:wrap;gap:8px}.settings-tab{min-height:36px;border:1px solid rgba(148,163,184,.14);border-radius:999px;background:#0f172a85;color:#94a3b8;cursor:pointer;font-size:13px;font-weight:700;padding:7px 13px}.settings-tab:hover,.settings-tab.active{border-color:#2dd4bf57;background:#2dd4bf1a;color:#dbeafe}.settings-panel{overflow:hidden}.settings-tab-panel{display:grid;gap:18px;padding:20px}.settings-section-header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.settings-section-header h2{color:#f8fafc;font-size:18px;font-weight:760}.settings-section-header p,.settings-supporting-copy{max-width:860px;color:#94a3b8;font-size:13px;line-height:1.55;margin-top:5px}.settings-primary-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px}.pricing-toolbar{display:grid;gap:10px}.pricing-filter-group{display:inline-flex;width:-moz-fit-content;width:fit-content;flex-wrap:wrap;gap:7px;border:1px solid rgba(148,163,184,.12);border-radius:999px;background:#0206173d;padding:5px}.pricing-search{max-width:520px}.pricing-add-row{display:grid;gap:10px;grid-template-columns:minmax(220px,520px) auto;justify-content:start}.pricing-gap-panel{display:grid;align-items:center;gap:14px;grid-template-columns:minmax(0,1fr) auto auto;border:1px solid rgba(148,163,184,.16);border-radius:8px;background:#02061752;padding:14px 16px}.pricing-gap-attention{border-color:#f59e0b42;background:#78350f1f}.pricing-gap-good{border-color:#2dd4bf3d;background:#0d94881a}.pricing-gap-eyebrow{color:#94a3b8;font-size:11px;font-weight:760;text-transform:uppercase}.pricing-gap-panel h3{color:#f8fafc;font-size:15px;font-weight:760;margin-top:3px}.pricing-gap-panel p{max-width:900px;color:#cbd5e1;font-size:13px;line-height:1.5;margin-top:5px}.pricing-gap-stats{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px}.pricing-gap-stat{min-width:98px;border:1px solid rgba(148,163,184,.14);border-radius:8px;background:#0f172a80;padding:8px 10px}.pricing-gap-stat span{display:block;color:#94a3b8;font-size:11px}.pricing-gap-stat strong{display:block;color:#f8fafc;font-size:15px;margin-top:2px}.pricing-meta-row,.source-card-grid,.privacy-grid,.settings-detail-grid{display:grid;gap:12px}.pricing-meta-row{grid-template-columns:repeat(4,minmax(0,1fr))}.settings-table-wrap{border:1px solid rgba(148,163,184,.12);border-radius:10px;background:#02061742}.spacious-pricing-table th,.spacious-pricing-table td{padding:14px 16px}.pricing-model-cell{display:grid;gap:4px;min-width:260px;max-width:280px;overflow-wrap:anywhere}.pricing-model-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px;color:#94a3b8;font-size:12px}.settings-empty-note{color:#94a3b8;font-size:13px}.settings-supporting-copy{display:flex;flex-wrap:wrap;align-items:center;gap:12px;margin-top:0}.settings-supporting-copy code{color:#cbd5e1}.source-card-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.settings-source-card{display:grid;gap:16px;border:1px solid rgba(148,163,184,.13);border-radius:10px;background:#02061747;padding:16px}.settings-source-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.settings-source-card h3,.settings-subsection h3,.settings-info-panel h2{color:#f8fafc;font-size:15px;font-weight:720}.settings-source-card-header p{color:#94a3b8;font-size:13px;margin-top:3px}.settings-source-metrics,.settings-token-grid{display:grid;gap:10px;grid-template-columns:repeat(3,minmax(0,1fr))}.settings-details{border-top:1px solid rgba(148,163,184,.12);padding-top:10px}.settings-details summary{cursor:pointer;color:#2dd4bf;font-size:12px;font-weight:750}.settings-path-list{display:flex;flex-wrap:wrap;gap:7px;margin-top:10px}.settings-detail-grid{grid-template-columns:repeat(3,minmax(0,1fr));margin-top:10px}.doctor-score-panel{display:grid;grid-template-columns:minmax(180px,240px) 1fr;align-items:center;gap:14px;border:1px solid rgba(45,212,191,.18);border-radius:10px;background:#0d222d6b;padding:16px}.doctor-score-panel strong{display:block;color:#f8fafc;font-size:30px;line-height:1;margin-top:5px}.doctor-score-panel p,.doctor-score-label{color:#94a3b8;font-size:13px;line-height:1.5}.privacy-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.settings-info-panel{border-radius:10px;background:#02061742;padding:16px}.settings-info-panel p{color:#94a3b8;font-size:13px;line-height:1.55;margin-top:7px}.settings-note-list{color:#94a3b8;display:grid;gap:7px;font-size:13px;line-height:1.55;list-style:disc;margin:10px 0 0;padding-left:18px}.advanced-settings-grid{display:grid;gap:16px}.settings-subsection{display:grid;gap:12px;border-radius:10px;background:#0206173d;padding:16px}.settings-danger-zone{margin-top:2px;background:#7f1d1d1f}.settings-cache-zone{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-top:2px;background:#0f172a6b}.settings-cache-zone h2{color:#f8fafc;font-size:15px;font-weight:760}.settings-cache-zone p{color:#94a3b8;font-size:13px;line-height:1.55;margin-top:4px}.settings-cache-zone code{color:#99f6e4}.pagination-controls{display:flex;align-items:center;justify-content:space-between;gap:12px;border-top:1px solid rgba(148,163,184,.14);color:#94a3b8;font-size:12px;padding:10px 12px}.results-summary{display:inline-flex;width:-moz-fit-content;width:fit-content;align-items:center;gap:6px;border:1px solid rgba(148,163,184,.14);border-radius:999px;background:#0f172a85;color:#94a3b8;font-size:12px;padding:6px 9px}.panel-heading .results-summary{margin-left:auto}.session-controls .results-summary{align-self:start}.results-summary strong{color:#f8fafc;font-weight:760}.pagination-buttons{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.pagination-size{display:inline-flex;align-items:center;gap:6px;color:#94a3b8;font-size:12px;font-weight:700}.pagination-size select{min-height:30px;border:1px solid rgba(148,163,184,.22);border-radius:8px;background:#02061799;color:#f8fafc;padding:0 8px}.pagination-buttons .button{min-height:30px;padding:5px 9px}.pagination-buttons .button:disabled{cursor:not-allowed;opacity:.45}table{width:100%;min-width:1500px;border-collapse:collapse;font-size:13px}.sessions-table th:first-child,.sessions-table td:first-child,.repo-table th:first-child,.repo-table td:first-child,.model-table th:first-child,.model-table td:first-child,.command-health-table th:first-child,.command-health-table td:first-child,.expensive-table th:first-child,.expensive-table td:first-child{position:sticky;left:0;z-index:2;background:#0b1220}.sessions-table th:first-child,.repo-table th:first-child,.model-table th:first-child,.command-health-table th:first-child,.expensive-table th:first-child{z-index:3}.column-menu-wrap{position:relative}.column-menu{position:absolute;right:0;top:calc(100% + 8px);z-index:30;width:280px;max-height:min(560px,72vh);overflow:auto;border:1px solid rgba(148,163,184,.24);border-radius:12px;background:#111827;box-shadow:0 18px 45px #00000061;padding:10px}.column-menu-header{display:flex;align-items:center;justify-content:space-between;gap:10px;border-bottom:1px solid rgba(148,163,184,.14);color:#f8fafc;font-size:13px;font-weight:750;padding:2px 2px 8px}.column-menu-group{padding-top:10px}.column-menu-label{color:#94a3b8;font-size:10px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;margin-bottom:5px}.column-menu-option{display:flex;min-height:30px;align-items:center;gap:8px;border-radius:7px;color:#cbd5e1;cursor:pointer;font-size:12px;padding:4px 6px}.column-menu-option:hover{background:#94a3b81a;color:#f8fafc}.column-menu-option input{accent-color:#2dd4bf}thead th{position:sticky;top:0;z-index:1}.expensive-table{min-width:1500px}.compact-table{min-width:980px}th,td{border-bottom:1px solid rgba(148,163,184,.12);padding:12px;text-align:left;white-space:nowrap}th{background:#0f172aad;color:#94a3b8;font-size:12px;font-weight:700}td{color:#e2e8f0}.sort-header{display:inline-flex;align-items:center;gap:5px;border:0;background:transparent;color:inherit;cursor:pointer;padding:0;font-weight:700}.sort-header.active{color:#2dd4bf}.inline-code{border:1px solid rgba(148,163,184,.18);background:#0206178c;color:#cbd5e1;padding:3px 6px;font-size:12px}.price-chip{border:1px solid rgba(148,163,184,.18);background:#0206178c;color:#cbd5e1;padding:4px 7px;font-size:11px}.value-with-detail{cursor:help;text-decoration:underline;text-decoration-color:#2dd4bf61;text-decoration-style:dotted;text-underline-offset:3px;overflow-wrap:anywhere}.mini-stat-label{display:inline-flex;align-items:center;gap:6px;color:#94a3b8;font-size:12px;text-transform:uppercase}.mini-stat-label+div{overflow-wrap:anywhere}.metric-help-button{display:inline-grid;height:18px;width:18px;place-items:center;border:1px solid rgba(45,212,191,.28);border-radius:999px;background:#2dd4bf14;color:#5eead4;line-height:1;vertical-align:middle}.metric-help-button:hover,.metric-help-button:focus-visible{border-color:#2dd4bf94;background:#2dd4bf29;outline:none}.metric-popover-trigger-wrap{display:inline-flex;align-items:center}.metric-popover{position:fixed;z-index:100;width:min(420px,calc(100vw - 24px));max-width:420px;overflow:visible;border:1px solid rgba(148,163,184,.24);border-radius:10px;background:#111827;box-shadow:0 18px 44px #0000006b,0 0 0 1px #0f172a73;color:#e5e7eb;padding:12px;white-space:normal}.metric-popover-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.metric-popover-title{color:#f8fafc;font-size:12px;font-weight:760}.metric-popover-value{margin-top:4px;color:#fff;font-size:20px;font-weight:780;line-height:1.1;word-break:break-word}.metric-popover-body,.metric-popover-note{margin-top:10px;color:#a8b3c7;font-size:12px;font-weight:500;line-height:1.45;white-space:normal;overflow-wrap:anywhere}.metric-popover-note{border-left:2px solid rgba(245,158,11,.54);color:#f8d08c;font-weight:650;padding-left:10px}.metric-popover-section,.metric-popover-footer{margin-top:12px;border-top:1px solid rgba(148,163,184,.14);padding-top:12px}.metric-popover-row{display:flex;align-items:center;justify-content:space-between;gap:12px;color:#94a3b8;font-size:12px;white-space:normal}.metric-popover-row+.metric-popover-row{margin-top:8px}.metric-popover-row strong{color:#e5e7eb;font-weight:720;text-align:right}.metric-popover-close{display:grid;height:24px;width:24px;flex:0 0 auto;place-items:center;border:1px solid rgba(148,163,184,.18);border-radius:8px;color:#cbd5e1}.metric-popover-close:hover,.metric-popover-close:focus-visible{border-color:#94a3b86b;outline:none}.cost-value,.value-with-detail{font-variant-numeric:tabular-nums}.summary-action{cursor:pointer;transition:border-color .12s ease,box-shadow .12s ease,transform .12s ease}.summary-action:hover{border-color:#6d5dfc8c;box-shadow:0 12px 36px #00000057;transform:translateY(-1px)}.meter{height:10px;overflow:hidden;border:1px solid rgba(148,163,184,.18);border-radius:999px;background:#0f172ae6}.meter div{height:100%;background:linear-gradient(90deg,#6d5dfc,#2dd4bf)}.rtk-impact-bars{display:grid;gap:13px;margin-top:16px}.rtk-impact-stats{display:grid;gap:10px;grid-template-columns:repeat(3,minmax(0,1fr));margin-top:14px}.rtk-impact-row{display:grid;gap:7px}.rtk-impact-label,.rtk-impact-footer{display:flex;align-items:center;justify-content:space-between;gap:12px;color:#94a3b8;font-size:12px}.rtk-impact-label strong,.rtk-impact-footer strong{color:#f8fafc;font-weight:700}.rtk-impact-track{height:12px;overflow:hidden;border:1px solid rgba(148,163,184,.18);border-radius:999px;background:#0206179e}.rtk-impact-track div{height:100%;border-radius:inherit}.rtk-impact-before div{background:#6d5dfc}.rtk-impact-after div{background:#38bdf8}.rtk-impact-saved div{background:#2dd4bf}.rtk-impact-footer{margin-top:14px;border-top:1px solid rgba(148,163,184,.12);padding-top:12px}.plain-summary-list,.action-list{display:grid;gap:9px;color:#cbd5e1;font-size:14px}.plain-summary-list li,.action-list li{border:1px solid rgba(148,163,184,.12);border-radius:8px;background:#02061752;padding:9px 10px}.signal-list{display:grid;gap:8px;color:#cbd5e1;font-size:13px}.signal-list li{border:1px solid rgba(148,163,184,.12);border-radius:8px;background:#02061752;padding:8px 9px}.section-title-row,.issue-row-badges,.timeline-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.section-title-row{justify-content:space-between}.issue-row{display:grid;gap:12px;grid-template-columns:minmax(0,1fr) auto;border:1px solid rgba(148,163,184,.12);border-radius:8px;background:#02061752;padding:10px}.command-review-evidence{display:grid;gap:10px}.command-review-evidence>p{color:#cbd5e1;font-size:13px;line-height:1.5}.command-review-note{border:1px solid rgba(245,158,11,.18);border-radius:8px;background:#f59e0b12;color:#fcd34d!important;padding:9px 10px}.timeline-list{display:grid;gap:10px}.timeline-list li{border:1px solid rgba(148,163,184,.12);border-radius:8px;background:#02061752;padding:10px}.timeline-meta{color:#94a3b8;font-size:11px;margin-bottom:6px}.timeline-list p{color:#dbeafe;font-size:13px;line-height:1.55}.timeline-list p:not(.expanded){display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:3}.session-detail-panel{display:grid}.session-detail-heading{display:grid;gap:14px;grid-template-columns:minmax(0,1fr) auto;align-items:start;border-bottom:1px solid rgba(148,163,184,.16);padding:18px}.session-detail-heading h2{overflow:hidden;color:#f8fafc;font-size:19px;font-weight:760;line-height:1.25;text-overflow:ellipsis;white-space:nowrap}.session-detail-heading p{margin-top:8px;color:#cbd5e1;font-size:14px}.session-detail-eyebrow{color:#94a3b8;font-size:11px;font-weight:760;letter-spacing:0;text-transform:uppercase}.session-summary-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:9px;color:#94a3b8;font-size:12px;font-weight:650}.session-summary-meta>span:not(.status-badge){display:inline-flex;align-items:center;min-height:24px}.session-summary-meta>span:not(.status-badge):before{content:"";display:inline-block;width:3px;height:3px;border-radius:999px;background:#94a3b89e;margin-right:8px}.session-key-metrics{display:grid;gap:10px;grid-template-columns:repeat(6,minmax(0,1fr));border-bottom:1px solid rgba(148,163,184,.12);padding:14px 18px}.session-detail-tabs{display:flex;flex-wrap:wrap;gap:8px;border-bottom:1px solid rgba(148,163,184,.12);padding:12px 18px}.session-detail-tabs button,.session-filter-buttons button{min-height:34px;border:1px solid rgba(148,163,184,.14);border-radius:999px;background:#0f172a85;color:#94a3b8;cursor:pointer;font-size:13px;font-weight:700;padding:7px 12px}.session-detail-tabs button:hover,.session-detail-tabs button.active,.session-filter-buttons button:hover,.session-filter-buttons button.active{border-color:#2dd4bf57;background:#2dd4bf1a;color:#dbeafe}.session-detail-body{padding:18px}.session-tab-grid{display:grid;gap:14px;grid-template-columns:repeat(2,minmax(0,1fr))}.session-tab-stack{display:grid;gap:14px}.session-card-wide{grid-column:1 / -1}.session-mini-grid{display:grid;gap:10px;grid-template-columns:repeat(2,minmax(0,1fr))}.session-timeline-toolbar{display:grid;gap:10px;grid-template-columns:minmax(0,1fr) auto;align-items:center}.session-filter-buttons{display:flex;flex-wrap:wrap;gap:7px;justify-content:flex-end}.session-message-list{margin:0;padding:0;list-style:none}.metadata-list{display:grid;gap:8px}.metadata-row{display:grid;gap:10px;grid-template-columns:140px minmax(0,1fr);align-items:start;border-bottom:1px solid rgba(148,163,184,.1);padding:8px 0}.metadata-row:last-child{border-bottom:0}.metadata-row span{color:#94a3b8;font-size:12px;font-weight:700}.metadata-row strong{overflow-wrap:anywhere;color:#e2e8f0;font-size:13px;font-weight:650}.detail-muted{color:#cbd5e1;font-size:13px;line-height:1.55}.rtk-install-cmd{flex:1;min-width:0;display:block;padding:7px 10px;border:1px solid rgba(148,163,184,.18);background:#0206178c;color:#cbd5e1;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:12px;border-radius:6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rtk-init-row{display:grid;grid-template-columns:170px 1fr auto;align-items:center;gap:8px}.rtk-tool-label{font-size:12px;color:#64748b}.rtk-health-banner{padding:14px}.rtk-health-banner h2{color:#f8fafc;font-size:15px;font-weight:760}.rtk-health-banner p{color:#cbd5e1;font-size:13px}.rtk-health-good{border-color:#2dd4bf47;background:linear-gradient(180deg,#141f36f5,#0d26298a);color:#5eead4}.rtk-health-critical{border-color:#ef444466;background:linear-gradient(180deg,#30141dbd,#0f172aeb);color:#fca5a5}.developer-details-actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px;border-top:1px solid rgba(148,163,184,.12);padding:12px 14px 0}.recent-command{border:1px solid rgba(148,163,184,.14);background:#02061773;color:#cbd5e1;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:12px;padding:7px 8px}.recent-rtk-list{display:grid;gap:7px}.recent-rtk-item{display:grid;grid-template-columns:90px minmax(0,1fr) auto;gap:10px;align-items:center;border:1px solid rgba(148,163,184,.14);border-radius:8px;background:#02061773;padding:9px 10px}.recent-rtk-time,.recent-rtk-savings{color:#94a3b8;font-size:12px;white-space:nowrap}.recent-rtk-command{overflow:hidden;color:#e2e8f0;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:12px;text-overflow:ellipsis;white-space:nowrap}.rtk-command-table{display:grid;gap:6px}.rtk-command-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px;border:1px solid rgba(148,163,184,.14);border-radius:8px;background:#02061773;padding:8px 10px}.session-list{display:grid}.session-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:10px;align-items:center;border-bottom:1px solid rgba(148,163,184,.1);padding:11px 14px}.session-row-button{width:100%;border:0;background:transparent;color:inherit;cursor:pointer;font:inherit;text-align:left}.session-row-button:hover,.session-row-button:focus-visible{background:#6d5dfc1f;outline:2px solid rgba(45,212,191,.7);outline-offset:-2px}.session-row-rich{align-items:start}.session-row:last-child{border-bottom:0}.session-icon{display:grid;height:34px;width:34px;place-items:center;border-radius:9px;background:#6d5dfc29;color:#a78bfa}.repo-rank-list{display:grid;gap:12px;padding:14px}.repo-rank-row{display:grid;gap:6px}.repo-rank-topline{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;color:#e2e8f0;font-size:13px}.repo-bar{height:6px;overflow:hidden;border-radius:999px;background:#94a3b81a}.repo-bar div{height:100%;border-radius:inherit}.status-badge{display:inline-flex;align-items:center;border:1px solid rgba(148,163,184,.18);border-radius:999px;background:#0f172ab8;color:#cbd5e1;font-size:11px;font-weight:650;line-height:1;padding:5px 9px;text-transform:capitalize;white-space:nowrap}.status-files-edited,.status-completed{border-color:#2dd4bf57;color:#5eead4}.status-high-token,.status-no-code-change,.status-unknown-repo,.status-unknown-surface,.status-low{border-color:#f59e0b57;color:#fbbf24}.status-high{border-color:#ef444457;color:#fca5a5}.status-medium{border-color:#f59e0b57;color:#fbbf24}.status-failed-commands,.status-command-failures-detected,.status-command-issue,.status-command-issues-detected{border-color:#ef444457;color:#fca5a5}.badge-row.warning-badge-row{margin-top:0}.status-badge.badge-critical,.status-badge.badge-warning,.status-badge.badge-info,.status-badge.badge-good,.status-badge.badge-neutral{text-transform:none}.status-badge.badge-critical{border-color:#ef444461;background:#7f1d1d29;color:#fca5a5}.status-badge.badge-warning{border-color:#f59e0b61;background:#78350f29;color:#fbbf24}.status-badge.badge-info{border-color:#2dd4bf4d;background:#0d94881f;color:#5eead4}.status-badge.badge-good{border-color:#22c55e57;background:#14532d24;color:#86efac}.status-badge.badge-neutral{border-color:#94a3b833;color:#cbd5e1}.repo-detail-summary,.health-summary-row{display:grid;gap:12px;grid-template-columns:repeat(4,minmax(0,1fr))}.repo-detail-page,.repo-tab-body{display:grid;gap:16px}.repo-hero{display:grid;gap:18px;grid-template-columns:minmax(0,1.2fr) minmax(360px,.8fr);padding:18px}.repo-hero-main{min-width:0}.repo-hero-eyebrow{color:#94a3b8;font-size:12px;font-weight:750;text-transform:uppercase}.repo-hero h2{color:#f8fafc;font-size:30px;font-weight:820;line-height:1.12;margin-top:6px;overflow-wrap:anywhere}.repo-hero p{color:#cbd5e1;font-size:14px;line-height:1.5;margin-top:8px}.repo-hero-warning{display:inline-flex;align-items:center;gap:8px;font-weight:650}.repo-hero-warning-critical{color:#f97316!important}.repo-hero-warning-warning{color:#fbbf24!important}.repo-hero-warning-good,.repo-hero-warning-info{color:#5eead4!important}.repo-hero-warning span{min-width:0}.repo-cost-note{color:#94a3b8!important;font-size:12px!important}.repo-hero-metrics{display:grid;gap:10px;grid-template-columns:repeat(2,minmax(0,1fr))}.repo-record-header{display:grid;align-items:end;gap:16px;grid-template-columns:minmax(0,1fr) auto;border-bottom:1px solid rgba(148,163,184,.16);padding:12px 0 18px}.repo-record-main{min-width:0}.repo-record-eyebrow{color:#94a3b8;font-size:12px;font-weight:750;text-transform:uppercase}.repo-record-header h2{color:#f8fafc;font-size:28px;font-weight:820;line-height:1.15;margin-top:8px;overflow-wrap:anywhere}.repo-record-header p{color:#cbd5e1;font-size:14px;line-height:1.5;margin-top:6px}.repo-record-issue{display:flex;align-items:flex-start;gap:8px;max-width:920px;font-weight:700}.repo-record-issue-critical{color:#fb923c!important}.repo-record-issue-warning{color:#fbbf24!important}.repo-record-issue-good,.repo-record-issue-info{color:#5eead4!important}.repo-record-stats{display:grid;gap:10px;grid-template-columns:repeat(5,minmax(118px,1fr));min-width:min(920px,100%)}.repo-record-stats div{display:grid;gap:4px;min-width:0;border:1px solid rgba(148,163,184,.12);border-radius:8px;background:#0f172a6b;padding:10px}.repo-record-stats dt{color:#94a3b8;font-size:12px;font-weight:750;text-transform:uppercase}.repo-record-stats dd{color:#f8fafc;font-size:15px;font-weight:750;overflow:hidden;text-overflow:ellipsis}.repo-record-stat-warning{border-color:#f973165c!important;background:#f973160f!important}.repo-record-stat-warning dd{color:#fb923c}.repo-detail-tabs{display:flex;flex-wrap:wrap;gap:0;border-bottom:1px solid rgba(148,163,184,.14)}.repo-detail-tabs button{min-height:36px;border:0;border-bottom:2px solid transparent;border-radius:0;background:transparent;color:#94a3b8;cursor:pointer;font-size:13px;font-weight:700;padding:7px 14px 9px}.repo-detail-tabs button:hover,.repo-detail-tabs button.active{border-bottom-color:#2dd4bf;background:transparent;color:#f8fafc}.repo-basic-overview{width:100%;max-width:none}.repo-basic-workbench{display:grid;align-items:start;gap:18px;grid-template-columns:minmax(0,1.1fr) minmax(320px,.75fr)}.repo-basic-panel{min-width:0;border:1px solid rgba(148,163,184,.14);border-radius:8px;background:#02061738;overflow:hidden}.repo-basic-panel>.panel-heading{background:transparent}.repo-basic-panel-heading,.repo-basic-panel>.panel-heading{border-bottom:1px solid rgba(148,163,184,.12);padding:12px 14px}.repo-basic-panel-heading h2,.repo-basic-panel>.panel-heading h2{color:#f8fafc;font-size:15px;font-weight:750}.repo-basic-panel-heading p,.repo-basic-panel>.panel-heading p{color:#94a3b8;font-size:13px;margin-top:2px}.repo-overview-usage-section{display:grid;gap:16px;width:100%}.repo-overview-section-heading{display:grid;gap:3px;max-width:920px}.repo-overview-section-heading h2{color:#f8fafc;font-size:18px;font-weight:780}.repo-overview-section-heading p{color:#cbd5e1;font-size:14px;line-height:1.45}.repo-overview-grid,.repo-overview-focus-grid,.repo-overview-bottom-grid{display:grid;align-items:start;gap:16px}.repo-overview-grid,.repo-overview-focus-grid{grid-template-columns:minmax(0,1fr) minmax(360px,.9fr)}.repo-overview-bottom-grid{grid-template-columns:minmax(0,1.15fr) minmax(360px,.85fr)}.repo-attention-card,.repo-cost-shape-card{min-width:0}.repo-attention-list{display:grid;padding:0}.repo-attention-row{display:grid;grid-template-columns:auto auto minmax(0,1fr) auto;align-items:center;gap:12px;border-bottom:1px solid rgba(148,163,184,.1);background:transparent;padding:13px 14px}.attention-step{display:inline-grid;height:24px;width:24px;place-items:center;border:1px solid rgba(148,163,184,.18);border-radius:999px;background:#0f172abd;color:#cbd5e1;font-size:11px;font-weight:850}.repo-attention-row:last-child{border-bottom:0}.repo-attention-row svg{color:#94a3b8}.repo-attention-row>div{display:grid;gap:3px;min-width:0}.repo-attention-row strong{color:#f8fafc;font-size:14px}.repo-attention-row span{color:#94a3b8;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:normal}.repo-attention-row.attention-critical{border-left:3px solid rgba(249,115,22,.9);background:#f973160f}.repo-attention-row.attention-critical svg{color:#fb923c}.repo-attention-row.attention-critical .attention-step{border-color:#f9731680;background:#f9731629;color:#fed7aa}.repo-attention-row.attention-warning{border-left:3px solid rgba(245,158,11,.85);background:#f59e0b0d}.repo-attention-row.attention-warning svg{color:#fbbf24}.repo-attention-row.attention-warning .attention-step{border-color:#f59e0b75;background:#f59e0b24;color:#fde68a}.repo-attention-row.attention-info,.repo-attention-row.attention-good{border-left:3px solid rgba(45,212,191,.7);background:#2dd4bf09}.repo-facts-list{display:grid}.repo-facts-list div{display:grid;grid-template-columns:minmax(120px,.55fr) minmax(0,1fr);gap:12px;border-bottom:1px solid rgba(148,163,184,.1);padding:11px 14px}.repo-facts-list div:last-child{border-bottom:0}.repo-facts-list dt{color:#94a3b8;font-size:12px;font-weight:750;text-transform:uppercase}.repo-facts-list dd{min-width:0;color:#f8fafc;font-size:13px;font-weight:650;overflow-wrap:anywhere}.repo-facts-link{margin:0 14px 14px}.repo-cost-summary-card{display:grid;gap:16px;grid-template-columns:minmax(280px,.75fr) minmax(0,1.25fr)}.repo-cost-summary-main{display:grid;align-content:start;gap:10px}.repo-cost-summary-main p,.repo-token-share-empty{color:#cbd5e1;font-size:13px;line-height:1.45}.repo-cost-summary-stats{display:grid;gap:8px;grid-template-columns:repeat(5,minmax(0,1fr))}.repo-token-share{display:grid;gap:9px;margin-top:2px}.repo-token-share-track{display:flex;height:12px;overflow:hidden;border:1px solid rgba(148,163,184,.16);border-radius:999px;background:#020617b8}.repo-token-share-track span{min-width:2px}.repo-token-share-uncached{background:linear-gradient(90deg,#38bdf8,#2dd4bf)}.repo-token-share-cached{background:linear-gradient(90deg,#2dd4bf59,#2dd4bfc2)}.repo-token-share-legend{display:flex;flex-wrap:wrap;gap:8px 14px}.repo-token-share-legend span{display:inline-flex;align-items:center;gap:6px;color:#94a3b8;font-size:12px}.repo-token-share-legend strong{color:#f8fafc;font-weight:760}.repo-token-share-dot{display:inline-block;height:8px;width:8px;border-radius:999px}.repo-token-share-dot-uncached{background:#38bdf8}.repo-token-share-dot-cached{background:#2dd4bf}.repo-cost-token-grid{display:grid;grid-template-columns:minmax(220px,.75fr) minmax(260px,1fr) minmax(260px,1fr)}.repo-cost-token-primary{display:grid;align-content:start;gap:8px;border-right:1px solid rgba(148,163,184,.12);padding:14px}.repo-cost-token-primary span{color:#94a3b8;font-size:12px;font-weight:750;text-transform:uppercase}.repo-cost-token-primary strong{color:#f8fafc;font-size:20px;font-weight:800;line-height:1.2}.repo-cost-token-primary small{color:#94a3b8;font-size:12px;line-height:1.45}.repo-token-breakdown-list{display:grid;align-content:start}.repo-token-breakdown-list+.repo-token-breakdown-list{border-left:1px solid rgba(148,163,184,.12)}.metric-line{display:grid;grid-template-columns:minmax(110px,.75fr) minmax(0,1fr);gap:12px;align-items:baseline;border-bottom:1px solid rgba(148,163,184,.1);min-height:42px;padding:10px 14px}.metric-line:last-child{border-bottom:0}.metric-line span{color:#94a3b8;font-size:12px;font-weight:700}.metric-line strong{min-width:0;color:#f8fafc;font-size:13px;font-weight:750;overflow-wrap:anywhere}.repo-attention-row.attention-info svg,.repo-attention-row.attention-good svg{color:#5eead4}.repo-cost-shape-facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;padding:12px 12px 0}.repo-cost-shape-facts span{display:grid;gap:4px;border:1px solid rgba(148,163,184,.12);border-radius:8px;background:#0f172a80;padding:10px}.repo-cost-shape-facts strong{color:#f8fafc;font-size:14px;overflow-wrap:anywhere}.repo-cost-shape-facts small{color:#94a3b8;font-size:12px}.repo-diagnosis-card{border-left:3px solid #2dd4bf}.repo-diagnosis-text{color:#f8fafc;font-size:18px;font-weight:650;line-height:1.45;margin-top:12px}.repo-diagnosis-points{display:grid;gap:8px;margin-top:14px}.repo-diagnosis-points span,.compact-warning,.success-state{border:1px solid rgba(148,163,184,.13);border-radius:8px;background:#0f172a80;color:#cbd5e1;font-size:13px;line-height:1.45;padding:9px 10px}.success-state{border-color:#2dd4bf47;color:#5eead4}.compact-warning{border-color:#f59e0b47;color:#fbbf24}.compact-warning details{margin-top:8px}.compact-warning summary{cursor:pointer;color:#f8fafc;font-weight:750}.repo-warning-card{border-color:#f59e0b57;background:linear-gradient(180deg,#2d1c0aad,#0a121ddb)}.repo-concentration-stats{display:grid;gap:10px;grid-template-columns:repeat(2,minmax(0,1fr));margin-top:12px}.repo-concentration-list,.repo-review-list,.repo-warning-list,.repo-model-list{display:grid;gap:8px}.repo-concentration-list{margin-top:12px}.repo-concentration-row{display:grid;gap:7px;border:1px solid rgba(148,163,184,.12);border-radius:8px;background:#02061757;color:#e2e8f0;cursor:pointer;padding:9px 10px;text-align:left}.repo-concentration-row span,.repo-review-main strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.repo-concentration-row:hover,.buttonless-row:hover{background:#6d5dfc1f}.repo-review-list{padding:0}.repo-review-row{display:grid;gap:12px;grid-template-columns:minmax(0,1fr) auto;align-items:center;border-bottom:1px solid rgba(148,163,184,.1);background:transparent;padding:12px 14px}.repo-review-row:last-child{border-bottom:0}.repo-review-main{display:grid;gap:4px;min-width:0}.repo-review-main span,.repo-model-row span{color:#94a3b8;font-size:12px}.repo-review-metrics{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:8px;color:#cbd5e1;font-size:12px}.repo-warning-list{padding:12px}.repo-warning-summary{display:flex;flex-wrap:wrap;gap:8px}.repo-warning-summary span{border:1px solid rgba(148,163,184,.14);border-radius:999px;background:#0f172a9e;color:#cbd5e1;font-size:12px;font-weight:750;padding:5px 9px}.repo-warning-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:flex-start;gap:10px;border:1px solid rgba(148,163,184,.12);border-radius:8px;background:#02061757;color:#cbd5e1;font-size:13px;line-height:1.45;padding:10px}.repo-warning-row-critical{border-color:#f973164d;background:#f973161a}.repo-warning-row-critical svg{color:#fb923c}.repo-warning-row-warning{border-color:#f59e0b3d;background:#f59e0b14}.repo-warning-row-warning svg{color:#fbbf24}.repo-warning-row-info{border-color:#2dd4bf29;background:#2dd4bf0d}.repo-warning-row-info svg{color:#5eead4}.repo-warning-copy{display:grid;gap:3px;min-width:0}.repo-warning-copy p{color:#94a3b8}.repo-warning-title-row{display:flex;align-items:center;flex-wrap:wrap;gap:8px}.repo-warning-title-row strong{color:#f8fafc;font-weight:750}.repo-warning-title-row span,.repo-warning-action{border:1px solid rgba(148,163,184,.14);border-radius:999px;color:#94a3b8;font-size:11px;font-weight:750;line-height:1.1;padding:4px 7px;white-space:nowrap}.repo-warning-action{justify-self:end;color:#cbd5e1}.repo-model-row{display:grid;gap:4px;border:1px solid rgba(148,163,184,.12);border-radius:8px;background:#02061757;color:#e2e8f0;padding:10px}.command-cluster-row{align-items:start}.buttonless-row{width:100%;cursor:pointer;text-align:left}.cost-outlier-row td:first-child{box-shadow:inset 3px 0 #f59e0b}.cost-outlier-row td{background:#f59e0b0b}.detail-card{border:1px solid rgba(148,163,184,.14);border-radius:8px;background:#0206176b;padding:14px}.detail-card h3{color:#f8fafc;font-size:13px;font-weight:700}.metadata-disclosure{padding:0}.metadata-disclosure summary{display:flex;min-height:46px;align-items:center;justify-content:space-between;gap:12px;cursor:pointer;list-style:none;padding:14px}.metadata-disclosure summary::-webkit-details-marker{display:none}.metadata-disclosure summary span{color:#f8fafc;font-size:13px;font-weight:700}.metadata-disclosure summary small{color:#94a3b8;font-size:12px;font-weight:700}.metadata-disclosure summary:after{content:"Open";border:1px solid rgba(148,163,184,.18);border-radius:999px;color:#cbd5e1;font-size:11px;font-weight:750;padding:3px 8px}.metadata-disclosure[open] summary{border-bottom:1px solid rgba(148,163,184,.12)}.metadata-disclosure[open] summary:after{content:"Close"}.metadata-disclosure .metadata-list{padding:0 14px 14px}.advanced-summary{cursor:pointer;color:#f8fafc;font-weight:650;padding:14px 16px}.badge-row{display:flex;flex-wrap:wrap;gap:5px;margin-top:6px}.source-card{display:grid;gap:8px;border:1px solid rgba(148,163,184,.12);border-radius:8px;background:#02061752;padding:10px}.command-health-note{overflow:hidden}.friction-action-panel{display:flex;align-items:center;justify-content:space-between;gap:16px;border:1px solid rgba(148,163,184,.18);border-radius:8px;background:linear-gradient(180deg,#0f172ad1,#0a121dc7);padding:16px}.friction-action-attention{border-color:#f59e0b4d;background:linear-gradient(180deg,#2b1c098f,#0a121dc7)}.friction-action-good{border-color:#2dd4bf3d}.friction-action-copy{min-width:0}.friction-action-eyebrow{color:#fbbf24;font-size:11px;font-weight:780;text-transform:uppercase}.friction-action-panel h2{color:#f8fafc;font-size:17px;font-weight:760;margin-top:3px}.friction-action-panel p{color:#cbd5e1;font-size:13px;line-height:1.5;margin-top:5px}.friction-action-command{width:-moz-fit-content;width:fit-content;max-width:min(820px,100%);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:1px solid rgba(148,163,184,.16);border-radius:7px;background:#0206177a;color:#e2e8f0!important;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;padding:6px 8px}.friction-action-buttons{display:flex;flex:0 0 auto;flex-wrap:wrap;justify-content:flex-end;gap:8px}.command-health-note h2{color:#f8fafc;font-size:15px;font-weight:700}.command-health-note p{margin-top:6px;color:#cbd5e1;font-size:13px;line-height:1.5}.command-health-note .advanced-summary{border-bottom:0}.command-health-note[open] .advanced-summary{border-bottom:1px solid rgba(148,163,184,.12)}.command-health-note-body{padding:12px 16px 16px}.command-health-table{min-width:1180px}.friction-inspect-cell{display:grid;gap:2px}.friction-inspect-cell span{color:#f8fafc;font-weight:650}.friction-inspect-cell small{color:#94a3b8;font-size:11px}.command-signal-cell{display:grid;gap:4px;min-width:260px;max-width:360px}.command-signal-command{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#f8fafc;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:12px}.command-signal-cell p{color:#94a3b8;font-size:12px;line-height:1.4}.status-completed,.status-ok,.status-vs-code{border-color:#2dd4bf57;color:#5eead4}.status-partial,.status-setup-debugging,.status-research-only{border-color:#f59e0b57;color:#fbbf24}.status-failed,.status-unknown{border-color:#ef444457;color:#fca5a5}.raw-output{max-height:360px;overflow:auto;background:#0f172a;color:#e2e8f0;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:12px;line-height:1.55;margin:0;padding:14px 16px;white-space:pre-wrap}.insights-grid{display:grid;gap:16px;grid-template-columns:repeat(2,minmax(0,1fr))}.insight-card{border:1px solid rgba(148,163,184,.14);border-radius:8px;background:#0206176b;padding:12px}.insight-good{border-left:3px solid #2dd4bf}.insight-attention{border-left:3px solid #f59e0b}.insight-metric{flex:0 0 auto;border:1px solid rgba(148,163,184,.18);background:#0f172ac7;color:#cbd5e1;padding:3px 6px;font-size:12px;font-weight:650}.severity-pill{display:inline-flex;align-items:center;border:1px solid rgba(148,163,184,.18);border-radius:999px;color:#cbd5e1;font-size:10px;font-weight:760;line-height:1;padding:4px 7px;text-transform:uppercase}.severity-info{border-color:#2dd4bf4d;color:#5eead4}.severity-warning{border-color:#f59e0b57;color:#fbbf24}.severity-critical{border-color:#ef444457;color:#fca5a5}@media(min-width:1800px){.content-shell{padding:24px 32px 32px 24px}.overview-chart-stack{align-items:stretch;grid-template-columns:minmax(520px,1.15fr) repeat(2,minmax(360px,.9fr))}.overview-chart-pair{display:contents}}@media(min-width:2600px){.overview-chart-stack{grid-template-columns:minmax(680px,1.2fr) repeat(2,minmax(520px,.9fr))}}@media(max-width:900px){.insights-grid,.pricing-gap-panel{grid-template-columns:1fr}.pricing-gap-stats{justify-content:flex-start}.friction-action-panel{align-items:stretch;flex-direction:column}.friction-action-buttons{justify-content:flex-start}}tbody tr{cursor:default}tbody tr.clickable-row{cursor:pointer}tbody tr.clickable-row:focus-visible{background:#6d5dfc29;outline:2px solid rgba(45,212,191,.7);outline-offset:-2px}tbody tr:hover,tbody tr.selected{background:#6d5dfc1f}.mini-stat{min-width:0;border:1px solid rgba(148,163,184,.15);border-radius:8px;background:#0f172a8a;padding:12px}.mini-stat-value{margin-top:5px;overflow-wrap:anywhere;color:#f8fafc;font-size:14px;font-weight:700;line-height:1.35}.mini-stat-detail{margin-top:3px;color:#94a3b8;font-size:11px;line-height:1.35}.warning-pill{display:inline-flex;align-items:center;gap:5px;border:1px solid rgba(245,158,11,.32);background:#f59e0b1a;color:#fbbf24;padding:5px 8px;font-size:12px}.warning-text{overflow-wrap:anywhere;word-break:break-word}.error-state{display:flex;align-items:flex-start;gap:12px;border-color:#ef444452;background:linear-gradient(180deg,#30141db8,#0f172ae0);color:#fca5a5;padding:16px}.error-state strong{display:block;color:#fecaca;font-size:14px;font-weight:760}.error-state p{margin-top:4px;color:#f8d2d2;font-size:13px}.text-slate-500{color:#94a3b8!important}.text-slate-600,.text-slate-700{color:#cbd5e1!important}.text-teal{color:#2dd4bf!important}.text-plum{color:#a78bfa!important}.text-amber{color:#f59e0b!important}.bg-white{background:#0f172ab8!important}.border-line{border-color:#94a3b829!important}@media(max-width:1200px){.app-shell,.app-shell.sidebar-collapsed{grid-template-columns:1fr}.sidebar{position:sticky;top:0;z-index:40;height:auto;gap:12px;border-right:0;border-bottom:1px solid rgba(148,163,184,.18);padding:12px 16px}.sidebar-toggle{display:none}.sidebar-collapsed .sidebar{align-items:stretch;padding:12px 16px}.sidebar-collapsed .brand-lockup{justify-content:flex-start;flex-direction:row}.sidebar-collapsed .brand-text,.sidebar-collapsed .nav-item span,.sidebar-collapsed .sidebar-label,.sidebar-collapsed .quick-link-label,.sidebar-collapsed .quick-link-external{display:block}.sidebar-nav{display:flex;gap:8px;overflow-x:auto;padding-bottom:2px;scrollbar-width:thin}.nav-item{flex:0 0 auto;min-height:36px;white-space:nowrap}.sidebar-collapsed .nav-item{width:auto;justify-content:flex-start;padding:0 11px}.sidebar-status{display:none}.sidebar-section{padding-top:10px}.quick-links{display:flex;gap:8px;overflow-x:auto}.quick-link{flex:0 0 auto}.dashboard-grid,.overview-chart-pair{grid-template-columns:1fr}.filter-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.filter-grid .date-range-picker{grid-column:span 2}.repo-compact-filter-row,.repo-hero,.repo-record-header,.repo-basic-workbench,.repo-cost-token-grid,.repo-overview-grid,.repo-overview-focus-grid,.repo-overview-bottom-grid{grid-template-columns:1fr}.repo-record-stats{grid-template-columns:repeat(3,minmax(0,1fr))}.repo-cost-summary-card{grid-template-columns:1fr}.repo-cost-summary-stats{grid-template-columns:repeat(3,minmax(0,1fr))}.repo-cost-token-primary,.repo-token-breakdown-list+.repo-token-breakdown-list{border-left:0;border-right:0;border-bottom:1px solid rgba(148,163,184,.12)}.repo-more-filter-body{left:0;right:auto}.top-actions-list,.primary-kpi-grid,.secondary-metric-grid,.session-key-metrics,.source-breakdown-row,.data-health-grid,.waste-grid,.token-accuracy-grid,.parser-health-grid,.key-insights-grid,.pricing-meta-row,.source-card-grid,.privacy-grid,.settings-detail-grid,.settings-source-metrics,.settings-token-grid,.loading-source-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.session-tab-grid{grid-template-columns:1fr}}@media(max-width:700px){.content-shell{padding:16px}.page-header{align-items:flex-start;flex-direction:column}.page-header-actions,.page-header-badge{width:100%}.page-header-badge{justify-content:center}.page-title-lockup{align-items:flex-start}.sidebar{padding:10px 12px}.brand-lockup{padding:0}.brand-mark{height:34px;width:34px}.brand-lockup h1{font-size:17px}.sidebar-section{display:none}.filter-grid{grid-template-columns:1fr}.filter-grid .date-range-picker{grid-column:auto}.filter-dropdown-body{position:fixed;top:auto;right:12px;bottom:12px;left:12px;width:auto;max-height:min(70vh,560px);overflow:auto}.repo-compact-filter-row,.repo-hero-metrics,.repo-record-stats,.repo-detail-summary,.repo-concentration-stats,.repo-cost-shape-facts,.metric-line,.repo-custom-dates,.repo-attention-row,.repo-facts-list div,.repo-warning-row,.repo-review-row,.doctor-score-panel{grid-template-columns:1fr}.repo-record-stats{display:grid;gap:10px;grid-template-columns:1fr}.repo-attention-row .button{justify-self:flex-start}.repo-cost-summary-stats{grid-template-columns:1fr}.repo-warning-action{justify-self:flex-start}.repo-review-metrics{justify-content:flex-start}.settings-status-banner,.settings-section-header,.settings-cache-zone,.session-detail-heading,.session-timeline-toolbar,.red-zone{align-items:stretch;grid-template-columns:1fr;flex-direction:column}.settings-primary-actions{justify-content:flex-start}.pricing-add-row,.top-actions-list,.primary-kpi-grid,.secondary-metric-grid,.timeline-context-row,.session-key-metrics,.session-mini-grid,.source-breakdown-row,.data-health-grid,.waste-grid,.token-accuracy-grid,.parser-health-grid,.key-insights-grid,.pricing-meta-row,.source-card-grid,.privacy-grid,.settings-detail-grid,.settings-source-metrics,.settings-token-grid,.settings-control-grid,.loading-source-grid{grid-template-columns:1fr}.session-detail-heading h2{white-space:normal}.metadata-row,.recent-rtk-item{grid-template-columns:1fr}.recent-rtk-time,.recent-rtk-savings{white-space:normal}.source-check-row{grid-template-columns:1fr}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.01ms!important}}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:1280px){.xl\:col-span-2{grid-column:span 2 / span 2}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-\[1\.15fr_0\.85fr\]{grid-template-columns:1.15fr .85fr}.xl\:grid-cols-\[1\.1fr_0\.9fr\]{grid-template-columns:1.1fr .9fr}}
|