feat(usage): add OpenCode usage reporting - #6040

Closed
gmmeyer wants to merge 3 commits into
pingdotgg:mainfrom
gmmeyer:t3code/add-opencode-usage
Closed

feat(usage): add OpenCode usage reporting#6040
gmmeyer wants to merge 3 commits into
pingdotgg:mainfrom
gmmeyer:t3code/add-opencode-usage

Conversation

@gmmeyer

@gmmeyergmmeyer commented Aug 10, 2026

Copy link
Copy Markdown

What Changed

Add Opencode usage to t3 usage page

Why

I use opencode as well as claude and codex so I can use open or alternative models. This will add opencode usage to the page as well. Opencode stores the data in a different way than claude or codex (sqlite), which forces us to slightly change the calculation mechanism. But it's basically the same.

UI Changes

This is what it looks like now:
image

This is what it will look like:
image

Checklist

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

Note

Medium Risk
New local SQLite reads and a contract version bump affect usage aggregation across clients; reads are scoped to usage scalars only, limiting exposure of prompt content.

Overview
Adds OpenCode as a third usage provider alongside Claude Code and Codex, reading local SQLite assistant-message data instead of JSONL transcripts.

The server introduces usageOpenCode for read-only SQLite access (Bun and Node), maps legacy message and current session_message rows into shared UsageRecords without selecting conversation content, and discovers databases under OpenCode’s data dir with support for OPENCODE_DB, channel DBs, and OPENCODE_DISABLE_CHANNEL_DB. UsageService branches on source kind (jsonl vs opencodeSqlite) and reports OpenCode-specific missing/partial/failed source status.

The shared contract adds opencode to UsageProviderKind and bumps USAGE_CONTRACT_VERSION to 5. Web and mobile charts/tables register OpenCode label, color, and icon; the web usage table’s empty-state colSpan now follows PROVIDER_ORDER length. User docs describe OpenCode sourcing and privacy boundaries.

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

Note

Add OpenCode usage reporting to usage summary and UI

  • Adds readOpenCodeUsage and resolveOpenCodeDatabasePaths in usageOpenCode.ts to read assistant usage from OpenCode SQLite databases, supporting both current and legacy schemas with deduplication by message ID.
  • Integrates OpenCode as a new source in UsageService, discovering channel databases via directory scan and reporting partial/failed states per database.
  • Registers opencode in provider ordering, labels, colors, and icons across web and mobile UI, and adds an OpenCodeIcon mark to the chart legend.
  • Increments USAGE_CONTRACT_VERSION from 4 to 5 and adds opencode to the UsageProviderKind schema in packages/contracts/src/usage.ts.
  • Risk: version bump to contract v5 may cause version-mismatch warnings or partial-state handling in clients that validate the contract version.

Macroscope summarized 3bd1517.

@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: 44678b53-e708-4389-b6aa-3a97bdafbf47

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 size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 10, 2026
Comment threadapps/server/src/usage/usageOpenCode.ts
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

Adds a new third-party tool integration (OpenCode) with SQLite database reading, new UI display, and contract changes. While well-tested and following existing patterns, the scope of new capability (~850 lines, new database access, schema handling) warrants human review.

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

@AskPlays

Copy link
Copy Markdown

Two follow-ups from running this on a fork of t3code (I cherry-picked this
branch locally):

1. The opencode.db path is hardcoded, OPENCODE_DB and channel installs are
ignored

UsageService.ts resolves the database as {XDG data dir}/opencode/opencode.db,
but opencode's own resolution (packages/core/src/database/database.ts in
v1.18.16) is:

  • OPENCODE_DB wins when set: absolute paths are used verbatim, relative paths
    resolve against the data dir (:memory: aside);
  • non-stable channels write opencode-<channel>.db instead of opencode.db.

Any install with OPENCODE_DB set (or a channel build) would silently report
zero OpenCode usage. I suggest mirroring opencode's resolution, e.g. a small
resolveOpenCodeDatabasePath(dataDir) helper that honors OPENCODE_DB, and
either handles the channel suffix or documents it as out of scope.

2. Zero-token placeholder rows are counted as malformed → the source reports
partial

parseOpenCodeUsageRow returns null for the placeholder assistant rows
opencode writes for aborted/empty attempts (valid identity + model, zero
tokens, cost: 0), and readOpenCodeUsage counts every null as
malformedRecords. The source then reports status: "partial" with "Some
OpenCode usage records could not be parsed" on perfectly healthy installs
(75 such rows in my db). I suggest distinguishing placeholders from malformed
rows, e.g. an isOpenCodePlaceholderRow check before incrementing the
malformed count. So that partial stays reserved for actually malformed rows.

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

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

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

Reviewed by Cursor Bugbot for commit ffbd13f7365502fec8a1bb8e151b36c4390dd2d9. Configure here.

Comment threadapps/server/src/usage/UsageService.ts
@gmmeyer
gmmeyerforce-pushed the t3code/add-opencode-usage branch from ffbd13f to 5c7d442CompareAugust 11, 2026 23:59
Comment threadpackages/contracts/src/usage.ts Outdated
Comment threadapps/server/src/usage/usageOpenCode.ts
@gmmeyer

Copy link
Copy Markdown
Author

@AskPlays I fixed these issues thank you!

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>
@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
Project516 added a commit to Project516/t3code that referenced this pull request Aug 27, 2026
Usage currently only reports claude and codex. Users who run
opencode see empty or low totals on the Usage page, even though
their SQLite store holds the same token and cost data.
This bumps USAGE_CONTRACT_VERSION to 5, adds opencode to
UsageProviderKind, and registers the label, color and icon in
web and mobile. The page can now render the third provider
once the server starts scanning opencode.db. The scan itself
follows in a next change, as in pingdotgg#6040.
Closespingdotgg#7622
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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.

3 participants

