Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
989a9ae
build: update package dependencies
steipete Apr 18, 2026
fb3553d
test: stabilize provider state coverage
steipete Apr 18, 2026
624bdc3
docs: update 0.21 changelog
steipete Apr 18, 2026
9aefd87
docs: update appcast for 0.21
steipete Apr 18, 2026
41288a8
Expand MiniMax Token Plan with multi-model remains and menu sections
cursoragent Apr 18, 2026
ab3b0b0
chore: start 0.22 development
steipete Apr 18, 2026
390a8b9
Handle fnm Gemini OAuth config discovery
Leechael Apr 15, 2026
ad0aada
docs: credit Gemini OAuth discovery fix (#723)
steipete Apr 18, 2026
64f0bac
fix: handle errSecInteractionNotAllowed in KeychainCacheStore to prev…
josepe98 Mar 24, 2026
aa26573
fix: preserve keychain cache after wake (#594)
steipete Apr 18, 2026
cad7f83
Prefer verification_uri_complete for Copilot login
skhe Apr 18, 2026
d968dd9
docs: credit Copilot verification URL fix (#739)
steipete Apr 18, 2026
ce27570
fix(alibaba): update China mainland RPC endpoint to bailian-cs.consol…
hezhongtang Apr 13, 2026
aae3003
docs: credit Alibaba endpoint fix (#712)
steipete Apr 18, 2026
ea02e5f
Handle Synthetic rolling, weekly, and search quota shape
baanish Apr 17, 2026
f67bfda
Show Synthetic rolling regen detail
baanish Apr 17, 2026
45f040f
Parse Synthetic tickPercent for rolling regen detail
baanish Apr 18, 2026
5a1c06e
docs: credit Synthetic quota response fix (#732)
steipete Apr 18, 2026
59d22ab
Fix Antigravity probe failures caused by URLSession delegate signatur…
Apr 16, 2026
2be8ae2
docs: credit Antigravity probe fix (#727)
steipete Apr 18, 2026
1f3d5bd
Fix preferences sidebar clipping and window sizing on macOS Tahoe
chadneal Mar 20, 2026
ffe7ed0
Fix lint: wrap long line to stay within 120-char max width
chadneal Mar 20, 2026
f10ab99
fix: polish Tahoe settings landing (#580)
steipete Apr 18, 2026
2f7a675
fix(app-group): migrate to team-prefixed shared container
ngutman Apr 12, 2026
c317e89
fix: migrate app group shared defaults
steipete Apr 18, 2026
835caaa
checkpoint before checking out cursor/minimax-multi-model-usage-ef73
cskeleton Apr 19, 2026
bfa422b
Add MiniMax Token Plan API usage and collapsible scrolled UI
cskeleton Apr 19, 2026
73b4151
Merge upstream/main into cursor/minimax-multi-model-usage-ef73
cskeleton Apr 19, 2026
26d7044
Fix post-merge test isolation and MenuCardView file length
cskeleton Apr 19, 2026
f952a43
Fix MiniMax detail line when interval usage count is omitted
cskeleton Apr 19, 2026
32fc946
Stop tracking Cursor hook state and SpecStory local files
cskeleton Apr 19, 2026
2bea4f0
Fix OpenAI web dashboard handoff
ratulsarna Apr 19, 2026
1f58bb8
docs: update changelog with OpenAI web dashboard fix
ratulsarna Apr 19, 2026
94d20eb
feat: add menu keyboard shortcuts
anirudhvee Apr 18, 2026
3124299
chore: update changelog with new features and fixes for the upcoming …
ratulsarna Apr 20, 2026
8736b0a
Preserve keychain cache on temporary lock
ratulsarna Apr 20, 2026
d9c82bf
docs: finalize changelog for 0.22
steipete Apr 20, 2026
afe15bd
build: bump 0.22 build number
steipete Apr 20, 2026
cd5899a
docs: update appcast for 0.22
steipete Apr 21, 2026
532d019
test: isolate Gemini fnm CLI fixture
steipete Apr 21, 2026
a7d81d3
fix: report CLI version from app bundle
steipete Apr 21, 2026
e44161f
chore: start 0.23 development
steipete Apr 21, 2026
d640a0f
fix: clean up cached CLI probe processes
steipete Apr 21, 2026
d4cb967
Fix widget App Intents packaging
vincentyangch Apr 21, 2026
592cfd5
fix(widget): use app intent parameter defaults
ngutman Apr 22, 2026
88dee3c
docs(changelog): credit widget metadata fix
ngutman Apr 22, 2026
06e732e
Add Claude Design and Routines usage bars (#740)
AISupplyGuy Apr 22, 2026
a5100c3
fix(ui): align menu width (#784)
ngutman Apr 23, 2026
c6bde6c
docs(changelog): note menu width alignment fixes
ngutman Apr 23, 2026
e7d270b
Copilot Provider Update
amoranio Feb 13, 2026
d8207f2
Clarify Copilot device code hint
ratulsarna Apr 23, 2026
73a5b8f
Update changelog for Claude bars and widget packaging
ratulsarna Apr 23, 2026
8de2201
Merge branch 'codex/pr-369-audit'
ratulsarna Apr 23, 2026
dab7f79
Add weekly reset confetti overlay (#785)
zats Apr 24, 2026
8c0a2c8
Isolate weekly reset notification tests
ratulsarna Apr 24, 2026
4ae0c3b
Update changelog to include opt-in confetti celebration for weekly li…
ratulsarna Apr 24, 2026
a6b0342
Add Cursor extra usage menu bar metric
ratulsarna Apr 24, 2026
b75e169
Update changelog to include Cursor extra usage menu bar metric (#789).
ratulsarna Apr 24, 2026
47a4776
feat: add Mistral AI as a new provider (#607)
welcoMattic Apr 24, 2026
a1dfe54
Update CHANGELOG to include Mistral provider support with monthly spe…
ratulsarna Apr 24, 2026
bb6fcab
Add GPT-5.5 pricing
ratulsarna Apr 25, 2026
00184ea
Fix duplicate utilization session tabs
ratulsarna Apr 25, 2026
d411a8e
Merge upstream/main locally and fix MiniMax docs front matter
cskeleton Apr 25, 2026
3f5c120
Fix menu height shrink after MiniMax section collapse
cskeleton Apr 25, 2026
f4e08c6
Handle unknown MiniMax usage percent and prevent overview tap bleed.
cskeleton Apr 25, 2026
b2ad132
Harden MiniMax row identity and menu screen height sizing.
cskeleton Apr 25, 2026
4fa0330
Keep MiniMax identifiers stable and only suffix duplicates.
cskeleton Apr 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ debug_*.swift
# Misc
.DS_Store
.vscode/

# Cursor / SpecStory local state (never commit)
.cursor/hooks/state/
.specstory/
.codex/environments/
.swiftpm-cache/

Expand Down
8 changes: 8 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,11 @@
- Keep provider data siloed: when rendering usage or account info for a provider (Claude vs Codex), never display identity/plan fields sourced from a different provider.***
- Claude CLI status line is custom + user-configurable; never rely on it for usage parsing.
- Cookie imports: default Chrome-only when possible to avoid other browser prompts; override via browser list when needed.

## Learned User Preferences
- When extending provider usage models (e.g. MiniMax), mirror existing field and UI patterns; add new fields using the same conventions as neighboring code.

## Learned Workspace Facts
- MiniMax Coding Plan `model_remains` weekly fields may arrive as both zeros, or with only one of `current_weekly_total_count` / `current_weekly_usage_count` present and zero. CodexBar treats “at least one weekly key present and both sides numerically zero when missing counts as zero” as no weekly cap. Interval window lines that are 0/0 placeholders are suppressed in the menu card so they are not mistaken for weekly limits.
- `swift build -c release` only refreshes the `.build/.../CodexBar` binary. The launchable root `CodexBar.app` is recreated by `Scripts/package_app.sh` or `Scripts/compile_and_run.sh`; if UI behavior looks stale, compare the bundle `CodexGitCommit` in `Contents/Info.plist` with `git rev-parse --short HEAD`.
- MiniMax menu usage is rendered inside one hosted `NSMenuItem`, so height limiting, scrolling, and section collapsing must happen inside that card to keep the bottom app-level menu items visible. Current MiniMax behavior: collapse state is keyed by section title, 5+ row sections default to collapsed, and Preferences mirrors the sections with scrolling only (no collapse).
65 changes: 53 additions & 12 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,36 +1,77 @@
# Changelog

## 0.21 — Unreleased
## 0.23 — Unreleased

### Changes
- Claude: show Designs and Daily Routines usage bars from live Claude OAuth/Web quota data, and restore the Web-mode Sonnet bar (#740). Thanks @AISupplyGuy!
- Codex: add GPT-5.5 and GPT-5.5 Pro pricing so local cost scanning recognizes the new models.
- Cursor: add an Extra usage menu bar metric for on-demand budgets (#789). Thanks @huiye98!
- Mistral: add provider support with monthly spend tracking, browser-cookie import, manual cookies, and CLI/token-account support (#607). Thanks @welcoMattic!
- Usage: add an opt-in confetti celebration when weekly limits reset after active use (#785). Thanks @zats!

### Fixes
- Codex: ignore invalid zero-minute subscription history so the utilization submenu no longer shows duplicate Session tabs.
- Codex: clean up cached CLI status probes during app shutdown so `codex -s read-only` workers are not orphaned after restart.
- Menu: keep merged-menu cards, switcher rows, wrapped status text, and hosted chart submenus aligned with the real AppKit menu width so menus no longer grow oversized or show narrower chart submenus after width changes. Thanks @ngutman!
- Widgets: package App Intents metadata for the widget extension and use configuration defaults so configurable widgets load correctly in WidgetKit (#783). Thanks @ngutman and @vincentyangch!

## 0.22 — 2026-04-21

### Highlights
- Codex: restore OpenAI web dashboard fetching on the new analytics route and tighten hidden WebView reuse/expiry.
- Synthetic: parse live quota payloads for five-hour, weekly, and search limits, including continuous reset/regeneration details (#732). Thanks @baanish!
- Antigravity: restore account/quota probing across newer localhost endpoint/token layouts and retry paths (#727). Thanks @icey-zhang!
- Menu: add standard shortcuts for Refresh, Settings, and Quit while the status menu is open (#737). Thanks @anirudhvee!
- Widgets: migrate app-group sharing to the Team-ID-prefixed container and carry widget state across the move (#701). Thanks @ngutman!

### Providers & Usage
- Synthetic: parse live five-hour, weekly, and search quota payloads, including continuous reset/regeneration details (#732). Thanks @baanish!
- Antigravity: restore localhost probing with async TLS challenge handling, extension-token fallback, and best-effort port selection (#727). Thanks @icey-zhang!
- Gemini: discover OAuth config in fnm/Homebrew/bundled CLI layouts so expired-token refresh keeps working (#723). Thanks @Leechael!
- Copilot: open the complete device-login verification URL when available so the browser flow carries the user code (#739). Thanks @skhe!
- Alibaba: update the China mainland Coding Plan endpoint and browser-cookie domain while keeping older domains as fallbacks (#712). Thanks @hezhongtang!
- Codex: restore OpenAI web dashboard fetching on the new analytics route and tighten hidden WebView reuse/expiry. @ratulsarna

### Menu & Settings
- Menu: show and handle standard shortcuts for Refresh (⌘R), Settings (⌘,), and Quit (⌘Q) while the status menu is open (#737). Thanks @anirudhvee!
- Widgets: migrate app-group sharing to the Team-ID-prefixed container and carry widget state across the move (#701). Thanks @ngutman!
- Settings: fix provider-sidebar clipping on macOS Tahoe and resize the Preferences window when switching tabs (#580). Thanks @chadneal!

### Fixes
- Keychain cache: preserve cached credentials when macOS temporarily denies keychain UI after wake, avoiding repeated prompts (#594). Thanks @josepe98!

## 0.21 — 2026-04-18

### Highlights
- Abacus AI: add a new provider for ChatLLM and RouteLLM credit tracking with browser-cookie import, manual-cookie support, and monthly pace rendering. Thanks @ChrisGVE!
- Cursor: fix a crash in the usage fetch path and add regression coverage (#663). Thanks @anirudhvee for the report and validation!
- z.ai: preserve weekly and 5-hour token quotas together, surface the 5-hour lane correctly across the menu/menu bar, and add regression coverage (#662). Thanks to @takumi3488 for the original fix and investigation.
- Claude: add Opus 4.7 pricing so local cost scanning and cost breakdowns recognize the new model. Thanks @knivram!
- Codex: recognize the new Pro $100 plan in OAuth, OpenAI web, menu, and CLI rendering, and preserve CLI fallback when partial OAuth payloads lose the 5-hour session lane (#691, #709). Thanks @ImLukeF!
- Codex: make OpenAI web extras opt-in for fresh installs, preserve working legacy setups on upgrade, add an OpenAI web battery-saver toggle, and keep account-scoped dashboard state aligned during refreshes and account switches (#529). Thanks @cbrane!
- Codex: fix local cost scanner overcounting and cross-day undercounting across forked sessions, cold-cache refreshes, and sessions-root changes (#698). Thanks @xx205!
- Codex: add Microsoft Edge as a browser-cookie import option for the Codex provider while preserving the contributor-branch workflow from the original PR (#694). Thanks @Astro-Han!
- z.ai: preserve weekly and 5-hour token quotas together, surface the 5-hour lane correctly across the menu/menu bar, and add regression coverage (#662). Thanks to @takumi3488 for the original fix and investigation.
- Cursor: fix a crash in the usage fetch path and add regression coverage (#663). Thanks @anirudhvee for the report and validation!
- Antigravity: restore account and quota probing across newer localhost endpoint/token layouts and API-level retry failures (#693, fixes #692). Thanks @anirudhvee!
- Menu bar: fix missing icons on affected macOS 26 systems by avoiding RenderBox-triggering SwiftUI effects (#677). Thanks @andrzejchm!
- Battery / refresh: cut menu redraw churn, skip background work for unavailable providers, and reuse cached OpenAI web views more efficiently (#708).
- Codex: make OpenAI web extras opt-in for fresh installs, preserve working legacy setups on upgrade, add an OpenAI web battery-saver toggle, and keep account-scoped dashboard state aligned during refreshes and account switches (#529). Thanks @cbrane!
- Claude: add Opus 4.7 pricing so local cost scanning and cost breakdowns recognize the new model. Thanks @knivram!
- Codex: add Microsoft Edge as a browser-cookie import option for the Codex provider while preserving the contributor-branch workflow from the original PR (#694). Thanks @Astro-Han!

### Providers & Usage
- Abacus AI: add provider support for ChatLLM and RouteLLM monthly compute-credit tracking with cookie import, manual cookie headers, timeout/browser-detection threading, optional billing fallback, and hardened cached-session retry behavior. Thanks @ChrisGVE!
- Codex: render the new Pro $100 plan consistently across OAuth, OpenAI web, menu, and CLI surfaces, tolerate newer Codex OAuth payload variants like `prolite`, and only fall back to the CLI in auto mode when OAuth decode damage actually drops the session lane (#691, #709).
- Codex: make OpenAI web extras opt-in by default, preserve legacy implicit-auto cookie setups during upgrade inference, add battery-saver gating for non-forced dashboard refreshes, and preserve provider/dashboard state for enabled providers that are temporarily unavailable.
- Cost: tighten the local Codex cost scanner around fork inheritance, cold-cache discovery, incremental parsing, and sessions-root changes so replayed sessions no longer overcount or slip usage across day boundaries (#698). Thanks @xx205!
- z.ai: preserve both weekly and 5-hour token quotas, keep the existing 2-limit behavior unchanged, and render the 5-hour quota as a tertiary row in provider snapshots and CLI/menu cards (#662). Credit to @takumi3488 for the original fix and investigation.
- Cursor: fix the usage fetch path so failed or cancelled requests no longer crash, and add Linux build and regression test coverage fixes (#663).
- Claude: add Opus 4.7 pricing so local cost usage and breakdowns price the new model correctly. Thanks @knivram!
- Antigravity: scope insecure localhost trust handling to `127.0.0.1` / `localhost`, keep localhost requests cancellable, and restore local quota/account probing on builds that previously failed TLS challenge handling (#693, fixes #692). Thanks @anirudhvee!
- Antigravity: try both language-server and extension-server endpoint/token combinations, retry after API-level errors, scope insecure localhost trust handling to loopback hosts, and restore local quota/account probing on newer Antigravity builds (#693, fixes #692). Thanks @anirudhvee!
- Antigravity: prefer `userTier.name` over generic plan info when rendering the account plan so Google AI Ultra and similar tiers show their real subscription name, while still falling back cleanly when the tier label is absent or blank (#303). Thanks @zacklavin11!
- Codex: render the new Pro $100 plan consistently across OAuth, OpenAI web, menu, and CLI surfaces, tolerate newer Codex OAuth payload variants like `prolite`, and only fall back to the CLI in auto mode when OAuth decode damage actually drops the session lane (#691, #709).
- Ollama: recognize `__Secure-session` cookies during manual cookie entry and browser-cookie import so authenticated usage fetching continues to work with the newer cookie name (#707). Thanks @anirudhvee!
- OpenCode: enable weekly pace visualization for the app and CLI so weekly bars show reserve percentage, expected-usage markers, and "Lasts until reset" details like Codex and Claude (#639). Thanks @Zachary!
- Cost: tighten the local Codex cost scanner around fork inheritance, cold-cache discovery, incremental parsing, and sessions-root changes so replayed sessions no longer overcount or slip usage across day boundaries (#698). Thanks @xx205!
- Refresh pipeline: skip background work for unavailable providers, clear stale cached state, and show explicit unavailable messages (#708).
- Claude: broaden CLI binary lookup to native installer paths (#731). Thanks @dingtang2008!
- Codex: support Microsoft Edge in browser-cookie import for the Codex provider while keeping the contributor branch untouched in the superseding integration path (#694). Thanks @Astro-Han!
- OpenCode / OpenCode Go: treat serialized `_server` auth/account-context failures as invalid credentials so cached browser cookies are cleared and retried instead of surfacing a misleading HTTP 500.
- Codex: make OpenAI web extras opt-in by default, preserve legacy implicit-auto cookie setups during upgrade inference, add battery-saver gating for non-forced dashboard refreshes, and preserve provider/dashboard state for enabled providers that are temporarily unavailable.
- OpenAI web: keep cached WebViews across same-account refreshes and clean them up only when accounts or providers go stale (#708).
- Claude: add Opus 4.7 pricing so local cost usage and breakdowns price the new model correctly. Thanks @knivram!
- Claude: broaden CLI binary lookup to native installer paths (#731). Thanks @dingtang2008!

### Menu & Settings
- Menu bar: fix missing icons on affected macOS 26 systems by replacing RenderBox-triggering material/offscreen SwiftUI effects in the provider sidebar and highlighted progress bar (#677). Thanks @andrzejchm!
Expand Down
18 changes: 13 additions & 5 deletions Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 4 additions & 2 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,12 @@ let package = Package(
.macOS(.v14),
],
dependencies: [
.package(url: "https://github.com/sparkle-project/Sparkle", from: "2.8.1"),
.package(url: "https://github.com/sparkle-project/Sparkle", from: "2.9.1"),
.package(url: "https://github.com/steipete/Commander", from: "0.2.1"),
.package(url: "https://github.com/apple/swift-log", from: "1.9.1"),
.package(url: "https://github.com/apple/swift-log", from: "1.12.0"),
.package(url: "https://github.com/apple/swift-syntax", from: "600.0.1"),
.package(url: "https://github.com/sindresorhus/KeyboardShortcuts", from: "2.4.0"),
.package(url: "https://github.com/zats/Vortex", revision: "ef5392088d4aeb255c4eee83157dbdafcd31bf07"),
sweetCookieKitDependency,
],
targets: {
Expand Down Expand Up @@ -82,6 +83,7 @@ let package = Package(
dependencies: [
.product(name: "Sparkle", package: "Sparkle"),
.product(name: "KeyboardShortcuts", package: "KeyboardShortcuts"),
.product(name: "Vortex", package: "Vortex"),
"CodexBarMacroSupport",
"CodexBarCore",
],
Expand Down
28 changes: 28 additions & 0 deletions Scripts/compile_and_run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,33 @@ delete_keychain_service_items() {
done
}

# Ensure Swift >= 5.5 (required for --arch flag in swift build)
ensure_swift_version() {
local swift_output
local swift_ver
swift_output=$(swift --version 2>&1 || true)
if [[ "$swift_output" =~ (Apple[[:space:]]+)?Swift[[:space:]]+version[[:space:]]+([0-9]+)\.([0-9]+)(\.[0-9]+)? ]]; then
swift_ver="${BASH_REMATCH[2]}.${BASH_REMATCH[3]}${BASH_REMATCH[4]}"
else
fail "Swift >= 5.5 required (found ${swift_output:-none}). Install Xcode or update swiftly."
fi
local major minor
major=$(echo "$swift_ver" | cut -d. -f1)
minor=$(echo "$swift_ver" | cut -d. -f2)
if [[ "${major:-0}" -ge 6 ]] || { [[ "${major:-0}" -eq 5 ]] && [[ "${minor:-0}" -ge 5 ]]; }; then
return 0
fi
# Try Xcode toolchain
local xcrun_swift
xcrun_swift=$(xcrun --find swift 2>/dev/null || true)
if [[ -n "$xcrun_swift" && -x "$xcrun_swift" ]]; then
log "WARN: PATH swift is v${swift_ver}; switching to Xcode toolchain at $(dirname "$xcrun_swift")"
export PATH="$(dirname "$xcrun_swift"):$PATH"
return 0
fi
fail "Swift >= 5.5 required (found ${swift_ver:-none}). Install Xcode or update swiftly."
}

has_signing_identity() {
local identity="${1:-}"
if [[ -z "${identity}" ]]; then
Expand Down Expand Up @@ -173,6 +200,7 @@ for arg in "$@"; do
esac
done

ensure_swift_version
resolve_signing_mode
if [[ "${CLEAR_ADHOC_KEYCHAIN}" == "1" && "${SIGNING_MODE}" != "adhoc" ]]; then
fail "--clear-adhoc-keychain is only supported when using adhoc signing."
Expand Down
Loading