Skip to content

Releases: pvjagtap/github-copilot-usage-dashboard

v1.11.14 - cache-miss notifications

Choose a tag to compare

@pvjagtap pvjagtap released this 06 Oct 04:52

Install

Download copilot-usage-dashboard-1.11.14.vsix below, then:

code --install-extension copilot-usage-dashboard-1.11.14.vsix

Reload the window afterwards (Developer: Reload Window).


Added — cache-miss notifications

When a request misses the prompt cache and is billed for re-sending its whole context, you now get a notification with the cause and the cost: whether the idle time exceeded the configured cache lifetime (copilotUsage.cacheTtl.ttl) or the prompt prefix changed inside it, how much was read from cache against what was expected, and how many credits the miss cost over a warm cache.

On one machine's October logs this found 26 misses worth 3,901 credits, 23 of them after the cache TTL had lapsed.

  • Per session, model and call site (subagents keep their own cache); a compacted context is not a miss; BYOK requests are skipped.
  • Settings: copilotUsage.cacheMiss.enabled (on by default; the toast has a "Turn Off" button), minPromptTokens (20,000), minWastedCredits (1).
  • Works whether or not the cache countdown is enabled. Misses are also logged to the Copilot Usage output channel.

Full details in CHANGELOG.md.

v1.11.13 - PiG sessions scanned, Anthropic estimates fixed

Choose a tag to compare

@pvjagtap pvjagtap released this 06 Oct 04:34

Install

Download copilot-usage-dashboard-1.11.13.vsix below, then:

code --install-extension copilot-usage-dashboard-1.11.13.vsix

Reload the window afterwards (Developer: Reload Window).


Fixed

  • PiG (~/.pig) sessions were never scanned. PiG routes to GitHub Copilot, so its usage showed up only as credits the local logs could not explain. It is now a first-class source with its own column; subagent runs are included as usage and duplicate transcript copies are not counted twice. On one machine this closed a 3,130-credit gap against GitHub's ledger to 151 (0.4%).
  • Estimated Anthropic credits ran 4-11% low. Fitted against 4,263 billed requests, GitHub bills every prompt token not read from cache at the cache-write rate (R² = 1.0000); the estimator used the plain input rate. Affects estimated rows only, never credits read from copilotUsageNanoAiu.

Full details in CHANGELOG.md.

v1.11.12 - Systems table matches the dashboard tiles

Choose a tag to compare

@pvjagtap pvjagtap released this 06 Oct 04:18

Install

Download copilot-usage-dashboard-1.11.12.vsix below, then:

code --install-extension copilot-usage-dashboard-1.11.12.vsix

Reload the window afterwards (Developer: Reload Window).


Fixed

  • Systems table disagreed with the dashboard tiles. Per-system sessions, turns and tokens now use the same definition as the tiles (conversation turns and used chats), instead of counting every debug-log turn row.

Full details in CHANGELOG.md.

v1.11.11 - dated ledger credits, OMP subagents, dashboard drift fixes

Choose a tag to compare

@pvjagtap pvjagtap released this 06 Oct 04:15

Install

Download copilot-usage-dashboard-1.11.11.vsix below, then:

code --install-extension copilot-usage-dashboard-1.11.11.vsix

Reload the window afterwards (Developer: Reload Window).


Fixed

  • Credits GitHub billed in a burst are dated to that burst. The extension now remembers each ledger reading it polls and lines every rise up with local activity in the same window, instead of parking the whole unexplained remainder on one day. Billing lag is not mistaken for hidden spend; rises inside polling gaps over 3 hours, and days under 25 credits, stay parked. History starts accumulating after install.
  • Recovered credits were all under Input in the model table; they now split like the same model's surviving requests.
  • OMP subagent transcripts were never scanned; their calls and credits are now included (as usage, not sessions).
  • "N sessions" counted chats that were never used.
  • Usage by Source mixed time windows across the OMP/Pi/CLI rows; every row is now the current cycle.
  • Daily-credits calendar mixed UTC and local days; it is UTC throughout, labelled, and tooltips show your local span.

Full details in CHANGELOG.md.

v1.11.10 - recover credits lost to head-truncated debug logs

Choose a tag to compare

@pvjagtap pvjagtap released this 06 Oct 03:37

Install

Download copilot-usage-dashboard-1.11.10.vsix below, then:

code --install-extension copilot-usage-dashboard-1.11.10.vsix

Reload the window afterwards (Developer: Reload Window).


Fixed — credits missing from long VS Code sessions