@gmmeyer@AskPlays@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 OpenCode usage reporting - #6040

Closed
gmmeyer wants to merge 3 commits into
pingdotgg:mainfrom
gmmeyer:t3code/add-opencode-usage
Closed

feat(usage): add OpenCode usage reporting#6040
gmmeyer wants to merge 3 commits into
pingdotgg:mainfrom
gmmeyer:t3code/add-opencode-usage

Conversation

@gmmeyer

@gmmeyergmmeyer commented Aug 10, 2026

Copy link
Copy Markdown

What Changed

Add Opencode usage to t3 usage page

Why

I use opencode as well as claude and codex so I can use open or alternative models. This will add opencode usage to the page as well. Opencode stores the data in a different way than claude or codex (sqlite), which forces us to slightly change the calculation mechanism. But it's basically the same.

UI Changes

This is what it looks like now:
image

This is what it will look like:
image

Checklist

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

Note

Medium Risk
New local SQLite reads and a contract version bump affect usage aggregation across clients; reads are scoped to usage scalars only, limiting exposure of prompt content.

Overview
Adds OpenCode as a third usage provider alongside Claude Code and Codex, reading local SQLite assistant-message data instead of JSONL transcripts.

The server introduces usageOpenCode for read-only SQLite access (Bun and Node), maps legacy message and current session_message rows into shared UsageRecords without selecting conversation content, and discovers databases under OpenCode’s data dir with support for OPENCODE_DB, channel DBs, and OPENCODE_DISABLE_CHANNEL_DB. UsageService branches on source kind (jsonl vs opencodeSqlite) and reports OpenCode-specific missing/partial/failed source status.

The shared contract adds opencode to UsageProviderKind and bumps USAGE_CONTRACT_VERSION to 5. Web and mobile charts/tables register OpenCode label, color, and icon; the web usage table’s empty-state colSpan now follows PROVIDER_ORDER length. User docs describe OpenCode sourcing and privacy boundaries.

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

Note

Add OpenCode usage reporting to usage summary and UI

  • Adds readOpenCodeUsage and resolveOpenCodeDatabasePaths in usageOpenCode.ts to read assistant usage from OpenCode SQLite databases, supporting both current and legacy schemas with deduplication by message ID.
  • Integrates OpenCode as a new source in UsageService, discovering channel databases via directory scan and reporting partial/failed states per database.
  • Registers opencode in provider ordering, labels, colors, and icons across web and mobile UI, and adds an OpenCodeIcon mark to the chart legend.
  • Increments USAGE_CONTRACT_VERSION from 4 to 5 and adds opencode to the UsageProviderKind schema in packages/contracts/src/usage.ts.
  • Risk: version bump to contract v5 may cause version-mismatch warnings or partial-state handling in clients that validate the contract version.

Macroscope summarized 3bd1517.

@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: 44678b53-e708-4389-b6aa-3a97bdafbf47

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 size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 10, 2026
Comment threadapps/server/src/usage/usageOpenCode.ts
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

Adds a new third-party tool integration (OpenCode) with SQLite database reading, new UI display, and contract changes. While well-tested and following existing patterns, the scope of new capability (~850 lines, new database access, schema handling) warrants human review.

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

@AskPlays

Copy link
Copy Markdown

Two follow-ups from running this on a fork of t3code (I cherry-picked this
branch locally):

1. The opencode.db path is hardcoded, OPENCODE_DB and channel installs are
ignored

UsageService.ts resolves the database as {XDG data dir}/opencode/opencode.db,
but opencode's own resolution (packages/core/src/database/database.ts in
v1.18.16) is:

  • OPENCODE_DB wins when set: absolute paths are used verbatim, relative paths
    resolve against the data dir (:memory: aside);
  • non-stable channels write opencode-<channel>.db instead of opencode.db.

Any install with OPENCODE_DB set (or a channel build) would silently report
zero OpenCode usage. I suggest mirroring opencode's resolution, e.g. a small
resolveOpenCodeDatabasePath(dataDir) helper that honors OPENCODE_DB, and
either handles the channel suffix or documents it as out of scope.

2. Zero-token placeholder rows are counted as malformed → the source reports
partial

parseOpenCodeUsageRow returns null for the placeholder assistant rows
opencode writes for aborted/empty attempts (valid identity + model, zero
tokens, cost: 0), and readOpenCodeUsage counts every null as
malformedRecords. The source then reports status: "partial" with "Some
OpenCode usage records could not be parsed" on perfectly healthy installs
(75 such rows in my db). I suggest distinguishing placeholders from malformed
rows, e.g. an isOpenCodePlaceholderRow check before incrementing the
malformed count. So that partial stays reserved for actually malformed rows.

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

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

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

Reviewed by Cursor Bugbot for commit ffbd13f7365502fec8a1bb8e151b36c4390dd2d9. Configure here.

Comment threadapps/server/src/usage/UsageService.ts
@gmmeyer
gmmeyerforce-pushed the t3code/add-opencode-usage branch from ffbd13f to 5c7d442CompareAugust 11, 2026 23:59
Comment threadpackages/contracts/src/usage.ts Outdated
Comment threadapps/server/src/usage/usageOpenCode.ts
@gmmeyer

Copy link
Copy Markdown
Author

@AskPlays I fixed these issues thank you!

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>
@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
Project516 added a commit to Project516/t3code that referenced this pull request Aug 27, 2026
Usage currently only reports claude and codex. Users who run
opencode see empty or low totals on the Usage page, even though
their SQLite store holds the same token and cost data.
This bumps USAGE_CONTRACT_VERSION to 5, adds opencode to
UsageProviderKind, and registers the label, color and icon in
web and mobile. The page can now render the third provider
once the server starts scanning opencode.db. The scan itself
follows in a next change, as in pingdotgg#6040.
Closespingdotgg#7622
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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.

3 participants

@gmmeyer@AskPlays@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 OpenCode usage reporting - #6040

