feat(usage): add Cursor to the Usage page - #6046

Closed
GimpyHand wants to merge 14 commits into
pingdotgg:mainfrom
GimpyHand:feat/cursor-usage
Closed

feat(usage): add Cursor to the Usage page#6046
GimpyHand wants to merge 14 commits into
pingdotgg:mainfrom
GimpyHand:feat/cursor-usage

Conversation

@GimpyHand

@GimpyHandGimpyHand commented Aug 10, 2026

Copy link
Copy Markdown

Summary

  • Adds Cursor as a third Usage provider (alongside Claude and Codex) on web and mobile.
  • Cursor agent transcripts have no token counts, so the server loads the same dashboard CSV export Cursor already exposes when desktop is signed in on the host (state.vscdb session → export-usage-events-csv), with a short on-disk cache and soft-fail so Claude/Codex still render if Cursor is missing.
  • Prices Cursor export slugs at API-equivalent rates: Cursor-published Auto Cost / Composer / Grok rates for product models, LiteLLM after stripping effort/thinking suffixes for third-party names, and provider-reported CSV dollars when present. Bumps usage contract to v4.
Screenshot from 2026-08-13 07-57-58

Why this path

Claude/Codex usage comes from local JSONL ledgers. Cursor does not write token totals locally, so a pure filesystem walk cannot cover it. Reusing the signed-in desktop session to fetch the user's own usage export matches the existing host-trust model (the environment machine already holds provider identity) without inventing a parallel billing system.

Costs remain estimates, not subscription invoices. Auto is priced as Auto Cost because the export does not say which Auto mode ran.

Test plan

  • vp test run apps/server/src/usage/usageCursorExport.test.ts apps/server/src/usage/usagePricing.test.ts apps/server/src/usage/usageAggregation.test.ts packages/shared/src/usageMerge.test.ts
  • On a machine with Cursor desktop signed in, open Usage and confirm a Cursor series with non-zero tokens
  • Confirm Included rows still contribute tokens and get API-equivalent dollars (not stuck at $0)
  • On a machine without Cursor login, Usage still shows Claude/Codex and marks Cursor uncovered
  • Multi-environment merge does not double-count the same Cursor export fingerprint

Note

Medium Risk
Reads local Cursor auth from SQLite and calls Cursor’s API with the desktop session token; cost figures remain estimates and merge logic changed for shared Cursor accounts.

Overview
Adds Cursor as a third Usage provider on web and mobile (contract v4), alongside Claude and Codex.

Because Cursor transcripts have no token counts, the server loads usage from Cursor’s dashboard CSV export when desktop is signed in: it reads cursorAuth/accessToken from state.vscdb, calls the export API with a session cookie, caches the CSV per account (~5 min freshness), and parses v1/v2/v3 CSV shapes into the same UsageRecord pipeline. Failures are soft so Claude/Codex still render; merge uses a account-scoped fingerprint (cursor-account + cursor-export:user_*) so the same login is not double-counted across machines or worktrees, with richest in-window data winning ties.

Pricing gains Cursor-published rates for Auto / Composer / Grok, strips effort/thinking suffixes for LiteLLM lookup, drops zero-cost LiteLLM auto rows, and leaves “Included” CSV costs unreported so API-equivalent pricing still applies.

UI surfaces Cursor in charts/tables and shows coverage notices only for Cursor missing/failed exports (isCursorCoverageGap), not unused Claude/Codex homes. User docs describe sources and Cursor coverage requirements.

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

Note

Add Cursor as a usage provider on the Usage page

  • Adds a new usageCursorExport module that locates Cursor's local SQLite DB, extracts an auth token, fetches the dashboard CSV export, caches it with a TTL, and parses multiple CSV schema variants (v1/v2/v3) into UsageRecord arrays.
  • Integrates Cursor records into UsageService.readSummary, soft-failing on errors and reporting a UsageSource with status and distinct session counts.
  • Extends usagePricing with Cursor-native rate tables for Auto, Composer 2/2.5, and Grok 4.5 slugs; fixes zero-cost LiteLLM rows from masking these rates.
  • Updates usageMerge so the richest data owner wins when multiple environments share a Cursor account fingerprint, and adds isCursorCoverageGap for surfacing missing/failed Cursor exports in UI notices.
  • Adds cursor to provider ordering, labels, colors, and icons across both web and mobile Usage UIs.

Macroscope summarized 37535e3.

@coderabbitai

coderabbitaiBot commented Aug 10, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 5febdc74-5d3a-41d5-b8c8-0dfe2c960759

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

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

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot 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.

One Effect-service convention issue found: loadCursorUsageRecords takes an HttpClient service instance as a parameter instead of acquiring it from the Effect environment, which erases the requirement from its Effect type. Details inline.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/UsageService.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:9cb738ead2

ℹ️ 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/usage/UsageService.ts
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/UsageService.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts
Comment threadapps/server/src/usage/UsageService.ts
Comment threadapps/server/src/usage/UsageService.ts
Comment threadapps/web/src/components/usage/usageProviders.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds Cursor as a new usage provider, introducing external API integration to cursor.com, local credential extraction from SQLite databases, and new pricing/parsing logic. The scope of this new feature warrants human review.

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

Comment threadapps/web/src/components/usage/UsagePage.tsx
Comment threadpackages/shared/src/usageMerge.ts
Cursor agent transcripts have no token counts, so usage comes from the
dashboard CSV export when Cursor desktop is signed in on the host.
API-equivalent costs use Cursor-published Auto/Composer/Grok rates and
LiteLLM aliases for third-party export slugs.
Key the CSV cache per Cursor user, skip failed sources when claiming
fingerprints, and treat Cursor exports as account-scoped so the same
login is not double-counted across hosts.
Stale-cache ok sources no longer claim an account fingerprint over a
sibling with real in-window spend. Coverage notice only flags Cursor
gaps so unused Claude/Codex homes stay quiet.
Comment threaddocs/README.md Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated

@macroscopeappmacroscopeappBot 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.

Two UI consistency findings in the changed usage web files. Both are small, localized fixes.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/usage/UsagePage.tsx
Comment threadapps/web/src/components/usage/usageProviders.ts Outdated
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Aug 17, 2026
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Aug 17, 2026
Merge OpenCode SQLite scanning alongside Cursor CSV export from pingdotgg#6046.
Resolves conflicts to support all four providers in contracts and UI.
Co-authored-by: Cursor <cursoragent@cursor.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 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.

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

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

totals.outputTokens === 0
) {
continue;
}

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.

Tokenless billed rows dropped

Medium Severity

parseCursorUsageCsv skips every row whose token columns are all zero before recording reportedCostUsd. Cursor exports often bill tooling models such as premium and agent_review with a numeric Cost and no tokens, so that spend never reaches the aggregator and Usage undercounts Cursor dollars.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

}
}
return null;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Auth DB probe short-circuits

Low Severity

findCursorStateDb returns the first existing state.vscdb candidate without checking for a usable cursorAuth/accessToken. A stale or logged-out DB earlier in the probe list (for example Windows Roaming ahead of LOCALAPPDATA) blocks later valid paths, so readLocalCursorExportAuth reports missing and Cursor stays uncovered.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Duplicates another usage-reporting proposal while adding a broad client, contract, or provider integration.

@t3dotggt3dotgg closed this Aug 23, 2026
@GimpyHand
GimpyHand deleted the feat/cursor-usage branch August 23, 2026 14:55
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.

2 participants

@GimpyHand@t3dotgg
, '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(usage): add Cursor to the Usage page - #6046