Copilot caps each debug-logs/<sid>/main.jsonl by cutting off its head, so the early llm_request lines of a long session — and the copilotUsageNanoAiu GitHub billed for them — disappear. The scanner then overwrote each turn's credits with the debug-log figure, so those requests were billed but never shown, and the dashboard fell short of GitHub's ledger by whole sessions' worth of credits.

The chatSession file keeps VS Code's own per-request copilotCredits, which matched the debug-log sum to the cent for every intact session checked. The scanner now takes the shortfall back from it, dated and attributed at the lost request:

  • never more than the session's total shortfall;
  • only requests that began before the log's first surviving llm_request (a log merely lagging the live tail is not topped up);
  • a turn the debug log never overlaid is not counted twice.

Recovered credits carry no token counts, so the "AI Credits by Model" table lists them under Input; totals and per-day figures are exact. Applies to closed cycles too.

Fixed — empty-window sessions' debug logs were never read

Sessions opened with no folder keep their debug logs under globalStorage/github.copilot-chat/debug-logs. That directory is now scanned.

Also included (1.11.9)

  • OMP sessions no longer vanish when the session header is not on line 1.
  • Rate table corrected against real copilotUsageNanoAiu figures (claude-opus-5.5 has its own key; GPT-5.6/6 cache-write rates; new models added).

Full details, including 1.11.5–1.11.8 which were not released separately, are in CHANGELOG.md.

v1.11.4 - per-machine rollups report their own usage, not the account ledger

Choose a tag to compare

@pvjagtap pvjagtap released this 09 Sep 04:41

Install

Download copilot-usage-dashboard-1.11.4.vsix below, then:

code --install-extension copilot-usage-dashboard-1.11.4.vsix

Fixed — every system reported the whole account's spend

The Systems — Combined Usage table credited each machine with the entire account's credits. A Linux laptop with 3 sessions and 97 requests reported 42,069 credits — more than a workstation with 221 sessions and 2,564 turns — and the combined row then added that same figure once per machine.

1.11.3 made the headline adopt GitHub's quota_snapshots ledger. That is right for the hero tile, but it is an account figure: on a pooled Business or Enterprise seat it covers every machine, every IDE, github.com, the cloud agent, and every other member of the org. The per-machine rollup published over Settings Sync kept reading that same field, so each system republished the account total as its own.

Machines now publish localTotalCredits — the same number before the ledger delta is folded in — with sessions, turns and tokens clipped to the billing cycle and to VS Code chat. The headline tile is unchanged and still reconciles with github.com exactly.

On the token counts this surfaced: they were never wrong. Agent sessions re-send the whole conversation each round, so 9 user messages became 97 LLM calls, and 93.6% of the 6.4M gross input tokens were cache reads. Large totals from a handful of sessions are expected.

Fixed — a machine's daily history was discarded on every publish

The slot declared a 120-day retention window, but byDay was replaced wholesale rather than merged on each write. It therefore only ever held what the current scan could still see — one or two days in practice. Debug logs rotate, workspace storage gets cleaned up, and a closed cycle stops being recomputed, so days that had been recorded correctly vanished on the next publish. The retention window applied to nothing.

This matters most for a machine that is gone: machineId changes after an OS reinstall, so a rebuilt machine gets a fresh slot and the old one can never republish. Its slot is the only surviving record of that system.

byDay now accumulates. A recomputed day supersedes the stored one only when non-zero — a zero means the scan lost sight of that day, not that the day was free.

Fixed — the Systems table ignored the range selector

It was keyed off each slot's single cycleCredits scalar and hard-filtered to the current billing cycle, so a system could only ever appear in the one cycle it last reported — including under "All Time". A retired machine whose slot froze in a closed cycle was reachable from no range at all.

Per-system credits are now summed from the synced byDay map for the selected range, so the table answers the range selector like every other panel. Sessions, turns and tokens are a whole-slot snapshot rather than a per-day series, so they render as — outside the cycle a system last reported instead of being misattributed. The combined-overage row is withheld for any range that is not exactly the current cycle, since the allowance is per-cycle.

Changed — pre-1.11.4 systems degrade honestly instead of disappearing

Slots now carry a schema field rather than the sync key being versioned. Bumping the key would have hidden every machine that had not updated yet, since a machine only republishes when its own VS Code restarts.

A system still on an older build keeps its row — host, platform, session and turn counts, last seen — tagged pre-1.11.4, with its credits shown as — and excluded from the combined total until it updates. The Systems table also renders for a single system now; that stopped being a restatement of the headline once the headline became the account-wide ledger.