Closed
gmmeyer wants to merge 3 commits into
pingdotgg:mainfrom
gmmeyer:t3code/add-opencode-usage
Closed

feat(usage): add OpenCode usage reporting#6040
gmmeyer wants to merge 3 commits into
pingdotgg:mainfrom
gmmeyer:t3code/add-opencode-usage

Conversation

@gmmeyer

@gmmeyergmmeyer commented Aug 10, 2026

Copy link
Copy Markdown

What Changed

Add Opencode usage to t3 usage page

Why

I use opencode as well as claude and codex so I can use open or alternative models. This will add opencode usage to the page as well. Opencode stores the data in a different way than claude or codex (sqlite), which forces us to slightly change the calculation mechanism. But it's basically the same.

UI Changes

This is what it looks like now:
image

This is what it will look like:
image

Checklist

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

Note

Medium Risk
New local SQLite reads and a contract version bump affect usage aggregation across clients; reads are scoped to usage scalars only, limiting exposure of prompt content.

Overview
Adds OpenCode as a third usage provider alongside Claude Code and Codex, reading local SQLite assistant-message data instead of JSONL transcripts.

The server introduces usageOpenCode for read-only SQLite access (Bun and Node), maps legacy message and current session_message rows into shared UsageRecords without selecting conversation content, and discovers databases under OpenCode’s data dir with support for OPENCODE_DB, channel DBs, and OPENCODE_DISABLE_CHANNEL_DB. UsageService branches on source kind (jsonl vs opencodeSqlite) and reports OpenCode-specific missing/partial/failed source status.

The shared contract adds opencode to UsageProviderKind and bumps USAGE_CONTRACT_VERSION to 5. Web and mobile charts/tables register OpenCode label, color, and icon; the web usage table’s empty-state colSpan now follows PROVIDER_ORDER length. User docs describe OpenCode sourcing and privacy boundaries.

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

Note

Add OpenCode usage reporting to usage summary and UI

  • Adds readOpenCodeUsage and resolveOpenCodeDatabasePaths in usageOpenCode.ts to read assistant usage from OpenCode SQLite databases, supporting both current and legacy schemas with deduplication by message ID.
  • Integrates OpenCode as a new source in UsageService, discovering channel databases via directory scan and reporting partial/failed states per database.
  • Registers opencode in provider ordering, labels, colors, and icons across web and mobile UI, and adds an OpenCodeIcon mark to the chart legend.
  • Increments USAGE_CONTRACT_VERSION from 4 to 5 and adds opencode to the UsageProviderKind schema in packages/contracts/src/usage.ts.
  • Risk: version bump to contract v5 may cause version-mismatch warnings or partial-state handling in clients that validate the contract version.

Macroscope summarized 3bd1517.

@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: 44678b53-e708-4389-b6aa-3a97bdafbf47

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 size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 10, 2026
Comment threadapps/server/src/usage/usageOpenCode.ts
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

Adds a new third-party tool integration (OpenCode) with SQLite database reading, new UI display, and contract changes. While well-tested and following existing patterns, the scope of new capability (~850 lines, new database access, schema handling) warrants human review.

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

@AskPlays

Copy link
Copy Markdown

Two follow-ups from running this on a fork of t3code (I cherry-picked this
branch locally):

1. The opencode.db path is hardcoded, OPENCODE_DB and channel installs are
ignored

UsageService.ts resolves the database as {XDG data dir}/opencode/opencode.db,
but opencode's own resolution (packages/core/src/database/database.ts in
v1.18.16) is:

  • OPENCODE_DB wins when set: absolute paths are used verbatim, relative paths
    resolve against the data dir (:memory: aside);
  • non-stable channels write opencode-<channel>.db instead of opencode.db.

Any install with OPENCODE_DB set (or a channel build) would silently report
zero OpenCode usage. I suggest mirroring opencode's resolution, e.g. a small
resolveOpenCodeDatabasePath(dataDir) helper that honors OPENCODE_DB, and
either handles the channel suffix or documents it as out of scope.

2. Zero-token placeholder rows are counted as malformed → the source reports
partial

parseOpenCodeUsageRow returns null for the placeholder assistant rows
opencode writes for aborted/empty attempts (valid identity + model, zero
tokens, cost: 0), and readOpenCodeUsage counts every null as
malformedRecords. The source then reports status: "partial" with "Some
OpenCode usage records could not be parsed" on perfectly healthy installs
(75 such rows in my db). I suggest distinguishing placeholders from malformed
rows, e.g. an isOpenCodePlaceholderRow check before incrementing the
malformed count. So that partial stays reserved for actually malformed rows.

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

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

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

Reviewed by Cursor Bugbot for commit ffbd13f7365502fec8a1bb8e151b36c4390dd2d9. Configure here.

Comment threadapps/server/src/usage/UsageService.ts
@gmmeyer
gmmeyerforce-pushed the t3code/add-opencode-usage branch from ffbd13f to 5c7d442CompareAugust 11, 2026 23:59
Comment threadpackages/contracts/src/usage.ts Outdated
Comment threadapps/server/src/usage/usageOpenCode.ts
@gmmeyer

Copy link
Copy Markdown
Author

@AskPlays I fixed these issues thank you!

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>
@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
Project516 added a commit to Project516/t3code that referenced this pull request Aug 27, 2026
Usage currently only reports claude and codex. Users who run
opencode see empty or low totals on the Usage page, even though
their SQLite store holds the same token and cost data.
This bumps USAGE_CONTRACT_VERSION to 5, adds opencode to
UsageProviderKind, and registers the label, color and icon in
web and mobile. The page can now render the third provider
once the server starts scanning opencode.db. The scan itself
follows in a next change, as in pingdotgg#6040.
Closespingdotgg#7622
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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.

3 participants

@gmmeyer@AskPlays@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 OpenCode usage reporting - #6040

