feat: show Codex and Claude usage limits - #4326

Closed
NicL9923 wants to merge 9 commits into
pingdotgg:mainfrom
NicL9923:feat/provider-usage-limits
Closed

feat: show Codex and Claude usage limits#4326
NicL9923 wants to merge 9 commits into
pingdotgg:mainfrom
NicL9923:feat/provider-usage-limits

Conversation

@NicL9923

@NicL9923NicL9923 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Fixes#228.

What Changed

Adds provider subscription usage visibility for Codex and Claude.

  • Extends provider snapshots with dynamic usage windows.
  • Reads Codex limits from the typed account/rateLimits/read app-server method.
  • Reads Claude limits from claude --print "/usage" --output-format json.
  • Shows a compact remaining-percentage summary on collapsed provider rows.
  • Shows full usage bars and reset timestamps in expanded provider details.
  • Adds an opt-in client setting to show the active thread provider's limits in the existing context-window popover.
  • Supports provider-specific windows, including Claude model-specific weekly limits.

Why

Provider limits are easy to exhaust without any explanation in T3 Code. Users currently have to leave the app and repeatedly run /usage or /status to understand why a session stopped responding or how much capacity remains.

Provider settings provide a consistent place to inspect limits. The optional chat presentation gives users who check frequently quicker access without changing what the context-window gauge represents.

Implementation Notes

  • Usage travels through the existing provider snapshot and config stream. No new transport or persistence layer was added.
  • Codex usage is requested concurrently with the existing app-server provider probe and only for ChatGPT subscription accounts.
  • Claude usage uses the existing Effect child-process abstraction rather than PTY or TUI automation.
  • Claude usage probes close stdin, disable user and claude.ai MCP servers, and are cached per provider instance for five minutes.
  • Usage retrieval is best-effort. A timeout, unsupported account type, or changed output format omits usage without degrading provider readiness.
  • The context-popover setting is client-local and defaults to off.

Out Of Scope

  • Grok, Cursor, and OpenCode usage
  • Credit balances, spend controls, and usage-based billing plans
  • Persistent usage caches
  • Interactive PTY/TUI scraping
  • Changes to provider refresh cadence
  • A separate usage ring or changes to what the context-window ring represents

This PR reports subscription rate-limit windows only. The Codex account/rateLimits/read response also carries credits, individualLimit, planType, spendControlReached, rateLimitReachedType, and a multi-bucket rateLimitsByLimitId view, none of which are read here.

Two consequences worth knowing: accounts on usage-based plans or running purely on credits show no usage rather than wrong usage, and a window that reads fully consumed does not by itself mean work is blocked when credits remain. Representing balances needs a currency-denominated contract shape rather than the current percent-only window, so it is left as a follow-up.

UI Changes

Settings > Providers

Collapsed provider rows show a compact summary such as:

Session 16% · Weekly (all models) 80% · Weekly (Fable) 68% remaining

Expanded provider details show the full progress bars and reset timestamps.

Before:

image

After:

imageimageimageimage

Optional context popover

When enabled under General settings, the context-window popover includes a visually separated Provider limits section.

Before:

image

After:

imageimage

Verification

  • Focused contracts/server/web tests: 112 passed
  • Contracts, server, and web typechecks passed (with three pre-existing upstream Effect suggestions outside this diff)
  • Targeted lint and formatting passed
  • Production web build passed
  • Manually verified against live ChatGPT Plus and Claude Max subscriptions
  • Confirmed Claude returns session, weekly-all-models, and model-specific weekly windows through the real Effect child-process path

Prior Work and Feedback

This builds on the original implementation work in #1732 by @Aditya190803 and the discussion in #228. @dtown123 also identified the current Claude JSON-envelope command used here.

The narrower implementation incorporates feedback from those threads by:

  • using the existing provider snapshot flow instead of a persistence/repository refresh loop
  • limiting support to reliable Codex and Claude sources rather than speculative Cursor/OpenCode or interactive Grok probing
  • showing reset timestamps and explicitly labeling percentages as remaining
  • supporting dynamic Claude buckets such as model-specific weekly limits
  • keeping the chat presentation opt-in and visually separate from context-window usage
  • caching successful identity-matched probes per instance, expiring failures immediately, and skipping subscription usage for API-key/Bedrock auth
  • using the existing Effect child-process abstraction with scoped cancellation, closed stdin, no MCP startup, and the configured workspace cwd

Reviewer Notes

Claude Code currently returns usage as human-readable text inside a JSON result envelope. The parser intentionally fails closed: malformed JSON, changed output text, non-zero exits, and timeouts omit usage without changing provider health.

An independent Claude Opus 4.8 review found and prompted fixes for:

  • uncached Claude usage probes
  • unnecessary Codex rate-limit requests for non-subscription auth
  • progressbar accessibility semantics
  • missing Codex and Claude API-key integration coverage

A second Opus 4.8 review found no remaining blocking issues. Residual risk is limited to upstream Claude /usage wording changes, which fail closed.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Adds best-effort child-process and app-server probes on provider health checks; failures are isolated but Claude output parsing is brittle if upstream wording changes.

Overview
Adds subscription rate-limit visibility for Codex and Claude by extending provider snapshots with usageLimits (dynamic windows with used %, optional reset times) and surfacing them in Settings and optionally in chat.

Server: Codex probes account/rateLimits/read for ChatGPT accounts (2s timeout, concurrent with existing app-server probe). Claude runs --print /usage JSON plus auth status --json, parses human-readable output via providerUsageLimits, skips API key/Bedrock, verifies email against capabilities, and caches probes per instance in ClaudeDriver (5 min on success, immediate expiry on failure).

Contracts: New ServerProviderUsageLimits / window schema on ServerProvider; client setting showProviderUsageInContextPopover (default off).

Web:ProviderUsageRows / summary on provider cards; context-window popover can show a separated “Provider limits” section when the setting is enabled, keyed to the active thread’s provider instance.

Reviewed by Cursor Bugbot for commit 752b4df. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Show Codex and Claude subscription usage limits in the UI

  • Adds probeClaudeUsageLimits to fetch Claude account identity and usage windows via --print /usage, with a 4s timeout and per-identity caching in ClaudeDriver.
  • Adds Codex rate limit fetching in probeCodexAppServerProvider via account/rateLimits/read with a 2s timeout.
  • Introduces usageLimitsFromCodexRateLimits and parseClaudeUsageLimitsJson in providerUsageLimits.ts to normalize provider-specific data into a shared ServerProviderUsageLimits contract shape.
  • Renders usage windows with progress bars and reset times in ProviderUsageRows and ProviderUsageSummary components, surfaced in the context window popover and provider settings panel.
  • Adds a showProviderUsageInContextPopover client setting (default false) to gate display of usage in the chat composer popover.

Macroscope summarized 752b4df.

@coderabbitai

coderabbitaiBot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8588ed13-1c59-432d-9fe2-dcccf0d2c48d

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/server/src/provider/providerUsageLimits.ts Outdated
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
@NicL9923
NicL9923 marked this pull request as ready for review July 23, 2026 03:13
@macroscopeapp

macroscopeappBot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new user-facing feature (provider usage limits display) with substantial new logic including external API response parsing, new UI components, and cross-layer integration. New features of this scope warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 071bb91 to f5305f0CompareJuly 24, 2026 02:08
Comment threadapps/server/src/provider/Layers/CodexProvider.ts
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from f5305f0 to a2649d8CompareJuly 24, 2026 02:11
Comment threadapps/web/src/components/chat/ContextWindowMeter.tsx
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
Comment threadapps/server/src/provider/providerUsageLimits.ts
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from a2649d8 to 81f671dCompareJuly 25, 2026 01:10
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jul 25, 2026
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 346301f to ba2f487CompareJuly 25, 2026 18:41
@NicL9923

Copy link
Copy Markdown
ContributorAuthor

@juliusmarminge could you or someone get some eyes on this please? I know, I know, but this functionality is legit the last major QoL thing for me (and at least a few others). Would (mostly) close out an OG issue too ;). More than happy to make any changes if needed quickly to get this in unless y'all just disagree with the entire concept, but I think I have something pretty sensible here

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/server/src/provider/providerUsageLimits.ts Outdated
@jo-chemla

Copy link
Copy Markdown

Would it also make sense to surface the same session/weekly usage progress-bars charts following a /usage command in chat? Currently only the raw claude-cli output is shown, adding the progress-bars would make it a lot more readable and similar to original providers desktop apps.

You are currently using your subscription to power your Claude Code usage
Current session: 59% used · resets Jul 31, 3:10pm (Europe/Paris)
Current week (all models): 54% used · resets Aug 4, 3:59am (Europe/Paris)
What's contributing to your limits usage?
Approximate, based on local sessions on this machine — does not include other devices or claude.ai. Behaviors are independent characteristics, not a breakdown.
...
---
<
charts
>

