* provider, codex: a ChatGPT account at 100% with credits left keeps Codex signed in — magpie becomes its provider only while the Codex app itself holds the account magpie made itself Codex's provider (model_provider = "magpie", #540) whenever any of the active ChatGPT account's windows read 100%. A Pro account at 100% on its week with credits left keeps working in the Codex app: the backend answers every turn (about 490 200s in one day's usage log at 100%), yet magpie moved Codex off it, and as a provider without requires_openai_auth the app lost its ChatGPT state ("Sign in to ChatGPT to start a durable thread", no remote control). CodexUsedUp now reads codexHeld, which mirrors the Codex app's own composer block (ChatGPT.app webview bundle, hP and its helpers): the backend says the account isn't allowed (rate_limit.allowed = false), it has no credits (has_credits / unlimited), and it isn't a workspace still within its overage (overage_limit_reached = false, no spend cap, an ordinary rate_limit_reached). Window percent never decides it. Where the app goes by what /wham/usage can't show (a statsig gate, the gpt-reserve fallback, Team's reserve experiment that ignores overage), it counts as held: a wrong move costs ChatGPT extras, a missed one every turn. A reading kept through a failed read (keepLast) stops saying held once its used-up window has started again, as its usage does. NextLogin's account rotation and its thresholds are unchanged. A user stuck on the old move (codex.out = 1) is put back beside the sign-in by the next Sync, as #540 already does once the account has room. Verification: - TestCodexUsedUpIsWhatTheAppHolds (real /wham/usage replies, ids replaced) fails on the old trigger: 7 subcases, "CodexUsedUp = true, want false". Each workspace guard (spend cap, reason, overage, plan list, Team reserve) was mutated and fails its own subcase. - TestCodexHeldKeptOnlyTillTheReset fails without the quota_last change. - The real Pro account (7-day window 100%, ~28k credits, allowed false): CodexUsedUp true before, false after. - go vet ./...; go build (darwin), GOOS=linux -tags nogui, GOOS=windows; go test -tags nogui ./... under a sandbox HOME; -race -count=20 on the new and related Codex tests. - Not run: a live Codex app turn on an account truly held (none at hand), Windows/WSL runtime, GUI suites (no GUI change). * provider: a Codex account at a spend cap or past its overage is held, credits or not; limit_reached counts as not allowed codexHeld let credits through before the spend cap, so a Team seat at its cap (spend_control.reached, allowed false) with has_credits read not held and magpie left Codex on an account the backend refuses. The app's readiness check (26.930.61225, app-primary) returns limited on spend_control.reached or credits.overage_limit_reached before it looks at credits, and treats rate_limit.limit_reached like allowed false; held now reads the same. A spend cap with the rate limit still allowed (a workspace's included usage) stays not held.
54 lines
1.1 KiB
JSON
54 lines
1.1 KiB
JSON
{
|
|
"user_id": "user-1",
|
|
"account_id": "acct-1",
|
|
"email": "me@example.com",
|
|
"plan_type": "pro",
|
|
"rate_limit": {
|
|
"allowed": false,
|
|
"limit_reached": true,
|
|
"primary_window": {
|
|
"used_percent": 100,
|
|
"limit_window_seconds": 604800,
|
|
"reset_after_seconds": 384767,
|
|
"reset_at": 1791640059
|
|
},
|
|
"secondary_window": null
|
|
},
|
|
"code_review_rate_limit": null,
|
|
"additional_rate_limits": null,
|
|
"model_usage": {
|
|
"gpt-6-astra": {
|
|
"available": true,
|
|
"available_at": null,
|
|
"credits_would_enable": false
|
|
}
|
|
},
|
|
"credits": {
|
|
"has_credits": true,
|
|
"unlimited": false,
|
|
"overage_limit_reached": false,
|
|
"balance": "28263.2358130000",
|
|
"approx_local_messages": [
|
|
7066,
|
|
36742
|
|
],
|
|
"approx_cloud_messages": [
|
|
1131,
|
|
7066
|
|
]
|
|
},
|
|
"spend_control": {
|
|
"reached": false,
|
|
"individual_limit": null
|
|
},
|
|
"rate_limit_reached_type": {
|
|
"type": "rate_limit_reached",
|
|
"details": "default"
|
|
},
|
|
"promo": null,
|
|
"rate_limit_reset_credits": {
|
|
"available_count": 1,
|
|
"applicable_available_count": 1
|
|
}
|
|
}
|