Closed
GimpyHand wants to merge 14 commits into
pingdotgg:mainfrom
GimpyHand:feat/cursor-usage
Closed

feat(usage): add Cursor to the Usage page#6046
GimpyHand wants to merge 14 commits into
pingdotgg:mainfrom
GimpyHand:feat/cursor-usage

Conversation

@GimpyHand

@GimpyHandGimpyHand commented Aug 10, 2026

Copy link
Copy Markdown

Summary

  • Adds Cursor as a third Usage provider (alongside Claude and Codex) on web and mobile.
  • Cursor agent transcripts have no token counts, so the server loads the same dashboard CSV export Cursor already exposes when desktop is signed in on the host (state.vscdb session → export-usage-events-csv), with a short on-disk cache and soft-fail so Claude/Codex still render if Cursor is missing.
  • Prices Cursor export slugs at API-equivalent rates: Cursor-published Auto Cost / Composer / Grok rates for product models, LiteLLM after stripping effort/thinking suffixes for third-party names, and provider-reported CSV dollars when present. Bumps usage contract to v4.
Screenshot from 2026-08-13 07-57-58

Why this path

Claude/Codex usage comes from local JSONL ledgers. Cursor does not write token totals locally, so a pure filesystem walk cannot cover it. Reusing the signed-in desktop session to fetch the user's own usage export matches the existing host-trust model (the environment machine already holds provider identity) without inventing a parallel billing system.

Costs remain estimates, not subscription invoices. Auto is priced as Auto Cost because the export does not say which Auto mode ran.

Test plan

  • vp test run apps/server/src/usage/usageCursorExport.test.ts apps/server/src/usage/usagePricing.test.ts apps/server/src/usage/usageAggregation.test.ts packages/shared/src/usageMerge.test.ts
  • On a machine with Cursor desktop signed in, open Usage and confirm a Cursor series with non-zero tokens
  • Confirm Included rows still contribute tokens and get API-equivalent dollars (not stuck at $0)
  • On a machine without Cursor login, Usage still shows Claude/Codex and marks Cursor uncovered
  • Multi-environment merge does not double-count the same Cursor export fingerprint

Note

Medium Risk
Reads local Cursor auth from SQLite and calls Cursor’s API with the desktop session token; cost figures remain estimates and merge logic changed for shared Cursor accounts.

Overview
Adds Cursor as a third Usage provider on web and mobile (contract v4), alongside Claude and Codex.

Because Cursor transcripts have no token counts, the server loads usage from Cursor’s dashboard CSV export when desktop is signed in: it reads cursorAuth/accessToken from state.vscdb, calls the export API with a session cookie, caches the CSV per account (~5 min freshness), and parses v1/v2/v3 CSV shapes into the same UsageRecord pipeline. Failures are soft so Claude/Codex still render; merge uses a account-scoped fingerprint (cursor-account + cursor-export:user_*) so the same login is not double-counted across machines or worktrees, with richest in-window data winning ties.

Pricing gains Cursor-published rates for Auto / Composer / Grok, strips effort/thinking suffixes for LiteLLM lookup, drops zero-cost LiteLLM auto rows, and leaves “Included” CSV costs unreported so API-equivalent pricing still applies.

UI surfaces Cursor in charts/tables and shows coverage notices only for Cursor missing/failed exports (isCursorCoverageGap), not unused Claude/Codex homes. User docs describe sources and Cursor coverage requirements.

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

Note

Add Cursor as a usage provider on the Usage page

  • Adds a new usageCursorExport module that locates Cursor's local SQLite DB, extracts an auth token, fetches the dashboard CSV export, caches it with a TTL, and parses multiple CSV schema variants (v1/v2/v3) into UsageRecord arrays.
  • Integrates Cursor records into UsageService.readSummary, soft-failing on errors and reporting a UsageSource with status and distinct session counts.
  • Extends usagePricing with Cursor-native rate tables for Auto, Composer 2/2.5, and Grok 4.5 slugs; fixes zero-cost LiteLLM rows from masking these rates.
  • Updates usageMerge so the richest data owner wins when multiple environments share a Cursor account fingerprint, and adds isCursorCoverageGap for surfacing missing/failed Cursor exports in UI notices.
  • Adds cursor to provider ordering, labels, colors, and icons across both web and mobile Usage UIs.

Macroscope summarized 37535e3.

@coderabbitai

coderabbitaiBot commented Aug 10, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 5febdc74-5d3a-41d5-b8c8-0dfe2c960759

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

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

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot 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.

One Effect-service convention issue found: loadCursorUsageRecords takes an HttpClient service instance as a parameter instead of acquiring it from the Effect environment, which erases the requirement from its Effect type. Details inline.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/UsageService.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:9cb738ead2

ℹ️ 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/usage/UsageService.ts
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/UsageService.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts
Comment threadapps/server/src/usage/UsageService.ts
Comment threadapps/server/src/usage/UsageService.ts
Comment threadapps/web/src/components/usage/usageProviders.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds Cursor as a new usage provider, introducing external API integration to cursor.com, local credential extraction from SQLite databases, and new pricing/parsing logic. The scope of this new feature warrants human review.

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

Comment threadapps/web/src/components/usage/UsagePage.tsx
Comment threadpackages/shared/src/usageMerge.ts
Cursor agent transcripts have no token counts, so usage comes from the
dashboard CSV export when Cursor desktop is signed in on the host.
API-equivalent costs use Cursor-published Auto/Composer/Grok rates and
LiteLLM aliases for third-party export slugs.
Key the CSV cache per Cursor user, skip failed sources when claiming
fingerprints, and treat Cursor exports as account-scoped so the same
login is not double-counted across hosts.
Stale-cache ok sources no longer claim an account fingerprint over a
sibling with real in-window spend. Coverage notice only flags Cursor
gaps so unused Claude/Codex homes stay quiet.
Comment threaddocs/README.md Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated

@macroscopeappmacroscopeappBot 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.

Two UI consistency findings in the changed usage web files. Both are small, localized fixes.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/usage/UsagePage.tsx
Comment threadapps/web/src/components/usage/usageProviders.ts Outdated
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Aug 17, 2026
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Aug 17, 2026
Merge OpenCode SQLite scanning alongside Cursor CSV export from pingdotgg#6046.
Resolves conflicts to support all four providers in contracts and UI.
Co-authored-by: Cursor <cursoragent@cursor.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 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.

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

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

totals.outputTokens === 0
) {
continue;
}

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.

Tokenless billed rows dropped

Medium Severity

parseCursorUsageCsv skips every row whose token columns are all zero before recording reportedCostUsd. Cursor exports often bill tooling models such as premium and agent_review with a numeric Cost and no tokens, so that spend never reaches the aggregator and Usage undercounts Cursor dollars.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

}
}
return null;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Auth DB probe short-circuits

Low Severity

findCursorStateDb returns the first existing state.vscdb candidate without checking for a usable cursorAuth/accessToken. A stale or logged-out DB earlier in the probe list (for example Windows Roaming ahead of LOCALAPPDATA) blocks later valid paths, so readLocalCursorExportAuth reports missing and Cursor stays uncovered.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Duplicates another usage-reporting proposal while adding a broad client, contract, or provider integration.

@t3dotggt3dotgg closed this Aug 23, 2026
@GimpyHand
GimpyHand deleted the feat/cursor-usage branch August 23, 2026 14:55
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.

2 participants

@GimpyHand@t3dotgg
, '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(usage): add Cursor to the Usage page - #6046