@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 0abc172 to 752b4dfCompareAugust 7, 2026 23:43

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 752b4df. Configure here.

],
{ concurrency: "unbounded" },
).pipe(
Effect.timeoutOption(USAGE_PROBE_TIMEOUT_MS),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Auth hang drops usage results

Medium Severity

probeClaudeUsageLimits applies one four-second timeoutOption around the combined /usage and auth statusEffect.all. If auth status is still running when that budget elapses, the whole probe is interrupted and successful /usage output is discarded, so limits disappear even though usage already completed.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 752b4df. Configure here.

@NicL9923

Copy link
Copy Markdown
ContributorAuthor

Closing in favor of #5684

@NicL9923NicL9923 closed this Aug 8, 2026
@dtown123

Copy link
Copy Markdown

Closing in favor of #5684

I love 5684, but it doesn't cover the use case here at all. Bummed

@dtown123

Copy link
Copy Markdown

#5739 does though! what a roller coaster of emotions

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: add usage / quota visibility for Codex sessions and accounts

3 participants

@NicL9923@jo-chemla@dtown123
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: show Codex and Claude usage limits - #4326

Closed
NicL9923 wants to merge 9 commits into
pingdotgg:mainfrom
NicL9923:feat/provider-usage-limits
Closed

feat: show Codex and Claude usage limits#4326
NicL9923 wants to merge 9 commits into
pingdotgg:mainfrom
NicL9923:feat/provider-usage-limits

Conversation

@NicL9923

@NicL9923NicL9923 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Fixes#228.

What Changed

Adds provider subscription usage visibility for Codex and Claude.

  • Extends provider snapshots with dynamic usage windows.
  • Reads Codex limits from the typed account/rateLimits/read app-server method.
  • Reads Claude limits from claude --print "/usage" --output-format json.
  • Shows a compact remaining-percentage summary on collapsed provider rows.
  • Shows full usage bars and reset timestamps in expanded provider details.
  • Adds an opt-in client setting to show the active thread provider's limits in the existing context-window popover.
  • Supports provider-specific windows, including Claude model-specific weekly limits.

Why

Provider limits are easy to exhaust without any explanation in T3 Code. Users currently have to leave the app and repeatedly run /usage or /status to understand why a session stopped responding or how much capacity remains.

Provider settings provide a consistent place to inspect limits. The optional chat presentation gives users who check frequently quicker access without changing what the context-window gauge represents.

Implementation Notes

  • Usage travels through the existing provider snapshot and config stream. No new transport or persistence layer was added.
  • Codex usage is requested concurrently with the existing app-server provider probe and only for ChatGPT subscription accounts.
  • Claude usage uses the existing Effect child-process abstraction rather than PTY or TUI automation.
  • Claude usage probes close stdin, disable user and claude.ai MCP servers, and are cached per provider instance for five minutes.
  • Usage retrieval is best-effort. A timeout, unsupported account type, or changed output format omits usage without degrading provider readiness.
  • The context-popover setting is client-local and defaults to off.

Out Of Scope

  • Grok, Cursor, and OpenCode usage
  • Credit balances, spend controls, and usage-based billing plans
  • Persistent usage caches
  • Interactive PTY/TUI scraping
  • Changes to provider refresh cadence
  • A separate usage ring or changes to what the context-window ring represents

This PR reports subscription rate-limit windows only. The Codex account/rateLimits/read response also carries credits, individualLimit, planType, spendControlReached, rateLimitReachedType, and a multi-bucket rateLimitsByLimitId view, none of which are read here.

Two consequences worth knowing: accounts on usage-based plans or running purely on credits show no usage rather than wrong usage, and a window that reads fully consumed does not by itself mean work is blocked when credits remain. Representing balances needs a currency-denominated contract shape rather than the current percent-only window, so it is left as a follow-up.

UI Changes

Settings > Providers

Collapsed provider rows show a compact summary such as:

Session 16% · Weekly (all models) 80% · Weekly (Fable) 68% remaining

Expanded provider details show the full progress bars and reset timestamps.

Before:

image

After:

imageimageimageimage

Optional context popover

When enabled under General settings, the context-window popover includes a visually separated Provider limits section.

Before:

image

After:

imageimage

Verification

  • Focused contracts/server/web tests: 112 passed
  • Contracts, server, and web typechecks passed (with three pre-existing upstream Effect suggestions outside this diff)
  • Targeted lint and formatting passed
  • Production web build passed
  • Manually verified against live ChatGPT Plus and Claude Max subscriptions
  • Confirmed Claude returns session, weekly-all-models, and model-specific weekly windows through the real Effect child-process path

Prior Work and Feedback

This builds on the original implementation work in #1732 by @Aditya190803 and the discussion in #228. @dtown123 also identified the current Claude JSON-envelope command used here.

The narrower implementation incorporates feedback from those threads by:

  • using the existing provider snapshot flow instead of a persistence/repository refresh loop
  • limiting support to reliable Codex and Claude sources rather than speculative Cursor/OpenCode or interactive Grok probing
  • showing reset timestamps and explicitly labeling percentages as remaining
  • supporting dynamic Claude buckets such as model-specific weekly limits
  • keeping the chat presentation opt-in and visually separate from context-window usage
  • caching successful identity-matched probes per instance, expiring failures immediately, and skipping subscription usage for API-key/Bedrock auth
  • using the existing Effect child-process abstraction with scoped cancellation, closed stdin, no MCP startup, and the configured workspace cwd

Reviewer Notes

Claude Code currently returns usage as human-readable text inside a JSON result envelope. The parser intentionally fails closed: malformed JSON, changed output text, non-zero exits, and timeouts omit usage without changing provider health.

An independent Claude Opus 4.8 review found and prompted fixes for:

  • uncached Claude usage probes
  • unnecessary Codex rate-limit requests for non-subscription auth
  • progressbar accessibility semantics
  • missing Codex and Claude API-key integration coverage

A second Opus 4.8 review found no remaining blocking issues. Residual risk is limited to upstream Claude /usage wording changes, which fail closed.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Adds best-effort child-process and app-server probes on provider health checks; failures are isolated but Claude output parsing is brittle if upstream wording changes.

Overview
Adds subscription rate-limit visibility for Codex and Claude by extending provider snapshots with usageLimits (dynamic windows with used %, optional reset times) and surfacing them in Settings and optionally in chat.

Server: Codex probes account/rateLimits/read for ChatGPT accounts (2s timeout, concurrent with existing app-server probe). Claude runs --print /usage JSON plus auth status --json, parses human-readable output via providerUsageLimits, skips API key/Bedrock, verifies email against capabilities, and caches probes per instance in ClaudeDriver (5 min on success, immediate expiry on failure).

Contracts: New ServerProviderUsageLimits / window schema on ServerProvider; client setting showProviderUsageInContextPopover (default off).

Web:ProviderUsageRows / summary on provider cards; context-window popover can show a separated “Provider limits” section when the setting is enabled, keyed to the active thread’s provider instance.

Reviewed by Cursor Bugbot for commit 752b4df. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Show Codex and Claude subscription usage limits in the UI

  • Adds probeClaudeUsageLimits to fetch Claude account identity and usage windows via --print /usage, with a 4s timeout and per-identity caching in ClaudeDriver.
  • Adds Codex rate limit fetching in probeCodexAppServerProvider via account/rateLimits/read with a 2s timeout.
  • Introduces usageLimitsFromCodexRateLimits and parseClaudeUsageLimitsJson in providerUsageLimits.ts to normalize provider-specific data into a shared ServerProviderUsageLimits contract shape.
  • Renders usage windows with progress bars and reset times in ProviderUsageRows and ProviderUsageSummary components, surfaced in the context window popover and provider settings panel.
  • Adds a showProviderUsageInContextPopover client setting (default false) to gate display of usage in the chat composer popover.

Macroscope summarized 752b4df.

@coderabbitai

coderabbitaiBot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8588ed13-1c59-432d-9fe2-dcccf0d2c48d

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/server/src/provider/providerUsageLimits.ts Outdated
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
@NicL9923
NicL9923 marked this pull request as ready for review July 23, 2026 03:13
@macroscopeapp

macroscopeappBot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new user-facing feature (provider usage limits display) with substantial new logic including external API response parsing, new UI components, and cross-layer integration. New features of this scope warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 071bb91 to f5305f0CompareJuly 24, 2026 02:08
Comment threadapps/server/src/provider/Layers/CodexProvider.ts
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from f5305f0 to a2649d8CompareJuly 24, 2026 02:11
Comment threadapps/web/src/components/chat/ContextWindowMeter.tsx
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
Comment threadapps/server/src/provider/providerUsageLimits.ts
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from a2649d8 to 81f671dCompareJuly 25, 2026 01:10
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jul 25, 2026
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 346301f to ba2f487CompareJuly 25, 2026 18:41
@NicL9923

Copy link
Copy Markdown
ContributorAuthor

@juliusmarminge could you or someone get some eyes on this please? I know, I know, but this functionality is legit the last major QoL thing for me (and at least a few others). Would (mostly) close out an OG issue too ;). More than happy to make any changes if needed quickly to get this in unless y'all just disagree with the entire concept, but I think I have something pretty sensible here

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/server/src/provider/providerUsageLimits.ts Outdated
@jo-chemla

Copy link
Copy Markdown

Would it also make sense to surface the same session/weekly usage progress-bars charts following a /usage command in chat? Currently only the raw claude-cli output is shown, adding the progress-bars would make it a lot more readable and similar to original providers desktop apps.

You are currently using your subscription to power your Claude Code usage
Current session: 59% used · resets Jul 31, 3:10pm (Europe/Paris)
Current week (all models): 54% used · resets Aug 4, 3:59am (Europe/Paris)
What's contributing to your limits usage?
Approximate, based on local sessions on this machine — does not include other devices or claude.ai. Behaviors are independent characteristics, not a breakdown.
...
---
<
charts
>

