repospend 0.0.8 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,121 @@
1
+ # Data Sources
2
+
3
+ RepoSpend only reads local files. It never mutates source client data.
4
+
5
+ ## Codex
6
+
7
+ RepoSpend reads Codex data from:
8
+
9
+ - `~/.codex/state_5.sqlite`
10
+ - `~/.codex/sessions`
11
+
12
+ The Codex adapter opens SQLite in read-only mode and recursively scans session files when the sessions directory exists. Missing files, old schemas, unreadable paths, and missing fields are reported as warnings rather than fatal errors.
13
+
14
+ When Codex exposes app metadata, RepoSpend also normalizes where usage came from. It reads SQLite/session fields such as `source`, `originator`, and `thread_source`, then displays friendly labels like `VS Code`, `Terminal`, `Codex app`, or `Codex`.
15
+
16
+ Codex token records can include repeated cumulative checkpoints and per-turn
17
+ usage deltas. RepoSpend prefers `last_token_usage` per-turn deltas when present,
18
+ because Codex can reset cumulative `total_token_usage` after compaction. It also
19
+ keeps cache reads as a sub-bucket of input and separates reasoning output from
20
+ visible output so each billable bucket is counted once.
21
+
22
+ ## Claude Code
23
+
24
+ RepoSpend scans:
25
+
26
+ - `~/.claude/projects`
27
+ - `~/.config/claude/projects`
28
+ - `~/Library/Application Support/Claude/local-agent-mode-sessions`
29
+ - `~/.config/Claude/local-agent-mode-sessions`
30
+
31
+ Claude Code session transcripts are parsed from JSONL files. Useful fields include `sessionId`, `cwd`, `gitBranch`, `timestamp`, `entrypoint`, `message.model`, and `message.usage`. When `message.usage` is present, RepoSpend sums Claude assistant usage records directly. When token counts or model names are absent in a transcript, sessions remain visible with unknown cost.
32
+
33
+ RepoSpend checks `~/.claude/history.jsonl` only for source status/counting. History-only entries are not imported into usage analytics because they do not include reliable token, model, or transcript data.
34
+
35
+ ## GitHub Copilot
36
+
37
+ RepoSpend scans GitHub Copilot local files:
38
+
39
+ - `~/.copilot/otel/*.jsonl`
40
+ - the explicit file in `COPILOT_OTEL_FILE_EXPORTER_PATH`
41
+ - `~/.copilot/session-state/*/events.jsonl`
42
+ - VS Code `User/workspaceStorage/*/GitHub.copilot-chat/{transcripts,debug-logs}`
43
+
44
+ Copilot OpenTelemetry records can include exact input, cached input, cache
45
+ creation, output, and reasoning token fields. RepoSpend imports those directly,
46
+ deduping lower-priority agent summary records when a more specific chat span or
47
+ inference record is present. Copilot CLI session-state files currently expose
48
+ repo context and output-token counts, but not a full input/cache split; RepoSpend
49
+ shows those tokens as partial usage and leaves cost unknown rather than inventing
50
+ missing input. VS Code Copilot Chat transcripts remain visible even when they do
51
+ not contain token data.
52
+
53
+ ## Cursor
54
+
55
+ Cursor support is experimental and opt-in because local Cursor files vary by
56
+ version, platform, and product surface. Cursor may store useful transcript data
57
+ without exact token or cost fields, and some usage data may only exist in
58
+ account-backed services rather than local files.
59
+
60
+ RepoSpend scans local Cursor paths such as:
61
+
62
+ ```text
63
+ ~/.cursor/
64
+ ~/.cursor/chats/
65
+ ~/.cursor/projects/
66
+ ~/.cursor/projects/*/agent-transcripts/
67
+ ~/Library/Application Support/Cursor/User/globalStorage/state.vscdb
68
+ ~/Library/Application Support/Cursor/User/workspaceStorage/
69
+ ~/.config/Cursor/User/globalStorage/state.vscdb
70
+ ~/.config/Cursor/User/workspaceStorage/
71
+ %APPDATA%\Cursor\User\globalStorage\state.vscdb
72
+ %APPDATA%\Cursor\User\workspaceStorage\
73
+ ```
74
+
75
+ RepoSpend prioritizes Cursor JSONL transcripts, then searches local SQLite,
76
+ `.db`, and `.vscdb` files for chat/composer/agent-like JSON blobs. Unknown or
77
+ locked Cursor databases are skipped with warnings. Prompt and response text is
78
+ never uploaded.
79
+
80
+ If Cursor sessions import with unknown tokens or cost, that usually means the
81
+ local files did not include exact usage data. RepoSpend keeps the session visible
82
+ and avoids guessing.
83
+
84
+ ### Troubleshooting Cursor Import
85
+
86
+ To inspect what exists locally:
87
+
88
+ ```bash
89
+ find ~/.cursor -type f | grep -E "jsonl|sqlite|db|vscdb|chat|transcript"
90
+ ls -la "$HOME/Library/Application Support/Cursor/User/globalStorage"
91
+ ls -la "$HOME/Library/Application Support/Cursor/User/workspaceStorage"
92
+ ```
93
+
94
+ On Linux, replace the `Library/Application Support` paths with
95
+ `$HOME/.config/Cursor/User/...`. On Windows, check
96
+ `%APPDATA%\Cursor\User\globalStorage` and
97
+ `%APPDATA%\Cursor\User\workspaceStorage`.
98
+
99
+ The normalized usage shape lives in `packages/types` and is intended to support future adapters for OpenCode, Gemini CLI, and other local assistants.
100
+
101
+ For details on cache, reasoning, and comparison with tools such as `ccusage` and
102
+ Tokscale, see [token-accounting.md](token-accounting.md).
103
+
104
+ ## RepoSpend-Owned Data
105
+
106
+ RepoSpend-owned settings are stored separately under `~/.repospend/`:
107
+
108
+ ```text
109
+ ~/.repospend/pricing.json
110
+ ~/.repospend/config.json
111
+ ~/.repospend/cache/
112
+ ```
113
+
114
+ The default editable pricing table is `~/.repospend/pricing.json`; local app
115
+ settings live in `~/.repospend/config.json`. RepoSpend caches parsed session
116
+ summaries under `~/.repospend/cache/` so unchanged large transcripts reload
117
+ faster.
118
+
119
+ The Settings page includes a reset action for RepoSpend-owned files under
120
+ `~/.repospend/`. It does not delete or edit anything under source client paths
121
+ such as `~/.codex`, `~/.claude`, `~/.copilot`, or Cursor storage directories.
package/docs/llms.txt ADDED
@@ -0,0 +1,59 @@
1
+ # RepoSpend
2
+
3
+ Canonical description:
4
+ RepoSpend is a local-first dashboard for tracking AI coding token usage and API-equivalent spend by repository, session, model, and tool. It supports local Codex, Claude Code, and GitHub Copilot usage data, runs with `npx repospend`, and does not upload prompts, code, transcripts, or usage data.
5
+
6
+ Canonical URLs:
7
+ - Website: https://repospend.com
8
+ - GitHub: https://github.com/mehmetdemircs/RepoSpend
9
+ - npm: https://www.npmjs.com/package/repospend
10
+ - Package name: repospend
11
+ - Run command: npx repospend
12
+
13
+ What RepoSpend is:
14
+ - A local-first AI coding token usage dashboard.
15
+ - A repo-level AI coding cost tracker using estimated API-equivalent cost.
16
+ - A dashboard for inspecting AI coding usage by repository, session, model, source tool, day, hour, and token type.
17
+ - A way to compare Codex token usage, Claude Code token usage by repo, and GitHub Copilot local usage data.
18
+ - RTK appears as token-reduction workflow context. RTK is not an AI model or coding assistant.
19
+ - Experimental opt-in Cursor token usage tracking is available when local Cursor data includes usable transcript or token fields.
20
+
21
+ Privacy guarantees:
22
+ - Runs locally on the user's machine.
23
+ - Binds to localhost for the dashboard/API.
24
+ - Reads supported local source files in read-only mode.
25
+ - Does not upload prompts, code, transcripts, or usage data.
26
+ - Does not require login, telemetry, cloud sync, or an account.
27
+ - Does not modify Codex, Claude Code, GitHub Copilot, Cursor, or RTK files.
28
+
29
+ Supported tools and data sources:
30
+ - Codex: strongest support; local SQLite/session data, tokens, models, repo grouping, sessions, command friction.
31
+ - Claude Code: local project/session JSONL data, sessions, projects, timestamps, models, token usage when present.
32
+ - GitHub Copilot: local OpenTelemetry JSONL exports, Copilot session-state files, and VS Code Copilot Chat transcript/debug files when present.
33
+ - Cursor: experimental opt-in support for local JSONL, SQLite, db, and vscdb files; token and cost accuracy depends on local data availability.
34
+ - RTK: token-reduction workflow context shown alongside AI usage; RTK is not an AI token source.
35
+
36
+ Target users:
37
+ - Developers using AI coding tools across multiple repositories.
38
+ - Engineering leads who want local-first AI usage analytics without uploading prompts or code.
39
+ - Maintainers who want to understand repo-level AI coding spend, model mix, cache reuse, high-token sessions, and agent friction.
40
+ - Teams comparing AI coding cost estimates across Codex, Claude Code, GitHub Copilot, and experimental Cursor imports, with RTK context for reducing token waste.
41
+
42
+ Useful descriptions:
43
+ - Codex token usage dashboard
44
+ - Claude Code token usage by repo
45
+ - AI coding spend dashboard
46
+ - Local-first AI usage analytics
47
+ - Cursor token usage tracking
48
+ - Repo-level AI coding cost tracker
49
+ - API-equivalent AI coding cost estimates
50
+ - Local AI coding usage dashboard
51
+
52
+ Positioning:
53
+ - RepoSpend complements CLI tools such as ccusage.
54
+ - ccusage is useful for terminal-first Claude Code totals and daily breakdowns.
55
+ - RepoSpend is useful for visual repo-level analytics, session inspection, source/tool comparison, model mix, token shape, cache reuse, exports, and command/agent friction.
56
+
57
+ Cost language:
58
+ - RepoSpend shows estimated API-equivalent cost.
59
+ - RepoSpend does not claim to show actual bills, invoices, subscription usage, savings, credits, or account-specific charges.
@@ -0,0 +1,44 @@
1
+ # Pricing
2
+
3
+ RepoSpend estimates API-equivalent cost from a local pricing table. The bundled defaults live in `packages/core/src/pricing.ts`, and the dashboard Settings page saves local overrides to `~/.repospend/pricing.json`.
4
+
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
+
7
+ Each model can define:
8
+
9
+ - input tokens
10
+ - cache write input tokens
11
+ - cached input tokens
12
+ - output tokens
13
+ - reasoning output tokens
14
+
15
+ RepoSpend prices each bucket once. `inputTokens` is normalized as total input,
16
+ including cache reads and cache writes when those are present, so the pricing
17
+ formula first subtracts cache sub-buckets from billable input and then applies
18
+ their cache-specific rates. This is why RepoSpend token totals can be lower than
19
+ tools that add cache reads/writes as separate "total token" columns while still
20
+ producing comparable API-equivalent cost.
21
+
22
+ Reasoning output is also priced once. For Codex records where raw
23
+ `output_tokens` includes `reasoning_output_tokens`, RepoSpend subtracts reasoning
24
+ from visible output before storing and pricing both buckets. If a comparison tool
25
+ shows output inclusive of reasoning and also prices reasoning separately, its
26
+ cost will be higher because reasoning is counted twice.
27
+
28
+ See [token-accounting.md](token-accounting.md) for the detailed comparison model.
29
+
30
+ When an exact model id is not present in the pricing table, RepoSpend first tries conservative family matching for known provider naming patterns. For example, a nearby newer Claude Opus 4.x or GPT 5.x variant can inherit the closest older bundled rate so the dashboard stays useful while public rate cards catch up. Inherited rates are labeled in Settings.
31
+
32
+ If RepoSpend cannot resolve a usable rate, it still displays token totals and marks cost as unknown. Unknown pricing does not stop scans, dashboard responses, CLI output, or exports.
33
+
34
+ If Codex only exposes a raw token total for an older session, RepoSpend also leaves cost unknown. It does not infer an input/output split because that would make the estimate look more precise than the local data supports.
35
+
36
+ Claude Code local transcripts may include token counts and model names, but they may also omit one or both depending on the local file and client version. RepoSpend leaves Claude cost unknown when the local data is insufficient instead of inventing a token split.
37
+
38
+ GitHub Copilot local files vary by surface. OTEL exports can include full token
39
+ splits and can be priced with the bundled model table. Copilot CLI session-state
40
+ files can expose output-token counts without input/cache fields; RepoSpend shows
41
+ those output tokens but leaves API-equivalent cost unknown because pricing only
42
+ the output side would look more complete than the local data supports.
43
+
44
+ These costs are not your actual ChatGPT, Codex, Claude, Claude Code, or GitHub Copilot bill. Your real cost may differ because of subscriptions, credits, provider terms, included usage, premium request multipliers, account-level pricing, or other billing factors.
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,66 @@
1
+ # Token Accounting
2
+
3
+ RepoSpend uses one normalized token shape across local clients:
4
+
5
+ - `inputTokens` is total input for the request/session. When a source reports cache reads or cache writes separately, RepoSpend includes them in `inputTokens` and also stores them in sub-buckets.
6
+ - `cachedInputTokens` is the cache-read portion of input.
7
+ - `cacheCreationInputTokens` is the cache-write portion of input, when the source exposes it.
8
+ - `outputTokens` is visible/non-reasoning output.
9
+ - `reasoningTokens` is reasoning output, when the source exposes it.
10
+ - `totalTokens = inputTokens + outputTokens + reasoningTokens`.
11
+
12
+ This keeps total tokens aligned with the amount of model work represented by the normalized session, while still preserving the billable cache buckets needed for cost.
13
+
14
+ ## Why `ccusage` Can Show Higher Totals
15
+
16
+ `ccusage` displays cache reads and cache writes as addable token buckets. In that accounting style, a total is closer to:
17
+
18
+ ```text
19
+ uncached input + cache read input + cache write input + output
20
+ ```
21
+
22
+ RepoSpend instead normalizes those cache buckets under input:
23
+
24
+ ```text
25
+ inputTokens + outputTokens + reasoningTokens
26
+ ```
27
+
28
+ Both views can be useful, but they answer different questions. RepoSpend's total is the dashboard/product total: how much local AI coding usage belongs to a repo, session, model, or day without counting the same cached input twice. `ccusage`'s displayed total is useful as a billable-line-item view, but it will look larger when cache reuse is high.
29
+
30
+ Do not make RepoSpend's total match `ccusage` by adding `cachedInputTokens` to `inputTokens`. RepoSpend already prices cached input separately in `packages/core/src/pricing.ts`:
31
+
32
+ ```text
33
+ billable input = inputTokens - cachedInputTokens - cacheCreationInputTokens
34
+ cached input = cachedInputTokens
35
+ cache write input = cacheCreationInputTokens
36
+ ```
37
+
38
+ Adding cached tokens again would inflate token totals and double-charge cached input in API-equivalent cost.
39
+
40
+ ## Reasoning Tokens
41
+
42
+ RepoSpend keeps reasoning tokens separate when the local source exposes them. The accurate treatment depends on the source's raw usage shape:
43
+
44
+ - If `output_tokens` already includes `reasoning_output_tokens`, RepoSpend subtracts reasoning from output and then stores reasoning separately.
45
+ - If a source reports visible output and reasoning as separate non-overlapping fields, RepoSpend can store both directly.
46
+ - If a source does not expose reasoning, RepoSpend leaves reasoning at zero rather than inventing it.
47
+
48
+ Codex local token records currently need the first treatment: reported `output_tokens` can include `reasoning_output_tokens`. RepoSpend therefore normalizes Codex output to visible output and prices reasoning once. A comparison tool that reports output inclusive of reasoning and also reports reasoning separately can show a higher cost because reasoning has effectively been counted twice.
49
+
50
+ ## What To Compare In Reviews
51
+
52
+ When checking RepoSpend against `ccusage`, Tokscale, or another local usage tool:
53
+
54
+ - Compare the same absolute date window and timezone.
55
+ - Compare API-equivalent cost first.
56
+ - Compare bucket-level values, not just headline total tokens.
57
+ - Treat large cost differences as real discrepancies.
58
+ - Treat token total differences as suspicious only after accounting for cache semantics, reasoning semantics, date filters, and cumulative Codex checkpoints.
59
+
60
+ For Codex, RepoSpend prefers per-turn `last_token_usage` deltas and skips stale duplicate snapshots when available. This avoids under-counting sessions that compacted and avoids over-counting rebroadcast cumulative checkpoints.
61
+
62
+ For GitHub Copilot, RepoSpend aligns with ccusage and Tokscale for OTEL-backed
63
+ records, but keeps `cachedInputTokens` as a subset of `inputTokens` in the
64
+ normalized model. Copilot CLI session-state files can expose output tokens
65
+ without input/cache tokens; those sessions are counted as partial token data and
66
+ left unpriced until a full OTEL usage record is available.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "repospend",
3
- "version": "0.0.8",
4
- "description": "Local-first dashboard for tracking AI coding token usage by repo, source, session, model, and day.",
3
+ "version": "0.1.0",
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",
7
7
  "type": "module",
