Skip to content

Provider switcher: compact multi-row layout - #1

Closed
Yuxin-Qiao wants to merge 129 commits into
mainfrom
issue-1082-compact-provider-switcher
Closed

Provider switcher: compact multi-row layout#1
Yuxin-Qiao wants to merge 129 commits into
mainfrom
issue-1082-compact-provider-switcher

Conversation

@Yuxin-Qiao

Copy link
Copy Markdown
Owner

Fixes/follows up steipete#1082.

Summary:

  • Reduces vertical crowding in the merged provider switcher when many providers are enabled.
  • Adds compact row heights only for stacked multi-row layouts:
    • 3 rows: 40pt → 36pt
    • 4+ rows: 40pt → 34pt
  • Keeps single-row and two-row behavior unchanged.
  • Does not add NSScrollView.
  • Does not change hitTest, acceptsFirstMouse, mouseDown, or mouseUp.
  • Preserves provider ordering and click behavior.
  • UI-only: no provider fetching, billing, quota, parsing, ProviderCostSnapshot, or usage snapshot changes.

Validation:

  • swift test --filter StatusMenuSwitcher
  • swift test --filter MenuCard
  • make check
  • git diff --check

steipete and others added 30 commits May 16, 2026 11:10
* fix(grok): treat expired credentials as missing in fetch

Follow-up to the Codex P1 review on steipete#965 (`cbd30a4e`).

Grok session tokens expire after ~7 days. The auth-error suppression in
`GrokStatusProbe.fetch` previously only checked `credentials == nil`, so
an `auth.json` whose `expires_at` was already in the past still counted
as "renderable" and masked the RPC auth failure. The probe would return
a successful snapshot carrying stale identity and no `grok login` hint
while billing silently 401s — users had to inspect logs to figure out
they were logged out.

Treat expired records the same as missing credentials when deciding
whether to swallow the RPC error, and drop them from the rendered
snapshot so the UI doesn't surface a stale email/team for an inactive
session. Adds a unit test covering past/future/missing `expires_at`.

* test(grok): include grok in SettingsStoreTests provider-order fixture

CI on steipete#976 surfaced a hardcoded provider-order list in
SettingsStoreTests.swift:1161 that wasn't updated when grok was added
in steipete#965. The Grok-only test filter I ran locally before steipete#965 skipped
this file, so the breakage only became visible on the next post-merge
CI run.

Append .grok to the expected ordering so the suite passes. All 2565
tests pass under Xcode 26.5 (51 in CodexBarTests + plenty more).

* fix: preserve Grok identity after refreshed billing

* style: format Grok auth regression

---------

Co-authored-by: taibaran <taibaran@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
* test: stabilize status menu switcher refresh

* test: prevent switcher refresh detection race
* Block cross-host redirects for OpenCode Go

* fix: compile OpenCode Go redirect session

* test: cover OpenCode Go redirect guard

* docs: add OpenCode Go redirect guard changelog

---------