@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 0abc172 to 752b4dfCompareAugust 7, 2026 23:43

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 752b4df. Configure here.

],
{ concurrency: "unbounded" },
).pipe(
Effect.timeoutOption(USAGE_PROBE_TIMEOUT_MS),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Auth hang drops usage results

Medium Severity

probeClaudeUsageLimits applies one four-second timeoutOption around the combined /usage and auth statusEffect.all. If auth status is still running when that budget elapses, the whole probe is interrupted and successful /usage output is discarded, so limits disappear even though usage already completed.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 752b4df. Configure here.

@NicL9923

Copy link
Copy Markdown
ContributorAuthor

Closing in favor of #5684

@NicL9923NicL9923 closed this Aug 8, 2026
@dtown123

Copy link
Copy Markdown

Closing in favor of #5684

I love 5684, but it doesn't cover the use case here at all. Bummed

@dtown123

Copy link
Copy Markdown

#5739 does though! what a roller coaster of emotions

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: add usage / quota visibility for Codex sessions and accounts

3 participants

@NicL9923@jo-chemla@dtown123
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: show Codex and Claude usage limits - #4326

Closed
NicL9923 wants to merge 9 commits into
pingdotgg:mainfrom
NicL9923:feat/provider-usage-limits
Closed

feat: show Codex and Claude usage limits#4326
NicL9923 wants to merge 9 commits into
pingdotgg:mainfrom
NicL9923:feat/provider-usage-limits

Conversation

@NicL9923

@NicL9923NicL9923 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Fixes#228.

What Changed

Adds provider subscription usage visibility for Codex and Claude.

  • Extends provider snapshots with dynamic usage windows.
  • Reads Codex limits from the typed account/rateLimits/read app-server method.
  • Reads Claude limits from claude --print "/usage" --output-format json.
  • Shows a compact remaining-percentage summary on collapsed provider rows.
  • Shows full usage bars and reset timestamps in expanded provider details.
  • Adds an opt-in client setting to show the active thread provider's limits in the existing context-window popover.
  • Supports provider-specific windows, including Claude model-specific weekly limits.

Why

Provider limits are easy to exhaust without any explanation in T3 Code. Users currently have to leave the app and repeatedly run /usage or /status to understand why a session stopped responding or how much capacity remains.

Provider settings provide a consistent place to inspect limits. The optional chat presentation gives users who check frequently quicker access without changing what the context-window gauge represents.

Implementation Notes

  • Usage travels through the existing provider snapshot and config stream. No new transport or persistence layer was added.
  • Codex usage is requested concurrently with the existing app-server provider probe and only for ChatGPT subscription accounts.
  • Claude usage uses the existing Effect child-process abstraction rather than PTY or TUI automation.
  • Claude usage probes close stdin, disable user and claude.ai MCP servers, and are cached per provider instance for five minutes.
  • Usage retrieval is best-effort. A timeout, unsupported account type, or changed output format omits usage without degrading provider readiness.
  • The context-popover setting is client-local and defaults to off.

Out Of Scope

  • Grok, Cursor, and OpenCode usage
  • Credit balances, spend controls, and usage-based billing plans
  • Persistent usage caches
  • Interactive PTY/TUI scraping
  • Changes to provider refresh cadence
  • A separate usage ring or changes to what the context-window ring represents

This PR reports subscription rate-limit windows only. The Codex account/rateLimits/read response also carries credits, individualLimit, planType, spendControlReached, rateLimitReachedType, and a multi-bucket rateLimitsByLimitId view, none of which are read here.

Two consequences worth knowing: accounts on usage-based plans or running purely on credits show no usage rather than wrong usage, and a window that reads fully consumed does not by itself mean work is blocked when credits remain. Representing balances needs a currency-denominated contract shape rather than the current percent-only window, so it is left as a follow-up.

UI Changes

Settings > Providers

Collapsed provider rows show a compact summary such as:

Session 16% · Weekly (all models) 80% · Weekly (Fable) 68% remaining

Expanded provider details show the full progress bars and reset timestamps.

Before:

image

After:

imageimageimageimage

Optional context popover

When enabled under General settings, the context-window popover includes a visually separated Provider limits section.

Before:

image

After:

imageimage

Verification

  • Focused contracts/server/web tests: 112 passed
  • Contracts, server, and web typechecks passed (with three pre-existing upstream Effect suggestions outside this diff)
  • Targeted lint and formatting passed
  • Production web build passed
  • Manually verified against live ChatGPT Plus and Claude Max subscriptions
  • Confirmed Claude returns session, weekly-all-models, and model-specific weekly windows through the real Effect child-process path

Prior Work and Feedback

This builds on the original implementation work in #1732 by @Aditya190803 and the discussion in #228. @dtown123 also identified the current Claude JSON-envelope command used here.

The narrower implementation incorporates feedback from those threads by:

  • using the existing provider snapshot flow instead of a persistence/repository refresh loop
  • limiting support to reliable Codex and Claude sources rather than speculative Cursor/OpenCode or interactive Grok probing
  • showing reset timestamps and explicitly labeling percentages as remaining
  • supporting dynamic Claude buckets such as model-specific weekly limits
  • keeping the chat presentation opt-in and visually separate from context-window usage
  • caching successful identity-matched probes per instance, expiring failures immediately, and skipping subscription usage for API-key/Bedrock auth
  • using the existing Effect child-process abstraction with scoped cancellation, closed stdin, no MCP startup, and the configured workspace cwd

Reviewer Notes

Claude Code currently returns usage as human-readable text inside a JSON result envelope. The parser intentionally fails closed: malformed JSON, changed output text, non-zero exits, and timeouts omit usage without changing provider health.

An independent Claude Opus 4.8 review found and prompted fixes for:

  • uncached Claude usage probes
  • unnecessary Codex rate-limit requests for non-subscription auth
  • progressbar accessibility semantics
  • missing Codex and Claude API-key integration coverage

A second Opus 4.8 review found no remaining blocking issues. Residual risk is limited to upstream Claude /usage wording changes, which fail closed.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Adds best-effort child-process and app-server probes on provider health checks; failures are isolated but Claude output parsing is brittle if upstream wording changes.

Overview
Adds subscription rate-limit visibility for Codex and Claude by extending provider snapshots with usageLimits (dynamic windows with used %, optional reset times) and surfacing them in Settings and optionally in chat.

Server: Codex probes account/rateLimits/read for ChatGPT accounts (2s timeout, concurrent with existing app-server probe). Claude runs --print /usage JSON plus auth status --json, parses human-readable output via providerUsageLimits, skips API key/Bedrock, verifies email against capabilities, and caches probes per instance in ClaudeDriver (5 min on success, immediate expiry on failure).

Contracts: New ServerProviderUsageLimits / window schema on ServerProvider; client setting showProviderUsageInContextPopover (default off).

Web:ProviderUsageRows / summary on provider cards; context-window popover can show a separated “Provider limits” section when the setting is enabled, keyed to the active thread’s provider instance.

Reviewed by Cursor Bugbot for commit 752b4df. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Show Codex and Claude subscription usage limits in the UI

  • Adds probeClaudeUsageLimits to fetch Claude account identity and usage windows via --print /usage, with a 4s timeout and per-identity caching in ClaudeDriver.
  • Adds Codex rate limit fetching in probeCodexAppServerProvider via account/rateLimits/read with a 2s timeout.
  • Introduces usageLimitsFromCodexRateLimits and parseClaudeUsageLimitsJson in providerUsageLimits.ts to normalize provider-specific data into a shared ServerProviderUsageLimits contract shape.
  • Renders usage windows with progress bars and reset times in ProviderUsageRows and ProviderUsageSummary components, surfaced in the context window popover and provider settings panel.
  • Adds a showProviderUsageInContextPopover client setting (default false) to gate display of usage in the chat composer popover.

Macroscope summarized 752b4df.

@coderabbitai

coderabbitaiBot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8588ed13-1c59-432d-9fe2-dcccf0d2c48d

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/server/src/provider/providerUsageLimits.ts Outdated
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
@NicL9923
NicL9923 marked this pull request as ready for review July 23, 2026 03:13
@macroscopeapp

macroscopeappBot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new user-facing feature (provider usage limits display) with substantial new logic including external API response parsing, new UI components, and cross-layer integration. New features of this scope warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 071bb91 to f5305f0CompareJuly 24, 2026 02:08
Comment threadapps/server/src/provider/Layers/CodexProvider.ts
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from f5305f0 to a2649d8CompareJuly 24, 2026 02:11
Comment threadapps/web/src/components/chat/ContextWindowMeter.tsx
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
Comment threadapps/server/src/provider/providerUsageLimits.ts
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from a2649d8 to 81f671dCompareJuly 25, 2026 01:10
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jul 25, 2026
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 346301f to ba2f487CompareJuly 25, 2026 18:41
@NicL9923

Copy link
Copy Markdown
ContributorAuthor

@juliusmarminge could you or someone get some eyes on this please? I know, I know, but this functionality is legit the last major QoL thing for me (and at least a few others). Would (mostly) close out an OG issue too ;). More than happy to make any changes if needed quickly to get this in unless y'all just disagree with the entire concept, but I think I have something pretty sensible here

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/server/src/provider/providerUsageLimits.ts Outdated
@jo-chemla

Copy link
Copy Markdown

Would it also make sense to surface the same session/weekly usage progress-bars charts following a /usage command in chat? Currently only the raw claude-cli output is shown, adding the progress-bars would make it a lot more readable and similar to original providers desktop apps.

You are currently using your subscription to power your Claude Code usage
Current session: 59% used · resets Jul 31, 3:10pm (Europe/Paris)
Current week (all models): 54% used · resets Aug 4, 3:59am (Europe/Paris)
What's contributing to your limits usage?
Approximate, based on local sessions on this machine — does not include other devices or claude.ai. Behaviors are independent characteristics, not a breakdown.
...
---
<
charts
>