Full changelog: https://github.com/pvjagtap/github-copilot-usage-dashboard/blob/v1.11.4/CHANGELOG.md

v1.11.3 - AIC reconciled with GitHub's ledger + BYOK provider cost

Choose a tag to compare

@pvjagtap pvjagtap released this 04 Sep 22:51

Install

Download copilot-usage-dashboard-1.11.3.vsix below, then:

code --install-extension copilot-usage-dashboard-1.11.3.vsix

Fixed — the AIC total drifted below github.com, and the gap kept growing

The dashboard reported fewer credits than GitHub's own settings page for the same cycle — an offset that widened rather than holding steady.

Every credit figure was reconstructed from local debug logs, which is structurally a lower bound on what GitHub bills. Three blind spots feed it, and all three accrue monotonically:

  • Requests through VS Code's public LanguageModelChat API omit copilotUsageNanoAiu entirely, so they were only ever rate-estimated.
  • Work from other machines, other IDEs, github.com, and the cloud agent never writes a local log at all.
  • Deleted or rotated workspace storage takes its history with it.

The headline now comes from GitHub's own quota ledger (/copilot_internal/user), which matches github.com exactly.

The split is surfaced rather than blended. The hero shows local-derived and GitHub-billed side by side, and Usage-by-Model carries an unattributed / no local log row so the table still totals to the hero instead of quietly falling short of it.

Three follow-on corrections, each surfaced by a user challenging a number that looked wrong:

  • Overage was derived, not read. It computed max(0, total − budget) instead of using the server's overage_count — the same assumption class that produced an earlier phantom overage charge.
  • The budget denominator was the per-user plan table instead of the pooled org entitlement, producing an "over budget pace" banner on a seat well inside its allowance.
  • Pace and projection still derived from the local total while being measured against the pooled budget.

Fixed — duplicate BYOK model rows

VS Code stamps the vendor of whichever model the picker is sitting on, not what the wrapper actually dispatched to. BYOK requests therefore rendered as a second, bare row for the same model alongside the correctly-labelled one. Provider is now inherited by model family.

Added — BYOK provider cost in real dollars

Requests through your own endpoint (Azure AI Foundry, Anthropic, OpenAI, Ollama) are not billed by GitHub. The credit columns could only ever show what that traffic would have cost on Copilot — a figure that appears on no invoice you receive.

A new Provider cost column applies your provider's real published per-token rates to the same traffic and reports USD. It is a different vendor's bill, so it is reported separately and never added to your AI credits.

Anthropic-family rates ship as defaults at published Claude API prices, which Anthropic documents as also being the Microsoft Foundry rate card. Override anything under copilotUsage.byokPricing, including regionMultiplier for Azure US Data Zone deployments (1.1x).

Two deliberate constraints, both visible in the UI:

  • A model with no configured rate renders —, never $0.00. An unpriced Azure deployment and a genuinely free local model must not look identical — one of those is an unbounded under-report.
  • The total is a lower bound. Anthropic prices cache reads at 0.1x input and cache writes at 1.25x–2.0x, but VS Code records a single undifferentiated cached count. Cached tokens are priced as reads; copilotUsage.byokPricing.cacheWriteRatio shifts the split.

Verification

33 tests pass, 0 regressions.

verify-no-drift and verify-dashboard-vs-api still fail. Both reproduce identically on the v1.10.99 baseline in an isolated worktree — they encode the pre-quota contract, where local logs were treated as truth. They were left failing rather than adjusted, since they are a real signal about a contract that genuinely changed.

Full changelog: v1.10.99...v1.11.3

v1.10.99 - empty-window chat store, legacy .json sessions, real project names

Choose a tag to compare

@pvjagtap pvjagtap released this 16 Aug 08:11

v1.10.99 — the sessions that were never being counted

Session discovery was missing two whole sources and mislabelling everything it did find. On a real profile this hid 24 of 28 session files and truncated visible history from 2025-07 down to 2026-02.

Chats with no folder open were never scanned

VS Code writes those to a flat globalStorage/emptyWindowChatSessions directory, never to workspaceStorage/<hash>/chatSessions. The scanner only ever walked the latter, so an entire store — 13.6 MB and a year of history on the profile this was found on — was invisible at every date range.

Discovery now includes the global store, attributed to the project (no folder). When the configured storage root points at the target of a relocated or symlinked directory, the sibling lookup fails, so discovery falls back to the standard root that resolves to the same path. Unrelated roots — a test fixture, another machine's export — match nothing and correctly get no global store.