Co-authored-by: Pavlo Barzdun <50662594+pavbar@users.noreply.github.com>
Co-authored-by: pavbar <pavlo@barzdun.com>
Co-authored-by: pavbar <pavlo@barzdun.com>
Co-authored-by: Brandon Charleson <b.charleson1@gmail.com>
…with weekly text window (steipete#970)

* MiniMax: fix remains-to-used quota mapping and add quota-style usage cards

* MiniMax: address quota window badge and weekly range review

* fix: polish MiniMax quota cards

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: lengmiao <peilinhana@gmail.com>
Refs steipete#989.

Co-authored-by: pasan <pasangimhanaofficial@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Sergey Lavrentev <slavrentev@gradoservice.ru>
Adds a README pointer to the codexbar-waybar companion project for Linux desktop integration.\n\nVerified target repo exists and is active.
Add Kiro overage credit/cost parsing and exhausted-plan menu bar display modes.\n\nThanks @raflyazf for the contribution.\n\nVerification:\n- swift test --filter KiroStatusProbeTests --filter StatusItemBalanceDisplayTests --filter MenuCardModelTests\n- swift test --filter StatusItemBalanceDisplayTests\n- make check\n- codex-review --mode branch --base origin/main
Include the triggering account in quota-warning notification copy when personal info is visible.

Thanks @raflyazf for the contribution.

Verification:
- swift test --filter QuotaWarningNotificationLogicTests --filter UsageStoreSessionQuotaTransitionTests
- swift test
- make check
- codex-review --mode branch --base origin/main
Route app-owned provider HTTP calls through a shared transport seam and replace process-global URLProtocol tests with injected transport coverage.

Thanks @serezha93 for the contribution.

Verification:
- swift build
- swift test --filter CopilotUsageFetcherTests
- swift test --filter GoogleWorkspaceStatusNetworkTests
- swift test --filter ProviderHTTPClientTests
- make check
- swift test
- codex-review --mode branch --base origin/main

Co-authored-by: Sergey Fomintsev <sfomintsev@gmail.com>
Co-authored-by: Christopher Pellicci <chris@czjzpz.xyz>
steipete and others added 24 commits May 22, 2026 01:03
Adds regression coverage for Kimi icon progress rendering when only the primary quota window is present.\n\nCo-authored-by: Yuxin Qiao <104957188+Yuxin-Qiao@users.noreply.github.com>
Surfaces OpenCode and OpenCode Go workspace renewal timestamps as a provider-local Renews rate window.\n\nCo-authored-by: Yuxin Qiao <104957188+Yuxin-Qiao@users.noreply.github.com>
* UsageStore: preserve snapshots for more network failures

* refactor: scope network snapshot preservation helper

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
* Add Alibaba Token Plan provider

* Clean up Alibaba token plan support

* Fix Alibaba token plan review feedback

* test: scope Alibaba token plan URL protocol stub

* fix: classify Alibaba token plan login pages

* fix: keep Alibaba token plan redirect cookies scoped

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
* i18n: improve Simplified Chinese localization

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* fix: drop stale Chinese peak-hour strings

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Fixes steipete#1096 — Weekly Progress Bar configurable to segment in number of work days.

- Add a Display preference for weekly progress work-day segmentation:
  Off / 4 days / 5 days / 7 days
- Draw display-only day-boundary tick marks on weekly usage bars
- Keep the default Off / nil so existing users see no UI change
- Merge work-day markers with existing quota warning markers
- No warning/alert behavior added; future warnings remain out of scope for this PR

Validation:
- swift test --filter MenuCardQuotaWarningMarkerTests
- swift test --filter SettingsStoreCoverageTests
- swift test --filter MenuCardModelTests
- make check
Fixes/follows up steipete#1082.

Summary:
- Reduces vertical crowding in the merged provider switcher when many providers are enabled.
- Adds compact row heights only for stacked multi-row layouts:
  - 3 rows: 40pt → 36pt
  - 4+ rows: 40pt → 34pt
- Keeps single-row and two-row behavior unchanged.
- Does not add NSScrollView.
- Does not change hitTest, acceptsFirstMouse, mouseDown, or mouseUp.
- Preserves provider ordering and click behavior.
- UI-only: no provider fetching, billing, quota, parsing, ProviderCostSnapshot, or usage snapshot changes.

Validation:
- swift test --filter StatusMenuSwitcher
- swift test --filter MenuCard
- make check
- git diff --check
@Yuxin-Qiao Yuxin-Qiao closed this Jun 17, 2026
steipete pushed a commit that referenced this pull request Aug 14, 2026
)

* fix: gate CLI background usage fetch on confirmed-absent OAuth creds

Add directCredentialIsMissingOverride TaskLocal for deterministic testing
and thread an oauthCredentialsConfirmedAbsent check into
ClaudeCLIBackgroundAvailability.allowsBackgroundAutoUsageFetch so the CLI
background fallback only proceeds when direct OAuth credentials are
confirmed absent.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HqBGFKF9M8etkRpgz2bk2Z

* fix: honor CLI background revocation before the OAuth absence fallback

allowsBackgroundAutoUsageFetch's deadlock-breaker only checked
isEstablished(), which drops a marker as soon as it's revoked by a
failed foreground fetch. That let the OAuth-absence probe re-permit
a background CLI usage attempt on every tick after a failure,
defeating the existing revocation/backoff guarantee. Check
isRevoked() before falling through to oauthCredentialsConfirmedAbsent
so a revoked marker stays denied until the next foreground success.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HqBGFKF9M8etkRpgz2bk2Z

* fix: require an identified profile before the OAuth absence fallback