Closed
gmmeyer wants to merge 3 commits into
pingdotgg:mainfrom
gmmeyer:t3code/add-opencode-usage
Closed

feat(usage): add OpenCode usage reporting#6040
gmmeyer wants to merge 3 commits into
pingdotgg:mainfrom
gmmeyer:t3code/add-opencode-usage

Conversation

@gmmeyer

@gmmeyergmmeyer commented Aug 10, 2026

Copy link
Copy Markdown

What Changed

Add Opencode usage to t3 usage page

Why

I use opencode as well as claude and codex so I can use open or alternative models. This will add opencode usage to the page as well. Opencode stores the data in a different way than claude or codex (sqlite), which forces us to slightly change the calculation mechanism. But it's basically the same.

UI Changes

This is what it looks like now:
image

This is what it will look like:
image

Checklist

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

Note

Medium Risk
New local SQLite reads and a contract version bump affect usage aggregation across clients; reads are scoped to usage scalars only, limiting exposure of prompt content.

Overview
Adds OpenCode as a third usage provider alongside Claude Code and Codex, reading local SQLite assistant-message data instead of JSONL transcripts.

The server introduces usageOpenCode for read-only SQLite access (Bun and Node), maps legacy message and current session_message rows into shared UsageRecords without selecting conversation content, and discovers databases under OpenCode’s data dir with support for OPENCODE_DB, channel DBs, and OPENCODE_DISABLE_CHANNEL_DB. UsageService branches on source kind (jsonl vs opencodeSqlite) and reports OpenCode-specific missing/partial/failed source status.

The shared contract adds opencode to UsageProviderKind and bumps USAGE_CONTRACT_VERSION to 5. Web and mobile charts/tables register OpenCode label, color, and icon; the web usage table’s empty-state colSpan now follows PROVIDER_ORDER length. User docs describe OpenCode sourcing and privacy boundaries.

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

Note

Add OpenCode usage reporting to usage summary and UI

  • Adds readOpenCodeUsage and resolveOpenCodeDatabasePaths in usageOpenCode.ts to read assistant usage from OpenCode SQLite databases, supporting both current and legacy schemas with deduplication by message ID.
  • Integrates OpenCode as a new source in UsageService, discovering channel databases via directory scan and reporting partial/failed states per database.
  • Registers opencode in provider ordering, labels, colors, and icons across web and mobile UI, and adds an OpenCodeIcon mark to the chart legend.
  • Increments USAGE_CONTRACT_VERSION from 4 to 5 and adds opencode to the UsageProviderKind schema in packages/contracts/src/usage.ts.
  • Risk: version bump to contract v5 may cause version-mismatch warnings or partial-state handling in clients that validate the contract version.

Macroscope summarized 3bd1517.

@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: 44678b53-e708-4389-b6aa-3a97bdafbf47

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 size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 10, 2026
Comment threadapps/server/src/usage/usageOpenCode.ts
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

Adds a new third-party tool integration (OpenCode) with SQLite database reading, new UI display, and contract changes. While well-tested and following existing patterns, the scope of new capability (~850 lines, new database access, schema handling) warrants human review.

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

@AskPlays

Copy link
Copy Markdown

Two follow-ups from running this on a fork of t3code (I cherry-picked this
branch locally):

1. The opencode.db path is hardcoded, OPENCODE_DB and channel installs are
ignored

UsageService.ts resolves the database as {XDG data dir}/opencode/opencode.db,
but opencode's own resolution (packages/core/src/database/database.ts in
v1.18.16) is:

  • OPENCODE_DB wins when set: absolute paths are used verbatim, relative paths
    resolve against the data dir (:memory: aside);
  • non-stable channels write opencode-<channel>.db instead of opencode.db.

Any install with OPENCODE_DB set (or a channel build) would silently report
zero OpenCode usage. I suggest mirroring opencode's resolution, e.g. a small
resolveOpenCodeDatabasePath(dataDir) helper that honors OPENCODE_DB, and
either handles the channel suffix or documents it as out of scope.

2. Zero-token placeholder rows are counted as malformed → the source reports
partial

parseOpenCodeUsageRow returns null for the placeholder assistant rows
opencode writes for aborted/empty attempts (valid identity + model, zero
tokens, cost: 0), and readOpenCodeUsage counts every null as
malformedRecords. The source then reports status: "partial" with "Some
OpenCode usage records could not be parsed" on perfectly healthy installs
(75 such rows in my db). I suggest distinguishing placeholders from malformed
rows, e.g. an isOpenCodePlaceholderRow check before incrementing the
malformed count. So that partial stays reserved for actually malformed rows.

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

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

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

Reviewed by Cursor Bugbot for commit ffbd13f7365502fec8a1bb8e151b36c4390dd2d9. Configure here.

Comment threadapps/server/src/usage/UsageService.ts
@gmmeyer
gmmeyerforce-pushed the t3code/add-opencode-usage branch from ffbd13f to 5c7d442CompareAugust 11, 2026 23:59
Comment threadpackages/contracts/src/usage.ts Outdated
Comment threadapps/server/src/usage/usageOpenCode.ts
@gmmeyer

Copy link
Copy Markdown
Author

@AskPlays I fixed these issues thank you!

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>
@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
Project516 added a commit to Project516/t3code that referenced this pull request Aug 27, 2026
Usage currently only reports claude and codex. Users who run
opencode see empty or low totals on the Usage page, even though
their SQLite store holds the same token and cost data.
This bumps USAGE_CONTRACT_VERSION to 5, adds opencode to
UsageProviderKind, and registers the label, color and icon in
web and mobile. The page can now render the third provider
once the server starts scanning opencode.db. The scan itself
follows in a next change, as in pingdotgg#6040.
Closespingdotgg#7622
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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.

3 participants

@gmmeyer@AskPlays@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 OpenCode usage reporting - #6040