Closed
GimpyHand wants to merge 14 commits into
pingdotgg:mainfrom
GimpyHand:feat/cursor-usage
Closed

feat(usage): add Cursor to the Usage page#6046
GimpyHand wants to merge 14 commits into
pingdotgg:mainfrom
GimpyHand:feat/cursor-usage

Conversation

@GimpyHand

@GimpyHandGimpyHand commented Aug 10, 2026

Copy link
Copy Markdown

Summary

  • Adds Cursor as a third Usage provider (alongside Claude and Codex) on web and mobile.
  • Cursor agent transcripts have no token counts, so the server loads the same dashboard CSV export Cursor already exposes when desktop is signed in on the host (state.vscdb session → export-usage-events-csv), with a short on-disk cache and soft-fail so Claude/Codex still render if Cursor is missing.
  • Prices Cursor export slugs at API-equivalent rates: Cursor-published Auto Cost / Composer / Grok rates for product models, LiteLLM after stripping effort/thinking suffixes for third-party names, and provider-reported CSV dollars when present. Bumps usage contract to v4.
Screenshot from 2026-08-13 07-57-58

Why this path

Claude/Codex usage comes from local JSONL ledgers. Cursor does not write token totals locally, so a pure filesystem walk cannot cover it. Reusing the signed-in desktop session to fetch the user's own usage export matches the existing host-trust model (the environment machine already holds provider identity) without inventing a parallel billing system.

Costs remain estimates, not subscription invoices. Auto is priced as Auto Cost because the export does not say which Auto mode ran.

Test plan

  • vp test run apps/server/src/usage/usageCursorExport.test.ts apps/server/src/usage/usagePricing.test.ts apps/server/src/usage/usageAggregation.test.ts packages/shared/src/usageMerge.test.ts
  • On a machine with Cursor desktop signed in, open Usage and confirm a Cursor series with non-zero tokens
  • Confirm Included rows still contribute tokens and get API-equivalent dollars (not stuck at $0)
  • On a machine without Cursor login, Usage still shows Claude/Codex and marks Cursor uncovered
  • Multi-environment merge does not double-count the same Cursor export fingerprint

Note

Medium Risk
Reads local Cursor auth from SQLite and calls Cursor’s API with the desktop session token; cost figures remain estimates and merge logic changed for shared Cursor accounts.

Overview
Adds Cursor as a third Usage provider on web and mobile (contract v4), alongside Claude and Codex.

Because Cursor transcripts have no token counts, the server loads usage from Cursor’s dashboard CSV export when desktop is signed in: it reads cursorAuth/accessToken from state.vscdb, calls the export API with a session cookie, caches the CSV per account (~5 min freshness), and parses v1/v2/v3 CSV shapes into the same UsageRecord pipeline. Failures are soft so Claude/Codex still render; merge uses a account-scoped fingerprint (cursor-account + cursor-export:user_*) so the same login is not double-counted across machines or worktrees, with richest in-window data winning ties.

Pricing gains Cursor-published rates for Auto / Composer / Grok, strips effort/thinking suffixes for LiteLLM lookup, drops zero-cost LiteLLM auto rows, and leaves “Included” CSV costs unreported so API-equivalent pricing still applies.

UI surfaces Cursor in charts/tables and shows coverage notices only for Cursor missing/failed exports (isCursorCoverageGap), not unused Claude/Codex homes. User docs describe sources and Cursor coverage requirements.

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

Note

Add Cursor as a usage provider on the Usage page

  • Adds a new usageCursorExport module that locates Cursor's local SQLite DB, extracts an auth token, fetches the dashboard CSV export, caches it with a TTL, and parses multiple CSV schema variants (v1/v2/v3) into UsageRecord arrays.
  • Integrates Cursor records into UsageService.readSummary, soft-failing on errors and reporting a UsageSource with status and distinct session counts.
  • Extends usagePricing with Cursor-native rate tables for Auto, Composer 2/2.5, and Grok 4.5 slugs; fixes zero-cost LiteLLM rows from masking these rates.
  • Updates usageMerge so the richest data owner wins when multiple environments share a Cursor account fingerprint, and adds isCursorCoverageGap for surfacing missing/failed Cursor exports in UI notices.
  • Adds cursor to provider ordering, labels, colors, and icons across both web and mobile Usage UIs.

Macroscope summarized 37535e3.

@coderabbitai

coderabbitaiBot commented Aug 10, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 5febdc74-5d3a-41d5-b8c8-0dfe2c960759

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

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

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot 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.

One Effect-service convention issue found: loadCursorUsageRecords takes an HttpClient service instance as a parameter instead of acquiring it from the Effect environment, which erases the requirement from its Effect type. Details inline.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/UsageService.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:9cb738ead2

ℹ️ 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/usage/UsageService.ts
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/UsageService.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts
Comment threadapps/server/src/usage/UsageService.ts
Comment threadapps/server/src/usage/UsageService.ts
Comment threadapps/web/src/components/usage/usageProviders.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds Cursor as a new usage provider, introducing external API integration to cursor.com, local credential extraction from SQLite databases, and new pricing/parsing logic. The scope of this new feature warrants human review.

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

Comment threadapps/web/src/components/usage/UsagePage.tsx
Comment threadpackages/shared/src/usageMerge.ts
Cursor agent transcripts have no token counts, so usage comes from the
dashboard CSV export when Cursor desktop is signed in on the host.
API-equivalent costs use Cursor-published Auto/Composer/Grok rates and
LiteLLM aliases for third-party export slugs.
Key the CSV cache per Cursor user, skip failed sources when claiming
fingerprints, and treat Cursor exports as account-scoped so the same
login is not double-counted across hosts.
Stale-cache ok sources no longer claim an account fingerprint over a
sibling with real in-window spend. Coverage notice only flags Cursor
gaps so unused Claude/Codex homes stay quiet.
Comment threaddocs/README.md Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated

@macroscopeappmacroscopeappBot 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.

Two UI consistency findings in the changed usage web files. Both are small, localized fixes.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/usage/UsagePage.tsx
Comment threadapps/web/src/components/usage/usageProviders.ts Outdated
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Aug 17, 2026
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Aug 17, 2026
Merge OpenCode SQLite scanning alongside Cursor CSV export from pingdotgg#6046.
Resolves conflicts to support all four providers in contracts and UI.
Co-authored-by: Cursor <cursoragent@cursor.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 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.

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

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

totals.outputTokens === 0
) {
continue;
}

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.

Tokenless billed rows dropped

Medium Severity

parseCursorUsageCsv skips every row whose token columns are all zero before recording reportedCostUsd. Cursor exports often bill tooling models such as premium and agent_review with a numeric Cost and no tokens, so that spend never reaches the aggregator and Usage undercounts Cursor dollars.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

}
}
return null;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Auth DB probe short-circuits

Low Severity

findCursorStateDb returns the first existing state.vscdb candidate without checking for a usable cursorAuth/accessToken. A stale or logged-out DB earlier in the probe list (for example Windows Roaming ahead of LOCALAPPDATA) blocks later valid paths, so readLocalCursorExportAuth reports missing and Cursor stays uncovered.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Duplicates another usage-reporting proposal while adding a broad client, contract, or provider integration.

@t3dotggt3dotgg closed this Aug 23, 2026
@GimpyHand
GimpyHand deleted the feat/cursor-usage branch August 23, 2026 14:55
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.

2 participants

@GimpyHand@t3dotgg
, '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(usage): add Cursor to the Usage page - #6046

