Changelog
September 8, 2026 · View on GitHub
Unreleased
1.15.1 - 2026-09-08
Codex usage polls no longer spawn overlapping app-servers (#25)
- Every
get-codex-usageinvocation used to launch a freshcodex app-server— and every such startup runs a Codex marketplace refresh whose leftover git temp directories accumulate on disk (issue #25). The adapter now single-flights launches with a lock, serves snapshots younger than 60s from cache without launching anything, and prefers the long-livedcodex app-server daemon(viaapp-server proxy) on installs that have it, falling back to a direct spawn elsewhere.CODEX_APP_SERVER_MODE=spawn,CODEX_FRESH_TTLandCODEX_LOCK_WAITtune the behavior. - The adapter also lets the backend exit by itself on stdin close before escalating to SIGTERM/SIGKILL, so a marketplace refresh caught mid-clone is not orphaned by the poll that started it.
1.15.0 - 2026-09-08
Local harness telemetry for Codex and OpenCode
- New
providers/get-local-analyticsreads usage metadata (never prompts or responses) from Codex rollout sessions and the OpenCode SQLite store, feeding the same expanded telemetry card that pi and Hermes use: 7-day token chart, top models, top projects, and per-window input/output/cache/reasoning/session breakdowns. Codextoken_countevents carry cumulative counters, so only positive deltas are summed and repeated snapshots are not double-counted; a counter reset restarts from zero rather than going negative. opencodenow reports from the local database by default, so the card works for the free and third-party models used through OpenCode without an OpenCode Zen subscription. The previous Zen quota path is unchanged and still used when no local database exists orOPENCODE_USAGE_SOURCE=apiis set;get-provider-healthfollows the same rule instead of always demanding an API key.- Both scans are cached for 120s like the pi and Hermes adapters — a Codex scan spawns one
jqper session file and took ~5s, far too much to repeat on every widget poll.
Unknown costs are no longer displayed as $0
- Hermes rows with
cost_status = 'unknown'were summed as if measured, mixing placeholder estimates (one row alone claimed ~$180k) into the displayed spend. Unknown rows now make the affected window unknown,includedrows count as a true 0, and a window is only totalled when every row in it has a known cost. Ledgers predatingcost_statusfall back to positive values only, since a default 0 cannot establish that a request was free. - pi sessions that report a 0 cost alongside non-zero tokens (unpriced or custom models) are treated as unknown rather than free.
- Weekday labels under the 7-day charts came from
jq's locale-dependentstrftime("%a"), so two cards could disagree on the same day (quanext toWed). The widget now derives the label from the row's ISO date, making every chart agree regardless of the locale each adapter ran under. get-local-analyticsrecords the source path it scanned in its cache, so a snapshot is never replayed for a differentCODEX_HOME/OPENCODE_DATA_DIR, and a source that has disappeared reports an error instead of stale telemetry.formatCostrenders unknown as—and sub-cent amounts as<\$0.01instead of$0.00, so "no data" and "no charge" are visually distinct. The telemetry cards carry a note stating that local costs may be estimates and that$0is not proof of free usage, and the 7-day chart now scales by tokens so it stays meaningful when costs are unknown.
1.14.0 - 2026-08-26
OpenCode Go provider
- New OpenCode Go (opencode.ai) provider surfaces the live 5-hour, weekly, and monthly usage windows via OpenCode Zen's
/zen/go/v1/usage, authenticated withOPENCODE_API_KEYor the CLI credential in${XDG_DATA_HOME:-$HOME/.local/share}/opencode/auth.json. The endpoint is young, so malformed or unavailable quota data degrades to the documented/zen/go/v1/modelsauth-only check — never a fabricated percentage.useBalance: trueis shown as balance fallback enabled; the endpoint does not expose an amount, so none is claimed.opencodemoves from the informational tier (no quota API) to a full telemetry provider, andget-provider-healthgained a matchingopencodecase.
1.13.3 - 2026-08-26
Hermetic test suites
- The Command Code, Kimi Code, and Antigravity suites drive the real
get-provider-usagedispatcher against fixtures but did not sandboxXDG_CACHE_HOME, so every local run appended fixture snapshots to the real~/.cache/AiOverviewControl/usage-history.jsonl— a Command Code free account that never touched the service showed a constant 30% line (the fixture's 4.20/14), alongside Kimi 75.38% and Antigravity 80% fixture values. All three suites now export a sandboxed cache directory, matching the isolationtest-history-export.shandtest-quota-alert.shalready had. CI runners were unaffected (clean$HOME); the pollution only hit local dev machines. - Local-verification documentation (EN and pt-BR) now states the hermetic contract: fixture-backed dispatcher runs never write to the user's history store.
- Local agent-tool directories (
.commandcode/,.opencode/) are ignored, matching.codexand.claude.
1.13.2 - 2026-08-26
Command Code credential discovery
- Command Code now uses the API key saved by
cmd loginin the CLI-owned, protected~/.commandcode/auth.jsonwhenCOMMAND_CODE_API_KEYis unavailable to DMS. An explicit DMS environment variable still takes precedence. This makes npm-installed Command Code work in graphical/systemd sessions that do not inherit shell startup files such as~/.zshenv. - The readiness check recognizes both credential sources, and the provider, configuration, troubleshooting, and Brazilian Portuguese documentation explain the fallback and the correct graphical-session setup. The adapter continues to show only the monthly credit value when Command Code returns null 5-hour or weekly limits; it never fabricates a percentage.
Documentation and history export
- Refreshed provider/operator guidance and clarified the usage-history export contract. CSV and JSONL exports now consistently reject a history file containing no readable snapshots rather than producing an empty export.
1.13.1 - 2026-08-25
Command Code follow-ups
- The Settings readiness check now recognizes Command Code:
get-provider-healthgained acommandcode|cmd|cmdcodecase, so the health chip reports ready withCOMMAND_CODE_API_KEYset and missing with a pointed hint otherwise (previously "unknown provider"). Follow-up to #21. ProviderLogo.qmlfallback-icon map includescommandcode(terminal icon), shown if the SVG ever fails to load.- CI provider-dispatch coverage now also asserts every selectable provider has a
get-provider-healthcase, so a provider missing its readiness check fails the build instead of shipping as "unknown".
1.13.0 - 2026-08-25
Command Code provider
- New Command Code (commandcode.ai) provider surfaces the live 5-hour and weekly usage windows plus the monthly USD credit balance via the same Provider API key used for the CLI (
COMMAND_CODE_API_KEY). The/alpha/billing/endpoints are experimental, so the adapter degrades to the documented/provider/v1/modelsauth-only check on alpha failure — never a fabricated percentage. Contributed by @Luna161 (#20, #21).
1.12.0 - 2026-08-22
Claude provider config directory override
- The Claude adapter now honors
CLAUDE_CONFIG_DIRwhen resolving where Claude Code keeps its local state, falling back to$HOME/.claudewhen the variable is unset — matching Claude Code's own resolution order. Both the adapter and the health check follow the same order, so a non-default config directory no longer reports the provider as missing. Contributed by @goulartdev (#18).
Multi-window quota notifications
- Added
notifyWindowScope. Until nowcheckNotifications()only ever evaluated the primary window, so a user watching Claude's 7 day window in the DankBar (barWindowOverrides, 1.11.0) still got alerts for the 5 hour one.displayed(new default) alerts on whatever window the DankBar shows for each provider. With no override configured this is byte-for-byte the previous behaviour, so existing installs see no change until they opt in.allalerts on every window the provider reports — Claude's 5 hour and 7 day, Codex's weekly, and so on.primarypins the pre-1.12 behaviour.
- Each window keeps its own dedupe key (
provider:kind:minutes:bucket), so two windows of the same provider alert independently instead of overwriting each other, and the disk-backed cooldown insend-quota-alertstill applies per window. Windows that hash to the same identity — possible underallwhen a payload reports two windows with neither a duration nor a reset — are collapsed to the first, so one key can never be fought over inside a single pass. - Sorting, the hero, the fleet rollup, history, and sparklines are untouched: they still read the primary window.
DankBar pill tooltip
- Hovering the pill now reads, for example,
Claude · 7 day · 31% · resets in 2d. WithbarWindowOverridesthe bar percentage is not necessarily the primary window, so the number alone was ambiguous; the tooltip names the window it came from. With several providers in the pill each is listed without the reset, which would not fit on one line. - Implemented by reading
BasePill.isMouseHoveredrather than layering anotherMouseAreaover the pill, so the bar's own click, ripple, and hover highlight are untouched. The tooltip window is created lazily on first hover and positioned against the bar edge (top, bottom, left, or right). NewpillTooltipsetting, enabled by default.
Usage history export
- New
providers/export-usage-history csv|jsonl [directory]writes the local history store to a timestamped0600file and prints its path. CSV carriestimestamp_iso,timestamp_epoch,provider,percentwith the percentage rounded to two decimals; JSONL is the raw store with unparsable lines dropped. The destination defaults to the XDG download directory, then~/Downloads, then$HOME. - Settings exposes it as Export usage history with CSV and JSONL buttons, reporting the written path or the script's own reason for failing (no history yet, unwritable destination).
- The store is trimmed to
historyRetentionsnapshots, so this is the only way to keep long-term data.
Settings
- Per-provider threshold validation.
notifyThresholdsentries that the widget silently discards are now reported while typing: malformed pairs, unknown provider IDs (aliases such asz.aiandagyare accepted, matching the runtime), duplicates, providers that are not tracked, and percentages outside 1–100. Previously the only symptom of a typo was an alert that never arrived. - Reset to defaults. A two-step confirm restores every persisted key, including tracked providers, pins, thresholds, and DankBar overrides; recorded usage history is kept. A
settingsEpochcounter forces every control to re-read its stored value, since settings widgets evaluateloadValue()once at construction. - The provider-logo swatch now treats an empty stored color as "follow the theme accent", the same contract the widget already used, instead of assigning an invalid color.
Fixes
- The Hermes "Session sources" label set
anchors.verticalCenterwhile being a direct child of aFlow. Qt responds by disabling the wholeFlow(Flow will not function), so the source badges were not being laid out. The label is now centred against the badge height instead.
Quality
- New CI gate: a direct child of a
Flowthat setsanchors.*fails the QML job.qmllintcannot see this class of bug because the file stays syntactically valid; the check walks brace depth and only flags anchors exactly one level inside aFlow, so legitimate anchors on nested items still pass. Verified to catch the Hermes regression above. - Three i18n keys with no call site (
card.provider,card.provider_description,settings.health.pending) removed from all five locales. - The v1.6.0 audit report is closed. Every P0/P1 finding was re-verified against the current tree — Codex
rateLimitResetCredits, versions read fromplugin.json, CloudflareString!, Fireworks/quotas, AI21 auth probe,pipefailinget-claude-usage, 9Router cached tokens,PillProgressRingclamp, dispatch coverage as a CI hard gate, and the documentation rewrites are all in place. The report was never tracked by git, so nothing shipped with it.
Documentation
configuration.md,architecture.md, and both READMEs documentnotifyWindowScope,pillTooltip, the export script, and reset-to-defaults. ThebarWindowOverridesrows no longer claim that notifications always keep the primary window — they follow the bar's window by default as of this release.troubleshooting.mdgains "A quota window never alerts" (thedisplayedvsallscope, and where discarded threshold entries are now reported) and "Exporting the usage history", including the export script's exit codes.
Thanks
- Thanks to @goulartdev for his contribution to this release.
1.11.0 - 2026-08-17
DankBar usage-window selection
- Added
barWindowOverrides— a per-provider setting that chooses which quota window the DankBar pill displays (#17). Providers with more than one window (Claude's 5 hour and 7 day, Codex weekly) no longer force the primary window into the bar:claude:secondaryshows the 7-day percentage instead, andhighestfollows the most-constrained window. - The override changes only what the bar shows. Dashboard cards keep every window, and the hero, fleet rollup, sorting, history, sparklines, and notifications continue to use the primary window.
topandautopill modes rank and filter by the displayed number, so the most-critical provider in the bar is coherent with the percentage shown next to it.- A chosen slot absent from the provider's payload (for example a weekly-only Codex account with no
secondary) falls back to the primary window — an override can never blank the bar. Provider aliases (z.ai→zai,agy→antigravity, ...) normalize to the same canonical IDs used by notification thresholds. - Settings exposes one dropdown per tracked provider under Pill mode; restoring
primaryremoves the entry so the stored CSV stays minimal. Keys shipped in all five locales (en,pt_BR,zh_CN,es_ES,de_DE) with parity enforced by CI.
Fixes
- The provider alias table used by notification thresholds (and now by the DankBar window override) learned
z.ai→zai, matching the dispatcher's documented alias. Previously az.ai:90entry in per-provider notification thresholds was silently ignored.
1.10.0 - 2026-08-14
Hermes agent provider (dual-nature)
- Added
hermes(NousResearch/hermes-agent) as an Analytics-coverage provider — the first dual-nature entry: an agent harness that also fronts providers (Nous Portal, OpenRouter, ...). The collapsed card reads Today/Week tokens+cost straight from~/.hermes/state.db(indexed SQLite aggregates computed inline byfetch_hermes_native, milliseconds even on large state databases) and shows the active billing provider + default model from~/.hermes/config.yaml/auth.json. - The expanded card renders a dedicated "Hermes telemetry" section fed by the new
providers/get-hermes-analytics(TTL-cached 120s, mirrors the pi adapter): today/week/month cost+tokens, a 7-day token chart (hover shows cost), top models, top projects (repo root or cwd), session-source breakdown (CLI / Telegram / TUI / WhatsApp ...), session/message/API-call counters, and the installed Hermes version. - Provider-side billing stays honestly linked to the Nous Portal ("Open console"), since Hermes routes its own provider spend there.
- Covered across the stack: provider kind "Agent · Provider", health check (
hermesCLI or~/.hermes/state.db), Settings entry + diagnostics command, fixture-database test (tests/test-hermes-analytics.sh, wired into CI) covering the envelope, analytics aggregation, TTL cache reuse, missing database, empty ledger, and absentsqlite3; an original caduceus logo mark; and docs (README EN/PT-BR, providers reference, architecture protocol section, verification evidence, troubleshooting, configuration — now 36 providers). - All Hermes SQLite access is read-only, so the running gateway keeps its WAL database while the dashboard refreshes.
sqlite3is required for this provider (documented alongside the existing Antigravity/9Router requirement). A locked, corrupt, or pre-ledger database surfaces as a provider error instead of a healthy-looking card full of zeros.
Dashboard and popout polish
- Removed the hover scale effect on provider cards: the growth was clipped on the left by the scroll area's edge, so the card appeared cut. Hover feedback now relies on the background, border and gradient changes only.
- The animated accent bar on the left of each provider card now tracks the card's height animation directly, fixing the lag and misalignment seen while expanding or collapsing a provider's details, and the card content gained clearance so the title no longer hugs that bar.
- The popout header shows a version pill read from
plugin.jsonat runtime (the Settings hero pill also became dynamic), so the displayed version always matches the installed manifest.
Provider taxonomy
- Providers are now classified by kind: hosted model providers (the default),
agent(pi — local coding-agent analytics, not a provider),gateway(9Router — a router that fronts other providers), andlocal(Ollama — self-hosted inference). Non-provider entries carry a kind badge on their dashboard card and in the hero, the add-provider picker shows a kind icon per row with local tooling grouped at the end of the list, and Settings chips tag agent/gateway/local entries. Dual-nature entries such as Hermes (agent manager that is also a provider) render as "Agent · Provider".
Release tooling
- The release checklist no longer asks for a hardcoded version literal in
AiOverviewControlSettings.qml—plugin.jsonis now the single place a release version is written, and the metadata CI check verifies the QML reads it dynamically instead. - New CI guard: provider detail sections (Claude / 9Router / pi / Hermes telemetry) must stay nested inside the card's
visible: card.expandedcontainer. A misplaced brace keeps the file valid forqmllintbut leaks the expanded statistics onto the collapsed card, so the nesting is now checked structurally. - Every shipped locale (
pt_BR,zh_CN,es_ES,de_DE) carries the new keys, keeping the enforced i18n key parity withi18n/en.jsongreen.
1.9.1 - 2026-08-13
Provider accuracy
- Corrected provider coverage and status text so Together is described as API-key validation rather than a balance API, NVIDIA and Kilo no longer claim conclusive authentication through public model catalogs, and Fireworks, GLM, and Z.ai accurately describe their quota-capable paths.
- Updated the Groq usage and Perplexity settings links used by the widget and provider dispatcher.
Settings
- Fixed the diagnostic commands in Settings ("Test selected providers", "Test Codex app-server adapter", "Test pi session analytics adapter", "Check provider prerequisites", "Validate QML") hardcoding the
AiOverviewControldisplay-name casing instead of the manifest idaiOverviewControlused by DMS plugin-store installs. Settings now resolves its own install directory the same way the widget already did (PluginService.getPluginPath, with aQt.resolvedUrlfallback), so copied commands always match the actual on-disk path regardless of install method.
CI and release safety
- Release tags now rerun the complete reusable CI gate before publication, must point to
main, and produce checksum-verified ZIP and TAR archives through one tested packaging script. - Expanded CI coverage across provider dispatch, local logos, manifest targets, shell scripts, Kimi Code, notification deduplication, Crowdin configuration, and release contents.
Documentation
- Aligned the English and Brazilian Portuguese guides with all 35 providers, six coverage levels, current runtime dependencies, installation layout, settings, adapter contracts, and release workflow.
1.9.0 - 2026-08-06
pi coding-agent local analytics provider
- Added
pias a new Analytics-coverage provider — local session cost/token telemetry from~/.pi/agent/sessions/**/*.jsonl(no quota API; pi has no rate limits). Mirrors the 9Router local-telemetry pattern: a cheap cached envelope for the collapsed card (fetch_pi_nativeinget-provider-usage) plus a standaloneproviders/get-pi-analyticsfor the expanded "pi telemetry" card (today/week/month cost+tokens, 7-day chart, top models, top projects). TTL-cached (120s) so the session-file scan runs at most once per refresh window. The official pi.dev mark ships asassets/provider-logos/pi.svg. Contributed by @gtheys (#10).
Codex reliability
- The Codex adapter now completes the documented app-server initialization handshake, waits for responses instead of closing stdin after four seconds, and retries transient rate-limit transport failures once. A recent successful snapshot remains available for 15 minutes when both live attempts fail, preventing short ChatGPT usage-endpoint outages from incorrectly switching the widget to
ERRor “Setup required.” Contributed by @gouwazi (#12, fixes #11). - Follow-up: the adapter no longer leaks the
codex app-serverchild process when a fetch is aborted or times out — it is now reaped on every exit path.
Thanks
1.8.1 - 2026-07-24
Consistency and i18n hardening
- Single source of truth for provider icons.
ProviderLogonow owns the Material fallback-icon map (keyed by canonical id), so the DankBar pill, dashboard cards, and settings chips always agree. Removes the divergingiconForProvider()map in the widget and the per-entryfallbackIconoverrides in settings (audit finding 2.16, ~20/34 providers previously mismatched). - Completed UI localization. The Claude card's
5hwindow label and the DankBar pill'sERR/N/Astatus codes now go through i18n (card.five_hour,pill.error,pill.no_data) and are translated in all five locales (audit 2.9, 2.11). - Removed dead i18n keys
card.backend,status.check_settings,status.self_managedfrom every bundle (audit 2.20). Parity preserved at 156 keys × 5 locales.
1.8.0 - 2026-07-24
Kimi Code subscription tracking
- The Kimi card now tracks the Kimi Code / Coding Plan subscription quota, not only the Open Platform prepaid balance. These are two independent systems with non-interchangeable keys. The adapter routes automatically: a
KIMI_CODING_API_KEY, or aKIMI_API_KEY/MOONSHOT_API_KEYcarrying thesk-kimi-prefix, readsGET https://api.kimi.com/coding/v1/usages(fallback/usage) and maps the weekly window toprimaryand the 5-hour window tosecondary(source: kimi-code); an Open Platformsk-xxxkey keeps reading the currency balance (source: kimi-api). Override the coding host withKIMI_BASE_URL. get-provider-healthnow recognizesKIMI_CODING_API_KEYas a valid Kimi credential. Addedtests/test-kimi-code.shcovering key routing and the weekly/5h window mapping.- Documented the two Kimi quota surfaces, the musical-tempo subscription tiers (Adagio → Vivace), the
kimi-k2.5/moonshot-v1retirement on 2026-08-31, and thekimi-k2.7-code/kimi-k3successors acrossdocs/providers.md,docs/configuration.md, anddocs/provider-verification.md.
Codex documentation
- Clarified that Codex rate-limit windows are model-agnostic: the GPT-5.6 tier rename (Sol / Terra / Luna, 2026-07-09) and the 2026-04 move to token-based metering do not change the
app-serverschema the adapter reads.
1.7.1 - 2026-07-14
Notification experience
- Reworked quota-alert deduplication around a stable provider/window identity. Timestamp jitter, locale changes, and threshold edits no longer re-arm alerts or flood the DankMaterialShell notification popup.
- High-usage alerts now escalate in place to a critical “quota reached” notification at 100%; reminders reuse the same DMS notification instead of stacking cards, and a critical alert is never downgraded back to a warning.
- Notification popups now use a padded monochrome rendering of each provider's bundled logo and concise localized text for the quota window, usage percentage, and reset time.
- Clarified the notification settings, re-alert behavior, and documentation in every supported locale.
Provider logo presentation
- All provider marks in the DankBar pill, dashboard, settings, and new desktop alerts now use one configurable monochrome color while preserving the vector silhouette and transparent canvas.
- Provider-card logo surfaces now share that same color instead of individual brand accents, and Copilot uses the GitHub Copilot mark.
1.7.0 - 2026-07-13
DankBar and provider identity
- Added a visual custom-provider picker that separates providers tracked by the plugin from the compact subset rendered in the DankBar pill.
- Custom pill mode is now strict and no longer falls back to every successful provider when a chosen provider has no current data.
- Provider readiness checks now queue selection changes made during an in-flight check, replacing misleading persistent “not checked” states with a transient “Checking…” state and a distinct informational status.
- Added normalized local provider logos with transparent canvases, preserved brand colors, theme-aware monochrome rendering, offline assets, and documented sources/licenses.
Quota accuracy and connector diagnostics
- Codex window labels now come from
windowDurationMins, not theprimary/secondaryfield position. A weekly-only response is therefore shown as Weekly instead of Session. OpenAI's current pricing documentation still describes a shared five-hour window plus possible weekly limits, so the adapter treats the observed weekly-only payload as a valid server shape, not proof that the five-hour policy was formally removed. - Antigravity now requires a valid
cloudaicompanionProjectbefore requesting quota, preventing the generic empty-project entitlement response from being reported as a false 0% reading. - Antigravity captures transport, 401/403, 429, and schema failures per local account. Healthy accounts remain visible during a partial failure, with the affected account and reason shown as a warning; if every account fails, the most precise error is returned.
- Google refresh tokens are form-encoded from stdin and never placed in
curlarguments. Placeholder models are ignored, known Gemini/Claude/OpenAI families are classified explicitly, and unknown real model families are labelled Other Models. - Added live-path regression coverage for project discovery, HTTP/schema errors, partial accounts, secret handling, model classification, and weekly-only Codex quota responses.
1.6.1 - 2026-07-10
Antigravity UX and quota accuracy
- Concise quota families by default. Antigravity cards now show the same actionable groups as the Models screen: Gemini Models and Claude & OpenAI Models. A family uses the tightest model's percentage and reset, so it remains safe when individual model entries differ.
- Clean multi-account layout. One local account uses the ordinary provider-card view. With two or more detected sessions, the expanded card creates one compact, labelled group per installation and email instead of repeating every model as a placeholder-like list.
- Advanced model diagnostics are opt-in. The new Settings toggle Show individual Antigravity models restores the raw model rows only when troubleshooting is needed. It is off by default for every user.
- Documentation and tests. Updated configuration, architecture, provider matrix, troubleshooting, English and Brazilian Portuguese README guidance, and the
fetchAvailableModelsfixture coverage.
1.6.0 - 2026-07-02
Note: there is no 1.5.0 entry — that version was never released. Its content (the Antigravity provider, #7 by @arqueon, with an auth-header interpolation fix and model-family alignment landed during review) shipped as part of this 1.6.0 release under "Earlier provider additions" and "Antigravity UX and quota accuracy".
Earlier provider additions
- Claude: model-scoped weekly limits (Claude 5 rollout).
get-claude-usagenow parses the canonicallimits[]array from the OAuth usage endpoint (session,weekly_all,weekly_scoped) and surfaces the per-model weekly window (e.g. the weekly Fable allowance) as the card's tertiary window and as a dedicated "Week · Model" bar in the Claude details panel, with fallback to the legacy flatfive_hour/seven_dayobjects. Extra-usage credit state (monthly_limit,used_credits, currency, utilization) is exported too. - Copilot: plan-aware account label. The adapter decodes
access_type_sku(e.g.free_educational_quota→ "Education") andcopilot_plan, showing "login · Plan" on the card, and labels the primary window "Premium requests · AI credits" on accounts migrated to GitHub's usage-based billing (token_based_billing, effective 2026-06-01). - Z.ai: MCP pool labelled and plan tier surfaced. The monthly window backed by
usageDetails(shared Search/Reader/Zread pool) is now labelled "MCP" with call counts (e.g. "6 / 100"), and the account label shows the detected plan tier ("GLM Coding Lite/Pro/Max") instead of a generic "Z.ai account". - Antigravity: multiple accounts / IDEs, side by side. Each install keeps its own
state.vscdbunder a distinct config dir, so two IDEs or two Google accounts are discovered independently, refreshed separately, deduped by email, and rendered as oneAccountBlockper account in the expanded card (install label, email, per-model quota bars, pool description). The compact card mirrors the most-constrained account. Quota comes fromv1internal:retrieveUserQuotaSummary— the exact IDE statusline endpoint (per-week + per-5-hour pools, human "Quota resets in …" strings). Refresh-token recovery handles bothantigravityUnifiedStateSync.oauthTokenand the olderjetskiStateSync.agentManagerInitStatelayouts.
Earlier fixes
- Antigravity: session always 401 on current desktop builds. The adapter read the wrong state DB (
~/.config/Antigravity/…, the pre-rename path) and expected the oldantigravityAuthStatus.apiKeykey holding a raw, short-livedya29.*access token — which is expired by the time a background widget reads it. It now reads the signed-in build's~/.config/Antigravity IDE/…(with legacy fallback), extracts the long-lived refresh token from the OAuth blob, and mints a fresh access token via Google's public OAuth token endpoint (Cloud Code client credentials from the IDE bundle) before querying the quota endpoint. The account label now comes from the refreshedid_tokenemail. Health probe checks both state-DB paths. Secrets never touch the command line, stdout, or a temp file.
Audit fixes
- Codex now reads reset credits from
rateLimitResetCredits.availableCount; the helper initializes with the installed plugin version. - Cloudflare Workers AI GraphQL now uses the valid
String!scalar and deterministic date ordering. - Together AI uses its documented models endpoint for read-only authentication instead of reporting an unverified credits balance.
- Fireworks exposes account quotas when
FIREWORKS_ACCOUNT_IDis configured; AI21 validates its API key through the models endpoint. - Claude bridge analytics and 9Router cached tokens are retained in normalized usage data.
Historical provider notes
- Antigravity provider added (Quota coverage). Surfaces real per-model quota and reset windows from the Google Cloud Code Assist endpoint (
v1internal:retrieveUserQuotaSummaryoncloudcode-pa.googleapis.com) — the same protocol used by Antigravity IDE and the officialgemini-cli. Quotas are grouped into current model families: Claude Opus 4.6, Claude Sonnet 4.6, Gemini 3.5 Flash, Gemini 3.1 Pro, and GPT-OSS 120B. - Dual credential discovery. Authentication prefers the signed-in
agyCLI profile via Linux Secret Service (secret-tool), then falls back to the IDE'sglobalStorage/state.vscdb(antigravityAuthStatus) for desktop builds. The OAuth bearer token is supplied tocurlvia stdin and never appears in process arguments, stdout, or logs. - Health probe.
get-provider-healthnow recognizesantigravityand reports ready/missing based on the keyring or SQLite state availability.
Historical fixes
- Antigravity Authorization header. The bearer token was not interpolated into the
curlconfig line (missing%s), so the live path always failed authentication while fixture tests passed. Token interpolation now works and the live path returns real quota data.
Notes
- Provider count: 33 → 34.
- Antigravity additionally requires
sqlite3on the system for the IDE-state fallback path.
1.4.12 - 2026-06-26
Providers
- Z.ai / GLM window mapping fixed. The quota endpoint's period units are now decoded against the live Usage page:
unit=4= 5-hour session window,unit=6= weekly quota,unit=5= monthly web/search/reader quota, andunit=3= total token allotment. This fixes the bug where a real 20% weekly Z.ai subscription window was labeled as daily.ZAI_API_KEYis also honored as a GLM fallback credential, matching the documented shared Z.ai/Zhipu key family. - OpenRouter / 9Router labels are explicit. When OpenRouter falls back to local 9Router telemetry, the card now says
openrouter via 9router (local)and labels the metric as local-routed data rather than OpenRouter quota. - Codex subscription credits are clearer. A subscription account with zero add-on credit balance now shows
not availableinstead of a misleading bare0, while real positive balances remain visible.
Telemetry
- History only records real quota/spend pressure.
usage-history.jsonlno longer stores flat0%snapshots for balance, analytics, local-runtime, and informational cards. This keeps sparklines meaningful and prevents non-quota providers from polluting trends. - Fleet average load is quota-only. The hero rollup's average now uses only measurable quota windows in the denominator, so balance/analytics/informational providers with intentional
0%placeholders no longer dilute the fleet average toward zero. Peak, at-risk count, and next reset still scan all live cards.
UI / Data Quality
- Currency formatting is stable. OpenRouter/9Router money values now render with two decimals everywhere (
$0.00,$0.50,$2293.31) instead of dropping trailing zeros throughjq tostring.
Documentation / CI
- Updated provider verification docs, architecture notes, README behavior, release notes, and the usage-history integration contract to match the new quota-only history policy.
1.4.11 - 2026-06-24
Features
- Navigable hero overview. The hero is no longer read-only: clicking the fleet rollup's peak provider, or the focused provider's usage bars, now expands that provider's dashboard card and smoothly scrolls the popout to it. This turns the v1.4.9 cross-provider rollup into a jump table for a 33-provider dashboard — go from "which provider is hottest?" to its card in one click.
focusProvider(id)sets the focus, clears any active list filter so the target is visible, and (after the card's expand animation settles) animatescontentYto the card's position. The peak chip and the usage bars get a pointer cursor and a subtle hover fade to signal they are interactive. NewfleetRollup.peakIdcarries the provider id.
1.4.10 - 2026-06-24
Quality / CI
- QML lint is now a hard gate. The CI
qmljob installs Qt5qmllintand runs it as a required step against all three QML files, failing the build on any malformed file. Qt5'sqmllintis a pure syntax verifier — it does not try to resolve the DankMaterialShellqs.*modules, so there is no import-resolution noise to filter and the gate stays clean and deterministic (Qt6'sqmllintwould drown the run in unavoidableqs.*/unqualified warnings). Previously the job skipped silently whenqmllintwas absent. - New
CONTRIBUTING.mddocumenting the dev loop and the gotchas that have cost real debugging time: themodelDatarequirement for customRepeaterdelegates (which broke the v1.4.5 hero bars), thepragma Singletoni18n freeze across hot-reloads, the contained-rounded-indicator pattern, the localqmllintimport-noise filter, and the full CI gate checklist.
UI
- Guided empty/error state in the hero. When no provider resolves, the hero's window-bar slot used to go blank. It now shows a contextual hint that adapts to the situation: a syncing message while loading, an "all providers need attention" prompt (with a credentials/CLI hint) when every provider errored, and a "no usage data yet" prompt otherwise — so the hero never reads as a broken panel. New
hero.*i18n keys across all five bundles.
1.4.9 - 2026-06-24
Features
- Cross-provider fleet overview: the hero now shows an aggregate rollup whenever two or more providers resolve, complementing the single focused-provider view. It surfaces the fleet's average primary-window load (with a progress ring), the hottest provider and its load, how many providers sit at or above 80%, and the soonest reset across all live providers. Percent load is the only unit comparable across heterogeneous providers, so the rollup summarizes quota pressure rather than fabricating a cross-provider monetary total. The
fleetNextResetLabelcountdown re-evaluates on the same stale-tick cadence as the rest of the hero. New i18n keysrollup.*added across all five bundles.
UI
- Refined popout scrollbar: the vertical scrollbar is now a slim (6px), fully-rounded handle that brightens on hover/drag and fades out when idle, with a subtle hover track. The reserved gutter shrank from the default chunky bar to ~12px, so the provider cards no longer get pushed left into an asymmetric inset and their left accent indicators line up with the hero.
Fixes
- i18n hot-reload staleness: the
AiOverviewControlI18nsingleton caches each locale bundle and survives plugin reloads, so keys added during a running shell session previously fell back to English until a full restart. Addedrefresh()(clears the bundle cache and re-reads the JSON) invoked from the widget'sComponent.onCompleted, guarded with atypeofcheck for sessions whose singleton predates the function. Fresh installs were never affected — the bundles are read at process start. Translations themselves (card.resets_in,rollup.*) were already correct in all five bundles.
1.4.8 - 2026-06-24
UI
MetricTileleft accent bar is now a contained, fully-rounded indicator (vertically centered, inset from the edges) instead of a sharp full-height stripe — matching the v1.4.5 provider-card treatment and eliminating the rounded-clip corner bleed.
i18n
- Dropped the orphan
card.enginekey from all five bundles (unused since the v1.4.5 hero rework replaced the Engine label). - Added the missing
card.resets_inkey (referenced by the widget but absent from every bundle, so it had been falling back to the English string) acrossen,pt_BR,es_ES,de_DE,zh_CN. Key parity preserved (131 keys each).
Internal
- Removed dead
barTextandproviderEngineLabelproperties from the widget — both were left unreferenced after the v1.4.5 hero rework (ring → per-window bars, Engine → Resets). - Provider dispatch-coverage CI check no longer emits spurious warnings: the case parser now accepts dotted aliases (e.g.
z.ai, which previously broke the regex and madezailook unrouted), distinguishes canonical providers from documented aliases, and ignores the dedicated non-stub adapters (claude/copilot/codex). Coverage now reports clean: 0 missing dispatch, 0 missing stub.
1.4.7 - 2026-06-24
Providers
- GitHub Copilot — quota field fixes: the API now returns
unlimited: truewithremaining: 0, entitlement: 0for Chat and Completions when there is no cap. The old display function was rendering "0 / 0 remaining" for those windows. Chat and Completions are now suppressed whenunlimited == trueandentitlement == 0— they carry no signal and only cluttered the UI. resetsAtnow populated: the adapter was reading$q.reset_datefrom per-snapshot fields, but that field does not exist. The actual reset date isquota_reset_date_utcat the top level of the response. All three windows now use it.- Overage count surfaced:
premium_interactions.overage_count > 0is appended to the display value as(+N overage). has_quota: falsehandling: when the API signals the quota is exhausted viahas_quota: false,usedPercentis forced to 100.unlimitedguard onused_percent: unlimited windows always returnusedPercent: 0regardless of thepercent_remainingvalue.
1.4.6 - 2026-06-24
Providers
- Z.ai / GLM — real quota tracking: both
zaiandglmadapters now callGET /api/monitor/usage/quota/limitinstead of the auth-only/modelsendpoint. The response exposesdata.limits[]— each limit carriestype(TIME_LIMIT/TOKENS_LIMIT),percentage(0–100),nextResetTime(epoch ms),remaining,unit, andnumber. Limits are sorted by urgency (highest % among timed windows first) and mapped to primary / secondary / tertiary.data.level(e.g.lite) is surfaced as the credits field. Falls back to auth-only/modelscheck when the quota endpoint is unavailable. - Coverage level for
zaiandglmpromoted from Auth → Quota in the provider matrix.
Fixes
providerSubtitlein the QML widget showed "reinicia" (without a reset time) when a provider returnedresetsAt: null.formatTimeUntil(null)returns"", not"—", so the!== "—"guard passed; the reset label was then rendered with an empty time. Fixed by checkingreset && reset !== "—"so providers with no reset window correctly show "sem janela de reset".
1.4.5 - 2026-06-19
Fixes
- Popout scrollbar no longer overlaps the content: the bar is now anchored full-height to the right edge with a reserved gutter, so cards never render underneath it (was a floating bar with a negative margin sitting on top of the content).
UI
- Provider cards calmed: inactive cards now recede (lower accent overlay, border, and side indicator) so the hovered/focused/expanded card stands out — usage hierarchy reads by state instead of every card competing at once.
- The left accent stripe was replaced with a contained, rounded active indicator that grows when the card is expanded — no more sharp corners bleeding past the card's rounded edges.
- Account / Login / Credits moved from large metric boxes to compact inline pills (
InfoPill), reclaiming vertical space and reducing visual clutter; Credits hides when unavailable. - Hero overview reworked: removed the decorative background blobs, the title now names the focused provider (no longer duplicating the popout header), and the single decorative usage ring was replaced with per-window usage bars (label · value · reset, colored by usage level) — surfacing windows like Premium requests / Chat / Completions at a glance. Window labels now prefer the provider's
resetDescription.
1.4.4 - 2026-06-18
Features
- New xAI (Grok) provider (
xai): validatesXAI_API_KEYvia the documentedGET /v1/api-keyendpoint (zero token consumption), surfacing the key name and blocked/disabled state. xAI signals invalid keys as HTTP 400 (invalid-argument), which is now handled. Falls back to/v1/models. Aliases:xai,grok. - Kilo upgraded from informational to telemetry: validates
KILO_API_KEYagainst the Kilo GatewayGET /api/gateway/models(best-effort — the endpoint is documented as no-auth, so only a401reliably rejects a key). - GLM upgraded to live key validation:
GLM_API_KEY/ZHIPU_API_KEYis now probed againstopen.bigmodel.cn/api/paas/v4/models(was a configured-status note). - MiniMax upgraded to live key validation:
MINIMAX_API_KEYis now probed againstapi.minimax.io/v1/models(was a configured-status note). - Kimi host-probing comments updated for the platform rebrand (
platform.moonshot.ai→platform.kimi.aiglobal,platform.moonshot.cn→platform.kimi.comChina; API hosts unchanged). providers/get-provider-healthnow recognizesxai(XAI_API_KEY) andkilo(KILO_API_KEY).
Fixes
- Z.ai (
zai) registered in the UI: the provider was added in 1.4.3 (backend adapter, wrapper, dispatcher) but was never listed in the QML provider selectors, name/icon/accent/console-URL maps, so it was invisible to users. Now selectable in Settings and the dashboard, with its own icon, accent, andz.ai/manage-apikey/billingconsole link. - Stale dashboard URLs refreshed:
kimi/moonshot→platform.kimi.ai/console(rebrand),minimax→ balance page,kilo→app.kilo.ai/credits,kiro→app.kiro.dev/settings/account.
Documentation
docs/providers.mdrewritten: HTML coverage matrix with checkmarks (read-only key check, quota/balance API, subscription plan, PAYG, env var, dashboard, docs source) for all 33 providers, plus detailed per-provider reference sections for the 11 focus providers (Gemini, Cloudflare, Mistral, GLM/Z.ai, NVIDIA, MiniMax, Kimi, Qwen, xAI, Kilo, Kiro) covering base URL, auth, key-check endpoint, quota API, plans, billing/flagship pricing, dashboard, and 2025–2026 changelog highlights.docs/provider-verification.mdreviewed 2026-06-18: added xAI, MiniMax, Kilo, Cloudflare GraphQL analytics surfaces; split quota-vs-auth surfaces; refreshed Kimi/Z.ai/Zhipu entries.README.mdcoverage model expanded and provider count badge bumped to 33.
1.4.3 - 2026-06-18
Features
- New Z.ai provider (
zai): validates API key via the OpenAI-compatibleGET /modelsendpoint (no token consumption). Supports both subscription (GLM Coding Plan) and pay-as-you-go billing modes. SetZAI_API_KEYto enable; falls back toGLM_API_KEY/ZHIPU_API_KEY. Billing visible at z.ai/manage-apikey/billing.
1.4.2 - 2026-06-12
Fixes
- Vertical bar pill no longer overflows: entries show only the percentage, colored by provider accent, while the usage-severity color moves to the new progress-ring pill icon (#4, thanks @arqueon).
providers/get-codex-usagenow reports the real plugin version in the app-serverclientInfopayload (was stuck at 1.4.0).
UI
- Bar pill icon replaced with a live progress ring reflecting the hero provider's usage; pinned providers now take priority as the hero provider (#4, thanks @arqueon).
- The duplicated pill ring canvas was extracted into a shared
PillProgressRingcomponent.
Documentation
- README redesigned: project banner, animated demo (GIF + MP4), refreshed dashboard/expanded-card/telemetry screenshots, DankBar pill capture, feature grid, screenshot gallery, and collapsible validation section (
docs/assets/). docs/README.pt-BR.mdrewritten as a full mirror of the English README (was stuck describing 1.3).screenshot.pngupdated to the current 1.4.1 dashboard (previous capture showed a pre-1.4 layout).
1.4.1 - 2026-06-11
Fixes
- Quota alerts no longer fire repeatedly: notification state is persisted on disk (flock-guarded), so duplicate widget instances (multi-monitor bars), plugin reloads, and shell restarts cannot re-send the same alert inside its quota window (
providers/send-quota-alert). - Fixed
ReferenceError: cardMouse is not defined— the provider card hover state referenced a MouseArea that had lost its id.
Features
- Richer quota notifications: provider-aware title ("quota exhausted" at 100%), body with window label, remaining quota (
displayValue) and reset countdown,criticalurgency at 100%, and daemon-side replacement (notify-send -r+ synchronous hint) so repeats update the existing bubble instead of stacking. - New "Re-alert interval" setting (
notifyCooldownMinutes): 0 alerts once per quota window (default); 60/360/1440 re-alert after that many minutes while usage stays above the threshold. - 9Router telemetry section on the dashboard card: calendar-aligned 7-day cost chart with per-day hover (cost + requests), today/week/month totals, week token in/out, top models by 7-day cost, and routed-provider breakdown (
providers/get-9router-analytics, reads~/.9router/db/data.sqlitewithusage.jsonfallback).
Localization
- Crowdin project synced with the repository: Spanish (
es-ES) and German (de) added as target languages (previously onlypt-BRandzh-CN), sourceen.jsonre-uploaded, and all four local translation bundles pushed.
1.4.0 - 2026-06-11
Features
- Sparkline history points now carry timestamps; hovering shows percent and time per snapshot.
- Burn-rate forecast extended to the Claude 7-day window (warns only when on track to exhaust before reset).
- Per-model cost split: weekly model bars show tokens and estimated cost per family (
WEEK_MODEL_COSTS). - Keyboard navigation on provider cards: Tab focus with ring, Enter/Space expand, Delete remove, P pin, R retry; accessible names/descriptions.
Quality
- CI integration test for the usage-history pipeline: empty-cache contract, sort/group aggregation, and dispatcher snapshot append.
Providers
- Cloudflare: documented Workers AI GraphQL analytics (
aiInferenceAdaptiveGroups) showing 7-day and latest-day requests/neurons whenCLOUDFLARE_ACCOUNT_IDis set, with graceful fallback to the token-verified note card. - OpenRouter: top-models breakdown (30 days,
/api/v1/activity) in the tertiary window, falling back to monthly spend when unavailable.
Settings & i18n
- Configurable usage-history retention (500/2000/10000 snapshots) passed to the dispatcher via
AIOC_HISTORY_MAX. - Per-provider notification threshold overrides (
claude:90,codex:75). - Pin/unpin providers directly from the settings provider rows.
- New Spanish (es_ES) and German (de_DE) locales with full key parity; CI and release workflows now validate all four non-English locales.
- Release checklist added at
docs/release-checklist.md.
1.3.0 - 2026-06-11
Architecture
- Removed the external aggregation executable and its settings, detection, dispatcher arguments, documentation, and diagnostics.
- Added a native Codex adapter using the official
codex app-serverprotocol andaccount/rateLimits/read. - Preserved Copilot quota collection through the authenticated GitHub session without an external aggregator.
- Added provider prerequisite health checks and a truthful coverage model: quota, local analytics, authentication, or informational.
Providers
- Replaced undocumented Cloudflare, Cohere, Fireworks, MiniMax, GLM, and AI21 quota claims with documented authentication checks or explicit informational states.
- Added Ollama
/api/psrunning-model status alongside/api/tags. - Added upstream verification policy and source links in
docs/provider-verification.md.
UI and settings
- Added compact and comfortable dashboard density modes.
- Added provider filtering when more than eight cards are visible.
- Rebuilt settings around provider health, telemetry coverage, informational coverage, and plugin-managed diagnostics.
- Removed obsolete source mode and external-binary path controls.
- Redesigned the popout hero: animated circular progress gauge, status eyebrow with live pulse, badge row, and a stat band (active/attention/engine/last sync) replacing the metric tiles.
- Added status filter chips (All/Live/Issues) with counts above the provider list; the name filter now appears from six providers.
- Provider cards gained an animated expand/collapse, a usage ring around the provider icon, and a rotating chevron.
- Added an indeterminate loading bar at the top of the popout while fetching.
- Redesigned settings: gradient hero with icon tile, version pill, health summary chips, and a re-check health action; section headers with icons and dividers; provider chips animate on hover; selected providers show colored health status pills; diagnostics commands render in monospace.
- Provider cards sort by usage (highest first) with failed providers at the end.
- Claude daily bars show per-day tokens and cost on hover, with animated bar heights.
- Added expand-all/collapse-all toggle next to the provider list header.
- Bar pill entries gained a usage-colored status dot and percent, replacing flat text.
- Diagnostics commands gained a one-click copy button (wl-copy) with confirmation feedback.
Features
- Desktop notifications when a provider crosses a configurable usage threshold (75/85/95%), de-duplicated per reset window.
- Claude 5h burn-rate forecast: warns "At this pace: 100% in Xm" when the window will be exhausted before reset.
- Claude projected month cost tile based on average daily spend; turns red when projecting 1.5× current spend.
- Usage history: the dispatcher records snapshots to
~/.cache/AiOverviewControl/usage-history.jsonl; expanded cards render a sparkline via the newget-usage-historyhelper. - Trend arrows on cards (up/down vs the previous snapshot).
- Pin providers (star) to keep them at the top of the list, persisted in settings.
- "Open console" button on expanded cards deep-links to each provider's usage page.
- Per-provider retry badge on failed cards re-fetches only that provider.
- New "top" pill mode shows only the most critical provider in the bar.
- Top Claude projects of the week (by real session
cwd) with token bars, toggleable via the restoredshowClaudeProjectssetting.
Quality
- Updated CI for the new dispatcher contract, health schema, and a regression check preventing the removed dependency from returning.
- Rebuilt English, Brazilian Portuguese, and Simplified Chinese locale bundles with key parity.
Fixes
- Claude analytics now bucket session timestamps by local day instead of UTC, fixing shifted daily bars and undercounted today cost/tokens in non-UTC timezones.
- Claude pricing now matches single-number model versions (e.g.
claude-fable-5), which previously priced whole families at $0; pricing cache is invalidated via a schema marker. - Claude quota falls back to the last good snapshot on transient API failures (429, 5xx, network) instead of erroring the card; auth failures still surface.
- Claude card shows 5h/7d reset countdowns and an "Extra usage on" badge.
- Provider health checks now recognize dispatcher aliases (
moonshot,zhipu,nim,vertex,ark,modelark,dashscope,alibaba). - Gemini API key moved from the URL query string to the
x-goog-api-keyheader so it no longer leaks via process listings. - DeepSeek balance fields are stringified defensively so numeric API responses cannot break JSON output.
MOONSHOT_API_BASEoverride is now exclusive: no silent fallback to the China host when an explicit base is set.- Messages without a timestamp are excluded from Claude weekly aggregation instead of being miscounted.
- Removed the unused USD→EUR exchange-rate fetch and dead
costCurrency/showClaudeProjectssettings references.
1.2.4 - 2026-05-26
Dashboard — UX
- Added stale-data indicator per provider card: a warning badge appears when the last refresh is older than 2× the configured refresh interval.
- Added
updatedAttimestamp footer on each expanded provider card, with a warning tint when data is stale. - Stale state is detected via a lightweight 10 s tick timer (
staleClock) so cards update reactively without polling every frame. - Stale indicator also surfaces in the popout header detail line ("Stale since {time} · {source}").
Claude Analytics
- Split the "Today" metric tile into two separate tiles: Today tokens and Today cost, so both figures are visible at a glance without truncation.
- Claude card grid now uses a 4-column layout at ≥ 760 px and a 2-column layout at 520–759 px (was: 1 or 3).
Providers — New
- Together AI (
together):GET https://api.together.xyz/v1/creditswithTOGETHER_API_KEY— shows credit balance. - Groq (
groq): key validation via models endpoint; note-card directing to console.groq.com/usage (no public quota API). - Cohere (
cohere):GET https://api.cohere.ai/v1/users/mewithCOHERE_API_KEY— surfacestrial_creditsbalance. - Replicate (
replicate):GET https://api.replicate.com/v1/accountwithREPLICATE_API_TOKEN— confirms auth and surfaces username. - Fireworks AI (
fireworks):GET https://api.fireworks.ai/v1/account/billingwithFIREWORKS_API_KEY— shows credit balance. - AI21 (
ai21):GET https://api.ai21.com/studio/v1/usagewithAI21_API_KEY— shows monthly tokens used/quota window. - Added all 6 providers to
availableProviderOptions,providerName(),iconForProvider(),providerAccent(), andallProvidersin Settings. - Added 6 new stub scripts (
get-together-usage,get-groq-usage,get-cohere-usage,get-replicate-usage,get-fireworks-usage,get-ai21-usage).
Quality
- Expanded
shellcheckCI step to cover allproviders/get-*scripts (previously only the 3 main helpers were checked).
1.2.3 - 2026-05-22
Dashboard — UX
- Multi-provider pill: DankBar indicator now shows up to 3 provider accents when multiple providers are near their limit.
- UI layout fixes: resolved card overflow and misaligned progress bars in narrow popout widths.
- Pill settings: added pill display options (single/multi accent, label visibility) to the Settings panel.
Providers — New
- Warp (
warp): provider note-card. - Qwen / DashScope (
qwen): key validation via DashScope compatible-mode models endpoint; note-card (no public balance API). - Vertex AI (
vertexai):gcloud auth print-access-tokencheck; note-card (no programmatic quota endpoint). - Added all 3 providers to
availableProviderOptions,providerName(),iconForProvider(),providerAccent(), andallProvidersin Settings.
1.2.2 - 2026-05-20
UI/UX
- Translated all user-visible widget strings to Portuguese (status titles, subtitles, metric labels, error messages, button labels, empty states).
- Day-of-week labels in Claude daily bars now use Portuguese abbreviations (Seg/Ter/Qua/Qui/Sex/Sáb/Dom).
- Provider count chip now pluralizes correctly ("1 exibido" vs "2 exibidos").
- "Refresh" button relabeled "Atualizar"; "CLI" button (detect binary) relabeled "Detectar" for clarity.
- "Provider control" section renamed "Gerenciar provedores"; "Add provider" button → "Adicionar".
- Metric tiles renamed: Active→Ativos, Attention→Atenção, Engine→Motor, Account→Conta, Credits→Créditos.
- Claude Code details section: Week→Semana, 5h window label unchanged, Today→Hoje, Month→Mês, "Models this week"→"Modelos esta semana".
pendingProviderIddefault now binds to first entry ofavailableProviderOptionsinstead of hardcoded"gemini".removeProviderfallback when list empties now uses firstavailableProviderOptionsentry instead of hardcoded"9router".- Fixed dynamic path resolution in widget (
getPluginPath(pluginId)with lowercase fallback) so scripts resolve correctly on case-sensitive filesystems regardless of install path. - Redesigned Settings panel: interactive provider chips, live env-var reference table, collapsible sections, diagnostic commands, auth reference, source mode hints, and DankToggle for error visibility.
Providers
- Fixed 9Router displaying as "OpenRouter" in the dashboard (
providerName()mapping corrected to"9router": "9Router"). - Gave 9Router a distinct icon (
"share") and accent color to visually separate it from OpenRouter. - Added
fetch_openrouter_native→ 9Router local DB as silent fallback whenOPENROUTER_API_KEYis unset. - Added 12 new provider adapters in
get-provider-usage:- DeepSeek — balance endpoint (
api.deepseek.com/user/balance), CNY fields. - Kimi (Moonshot) — balance endpoint (
api.moonshot.cn/v1/users/me/balance), CNY fields. - MiniMax — token-plan endpoint (
www.minimax.io/v1/token_plan/remains). - GLM / Zhipu AI — quota endpoint (
bigmodel.cn/api/monitor/usage/quota/limit);GLM_API_BASEoverride. - Mistral — key validation via models endpoint; note-card (no quota API).
- Ollama — local
/api/tagsmodel list;OLLAMA_HOSToverride. - NVIDIA NIM — key validation via models endpoint; note-card (no quota API).
- Cloudflare AI — neurons usage endpoint; requires
CLOUDFLARE_ACCOUNT_ID. - Vertex AI —
gcloudauth check; note-card (no quota API). - BytePlus ModelArk — key validation via models endpoint; note-card (no quota API).
- Qwen / DashScope / Alibaba — key validation via models endpoint; note-card (no quota API).
- DeepSeek — balance endpoint (
- Added 12 new provider entries to
availableProviderOptionsin the QML widget. - Added
providerName,iconForProvider, andproviderAccentmappings for all new providers. - Rewrote
docs/providers.mdwith full 25-provider matrix, auth methods, env vars, and test commands. - Rewrote
docs/architecture.mdto document all fetch functions and updated data flow diagram. - Rewrote
docs/configuration.mdwith env var reference table and per-provider source recommendations. - Rewrote
docs/troubleshooting.mdwith per-provider debugging sections for all new providers. - Rewrote
TODO.mdwith organized categories and current state reflecting v1.2.x.
1.2.1 - 2026-05-08
- Added
9router/OpenRouter-compatible provider handling in the dashboard and provider helper. - Improved provider refresh behavior when provider selection changes.
- Polished provider cards, metric tiles, overview styling, hover states, and displayed provider counts.
- Fixed Claude daily totals to use the current weekday instead of a hard-coded weekday index.
- Fixed the plugin author metadata.
- Added external-helper timeout handling and safer shell interpolation in usage helpers.
- CI: restored
actions/checkout@v6.0.2andsoftprops/action-gh-release@v3.0.0(versões corretas, não existentes antes de 2026). - Release: corrigido
zip -r "$ZIP" -@→zip "$ZIP" -@(flags-re-@são mutuamente exclusivos). - Release: substituídas duas etapas separadas
shogo82148/actions-upload-release-assetpelo parâmetrofiles:nativo dosoftprops/action-gh-release@v3.0.0. - Release:
release_name:corrigido paraname:(parâmetro correto da action). - Release: adicionado
generate_release_notes: truepara notas automáticas a partir do histórico de commits. - CI/Release: adicionados blocos
permissionsmínimos (contents: readecontents: write).
1.2.0 - 2026-04-30
- Added a local
get-provider-usagebackend so AiOverviewControl no longer depends on another DMS plugin for provider aggregation. - Made the provider aggregator optional instead of a hard plugin requirement.
- Added native/fallback provider handling for Claude, Copilot, Gemini, and OpenRouter with structured per-provider errors.
- Improved dashboard responsiveness with adaptive cards, grids, provider controls, and long-text handling.
- Made Show Provider Errors actually filter provider cards when disabled.
- Updated settings copy to describe local helpers, fallback source mode, and optional fallback binary behavior.
- Reworked the user documentation in Portuguese with a shorter README and focused guides under
docs/. - Added practical installation, configuration, provider, troubleshooting, and architecture references.
- Clarified that the plugin is self-contained in
AiOverviewControl.
1.1.3 - 2026-04-29
- Fixed Copilot on Linux by using the authenticated GitHub session directly.
- Added
get-copilot-usage, which uses the authenticated GitHub session to read real Copilot subscription quota data. - Mapped Copilot Premium, Chat, and Completions windows into the same provider-card data model used by the other providers.
- Updated provider-card labels so named quota windows such as Premium and Chat are shown consistently.
1.1.2 - 2026-04-29
- Normalized provider display logic so cards use the same current window, weekly window, account, login, credits, source, and error helpers.
- Fixed inconsistent current-vs-weekly percentage rendering in collapsed provider cards.
- Simplified aggregator error output so unsupported providers show the real provider error instead of raw JSON.
- Added a dashboard provider manager with an Add provider button.
- Added per-card remove controls and a custom provider list field in settings.
1.1.1 - 2026-04-29
- Increased dashboard scale from a compact utility panel to a larger floating control surface.
- Enlarged provider cards, icons, metric tiles, progress bars, and dashboard summary typography.
- Added collapsed-card progress previews so each provider card has useful status at rest.
- Tightened runtime guards for providers that return errors without usage data.
- Removed AiOverviewControl QML warnings caused by rendering account metrics for unsupported providers.
1.1.0 - 2026-04-29
- Reworked the popout into a larger provider dashboard.
- Added foldable provider cards with provider-specific accents.
- Integrated Claude Code usage analytics into AiOverviewControl.
- Added daily activity, model mix, token consumption, and Claude subscription limit details.
- Disabled the separate
claudeCodeUsagewidget locally. - Added project documentation, changelog, and TODO tracking.
1.0.0 - 2026-04-29
- Created AiOverviewControl as a renamed and expanded AI usage widget.
- Added configurable provider sets and source modes.
- Added Linux-friendly
clidefault. - Added partial provider failure handling.