Closed
gmmeyer wants to merge 3 commits into
pingdotgg:mainfrom
gmmeyer:t3code/add-opencode-usage
Closed

feat(usage): add OpenCode usage reporting#6040
gmmeyer wants to merge 3 commits into
pingdotgg:mainfrom
gmmeyer:t3code/add-opencode-usage

Conversation

@gmmeyer

@gmmeyergmmeyer commented Aug 10, 2026

Copy link
Copy Markdown

What Changed

Add Opencode usage to t3 usage page

Why

I use opencode as well as claude and codex so I can use open or alternative models. This will add opencode usage to the page as well. Opencode stores the data in a different way than claude or codex (sqlite), which forces us to slightly change the calculation mechanism. But it's basically the same.

UI Changes

This is what it looks like now:
image

This is what it will look like:
image

Checklist

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

Note

Medium Risk
New local SQLite reads and a contract version bump affect usage aggregation across clients; reads are scoped to usage scalars only, limiting exposure of prompt content.

Overview
Adds OpenCode as a third usage provider alongside Claude Code and Codex, reading local SQLite assistant-message data instead of JSONL transcripts.

The server introduces usageOpenCode for read-only SQLite access (Bun and Node), maps legacy message and current session_message rows into shared UsageRecords without selecting conversation content, and discovers databases under OpenCode’s data dir with support for OPENCODE_DB, channel DBs, and OPENCODE_DISABLE_CHANNEL_DB. UsageService branches on source kind (jsonl vs opencodeSqlite) and reports OpenCode-specific missing/partial/failed source status.

The shared contract adds opencode to UsageProviderKind and bumps USAGE_CONTRACT_VERSION to 5. Web and mobile charts/tables register OpenCode label, color, and icon; the web usage table’s empty-state colSpan now follows PROVIDER_ORDER length. User docs describe OpenCode sourcing and privacy boundaries.

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

Note

Add OpenCode usage reporting to usage summary and UI

  • Adds readOpenCodeUsage and resolveOpenCodeDatabasePaths in usageOpenCode.ts to read assistant usage from OpenCode SQLite databases, supporting both current and legacy schemas with deduplication by message ID.
  • Integrates OpenCode as a new source in UsageService, discovering channel databases via directory scan and reporting partial/failed states per database.
  • Registers opencode in provider ordering, labels, colors, and icons across web and mobile UI, and adds an OpenCodeIcon mark to the chart legend.
  • Increments USAGE_CONTRACT_VERSION from 4 to 5 and adds opencode to the UsageProviderKind schema in packages/contracts/src/usage.ts.
  • Risk: version bump to contract v5 may cause version-mismatch warnings or partial-state handling in clients that validate the contract version.

Macroscope summarized 3bd1517.

@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: 44678b53-e708-4389-b6aa-3a97bdafbf47

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 size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 10, 2026
Comment threadapps/server/src/usage/usageOpenCode.ts
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

Adds a new third-party tool integration (OpenCode) with SQLite database reading, new UI display, and contract changes. While well-tested and following existing patterns, the scope of new capability (~850 lines, new database access, schema handling) warrants human review.

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

@AskPlays

Copy link
Copy Markdown

Two follow-ups from running this on a fork of t3code (I cherry-picked this
branch locally):

1. The opencode.db path is hardcoded, OPENCODE_DB and channel installs are
ignored

UsageService.ts resolves the database as {XDG data dir}/opencode/opencode.db,
but opencode's own resolution (packages/core/src/database/database.ts in
v1.18.16) is:

  • OPENCODE_DB wins when set: absolute paths are used verbatim, relative paths
    resolve against the data dir (:memory: aside);
  • non-stable channels write opencode-<channel>.db instead of opencode.db.

Any install with OPENCODE_DB set (or a channel build) would silently report
zero OpenCode usage. I suggest mirroring opencode's resolution, e.g. a small
resolveOpenCodeDatabasePath(dataDir) helper that honors OPENCODE_DB, and
either handles the channel suffix or documents it as out of scope.

2. Zero-token placeholder rows are counted as malformed → the source reports
partial

parseOpenCodeUsageRow returns null for the placeholder assistant rows
opencode writes for aborted/empty attempts (valid identity + model, zero
tokens, cost: 0), and readOpenCodeUsage counts every null as
malformedRecords. The source then reports status: "partial" with "Some
OpenCode usage records could not be parsed" on perfectly healthy installs
(75 such rows in my db). I suggest distinguishing placeholders from malformed
rows, e.g. an isOpenCodePlaceholderRow check before incrementing the
malformed count. So that partial stays reserved for actually malformed rows.

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

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

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

Reviewed by Cursor Bugbot for commit ffbd13f7365502fec8a1bb8e151b36c4390dd2d9. Configure here.

Comment threadapps/server/src/usage/UsageService.ts
@gmmeyer
gmmeyerforce-pushed the t3code/add-opencode-usage branch from ffbd13f to 5c7d442CompareAugust 11, 2026 23:59
Comment threadpackages/contracts/src/usage.ts Outdated
Comment threadapps/server/src/usage/usageOpenCode.ts
@gmmeyer

Copy link
Copy Markdown
Author

@AskPlays I fixed these issues thank you!

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>
@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
Project516 added a commit to Project516/t3code that referenced this pull request Aug 27, 2026
Usage currently only reports claude and codex. Users who run
opencode see empty or low totals on the Usage page, even though
their SQLite store holds the same token and cost data.
This bumps USAGE_CONTRACT_VERSION to 5, adds opencode to
UsageProviderKind, and registers the label, color and icon in
web and mobile. The page can now render the third provider
once the server starts scanning opencode.db. The scan itself
follows in a next change, as in pingdotgg#6040.
Closespingdotgg#7622
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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.

3 participants

@gmmeyer@AskPlays@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 OpenCode usage reporting - #6040

