fix(grok): show context-window usage in the composer - #9206

Open
theman6660 wants to merge 2 commits into
pingdotgg:mainfrom
theman6660:fix/grok-composer-context-window
Open

fix(grok): show context-window usage in the composer#9206
theman6660 wants to merge 2 commits into
pingdotgg:mainfrom
theman6660:fix/grok-composer-context-window

Conversation

@theman6660

@theman6660theman6660 commented Sep 2, 2026

Copy link
Copy Markdown

Closes#8382

What Changed

Grok threads never showed the composer context-window meter. The live adapter did not emit thread.token-usage.updated, so ContextWindowMeter had nothing to render.

This maps occupancy onto that existing path:

  • ACP sessionUpdate: "usage_update" when present
  • Grok's actual path today: session/update_meta.totalTokens
  • Window size from _meta (contextWindowTokens / contextWindow / maxTokens), else the current model's availableModels[]._meta.totalContextTokens, else 500k

Interrupted turns do not overwrite the last snapshot. Cursor gets the shared UsageUpdated case so the ACP union stays exhaustive.

No new UI. The existing composer meter is enough.

Why

Codex already shows used / max / %. Grok did not, even though grok agent stdio already streams fill on _meta.totalTokens.

Live Grok ACP still does not send usage_update. Occupancy lives on session/update _meta.totalTokens. Prompt-response usage.totalTokens is billed API tokens, not context fill. On a greeting turn those were 1615 occupancy vs 20554 billed. This PR does not use the prompt-response number, which is the difference from #5405.

UI Changes

Uses the existing context-window meter in the composer.

  • Before: Grok threads have no context fill indicator.
  • After: After the first occupancy-bearing session/update, Grok shows the same ring + used/max tooltip as Codex.

Validation

  • vp test run src/provider/acp/AcpRuntimeModel.test.ts src/provider/acp/AcpCoreRuntimeEvents.test.ts src/provider/acp/GrokAcpSupport.test.ts — 50 passed
  • Server typecheck: no new errors
  • Live Grok session: _meta.totalTokens is occupancy; prompt usage.totalTokens is billed tokens; signals.json has contextWindowTokens: 500000
  • GrokAdapter mock spawn tests fail on this Windows host (spawn EFTYPE on the .sh wrapper). That is existing, not introduced here. The new adapter test is in GrokAdapter.test.ts for Linux CI.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for the UI change (happy to add a Grok-thread capture)
  • A video is not applicable (no animation/timing change)

Note

Low Risk
Provider-adapter and event-mapping changes only; no auth or persistence changes, with deduplication and explicit exclusion of billed-token metadata reducing wrong-meter risk.

Overview
Grok threads can now drive the existing composer context-window meter by emitting thread.token-usage.updated from ACP session traffic, matching what Codex already had.

ACP parsing gains a UsageUpdated path for explicit usage_update notifications and for Grok’s live signal: session/update_meta.totalTokens (with window size from _meta keys or model metadata). Prompt-response _meta.usage.totalTokens is intentionally ignored so billed API tokens are not shown as context fill. makeAcpTokenUsageEvent maps occupancy into the canonical runtime event (positive used tokens only, clamped to max).

GrokAdapter dedupes snapshots, seeds max window from session setup availableModels[]._meta.totalContextTokens, refreshes on model change, and skips updates for interrupted turns. CursorAdapter handles the same UsageUpdated branch for exhaustiveness. The mock ACP agent can simulate occupancy via T3_ACP_EMIT_CONTEXT_USAGE.

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

Note

Add context-window usage events for Grok ACP adapter

  • Adds a canonical makeAcpTokenUsageEvent factory in AcpCoreRuntimeEvents.ts that converts positive usage measurements into thread.token-usage.updated events with rounded, maximum-bounded token counts
  • Extends ACP session-update parsing in AcpRuntimeModel.ts to project usage_update notifications and totalTokens metadata into UsageUpdated parsed events
  • Builds a model-to-context-window map from Grok session setup metadata in GrokAcpSupport.ts, resolving window sizes by exact model ID or base model ID
  • makeGrokAdapter in GrokAdapter.ts now processes UsageUpdated notifications, deduplicates snapshots, refreshes the cached window on model change, and emits token-usage events using the event-provided or model-derived window (default 500,000)
  • Risk: parseSessionUpdateEvent now emits UsageUpdated for any session-update containing totalTokens metadata; adapters or consumers that did not expect this event type on session updates need to handle it

Macroscope summarized a2087c9.

Grok ACP does not emit usage_update. Occupancy lives on session/update _meta.totalTokens. Map that onto the existing thread.token-usage.updated path so ContextWindowMeter can render.
Do not use prompt-response usage.totalTokens; that is billed API tokens, not context fill.
Closespingdotgg#8382
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated

@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 6af161d. Configure here.

Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@macroscopeapp

macroscopeappBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change adds a cross-cutting production pipeline that turns ACP session metadata into persisted context-window updates for Grok and Cursor, including a new 500,000-token fallback displayed by the composer meter. A cancellation race can also allow stale usage to overwrite the meter, so the runtime behavior and fallback semantics need human review.

Not approved because:

  • 1 blocking correctness issue found at or above your repo's Minimum Blocking Severity

Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more.

Keep lastKnownMaxTokens in sync when sendTurn switches models. Dedup occupancy snapshots on used+emitted max so a later window size is not dropped.