@@ -23,7 +23,11 @@
23
23
  "README.md",
24
24
  "CHANGELOG.md",
25
25
  "SECURITY.md",
26
+ "docs/llms.txt",
27
+ "docs/data-sources.md",
28
+ "docs/pricing.md",
26
29
  "docs/PUBLISHING.md",
30
+ "docs/token-accounting.md",
27
31
  "docs/screenshots/*.png",
28
32
  "LICENSE"
29
33
  ],
@@ -47,10 +51,16 @@
47
51
  "codex",
48
52
  "openai-codex",
49
53
  "claude",
54
+ "claude-code",
55
+ "cursor",
56
+ "github-copilot",
50
57
  "ai-coding",
58
+ "ai-usage-analytics",
51
59
  "developer-tools",
52
60
  "token-usage",
53
61
  "cost-tracking",
62
+ "ai-cost-tracker",
63
+ "repo-spend",
54
64
  "local-first",
55
65
  "cli",
56
66
  "dashboard",
@@ -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:Inter,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}.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}.header-filter-strip{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:9px}.header-filter-chip{display:inline-flex;min-height:24px;max-width:240px;align-items:center;border:1px solid rgba(148,163,184,.16);border-radius:999px;background:#0f172aa8;color:#cbd5e1;font-size:11px;font-weight:700;overflow:hidden;padding:3px 8px;text-overflow:ellipsis;white-space:nowrap}.header-filter-chip.strong{border-color:#2dd4bf4d;color:#99f6e4}.header-filter-chip.attention{border-color:#f59e0b52;background:#f59e0b1a;color:#fcd34d}.header-filter-reset{font-size:12px}.page-header-actions{display:flex;flex:0 0 auto;align-items:center;gap:8px}.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}.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.active>span{border-color:#2dd4bf80;background:#2dd4bf24;color:#ccfbf1}.loading-stage-row.active strong{color:#f8fafc}.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;gap:12px;grid-template-columns:repeat(auto-fit,minmax(240px,1fr))}.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}.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-badge-codex{border-color:#5eead43d;color:#99f6e4}.source-badge-claude{border-color:#f59e0b47;color:#fcd34d}.source-badge-cursor{border-color:#38bdf847;color:#7dd3fc}.source-badge-copilot{border-color:#c4b5fd47;color:#ddd6fe}.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:4}.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:hover:not(:disabled),.quick-filter.active{border-color:#2dd4bf57;background:#2dd4bf1f;color:#5eead4}.quick-filter:disabled{cursor:not-allowed;opacity:.38}.price-input{width:124px;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}.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}.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{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;color:#fbbf24!important;font-weight:650}.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-detail-tabs{display:flex;flex-wrap:wrap;gap:8px}.repo-detail-tabs button{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}.repo-detail-tabs button:hover,.repo-detail-tabs button.active{border-color:#2dd4bf57;background:#2dd4bf1a;color:#dbeafe}.repo-overview-grid{display:grid;gap:16px;grid-template-columns:minmax(0,1fr) minmax(360px,.9fr)}.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:12px}.repo-review-row{display:grid;gap:12px;grid-template-columns:minmax(0,1fr) auto;align-items:center;border:1px solid rgba(148,163,184,.12);border-radius:8px;background:#02061757;padding:10px 12px}.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-row{display:flex;align-items:flex-start;gap:8px;border:1px solid rgba(245,158,11,.18);border-radius:8px;background:#f59e0b14;color:#fbbf24;font-size:13px;line-height:1.45;padding:10px}.repo-model-row{display:grid;gap:4px;border:1px solid rgba(148,163,184,.12);border-radius:8px;background:#02061757;color:#e2e8f0;padding:10px}.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}.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{grid-template-columns:1fr}.sidebar{position:static;height:auto}.sidebar-nav{grid-template-columns:repeat(4,minmax(0,1fr))}.sidebar-section,.sidebar-status{display:none}.dashboard-grid,.overview-chart-pair{grid-template-columns:1fr}.filter-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.repo-compact-filter-row,.repo-hero,.repo-overview-grid{grid-template-columns:1fr}.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-nav{grid-template-columns:repeat(2,minmax(0,1fr))}.filter-grid,.repo-compact-filter-row,.repo-hero-metrics,.repo-detail-summary,.repo-concentration-stats,.repo-custom-dates,.repo-review-row,.doctor-score-panel{grid-template-columns:1fr}.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(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}}