Closed
gmmeyer wants to merge 3 commits into
pingdotgg:mainfrom
gmmeyer:t3code/add-opencode-usage
Closed

feat(usage): add OpenCode usage reporting#6040
gmmeyer wants to merge 3 commits into
pingdotgg:mainfrom
gmmeyer:t3code/add-opencode-usage

Conversation

@gmmeyer

@gmmeyergmmeyer commented Aug 10, 2026

Copy link
Copy Markdown

What Changed

Add Opencode usage to t3 usage page

Why

I use opencode as well as claude and codex so I can use open or alternative models. This will add opencode usage to the page as well. Opencode stores the data in a different way than claude or codex (sqlite), which forces us to slightly change the calculation mechanism. But it's basically the same.

UI Changes

This is what it looks like now:
image

This is what it will look like:
image

Checklist

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

Note

Medium Risk
New local SQLite reads and a contract version bump affect usage aggregation across clients; reads are scoped to usage scalars only, limiting exposure of prompt content.

Overview
Adds OpenCode as a third usage provider alongside Claude Code and Codex, reading local SQLite assistant-message data instead of JSONL transcripts.

The server introduces usageOpenCode for read-only SQLite access (Bun and Node), maps legacy message and current session_message rows into shared UsageRecords without selecting conversation content, and discovers databases under OpenCode’s data dir with support for OPENCODE_DB, channel DBs, and OPENCODE_DISABLE_CHANNEL_DB. UsageService branches on source kind (jsonl vs opencodeSqlite) and reports OpenCode-specific missing/partial/failed source status.

The shared contract adds opencode to UsageProviderKind and bumps USAGE_CONTRACT_VERSION to 5. Web and mobile charts/tables register OpenCode label, color, and icon; the web usage table’s empty-state colSpan now follows PROVIDER_ORDER length. User docs describe OpenCode sourcing and privacy boundaries.

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

Note

Add OpenCode usage reporting to usage summary and UI

  • Adds readOpenCodeUsage and resolveOpenCodeDatabasePaths in usageOpenCode.ts to read assistant usage from OpenCode SQLite databases, supporting both current and legacy schemas with deduplication by message ID.
  • Integrates OpenCode as a new source in UsageService, discovering channel databases via directory scan and reporting partial/failed states per database.
  • Registers opencode in provider ordering, labels, colors, and icons across web and mobile UI, and adds an OpenCodeIcon mark to the chart legend.
  • Increments USAGE_CONTRACT_VERSION from 4 to 5 and adds opencode to the UsageProviderKind schema in packages/contracts/src/usage.ts.
  • Risk: version bump to contract v5 may cause version-mismatch warnings or partial-state handling in clients that validate the contract version.

Macroscope summarized 3bd1517.

@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: 44678b53-e708-4389-b6aa-3a97bdafbf47

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 size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 10, 2026
Comment threadapps/server/src/usage/usageOpenCode.ts
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

Adds a new third-party tool integration (OpenCode) with SQLite database reading, new UI display, and contract changes. While well-tested and following existing patterns, the scope of new capability (~850 lines, new database access, schema handling) warrants human review.

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

@AskPlays

Copy link
Copy Markdown

Two follow-ups from running this on a fork of t3code (I cherry-picked this
branch locally):

1. The opencode.db path is hardcoded, OPENCODE_DB and channel installs are
ignored

UsageService.ts resolves the database as {XDG data dir}/opencode/opencode.db,
but opencode's own resolution (packages/core/src/database/database.ts in
v1.18.16) is:

  • OPENCODE_DB wins when set: absolute paths are used verbatim, relative paths
    resolve against the data dir (:memory: aside);
  • non-stable channels write opencode-<channel>.db instead of opencode.db.

Any install with OPENCODE_DB set (or a channel build) would silently report
zero OpenCode usage. I suggest mirroring opencode's resolution, e.g. a small
resolveOpenCodeDatabasePath(dataDir) helper that honors OPENCODE_DB, and
either handles the channel suffix or documents it as out of scope.

2. Zero-token placeholder rows are counted as malformed → the source reports
partial

parseOpenCodeUsageRow returns null for the placeholder assistant rows
opencode writes for aborted/empty attempts (valid identity + model, zero
tokens, cost: 0), and readOpenCodeUsage counts every null as
malformedRecords. The source then reports status: "partial" with "Some
OpenCode usage records could not be parsed" on perfectly healthy installs
(75 such rows in my db). I suggest distinguishing placeholders from malformed
rows, e.g. an isOpenCodePlaceholderRow check before incrementing the
malformed count. So that partial stays reserved for actually malformed rows.

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

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

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

Reviewed by Cursor Bugbot for commit ffbd13f7365502fec8a1bb8e151b36c4390dd2d9. Configure here.

Comment threadapps/server/src/usage/UsageService.ts
@gmmeyer
gmmeyerforce-pushed the t3code/add-opencode-usage branch from ffbd13f to 5c7d442CompareAugust 11, 2026 23:59
Comment threadpackages/contracts/src/usage.ts Outdated
Comment threadapps/server/src/usage/usageOpenCode.ts
@gmmeyer

Copy link
Copy Markdown
Author

@AskPlays I fixed these issues thank you!

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>
@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
Project516 added a commit to Project516/t3code that referenced this pull request Aug 27, 2026
Usage currently only reports claude and codex. Users who run
opencode see empty or low totals on the Usage page, even though
their SQLite store holds the same token and cost data.
This bumps USAGE_CONTRACT_VERSION to 5, adds opencode to
UsageProviderKind, and registers the label, color and icon in
web and mobile. The page can now render the third provider
once the server starts scanning opencode.db. The scan itself
follows in a next change, as in pingdotgg#6040.
Closespingdotgg#7622
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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.

3 participants

@gmmeyer@AskPlays@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 OpenCode usage reporting - #6040