if (event._tag === "UsageUpdated") {
const usageTurnId = resolveNotificationTurnId(ctx);
if (usageTurnId !== undefined && ctx.interruptedTurnIds.has(usageTurnId)) {

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.

🟡 MediumLayers/GrokAdapter.ts:1374

A queued UsageUpdated from a cancelled prompt is emitted as thread.token-usage.updated after interruptTurn clears activeTurnId, so stale usage overwrites the composer context meter. Treat usageTurnId === undefined as stale here, in addition to checking interruptedTurnIds.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/provider/Layers/GrokAdapter.ts around line 1374:
A queued `UsageUpdated` from a cancelled prompt is emitted as `thread.token-usage.updated` after `interruptTurn` clears `activeTurnId`, so stale usage overwrites the composer context meter. Treat `usageTurnId === undefined` as stale here, in addition to checking `interruptedTurnIds`.

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.

[Bug]: Grok threads do not show context-window usage in the composer

1 participant

@theman6660
, '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

fix(grok): show context-window usage in the composer - #9206

Open
theman6660 wants to merge 2 commits into
pingdotgg:mainfrom
theman6660:fix/grok-composer-context-window
Open

fix(grok): show context-window usage in the composer#9206
theman6660 wants to merge 2 commits into
pingdotgg:mainfrom
theman6660:fix/grok-composer-context-window

Conversation

@theman6660

@theman6660theman6660 commented Sep 2, 2026

Copy link
Copy Markdown

Closes#8382

What Changed

Grok threads never showed the composer context-window meter. The live adapter did not emit thread.token-usage.updated, so ContextWindowMeter had nothing to render.

This maps occupancy onto that existing path:

  • ACP sessionUpdate: "usage_update" when present
  • Grok's actual path today: session/update_meta.totalTokens
  • Window size from _meta (contextWindowTokens / contextWindow / maxTokens), else the current model's availableModels[]._meta.totalContextTokens, else 500k

Interrupted turns do not overwrite the last snapshot. Cursor gets the shared UsageUpdated case so the ACP union stays exhaustive.

No new UI. The existing composer meter is enough.

Why

Codex already shows used / max / %. Grok did not, even though grok agent stdio already streams fill on _meta.totalTokens.

Live Grok ACP still does not send usage_update. Occupancy lives on session/update _meta.totalTokens. Prompt-response usage.totalTokens is billed API tokens, not context fill. On a greeting turn those were 1615 occupancy vs 20554 billed. This PR does not use the prompt-response number, which is the difference from #5405.

UI Changes

Uses the existing context-window meter in the composer.

  • Before: Grok threads have no context fill indicator.
  • After: After the first occupancy-bearing session/update, Grok shows the same ring + used/max tooltip as Codex.

Validation

  • vp test run src/provider/acp/AcpRuntimeModel.test.ts src/provider/acp/AcpCoreRuntimeEvents.test.ts src/provider/acp/GrokAcpSupport.test.ts — 50 passed
  • Server typecheck: no new errors
  • Live Grok session: _meta.totalTokens is occupancy; prompt usage.totalTokens is billed tokens; signals.json has contextWindowTokens: 500000
  • GrokAdapter mock spawn tests fail on this Windows host (spawn EFTYPE on the .sh wrapper). That is existing, not introduced here. The new adapter test is in GrokAdapter.test.ts for Linux CI.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for the UI change (happy to add a Grok-thread capture)
  • A video is not applicable (no animation/timing change)

Note

Low Risk
Provider-adapter and event-mapping changes only; no auth or persistence changes, with deduplication and explicit exclusion of billed-token metadata reducing wrong-meter risk.

Overview
Grok threads can now drive the existing composer context-window meter by emitting thread.token-usage.updated from ACP session traffic, matching what Codex already had.

ACP parsing gains a UsageUpdated path for explicit usage_update notifications and for Grok’s live signal: session/update_meta.totalTokens (with window size from _meta keys or model metadata). Prompt-response _meta.usage.totalTokens is intentionally ignored so billed API tokens are not shown as context fill. makeAcpTokenUsageEvent maps occupancy into the canonical runtime event (positive used tokens only, clamped to max).

GrokAdapter dedupes snapshots, seeds max window from session setup availableModels[]._meta.totalContextTokens, refreshes on model change, and skips updates for interrupted turns. CursorAdapter handles the same UsageUpdated branch for exhaustiveness. The mock ACP agent can simulate occupancy via T3_ACP_EMIT_CONTEXT_USAGE.

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

Note

Add context-window usage events for Grok ACP adapter

  • Adds a canonical makeAcpTokenUsageEvent factory in AcpCoreRuntimeEvents.ts that converts positive usage measurements into thread.token-usage.updated events with rounded, maximum-bounded token counts
  • Extends ACP session-update parsing in AcpRuntimeModel.ts to project usage_update notifications and totalTokens metadata into UsageUpdated parsed events
  • Builds a model-to-context-window map from Grok session setup metadata in GrokAcpSupport.ts, resolving window sizes by exact model ID or base model ID
  • makeGrokAdapter in GrokAdapter.ts now processes UsageUpdated notifications, deduplicates snapshots, refreshes the cached window on model change, and emits token-usage events using the event-provided or model-derived window (default 500,000)
  • Risk: parseSessionUpdateEvent now emits UsageUpdated for any session-update containing totalTokens metadata; adapters or consumers that did not expect this event type on session updates need to handle it

Macroscope summarized a2087c9.

Grok ACP does not emit usage_update. Occupancy lives on session/update _meta.totalTokens. Map that onto the existing thread.token-usage.updated path so ContextWindowMeter can render.
Do not use prompt-response usage.totalTokens; that is billed API tokens, not context fill.
Closespingdotgg#8382
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated

@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 6af161d. Configure here.

Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@macroscopeapp

macroscopeappBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change adds a cross-cutting production pipeline that turns ACP session metadata into persisted context-window updates for Grok and Cursor, including a new 500,000-token fallback displayed by the composer meter. A cancellation race can also allow stale usage to overwrite the meter, so the runtime behavior and fallback semantics need human review.

Not approved because:

  • 1 blocking correctness issue found at or above your repo's Minimum Blocking Severity

Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more.

Keep lastKnownMaxTokens in sync when sendTurn switches models. Dedup occupancy snapshots on used+emitted max so a later window size is not dropped.

if (event._tag === "UsageUpdated") {
const usageTurnId = resolveNotificationTurnId(ctx);
if (usageTurnId !== undefined && ctx.interruptedTurnIds.has(usageTurnId)) {

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.

🟡 MediumLayers/GrokAdapter.ts:1374

A queued UsageUpdated from a cancelled prompt is emitted as thread.token-usage.updated after interruptTurn clears activeTurnId, so stale usage overwrites the composer context meter. Treat usageTurnId === undefined as stale here, in addition to checking interruptedTurnIds.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/provider/Layers/GrokAdapter.ts around line 1374:
A queued `UsageUpdated` from a cancelled prompt is emitted as `thread.token-usage.updated` after `interruptTurn` clears `activeTurnId`, so stale usage overwrites the composer context meter. Treat `usageTurnId === undefined` as stale here, in addition to checking `interruptedTurnIds`.

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.

[Bug]: Grok threads do not show context-window usage in the composer

1 participant

@theman6660
, '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

fix(grok): show context-window usage in the composer - #9206

Open
theman6660 wants to merge 2 commits into
pingdotgg:mainfrom
theman6660:fix/grok-composer-context-window
Open

fix(grok): show context-window usage in the composer#9206
theman6660 wants to merge 2 commits into
pingdotgg:mainfrom
theman6660:fix/grok-composer-context-window

Conversation

@theman6660

@theman6660theman6660 commented Sep 2, 2026

Copy link
Copy Markdown

Closes#8382

What Changed

Grok threads never showed the composer context-window meter. The live adapter did not emit thread.token-usage.updated, so ContextWindowMeter had nothing to render.

This maps occupancy onto that existing path:

  • ACP sessionUpdate: "usage_update" when present
  • Grok's actual path today: session/update_meta.totalTokens
  • Window size from _meta (contextWindowTokens / contextWindow / maxTokens), else the current model's availableModels[]._meta.totalContextTokens, else 500k

Interrupted turns do not overwrite the last snapshot. Cursor gets the shared UsageUpdated case so the ACP union stays exhaustive.

No new UI. The existing composer meter is enough.

Why

Codex already shows used / max / %. Grok did not, even though grok agent stdio already streams fill on _meta.totalTokens.

Live Grok ACP still does not send usage_update. Occupancy lives on session/update _meta.totalTokens. Prompt-response usage.totalTokens is billed API tokens, not context fill. On a greeting turn those were 1615 occupancy vs 20554 billed. This PR does not use the prompt-response number, which is the difference from #5405.

UI Changes

Uses the existing context-window meter in the composer.

  • Before: Grok threads have no context fill indicator.
  • After: After the first occupancy-bearing session/update, Grok shows the same ring + used/max tooltip as Codex.

Validation

  • vp test run src/provider/acp/AcpRuntimeModel.test.ts src/provider/acp/AcpCoreRuntimeEvents.test.ts src/provider/acp/GrokAcpSupport.test.ts — 50 passed
  • Server typecheck: no new errors
  • Live Grok session: _meta.totalTokens is occupancy; prompt usage.totalTokens is billed tokens; signals.json has contextWindowTokens: 500000
  • GrokAdapter mock spawn tests fail on this Windows host (spawn EFTYPE on the .sh wrapper). That is existing, not introduced here. The new adapter test is in GrokAdapter.test.ts for Linux CI.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for the UI change (happy to add a Grok-thread capture)
  • A video is not applicable (no animation/timing change)

Note

Low Risk
Provider-adapter and event-mapping changes only; no auth or persistence changes, with deduplication and explicit exclusion of billed-token metadata reducing wrong-meter risk.

Overview
Grok threads can now drive the existing composer context-window meter by emitting thread.token-usage.updated from ACP session traffic, matching what Codex already had.

ACP parsing gains a UsageUpdated path for explicit usage_update notifications and for Grok’s live signal: session/update_meta.totalTokens (with window size from _meta keys or model metadata). Prompt-response _meta.usage.totalTokens is intentionally ignored so billed API tokens are not shown as context fill. makeAcpTokenUsageEvent maps occupancy into the canonical runtime event (positive used tokens only, clamped to max).

GrokAdapter dedupes snapshots, seeds max window from session setup availableModels[]._meta.totalContextTokens, refreshes on model change, and skips updates for interrupted turns. CursorAdapter handles the same UsageUpdated branch for exhaustiveness. The mock ACP agent can simulate occupancy via T3_ACP_EMIT_CONTEXT_USAGE.

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

Note

Add context-window usage events for Grok ACP adapter

  • Adds a canonical makeAcpTokenUsageEvent factory in AcpCoreRuntimeEvents.ts that converts positive usage measurements into thread.token-usage.updated events with rounded, maximum-bounded token counts
  • Extends ACP session-update parsing in AcpRuntimeModel.ts to project usage_update notifications and totalTokens metadata into UsageUpdated parsed events
  • Builds a model-to-context-window map from Grok session setup metadata in GrokAcpSupport.ts, resolving window sizes by exact model ID or base model ID
  • makeGrokAdapter in GrokAdapter.ts now processes UsageUpdated notifications, deduplicates snapshots, refreshes the cached window on model change, and emits token-usage events using the event-provided or model-derived window (default 500,000)
  • Risk: parseSessionUpdateEvent now emits UsageUpdated for any session-update containing totalTokens metadata; adapters or consumers that did not expect this event type on session updates need to handle it

Macroscope summarized a2087c9.

Grok ACP does not emit usage_update. Occupancy lives on session/update _meta.totalTokens. Map that onto the existing thread.token-usage.updated path so ContextWindowMeter can render.
Do not use prompt-response usage.totalTokens; that is billed API tokens, not context fill.
Closespingdotgg#8382
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated

@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 6af161d. Configure here.

Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@macroscopeapp

macroscopeappBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change adds a cross-cutting production pipeline that turns ACP session metadata into persisted context-window updates for Grok and Cursor, including a new 500,000-token fallback displayed by the composer meter. A cancellation race can also allow stale usage to overwrite the meter, so the runtime behavior and fallback semantics need human review.

Not approved because:

  • 1 blocking correctness issue found at or above your repo's Minimum Blocking Severity

Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more.

Keep lastKnownMaxTokens in sync when sendTurn switches models. Dedup occupancy snapshots on used+emitted max so a later window size is not dropped.

if (event._tag === "UsageUpdated") {
const usageTurnId = resolveNotificationTurnId(ctx);
if (usageTurnId !== undefined && ctx.interruptedTurnIds.has(usageTurnId)) {

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.

🟡 MediumLayers/GrokAdapter.ts:1374

A queued UsageUpdated from a cancelled prompt is emitted as thread.token-usage.updated after interruptTurn clears activeTurnId, so stale usage overwrites the composer context meter. Treat usageTurnId === undefined as stale here, in addition to checking interruptedTurnIds.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/provider/Layers/GrokAdapter.ts around line 1374:
A queued `UsageUpdated` from a cancelled prompt is emitted as `thread.token-usage.updated` after `interruptTurn` clears `activeTurnId`, so stale usage overwrites the composer context meter. Treat `usageTurnId === undefined` as stale here, in addition to checking `interruptedTurnIds`.

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.

[Bug]: Grok threads do not show context-window usage in the composer

1 participant

@theman6660
, '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

fix(grok): show context-window usage in the composer - #9206

Open
theman6660 wants to merge 2 commits into
pingdotgg:mainfrom
theman6660:fix/grok-composer-context-window
Open

fix(grok): show context-window usage in the composer#9206
theman6660 wants to merge 2 commits into
pingdotgg:mainfrom
theman6660:fix/grok-composer-context-window

Conversation

@theman6660

@theman6660theman6660 commented Sep 2, 2026

Copy link
Copy Markdown

Closes#8382

What Changed

Grok threads never showed the composer context-window meter. The live adapter did not emit thread.token-usage.updated, so ContextWindowMeter had nothing to render.

This maps occupancy onto that existing path:

  • ACP sessionUpdate: "usage_update" when present
  • Grok's actual path today: session/update_meta.totalTokens
  • Window size from _meta (contextWindowTokens / contextWindow / maxTokens), else the current model's availableModels[]._meta.totalContextTokens, else 500k

Interrupted turns do not overwrite the last snapshot. Cursor gets the shared UsageUpdated case so the ACP union stays exhaustive.

No new UI. The existing composer meter is enough.

Why

Codex already shows used / max / %. Grok did not, even though grok agent stdio already streams fill on _meta.totalTokens.

Live Grok ACP still does not send usage_update. Occupancy lives on session/update _meta.totalTokens. Prompt-response usage.totalTokens is billed API tokens, not context fill. On a greeting turn those were 1615 occupancy vs 20554 billed. This PR does not use the prompt-response number, which is the difference from #5405.

UI Changes

Uses the existing context-window meter in the composer.

  • Before: Grok threads have no context fill indicator.
  • After: After the first occupancy-bearing session/update, Grok shows the same ring + used/max tooltip as Codex.

Validation

  • vp test run src/provider/acp/AcpRuntimeModel.test.ts src/provider/acp/AcpCoreRuntimeEvents.test.ts src/provider/acp/GrokAcpSupport.test.ts — 50 passed
  • Server typecheck: no new errors
  • Live Grok session: _meta.totalTokens is occupancy; prompt usage.totalTokens is billed tokens; signals.json has contextWindowTokens: 500000
  • GrokAdapter mock spawn tests fail on this Windows host (spawn EFTYPE on the .sh wrapper). That is existing, not introduced here. The new adapter test is in GrokAdapter.test.ts for Linux CI.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for the UI change (happy to add a Grok-thread capture)
  • A video is not applicable (no animation/timing change)

Note

Low Risk
Provider-adapter and event-mapping changes only; no auth or persistence changes, with deduplication and explicit exclusion of billed-token metadata reducing wrong-meter risk.

Overview
Grok threads can now drive the existing composer context-window meter by emitting thread.token-usage.updated from ACP session traffic, matching what Codex already had.

ACP parsing gains a UsageUpdated path for explicit usage_update notifications and for Grok’s live signal: session/update_meta.totalTokens (with window size from _meta keys or model metadata). Prompt-response _meta.usage.totalTokens is intentionally ignored so billed API tokens are not shown as context fill. makeAcpTokenUsageEvent maps occupancy into the canonical runtime event (positive used tokens only, clamped to max).

GrokAdapter dedupes snapshots, seeds max window from session setup availableModels[]._meta.totalContextTokens, refreshes on model change, and skips updates for interrupted turns. CursorAdapter handles the same UsageUpdated branch for exhaustiveness. The mock ACP agent can simulate occupancy via T3_ACP_EMIT_CONTEXT_USAGE.

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

Note

Add context-window usage events for Grok ACP adapter

  • Adds a canonical makeAcpTokenUsageEvent factory in AcpCoreRuntimeEvents.ts that converts positive usage measurements into thread.token-usage.updated events with rounded, maximum-bounded token counts
  • Extends ACP session-update parsing in AcpRuntimeModel.ts to project usage_update notifications and totalTokens metadata into UsageUpdated parsed events
  • Builds a model-to-context-window map from Grok session setup metadata in GrokAcpSupport.ts, resolving window sizes by exact model ID or base model ID
  • makeGrokAdapter in GrokAdapter.ts now processes UsageUpdated notifications, deduplicates snapshots, refreshes the cached window on model change, and emits token-usage events using the event-provided or model-derived window (default 500,000)
  • Risk: parseSessionUpdateEvent now emits UsageUpdated for any session-update containing totalTokens metadata; adapters or consumers that did not expect this event type on session updates need to handle it

Macroscope summarized a2087c9.

Grok ACP does not emit usage_update. Occupancy lives on session/update _meta.totalTokens. Map that onto the existing thread.token-usage.updated path so ContextWindowMeter can render.
Do not use prompt-response usage.totalTokens; that is billed API tokens, not context fill.
Closespingdotgg#8382
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated

@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 6af161d. Configure here.

Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@macroscopeapp

macroscopeappBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change adds a cross-cutting production pipeline that turns ACP session metadata into persisted context-window updates for Grok and Cursor, including a new 500,000-token fallback displayed by the composer meter. A cancellation race can also allow stale usage to overwrite the meter, so the runtime behavior and fallback semantics need human review.

Not approved because:

  • 1 blocking correctness issue found at or above your repo's Minimum Blocking Severity

Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more.

Keep lastKnownMaxTokens in sync when sendTurn switches models. Dedup occupancy snapshots on used+emitted max so a later window size is not dropped.

if (event._tag === "UsageUpdated") {
const usageTurnId = resolveNotificationTurnId(ctx);
if (usageTurnId !== undefined && ctx.interruptedTurnIds.has(usageTurnId)) {

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.

🟡 MediumLayers/GrokAdapter.ts:1374

A queued UsageUpdated from a cancelled prompt is emitted as thread.token-usage.updated after interruptTurn clears activeTurnId, so stale usage overwrites the composer context meter. Treat usageTurnId === undefined as stale here, in addition to checking interruptedTurnIds.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/provider/Layers/GrokAdapter.ts around line 1374:
A queued `UsageUpdated` from a cancelled prompt is emitted as `thread.token-usage.updated` after `interruptTurn` clears `activeTurnId`, so stale usage overwrites the composer context meter. Treat `usageTurnId === undefined` as stale here, in addition to checking `interruptedTurnIds`.

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.

[Bug]: Grok threads do not show context-window usage in the composer

1 participant

@theman6660
, '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

fix(grok): show context-window usage in the composer - #9206

Open
theman6660 wants to merge 2 commits into
pingdotgg:mainfrom
theman6660:fix/grok-composer-context-window
Open

fix(grok): show context-window usage in the composer#9206
theman6660 wants to merge 2 commits into
pingdotgg:mainfrom
theman6660:fix/grok-composer-context-window

Conversation

@theman6660

@theman6660theman6660 commented Sep 2, 2026

Copy link
Copy Markdown

Closes#8382

What Changed

Grok threads never showed the composer context-window meter. The live adapter did not emit thread.token-usage.updated, so ContextWindowMeter had nothing to render.

This maps occupancy onto that existing path:

  • ACP sessionUpdate: "usage_update" when present
  • Grok's actual path today: session/update_meta.totalTokens
  • Window size from _meta (contextWindowTokens / contextWindow / maxTokens), else the current model's availableModels[]._meta.totalContextTokens, else 500k

Interrupted turns do not overwrite the last snapshot. Cursor gets the shared UsageUpdated case so the ACP union stays exhaustive.

No new UI. The existing composer meter is enough.

Why

Codex already shows used / max / %. Grok did not, even though grok agent stdio already streams fill on _meta.totalTokens.

Live Grok ACP still does not send usage_update. Occupancy lives on session/update _meta.totalTokens. Prompt-response usage.totalTokens is billed API tokens, not context fill. On a greeting turn those were 1615 occupancy vs 20554 billed. This PR does not use the prompt-response number, which is the difference from #5405.

UI Changes

Uses the existing context-window meter in the composer.

  • Before: Grok threads have no context fill indicator.
  • After: After the first occupancy-bearing session/update, Grok shows the same ring + used/max tooltip as Codex.

Validation

  • vp test run src/provider/acp/AcpRuntimeModel.test.ts src/provider/acp/AcpCoreRuntimeEvents.test.ts src/provider/acp/GrokAcpSupport.test.ts — 50 passed
  • Server typecheck: no new errors
  • Live Grok session: _meta.totalTokens is occupancy; prompt usage.totalTokens is billed tokens; signals.json has contextWindowTokens: 500000
  • GrokAdapter mock spawn tests fail on this Windows host (spawn EFTYPE on the .sh wrapper). That is existing, not introduced here. The new adapter test is in GrokAdapter.test.ts for Linux CI.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for the UI change (happy to add a Grok-thread capture)
  • A video is not applicable (no animation/timing change)

Note

Low Risk
Provider-adapter and event-mapping changes only; no auth or persistence changes, with deduplication and explicit exclusion of billed-token metadata reducing wrong-meter risk.

Overview
Grok threads can now drive the existing composer context-window meter by emitting thread.token-usage.updated from ACP session traffic, matching what Codex already had.

ACP parsing gains a UsageUpdated path for explicit usage_update notifications and for Grok’s live signal: session/update_meta.totalTokens (with window size from _meta keys or model metadata). Prompt-response _meta.usage.totalTokens is intentionally ignored so billed API tokens are not shown as context fill. makeAcpTokenUsageEvent maps occupancy into the canonical runtime event (positive used tokens only, clamped to max).

GrokAdapter dedupes snapshots, seeds max window from session setup availableModels[]._meta.totalContextTokens, refreshes on model change, and skips updates for interrupted turns. CursorAdapter handles the same UsageUpdated branch for exhaustiveness. The mock ACP agent can simulate occupancy via T3_ACP_EMIT_CONTEXT_USAGE.

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

Note

Add context-window usage events for Grok ACP adapter

  • Adds a canonical makeAcpTokenUsageEvent factory in AcpCoreRuntimeEvents.ts that converts positive usage measurements into thread.token-usage.updated events with rounded, maximum-bounded token counts
  • Extends ACP session-update parsing in AcpRuntimeModel.ts to project usage_update notifications and totalTokens metadata into UsageUpdated parsed events
  • Builds a model-to-context-window map from Grok session setup metadata in GrokAcpSupport.ts, resolving window sizes by exact model ID or base model ID
  • makeGrokAdapter in GrokAdapter.ts now processes UsageUpdated notifications, deduplicates snapshots, refreshes the cached window on model change, and emits token-usage events using the event-provided or model-derived window (default 500,000)
  • Risk: parseSessionUpdateEvent now emits UsageUpdated for any session-update containing totalTokens metadata; adapters or consumers that did not expect this event type on session updates need to handle it

Macroscope summarized a2087c9.

Grok ACP does not emit usage_update. Occupancy lives on session/update _meta.totalTokens. Map that onto the existing thread.token-usage.updated path so ContextWindowMeter can render.
Do not use prompt-response usage.totalTokens; that is billed API tokens, not context fill.
Closespingdotgg#8382
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated

@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 6af161d. Configure here.

Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@macroscopeapp

macroscopeappBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change adds a cross-cutting production pipeline that turns ACP session metadata into persisted context-window updates for Grok and Cursor, including a new 500,000-token fallback displayed by the composer meter. A cancellation race can also allow stale usage to overwrite the meter, so the runtime behavior and fallback semantics need human review.

Not approved because:

  • 1 blocking correctness issue found at or above your repo's Minimum Blocking Severity

Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more.

Keep lastKnownMaxTokens in sync when sendTurn switches models. Dedup occupancy snapshots on used+emitted max so a later window size is not dropped.

if (event._tag === "UsageUpdated") {
const usageTurnId = resolveNotificationTurnId(ctx);
if (usageTurnId !== undefined && ctx.interruptedTurnIds.has(usageTurnId)) {

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.

🟡 MediumLayers/GrokAdapter.ts:1374

A queued UsageUpdated from a cancelled prompt is emitted as thread.token-usage.updated after interruptTurn clears activeTurnId, so stale usage overwrites the composer context meter. Treat usageTurnId === undefined as stale here, in addition to checking interruptedTurnIds.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/provider/Layers/GrokAdapter.ts around line 1374:
A queued `UsageUpdated` from a cancelled prompt is emitted as `thread.token-usage.updated` after `interruptTurn` clears `activeTurnId`, so stale usage overwrites the composer context meter. Treat `usageTurnId === undefined` as stale here, in addition to checking `interruptedTurnIds`.

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.

[Bug]: Grok threads do not show context-window usage in the composer

1 participant

@theman6660
, '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

fix(grok): show context-window usage in the composer - #9206

Open
theman6660 wants to merge 2 commits into
pingdotgg:mainfrom
theman6660:fix/grok-composer-context-window
Open

fix(grok): show context-window usage in the composer#9206
theman6660 wants to merge 2 commits into
pingdotgg:mainfrom
theman6660:fix/grok-composer-context-window

Conversation

@theman6660

@theman6660theman6660 commented Sep 2, 2026

Copy link
Copy Markdown

Closes#8382

What Changed

Grok threads never showed the composer context-window meter. The live adapter did not emit thread.token-usage.updated, so ContextWindowMeter had nothing to render.

This maps occupancy onto that existing path:

  • ACP sessionUpdate: "usage_update" when present
  • Grok's actual path today: session/update_meta.totalTokens
  • Window size from _meta (contextWindowTokens / contextWindow / maxTokens), else the current model's availableModels[]._meta.totalContextTokens, else 500k

Interrupted turns do not overwrite the last snapshot. Cursor gets the shared UsageUpdated case so the ACP union stays exhaustive.

No new UI. The existing composer meter is enough.

Why

Codex already shows used / max / %. Grok did not, even though grok agent stdio already streams fill on _meta.totalTokens.

Live Grok ACP still does not send usage_update. Occupancy lives on session/update _meta.totalTokens. Prompt-response usage.totalTokens is billed API tokens, not context fill. On a greeting turn those were 1615 occupancy vs 20554 billed. This PR does not use the prompt-response number, which is the difference from #5405.

UI Changes

Uses the existing context-window meter in the composer.

  • Before: Grok threads have no context fill indicator.
  • After: After the first occupancy-bearing session/update, Grok shows the same ring + used/max tooltip as Codex.

Validation

  • vp test run src/provider/acp/AcpRuntimeModel.test.ts src/provider/acp/AcpCoreRuntimeEvents.test.ts src/provider/acp/GrokAcpSupport.test.ts — 50 passed
  • Server typecheck: no new errors
  • Live Grok session: _meta.totalTokens is occupancy; prompt usage.totalTokens is billed tokens; signals.json has contextWindowTokens: 500000
  • GrokAdapter mock spawn tests fail on this Windows host (spawn EFTYPE on the .sh wrapper). That is existing, not introduced here. The new adapter test is in GrokAdapter.test.ts for Linux CI.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for the UI change (happy to add a Grok-thread capture)
  • A video is not applicable (no animation/timing change)

Note

Low Risk
Provider-adapter and event-mapping changes only; no auth or persistence changes, with deduplication and explicit exclusion of billed-token metadata reducing wrong-meter risk.

Overview
Grok threads can now drive the existing composer context-window meter by emitting thread.token-usage.updated from ACP session traffic, matching what Codex already had.

ACP parsing gains a UsageUpdated path for explicit usage_update notifications and for Grok’s live signal: session/update_meta.totalTokens (with window size from _meta keys or model metadata). Prompt-response _meta.usage.totalTokens is intentionally ignored so billed API tokens are not shown as context fill. makeAcpTokenUsageEvent maps occupancy into the canonical runtime event (positive used tokens only, clamped to max).

GrokAdapter dedupes snapshots, seeds max window from session setup availableModels[]._meta.totalContextTokens, refreshes on model change, and skips updates for interrupted turns. CursorAdapter handles the same UsageUpdated branch for exhaustiveness. The mock ACP agent can simulate occupancy via T3_ACP_EMIT_CONTEXT_USAGE.

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

Note

Add context-window usage events for Grok ACP adapter

  • Adds a canonical makeAcpTokenUsageEvent factory in AcpCoreRuntimeEvents.ts that converts positive usage measurements into thread.token-usage.updated events with rounded, maximum-bounded token counts
  • Extends ACP session-update parsing in AcpRuntimeModel.ts to project usage_update notifications and totalTokens metadata into UsageUpdated parsed events
  • Builds a model-to-context-window map from Grok session setup metadata in GrokAcpSupport.ts, resolving window sizes by exact model ID or base model ID
  • makeGrokAdapter in GrokAdapter.ts now processes UsageUpdated notifications, deduplicates snapshots, refreshes the cached window on model change, and emits token-usage events using the event-provided or model-derived window (default 500,000)
  • Risk: parseSessionUpdateEvent now emits UsageUpdated for any session-update containing totalTokens metadata; adapters or consumers that did not expect this event type on session updates need to handle it

Macroscope summarized a2087c9.

Grok ACP does not emit usage_update. Occupancy lives on session/update _meta.totalTokens. Map that onto the existing thread.token-usage.updated path so ContextWindowMeter can render.
Do not use prompt-response usage.totalTokens; that is billed API tokens, not context fill.
Closespingdotgg#8382
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated

@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 6af161d. Configure here.

Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@macroscopeapp

macroscopeappBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change adds a cross-cutting production pipeline that turns ACP session metadata into persisted context-window updates for Grok and Cursor, including a new 500,000-token fallback displayed by the composer meter. A cancellation race can also allow stale usage to overwrite the meter, so the runtime behavior and fallback semantics need human review.

Not approved because:

  • 1 blocking correctness issue found at or above your repo's Minimum Blocking Severity

Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more.

Keep lastKnownMaxTokens in sync when sendTurn switches models. Dedup occupancy snapshots on used+emitted max so a later window size is not dropped.

if (event._tag === "UsageUpdated") {
const usageTurnId = resolveNotificationTurnId(ctx);
if (usageTurnId !== undefined && ctx.interruptedTurnIds.has(usageTurnId)) {

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.

🟡 MediumLayers/GrokAdapter.ts:1374

A queued UsageUpdated from a cancelled prompt is emitted as thread.token-usage.updated after interruptTurn clears activeTurnId, so stale usage overwrites the composer context meter. Treat usageTurnId === undefined as stale here, in addition to checking interruptedTurnIds.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/provider/Layers/GrokAdapter.ts around line 1374:
A queued `UsageUpdated` from a cancelled prompt is emitted as `thread.token-usage.updated` after `interruptTurn` clears `activeTurnId`, so stale usage overwrites the composer context meter. Treat `usageTurnId === undefined` as stale here, in addition to checking `interruptedTurnIds`.

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.

[Bug]: Grok threads do not show context-window usage in the composer

1 participant

@theman6660
, '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

fix(grok): show context-window usage in the composer - #9206

Open
theman6660 wants to merge 2 commits into
pingdotgg:mainfrom
theman6660:fix/grok-composer-context-window
Open

fix(grok): show context-window usage in the composer#9206
theman6660 wants to merge 2 commits into
pingdotgg:mainfrom
theman6660:fix/grok-composer-context-window

Conversation

@theman6660

@theman6660theman6660 commented Sep 2, 2026

Copy link
Copy Markdown

Closes#8382

What Changed

Grok threads never showed the composer context-window meter. The live adapter did not emit thread.token-usage.updated, so ContextWindowMeter had nothing to render.

This maps occupancy onto that existing path:

  • ACP sessionUpdate: "usage_update" when present
  • Grok's actual path today: session/update_meta.totalTokens
  • Window size from _meta (contextWindowTokens / contextWindow / maxTokens), else the current model's availableModels[]._meta.totalContextTokens, else 500k

Interrupted turns do not overwrite the last snapshot. Cursor gets the shared UsageUpdated case so the ACP union stays exhaustive.

No new UI. The existing composer meter is enough.

Why

Codex already shows used / max / %. Grok did not, even though grok agent stdio already streams fill on _meta.totalTokens.

Live Grok ACP still does not send usage_update. Occupancy lives on session/update _meta.totalTokens. Prompt-response usage.totalTokens is billed API tokens, not context fill. On a greeting turn those were 1615 occupancy vs 20554 billed. This PR does not use the prompt-response number, which is the difference from #5405.

UI Changes

Uses the existing context-window meter in the composer.

  • Before: Grok threads have no context fill indicator.
  • After: After the first occupancy-bearing session/update, Grok shows the same ring + used/max tooltip as Codex.

Validation

  • vp test run src/provider/acp/AcpRuntimeModel.test.ts src/provider/acp/AcpCoreRuntimeEvents.test.ts src/provider/acp/GrokAcpSupport.test.ts — 50 passed
  • Server typecheck: no new errors
  • Live Grok session: _meta.totalTokens is occupancy; prompt usage.totalTokens is billed tokens; signals.json has contextWindowTokens: 500000
  • GrokAdapter mock spawn tests fail on this Windows host (spawn EFTYPE on the .sh wrapper). That is existing, not introduced here. The new adapter test is in GrokAdapter.test.ts for Linux CI.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for the UI change (happy to add a Grok-thread capture)
  • A video is not applicable (no animation/timing change)

Note

Low Risk
Provider-adapter and event-mapping changes only; no auth or persistence changes, with deduplication and explicit exclusion of billed-token metadata reducing wrong-meter risk.

Overview
Grok threads can now drive the existing composer context-window meter by emitting thread.token-usage.updated from ACP session traffic, matching what Codex already had.

ACP parsing gains a UsageUpdated path for explicit usage_update notifications and for Grok’s live signal: session/update_meta.totalTokens (with window size from _meta keys or model metadata). Prompt-response _meta.usage.totalTokens is intentionally ignored so billed API tokens are not shown as context fill. makeAcpTokenUsageEvent maps occupancy into the canonical runtime event (positive used tokens only, clamped to max).

GrokAdapter dedupes snapshots, seeds max window from session setup availableModels[]._meta.totalContextTokens, refreshes on model change, and skips updates for interrupted turns. CursorAdapter handles the same UsageUpdated branch for exhaustiveness. The mock ACP agent can simulate occupancy via T3_ACP_EMIT_CONTEXT_USAGE.

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

Note

Add context-window usage events for Grok ACP adapter

  • Adds a canonical makeAcpTokenUsageEvent factory in AcpCoreRuntimeEvents.ts that converts positive usage measurements into thread.token-usage.updated events with rounded, maximum-bounded token counts
  • Extends ACP session-update parsing in AcpRuntimeModel.ts to project usage_update notifications and totalTokens metadata into UsageUpdated parsed events
  • Builds a model-to-context-window map from Grok session setup metadata in GrokAcpSupport.ts, resolving window sizes by exact model ID or base model ID
  • makeGrokAdapter in GrokAdapter.ts now processes UsageUpdated notifications, deduplicates snapshots, refreshes the cached window on model change, and emits token-usage events using the event-provided or model-derived window (default 500,000)
  • Risk: parseSessionUpdateEvent now emits UsageUpdated for any session-update containing totalTokens metadata; adapters or consumers that did not expect this event type on session updates need to handle it

Macroscope summarized a2087c9.

Grok ACP does not emit usage_update. Occupancy lives on session/update _meta.totalTokens. Map that onto the existing thread.token-usage.updated path so ContextWindowMeter can render.
Do not use prompt-response usage.totalTokens; that is billed API tokens, not context fill.
Closespingdotgg#8382
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated

@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 6af161d. Configure here.

Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@macroscopeapp

macroscopeappBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change adds a cross-cutting production pipeline that turns ACP session metadata into persisted context-window updates for Grok and Cursor, including a new 500,000-token fallback displayed by the composer meter. A cancellation race can also allow stale usage to overwrite the meter, so the runtime behavior and fallback semantics need human review.

Not approved because:

  • 1 blocking correctness issue found at or above your repo's Minimum Blocking Severity

Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more.

Keep lastKnownMaxTokens in sync when sendTurn switches models. Dedup occupancy snapshots on used+emitted max so a later window size is not dropped.

if (event._tag === "UsageUpdated") {
const usageTurnId = resolveNotificationTurnId(ctx);
if (usageTurnId !== undefined && ctx.interruptedTurnIds.has(usageTurnId)) {

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.

🟡 MediumLayers/GrokAdapter.ts:1374

A queued UsageUpdated from a cancelled prompt is emitted as thread.token-usage.updated after interruptTurn clears activeTurnId, so stale usage overwrites the composer context meter. Treat usageTurnId === undefined as stale here, in addition to checking interruptedTurnIds.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/provider/Layers/GrokAdapter.ts around line 1374:
A queued `UsageUpdated` from a cancelled prompt is emitted as `thread.token-usage.updated` after `interruptTurn` clears `activeTurnId`, so stale usage overwrites the composer context meter. Treat `usageTurnId === undefined` as stale here, in addition to checking `interruptedTurnIds`.

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.

[Bug]: Grok threads do not show context-window usage in the composer

1 participant

@theman6660
, '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

fix(grok): show context-window usage in the composer - #9206

Open
theman6660 wants to merge 2 commits into
pingdotgg:mainfrom
theman6660:fix/grok-composer-context-window
Open

fix(grok): show context-window usage in the composer#9206
theman6660 wants to merge 2 commits into
pingdotgg:mainfrom
theman6660:fix/grok-composer-context-window

Conversation

@theman6660

@theman6660theman6660 commented Sep 2, 2026

Copy link
Copy Markdown

Closes#8382

What Changed

Grok threads never showed the composer context-window meter. The live adapter did not emit thread.token-usage.updated, so ContextWindowMeter had nothing to render.

This maps occupancy onto that existing path:

  • ACP sessionUpdate: "usage_update" when present
  • Grok's actual path today: session/update_meta.totalTokens
  • Window size from _meta (contextWindowTokens / contextWindow / maxTokens), else the current model's availableModels[]._meta.totalContextTokens, else 500k

Interrupted turns do not overwrite the last snapshot. Cursor gets the shared UsageUpdated case so the ACP union stays exhaustive.

No new UI. The existing composer meter is enough.

Why

Codex already shows used / max / %. Grok did not, even though grok agent stdio already streams fill on _meta.totalTokens.

Live Grok ACP still does not send usage_update. Occupancy lives on session/update _meta.totalTokens. Prompt-response usage.totalTokens is billed API tokens, not context fill. On a greeting turn those were 1615 occupancy vs 20554 billed. This PR does not use the prompt-response number, which is the difference from #5405.

UI Changes

Uses the existing context-window meter in the composer.

  • Before: Grok threads have no context fill indicator.
  • After: After the first occupancy-bearing session/update, Grok shows the same ring + used/max tooltip as Codex.

Validation

  • vp test run src/provider/acp/AcpRuntimeModel.test.ts src/provider/acp/AcpCoreRuntimeEvents.test.ts src/provider/acp/GrokAcpSupport.test.ts — 50 passed
  • Server typecheck: no new errors
  • Live Grok session: _meta.totalTokens is occupancy; prompt usage.totalTokens is billed tokens; signals.json has contextWindowTokens: 500000
  • GrokAdapter mock spawn tests fail on this Windows host (spawn EFTYPE on the .sh wrapper). That is existing, not introduced here. The new adapter test is in GrokAdapter.test.ts for Linux CI.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for the UI change (happy to add a Grok-thread capture)
  • A video is not applicable (no animation/timing change)

Note

Low Risk
Provider-adapter and event-mapping changes only; no auth or persistence changes, with deduplication and explicit exclusion of billed-token metadata reducing wrong-meter risk.

Overview
Grok threads can now drive the existing composer context-window meter by emitting thread.token-usage.updated from ACP session traffic, matching what Codex already had.

ACP parsing gains a UsageUpdated path for explicit usage_update notifications and for Grok’s live signal: session/update_meta.totalTokens (with window size from _meta keys or model metadata). Prompt-response _meta.usage.totalTokens is intentionally ignored so billed API tokens are not shown as context fill. makeAcpTokenUsageEvent maps occupancy into the canonical runtime event (positive used tokens only, clamped to max).

GrokAdapter dedupes snapshots, seeds max window from session setup availableModels[]._meta.totalContextTokens, refreshes on model change, and skips updates for interrupted turns. CursorAdapter handles the same UsageUpdated branch for exhaustiveness. The mock ACP agent can simulate occupancy via T3_ACP_EMIT_CONTEXT_USAGE.

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

Note

Add context-window usage events for Grok ACP adapter

  • Adds a canonical makeAcpTokenUsageEvent factory in AcpCoreRuntimeEvents.ts that converts positive usage measurements into thread.token-usage.updated events with rounded, maximum-bounded token counts
  • Extends ACP session-update parsing in AcpRuntimeModel.ts to project usage_update notifications and totalTokens metadata into UsageUpdated parsed events
  • Builds a model-to-context-window map from Grok session setup metadata in GrokAcpSupport.ts, resolving window sizes by exact model ID or base model ID
  • makeGrokAdapter in GrokAdapter.ts now processes UsageUpdated notifications, deduplicates snapshots, refreshes the cached window on model change, and emits token-usage events using the event-provided or model-derived window (default 500,000)
  • Risk: parseSessionUpdateEvent now emits UsageUpdated for any session-update containing totalTokens metadata; adapters or consumers that did not expect this event type on session updates need to handle it

Macroscope summarized a2087c9.

Grok ACP does not emit usage_update. Occupancy lives on session/update _meta.totalTokens. Map that onto the existing thread.token-usage.updated path so ContextWindowMeter can render.
Do not use prompt-response usage.totalTokens; that is billed API tokens, not context fill.
Closespingdotgg#8382
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts
Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated

@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 6af161d. Configure here.

Comment threadapps/server/src/provider/Layers/GrokAdapter.ts Outdated
@macroscopeapp

macroscopeappBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change adds a cross-cutting production pipeline that turns ACP session metadata into persisted context-window updates for Grok and Cursor, including a new 500,000-token fallback displayed by the composer meter. A cancellation race can also allow stale usage to overwrite the meter, so the runtime behavior and fallback semantics need human review.

Not approved because:

  • 1 blocking correctness issue found at or above your repo's Minimum Blocking Severity

Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more.

Keep lastKnownMaxTokens in sync when sendTurn switches models. Dedup occupancy snapshots on used+emitted max so a later window size is not dropped.

if (event._tag === "UsageUpdated") {
const usageTurnId = resolveNotificationTurnId(ctx);
if (usageTurnId !== undefined && ctx.interruptedTurnIds.has(usageTurnId)) {

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.

🟡 MediumLayers/GrokAdapter.ts:1374

A queued UsageUpdated from a cancelled prompt is emitted as thread.token-usage.updated after interruptTurn clears activeTurnId, so stale usage overwrites the composer context meter. Treat usageTurnId === undefined as stale here, in addition to checking interruptedTurnIds.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/provider/Layers/GrokAdapter.ts around line 1374:
A queued `UsageUpdated` from a cancelled prompt is emitted as `thread.token-usage.updated` after `interruptTurn` clears `activeTurnId`, so stale usage overwrites the composer context meter. Treat `usageTurnId === undefined` as stale here, in addition to checking `interruptedTurnIds`.

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.

[Bug]: Grok threads do not show context-window usage in the composer

1 participant

@theman6660