Closed
GimpyHand wants to merge 14 commits into
pingdotgg:mainfrom
GimpyHand:feat/cursor-usage
Closed

feat(usage): add Cursor to the Usage page#6046
GimpyHand wants to merge 14 commits into
pingdotgg:mainfrom
GimpyHand:feat/cursor-usage

Conversation

@GimpyHand

@GimpyHandGimpyHand commented Aug 10, 2026

Copy link
Copy Markdown

Summary

  • Adds Cursor as a third Usage provider (alongside Claude and Codex) on web and mobile.
  • Cursor agent transcripts have no token counts, so the server loads the same dashboard CSV export Cursor already exposes when desktop is signed in on the host (state.vscdb session → export-usage-events-csv), with a short on-disk cache and soft-fail so Claude/Codex still render if Cursor is missing.
  • Prices Cursor export slugs at API-equivalent rates: Cursor-published Auto Cost / Composer / Grok rates for product models, LiteLLM after stripping effort/thinking suffixes for third-party names, and provider-reported CSV dollars when present. Bumps usage contract to v4.
Screenshot from 2026-08-13 07-57-58

Why this path

Claude/Codex usage comes from local JSONL ledgers. Cursor does not write token totals locally, so a pure filesystem walk cannot cover it. Reusing the signed-in desktop session to fetch the user's own usage export matches the existing host-trust model (the environment machine already holds provider identity) without inventing a parallel billing system.

Costs remain estimates, not subscription invoices. Auto is priced as Auto Cost because the export does not say which Auto mode ran.

Test plan

  • vp test run apps/server/src/usage/usageCursorExport.test.ts apps/server/src/usage/usagePricing.test.ts apps/server/src/usage/usageAggregation.test.ts packages/shared/src/usageMerge.test.ts
  • On a machine with Cursor desktop signed in, open Usage and confirm a Cursor series with non-zero tokens
  • Confirm Included rows still contribute tokens and get API-equivalent dollars (not stuck at $0)
  • On a machine without Cursor login, Usage still shows Claude/Codex and marks Cursor uncovered
  • Multi-environment merge does not double-count the same Cursor export fingerprint

Note

Medium Risk
Reads local Cursor auth from SQLite and calls Cursor’s API with the desktop session token; cost figures remain estimates and merge logic changed for shared Cursor accounts.

Overview
Adds Cursor as a third Usage provider on web and mobile (contract v4), alongside Claude and Codex.

Because Cursor transcripts have no token counts, the server loads usage from Cursor’s dashboard CSV export when desktop is signed in: it reads cursorAuth/accessToken from state.vscdb, calls the export API with a session cookie, caches the CSV per account (~5 min freshness), and parses v1/v2/v3 CSV shapes into the same UsageRecord pipeline. Failures are soft so Claude/Codex still render; merge uses a account-scoped fingerprint (cursor-account + cursor-export:user_*) so the same login is not double-counted across machines or worktrees, with richest in-window data winning ties.

Pricing gains Cursor-published rates for Auto / Composer / Grok, strips effort/thinking suffixes for LiteLLM lookup, drops zero-cost LiteLLM auto rows, and leaves “Included” CSV costs unreported so API-equivalent pricing still applies.

UI surfaces Cursor in charts/tables and shows coverage notices only for Cursor missing/failed exports (isCursorCoverageGap), not unused Claude/Codex homes. User docs describe sources and Cursor coverage requirements.

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

Note

Add Cursor as a usage provider on the Usage page

  • Adds a new usageCursorExport module that locates Cursor's local SQLite DB, extracts an auth token, fetches the dashboard CSV export, caches it with a TTL, and parses multiple CSV schema variants (v1/v2/v3) into UsageRecord arrays.
  • Integrates Cursor records into UsageService.readSummary, soft-failing on errors and reporting a UsageSource with status and distinct session counts.
  • Extends usagePricing with Cursor-native rate tables for Auto, Composer 2/2.5, and Grok 4.5 slugs; fixes zero-cost LiteLLM rows from masking these rates.
  • Updates usageMerge so the richest data owner wins when multiple environments share a Cursor account fingerprint, and adds isCursorCoverageGap for surfacing missing/failed Cursor exports in UI notices.
  • Adds cursor to provider ordering, labels, colors, and icons across both web and mobile Usage UIs.

Macroscope summarized 37535e3.

@coderabbitai

coderabbitaiBot commented Aug 10, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 5febdc74-5d3a-41d5-b8c8-0dfe2c960759

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

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

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot 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.

One Effect-service convention issue found: loadCursorUsageRecords takes an HttpClient service instance as a parameter instead of acquiring it from the Effect environment, which erases the requirement from its Effect type. Details inline.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/UsageService.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:9cb738ead2

ℹ️ 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/usage/UsageService.ts
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/UsageService.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts
Comment threadapps/server/src/usage/UsageService.ts
Comment threadapps/server/src/usage/UsageService.ts
Comment threadapps/web/src/components/usage/usageProviders.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds Cursor as a new usage provider, introducing external API integration to cursor.com, local credential extraction from SQLite databases, and new pricing/parsing logic. The scope of this new feature warrants human review.

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

Comment threadapps/web/src/components/usage/UsagePage.tsx
Comment threadpackages/shared/src/usageMerge.ts
Cursor agent transcripts have no token counts, so usage comes from the
dashboard CSV export when Cursor desktop is signed in on the host.
API-equivalent costs use Cursor-published Auto/Composer/Grok rates and
LiteLLM aliases for third-party export slugs.
Key the CSV cache per Cursor user, skip failed sources when claiming
fingerprints, and treat Cursor exports as account-scoped so the same
login is not double-counted across hosts.
Stale-cache ok sources no longer claim an account fingerprint over a
sibling with real in-window spend. Coverage notice only flags Cursor
gaps so unused Claude/Codex homes stay quiet.
Comment threaddocs/README.md Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated

@macroscopeappmacroscopeappBot 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.

Two UI consistency findings in the changed usage web files. Both are small, localized fixes.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/usage/UsagePage.tsx
Comment threadapps/web/src/components/usage/usageProviders.ts Outdated
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Aug 17, 2026
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Aug 17, 2026
Merge OpenCode SQLite scanning alongside Cursor CSV export from pingdotgg#6046.
Resolves conflicts to support all four providers in contracts and UI.
Co-authored-by: Cursor <cursoragent@cursor.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 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.

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

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

totals.outputTokens === 0
) {
continue;
}

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.

Tokenless billed rows dropped

Medium Severity

parseCursorUsageCsv skips every row whose token columns are all zero before recording reportedCostUsd. Cursor exports often bill tooling models such as premium and agent_review with a numeric Cost and no tokens, so that spend never reaches the aggregator and Usage undercounts Cursor dollars.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

}
}
return null;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Auth DB probe short-circuits

Low Severity

findCursorStateDb returns the first existing state.vscdb candidate without checking for a usable cursorAuth/accessToken. A stale or logged-out DB earlier in the probe list (for example Windows Roaming ahead of LOCALAPPDATA) blocks later valid paths, so readLocalCursorExportAuth reports missing and Cursor stays uncovered.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Duplicates another usage-reporting proposal while adding a broad client, contract, or provider integration.

@t3dotggt3dotgg closed this Aug 23, 2026
@GimpyHand
GimpyHand deleted the feat/cursor-usage branch August 23, 2026 14:55
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.

2 participants

@GimpyHand@t3dotgg
, '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(usage): add Cursor to the Usage page - #6046

Closed
GimpyHand wants to merge 14 commits into
pingdotgg:mainfrom
GimpyHand:feat/cursor-usage
Closed