Closed
gmmeyer wants to merge 3 commits into
pingdotgg:mainfrom
gmmeyer:t3code/add-opencode-usage
Closed

feat(usage): add OpenCode usage reporting#6040
gmmeyer wants to merge 3 commits into
pingdotgg:mainfrom
gmmeyer:t3code/add-opencode-usage

Conversation

@gmmeyer

@gmmeyergmmeyer commented Aug 10, 2026

Copy link
Copy Markdown

What Changed

Add Opencode usage to t3 usage page

Why

I use opencode as well as claude and codex so I can use open or alternative models. This will add opencode usage to the page as well. Opencode stores the data in a different way than claude or codex (sqlite), which forces us to slightly change the calculation mechanism. But it's basically the same.

UI Changes

This is what it looks like now:
image

This is what it will look like:
image

Checklist

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

Note

Medium Risk
New local SQLite reads and a contract version bump affect usage aggregation across clients; reads are scoped to usage scalars only, limiting exposure of prompt content.

Overview
Adds OpenCode as a third usage provider alongside Claude Code and Codex, reading local SQLite assistant-message data instead of JSONL transcripts.

The server introduces usageOpenCode for read-only SQLite access (Bun and Node), maps legacy message and current session_message rows into shared UsageRecords without selecting conversation content, and discovers databases under OpenCode’s data dir with support for OPENCODE_DB, channel DBs, and OPENCODE_DISABLE_CHANNEL_DB. UsageService branches on source kind (jsonl vs opencodeSqlite) and reports OpenCode-specific missing/partial/failed source status.

The shared contract adds opencode to UsageProviderKind and bumps USAGE_CONTRACT_VERSION to 5. Web and mobile charts/tables register OpenCode label, color, and icon; the web usage table’s empty-state colSpan now follows PROVIDER_ORDER length. User docs describe OpenCode sourcing and privacy boundaries.

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

Note

Add OpenCode usage reporting to usage summary and UI

  • Adds readOpenCodeUsage and resolveOpenCodeDatabasePaths in usageOpenCode.ts to read assistant usage from OpenCode SQLite databases, supporting both current and legacy schemas with deduplication by message ID.
  • Integrates OpenCode as a new source in UsageService, discovering channel databases via directory scan and reporting partial/failed states per database.
  • Registers opencode in provider ordering, labels, colors, and icons across web and mobile UI, and adds an OpenCodeIcon mark to the chart legend.
  • Increments USAGE_CONTRACT_VERSION from 4 to 5 and adds opencode to the UsageProviderKind schema in packages/contracts/src/usage.ts.
  • Risk: version bump to contract v5 may cause version-mismatch warnings or partial-state handling in clients that validate the contract version.

Macroscope summarized 3bd1517.

@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: 44678b53-e708-4389-b6aa-3a97bdafbf47

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 size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 10, 2026
Comment threadapps/server/src/usage/usageOpenCode.ts
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

Adds a new third-party tool integration (OpenCode) with SQLite database reading, new UI display, and contract changes. While well-tested and following existing patterns, the scope of new capability (~850 lines, new database access, schema handling) warrants human review.

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

@AskPlays

Copy link
Copy Markdown

Two follow-ups from running this on a fork of t3code (I cherry-picked this
branch locally):

1. The opencode.db path is hardcoded, OPENCODE_DB and channel installs are
ignored

UsageService.ts resolves the database as {XDG data dir}/opencode/opencode.db,
but opencode's own resolution (packages/core/src/database/database.ts in
v1.18.16) is:

  • OPENCODE_DB wins when set: absolute paths are used verbatim, relative paths
    resolve against the data dir (:memory: aside);
  • non-stable channels write opencode-<channel>.db instead of opencode.db.

Any install with OPENCODE_DB set (or a channel build) would silently report
zero OpenCode usage. I suggest mirroring opencode's resolution, e.g. a small
resolveOpenCodeDatabasePath(dataDir) helper that honors OPENCODE_DB, and
either handles the channel suffix or documents it as out of scope.

2. Zero-token placeholder rows are counted as malformed → the source reports
partial

parseOpenCodeUsageRow returns null for the placeholder assistant rows
opencode writes for aborted/empty attempts (valid identity + model, zero
tokens, cost: 0), and readOpenCodeUsage counts every null as
malformedRecords. The source then reports status: "partial" with "Some
OpenCode usage records could not be parsed" on perfectly healthy installs
(75 such rows in my db). I suggest distinguishing placeholders from malformed
rows, e.g. an isOpenCodePlaceholderRow check before incrementing the
malformed count. So that partial stays reserved for actually malformed rows.

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

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

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

Reviewed by Cursor Bugbot for commit ffbd13f7365502fec8a1bb8e151b36c4390dd2d9. Configure here.

Comment threadapps/server/src/usage/UsageService.ts
@gmmeyer
gmmeyerforce-pushed the t3code/add-opencode-usage branch from ffbd13f to 5c7d442CompareAugust 11, 2026 23:59
Comment threadpackages/contracts/src/usage.ts Outdated
Comment threadapps/server/src/usage/usageOpenCode.ts
@gmmeyer

Copy link
Copy Markdown
Author

@AskPlays I fixed these issues thank you!

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>
@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
Project516 added a commit to Project516/t3code that referenced this pull request Aug 27, 2026
Usage currently only reports claude and codex. Users who run
opencode see empty or low totals on the Usage page, even though
their SQLite store holds the same token and cost data.
This bumps USAGE_CONTRACT_VERSION to 5, adds opencode to
UsageProviderKind, and registers the label, color and icon in
web and mobile. The page can now render the third provider
once the server starts scanning opencode.db. The scan itself
follows in a next change, as in pingdotgg#6040.
Closespingdotgg#7622
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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.

3 participants

@gmmeyer@AskPlays@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 OpenCode usage reporting - #6040