@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 0abc172 to 752b4dfCompareAugust 7, 2026 23:43

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 752b4df. Configure here.

],
{ concurrency: "unbounded" },
).pipe(
Effect.timeoutOption(USAGE_PROBE_TIMEOUT_MS),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Auth hang drops usage results

Medium Severity

probeClaudeUsageLimits applies one four-second timeoutOption around the combined /usage and auth statusEffect.all. If auth status is still running when that budget elapses, the whole probe is interrupted and successful /usage output is discarded, so limits disappear even though usage already completed.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 752b4df. Configure here.

@NicL9923

Copy link
Copy Markdown
ContributorAuthor

Closing in favor of #5684

@NicL9923NicL9923 closed this Aug 8, 2026
@dtown123

Copy link
Copy Markdown

Closing in favor of #5684

I love 5684, but it doesn't cover the use case here at all. Bummed

@dtown123

Copy link
Copy Markdown

#5739 does though! what a roller coaster of emotions

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: add usage / quota visibility for Codex sessions and accounts

3 participants

@NicL9923@jo-chemla@dtown123
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: show Codex and Claude usage limits - #4326

Closed
NicL9923 wants to merge 9 commits into
pingdotgg:mainfrom
NicL9923:feat/provider-usage-limits
Closed

feat: show Codex and Claude usage limits#4326
NicL9923 wants to merge 9 commits into
pingdotgg:mainfrom
NicL9923:feat/provider-usage-limits

Conversation

@NicL9923

@NicL9923NicL9923 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Fixes#228.

What Changed

Adds provider subscription usage visibility for Codex and Claude.

  • Extends provider snapshots with dynamic usage windows.
  • Reads Codex limits from the typed account/rateLimits/read app-server method.
  • Reads Claude limits from claude --print "/usage" --output-format json.
  • Shows a compact remaining-percentage summary on collapsed provider rows.
  • Shows full usage bars and reset timestamps in expanded provider details.
  • Adds an opt-in client setting to show the active thread provider's limits in the existing context-window popover.
  • Supports provider-specific windows, including Claude model-specific weekly limits.

Why

Provider limits are easy to exhaust without any explanation in T3 Code. Users currently have to leave the app and repeatedly run /usage or /status to understand why a session stopped responding or how much capacity remains.

Provider settings provide a consistent place to inspect limits. The optional chat presentation gives users who check frequently quicker access without changing what the context-window gauge represents.

Implementation Notes

  • Usage travels through the existing provider snapshot and config stream. No new transport or persistence layer was added.
  • Codex usage is requested concurrently with the existing app-server provider probe and only for ChatGPT subscription accounts.
  • Claude usage uses the existing Effect child-process abstraction rather than PTY or TUI automation.
  • Claude usage probes close stdin, disable user and claude.ai MCP servers, and are cached per provider instance for five minutes.
  • Usage retrieval is best-effort. A timeout, unsupported account type, or changed output format omits usage without degrading provider readiness.
  • The context-popover setting is client-local and defaults to off.

Out Of Scope

  • Grok, Cursor, and OpenCode usage
  • Credit balances, spend controls, and usage-based billing plans
  • Persistent usage caches
  • Interactive PTY/TUI scraping
  • Changes to provider refresh cadence
  • A separate usage ring or changes to what the context-window ring represents

This PR reports subscription rate-limit windows only. The Codex account/rateLimits/read response also carries credits, individualLimit, planType, spendControlReached, rateLimitReachedType, and a multi-bucket rateLimitsByLimitId view, none of which are read here.

Two consequences worth knowing: accounts on usage-based plans or running purely on credits show no usage rather than wrong usage, and a window that reads fully consumed does not by itself mean work is blocked when credits remain. Representing balances needs a currency-denominated contract shape rather than the current percent-only window, so it is left as a follow-up.

UI Changes

Settings > Providers

Collapsed provider rows show a compact summary such as:

Session 16% · Weekly (all models) 80% · Weekly (Fable) 68% remaining

Expanded provider details show the full progress bars and reset timestamps.

Before:

image

After:

imageimageimageimage

Optional context popover

When enabled under General settings, the context-window popover includes a visually separated Provider limits section.

Before:

image

After:

imageimage

Verification

  • Focused contracts/server/web tests: 112 passed
  • Contracts, server, and web typechecks passed (with three pre-existing upstream Effect suggestions outside this diff)
  • Targeted lint and formatting passed
  • Production web build passed
  • Manually verified against live ChatGPT Plus and Claude Max subscriptions
  • Confirmed Claude returns session, weekly-all-models, and model-specific weekly windows through the real Effect child-process path

Prior Work and Feedback

This builds on the original implementation work in #1732 by @Aditya190803 and the discussion in #228. @dtown123 also identified the current Claude JSON-envelope command used here.

The narrower implementation incorporates feedback from those threads by:

  • using the existing provider snapshot flow instead of a persistence/repository refresh loop
  • limiting support to reliable Codex and Claude sources rather than speculative Cursor/OpenCode or interactive Grok probing
  • showing reset timestamps and explicitly labeling percentages as remaining
  • supporting dynamic Claude buckets such as model-specific weekly limits
  • keeping the chat presentation opt-in and visually separate from context-window usage
  • caching successful identity-matched probes per instance, expiring failures immediately, and skipping subscription usage for API-key/Bedrock auth
  • using the existing Effect child-process abstraction with scoped cancellation, closed stdin, no MCP startup, and the configured workspace cwd

Reviewer Notes

Claude Code currently returns usage as human-readable text inside a JSON result envelope. The parser intentionally fails closed: malformed JSON, changed output text, non-zero exits, and timeouts omit usage without changing provider health.

An independent Claude Opus 4.8 review found and prompted fixes for:

  • uncached Claude usage probes
  • unnecessary Codex rate-limit requests for non-subscription auth
  • progressbar accessibility semantics
  • missing Codex and Claude API-key integration coverage

A second Opus 4.8 review found no remaining blocking issues. Residual risk is limited to upstream Claude /usage wording changes, which fail closed.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Adds best-effort child-process and app-server probes on provider health checks; failures are isolated but Claude output parsing is brittle if upstream wording changes.

Overview
Adds subscription rate-limit visibility for Codex and Claude by extending provider snapshots with usageLimits (dynamic windows with used %, optional reset times) and surfacing them in Settings and optionally in chat.

Server: Codex probes account/rateLimits/read for ChatGPT accounts (2s timeout, concurrent with existing app-server probe). Claude runs --print /usage JSON plus auth status --json, parses human-readable output via providerUsageLimits, skips API key/Bedrock, verifies email against capabilities, and caches probes per instance in ClaudeDriver (5 min on success, immediate expiry on failure).

Contracts: New ServerProviderUsageLimits / window schema on ServerProvider; client setting showProviderUsageInContextPopover (default off).

Web:ProviderUsageRows / summary on provider cards; context-window popover can show a separated “Provider limits” section when the setting is enabled, keyed to the active thread’s provider instance.

Reviewed by Cursor Bugbot for commit 752b4df. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Show Codex and Claude subscription usage limits in the UI

  • Adds probeClaudeUsageLimits to fetch Claude account identity and usage windows via --print /usage, with a 4s timeout and per-identity caching in ClaudeDriver.
  • Adds Codex rate limit fetching in probeCodexAppServerProvider via account/rateLimits/read with a 2s timeout.
  • Introduces usageLimitsFromCodexRateLimits and parseClaudeUsageLimitsJson in providerUsageLimits.ts to normalize provider-specific data into a shared ServerProviderUsageLimits contract shape.
  • Renders usage windows with progress bars and reset times in ProviderUsageRows and ProviderUsageSummary components, surfaced in the context window popover and provider settings panel.
  • Adds a showProviderUsageInContextPopover client setting (default false) to gate display of usage in the chat composer popover.

Macroscope summarized 752b4df.

@coderabbitai

coderabbitaiBot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8588ed13-1c59-432d-9fe2-dcccf0d2c48d

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/server/src/provider/providerUsageLimits.ts Outdated
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
@NicL9923
NicL9923 marked this pull request as ready for review July 23, 2026 03:13
@macroscopeapp

macroscopeappBot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new user-facing feature (provider usage limits display) with substantial new logic including external API response parsing, new UI components, and cross-layer integration. New features of this scope warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 071bb91 to f5305f0CompareJuly 24, 2026 02:08
Comment threadapps/server/src/provider/Layers/CodexProvider.ts
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from f5305f0 to a2649d8CompareJuly 24, 2026 02:11
Comment threadapps/web/src/components/chat/ContextWindowMeter.tsx
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
Comment threadapps/server/src/provider/providerUsageLimits.ts
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from a2649d8 to 81f671dCompareJuly 25, 2026 01:10
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jul 25, 2026
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 346301f to ba2f487CompareJuly 25, 2026 18:41
@NicL9923

Copy link
Copy Markdown
ContributorAuthor

@juliusmarminge could you or someone get some eyes on this please? I know, I know, but this functionality is legit the last major QoL thing for me (and at least a few others). Would (mostly) close out an OG issue too ;). More than happy to make any changes if needed quickly to get this in unless y'all just disagree with the entire concept, but I think I have something pretty sensible here

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/server/src/provider/providerUsageLimits.ts Outdated
@jo-chemla

Copy link
Copy Markdown

Would it also make sense to surface the same session/weekly usage progress-bars charts following a /usage command in chat? Currently only the raw claude-cli output is shown, adding the progress-bars would make it a lot more readable and similar to original providers desktop apps.

You are currently using your subscription to power your Claude Code usage
Current session: 59% used · resets Jul 31, 3:10pm (Europe/Paris)
Current week (all models): 54% used · resets Aug 4, 3:59am (Europe/Paris)
What's contributing to your limits usage?
Approximate, based on local sessions on this machine — does not include other devices or claude.ai. Behaviors are independent characteristics, not a breakdown.
...
---
<
charts
>

