feat: track provider usage and project weekly quota - #1605

Closed
Aditya190803 wants to merge 12 commits into
pingdotgg:mainfrom
Aditya190803:feat/weekly-usage
Closed

feat: track provider usage and project weekly quota#1605
Aditya190803 wants to merge 12 commits into
pingdotgg:mainfrom
Aditya190803:feat/weekly-usage

Conversation

@Aditya190803

@Aditya190803Aditya190803 commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Added provider usage normalization and merge utilities for Codex/Claude quota payloads.
  • Extended provider snapshots and websocket config/update flow to carry normalized usage buckets.
  • Fixed usage percent math to avoid double-scaling low percentages derived from usage/limit.
  • Fixed usage cache merge behavior so stale cached usage is dropped when a newer provider snapshot omits usage.
  • Added/updated tests covering usage normalization, merge behavior, and stale cache handling.

Why

Issue #228 asks for accurate quota visibility. This PR adds provider usage projection and makes it robust under incremental updates so UI quota values stay correct. The follow-up fixes address reviewer-reported edge cases that could misreport low usage percentages or retain stale usage after newer snapshots.

UI Changes

  • Settings provider quota bars now render normalized usage/reset data from provider snapshots.
  • No layout redesign.

Checklist

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

Closes#228

Note

Track provider rate limit usage and display weekly quota in settings

  • Adds ServerProviderUsage contract with fiveHour and weekly buckets, normalizing rate-limit payloads from both Claude and Codex providers into a standard shape via normalizeProviderUsageFromRateLimits in providerUsage.ts.
  • Extends Claude and Codex provider status probes to collect account metadata and rate-limit snapshots, attaching account, rateLimits, and usage fields to provider snapshots.
  • Adds probeCodexAccountState in codexAppServer.ts to request account/rateLimits/read alongside account data, with a grace window for missing rate-limit responses.
  • Renders a ProviderUsageRows component in the settings panel showing a progress bar, remaining percentage, and reset timestamp for each provider quota bucket.
  • Client in serverState.ts now eagerly requests a provider refresh on config snapshot receipt, applying results immediately without waiting for stream updates.

Macroscope summarized c44983f.


Note

Medium Risk
Medium risk because it extends provider probing/status snapshots and client refresh behavior, which can affect provider startup/perf and the accuracy of displayed quota data across Codex/Claude.

Overview
Adds first-class provider quota tracking by introducing ServerProviderUsage (with normalized fiveHour/weekly buckets) and wiring it through provider status snapshots.

Updates Codex and Claude provider probes to collect account metadata plus rate-limit payloads, normalize them into usage, and include these fields on ServerProvider snapshots; Codex’s app-server probe now requests account/rateLimits/read with a short grace window for missing responses.

Surfaces the data in the web settings UI via quota progress rows, and updates the client to eagerly call refreshProviders() on initial config load/snapshot so quota/usage appears without waiting for stream updates. Tests are added/updated across contracts, provider registry/probes, ingestion activity projection, and usage normalization/merge edge cases.

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

@coderabbitai

coderabbitaiBot commented Mar 31, 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