allowsBackgroundAutoUsageFetch's deadlock-breaker could still fire for
a profile ClaudeAccountProfile.identifiedSessionScope can't identify
(missing/malformed/unreadable account config), since isEstablished and
the round-1 isRevoked check both silently return false when
captureMarker is nil. That let a background CLI fetch launch with no
stable account binding, and a failed attempt could never be recorded
as a revocation (revoke() needs a marker), so nothing would bound
repeated launches. Require a non-nil marker before consulting
oauthCredentialsConfirmedAbsent, matching the fail-closed contract
identifiedSessionScope already documents for background work.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HqBGFKF9M8etkRpgz2bk2Z

---------

Co-authored-by: axisrow <axisrow@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Yuxin-Qiao added a commit that referenced this pull request Aug 20, 2026
Task group completion order was appended directly to inputs, but providerRows uses input offset as tie-breaker for equal/unknown totals, so out-of-order completions reordered Codex · #1/#2 rows. Carry request index and sort results before appending, with compact formatting to keep file_length under warning.

Fixes ClawSweeper P2 for steipete#3105.
Yuxin-Qiao added a commit that referenced this pull request Aug 21, 2026
Task group completion order was appended directly to inputs, but providerRows uses input offset as tie-breaker for equal/unknown totals, so out-of-order completions reordered Codex · #1/#2 rows. Carry request index and sort results before appending, with compact formatting to keep file_length under warning.

Fixes ClawSweeper P2 for steipete#3105.
Yuxin-Qiao added a commit that referenced this pull request Aug 21, 2026
* perf(spend): parallelize loads and memoize model build

- Parallelize independent provider refreshes in makeRequest via
  TaskGroup (was sequential 400ms-6s additive).
- Parallelize Codex multi-account loads in SpendDashboardSource.load
  via ThrowingTaskGroup (was sequential 2s×N).
- Memoize SpendDashboardModel: cache CurrencyExchange conversion per
  currency pair, hoist bounds once per build, and reuse static
  utcCalendar for Mistral/OpenRouter bucket (was new calendar per
  entry, 2920× per build).

Evidence:
- SpendDashboardController.swift:237 parallel baselines
- SpendDashboardController.swift:433 parallel codex
- SpendDashboardModel.swift:300 conversionCache + bounds hoist
- SpendDashboardModel.swift:1069 utcCalendar reuse

Before: 全部 3-10s empty → 2-3s; build 40ms → 8ms.
After: TaskGroup wall-time = slowest provider, model build cached.

* fix(spend): restore Codex account order after parallel load

Task group completion order was appended directly to inputs, but providerRows uses input offset as tie-breaker for equal/unknown totals, so out-of-order completions reordered Codex · #1/#2 rows. Carry request index and sort results before appending, with compact formatting to keep file_length under warning.

Fixes ClawSweeper P2 for steipete#3105.

* test(spend): add out-of-order Codex concurrent order regression

Verifies that parallel Codex loads restore configured request order even when second account's snapshot completes first. Equal totals make completion order visible via providerRows tie-breaker, so without sorting the rows would reorder.

Covers ClawSweeper P2 for steipete#3105 and serves as needs-proof evidence.

* test: update gatekeeper anchors after rebase to 54.0

* fix(spend): repair parallel load CI - file_length and escaping captures

* fix(spend): debounce frequent refresh and throttle date window rebuilds

- 250ms debounce for withObservationTracking and token publication bursts
- 30s throttle for refreshDateWindow same-day revisits
- display-only fast path to avoid Codex scan for filter/currency changes
- update gatekeeper anchors for line shifts

* Improve Antigravity retrieval: retired Flash alias and offline fallback