feat(usage): add Cursor to the Usage page#6046
GimpyHand wants to merge 14 commits into
pingdotgg:mainfrom
GimpyHand:feat/cursor-usage

Conversation

@GimpyHand

@GimpyHandGimpyHand commented Aug 10, 2026

Copy link
Copy Markdown

Summary

  • Adds Cursor as a third Usage provider (alongside Claude and Codex) on web and mobile.
  • Cursor agent transcripts have no token counts, so the server loads the same dashboard CSV export Cursor already exposes when desktop is signed in on the host (state.vscdb session → export-usage-events-csv), with a short on-disk cache and soft-fail so Claude/Codex still render if Cursor is missing.
  • Prices Cursor export slugs at API-equivalent rates: Cursor-published Auto Cost / Composer / Grok rates for product models, LiteLLM after stripping effort/thinking suffixes for third-party names, and provider-reported CSV dollars when present. Bumps usage contract to v4.
Screenshot from 2026-08-13 07-57-58

Why this path

Claude/Codex usage comes from local JSONL ledgers. Cursor does not write token totals locally, so a pure filesystem walk cannot cover it. Reusing the signed-in desktop session to fetch the user's own usage export matches the existing host-trust model (the environment machine already holds provider identity) without inventing a parallel billing system.

Costs remain estimates, not subscription invoices. Auto is priced as Auto Cost because the export does not say which Auto mode ran.

Test plan

  • vp test run apps/server/src/usage/usageCursorExport.test.ts apps/server/src/usage/usagePricing.test.ts apps/server/src/usage/usageAggregation.test.ts packages/shared/src/usageMerge.test.ts
  • On a machine with Cursor desktop signed in, open Usage and confirm a Cursor series with non-zero tokens
  • Confirm Included rows still contribute tokens and get API-equivalent dollars (not stuck at $0)
  • On a machine without Cursor login, Usage still shows Claude/Codex and marks Cursor uncovered
  • Multi-environment merge does not double-count the same Cursor export fingerprint

Note

Medium Risk
Reads local Cursor auth from SQLite and calls Cursor’s API with the desktop session token; cost figures remain estimates and merge logic changed for shared Cursor accounts.

Overview
Adds Cursor as a third Usage provider on web and mobile (contract v4), alongside Claude and Codex.

Because Cursor transcripts have no token counts, the server loads usage from Cursor’s dashboard CSV export when desktop is signed in: it reads cursorAuth/accessToken from state.vscdb, calls the export API with a session cookie, caches the CSV per account (~5 min freshness), and parses v1/v2/v3 CSV shapes into the same UsageRecord pipeline. Failures are soft so Claude/Codex still render; merge uses a account-scoped fingerprint (cursor-account + cursor-export:user_*) so the same login is not double-counted across machines or worktrees, with richest in-window data winning ties.

Pricing gains Cursor-published rates for Auto / Composer / Grok, strips effort/thinking suffixes for LiteLLM lookup, drops zero-cost LiteLLM auto rows, and leaves “Included” CSV costs unreported so API-equivalent pricing still applies.

UI surfaces Cursor in charts/tables and shows coverage notices only for Cursor missing/failed exports (isCursorCoverageGap), not unused Claude/Codex homes. User docs describe sources and Cursor coverage requirements.

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

Note

Add Cursor as a usage provider on the Usage page

  • Adds a new usageCursorExport module that locates Cursor's local SQLite DB, extracts an auth token, fetches the dashboard CSV export, caches it with a TTL, and parses multiple CSV schema variants (v1/v2/v3) into UsageRecord arrays.
  • Integrates Cursor records into UsageService.readSummary, soft-failing on errors and reporting a UsageSource with status and distinct session counts.
  • Extends usagePricing with Cursor-native rate tables for Auto, Composer 2/2.5, and Grok 4.5 slugs; fixes zero-cost LiteLLM rows from masking these rates.
  • Updates usageMerge so the richest data owner wins when multiple environments share a Cursor account fingerprint, and adds isCursorCoverageGap for surfacing missing/failed Cursor exports in UI notices.
  • Adds cursor to provider ordering, labels, colors, and icons across both web and mobile Usage UIs.

Macroscope summarized 37535e3.

@coderabbitai

coderabbitaiBot commented Aug 10, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 5febdc74-5d3a-41d5-b8c8-0dfe2c960759

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

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

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot 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.

One Effect-service convention issue found: loadCursorUsageRecords takes an HttpClient service instance as a parameter instead of acquiring it from the Effect environment, which erases the requirement from its Effect type. Details inline.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/UsageService.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:9cb738ead2

ℹ️ 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/usage/UsageService.ts
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/UsageService.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts
Comment threadapps/server/src/usage/UsageService.ts
Comment threadapps/server/src/usage/UsageService.ts
Comment threadapps/web/src/components/usage/usageProviders.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds Cursor as a new usage provider, introducing external API integration to cursor.com, local credential extraction from SQLite databases, and new pricing/parsing logic. The scope of this new feature warrants human review.

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

Comment threadapps/web/src/components/usage/UsagePage.tsx
Comment threadpackages/shared/src/usageMerge.ts
Cursor agent transcripts have no token counts, so usage comes from the
dashboard CSV export when Cursor desktop is signed in on the host.
API-equivalent costs use Cursor-published Auto/Composer/Grok rates and
LiteLLM aliases for third-party export slugs.
Key the CSV cache per Cursor user, skip failed sources when claiming
fingerprints, and treat Cursor exports as account-scoped so the same
login is not double-counted across hosts.
Stale-cache ok sources no longer claim an account fingerprint over a
sibling with real in-window spend. Coverage notice only flags Cursor
gaps so unused Claude/Codex homes stay quiet.
Comment threaddocs/README.md Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated

@macroscopeappmacroscopeappBot 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.

Two UI consistency findings in the changed usage web files. Both are small, localized fixes.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/usage/UsagePage.tsx
Comment threadapps/web/src/components/usage/usageProviders.ts Outdated
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Aug 17, 2026
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Aug 17, 2026
Merge OpenCode SQLite scanning alongside Cursor CSV export from pingdotgg#6046.
Resolves conflicts to support all four providers in contracts and UI.
Co-authored-by: Cursor <cursoragent@cursor.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 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.

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

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

totals.outputTokens === 0
) {
continue;
}

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.

Tokenless billed rows dropped

Medium Severity

parseCursorUsageCsv skips every row whose token columns are all zero before recording reportedCostUsd. Cursor exports often bill tooling models such as premium and agent_review with a numeric Cost and no tokens, so that spend never reaches the aggregator and Usage undercounts Cursor dollars.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

}
}
return null;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Auth DB probe short-circuits

Low Severity

findCursorStateDb returns the first existing state.vscdb candidate without checking for a usable cursorAuth/accessToken. A stale or logged-out DB earlier in the probe list (for example Windows Roaming ahead of LOCALAPPDATA) blocks later valid paths, so readLocalCursorExportAuth reports missing and Cursor stays uncovered.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Duplicates another usage-reporting proposal while adding a broad client, contract, or provider integration.

@t3dotggt3dotgg closed this Aug 23, 2026
@GimpyHand
GimpyHand deleted the feat/cursor-usage branch August 23, 2026 14:55
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.

2 participants

@GimpyHand@t3dotgg
, '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(usage): add Cursor to the Usage page - #6046

Closed
GimpyHand wants to merge 14 commits into
pingdotgg:mainfrom
GimpyHand:feat/cursor-usage
Closed