Pre-JSONL .json sessions were dropped

Both discovery passes filtered on .jsonl, silently skipping the older single-object format still sitting on disk. Those files carry exactly the payload a kind=0 op wraps, so they are now wrapped into one and fed through the existing parser unchanged — no new parsing path. The bundled 631-file regression corpus contains 79 of them, all previously invisible.

Every project rendered as workspace-<hash8>

VS Code no longer writes workspace.json into the storage directory, and the scanner had no other naming source. The workspace hash is now learned at activation from context.storageUri and persisted, so projects show their real folder name.

Note for anyone reading the code: storageUri is <…>/workspaceStorage/<hash>/<extensionId>, so the hash is the segment after workspaceStorage, not the last one. Taking the last segment yields the extension id, matches no workspace directory, and fails silently — which is exactly what the first attempt at this did.

Symlinked workspace directories could vanish silently

listWorkspaceDirsSorted filtered on Dirent.isDirectory(), which is false for symlinks and Windows junctions. A per-workspace link would have been skipped with no error. Symlink entries are now kept and the existing stat checks reject anything that is not a directory. A symlinked workspaceStorage root was never affected — readdir and fsp.stat both follow it.

Tests

  • verify-fixture-corpus.js — reconciles the scanner against every file on disk by exact path set, not just counts, and asserts no file is read from outside the corpus.
  • verify-workspace-hash.js — pins the storageUri segment rule across Windows, Linux, remote and malformed inputs.

Install: download copilot-usage-dashboard-1.10.99.vsix below, then

code --install-extension copilot-usage-dashboard-1.10.99.vsix --force

Reload the window afterwards — the workspace name mapping is recorded at activation.

v1.10.90 — Pre-AIC billing panel (premium requests, not credits, for pre-June ranges)

Choose a tag to compare

@pvjagtap pvjagtap released this 07 Aug 16:06

Fixes a real regression: the AIC section was rendering credit-based promo, budget, and overage cards for pre-AIC ranges (April / May 2026), contradicting the "Premium Requests" hero card. Users looking at May saw an invented ~$2,600 overage against a 3,000-credit budget that did not exist yet.

Fixed

Re-audit of billing-era display. For any range whose end date is before 2026-06-01 the AIC section now respects the historical billing model.

Added

  • Premium Request Billing panel at the top of the AIC section for pre-AIC ranges.
    • Used-vs-included bar against the plan's includedPremiumRequests allowance (300 Business, 1000 Enterprise, 1500 Pro+, 3000 Max).
    • Overage card at the historical rate of \.04 per premium request over the allowance.
  • Section title switches to "Billing Detail (Pre-AIC · Premium Requests + AIC Reconstruction)".
  • Model table below is now clearly labelled "AI Credits by Model (rate-table reconstruction)" so the AIC numbers are not mistaken for the invoice.
  • AICDashboardData.includedPremiumRequests plumbed from PLAN_SPECS through buildDashboardData() to the webview so the panel reads the actual plan allowance instead of hardcoding.

Suppressed for pre-AIC ranges

  • PROMO tag on the section title
  • Credit budget bar (x / 3000 credits used)
  • Dollar overage cards (Overage (with promo) / Overage (without promo) / Promo Savings)

Verified

  • tests/audit-billing-era-split.js confirms every era renders the right headline: May → "Premium Requests" hero + premium-request panel; July → "AI Credits Spent" hero + credit budget bar; August → same as July (current cycle, live projections).
  • Existing tests still pass: webview parses (1 inline script, 84275 chars), historical credits populate for both pre-AIC months, per-model splits populate correctly.

v1.10.86 — Status-bar legend stacking + AIC gross-value line

Choose a tag to compare

@pvjagtap pvjagtap released this 07 Aug 15:01

Changed

  • Status-bar model legend now stacks one model per line. The tooltip's active-model legend (under the DAILY / WEEKLY / THIS MONTH donuts) used a single dot-separated row that kept growing with concurrent sessions and became hard to scan.
  • AIC "Total Credits" card now shows a gross-value sub-line. Shows "$X gross value" (credits × $/credit, no budget subtracted) next to the Overage cards, which bill only credits above the plan's included allowance — the two numbers look similar but mean different things.

Fixed

  • Cold-start AIC totals could briefly read too high when Copilot Chat was mid-write to a session/debug-log file at the exact moment the extension's initial scan ran — most visible with two VS Code windows open on the same PC. A one-shot rescan now fires ~5s after activation so the dashboard self-corrects without needing user action.

Full Changelog: v1.10.83...v1.10.86