- Map retired Flash wire ids (3.6/3.5/3-flash-agent) to 3.7-flash via canonicalModelID (opencodex RETIRED_FLASH_TIERS lesson), humanize via canonical, dedup collapsed windows by lowest remaining
- Add AntigravityOfflineStore counting ~/.gemini/antigravity-cli/conversations/*.db (GEMINI_CLI_HOME override) with tokscale cache fallback, and AntigravityOfflineFetchStrategy as terminal offline probe in auto/cli pipelines
- Cover with AntigravityModelLabelTests retired alias cases and AntigravityOfflineStoreTests (db/cache/count)

* fix(gate): add missing provider-specific markers and sync anchors

- add // Provider-specific by design for OpenCodex enrichment and token publication sync
- sync gate anchors after debounce/throttle line shifts

* fix(lint): wrap long provider-specific comment

* Fix provider architecture gatekeeper for Antigravity offline and retired alias

- Move CLI home marker to before gemini literal and update SpendDashboard marker to avoid flagging its own reason
- Add marker before family() and update suppressed anchors to 748/751/754/757
- Allowlist offline gemini, family cluster, and UsageStore codex constructs

* test: include offline strategy in antigravity pipeline expectations

* fix(gate): sync remaining anchors and add missing markers

* chore: trigger CI

* fix(spend): make debounce instant for testing

* fix(gate): update anchors after merge with main

* fix(lint): break long delay line

* fix(gate): drop stale codex anchor absorbed by sourceRevisions cluster
Yuxin-Qiao added a commit that referenced this pull request Aug 22, 2026
* Fix menu bar layout editor drag-and-drop

Layout editor chips were Buttons with .draggable attached. On macOS the
button's gesture recognizer claims the mouse-down, so no drag session ever
starts: reordering and the trash drop zone were unreachable by mouse and the
Delete key was the only way to remove a token. Moving .draggable onto the
button label does not help, because the button still owns the gesture.

Replace the chips with a plain draggable view that keeps click selection,
keyboard activation, and accessibility, and make the trash zone a click
target for the selected token as well.

* Fix Codex CLI approval policy (steipete#3118)

* docs: credit steipete#3118 changelog entry

* fix(commandcode): Add support for individual-pro-v1 plan ($80/mo credits) (steipete#3116)

* fix(commandcode): Add support for individual-pro-v1 plan ($80/mo credits)

Command Code's updated Pro tier ($20/mo → $80 credits) ships as
individual-pro-v1 (legacy individual-pro remains $30). The new planId
hit the hard unknownPlan throw in CommandCodeUsageFetcher, surfaced as
'Unknown Command Code plan: individual-pro-v1'.

Add the versioned plan to CommandCodePlanCatalog (verified against
live frontend bundle assets/constants-B6rERLKd.js and pricing docs).
Pro pricing now: $20 → $80 (docs/resources/pricing-limits), legacy
Pro kept for backwards compat.

* test(commandcode): Cover individual-pro-v1 plan resolution

Regression coverage for the $80 Pro v1 tier: an active subscription
with planId individual-pro-v1 must resolve through
CommandCodePlanCatalog instead of hitting the unknownPlan throw, and
the catalog check now pins pro-v1 at 80 credits.

* fix(alibaba): tolerate the Personal usage gateway's empty-Success responses (steipete#3128)

Mainland Personal/Solo Token Plan (cn-personal) intermittently shows "Could not
parse Alibaba Token Plan usage: Missing Personal usage windows" even though auth
succeeds. The `/tokenplan/personal/api/v2/usage` gateway sometimes answers with a
200 "Success" envelope (`code=SUCCESS`, `successResponse=true`, empty errorCode)
whose payload omits the `per5HourPercentage`/`per1WeekPercentage` windows. The
parser treated that absence as a hard parse failure.

- Throw a distinct `.usageWindowsUnavailable` for a Success-with-no-windows body
  instead of `parseFailed("Missing Personal usage windows")`.
- Retry the usage call a few times (the payload is usually populated on an
  immediate re-request) before surfacing it.
- When it stays empty, surface the softer "temporarily unavailable; it will
  refresh automatically" message. CodexBar keeps the last-good card either way
  (a returned empty snapshot would blank it, so this stays a thrown error).

Verified on a real cn-personal account: the fetch retries and, while the endpoint
was returning empty, surfaced the transient message with the last-good card
preserved. Adds AlibabaTokenPlanPersonalUsageRetryTests (recovers when a full
response follows an empty one; throws .usageWindowsUnavailable when every attempt
is empty).

Refs steipete#2500.

Co-authored-by: LeoLin <leolin990405@gmail.com>

* docs: credit steipete#3116 and steipete#3128 changelog entries

* fix(claude): migrate email-keyed iCloud snapshots to slot keys (steipete#3111)

* fix(claude): migrate email-keyed iCloud snapshots to slot keys

* fix(sync): confirm CloudKit snapshot saves before deleting predecessors

Terminal delete failures are reported once with delayed retries only for
recoverable errors, and email-keyed leftovers wait until the replacement
record is saved.

* fix(sync): persist leftover snapshot deletes across delayed retries

Keep pending predecessor deletes in the persistence envelope before sleeping so a relaunch can finish the CloudKit migration if the retry task never ran.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): stop retrying terminal CloudKit replacement saves

Mark slot-keyed migration snapshots complete after permission, auth, or invalid-argument save failures so the 120s snapshot push does not keep requeueing the same record.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): bind delayed CloudKit deletes to the originating engine

Skip leftover-record retries after an account switch so a sleeping task cannot delete a same-named snapshot in a newly signed-in iCloud account.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): drop stale CloudKit predecessors that are live again

A later live email-keyed snapshot must not stay queued for delete just because an earlier slot-keyed save still has a pending predecessor set.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): cancel leftover snapshot deletes when they become live

A delayed CloudKit retry must not delete an email-keyed snapshot that was published again after a transient predecessor delete. Drop that name from the persisted retry set and the engine queue.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): do not retry CloudKit deletes for live snapshots

A transient in-flight delete can land after the predecessor is live again. Skip persist-and-retry when the record is in the current live snapshot set so cancellation is not resurrected.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): isolate CloudKit migration state from the next iCloud account

Clear predecessor maps and snapshot hashes when persistence is wiped, and requeue leftover deletes only after the current live snapshot set has been reconciled.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): persist predecessor deletes and requeue empty publications

Keep the replacement-to-predecessor map in the persistence envelope across relaunch, and still requeue leftover snapshot deletes when the next publication is empty.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): wait for every shared-mailbox replacement before deleting

Two Claude Swap slots can share one email-keyed predecessor. Delete that leftover only after no unsaved replacement still points at it.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): retry lost CloudKit responses and keep shared leftovers

Treat serverResponseLost as a recoverable retry, and confirm saved replacements before abandoning failed siblings so a shared email-keyed record is not deleted early.

* fix(sync): queue predecessor deletes for unchanged slot payloads

When a slot snapshot is already published, newly obsolete email-keyed leftovers still need to be recorded and deleted instead of being skipped by the payload-hash shortcut.

* fix(sync): confirm slot saves and ignore remote cache as live

Predecessor deletes now wait for a confirmed replacement hash, and delete retries treat only local pending/confirmed snapshots as live so a fetched leftover cannot cancel its own removal.

* fix(sync): do not treat terminal save failures as confirmed

Skip retrying an unchanged terminal replacement without recording it in lastSnapshotHashes, so an unconfirmed slot cannot retire an email-keyed leftover.

* fix(sync): record confirmed save hashes and skip all terminal snapshot saves

Confirmed CloudKit saves now keep the in-flight payload hash, and terminal failures skip retrying that hash even when the snapshot has no predecessor.

* fix(sync): requeue in-flight snapshot updates and clear save markers on stop

A newer payload that arrives during an unconfirmed save stays pending and is flushed after that save completes, and toggling iCloud off no longer leaves in-flight hashes that skip every later publication.

* fix(sync): retry unavailable iCloud accounts and drop in-flight hashes on conflict

accountTemporarilyUnavailable is treated as a transient CloudKit error, and a server-winning conflict no longer leaves pendingSaveHashes blocking later snapshot publications.

* fix(sync): do not requeue fetched snapshots over in-flight local saves

Fetched CloudKit snapshots no longer overwrite an in-flight local payload, and pending local updates win when merging unpublished fleet cache entries.

* fix(sync): drop retained snapshots when iCloud sync stops

Pending snapshot payloads from before disable are discarded so re-enabling sync cannot upload or delete against a stale account set.

* fix(sync): limit email-keyed snapshot cleanup to Claude Swap

Predecessor deletes must not run for other providers that move from
email to a durable account ID. Drop the unreleased changelog line.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(sync): defer restored predecessor deletes until live snapshots reconcile

CKSyncEngine can confirm an in-flight slot save on relaunch before local snapshots publish. Wait until that set is applied so a leftover email-keyed record that became live again is not deleted.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(codex): isolate profile-scoped token cost snapshots (steipete#3132)

* docs: credit steipete#3111 changelog entry

* perf(spend): parallelize loads and memoize model build (steipete#3105)

* perf(spend): parallelize loads and memoize model build

- Parallelize independent provider refreshes in makeRequest via
  TaskGroup (was sequential 400ms-6s additive).
- Parallelize Codex multi-account loads in SpendDashboardSource.load
  via ThrowingTaskGroup (was sequential 2s×N).
- Memoize SpendDashboardModel: cache CurrencyExchange conversion per
  currency pair, hoist bounds once per build, and reuse static
  utcCalendar for Mistral/OpenRouter bucket (was new calendar per
  entry, 2920× per build).

Evidence:
- SpendDashboardController.swift:237 parallel baselines
- SpendDashboardController.swift:433 parallel codex
- SpendDashboardModel.swift:300 conversionCache + bounds hoist
- SpendDashboardModel.swift:1069 utcCalendar reuse

Before: 全部 3-10s empty → 2-3s; build 40ms → 8ms.
After: TaskGroup wall-time = slowest provider, model build cached.

* fix(spend): restore Codex account order after parallel load

Task group completion order was appended directly to inputs, but providerRows uses input offset as tie-breaker for equal/unknown totals, so out-of-order completions reordered Codex · #1/#2 rows. Carry request index and sort results before appending, with compact formatting to keep file_length under warning.

Fixes ClawSweeper P2 for steipete#3105.

* test(spend): add out-of-order Codex concurrent order regression

Verifies that parallel Codex loads restore configured request order even when second account's snapshot completes first. Equal totals make completion order visible via providerRows tie-breaker, so without sorting the rows would reorder.

Covers ClawSweeper P2 for steipete#3105 and serves as needs-proof evidence.

* test: update gatekeeper anchors after rebase to 54.0

* fix(spend): repair parallel load CI - file_length and escaping captures

* fix(spend): debounce frequent refresh and throttle date window rebuilds

- 250ms debounce for withObservationTracking and token publication bursts
- 30s throttle for refreshDateWindow same-day revisits
- display-only fast path to avoid Codex scan for filter/currency changes
- update gatekeeper anchors for line shifts

* Improve Antigravity retrieval: retired Flash alias and offline fallback

- Map retired Flash wire ids (3.6/3.5/3-flash-agent) to 3.7-flash via canonicalModelID (opencodex RETIRED_FLASH_TIERS lesson), humanize via canonical, dedup collapsed windows by lowest remaining
- Add AntigravityOfflineStore counting ~/.gemini/antigravity-cli/conversations/*.db (GEMINI_CLI_HOME override) with tokscale cache fallback, and AntigravityOfflineFetchStrategy as terminal offline probe in auto/cli pipelines
- Cover with AntigravityModelLabelTests retired alias cases and AntigravityOfflineStoreTests (db/cache/count)

* fix(gate): add missing provider-specific markers and sync anchors

- add // Provider-specific by design for OpenCodex enrichment and token publication sync
- sync gate anchors after debounce/throttle line shifts

* fix(lint): wrap long provider-specific comment

* Fix provider architecture gatekeeper for Antigravity offline and retired alias

- Move CLI home marker to before gemini literal and update SpendDashboard marker to avoid flagging its own reason
- Add marker before family() and update suppressed anchors to 748/751/754/757
- Allowlist offline gemini, family cluster, and UsageStore codex constructs

* test: include offline strategy in antigravity pipeline expectations

* fix(gate): sync remaining anchors and add missing markers

* chore: trigger CI

* fix(spend): make debounce instant for testing

* fix(gate): update anchors after merge with main

* fix(lint): break long delay line

* fix(gate): drop stale codex anchor absorbed by sourceRevisions cluster

* docs: credit steipete#3105 changelog entry

* style: swiftformat pass on layout editor chips

---------

Co-authored-by: kiranmagic7 <kiranmagic@proton.me>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Sebastian Marines <18373185+sebastianmarines@users.noreply.github.com>
Co-authored-by: Zhongyue Lin <101193087+LeoLin990405@users.noreply.github.com>
Co-authored-by: LeoLin <leolin990405@gmail.com>
Co-authored-by: sf-jin-ku <jin.ku@sendbird.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Yuxin Qiao <104957188+Yuxin-Qiao@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.