@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 0abc172 to 752b4dfCompareAugust 7, 2026 23:43

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 752b4df. Configure here.

],
{ concurrency: "unbounded" },
).pipe(
Effect.timeoutOption(USAGE_PROBE_TIMEOUT_MS),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Auth hang drops usage results

Medium Severity

probeClaudeUsageLimits applies one four-second timeoutOption around the combined /usage and auth statusEffect.all. If auth status is still running when that budget elapses, the whole probe is interrupted and successful /usage output is discarded, so limits disappear even though usage already completed.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 752b4df. Configure here.

@NicL9923

Copy link
Copy Markdown
ContributorAuthor

Closing in favor of #5684

@NicL9923NicL9923 closed this Aug 8, 2026
@dtown123

Copy link
Copy Markdown

Closing in favor of #5684

I love 5684, but it doesn't cover the use case here at all. Bummed

@dtown123

Copy link
Copy Markdown

#5739 does though! what a roller coaster of emotions

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: add usage / quota visibility for Codex sessions and accounts

3 participants

@NicL9923@jo-chemla@dtown123
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: show Codex and Claude usage limits - #4326

Closed
NicL9923 wants to merge 9 commits into
pingdotgg:mainfrom
NicL9923:feat/provider-usage-limits
Closed

feat: show Codex and Claude usage limits#4326
NicL9923 wants to merge 9 commits into
pingdotgg:mainfrom
NicL9923:feat/provider-usage-limits

Conversation

@NicL9923

@NicL9923NicL9923 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Fixes#228.

What Changed

Adds provider subscription usage visibility for Codex and Claude.

  • Extends provider snapshots with dynamic usage windows.
  • Reads Codex limits from the typed account/rateLimits/read app-server method.
  • Reads Claude limits from claude --print "/usage" --output-format json.
  • Shows a compact remaining-percentage summary on collapsed provider rows.
  • Shows full usage bars and reset timestamps in expanded provider details.
  • Adds an opt-in client setting to show the active thread provider's limits in the existing context-window popover.
  • Supports provider-specific windows, including Claude model-specific weekly limits.

Why

Provider limits are easy to exhaust without any explanation in T3 Code. Users currently have to leave the app and repeatedly run /usage or /status to understand why a session stopped responding or how much capacity remains.

Provider settings provide a consistent place to inspect limits. The optional chat presentation gives users who check frequently quicker access without changing what the context-window gauge represents.

Implementation Notes

  • Usage travels through the existing provider snapshot and config stream. No new transport or persistence layer was added.
  • Codex usage is requested concurrently with the existing app-server provider probe and only for ChatGPT subscription accounts.
  • Claude usage uses the existing Effect child-process abstraction rather than PTY or TUI automation.
  • Claude usage probes close stdin, disable user and claude.ai MCP servers, and are cached per provider instance for five minutes.
  • Usage retrieval is best-effort. A timeout, unsupported account type, or changed output format omits usage without degrading provider readiness.
  • The context-popover setting is client-local and defaults to off.

Out Of Scope

  • Grok, Cursor, and OpenCode usage
  • Credit balances, spend controls, and usage-based billing plans
  • Persistent usage caches
  • Interactive PTY/TUI scraping
  • Changes to provider refresh cadence
  • A separate usage ring or changes to what the context-window ring represents

This PR reports subscription rate-limit windows only. The Codex account/rateLimits/read response also carries credits, individualLimit, planType, spendControlReached, rateLimitReachedType, and a multi-bucket rateLimitsByLimitId view, none of which are read here.

Two consequences worth knowing: accounts on usage-based plans or running purely on credits show no usage rather than wrong usage, and a window that reads fully consumed does not by itself mean work is blocked when credits remain. Representing balances needs a currency-denominated contract shape rather than the current percent-only window, so it is left as a follow-up.

UI Changes

Settings > Providers

Collapsed provider rows show a compact summary such as:

Session 16% · Weekly (all models) 80% · Weekly (Fable) 68% remaining

Expanded provider details show the full progress bars and reset timestamps.

Before:

image

After:

imageimageimageimage

Optional context popover

When enabled under General settings, the context-window popover includes a visually separated Provider limits section.

Before:

image

After:

imageimage

Verification

  • Focused contracts/server/web tests: 112 passed
  • Contracts, server, and web typechecks passed (with three pre-existing upstream Effect suggestions outside this diff)
  • Targeted lint and formatting passed
  • Production web build passed
  • Manually verified against live ChatGPT Plus and Claude Max subscriptions
  • Confirmed Claude returns session, weekly-all-models, and model-specific weekly windows through the real Effect child-process path

Prior Work and Feedback

This builds on the original implementation work in #1732 by @Aditya190803 and the discussion in #228. @dtown123 also identified the current Claude JSON-envelope command used here.

The narrower implementation incorporates feedback from those threads by:

  • using the existing provider snapshot flow instead of a persistence/repository refresh loop
  • limiting support to reliable Codex and Claude sources rather than speculative Cursor/OpenCode or interactive Grok probing
  • showing reset timestamps and explicitly labeling percentages as remaining
  • supporting dynamic Claude buckets such as model-specific weekly limits
  • keeping the chat presentation opt-in and visually separate from context-window usage
  • caching successful identity-matched probes per instance, expiring failures immediately, and skipping subscription usage for API-key/Bedrock auth
  • using the existing Effect child-process abstraction with scoped cancellation, closed stdin, no MCP startup, and the configured workspace cwd

Reviewer Notes

Claude Code currently returns usage as human-readable text inside a JSON result envelope. The parser intentionally fails closed: malformed JSON, changed output text, non-zero exits, and timeouts omit usage without changing provider health.

An independent Claude Opus 4.8 review found and prompted fixes for:

  • uncached Claude usage probes
  • unnecessary Codex rate-limit requests for non-subscription auth
  • progressbar accessibility semantics
  • missing Codex and Claude API-key integration coverage

A second Opus 4.8 review found no remaining blocking issues. Residual risk is limited to upstream Claude /usage wording changes, which fail closed.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Adds best-effort child-process and app-server probes on provider health checks; failures are isolated but Claude output parsing is brittle if upstream wording changes.

Overview
Adds subscription rate-limit visibility for Codex and Claude by extending provider snapshots with usageLimits (dynamic windows with used %, optional reset times) and surfacing them in Settings and optionally in chat.

Server: Codex probes account/rateLimits/read for ChatGPT accounts (2s timeout, concurrent with existing app-server probe). Claude runs --print /usage JSON plus auth status --json, parses human-readable output via providerUsageLimits, skips API key/Bedrock, verifies email against capabilities, and caches probes per instance in ClaudeDriver (5 min on success, immediate expiry on failure).

Contracts: New ServerProviderUsageLimits / window schema on ServerProvider; client setting showProviderUsageInContextPopover (default off).

Web:ProviderUsageRows / summary on provider cards; context-window popover can show a separated “Provider limits” section when the setting is enabled, keyed to the active thread’s provider instance.

Reviewed by Cursor Bugbot for commit 752b4df. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Show Codex and Claude subscription usage limits in the UI

  • Adds probeClaudeUsageLimits to fetch Claude account identity and usage windows via --print /usage, with a 4s timeout and per-identity caching in ClaudeDriver.
  • Adds Codex rate limit fetching in probeCodexAppServerProvider via account/rateLimits/read with a 2s timeout.
  • Introduces usageLimitsFromCodexRateLimits and parseClaudeUsageLimitsJson in providerUsageLimits.ts to normalize provider-specific data into a shared ServerProviderUsageLimits contract shape.
  • Renders usage windows with progress bars and reset times in ProviderUsageRows and ProviderUsageSummary components, surfaced in the context window popover and provider settings panel.
  • Adds a showProviderUsageInContextPopover client setting (default false) to gate display of usage in the chat composer popover.

Macroscope summarized 752b4df.

@coderabbitai

coderabbitaiBot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8588ed13-1c59-432d-9fe2-dcccf0d2c48d

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/server/src/provider/providerUsageLimits.ts Outdated
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
@NicL9923
NicL9923 marked this pull request as ready for review July 23, 2026 03:13
@macroscopeapp

macroscopeappBot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new user-facing feature (provider usage limits display) with substantial new logic including external API response parsing, new UI components, and cross-layer integration. New features of this scope warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 071bb91 to f5305f0CompareJuly 24, 2026 02:08
Comment threadapps/server/src/provider/Layers/CodexProvider.ts
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from f5305f0 to a2649d8CompareJuly 24, 2026 02:11
Comment threadapps/web/src/components/chat/ContextWindowMeter.tsx
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
Comment threadapps/server/src/provider/providerUsageLimits.ts
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from a2649d8 to 81f671dCompareJuly 25, 2026 01:10
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jul 25, 2026
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 346301f to ba2f487CompareJuly 25, 2026 18:41
@NicL9923

Copy link
Copy Markdown
ContributorAuthor

@juliusmarminge could you or someone get some eyes on this please? I know, I know, but this functionality is legit the last major QoL thing for me (and at least a few others). Would (mostly) close out an OG issue too ;). More than happy to make any changes if needed quickly to get this in unless y'all just disagree with the entire concept, but I think I have something pretty sensible here

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/server/src/provider/providerUsageLimits.ts Outdated
@jo-chemla

Copy link
Copy Markdown

Would it also make sense to surface the same session/weekly usage progress-bars charts following a /usage command in chat? Currently only the raw claude-cli output is shown, adding the progress-bars would make it a lot more readable and similar to original providers desktop apps.

You are currently using your subscription to power your Claude Code usage
Current session: 59% used · resets Jul 31, 3:10pm (Europe/Paris)
Current week (all models): 54% used · resets Aug 4, 3:59am (Europe/Paris)
What's contributing to your limits usage?
Approximate, based on local sessions on this machine — does not include other devices or claude.ai. Behaviors are independent characteristics, not a breakdown.
...
---
<
charts
>