feat(usage): add Cursor to the Usage page#6046
GimpyHand wants to merge 14 commits into
pingdotgg:mainfrom
GimpyHand:feat/cursor-usage

Conversation

@GimpyHand

@GimpyHandGimpyHand commented Aug 10, 2026

Copy link
Copy Markdown

Summary

  • Adds Cursor as a third Usage provider (alongside Claude and Codex) on web and mobile.
  • Cursor agent transcripts have no token counts, so the server loads the same dashboard CSV export Cursor already exposes when desktop is signed in on the host (state.vscdb session → export-usage-events-csv), with a short on-disk cache and soft-fail so Claude/Codex still render if Cursor is missing.
  • Prices Cursor export slugs at API-equivalent rates: Cursor-published Auto Cost / Composer / Grok rates for product models, LiteLLM after stripping effort/thinking suffixes for third-party names, and provider-reported CSV dollars when present. Bumps usage contract to v4.
Screenshot from 2026-08-13 07-57-58

Why this path

Claude/Codex usage comes from local JSONL ledgers. Cursor does not write token totals locally, so a pure filesystem walk cannot cover it. Reusing the signed-in desktop session to fetch the user's own usage export matches the existing host-trust model (the environment machine already holds provider identity) without inventing a parallel billing system.

Costs remain estimates, not subscription invoices. Auto is priced as Auto Cost because the export does not say which Auto mode ran.

Test plan

  • vp test run apps/server/src/usage/usageCursorExport.test.ts apps/server/src/usage/usagePricing.test.ts apps/server/src/usage/usageAggregation.test.ts packages/shared/src/usageMerge.test.ts
  • On a machine with Cursor desktop signed in, open Usage and confirm a Cursor series with non-zero tokens
  • Confirm Included rows still contribute tokens and get API-equivalent dollars (not stuck at $0)
  • On a machine without Cursor login, Usage still shows Claude/Codex and marks Cursor uncovered
  • Multi-environment merge does not double-count the same Cursor export fingerprint

Note

Medium Risk
Reads local Cursor auth from SQLite and calls Cursor’s API with the desktop session token; cost figures remain estimates and merge logic changed for shared Cursor accounts.

Overview
Adds Cursor as a third Usage provider on web and mobile (contract v4), alongside Claude and Codex.

Because Cursor transcripts have no token counts, the server loads usage from Cursor’s dashboard CSV export when desktop is signed in: it reads cursorAuth/accessToken from state.vscdb, calls the export API with a session cookie, caches the CSV per account (~5 min freshness), and parses v1/v2/v3 CSV shapes into the same UsageRecord pipeline. Failures are soft so Claude/Codex still render; merge uses a account-scoped fingerprint (cursor-account + cursor-export:user_*) so the same login is not double-counted across machines or worktrees, with richest in-window data winning ties.

Pricing gains Cursor-published rates for Auto / Composer / Grok, strips effort/thinking suffixes for LiteLLM lookup, drops zero-cost LiteLLM auto rows, and leaves “Included” CSV costs unreported so API-equivalent pricing still applies.

UI surfaces Cursor in charts/tables and shows coverage notices only for Cursor missing/failed exports (isCursorCoverageGap), not unused Claude/Codex homes. User docs describe sources and Cursor coverage requirements.

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

Note

Add Cursor as a usage provider on the Usage page

  • Adds a new usageCursorExport module that locates Cursor's local SQLite DB, extracts an auth token, fetches the dashboard CSV export, caches it with a TTL, and parses multiple CSV schema variants (v1/v2/v3) into UsageRecord arrays.
  • Integrates Cursor records into UsageService.readSummary, soft-failing on errors and reporting a UsageSource with status and distinct session counts.
  • Extends usagePricing with Cursor-native rate tables for Auto, Composer 2/2.5, and Grok 4.5 slugs; fixes zero-cost LiteLLM rows from masking these rates.
  • Updates usageMerge so the richest data owner wins when multiple environments share a Cursor account fingerprint, and adds isCursorCoverageGap for surfacing missing/failed Cursor exports in UI notices.
  • Adds cursor to provider ordering, labels, colors, and icons across both web and mobile Usage UIs.

Macroscope summarized 37535e3.

@coderabbitai

coderabbitaiBot commented Aug 10, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 5febdc74-5d3a-41d5-b8c8-0dfe2c960759

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

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

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot 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.

One Effect-service convention issue found: loadCursorUsageRecords takes an HttpClient service instance as a parameter instead of acquiring it from the Effect environment, which erases the requirement from its Effect type. Details inline.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/UsageService.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:9cb738ead2

ℹ️ 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/usage/UsageService.ts
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/UsageService.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts
Comment threadapps/server/src/usage/UsageService.ts
Comment threadapps/server/src/usage/UsageService.ts
Comment threadapps/web/src/components/usage/usageProviders.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds Cursor as a new usage provider, introducing external API integration to cursor.com, local credential extraction from SQLite databases, and new pricing/parsing logic. The scope of this new feature warrants human review.

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

Comment threadapps/web/src/components/usage/UsagePage.tsx
Comment threadpackages/shared/src/usageMerge.ts
Cursor agent transcripts have no token counts, so usage comes from the
dashboard CSV export when Cursor desktop is signed in on the host.
API-equivalent costs use Cursor-published Auto/Composer/Grok rates and
LiteLLM aliases for third-party export slugs.
Key the CSV cache per Cursor user, skip failed sources when claiming
fingerprints, and treat Cursor exports as account-scoped so the same
login is not double-counted across hosts.
Stale-cache ok sources no longer claim an account fingerprint over a
sibling with real in-window spend. Coverage notice only flags Cursor
gaps so unused Claude/Codex homes stay quiet.
Comment threaddocs/README.md Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated

@macroscopeappmacroscopeappBot 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.

Two UI consistency findings in the changed usage web files. Both are small, localized fixes.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/usage/UsagePage.tsx
Comment threadapps/web/src/components/usage/usageProviders.ts Outdated
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Aug 17, 2026
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Aug 17, 2026
Merge OpenCode SQLite scanning alongside Cursor CSV export from pingdotgg#6046.
Resolves conflicts to support all four providers in contracts and UI.
Co-authored-by: Cursor <cursoragent@cursor.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 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.

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

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

totals.outputTokens === 0
) {
continue;
}

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.

Tokenless billed rows dropped

Medium Severity

parseCursorUsageCsv skips every row whose token columns are all zero before recording reportedCostUsd. Cursor exports often bill tooling models such as premium and agent_review with a numeric Cost and no tokens, so that spend never reaches the aggregator and Usage undercounts Cursor dollars.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

}
}
return null;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Auth DB probe short-circuits

Low Severity

findCursorStateDb returns the first existing state.vscdb candidate without checking for a usable cursorAuth/accessToken. A stale or logged-out DB earlier in the probe list (for example Windows Roaming ahead of LOCALAPPDATA) blocks later valid paths, so readLocalCursorExportAuth reports missing and Cursor stays uncovered.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Duplicates another usage-reporting proposal while adding a broad client, contract, or provider integration.

@t3dotggt3dotgg closed this Aug 23, 2026
@GimpyHand
GimpyHand deleted the feat/cursor-usage branch August 23, 2026 14:55
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.

2 participants

@GimpyHand@t3dotgg
, '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(usage): add Cursor to the Usage page - #6046

Closed
GimpyHand wants to merge 14 commits into
pingdotgg:mainfrom
GimpyHand:feat/cursor-usage
Closed