Run ID: d3cfd9df-b826-4476-b7a1-fb3de2204c9d

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 and usage tips.

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 31, 2026
@Aditya190803
Aditya190803 marked this pull request as draft March 31, 2026 11:08
@Aditya190803
Aditya190803 marked this pull request as ready for review March 31, 2026 11:13
Comment threadapps/server/src/provider/providerUsage.ts

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:11eab91d87

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/server/src/wsServer.ts Outdated
Comment on lines +137 to +140
const mergedUsage = mergeProviderUsage(cachedUsage, provider.usage);
if (mergedUsage !== undefined) {
nextCache[provider.provider] = mergedUsage;
continue;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Drop stale usage cache when provider snapshot has no usage

In mergeUsageCacheFromProviders, stale entries are never evicted because mergeProviderUsage(cachedUsage, provider.usage) returns cachedUsage whenever the new snapshot omits usage, so the mergedUsage !== undefined branch always keeps the cache and bypasses shouldKeepCachedUsage. This means a newer provider snapshot (checkedAt later than cached updatedAt) can still be served with outdated quota buckets via serverGetConfig and server.providersUpdated.

Useful? React with 👍 / 👎.

Comment on lines +76 to +77
if (limit !== null && limit > 0) {
return normalizePercent((usage / limit) * 100);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Avoid double-scaling low usage percentages

derivePercentFromUsage converts absolute usage to percent with (usage / limit) * 100, then passes that result to normalizePercent, which multiplies any value <= 1 by 100 again. For low-but-valid percentages (for example usage=1, limit=1000), this reports 10% instead of 0.1%, causing major quota misreporting near the start of a window.

Useful? React with 👍 / 👎.

Comment threadapps/server/src/wsServer.ts Outdated
Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/codexAppServer.ts
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Apr 1, 2026
Comment threadapps/server/src/provider/codexAppServer.test.ts
@Aditya190803

Copy link
Copy Markdown
ContributorAuthor

I cleaned up the branch history to reduce review noise and make the change set easier to reason about.

What changed:

  1. Rebased onto latest main.
  2. Removed merge/sync churn from feature history.
  3. Squashed follow-up fixups into logical commits.
  4. Kept implementation scope unchanged (no new feature surface beyond already discussed fixes).

Current commit structure:

  1. feat(contracts): add normalized provider usage and quota bucket schemas
  2. feat(server): normalize provider rate-limit usage and stabilize usage cache updates
  3. feat(web): render provider quota usage buckets in settings

Behavior/correctness included in this cleaned history:

  1. Fix low-percent double-scaling risk in usage normalization.
  2. Drop stale cached usage when newer provider snapshots omit usage.
  3. Clamp over-limit utilization and suppress no-op provider update pushes.
  4. Preserve tests across contracts/server/web for quota projection and cache behavior.

Validation run locally:

  1. bun fmt
  2. bun lint
  3. bun typecheck

No functional intent change; this is primarily a history hygiene pass for clearer review.

@juliusmarminge

Copy link
Copy Markdown
Member

Please add screenshots

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Apr 1, 2026
Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/providerUsage.ts Outdated
Comment threadapps/server/src/provider/providerUsage.ts Outdated
@macroscopeapp

macroscopeappBot commented Apr 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces substantial new functionality for tracking and displaying provider usage quotas across Claude and Codex providers. There are unresolved review comments identifying potential bugs in usage percentage calculations and cache staleness handling that warrant human attention before merging.

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

Comment threadapps/server/src/provider/providerUsage.ts

@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 and found 2 potential issues.

Fix All in Cursor

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

Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/providerUsage.ts
@Aditya190803

Copy link
Copy Markdown
ContributorAuthor

@juliusmarminge this branch got pretty janky and inconsistent so i rebuilt it cleanly

new PR here: #1732

closing this one to avoid confusion

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

2 participants

@Aditya190803@juliusmarminge
, '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: track provider usage and project weekly quota - #1605

Closed
Aditya190803 wants to merge 12 commits into
pingdotgg:mainfrom
Aditya190803:feat/weekly-usage
Closed

feat: track provider usage and project weekly quota#1605
Aditya190803 wants to merge 12 commits into
pingdotgg:mainfrom
Aditya190803:feat/weekly-usage

Conversation

@Aditya190803

@Aditya190803Aditya190803 commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Added provider usage normalization and merge utilities for Codex/Claude quota payloads.
  • Extended provider snapshots and websocket config/update flow to carry normalized usage buckets.
  • Fixed usage percent math to avoid double-scaling low percentages derived from usage/limit.
  • Fixed usage cache merge behavior so stale cached usage is dropped when a newer provider snapshot omits usage.
  • Added/updated tests covering usage normalization, merge behavior, and stale cache handling.

Why

Issue #228 asks for accurate quota visibility. This PR adds provider usage projection and makes it robust under incremental updates so UI quota values stay correct. The follow-up fixes address reviewer-reported edge cases that could misreport low usage percentages or retain stale usage after newer snapshots.

UI Changes

  • Settings provider quota bars now render normalized usage/reset data from provider snapshots.
  • No layout redesign.

Checklist

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

Closes#228

Note

Track provider rate limit usage and display weekly quota in settings

  • Adds ServerProviderUsage contract with fiveHour and weekly buckets, normalizing rate-limit payloads from both Claude and Codex providers into a standard shape via normalizeProviderUsageFromRateLimits in providerUsage.ts.
  • Extends Claude and Codex provider status probes to collect account metadata and rate-limit snapshots, attaching account, rateLimits, and usage fields to provider snapshots.
  • Adds probeCodexAccountState in codexAppServer.ts to request account/rateLimits/read alongside account data, with a grace window for missing rate-limit responses.
  • Renders a ProviderUsageRows component in the settings panel showing a progress bar, remaining percentage, and reset timestamp for each provider quota bucket.
  • Client in serverState.ts now eagerly requests a provider refresh on config snapshot receipt, applying results immediately without waiting for stream updates.

Macroscope summarized c44983f.


Note

Medium Risk
Medium risk because it extends provider probing/status snapshots and client refresh behavior, which can affect provider startup/perf and the accuracy of displayed quota data across Codex/Claude.

Overview
Adds first-class provider quota tracking by introducing ServerProviderUsage (with normalized fiveHour/weekly buckets) and wiring it through provider status snapshots.

Updates Codex and Claude provider probes to collect account metadata plus rate-limit payloads, normalize them into usage, and include these fields on ServerProvider snapshots; Codex’s app-server probe now requests account/rateLimits/read with a short grace window for missing responses.

Surfaces the data in the web settings UI via quota progress rows, and updates the client to eagerly call refreshProviders() on initial config load/snapshot so quota/usage appears without waiting for stream updates. Tests are added/updated across contracts, provider registry/probes, ingestion activity projection, and usage normalization/merge edge cases.

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

@coderabbitai

coderabbitaiBot commented Mar 31, 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

Run ID: d3cfd9df-b826-4476-b7a1-fb3de2204c9d

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 and usage tips.

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 31, 2026
@Aditya190803
Aditya190803 marked this pull request as draft March 31, 2026 11:08
@Aditya190803
Aditya190803 marked this pull request as ready for review March 31, 2026 11:13
Comment threadapps/server/src/provider/providerUsage.ts

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:11eab91d87

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/server/src/wsServer.ts Outdated
Comment on lines +137 to +140
const mergedUsage = mergeProviderUsage(cachedUsage, provider.usage);
if (mergedUsage !== undefined) {
nextCache[provider.provider] = mergedUsage;
continue;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Drop stale usage cache when provider snapshot has no usage

In mergeUsageCacheFromProviders, stale entries are never evicted because mergeProviderUsage(cachedUsage, provider.usage) returns cachedUsage whenever the new snapshot omits usage, so the mergedUsage !== undefined branch always keeps the cache and bypasses shouldKeepCachedUsage. This means a newer provider snapshot (checkedAt later than cached updatedAt) can still be served with outdated quota buckets via serverGetConfig and server.providersUpdated.

Useful? React with 👍 / 👎.

Comment on lines +76 to +77
if (limit !== null && limit > 0) {
return normalizePercent((usage / limit) * 100);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Avoid double-scaling low usage percentages

derivePercentFromUsage converts absolute usage to percent with (usage / limit) * 100, then passes that result to normalizePercent, which multiplies any value <= 1 by 100 again. For low-but-valid percentages (for example usage=1, limit=1000), this reports 10% instead of 0.1%, causing major quota misreporting near the start of a window.

Useful? React with 👍 / 👎.

Comment threadapps/server/src/wsServer.ts Outdated
Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/codexAppServer.ts
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Apr 1, 2026
Comment threadapps/server/src/provider/codexAppServer.test.ts
@Aditya190803

Copy link
Copy Markdown
ContributorAuthor

I cleaned up the branch history to reduce review noise and make the change set easier to reason about.

What changed:

  1. Rebased onto latest main.
  2. Removed merge/sync churn from feature history.
  3. Squashed follow-up fixups into logical commits.
  4. Kept implementation scope unchanged (no new feature surface beyond already discussed fixes).

Current commit structure:

  1. feat(contracts): add normalized provider usage and quota bucket schemas
  2. feat(server): normalize provider rate-limit usage and stabilize usage cache updates
  3. feat(web): render provider quota usage buckets in settings

Behavior/correctness included in this cleaned history:

  1. Fix low-percent double-scaling risk in usage normalization.
  2. Drop stale cached usage when newer provider snapshots omit usage.
  3. Clamp over-limit utilization and suppress no-op provider update pushes.
  4. Preserve tests across contracts/server/web for quota projection and cache behavior.

Validation run locally:

  1. bun fmt
  2. bun lint
  3. bun typecheck

No functional intent change; this is primarily a history hygiene pass for clearer review.

@juliusmarminge

Copy link
Copy Markdown
Member

Please add screenshots

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Apr 1, 2026
Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/providerUsage.ts Outdated
Comment threadapps/server/src/provider/providerUsage.ts Outdated
@macroscopeapp

macroscopeappBot commented Apr 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces substantial new functionality for tracking and displaying provider usage quotas across Claude and Codex providers. There are unresolved review comments identifying potential bugs in usage percentage calculations and cache staleness handling that warrant human attention before merging.

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

Comment threadapps/server/src/provider/providerUsage.ts

@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 and found 2 potential issues.

Fix All in Cursor

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

Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/providerUsage.ts
@Aditya190803

Copy link
Copy Markdown
ContributorAuthor

@juliusmarminge this branch got pretty janky and inconsistent so i rebuilt it cleanly

new PR here: #1732

closing this one to avoid confusion

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

2 participants

@Aditya190803@juliusmarminge
, '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: track provider usage and project weekly quota - #1605

Closed
Aditya190803 wants to merge 12 commits into
pingdotgg:mainfrom
Aditya190803:feat/weekly-usage
Closed

feat: track provider usage and project weekly quota#1605
Aditya190803 wants to merge 12 commits into
pingdotgg:mainfrom
Aditya190803:feat/weekly-usage

Conversation

@Aditya190803

@Aditya190803Aditya190803 commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Added provider usage normalization and merge utilities for Codex/Claude quota payloads.
  • Extended provider snapshots and websocket config/update flow to carry normalized usage buckets.
  • Fixed usage percent math to avoid double-scaling low percentages derived from usage/limit.
  • Fixed usage cache merge behavior so stale cached usage is dropped when a newer provider snapshot omits usage.
  • Added/updated tests covering usage normalization, merge behavior, and stale cache handling.

Why

Issue #228 asks for accurate quota visibility. This PR adds provider usage projection and makes it robust under incremental updates so UI quota values stay correct. The follow-up fixes address reviewer-reported edge cases that could misreport low usage percentages or retain stale usage after newer snapshots.

UI Changes

  • Settings provider quota bars now render normalized usage/reset data from provider snapshots.
  • No layout redesign.

Checklist

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

Closes#228

Note

Track provider rate limit usage and display weekly quota in settings

  • Adds ServerProviderUsage contract with fiveHour and weekly buckets, normalizing rate-limit payloads from both Claude and Codex providers into a standard shape via normalizeProviderUsageFromRateLimits in providerUsage.ts.
  • Extends Claude and Codex provider status probes to collect account metadata and rate-limit snapshots, attaching account, rateLimits, and usage fields to provider snapshots.
  • Adds probeCodexAccountState in codexAppServer.ts to request account/rateLimits/read alongside account data, with a grace window for missing rate-limit responses.
  • Renders a ProviderUsageRows component in the settings panel showing a progress bar, remaining percentage, and reset timestamp for each provider quota bucket.
  • Client in serverState.ts now eagerly requests a provider refresh on config snapshot receipt, applying results immediately without waiting for stream updates.

Macroscope summarized c44983f.


Note

Medium Risk
Medium risk because it extends provider probing/status snapshots and client refresh behavior, which can affect provider startup/perf and the accuracy of displayed quota data across Codex/Claude.

Overview
Adds first-class provider quota tracking by introducing ServerProviderUsage (with normalized fiveHour/weekly buckets) and wiring it through provider status snapshots.

Updates Codex and Claude provider probes to collect account metadata plus rate-limit payloads, normalize them into usage, and include these fields on ServerProvider snapshots; Codex’s app-server probe now requests account/rateLimits/read with a short grace window for missing responses.

Surfaces the data in the web settings UI via quota progress rows, and updates the client to eagerly call refreshProviders() on initial config load/snapshot so quota/usage appears without waiting for stream updates. Tests are added/updated across contracts, provider registry/probes, ingestion activity projection, and usage normalization/merge edge cases.

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

@coderabbitai

coderabbitaiBot commented Mar 31, 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

Run ID: d3cfd9df-b826-4476-b7a1-fb3de2204c9d

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 and usage tips.

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 31, 2026
@Aditya190803
Aditya190803 marked this pull request as draft March 31, 2026 11:08
@Aditya190803
Aditya190803 marked this pull request as ready for review March 31, 2026 11:13
Comment threadapps/server/src/provider/providerUsage.ts

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:11eab91d87

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/server/src/wsServer.ts Outdated
Comment on lines +137 to +140
const mergedUsage = mergeProviderUsage(cachedUsage, provider.usage);
if (mergedUsage !== undefined) {
nextCache[provider.provider] = mergedUsage;
continue;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Drop stale usage cache when provider snapshot has no usage

In mergeUsageCacheFromProviders, stale entries are never evicted because mergeProviderUsage(cachedUsage, provider.usage) returns cachedUsage whenever the new snapshot omits usage, so the mergedUsage !== undefined branch always keeps the cache and bypasses shouldKeepCachedUsage. This means a newer provider snapshot (checkedAt later than cached updatedAt) can still be served with outdated quota buckets via serverGetConfig and server.providersUpdated.

Useful? React with 👍 / 👎.

Comment on lines +76 to +77
if (limit !== null && limit > 0) {
return normalizePercent((usage / limit) * 100);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Avoid double-scaling low usage percentages

derivePercentFromUsage converts absolute usage to percent with (usage / limit) * 100, then passes that result to normalizePercent, which multiplies any value <= 1 by 100 again. For low-but-valid percentages (for example usage=1, limit=1000), this reports 10% instead of 0.1%, causing major quota misreporting near the start of a window.

Useful? React with 👍 / 👎.

Comment threadapps/server/src/wsServer.ts Outdated
Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/codexAppServer.ts
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Apr 1, 2026
Comment threadapps/server/src/provider/codexAppServer.test.ts
@Aditya190803

Copy link
Copy Markdown
ContributorAuthor

I cleaned up the branch history to reduce review noise and make the change set easier to reason about.

What changed:

  1. Rebased onto latest main.
  2. Removed merge/sync churn from feature history.
  3. Squashed follow-up fixups into logical commits.
  4. Kept implementation scope unchanged (no new feature surface beyond already discussed fixes).

Current commit structure:

  1. feat(contracts): add normalized provider usage and quota bucket schemas
  2. feat(server): normalize provider rate-limit usage and stabilize usage cache updates
  3. feat(web): render provider quota usage buckets in settings

Behavior/correctness included in this cleaned history:

  1. Fix low-percent double-scaling risk in usage normalization.
  2. Drop stale cached usage when newer provider snapshots omit usage.
  3. Clamp over-limit utilization and suppress no-op provider update pushes.
  4. Preserve tests across contracts/server/web for quota projection and cache behavior.

Validation run locally:

  1. bun fmt
  2. bun lint
  3. bun typecheck

No functional intent change; this is primarily a history hygiene pass for clearer review.

@juliusmarminge

Copy link
Copy Markdown
Member

Please add screenshots

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Apr 1, 2026
Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/providerUsage.ts Outdated
Comment threadapps/server/src/provider/providerUsage.ts Outdated
@macroscopeapp

macroscopeappBot commented Apr 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces substantial new functionality for tracking and displaying provider usage quotas across Claude and Codex providers. There are unresolved review comments identifying potential bugs in usage percentage calculations and cache staleness handling that warrant human attention before merging.

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

Comment threadapps/server/src/provider/providerUsage.ts

@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 and found 2 potential issues.

Fix All in Cursor

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

Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/providerUsage.ts
@Aditya190803

Copy link
Copy Markdown
ContributorAuthor

@juliusmarminge this branch got pretty janky and inconsistent so i rebuilt it cleanly

new PR here: #1732

closing this one to avoid confusion

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

2 participants

@Aditya190803@juliusmarminge
, '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: track provider usage and project weekly quota - #1605

Closed
Aditya190803 wants to merge 12 commits into
pingdotgg:mainfrom
Aditya190803:feat/weekly-usage
Closed

feat: track provider usage and project weekly quota#1605
Aditya190803 wants to merge 12 commits into
pingdotgg:mainfrom
Aditya190803:feat/weekly-usage

Conversation

@Aditya190803

@Aditya190803Aditya190803 commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Added provider usage normalization and merge utilities for Codex/Claude quota payloads.
  • Extended provider snapshots and websocket config/update flow to carry normalized usage buckets.
  • Fixed usage percent math to avoid double-scaling low percentages derived from usage/limit.
  • Fixed usage cache merge behavior so stale cached usage is dropped when a newer provider snapshot omits usage.
  • Added/updated tests covering usage normalization, merge behavior, and stale cache handling.

Why

Issue #228 asks for accurate quota visibility. This PR adds provider usage projection and makes it robust under incremental updates so UI quota values stay correct. The follow-up fixes address reviewer-reported edge cases that could misreport low usage percentages or retain stale usage after newer snapshots.

UI Changes

  • Settings provider quota bars now render normalized usage/reset data from provider snapshots.
  • No layout redesign.

Checklist

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

Closes#228

Note

Track provider rate limit usage and display weekly quota in settings

  • Adds ServerProviderUsage contract with fiveHour and weekly buckets, normalizing rate-limit payloads from both Claude and Codex providers into a standard shape via normalizeProviderUsageFromRateLimits in providerUsage.ts.
  • Extends Claude and Codex provider status probes to collect account metadata and rate-limit snapshots, attaching account, rateLimits, and usage fields to provider snapshots.
  • Adds probeCodexAccountState in codexAppServer.ts to request account/rateLimits/read alongside account data, with a grace window for missing rate-limit responses.
  • Renders a ProviderUsageRows component in the settings panel showing a progress bar, remaining percentage, and reset timestamp for each provider quota bucket.
  • Client in serverState.ts now eagerly requests a provider refresh on config snapshot receipt, applying results immediately without waiting for stream updates.

Macroscope summarized c44983f.


Note

Medium Risk
Medium risk because it extends provider probing/status snapshots and client refresh behavior, which can affect provider startup/perf and the accuracy of displayed quota data across Codex/Claude.

Overview
Adds first-class provider quota tracking by introducing ServerProviderUsage (with normalized fiveHour/weekly buckets) and wiring it through provider status snapshots.

Updates Codex and Claude provider probes to collect account metadata plus rate-limit payloads, normalize them into usage, and include these fields on ServerProvider snapshots; Codex’s app-server probe now requests account/rateLimits/read with a short grace window for missing responses.

Surfaces the data in the web settings UI via quota progress rows, and updates the client to eagerly call refreshProviders() on initial config load/snapshot so quota/usage appears without waiting for stream updates. Tests are added/updated across contracts, provider registry/probes, ingestion activity projection, and usage normalization/merge edge cases.

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

@coderabbitai

coderabbitaiBot commented Mar 31, 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

Run ID: d3cfd9df-b826-4476-b7a1-fb3de2204c9d

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 and usage tips.

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 31, 2026
@Aditya190803
Aditya190803 marked this pull request as draft March 31, 2026 11:08
@Aditya190803
Aditya190803 marked this pull request as ready for review March 31, 2026 11:13
Comment threadapps/server/src/provider/providerUsage.ts

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:11eab91d87

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/server/src/wsServer.ts Outdated
Comment on lines +137 to +140
const mergedUsage = mergeProviderUsage(cachedUsage, provider.usage);
if (mergedUsage !== undefined) {
nextCache[provider.provider] = mergedUsage;
continue;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Drop stale usage cache when provider snapshot has no usage

In mergeUsageCacheFromProviders, stale entries are never evicted because mergeProviderUsage(cachedUsage, provider.usage) returns cachedUsage whenever the new snapshot omits usage, so the mergedUsage !== undefined branch always keeps the cache and bypasses shouldKeepCachedUsage. This means a newer provider snapshot (checkedAt later than cached updatedAt) can still be served with outdated quota buckets via serverGetConfig and server.providersUpdated.

Useful? React with 👍 / 👎.

Comment on lines +76 to +77
if (limit !== null && limit > 0) {
return normalizePercent((usage / limit) * 100);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Avoid double-scaling low usage percentages

derivePercentFromUsage converts absolute usage to percent with (usage / limit) * 100, then passes that result to normalizePercent, which multiplies any value <= 1 by 100 again. For low-but-valid percentages (for example usage=1, limit=1000), this reports 10% instead of 0.1%, causing major quota misreporting near the start of a window.

Useful? React with 👍 / 👎.

Comment threadapps/server/src/wsServer.ts Outdated
Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/codexAppServer.ts
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Apr 1, 2026
Comment threadapps/server/src/provider/codexAppServer.test.ts
@Aditya190803

Copy link
Copy Markdown
ContributorAuthor

I cleaned up the branch history to reduce review noise and make the change set easier to reason about.

What changed:

  1. Rebased onto latest main.
  2. Removed merge/sync churn from feature history.
  3. Squashed follow-up fixups into logical commits.
  4. Kept implementation scope unchanged (no new feature surface beyond already discussed fixes).

Current commit structure:

  1. feat(contracts): add normalized provider usage and quota bucket schemas
  2. feat(server): normalize provider rate-limit usage and stabilize usage cache updates
  3. feat(web): render provider quota usage buckets in settings

Behavior/correctness included in this cleaned history:

  1. Fix low-percent double-scaling risk in usage normalization.
  2. Drop stale cached usage when newer provider snapshots omit usage.
  3. Clamp over-limit utilization and suppress no-op provider update pushes.
  4. Preserve tests across contracts/server/web for quota projection and cache behavior.

Validation run locally:

  1. bun fmt
  2. bun lint
  3. bun typecheck

No functional intent change; this is primarily a history hygiene pass for clearer review.

@juliusmarminge

Copy link
Copy Markdown
Member

Please add screenshots

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Apr 1, 2026
Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/providerUsage.ts Outdated
Comment threadapps/server/src/provider/providerUsage.ts Outdated
@macroscopeapp

macroscopeappBot commented Apr 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces substantial new functionality for tracking and displaying provider usage quotas across Claude and Codex providers. There are unresolved review comments identifying potential bugs in usage percentage calculations and cache staleness handling that warrant human attention before merging.

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

Comment threadapps/server/src/provider/providerUsage.ts

@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 and found 2 potential issues.

Fix All in Cursor

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

Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/providerUsage.ts
@Aditya190803

Copy link
Copy Markdown
ContributorAuthor

@juliusmarminge this branch got pretty janky and inconsistent so i rebuilt it cleanly

new PR here: #1732

closing this one to avoid confusion

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

2 participants

@Aditya190803@juliusmarminge
, '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: track provider usage and project weekly quota - #1605

Closed
Aditya190803 wants to merge 12 commits into
pingdotgg:mainfrom
Aditya190803:feat/weekly-usage
Closed

feat: track provider usage and project weekly quota#1605
Aditya190803 wants to merge 12 commits into
pingdotgg:mainfrom
Aditya190803:feat/weekly-usage

Conversation

@Aditya190803

@Aditya190803Aditya190803 commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Added provider usage normalization and merge utilities for Codex/Claude quota payloads.
  • Extended provider snapshots and websocket config/update flow to carry normalized usage buckets.
  • Fixed usage percent math to avoid double-scaling low percentages derived from usage/limit.
  • Fixed usage cache merge behavior so stale cached usage is dropped when a newer provider snapshot omits usage.
  • Added/updated tests covering usage normalization, merge behavior, and stale cache handling.

Why

Issue #228 asks for accurate quota visibility. This PR adds provider usage projection and makes it robust under incremental updates so UI quota values stay correct. The follow-up fixes address reviewer-reported edge cases that could misreport low usage percentages or retain stale usage after newer snapshots.

UI Changes

  • Settings provider quota bars now render normalized usage/reset data from provider snapshots.
  • No layout redesign.

Checklist

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

Closes#228

Note

Track provider rate limit usage and display weekly quota in settings

  • Adds ServerProviderUsage contract with fiveHour and weekly buckets, normalizing rate-limit payloads from both Claude and Codex providers into a standard shape via normalizeProviderUsageFromRateLimits in providerUsage.ts.
  • Extends Claude and Codex provider status probes to collect account metadata and rate-limit snapshots, attaching account, rateLimits, and usage fields to provider snapshots.
  • Adds probeCodexAccountState in codexAppServer.ts to request account/rateLimits/read alongside account data, with a grace window for missing rate-limit responses.
  • Renders a ProviderUsageRows component in the settings panel showing a progress bar, remaining percentage, and reset timestamp for each provider quota bucket.
  • Client in serverState.ts now eagerly requests a provider refresh on config snapshot receipt, applying results immediately without waiting for stream updates.

Macroscope summarized c44983f.


Note

Medium Risk
Medium risk because it extends provider probing/status snapshots and client refresh behavior, which can affect provider startup/perf and the accuracy of displayed quota data across Codex/Claude.

Overview
Adds first-class provider quota tracking by introducing ServerProviderUsage (with normalized fiveHour/weekly buckets) and wiring it through provider status snapshots.

Updates Codex and Claude provider probes to collect account metadata plus rate-limit payloads, normalize them into usage, and include these fields on ServerProvider snapshots; Codex’s app-server probe now requests account/rateLimits/read with a short grace window for missing responses.

Surfaces the data in the web settings UI via quota progress rows, and updates the client to eagerly call refreshProviders() on initial config load/snapshot so quota/usage appears without waiting for stream updates. Tests are added/updated across contracts, provider registry/probes, ingestion activity projection, and usage normalization/merge edge cases.

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

@coderabbitai

coderabbitaiBot commented Mar 31, 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

Run ID: d3cfd9df-b826-4476-b7a1-fb3de2204c9d

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 and usage tips.

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 31, 2026
@Aditya190803
Aditya190803 marked this pull request as draft March 31, 2026 11:08
@Aditya190803
Aditya190803 marked this pull request as ready for review March 31, 2026 11:13
Comment threadapps/server/src/provider/providerUsage.ts

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:11eab91d87

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/server/src/wsServer.ts Outdated
Comment on lines +137 to +140
const mergedUsage = mergeProviderUsage(cachedUsage, provider.usage);
if (mergedUsage !== undefined) {
nextCache[provider.provider] = mergedUsage;
continue;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Drop stale usage cache when provider snapshot has no usage

In mergeUsageCacheFromProviders, stale entries are never evicted because mergeProviderUsage(cachedUsage, provider.usage) returns cachedUsage whenever the new snapshot omits usage, so the mergedUsage !== undefined branch always keeps the cache and bypasses shouldKeepCachedUsage. This means a newer provider snapshot (checkedAt later than cached updatedAt) can still be served with outdated quota buckets via serverGetConfig and server.providersUpdated.

Useful? React with 👍 / 👎.

Comment on lines +76 to +77
if (limit !== null && limit > 0) {
return normalizePercent((usage / limit) * 100);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Avoid double-scaling low usage percentages

derivePercentFromUsage converts absolute usage to percent with (usage / limit) * 100, then passes that result to normalizePercent, which multiplies any value <= 1 by 100 again. For low-but-valid percentages (for example usage=1, limit=1000), this reports 10% instead of 0.1%, causing major quota misreporting near the start of a window.

Useful? React with 👍 / 👎.

Comment threadapps/server/src/wsServer.ts Outdated
Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/codexAppServer.ts
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Apr 1, 2026
Comment threadapps/server/src/provider/codexAppServer.test.ts
@Aditya190803

Copy link
Copy Markdown
ContributorAuthor

I cleaned up the branch history to reduce review noise and make the change set easier to reason about.

What changed:

  1. Rebased onto latest main.
  2. Removed merge/sync churn from feature history.
  3. Squashed follow-up fixups into logical commits.
  4. Kept implementation scope unchanged (no new feature surface beyond already discussed fixes).

Current commit structure:

  1. feat(contracts): add normalized provider usage and quota bucket schemas
  2. feat(server): normalize provider rate-limit usage and stabilize usage cache updates
  3. feat(web): render provider quota usage buckets in settings

Behavior/correctness included in this cleaned history:

  1. Fix low-percent double-scaling risk in usage normalization.
  2. Drop stale cached usage when newer provider snapshots omit usage.
  3. Clamp over-limit utilization and suppress no-op provider update pushes.
  4. Preserve tests across contracts/server/web for quota projection and cache behavior.

Validation run locally:

  1. bun fmt
  2. bun lint
  3. bun typecheck

No functional intent change; this is primarily a history hygiene pass for clearer review.

@juliusmarminge

Copy link
Copy Markdown
Member

Please add screenshots

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Apr 1, 2026
Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/providerUsage.ts Outdated
Comment threadapps/server/src/provider/providerUsage.ts Outdated
@macroscopeapp

macroscopeappBot commented Apr 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces substantial new functionality for tracking and displaying provider usage quotas across Claude and Codex providers. There are unresolved review comments identifying potential bugs in usage percentage calculations and cache staleness handling that warrant human attention before merging.

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

Comment threadapps/server/src/provider/providerUsage.ts

@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 and found 2 potential issues.

Fix All in Cursor

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

Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/providerUsage.ts
@Aditya190803

Copy link
Copy Markdown
ContributorAuthor

@juliusmarminge this branch got pretty janky and inconsistent so i rebuilt it cleanly

new PR here: #1732

closing this one to avoid confusion

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

2 participants

@Aditya190803@juliusmarminge
, '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: track provider usage and project weekly quota - #1605

Closed
Aditya190803 wants to merge 12 commits into
pingdotgg:mainfrom
Aditya190803:feat/weekly-usage
Closed

feat: track provider usage and project weekly quota#1605
Aditya190803 wants to merge 12 commits into
pingdotgg:mainfrom
Aditya190803:feat/weekly-usage

Conversation

@Aditya190803

@Aditya190803Aditya190803 commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Added provider usage normalization and merge utilities for Codex/Claude quota payloads.
  • Extended provider snapshots and websocket config/update flow to carry normalized usage buckets.
  • Fixed usage percent math to avoid double-scaling low percentages derived from usage/limit.
  • Fixed usage cache merge behavior so stale cached usage is dropped when a newer provider snapshot omits usage.
  • Added/updated tests covering usage normalization, merge behavior, and stale cache handling.

Why

Issue #228 asks for accurate quota visibility. This PR adds provider usage projection and makes it robust under incremental updates so UI quota values stay correct. The follow-up fixes address reviewer-reported edge cases that could misreport low usage percentages or retain stale usage after newer snapshots.

UI Changes

  • Settings provider quota bars now render normalized usage/reset data from provider snapshots.
  • No layout redesign.

Checklist

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

Closes#228

Note

Track provider rate limit usage and display weekly quota in settings

  • Adds ServerProviderUsage contract with fiveHour and weekly buckets, normalizing rate-limit payloads from both Claude and Codex providers into a standard shape via normalizeProviderUsageFromRateLimits in providerUsage.ts.
  • Extends Claude and Codex provider status probes to collect account metadata and rate-limit snapshots, attaching account, rateLimits, and usage fields to provider snapshots.
  • Adds probeCodexAccountState in codexAppServer.ts to request account/rateLimits/read alongside account data, with a grace window for missing rate-limit responses.
  • Renders a ProviderUsageRows component in the settings panel showing a progress bar, remaining percentage, and reset timestamp for each provider quota bucket.
  • Client in serverState.ts now eagerly requests a provider refresh on config snapshot receipt, applying results immediately without waiting for stream updates.

Macroscope summarized c44983f.


Note

Medium Risk
Medium risk because it extends provider probing/status snapshots and client refresh behavior, which can affect provider startup/perf and the accuracy of displayed quota data across Codex/Claude.

Overview
Adds first-class provider quota tracking by introducing ServerProviderUsage (with normalized fiveHour/weekly buckets) and wiring it through provider status snapshots.

Updates Codex and Claude provider probes to collect account metadata plus rate-limit payloads, normalize them into usage, and include these fields on ServerProvider snapshots; Codex’s app-server probe now requests account/rateLimits/read with a short grace window for missing responses.

Surfaces the data in the web settings UI via quota progress rows, and updates the client to eagerly call refreshProviders() on initial config load/snapshot so quota/usage appears without waiting for stream updates. Tests are added/updated across contracts, provider registry/probes, ingestion activity projection, and usage normalization/merge edge cases.

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

@coderabbitai

coderabbitaiBot commented Mar 31, 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

Run ID: d3cfd9df-b826-4476-b7a1-fb3de2204c9d

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 and usage tips.

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 31, 2026
@Aditya190803
Aditya190803 marked this pull request as draft March 31, 2026 11:08
@Aditya190803
Aditya190803 marked this pull request as ready for review March 31, 2026 11:13
Comment threadapps/server/src/provider/providerUsage.ts

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:11eab91d87

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/server/src/wsServer.ts Outdated
Comment on lines +137 to +140
const mergedUsage = mergeProviderUsage(cachedUsage, provider.usage);
if (mergedUsage !== undefined) {
nextCache[provider.provider] = mergedUsage;
continue;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Drop stale usage cache when provider snapshot has no usage

In mergeUsageCacheFromProviders, stale entries are never evicted because mergeProviderUsage(cachedUsage, provider.usage) returns cachedUsage whenever the new snapshot omits usage, so the mergedUsage !== undefined branch always keeps the cache and bypasses shouldKeepCachedUsage. This means a newer provider snapshot (checkedAt later than cached updatedAt) can still be served with outdated quota buckets via serverGetConfig and server.providersUpdated.

Useful? React with 👍 / 👎.

Comment on lines +76 to +77
if (limit !== null && limit > 0) {
return normalizePercent((usage / limit) * 100);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Avoid double-scaling low usage percentages

derivePercentFromUsage converts absolute usage to percent with (usage / limit) * 100, then passes that result to normalizePercent, which multiplies any value <= 1 by 100 again. For low-but-valid percentages (for example usage=1, limit=1000), this reports 10% instead of 0.1%, causing major quota misreporting near the start of a window.

Useful? React with 👍 / 👎.

Comment threadapps/server/src/wsServer.ts Outdated
Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/codexAppServer.ts
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Apr 1, 2026
Comment threadapps/server/src/provider/codexAppServer.test.ts
@Aditya190803

Copy link
Copy Markdown
ContributorAuthor

I cleaned up the branch history to reduce review noise and make the change set easier to reason about.

What changed:

  1. Rebased onto latest main.
  2. Removed merge/sync churn from feature history.
  3. Squashed follow-up fixups into logical commits.
  4. Kept implementation scope unchanged (no new feature surface beyond already discussed fixes).

Current commit structure:

  1. feat(contracts): add normalized provider usage and quota bucket schemas
  2. feat(server): normalize provider rate-limit usage and stabilize usage cache updates
  3. feat(web): render provider quota usage buckets in settings

Behavior/correctness included in this cleaned history:

  1. Fix low-percent double-scaling risk in usage normalization.
  2. Drop stale cached usage when newer provider snapshots omit usage.
  3. Clamp over-limit utilization and suppress no-op provider update pushes.
  4. Preserve tests across contracts/server/web for quota projection and cache behavior.

Validation run locally:

  1. bun fmt
  2. bun lint
  3. bun typecheck

No functional intent change; this is primarily a history hygiene pass for clearer review.

@juliusmarminge

Copy link
Copy Markdown
Member

Please add screenshots

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Apr 1, 2026
Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/providerUsage.ts Outdated
Comment threadapps/server/src/provider/providerUsage.ts Outdated
@macroscopeapp

macroscopeappBot commented Apr 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces substantial new functionality for tracking and displaying provider usage quotas across Claude and Codex providers. There are unresolved review comments identifying potential bugs in usage percentage calculations and cache staleness handling that warrant human attention before merging.

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

Comment threadapps/server/src/provider/providerUsage.ts

@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 and found 2 potential issues.

Fix All in Cursor

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

Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/providerUsage.ts
@Aditya190803

Copy link
Copy Markdown
ContributorAuthor

@juliusmarminge this branch got pretty janky and inconsistent so i rebuilt it cleanly

new PR here: #1732

closing this one to avoid confusion

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

2 participants

@Aditya190803@juliusmarminge
, '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: track provider usage and project weekly quota - #1605

Closed
Aditya190803 wants to merge 12 commits into
pingdotgg:mainfrom
Aditya190803:feat/weekly-usage
Closed

feat: track provider usage and project weekly quota#1605
Aditya190803 wants to merge 12 commits into
pingdotgg:mainfrom
Aditya190803:feat/weekly-usage

Conversation

@Aditya190803

@Aditya190803Aditya190803 commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Added provider usage normalization and merge utilities for Codex/Claude quota payloads.
  • Extended provider snapshots and websocket config/update flow to carry normalized usage buckets.
  • Fixed usage percent math to avoid double-scaling low percentages derived from usage/limit.
  • Fixed usage cache merge behavior so stale cached usage is dropped when a newer provider snapshot omits usage.
  • Added/updated tests covering usage normalization, merge behavior, and stale cache handling.

Why

Issue #228 asks for accurate quota visibility. This PR adds provider usage projection and makes it robust under incremental updates so UI quota values stay correct. The follow-up fixes address reviewer-reported edge cases that could misreport low usage percentages or retain stale usage after newer snapshots.

UI Changes

  • Settings provider quota bars now render normalized usage/reset data from provider snapshots.
  • No layout redesign.

Checklist

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

Closes#228

Note

Track provider rate limit usage and display weekly quota in settings

  • Adds ServerProviderUsage contract with fiveHour and weekly buckets, normalizing rate-limit payloads from both Claude and Codex providers into a standard shape via normalizeProviderUsageFromRateLimits in providerUsage.ts.
  • Extends Claude and Codex provider status probes to collect account metadata and rate-limit snapshots, attaching account, rateLimits, and usage fields to provider snapshots.
  • Adds probeCodexAccountState in codexAppServer.ts to request account/rateLimits/read alongside account data, with a grace window for missing rate-limit responses.
  • Renders a ProviderUsageRows component in the settings panel showing a progress bar, remaining percentage, and reset timestamp for each provider quota bucket.
  • Client in serverState.ts now eagerly requests a provider refresh on config snapshot receipt, applying results immediately without waiting for stream updates.

Macroscope summarized c44983f.


Note

Medium Risk
Medium risk because it extends provider probing/status snapshots and client refresh behavior, which can affect provider startup/perf and the accuracy of displayed quota data across Codex/Claude.

Overview
Adds first-class provider quota tracking by introducing ServerProviderUsage (with normalized fiveHour/weekly buckets) and wiring it through provider status snapshots.

Updates Codex and Claude provider probes to collect account metadata plus rate-limit payloads, normalize them into usage, and include these fields on ServerProvider snapshots; Codex’s app-server probe now requests account/rateLimits/read with a short grace window for missing responses.

Surfaces the data in the web settings UI via quota progress rows, and updates the client to eagerly call refreshProviders() on initial config load/snapshot so quota/usage appears without waiting for stream updates. Tests are added/updated across contracts, provider registry/probes, ingestion activity projection, and usage normalization/merge edge cases.

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

@coderabbitai

coderabbitaiBot commented Mar 31, 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

Run ID: d3cfd9df-b826-4476-b7a1-fb3de2204c9d

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 and usage tips.

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 31, 2026
@Aditya190803
Aditya190803 marked this pull request as draft March 31, 2026 11:08
@Aditya190803
Aditya190803 marked this pull request as ready for review March 31, 2026 11:13
Comment threadapps/server/src/provider/providerUsage.ts

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:11eab91d87

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/server/src/wsServer.ts Outdated
Comment on lines +137 to +140
const mergedUsage = mergeProviderUsage(cachedUsage, provider.usage);
if (mergedUsage !== undefined) {
nextCache[provider.provider] = mergedUsage;
continue;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Drop stale usage cache when provider snapshot has no usage

In mergeUsageCacheFromProviders, stale entries are never evicted because mergeProviderUsage(cachedUsage, provider.usage) returns cachedUsage whenever the new snapshot omits usage, so the mergedUsage !== undefined branch always keeps the cache and bypasses shouldKeepCachedUsage. This means a newer provider snapshot (checkedAt later than cached updatedAt) can still be served with outdated quota buckets via serverGetConfig and server.providersUpdated.

Useful? React with 👍 / 👎.

Comment on lines +76 to +77
if (limit !== null && limit > 0) {
return normalizePercent((usage / limit) * 100);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Avoid double-scaling low usage percentages

derivePercentFromUsage converts absolute usage to percent with (usage / limit) * 100, then passes that result to normalizePercent, which multiplies any value <= 1 by 100 again. For low-but-valid percentages (for example usage=1, limit=1000), this reports 10% instead of 0.1%, causing major quota misreporting near the start of a window.

Useful? React with 👍 / 👎.

Comment threadapps/server/src/wsServer.ts Outdated
Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/codexAppServer.ts
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Apr 1, 2026
Comment threadapps/server/src/provider/codexAppServer.test.ts
@Aditya190803

Copy link
Copy Markdown
ContributorAuthor

I cleaned up the branch history to reduce review noise and make the change set easier to reason about.

What changed:

  1. Rebased onto latest main.
  2. Removed merge/sync churn from feature history.
  3. Squashed follow-up fixups into logical commits.
  4. Kept implementation scope unchanged (no new feature surface beyond already discussed fixes).

Current commit structure:

  1. feat(contracts): add normalized provider usage and quota bucket schemas
  2. feat(server): normalize provider rate-limit usage and stabilize usage cache updates
  3. feat(web): render provider quota usage buckets in settings

Behavior/correctness included in this cleaned history:

  1. Fix low-percent double-scaling risk in usage normalization.
  2. Drop stale cached usage when newer provider snapshots omit usage.
  3. Clamp over-limit utilization and suppress no-op provider update pushes.
  4. Preserve tests across contracts/server/web for quota projection and cache behavior.

Validation run locally:

  1. bun fmt
  2. bun lint
  3. bun typecheck

No functional intent change; this is primarily a history hygiene pass for clearer review.

@juliusmarminge

Copy link
Copy Markdown
Member

Please add screenshots

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Apr 1, 2026
Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/providerUsage.ts Outdated
Comment threadapps/server/src/provider/providerUsage.ts Outdated
@macroscopeapp

macroscopeappBot commented Apr 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces substantial new functionality for tracking and displaying provider usage quotas across Claude and Codex providers. There are unresolved review comments identifying potential bugs in usage percentage calculations and cache staleness handling that warrant human attention before merging.

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

Comment threadapps/server/src/provider/providerUsage.ts

@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 and found 2 potential issues.

Fix All in Cursor

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

Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/providerUsage.ts
@Aditya190803

Copy link
Copy Markdown
ContributorAuthor

@juliusmarminge this branch got pretty janky and inconsistent so i rebuilt it cleanly

new PR here: #1732

closing this one to avoid confusion

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

2 participants

@Aditya190803@juliusmarminge
, '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: track provider usage and project weekly quota - #1605

Closed
Aditya190803 wants to merge 12 commits into
pingdotgg:mainfrom
Aditya190803:feat/weekly-usage
Closed

feat: track provider usage and project weekly quota#1605
Aditya190803 wants to merge 12 commits into
pingdotgg:mainfrom
Aditya190803:feat/weekly-usage

Conversation

@Aditya190803

@Aditya190803Aditya190803 commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Added provider usage normalization and merge utilities for Codex/Claude quota payloads.
  • Extended provider snapshots and websocket config/update flow to carry normalized usage buckets.
  • Fixed usage percent math to avoid double-scaling low percentages derived from usage/limit.
  • Fixed usage cache merge behavior so stale cached usage is dropped when a newer provider snapshot omits usage.
  • Added/updated tests covering usage normalization, merge behavior, and stale cache handling.

Why

Issue #228 asks for accurate quota visibility. This PR adds provider usage projection and makes it robust under incremental updates so UI quota values stay correct. The follow-up fixes address reviewer-reported edge cases that could misreport low usage percentages or retain stale usage after newer snapshots.

UI Changes

  • Settings provider quota bars now render normalized usage/reset data from provider snapshots.
  • No layout redesign.

Checklist

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

Closes#228

Note

Track provider rate limit usage and display weekly quota in settings

  • Adds ServerProviderUsage contract with fiveHour and weekly buckets, normalizing rate-limit payloads from both Claude and Codex providers into a standard shape via normalizeProviderUsageFromRateLimits in providerUsage.ts.
  • Extends Claude and Codex provider status probes to collect account metadata and rate-limit snapshots, attaching account, rateLimits, and usage fields to provider snapshots.
  • Adds probeCodexAccountState in codexAppServer.ts to request account/rateLimits/read alongside account data, with a grace window for missing rate-limit responses.
  • Renders a ProviderUsageRows component in the settings panel showing a progress bar, remaining percentage, and reset timestamp for each provider quota bucket.
  • Client in serverState.ts now eagerly requests a provider refresh on config snapshot receipt, applying results immediately without waiting for stream updates.

Macroscope summarized c44983f.


Note

Medium Risk
Medium risk because it extends provider probing/status snapshots and client refresh behavior, which can affect provider startup/perf and the accuracy of displayed quota data across Codex/Claude.

Overview
Adds first-class provider quota tracking by introducing ServerProviderUsage (with normalized fiveHour/weekly buckets) and wiring it through provider status snapshots.

Updates Codex and Claude provider probes to collect account metadata plus rate-limit payloads, normalize them into usage, and include these fields on ServerProvider snapshots; Codex’s app-server probe now requests account/rateLimits/read with a short grace window for missing responses.

Surfaces the data in the web settings UI via quota progress rows, and updates the client to eagerly call refreshProviders() on initial config load/snapshot so quota/usage appears without waiting for stream updates. Tests are added/updated across contracts, provider registry/probes, ingestion activity projection, and usage normalization/merge edge cases.

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

@coderabbitai

coderabbitaiBot commented Mar 31, 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

Run ID: d3cfd9df-b826-4476-b7a1-fb3de2204c9d

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 and usage tips.

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 31, 2026
@Aditya190803
Aditya190803 marked this pull request as draft March 31, 2026 11:08
@Aditya190803
Aditya190803 marked this pull request as ready for review March 31, 2026 11:13
Comment threadapps/server/src/provider/providerUsage.ts

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:11eab91d87

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadapps/server/src/wsServer.ts Outdated
Comment on lines +137 to +140
const mergedUsage = mergeProviderUsage(cachedUsage, provider.usage);
if (mergedUsage !== undefined) {
nextCache[provider.provider] = mergedUsage;
continue;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Drop stale usage cache when provider snapshot has no usage

In mergeUsageCacheFromProviders, stale entries are never evicted because mergeProviderUsage(cachedUsage, provider.usage) returns cachedUsage whenever the new snapshot omits usage, so the mergedUsage !== undefined branch always keeps the cache and bypasses shouldKeepCachedUsage. This means a newer provider snapshot (checkedAt later than cached updatedAt) can still be served with outdated quota buckets via serverGetConfig and server.providersUpdated.

Useful? React with 👍 / 👎.

Comment on lines +76 to +77
if (limit !== null && limit > 0) {
return normalizePercent((usage / limit) * 100);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Avoid double-scaling low usage percentages

derivePercentFromUsage converts absolute usage to percent with (usage / limit) * 100, then passes that result to normalizePercent, which multiplies any value <= 1 by 100 again. For low-but-valid percentages (for example usage=1, limit=1000), this reports 10% instead of 0.1%, causing major quota misreporting near the start of a window.

Useful? React with 👍 / 👎.

Comment threadapps/server/src/wsServer.ts Outdated
Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/codexAppServer.ts
@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Apr 1, 2026
Comment threadapps/server/src/provider/codexAppServer.test.ts
@Aditya190803

Copy link
Copy Markdown
ContributorAuthor

I cleaned up the branch history to reduce review noise and make the change set easier to reason about.

What changed:

  1. Rebased onto latest main.
  2. Removed merge/sync churn from feature history.
  3. Squashed follow-up fixups into logical commits.
  4. Kept implementation scope unchanged (no new feature surface beyond already discussed fixes).

Current commit structure:

  1. feat(contracts): add normalized provider usage and quota bucket schemas
  2. feat(server): normalize provider rate-limit usage and stabilize usage cache updates
  3. feat(web): render provider quota usage buckets in settings

Behavior/correctness included in this cleaned history:

  1. Fix low-percent double-scaling risk in usage normalization.
  2. Drop stale cached usage when newer provider snapshots omit usage.
  3. Clamp over-limit utilization and suppress no-op provider update pushes.
  4. Preserve tests across contracts/server/web for quota projection and cache behavior.

Validation run locally:

  1. bun fmt
  2. bun lint
  3. bun typecheck

No functional intent change; this is primarily a history hygiene pass for clearer review.

@juliusmarminge

Copy link
Copy Markdown
Member

Please add screenshots

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Apr 1, 2026
Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/providerUsage.ts Outdated
Comment threadapps/server/src/provider/providerUsage.ts Outdated
@macroscopeapp

macroscopeappBot commented Apr 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces substantial new functionality for tracking and displaying provider usage quotas across Claude and Codex providers. There are unresolved review comments identifying potential bugs in usage percentage calculations and cache staleness handling that warrant human attention before merging.

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

Comment threadapps/server/src/provider/providerUsage.ts

@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 and found 2 potential issues.

Fix All in Cursor

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

Comment threadapps/server/src/provider/providerUsage.ts
Comment threadapps/server/src/provider/providerUsage.ts
@Aditya190803

Copy link
Copy Markdown
ContributorAuthor

@juliusmarminge this branch got pretty janky and inconsistent so i rebuilt it cleanly

new PR here: #1732

closing this one to avoid confusion

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

2 participants

@Aditya190803@juliusmarminge