@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 0abc172 to 752b4dfCompareAugust 7, 2026 23:43

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 752b4df. Configure here.

],
{ concurrency: "unbounded" },
).pipe(
Effect.timeoutOption(USAGE_PROBE_TIMEOUT_MS),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Auth hang drops usage results

Medium Severity

probeClaudeUsageLimits applies one four-second timeoutOption around the combined /usage and auth statusEffect.all. If auth status is still running when that budget elapses, the whole probe is interrupted and successful /usage output is discarded, so limits disappear even though usage already completed.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 752b4df. Configure here.

@NicL9923

Copy link
Copy Markdown
ContributorAuthor

Closing in favor of #5684

@NicL9923NicL9923 closed this Aug 8, 2026
@dtown123

Copy link
Copy Markdown

Closing in favor of #5684

I love 5684, but it doesn't cover the use case here at all. Bummed

@dtown123

Copy link
Copy Markdown

#5739 does though! what a roller coaster of emotions

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: add usage / quota visibility for Codex sessions and accounts

3 participants

@NicL9923@jo-chemla@dtown123
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: show Codex and Claude usage limits - #4326

Closed
NicL9923 wants to merge 9 commits into
pingdotgg:mainfrom
NicL9923:feat/provider-usage-limits
Closed

feat: show Codex and Claude usage limits#4326
NicL9923 wants to merge 9 commits into
pingdotgg:mainfrom
NicL9923:feat/provider-usage-limits

Conversation

@NicL9923

@NicL9923NicL9923 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Fixes#228.

What Changed

Adds provider subscription usage visibility for Codex and Claude.

  • Extends provider snapshots with dynamic usage windows.
  • Reads Codex limits from the typed account/rateLimits/read app-server method.
  • Reads Claude limits from claude --print "/usage" --output-format json.
  • Shows a compact remaining-percentage summary on collapsed provider rows.
  • Shows full usage bars and reset timestamps in expanded provider details.
  • Adds an opt-in client setting to show the active thread provider's limits in the existing context-window popover.
  • Supports provider-specific windows, including Claude model-specific weekly limits.

Why

Provider limits are easy to exhaust without any explanation in T3 Code. Users currently have to leave the app and repeatedly run /usage or /status to understand why a session stopped responding or how much capacity remains.

Provider settings provide a consistent place to inspect limits. The optional chat presentation gives users who check frequently quicker access without changing what the context-window gauge represents.

Implementation Notes

  • Usage travels through the existing provider snapshot and config stream. No new transport or persistence layer was added.
  • Codex usage is requested concurrently with the existing app-server provider probe and only for ChatGPT subscription accounts.
  • Claude usage uses the existing Effect child-process abstraction rather than PTY or TUI automation.
  • Claude usage probes close stdin, disable user and claude.ai MCP servers, and are cached per provider instance for five minutes.
  • Usage retrieval is best-effort. A timeout, unsupported account type, or changed output format omits usage without degrading provider readiness.
  • The context-popover setting is client-local and defaults to off.

Out Of Scope

  • Grok, Cursor, and OpenCode usage
  • Credit balances, spend controls, and usage-based billing plans
  • Persistent usage caches
  • Interactive PTY/TUI scraping
  • Changes to provider refresh cadence
  • A separate usage ring or changes to what the context-window ring represents

This PR reports subscription rate-limit windows only. The Codex account/rateLimits/read response also carries credits, individualLimit, planType, spendControlReached, rateLimitReachedType, and a multi-bucket rateLimitsByLimitId view, none of which are read here.

Two consequences worth knowing: accounts on usage-based plans or running purely on credits show no usage rather than wrong usage, and a window that reads fully consumed does not by itself mean work is blocked when credits remain. Representing balances needs a currency-denominated contract shape rather than the current percent-only window, so it is left as a follow-up.

UI Changes

Settings > Providers

Collapsed provider rows show a compact summary such as:

Session 16% · Weekly (all models) 80% · Weekly (Fable) 68% remaining

Expanded provider details show the full progress bars and reset timestamps.

Before:

image

After:

imageimageimageimage

Optional context popover

When enabled under General settings, the context-window popover includes a visually separated Provider limits section.

Before:

image

After:

imageimage

Verification

  • Focused contracts/server/web tests: 112 passed
  • Contracts, server, and web typechecks passed (with three pre-existing upstream Effect suggestions outside this diff)
  • Targeted lint and formatting passed
  • Production web build passed
  • Manually verified against live ChatGPT Plus and Claude Max subscriptions
  • Confirmed Claude returns session, weekly-all-models, and model-specific weekly windows through the real Effect child-process path

Prior Work and Feedback

This builds on the original implementation work in #1732 by @Aditya190803 and the discussion in #228. @dtown123 also identified the current Claude JSON-envelope command used here.

The narrower implementation incorporates feedback from those threads by:

  • using the existing provider snapshot flow instead of a persistence/repository refresh loop
  • limiting support to reliable Codex and Claude sources rather than speculative Cursor/OpenCode or interactive Grok probing
  • showing reset timestamps and explicitly labeling percentages as remaining
  • supporting dynamic Claude buckets such as model-specific weekly limits
  • keeping the chat presentation opt-in and visually separate from context-window usage
  • caching successful identity-matched probes per instance, expiring failures immediately, and skipping subscription usage for API-key/Bedrock auth
  • using the existing Effect child-process abstraction with scoped cancellation, closed stdin, no MCP startup, and the configured workspace cwd

Reviewer Notes

Claude Code currently returns usage as human-readable text inside a JSON result envelope. The parser intentionally fails closed: malformed JSON, changed output text, non-zero exits, and timeouts omit usage without changing provider health.

An independent Claude Opus 4.8 review found and prompted fixes for:

  • uncached Claude usage probes
  • unnecessary Codex rate-limit requests for non-subscription auth
  • progressbar accessibility semantics
  • missing Codex and Claude API-key integration coverage

A second Opus 4.8 review found no remaining blocking issues. Residual risk is limited to upstream Claude /usage wording changes, which fail closed.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Adds best-effort child-process and app-server probes on provider health checks; failures are isolated but Claude output parsing is brittle if upstream wording changes.

Overview
Adds subscription rate-limit visibility for Codex and Claude by extending provider snapshots with usageLimits (dynamic windows with used %, optional reset times) and surfacing them in Settings and optionally in chat.

Server: Codex probes account/rateLimits/read for ChatGPT accounts (2s timeout, concurrent with existing app-server probe). Claude runs --print /usage JSON plus auth status --json, parses human-readable output via providerUsageLimits, skips API key/Bedrock, verifies email against capabilities, and caches probes per instance in ClaudeDriver (5 min on success, immediate expiry on failure).

Contracts: New ServerProviderUsageLimits / window schema on ServerProvider; client setting showProviderUsageInContextPopover (default off).

Web:ProviderUsageRows / summary on provider cards; context-window popover can show a separated “Provider limits” section when the setting is enabled, keyed to the active thread’s provider instance.

Reviewed by Cursor Bugbot for commit 752b4df. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Show Codex and Claude subscription usage limits in the UI

  • Adds probeClaudeUsageLimits to fetch Claude account identity and usage windows via --print /usage, with a 4s timeout and per-identity caching in ClaudeDriver.
  • Adds Codex rate limit fetching in probeCodexAppServerProvider via account/rateLimits/read with a 2s timeout.
  • Introduces usageLimitsFromCodexRateLimits and parseClaudeUsageLimitsJson in providerUsageLimits.ts to normalize provider-specific data into a shared ServerProviderUsageLimits contract shape.
  • Renders usage windows with progress bars and reset times in ProviderUsageRows and ProviderUsageSummary components, surfaced in the context window popover and provider settings panel.
  • Adds a showProviderUsageInContextPopover client setting (default false) to gate display of usage in the chat composer popover.

Macroscope summarized 752b4df.

@coderabbitai

coderabbitaiBot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8588ed13-1c59-432d-9fe2-dcccf0d2c48d

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/server/src/provider/providerUsageLimits.ts Outdated
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
@NicL9923
NicL9923 marked this pull request as ready for review July 23, 2026 03:13
@macroscopeapp

macroscopeappBot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new user-facing feature (provider usage limits display) with substantial new logic including external API response parsing, new UI components, and cross-layer integration. New features of this scope warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 071bb91 to f5305f0CompareJuly 24, 2026 02:08
Comment threadapps/server/src/provider/Layers/CodexProvider.ts
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from f5305f0 to a2649d8CompareJuly 24, 2026 02:11
Comment threadapps/web/src/components/chat/ContextWindowMeter.tsx
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
Comment threadapps/server/src/provider/providerUsageLimits.ts
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from a2649d8 to 81f671dCompareJuly 25, 2026 01:10
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jul 25, 2026
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 346301f to ba2f487CompareJuly 25, 2026 18:41
@NicL9923

Copy link
Copy Markdown
ContributorAuthor

@juliusmarminge could you or someone get some eyes on this please? I know, I know, but this functionality is legit the last major QoL thing for me (and at least a few others). Would (mostly) close out an OG issue too ;). More than happy to make any changes if needed quickly to get this in unless y'all just disagree with the entire concept, but I think I have something pretty sensible here

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/server/src/provider/providerUsageLimits.ts Outdated
@jo-chemla

Copy link
Copy Markdown

Would it also make sense to surface the same session/weekly usage progress-bars charts following a /usage command in chat? Currently only the raw claude-cli output is shown, adding the progress-bars would make it a lot more readable and similar to original providers desktop apps.

You are currently using your subscription to power your Claude Code usage
Current session: 59% used · resets Jul 31, 3:10pm (Europe/Paris)
Current week (all models): 54% used · resets Aug 4, 3:59am (Europe/Paris)
What's contributing to your limits usage?
Approximate, based on local sessions on this machine — does not include other devices or claude.ai. Behaviors are independent characteristics, not a breakdown.
...
---
<
charts
>