feat(usage): add Cursor to the Usage page#6046
GimpyHand wants to merge 14 commits into
pingdotgg:mainfrom
GimpyHand:feat/cursor-usage

Conversation

@GimpyHand

@GimpyHandGimpyHand commented Aug 10, 2026

Copy link
Copy Markdown

Summary

  • Adds Cursor as a third Usage provider (alongside Claude and Codex) on web and mobile.
  • Cursor agent transcripts have no token counts, so the server loads the same dashboard CSV export Cursor already exposes when desktop is signed in on the host (state.vscdb session → export-usage-events-csv), with a short on-disk cache and soft-fail so Claude/Codex still render if Cursor is missing.
  • Prices Cursor export slugs at API-equivalent rates: Cursor-published Auto Cost / Composer / Grok rates for product models, LiteLLM after stripping effort/thinking suffixes for third-party names, and provider-reported CSV dollars when present. Bumps usage contract to v4.
Screenshot from 2026-08-13 07-57-58

Why this path

Claude/Codex usage comes from local JSONL ledgers. Cursor does not write token totals locally, so a pure filesystem walk cannot cover it. Reusing the signed-in desktop session to fetch the user's own usage export matches the existing host-trust model (the environment machine already holds provider identity) without inventing a parallel billing system.

Costs remain estimates, not subscription invoices. Auto is priced as Auto Cost because the export does not say which Auto mode ran.

Test plan

  • vp test run apps/server/src/usage/usageCursorExport.test.ts apps/server/src/usage/usagePricing.test.ts apps/server/src/usage/usageAggregation.test.ts packages/shared/src/usageMerge.test.ts
  • On a machine with Cursor desktop signed in, open Usage and confirm a Cursor series with non-zero tokens
  • Confirm Included rows still contribute tokens and get API-equivalent dollars (not stuck at $0)
  • On a machine without Cursor login, Usage still shows Claude/Codex and marks Cursor uncovered
  • Multi-environment merge does not double-count the same Cursor export fingerprint

Note

Medium Risk
Reads local Cursor auth from SQLite and calls Cursor’s API with the desktop session token; cost figures remain estimates and merge logic changed for shared Cursor accounts.

Overview
Adds Cursor as a third Usage provider on web and mobile (contract v4), alongside Claude and Codex.

Because Cursor transcripts have no token counts, the server loads usage from Cursor’s dashboard CSV export when desktop is signed in: it reads cursorAuth/accessToken from state.vscdb, calls the export API with a session cookie, caches the CSV per account (~5 min freshness), and parses v1/v2/v3 CSV shapes into the same UsageRecord pipeline. Failures are soft so Claude/Codex still render; merge uses a account-scoped fingerprint (cursor-account + cursor-export:user_*) so the same login is not double-counted across machines or worktrees, with richest in-window data winning ties.

Pricing gains Cursor-published rates for Auto / Composer / Grok, strips effort/thinking suffixes for LiteLLM lookup, drops zero-cost LiteLLM auto rows, and leaves “Included” CSV costs unreported so API-equivalent pricing still applies.

UI surfaces Cursor in charts/tables and shows coverage notices only for Cursor missing/failed exports (isCursorCoverageGap), not unused Claude/Codex homes. User docs describe sources and Cursor coverage requirements.

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

Note

Add Cursor as a usage provider on the Usage page

  • Adds a new usageCursorExport module that locates Cursor's local SQLite DB, extracts an auth token, fetches the dashboard CSV export, caches it with a TTL, and parses multiple CSV schema variants (v1/v2/v3) into UsageRecord arrays.
  • Integrates Cursor records into UsageService.readSummary, soft-failing on errors and reporting a UsageSource with status and distinct session counts.
  • Extends usagePricing with Cursor-native rate tables for Auto, Composer 2/2.5, and Grok 4.5 slugs; fixes zero-cost LiteLLM rows from masking these rates.
  • Updates usageMerge so the richest data owner wins when multiple environments share a Cursor account fingerprint, and adds isCursorCoverageGap for surfacing missing/failed Cursor exports in UI notices.
  • Adds cursor to provider ordering, labels, colors, and icons across both web and mobile Usage UIs.

Macroscope summarized 37535e3.

@coderabbitai

coderabbitaiBot commented Aug 10, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 5febdc74-5d3a-41d5-b8c8-0dfe2c960759

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

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

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot 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.

One Effect-service convention issue found: loadCursorUsageRecords takes an HttpClient service instance as a parameter instead of acquiring it from the Effect environment, which erases the requirement from its Effect type. Details inline.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/UsageService.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:9cb738ead2

ℹ️ 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/usage/UsageService.ts
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/UsageService.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts
Comment threadapps/server/src/usage/UsageService.ts
Comment threadapps/server/src/usage/UsageService.ts
Comment threadapps/web/src/components/usage/usageProviders.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds Cursor as a new usage provider, introducing external API integration to cursor.com, local credential extraction from SQLite databases, and new pricing/parsing logic. The scope of this new feature warrants human review.

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

Comment threadapps/web/src/components/usage/UsagePage.tsx
Comment threadpackages/shared/src/usageMerge.ts
Cursor agent transcripts have no token counts, so usage comes from the
dashboard CSV export when Cursor desktop is signed in on the host.
API-equivalent costs use Cursor-published Auto/Composer/Grok rates and
LiteLLM aliases for third-party export slugs.
Key the CSV cache per Cursor user, skip failed sources when claiming
fingerprints, and treat Cursor exports as account-scoped so the same
login is not double-counted across hosts.
Stale-cache ok sources no longer claim an account fingerprint over a
sibling with real in-window spend. Coverage notice only flags Cursor
gaps so unused Claude/Codex homes stay quiet.
Comment threaddocs/README.md Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated

@macroscopeappmacroscopeappBot 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.

Two UI consistency findings in the changed usage web files. Both are small, localized fixes.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/usage/UsagePage.tsx
Comment threadapps/web/src/components/usage/usageProviders.ts Outdated
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Aug 17, 2026
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Aug 17, 2026
Merge OpenCode SQLite scanning alongside Cursor CSV export from pingdotgg#6046.
Resolves conflicts to support all four providers in contracts and UI.
Co-authored-by: Cursor <cursoragent@cursor.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 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.

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

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

totals.outputTokens === 0
) {
continue;
}

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.

Tokenless billed rows dropped

Medium Severity

parseCursorUsageCsv skips every row whose token columns are all zero before recording reportedCostUsd. Cursor exports often bill tooling models such as premium and agent_review with a numeric Cost and no tokens, so that spend never reaches the aggregator and Usage undercounts Cursor dollars.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

}
}
return null;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Auth DB probe short-circuits

Low Severity

findCursorStateDb returns the first existing state.vscdb candidate without checking for a usable cursorAuth/accessToken. A stale or logged-out DB earlier in the probe list (for example Windows Roaming ahead of LOCALAPPDATA) blocks later valid paths, so readLocalCursorExportAuth reports missing and Cursor stays uncovered.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Duplicates another usage-reporting proposal while adding a broad client, contract, or provider integration.

@t3dotggt3dotgg closed this Aug 23, 2026
@GimpyHand
GimpyHand deleted the feat/cursor-usage branch August 23, 2026 14:55
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.

2 participants

@GimpyHand@t3dotgg
, '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(usage): add Cursor to the Usage page - #6046

Closed
GimpyHand wants to merge 14 commits into
pingdotgg:mainfrom
GimpyHand:feat/cursor-usage
Closed

