Repository navigation
v1.10.99 - empty-window chat store, legacy .json sessions, real project names
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 thestorageUrisegment 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.