@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 0abc172 to 752b4dfCompareAugust 7, 2026 23:43

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 752b4df. Configure here.

],
{ concurrency: "unbounded" },
).pipe(
Effect.timeoutOption(USAGE_PROBE_TIMEOUT_MS),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Auth hang drops usage results

Medium Severity

probeClaudeUsageLimits applies one four-second timeoutOption around the combined /usage and auth statusEffect.all. If auth status is still running when that budget elapses, the whole probe is interrupted and successful /usage output is discarded, so limits disappear even though usage already completed.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 752b4df. Configure here.

@NicL9923

Copy link
Copy Markdown
ContributorAuthor

Closing in favor of #5684

@NicL9923NicL9923 closed this Aug 8, 2026
@dtown123

Copy link
Copy Markdown

Closing in favor of #5684

I love 5684, but it doesn't cover the use case here at all. Bummed

@dtown123

Copy link
Copy Markdown

#5739 does though! what a roller coaster of emotions

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: add usage / quota visibility for Codex sessions and accounts

3 participants

@NicL9923@jo-chemla@dtown123
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: show Codex and Claude usage limits - #4326

Closed
NicL9923 wants to merge 9 commits into
pingdotgg:mainfrom
NicL9923:feat/provider-usage-limits
Closed

feat: show Codex and Claude usage limits#4326
NicL9923 wants to merge 9 commits into
pingdotgg:mainfrom
NicL9923:feat/provider-usage-limits

Conversation

@NicL9923

@NicL9923NicL9923 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Fixes#228.

What Changed

Adds provider subscription usage visibility for Codex and Claude.

  • Extends provider snapshots with dynamic usage windows.
  • Reads Codex limits from the typed account/rateLimits/read app-server method.
  • Reads Claude limits from claude --print "/usage" --output-format json.
  • Shows a compact remaining-percentage summary on collapsed provider rows.
  • Shows full usage bars and reset timestamps in expanded provider details.
  • Adds an opt-in client setting to show the active thread provider's limits in the existing context-window popover.
  • Supports provider-specific windows, including Claude model-specific weekly limits.

Why

Provider limits are easy to exhaust without any explanation in T3 Code. Users currently have to leave the app and repeatedly run /usage or /status to understand why a session stopped responding or how much capacity remains.

Provider settings provide a consistent place to inspect limits. The optional chat presentation gives users who check frequently quicker access without changing what the context-window gauge represents.

Implementation Notes

  • Usage travels through the existing provider snapshot and config stream. No new transport or persistence layer was added.
  • Codex usage is requested concurrently with the existing app-server provider probe and only for ChatGPT subscription accounts.
  • Claude usage uses the existing Effect child-process abstraction rather than PTY or TUI automation.
  • Claude usage probes close stdin, disable user and claude.ai MCP servers, and are cached per provider instance for five minutes.
  • Usage retrieval is best-effort. A timeout, unsupported account type, or changed output format omits usage without degrading provider readiness.
  • The context-popover setting is client-local and defaults to off.

Out Of Scope

  • Grok, Cursor, and OpenCode usage
  • Credit balances, spend controls, and usage-based billing plans
  • Persistent usage caches
  • Interactive PTY/TUI scraping
  • Changes to provider refresh cadence
  • A separate usage ring or changes to what the context-window ring represents

This PR reports subscription rate-limit windows only. The Codex account/rateLimits/read response also carries credits, individualLimit, planType, spendControlReached, rateLimitReachedType, and a multi-bucket rateLimitsByLimitId view, none of which are read here.

Two consequences worth knowing: accounts on usage-based plans or running purely on credits show no usage rather than wrong usage, and a window that reads fully consumed does not by itself mean work is blocked when credits remain. Representing balances needs a currency-denominated contract shape rather than the current percent-only window, so it is left as a follow-up.

UI Changes

Settings > Providers

Collapsed provider rows show a compact summary such as:

Session 16% · Weekly (all models) 80% · Weekly (Fable) 68% remaining

Expanded provider details show the full progress bars and reset timestamps.

Before:

image

After:

imageimageimageimage

Optional context popover

When enabled under General settings, the context-window popover includes a visually separated Provider limits section.

Before:

image

After:

imageimage

Verification

  • Focused contracts/server/web tests: 112 passed
  • Contracts, server, and web typechecks passed (with three pre-existing upstream Effect suggestions outside this diff)
  • Targeted lint and formatting passed
  • Production web build passed
  • Manually verified against live ChatGPT Plus and Claude Max subscriptions
  • Confirmed Claude returns session, weekly-all-models, and model-specific weekly windows through the real Effect child-process path

Prior Work and Feedback

This builds on the original implementation work in #1732 by @Aditya190803 and the discussion in #228. @dtown123 also identified the current Claude JSON-envelope command used here.

The narrower implementation incorporates feedback from those threads by:

  • using the existing provider snapshot flow instead of a persistence/repository refresh loop
  • limiting support to reliable Codex and Claude sources rather than speculative Cursor/OpenCode or interactive Grok probing
  • showing reset timestamps and explicitly labeling percentages as remaining
  • supporting dynamic Claude buckets such as model-specific weekly limits
  • keeping the chat presentation opt-in and visually separate from context-window usage
  • caching successful identity-matched probes per instance, expiring failures immediately, and skipping subscription usage for API-key/Bedrock auth
  • using the existing Effect child-process abstraction with scoped cancellation, closed stdin, no MCP startup, and the configured workspace cwd

Reviewer Notes

Claude Code currently returns usage as human-readable text inside a JSON result envelope. The parser intentionally fails closed: malformed JSON, changed output text, non-zero exits, and timeouts omit usage without changing provider health.

An independent Claude Opus 4.8 review found and prompted fixes for:

  • uncached Claude usage probes
  • unnecessary Codex rate-limit requests for non-subscription auth
  • progressbar accessibility semantics
  • missing Codex and Claude API-key integration coverage

A second Opus 4.8 review found no remaining blocking issues. Residual risk is limited to upstream Claude /usage wording changes, which fail closed.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Adds best-effort child-process and app-server probes on provider health checks; failures are isolated but Claude output parsing is brittle if upstream wording changes.

Overview
Adds subscription rate-limit visibility for Codex and Claude by extending provider snapshots with usageLimits (dynamic windows with used %, optional reset times) and surfacing them in Settings and optionally in chat.

Server: Codex probes account/rateLimits/read for ChatGPT accounts (2s timeout, concurrent with existing app-server probe). Claude runs --print /usage JSON plus auth status --json, parses human-readable output via providerUsageLimits, skips API key/Bedrock, verifies email against capabilities, and caches probes per instance in ClaudeDriver (5 min on success, immediate expiry on failure).

Contracts: New ServerProviderUsageLimits / window schema on ServerProvider; client setting showProviderUsageInContextPopover (default off).

Web:ProviderUsageRows / summary on provider cards; context-window popover can show a separated “Provider limits” section when the setting is enabled, keyed to the active thread’s provider instance.

Reviewed by Cursor Bugbot for commit 752b4df. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Show Codex and Claude subscription usage limits in the UI

  • Adds probeClaudeUsageLimits to fetch Claude account identity and usage windows via --print /usage, with a 4s timeout and per-identity caching in ClaudeDriver.
  • Adds Codex rate limit fetching in probeCodexAppServerProvider via account/rateLimits/read with a 2s timeout.
  • Introduces usageLimitsFromCodexRateLimits and parseClaudeUsageLimitsJson in providerUsageLimits.ts to normalize provider-specific data into a shared ServerProviderUsageLimits contract shape.
  • Renders usage windows with progress bars and reset times in ProviderUsageRows and ProviderUsageSummary components, surfaced in the context window popover and provider settings panel.
  • Adds a showProviderUsageInContextPopover client setting (default false) to gate display of usage in the chat composer popover.

Macroscope summarized 752b4df.

@coderabbitai

coderabbitaiBot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8588ed13-1c59-432d-9fe2-dcccf0d2c48d

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/server/src/provider/providerUsageLimits.ts Outdated
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
@NicL9923
NicL9923 marked this pull request as ready for review July 23, 2026 03:13
@macroscopeapp

macroscopeappBot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new user-facing feature (provider usage limits display) with substantial new logic including external API response parsing, new UI components, and cross-layer integration. New features of this scope warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 071bb91 to f5305f0CompareJuly 24, 2026 02:08
Comment threadapps/server/src/provider/Layers/CodexProvider.ts
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from f5305f0 to a2649d8CompareJuly 24, 2026 02:11
Comment threadapps/web/src/components/chat/ContextWindowMeter.tsx
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
Comment threadapps/server/src/provider/providerUsageLimits.ts
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from a2649d8 to 81f671dCompareJuly 25, 2026 01:10
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jul 25, 2026
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 346301f to ba2f487CompareJuly 25, 2026 18:41
@NicL9923

Copy link
Copy Markdown
ContributorAuthor

@juliusmarminge could you or someone get some eyes on this please? I know, I know, but this functionality is legit the last major QoL thing for me (and at least a few others). Would (mostly) close out an OG issue too ;). More than happy to make any changes if needed quickly to get this in unless y'all just disagree with the entire concept, but I think I have something pretty sensible here

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/server/src/provider/providerUsageLimits.ts Outdated
@jo-chemla

Copy link
Copy Markdown

Would it also make sense to surface the same session/weekly usage progress-bars charts following a /usage command in chat? Currently only the raw claude-cli output is shown, adding the progress-bars would make it a lot more readable and similar to original providers desktop apps.

You are currently using your subscription to power your Claude Code usage
Current session: 59% used · resets Jul 31, 3:10pm (Europe/Paris)
Current week (all models): 54% used · resets Aug 4, 3:59am (Europe/Paris)
What's contributing to your limits usage?
Approximate, based on local sessions on this machine — does not include other devices or claude.ai. Behaviors are independent characteristics, not a breakdown.
...
---
<
charts
>