feat(usage): add Cursor to the Usage page#6046
GimpyHand wants to merge 14 commits into
pingdotgg:mainfrom
GimpyHand:feat/cursor-usage

Conversation

@GimpyHand

@GimpyHandGimpyHand commented Aug 10, 2026

Copy link
Copy Markdown

Summary

  • Adds Cursor as a third Usage provider (alongside Claude and Codex) on web and mobile.
  • Cursor agent transcripts have no token counts, so the server loads the same dashboard CSV export Cursor already exposes when desktop is signed in on the host (state.vscdb session → export-usage-events-csv), with a short on-disk cache and soft-fail so Claude/Codex still render if Cursor is missing.
  • Prices Cursor export slugs at API-equivalent rates: Cursor-published Auto Cost / Composer / Grok rates for product models, LiteLLM after stripping effort/thinking suffixes for third-party names, and provider-reported CSV dollars when present. Bumps usage contract to v4.
Screenshot from 2026-08-13 07-57-58

Why this path

Claude/Codex usage comes from local JSONL ledgers. Cursor does not write token totals locally, so a pure filesystem walk cannot cover it. Reusing the signed-in desktop session to fetch the user's own usage export matches the existing host-trust model (the environment machine already holds provider identity) without inventing a parallel billing system.

Costs remain estimates, not subscription invoices. Auto is priced as Auto Cost because the export does not say which Auto mode ran.

Test plan

  • vp test run apps/server/src/usage/usageCursorExport.test.ts apps/server/src/usage/usagePricing.test.ts apps/server/src/usage/usageAggregation.test.ts packages/shared/src/usageMerge.test.ts
  • On a machine with Cursor desktop signed in, open Usage and confirm a Cursor series with non-zero tokens
  • Confirm Included rows still contribute tokens and get API-equivalent dollars (not stuck at $0)
  • On a machine without Cursor login, Usage still shows Claude/Codex and marks Cursor uncovered
  • Multi-environment merge does not double-count the same Cursor export fingerprint

Note

Medium Risk
Reads local Cursor auth from SQLite and calls Cursor’s API with the desktop session token; cost figures remain estimates and merge logic changed for shared Cursor accounts.

Overview
Adds Cursor as a third Usage provider on web and mobile (contract v4), alongside Claude and Codex.

Because Cursor transcripts have no token counts, the server loads usage from Cursor’s dashboard CSV export when desktop is signed in: it reads cursorAuth/accessToken from state.vscdb, calls the export API with a session cookie, caches the CSV per account (~5 min freshness), and parses v1/v2/v3 CSV shapes into the same UsageRecord pipeline. Failures are soft so Claude/Codex still render; merge uses a account-scoped fingerprint (cursor-account + cursor-export:user_*) so the same login is not double-counted across machines or worktrees, with richest in-window data winning ties.

Pricing gains Cursor-published rates for Auto / Composer / Grok, strips effort/thinking suffixes for LiteLLM lookup, drops zero-cost LiteLLM auto rows, and leaves “Included” CSV costs unreported so API-equivalent pricing still applies.

UI surfaces Cursor in charts/tables and shows coverage notices only for Cursor missing/failed exports (isCursorCoverageGap), not unused Claude/Codex homes. User docs describe sources and Cursor coverage requirements.

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

Note

Add Cursor as a usage provider on the Usage page

  • Adds a new usageCursorExport module that locates Cursor's local SQLite DB, extracts an auth token, fetches the dashboard CSV export, caches it with a TTL, and parses multiple CSV schema variants (v1/v2/v3) into UsageRecord arrays.
  • Integrates Cursor records into UsageService.readSummary, soft-failing on errors and reporting a UsageSource with status and distinct session counts.
  • Extends usagePricing with Cursor-native rate tables for Auto, Composer 2/2.5, and Grok 4.5 slugs; fixes zero-cost LiteLLM rows from masking these rates.
  • Updates usageMerge so the richest data owner wins when multiple environments share a Cursor account fingerprint, and adds isCursorCoverageGap for surfacing missing/failed Cursor exports in UI notices.
  • Adds cursor to provider ordering, labels, colors, and icons across both web and mobile Usage UIs.

Macroscope summarized 37535e3.

@coderabbitai

coderabbitaiBot commented Aug 10, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 5febdc74-5d3a-41d5-b8c8-0dfe2c960759

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

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

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 10, 2026

@macroscopeappmacroscopeappBot 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.

One Effect-service convention issue found: loadCursorUsageRecords takes an HttpClient service instance as a parameter instead of acquiring it from the Effect environment, which erases the requirement from its Effect type. Details inline.

Posted via Macroscope — Effect Service Conventions

Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/UsageService.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:9cb738ead2

ℹ️ 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/usage/UsageService.ts
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/UsageService.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts
Comment threadapps/server/src/usage/UsageService.ts
Comment threadapps/server/src/usage/UsageService.ts
Comment threadapps/web/src/components/usage/usageProviders.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds Cursor as a new usage provider, introducing external API integration to cursor.com, local credential extraction from SQLite databases, and new pricing/parsing logic. The scope of this new feature warrants human review.

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

Comment threadapps/web/src/components/usage/UsagePage.tsx
Comment threadpackages/shared/src/usageMerge.ts
Cursor agent transcripts have no token counts, so usage comes from the
dashboard CSV export when Cursor desktop is signed in on the host.
API-equivalent costs use Cursor-published Auto/Composer/Grok rates and
LiteLLM aliases for third-party export slugs.
Key the CSV cache per Cursor user, skip failed sources when claiming
fingerprints, and treat Cursor exports as account-scoped so the same
login is not double-counted across hosts.
Stale-cache ok sources no longer claim an account fingerprint over a
sibling with real in-window spend. Coverage notice only flags Cursor
gaps so unused Claude/Codex homes stay quiet.
Comment threaddocs/README.md Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated
Comment threadapps/server/src/usage/usageCursorExport.ts Outdated

@macroscopeappmacroscopeappBot 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.

Two UI consistency findings in the changed usage web files. Both are small, localized fixes.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/usage/UsagePage.tsx
Comment threadapps/web/src/components/usage/usageProviders.ts Outdated
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Aug 17, 2026
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Aug 17, 2026
Merge OpenCode SQLite scanning alongside Cursor CSV export from pingdotgg#6046.
Resolves conflicts to support all four providers in contracts and UI.
Co-authored-by: Cursor <cursoragent@cursor.com>

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes using high effort and found 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.

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

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

totals.outputTokens === 0
) {
continue;
}

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.

Tokenless billed rows dropped

Medium Severity

parseCursorUsageCsv skips every row whose token columns are all zero before recording reportedCostUsd. Cursor exports often bill tooling models such as premium and agent_review with a numeric Cost and no tokens, so that spend never reaches the aggregator and Usage undercounts Cursor dollars.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

}
}
return null;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Auth DB probe short-circuits

Low Severity

findCursorStateDb returns the first existing state.vscdb candidate without checking for a usable cursorAuth/accessToken. A stale or logged-out DB earlier in the probe list (for example Windows Roaming ahead of LOCALAPPDATA) blocks later valid paths, so readLocalCursorExportAuth reports missing and Cursor stays uncovered.

Additional Locations (1)
Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit 37535e3. Configure here.

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Duplicates another usage-reporting proposal while adding a broad client, contract, or provider integration.

@t3dotggt3dotgg closed this Aug 23, 2026
@GimpyHand
GimpyHand deleted the feat/cursor-usage branch August 23, 2026 14:55
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.

2 participants

@GimpyHand@t3dotgg