Closed
gmmeyer wants to merge 3 commits into
pingdotgg:mainfrom
gmmeyer:t3code/add-opencode-usage
Closed

feat(usage): add OpenCode usage reporting#6040
gmmeyer wants to merge 3 commits into
pingdotgg:mainfrom
gmmeyer:t3code/add-opencode-usage

Conversation

@gmmeyer

@gmmeyergmmeyer commented Aug 10, 2026

Copy link
Copy Markdown

What Changed

Add Opencode usage to t3 usage page

Why

I use opencode as well as claude and codex so I can use open or alternative models. This will add opencode usage to the page as well. Opencode stores the data in a different way than claude or codex (sqlite), which forces us to slightly change the calculation mechanism. But it's basically the same.

UI Changes

This is what it looks like now:
image

This is what it will look like:
image

Checklist

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

Note

Medium Risk
New local SQLite reads and a contract version bump affect usage aggregation across clients; reads are scoped to usage scalars only, limiting exposure of prompt content.

Overview
Adds OpenCode as a third usage provider alongside Claude Code and Codex, reading local SQLite assistant-message data instead of JSONL transcripts.

The server introduces usageOpenCode for read-only SQLite access (Bun and Node), maps legacy message and current session_message rows into shared UsageRecords without selecting conversation content, and discovers databases under OpenCode’s data dir with support for OPENCODE_DB, channel DBs, and OPENCODE_DISABLE_CHANNEL_DB. UsageService branches on source kind (jsonl vs opencodeSqlite) and reports OpenCode-specific missing/partial/failed source status.

The shared contract adds opencode to UsageProviderKind and bumps USAGE_CONTRACT_VERSION to 5. Web and mobile charts/tables register OpenCode label, color, and icon; the web usage table’s empty-state colSpan now follows PROVIDER_ORDER length. User docs describe OpenCode sourcing and privacy boundaries.

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

Note

Add OpenCode usage reporting to usage summary and UI

  • Adds readOpenCodeUsage and resolveOpenCodeDatabasePaths in usageOpenCode.ts to read assistant usage from OpenCode SQLite databases, supporting both current and legacy schemas with deduplication by message ID.
  • Integrates OpenCode as a new source in UsageService, discovering channel databases via directory scan and reporting partial/failed states per database.
  • Registers opencode in provider ordering, labels, colors, and icons across web and mobile UI, and adds an OpenCodeIcon mark to the chart legend.
  • Increments USAGE_CONTRACT_VERSION from 4 to 5 and adds opencode to the UsageProviderKind schema in packages/contracts/src/usage.ts.
  • Risk: version bump to contract v5 may cause version-mismatch warnings or partial-state handling in clients that validate the contract version.

Macroscope summarized 3bd1517.

@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: 44678b53-e708-4389-b6aa-3a97bdafbf47

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 size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 10, 2026
Comment threadapps/server/src/usage/usageOpenCode.ts
@macroscopeapp

macroscopeappBot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

Adds a new third-party tool integration (OpenCode) with SQLite database reading, new UI display, and contract changes. While well-tested and following existing patterns, the scope of new capability (~850 lines, new database access, schema handling) warrants human review.

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

@AskPlays

Copy link
Copy Markdown

Two follow-ups from running this on a fork of t3code (I cherry-picked this
branch locally):

1. The opencode.db path is hardcoded, OPENCODE_DB and channel installs are
ignored

UsageService.ts resolves the database as {XDG data dir}/opencode/opencode.db,
but opencode's own resolution (packages/core/src/database/database.ts in
v1.18.16) is:

  • OPENCODE_DB wins when set: absolute paths are used verbatim, relative paths
    resolve against the data dir (:memory: aside);
  • non-stable channels write opencode-<channel>.db instead of opencode.db.

Any install with OPENCODE_DB set (or a channel build) would silently report
zero OpenCode usage. I suggest mirroring opencode's resolution, e.g. a small
resolveOpenCodeDatabasePath(dataDir) helper that honors OPENCODE_DB, and
either handles the channel suffix or documents it as out of scope.

2. Zero-token placeholder rows are counted as malformed → the source reports
partial

parseOpenCodeUsageRow returns null for the placeholder assistant rows
opencode writes for aborted/empty attempts (valid identity + model, zero
tokens, cost: 0), and readOpenCodeUsage counts every null as
malformedRecords. The source then reports status: "partial" with "Some
OpenCode usage records could not be parsed" on perfectly healthy installs
(75 such rows in my db). I suggest distinguishing placeholders from malformed
rows, e.g. an isOpenCodePlaceholderRow check before incrementing the
malformed count. So that partial stays reserved for actually malformed rows.

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

Fix All in Cursor

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

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

Reviewed by Cursor Bugbot for commit ffbd13f7365502fec8a1bb8e151b36c4390dd2d9. Configure here.

Comment threadapps/server/src/usage/UsageService.ts
@gmmeyer
gmmeyerforce-pushed the t3code/add-opencode-usage branch from ffbd13f to 5c7d442CompareAugust 11, 2026 23:59
Comment threadpackages/contracts/src/usage.ts Outdated
Comment threadapps/server/src/usage/usageOpenCode.ts
@gmmeyer

Copy link
Copy Markdown
Author

@AskPlays I fixed these issues thank you!

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>
@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
Project516 added a commit to Project516/t3code that referenced this pull request Aug 27, 2026
Usage currently only reports claude and codex. Users who run
opencode see empty or low totals on the Usage page, even though
their SQLite store holds the same token and cost data.
This bumps USAGE_CONTRACT_VERSION to 5, adds opencode to
UsageProviderKind, and registers the label, color and icon in
web and mobile. The page can now render the third provider
once the server starts scanning opencode.db. The scan itself
follows in a next change, as in pingdotgg#6040.
Closespingdotgg#7622
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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.

3 participants

@gmmeyer@AskPlays@t3dotgg