@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 0abc172 to 752b4dfCompareAugust 7, 2026 23:43

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 752b4df. Configure here.

],
{ concurrency: "unbounded" },
).pipe(
Effect.timeoutOption(USAGE_PROBE_TIMEOUT_MS),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Auth hang drops usage results

Medium Severity

probeClaudeUsageLimits applies one four-second timeoutOption around the combined /usage and auth statusEffect.all. If auth status is still running when that budget elapses, the whole probe is interrupted and successful /usage output is discarded, so limits disappear even though usage already completed.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 752b4df. Configure here.

@NicL9923

Copy link
Copy Markdown
ContributorAuthor

Closing in favor of #5684

@NicL9923NicL9923 closed this Aug 8, 2026
@dtown123

Copy link
Copy Markdown

Closing in favor of #5684

I love 5684, but it doesn't cover the use case here at all. Bummed

@dtown123

Copy link
Copy Markdown

#5739 does though! what a roller coaster of emotions

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: add usage / quota visibility for Codex sessions and accounts

3 participants

@NicL9923@jo-chemla@dtown123
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: show Codex and Claude usage limits - #4326

Closed
NicL9923 wants to merge 9 commits into
pingdotgg:mainfrom
NicL9923:feat/provider-usage-limits
Closed

feat: show Codex and Claude usage limits#4326
NicL9923 wants to merge 9 commits into
pingdotgg:mainfrom
NicL9923:feat/provider-usage-limits

Conversation

@NicL9923

@NicL9923NicL9923 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Fixes#228.

What Changed

Adds provider subscription usage visibility for Codex and Claude.

  • Extends provider snapshots with dynamic usage windows.
  • Reads Codex limits from the typed account/rateLimits/read app-server method.
  • Reads Claude limits from claude --print "/usage" --output-format json.
  • Shows a compact remaining-percentage summary on collapsed provider rows.
  • Shows full usage bars and reset timestamps in expanded provider details.
  • Adds an opt-in client setting to show the active thread provider's limits in the existing context-window popover.
  • Supports provider-specific windows, including Claude model-specific weekly limits.

Why

Provider limits are easy to exhaust without any explanation in T3 Code. Users currently have to leave the app and repeatedly run /usage or /status to understand why a session stopped responding or how much capacity remains.

Provider settings provide a consistent place to inspect limits. The optional chat presentation gives users who check frequently quicker access without changing what the context-window gauge represents.

Implementation Notes

  • Usage travels through the existing provider snapshot and config stream. No new transport or persistence layer was added.
  • Codex usage is requested concurrently with the existing app-server provider probe and only for ChatGPT subscription accounts.
  • Claude usage uses the existing Effect child-process abstraction rather than PTY or TUI automation.
  • Claude usage probes close stdin, disable user and claude.ai MCP servers, and are cached per provider instance for five minutes.
  • Usage retrieval is best-effort. A timeout, unsupported account type, or changed output format omits usage without degrading provider readiness.
  • The context-popover setting is client-local and defaults to off.

Out Of Scope

  • Grok, Cursor, and OpenCode usage
  • Credit balances, spend controls, and usage-based billing plans
  • Persistent usage caches
  • Interactive PTY/TUI scraping
  • Changes to provider refresh cadence
  • A separate usage ring or changes to what the context-window ring represents

This PR reports subscription rate-limit windows only. The Codex account/rateLimits/read response also carries credits, individualLimit, planType, spendControlReached, rateLimitReachedType, and a multi-bucket rateLimitsByLimitId view, none of which are read here.

Two consequences worth knowing: accounts on usage-based plans or running purely on credits show no usage rather than wrong usage, and a window that reads fully consumed does not by itself mean work is blocked when credits remain. Representing balances needs a currency-denominated contract shape rather than the current percent-only window, so it is left as a follow-up.

UI Changes

Settings > Providers

Collapsed provider rows show a compact summary such as:

Session 16% · Weekly (all models) 80% · Weekly (Fable) 68% remaining

Expanded provider details show the full progress bars and reset timestamps.

Before:

image

After:

imageimageimageimage

Optional context popover

When enabled under General settings, the context-window popover includes a visually separated Provider limits section.

Before:

image

After:

imageimage

Verification

  • Focused contracts/server/web tests: 112 passed
  • Contracts, server, and web typechecks passed (with three pre-existing upstream Effect suggestions outside this diff)
  • Targeted lint and formatting passed
  • Production web build passed
  • Manually verified against live ChatGPT Plus and Claude Max subscriptions
  • Confirmed Claude returns session, weekly-all-models, and model-specific weekly windows through the real Effect child-process path

Prior Work and Feedback

This builds on the original implementation work in #1732 by @Aditya190803 and the discussion in #228. @dtown123 also identified the current Claude JSON-envelope command used here.

The narrower implementation incorporates feedback from those threads by:

  • using the existing provider snapshot flow instead of a persistence/repository refresh loop
  • limiting support to reliable Codex and Claude sources rather than speculative Cursor/OpenCode or interactive Grok probing
  • showing reset timestamps and explicitly labeling percentages as remaining
  • supporting dynamic Claude buckets such as model-specific weekly limits
  • keeping the chat presentation opt-in and visually separate from context-window usage
  • caching successful identity-matched probes per instance, expiring failures immediately, and skipping subscription usage for API-key/Bedrock auth
  • using the existing Effect child-process abstraction with scoped cancellation, closed stdin, no MCP startup, and the configured workspace cwd

Reviewer Notes

Claude Code currently returns usage as human-readable text inside a JSON result envelope. The parser intentionally fails closed: malformed JSON, changed output text, non-zero exits, and timeouts omit usage without changing provider health.

An independent Claude Opus 4.8 review found and prompted fixes for:

  • uncached Claude usage probes
  • unnecessary Codex rate-limit requests for non-subscription auth
  • progressbar accessibility semantics
  • missing Codex and Claude API-key integration coverage

A second Opus 4.8 review found no remaining blocking issues. Residual risk is limited to upstream Claude /usage wording changes, which fail closed.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Adds best-effort child-process and app-server probes on provider health checks; failures are isolated but Claude output parsing is brittle if upstream wording changes.

Overview
Adds subscription rate-limit visibility for Codex and Claude by extending provider snapshots with usageLimits (dynamic windows with used %, optional reset times) and surfacing them in Settings and optionally in chat.

Server: Codex probes account/rateLimits/read for ChatGPT accounts (2s timeout, concurrent with existing app-server probe). Claude runs --print /usage JSON plus auth status --json, parses human-readable output via providerUsageLimits, skips API key/Bedrock, verifies email against capabilities, and caches probes per instance in ClaudeDriver (5 min on success, immediate expiry on failure).

Contracts: New ServerProviderUsageLimits / window schema on ServerProvider; client setting showProviderUsageInContextPopover (default off).

Web:ProviderUsageRows / summary on provider cards; context-window popover can show a separated “Provider limits” section when the setting is enabled, keyed to the active thread’s provider instance.

Reviewed by Cursor Bugbot for commit 752b4df. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Show Codex and Claude subscription usage limits in the UI

  • Adds probeClaudeUsageLimits to fetch Claude account identity and usage windows via --print /usage, with a 4s timeout and per-identity caching in ClaudeDriver.
  • Adds Codex rate limit fetching in probeCodexAppServerProvider via account/rateLimits/read with a 2s timeout.
  • Introduces usageLimitsFromCodexRateLimits and parseClaudeUsageLimitsJson in providerUsageLimits.ts to normalize provider-specific data into a shared ServerProviderUsageLimits contract shape.
  • Renders usage windows with progress bars and reset times in ProviderUsageRows and ProviderUsageSummary components, surfaced in the context window popover and provider settings panel.
  • Adds a showProviderUsageInContextPopover client setting (default false) to gate display of usage in the chat composer popover.

Macroscope summarized 752b4df.

@coderabbitai

coderabbitaiBot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8588ed13-1c59-432d-9fe2-dcccf0d2c48d

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/server/src/provider/providerUsageLimits.ts Outdated
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
@NicL9923
NicL9923 marked this pull request as ready for review July 23, 2026 03:13
@macroscopeapp

macroscopeappBot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new user-facing feature (provider usage limits display) with substantial new logic including external API response parsing, new UI components, and cross-layer integration. New features of this scope warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 071bb91 to f5305f0CompareJuly 24, 2026 02:08
Comment threadapps/server/src/provider/Layers/CodexProvider.ts
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from f5305f0 to a2649d8CompareJuly 24, 2026 02:11
Comment threadapps/web/src/components/chat/ContextWindowMeter.tsx
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
Comment threadapps/server/src/provider/providerUsageLimits.ts
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from a2649d8 to 81f671dCompareJuly 25, 2026 01:10
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
Comment threadapps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jul 25, 2026
@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 346301f to ba2f487CompareJuly 25, 2026 18:41
@NicL9923

Copy link
Copy Markdown
ContributorAuthor

@juliusmarminge could you or someone get some eyes on this please? I know, I know, but this functionality is legit the last major QoL thing for me (and at least a few others). Would (mostly) close out an OG issue too ;). More than happy to make any changes if needed quickly to get this in unless y'all just disagree with the entire concept, but I think I have something pretty sensible here

Comment threadapps/web/src/components/chat/ChatComposer.tsx
Comment threadapps/server/src/provider/providerUsageLimits.ts Outdated
@jo-chemla

Copy link
Copy Markdown

Would it also make sense to surface the same session/weekly usage progress-bars charts following a /usage command in chat? Currently only the raw claude-cli output is shown, adding the progress-bars would make it a lot more readable and similar to original providers desktop apps.

You are currently using your subscription to power your Claude Code usage
Current session: 59% used · resets Jul 31, 3:10pm (Europe/Paris)
Current week (all models): 54% used · resets Aug 4, 3:59am (Europe/Paris)
What's contributing to your limits usage?
Approximate, based on local sessions on this machine — does not include other devices or claude.ai. Behaviors are independent characteristics, not a breakdown.
...
---
<
charts
>

@NicL9923
NicL9923force-pushed the feat/provider-usage-limits branch from 0abc172 to 752b4dfCompareAugust 7, 2026 23:43

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 752b4df. Configure here.

],
{ concurrency: "unbounded" },
).pipe(
Effect.timeoutOption(USAGE_PROBE_TIMEOUT_MS),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Auth hang drops usage results

Medium Severity

probeClaudeUsageLimits applies one four-second timeoutOption around the combined /usage and auth statusEffect.all. If auth status is still running when that budget elapses, the whole probe is interrupted and successful /usage output is discarded, so limits disappear even though usage already completed.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 752b4df. Configure here.

@NicL9923

Copy link
Copy Markdown
ContributorAuthor

Closing in favor of #5684

@NicL9923NicL9923 closed this Aug 8, 2026
@dtown123

Copy link
Copy Markdown

Closing in favor of #5684

I love 5684, but it doesn't cover the use case here at all. Bummed

@dtown123

Copy link
Copy Markdown

#5739 does though! what a roller coaster of emotions

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: add usage / quota visibility for Codex sessions and accounts

3 participants

@NicL9923@jo-chemla@dtown123