feat: add Grok Build provider via shared ACP adapter - #2932

Closed
gmackie wants to merge 2 commits into
pingdotgg:mainfrom
gmackie:grok-build-provider
Closed

feat: add Grok Build provider via shared ACP adapter#2932
gmackie wants to merge 2 commits into
pingdotgg:mainfrom
gmackie:grok-build-provider

Conversation

@gmackie

@gmackiegmackie commented Jun 3, 2026

Copy link
Copy Markdown

Context

This draft PR is a supporting/reference implementation for #2809 and the review concerns raised there. The goal is to help get Grok Build support landed in T3 Code with the ACP lifecycle issues addressed in a shared adapter; maintainers or the #2809 author should feel free to use, cherry-pick, supersede, or close this if it creates review noise.

Summary

  • Adds Grok Build as a provider using grok --agent build agent stdio, with settings, model selection, x.ai branding, web UI, and mobile provider icon support.
  • Extracts Cursor's ACP lifecycle into a shared makeAcpProviderAdapter(...) so Cursor and Grok Build share turn dispatch, resume, interrupt, and approval handling.
  • Keeps T3 Code responsible for worktree ownership by launching Grok in the resolved thread cwd and intentionally not passing Grok's --worktree flag.

ACP lifecycle hardening

  • Rejects overlapping turns for the same ACP thread/session while leaving session/prompt outside the per-thread lock so approval/cancel flows do not deadlock.
  • Ensures a prompt failure after turn.started emits a terminal failed turn.completed event before surfacing the original failure.
  • Coordinates interruptTurn with the same per-thread state lock used by send/stop.
  • Adds auth-method fallback and session/set_model fallback when an ACP server exposes models but no config option.

Test plan

  • bun fmt
  • bun lint (9 warnings, 0 errors)
  • bun typecheck (14/14 packages)
  • bun run --cwd apps/server test src/provider/acp/AcpJsonRpcConnection.test.ts src/provider/acp/GrokAcpSupport.test.ts src/provider/Layers/ProviderInstanceRegistryLive.test.ts src/provider/Layers/CursorAdapter.test.ts src/provider/Layers/GrokBuildProvider.test.ts
  • bun run --cwd apps/web test src/components/chat/providerIconUtils.test.ts src/components/settings/providerDriverMeta.test.ts src/components/settings/ProviderSettingsForm.test.ts
  • bun run --cwd packages/contracts test src/settings.test.ts

Open in Devin Review

Note

Medium Risk
Large refactor of Cursor’s ACP session/turn path affects all ACP providers; new external CLI dependency and child-process auth/model discovery add operational failure modes.

Overview
Adds Grok Build as a first-class provider (grokBuild) wired through contracts, server driver/registry, ACP runtime, structured text generation, and web/mobile picker/settings with x.ai branding.

Server: New GrokBuildDriver spawns grok --agent build agent stdio, probes health/models via ACP, and reuses Cursor-style model discovery. Cursor’s large ACP adapter implementation moves into shared makeAcpProviderAdapter; Cursor and Grok thin-wrap it. ACP hardening for all consumers: per-thread turn exclusivity (prompt runs outside the lock), failed turn.completed after prompt errors, session/set_model when sessions expose models without config options, and auth-method fallback from initialize.

Clients:GrokBuildSettings (default off), model defaults, composer draft keys, provider icons, and registry tests include the fifth driver.

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

Note

Add Grok Build as a new provider via shared ACP adapter

  • Introduces the grokBuild provider driver in GrokBuildDriver.ts, registered in the built-in driver registry alongside Cursor and OpenCode.
  • Adds GrokBuildAdapter.ts and GrokAcpSupport.ts to wire the grok CLI binary via ACP stdio with grok_login auth.
  • Refactors CursorAdapter to delegate to a new shared makeAcpProviderAdapter in AcpProviderAdapter.ts, which GrokBuildAdapter also uses.
  • Adds GrokBuildTextGeneration.ts for commit messages, PR content, branch names, and thread titles with a 180s timeout and structured JSON parsing.
  • Extends contracts, web UI, and mobile to register grokBuild with display name 'Grok Build', a new XAI icon, and an 'Early Access' badge.
  • AcpSessionRuntime.setModel now issues a session/set_model RPC when the session exposes models without a config option, rather than always writing a config option.
📊 Macroscope summarized 8ae98ac. 2 files reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

coderabbitaiBot commented Jun 3, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 7b8e0414-de95-43a1-bf94-1c60ad94f80f

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

Use the checkbox below for a quick retry:

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

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

❤️ Share

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

@gmackiegmackie mentioned this pull request Jun 3, 2026
4 tasks
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Jun 3, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

? { message: "Grok Build ACP model discovery returned no built-in models." }
: {}),
},
});

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.

Grok probe ignores models list

Medium Severity

checkGrokBuildProviderStatus discovers models only from ACP configOptions, but Grok Build can expose models via a models session payload without config options. In that case discovery returns no models and the probe warns even though in-session session/set_model works.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

},
});
return yield* Effect.failCause(promptExit.cause);
}

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.

No terminal turn after stop

Medium Severity

sendTurn emits turn.started then runs session/prompt outside the per-thread lock. If the session is stopped while the prompt is in flight, the finalize step finds no session and returns without emitting turn.completed, leaving the thread stuck in a started turn.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new Grok Build provider integration with ~2500 lines of new code spanning driver, adapter, text generation, settings, and UI layers. New feature additions of this scope require human review, and two unresolved comments identify potential bugs in model discovery and turn state handling.

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

@gmackie
gmackie marked this pull request as draft June 3, 2026 19:41
stopped: false,
};

const nf = yield* Stream.runDrain(

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/AcpProviderAdapter.ts:834

When a single event fails to process (e.g., makeEventStamp() throws), the Effect.catch at line 919-924 catches the error and terminates the entire notificationFiber. The session continues running but silently stops emitting all runtime events because the stream is drained. The catch should wrap individual event processing inside mapEffect so one bad event doesn't kill the whole stream.

🤖 Copy this AI Prompt to have your agent fix this:
In file apps/server/src/provider/Layers/AcpProviderAdapter.ts around line 834:
When a single event fails to process (e.g., `makeEventStamp()` throws), the `Effect.catch` at line 919-924 catches the error and terminates the entire `notificationFiber`. The session continues running but silently stops emitting all runtime events because the stream is drained. The `catch` should wrap individual event processing inside `mapEffect` so one bad event doesn't kill the whole stream.
Evidence trail:
apps/server/src/provider/Layers/AcpProviderAdapter.ts lines 834-928: Stream.runDrain wraps entire stream, Effect.catch at lines 919-924 catches runDrain failure, Effect.forkChild at line 925 forks it as child fiber, fiber stored at line 928. makeEventStamp defined at line 390 as an Effect that could fail. Session stored at line 929 and continues running after fiber completes.

@gmackiegmackie closed this Jun 6, 2026
@DerpedyeaDerpedyea mentioned this pull request Jul 1, 2026
4 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ 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.

1 participant

@gmackie
, '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: add Grok Build provider via shared ACP adapter - #2932

Closed
gmackie wants to merge 2 commits into
pingdotgg:mainfrom
gmackie:grok-build-provider
Closed

feat: add Grok Build provider via shared ACP adapter#2932
gmackie wants to merge 2 commits into
pingdotgg:mainfrom
gmackie:grok-build-provider

Conversation

@gmackie

@gmackiegmackie commented Jun 3, 2026

Copy link
Copy Markdown

Context

This draft PR is a supporting/reference implementation for #2809 and the review concerns raised there. The goal is to help get Grok Build support landed in T3 Code with the ACP lifecycle issues addressed in a shared adapter; maintainers or the #2809 author should feel free to use, cherry-pick, supersede, or close this if it creates review noise.

Summary

  • Adds Grok Build as a provider using grok --agent build agent stdio, with settings, model selection, x.ai branding, web UI, and mobile provider icon support.
  • Extracts Cursor's ACP lifecycle into a shared makeAcpProviderAdapter(...) so Cursor and Grok Build share turn dispatch, resume, interrupt, and approval handling.
  • Keeps T3 Code responsible for worktree ownership by launching Grok in the resolved thread cwd and intentionally not passing Grok's --worktree flag.

ACP lifecycle hardening

  • Rejects overlapping turns for the same ACP thread/session while leaving session/prompt outside the per-thread lock so approval/cancel flows do not deadlock.
  • Ensures a prompt failure after turn.started emits a terminal failed turn.completed event before surfacing the original failure.
  • Coordinates interruptTurn with the same per-thread state lock used by send/stop.
  • Adds auth-method fallback and session/set_model fallback when an ACP server exposes models but no config option.

Test plan

  • bun fmt
  • bun lint (9 warnings, 0 errors)
  • bun typecheck (14/14 packages)
  • bun run --cwd apps/server test src/provider/acp/AcpJsonRpcConnection.test.ts src/provider/acp/GrokAcpSupport.test.ts src/provider/Layers/ProviderInstanceRegistryLive.test.ts src/provider/Layers/CursorAdapter.test.ts src/provider/Layers/GrokBuildProvider.test.ts
  • bun run --cwd apps/web test src/components/chat/providerIconUtils.test.ts src/components/settings/providerDriverMeta.test.ts src/components/settings/ProviderSettingsForm.test.ts
  • bun run --cwd packages/contracts test src/settings.test.ts

Open in Devin Review

Note

Medium Risk
Large refactor of Cursor’s ACP session/turn path affects all ACP providers; new external CLI dependency and child-process auth/model discovery add operational failure modes.

Overview
Adds Grok Build as a first-class provider (grokBuild) wired through contracts, server driver/registry, ACP runtime, structured text generation, and web/mobile picker/settings with x.ai branding.

Server: New GrokBuildDriver spawns grok --agent build agent stdio, probes health/models via ACP, and reuses Cursor-style model discovery. Cursor’s large ACP adapter implementation moves into shared makeAcpProviderAdapter; Cursor and Grok thin-wrap it. ACP hardening for all consumers: per-thread turn exclusivity (prompt runs outside the lock), failed turn.completed after prompt errors, session/set_model when sessions expose models without config options, and auth-method fallback from initialize.

Clients:GrokBuildSettings (default off), model defaults, composer draft keys, provider icons, and registry tests include the fifth driver.

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

Note

Add Grok Build as a new provider via shared ACP adapter

  • Introduces the grokBuild provider driver in GrokBuildDriver.ts, registered in the built-in driver registry alongside Cursor and OpenCode.
  • Adds GrokBuildAdapter.ts and GrokAcpSupport.ts to wire the grok CLI binary via ACP stdio with grok_login auth.
  • Refactors CursorAdapter to delegate to a new shared makeAcpProviderAdapter in AcpProviderAdapter.ts, which GrokBuildAdapter also uses.
  • Adds GrokBuildTextGeneration.ts for commit messages, PR content, branch names, and thread titles with a 180s timeout and structured JSON parsing.
  • Extends contracts, web UI, and mobile to register grokBuild with display name 'Grok Build', a new XAI icon, and an 'Early Access' badge.
  • AcpSessionRuntime.setModel now issues a session/set_model RPC when the session exposes models without a config option, rather than always writing a config option.
📊 Macroscope summarized 8ae98ac. 2 files reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

coderabbitaiBot commented Jun 3, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 7b8e0414-de95-43a1-bf94-1c60ad94f80f

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

Use the checkbox below for a quick retry:

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

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

❤️ Share

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

@gmackiegmackie mentioned this pull request Jun 3, 2026
4 tasks
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Jun 3, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

? { message: "Grok Build ACP model discovery returned no built-in models." }
: {}),
},
});

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.

Grok probe ignores models list

Medium Severity

checkGrokBuildProviderStatus discovers models only from ACP configOptions, but Grok Build can expose models via a models session payload without config options. In that case discovery returns no models and the probe warns even though in-session session/set_model works.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

},
});
return yield* Effect.failCause(promptExit.cause);
}

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.

No terminal turn after stop

Medium Severity

sendTurn emits turn.started then runs session/prompt outside the per-thread lock. If the session is stopped while the prompt is in flight, the finalize step finds no session and returns without emitting turn.completed, leaving the thread stuck in a started turn.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new Grok Build provider integration with ~2500 lines of new code spanning driver, adapter, text generation, settings, and UI layers. New feature additions of this scope require human review, and two unresolved comments identify potential bugs in model discovery and turn state handling.

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

@gmackie
gmackie marked this pull request as draft June 3, 2026 19:41
stopped: false,
};

const nf = yield* Stream.runDrain(

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/AcpProviderAdapter.ts:834

When a single event fails to process (e.g., makeEventStamp() throws), the Effect.catch at line 919-924 catches the error and terminates the entire notificationFiber. The session continues running but silently stops emitting all runtime events because the stream is drained. The catch should wrap individual event processing inside mapEffect so one bad event doesn't kill the whole stream.

🤖 Copy this AI Prompt to have your agent fix this:
In file apps/server/src/provider/Layers/AcpProviderAdapter.ts around line 834:
When a single event fails to process (e.g., `makeEventStamp()` throws), the `Effect.catch` at line 919-924 catches the error and terminates the entire `notificationFiber`. The session continues running but silently stops emitting all runtime events because the stream is drained. The `catch` should wrap individual event processing inside `mapEffect` so one bad event doesn't kill the whole stream.
Evidence trail:
apps/server/src/provider/Layers/AcpProviderAdapter.ts lines 834-928: Stream.runDrain wraps entire stream, Effect.catch at lines 919-924 catches runDrain failure, Effect.forkChild at line 925 forks it as child fiber, fiber stored at line 928. makeEventStamp defined at line 390 as an Effect that could fail. Session stored at line 929 and continues running after fiber completes.

@gmackiegmackie closed this Jun 6, 2026
@DerpedyeaDerpedyea mentioned this pull request Jul 1, 2026
4 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ 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.

1 participant

@gmackie
, '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: add Grok Build provider via shared ACP adapter - #2932

Closed
gmackie wants to merge 2 commits into
pingdotgg:mainfrom
gmackie:grok-build-provider
Closed

feat: add Grok Build provider via shared ACP adapter#2932
gmackie wants to merge 2 commits into
pingdotgg:mainfrom
gmackie:grok-build-provider

Conversation

@gmackie

@gmackiegmackie commented Jun 3, 2026

Copy link
Copy Markdown

Context

This draft PR is a supporting/reference implementation for #2809 and the review concerns raised there. The goal is to help get Grok Build support landed in T3 Code with the ACP lifecycle issues addressed in a shared adapter; maintainers or the #2809 author should feel free to use, cherry-pick, supersede, or close this if it creates review noise.

Summary

  • Adds Grok Build as a provider using grok --agent build agent stdio, with settings, model selection, x.ai branding, web UI, and mobile provider icon support.
  • Extracts Cursor's ACP lifecycle into a shared makeAcpProviderAdapter(...) so Cursor and Grok Build share turn dispatch, resume, interrupt, and approval handling.
  • Keeps T3 Code responsible for worktree ownership by launching Grok in the resolved thread cwd and intentionally not passing Grok's --worktree flag.

ACP lifecycle hardening

  • Rejects overlapping turns for the same ACP thread/session while leaving session/prompt outside the per-thread lock so approval/cancel flows do not deadlock.
  • Ensures a prompt failure after turn.started emits a terminal failed turn.completed event before surfacing the original failure.
  • Coordinates interruptTurn with the same per-thread state lock used by send/stop.
  • Adds auth-method fallback and session/set_model fallback when an ACP server exposes models but no config option.

Test plan

  • bun fmt
  • bun lint (9 warnings, 0 errors)
  • bun typecheck (14/14 packages)
  • bun run --cwd apps/server test src/provider/acp/AcpJsonRpcConnection.test.ts src/provider/acp/GrokAcpSupport.test.ts src/provider/Layers/ProviderInstanceRegistryLive.test.ts src/provider/Layers/CursorAdapter.test.ts src/provider/Layers/GrokBuildProvider.test.ts
  • bun run --cwd apps/web test src/components/chat/providerIconUtils.test.ts src/components/settings/providerDriverMeta.test.ts src/components/settings/ProviderSettingsForm.test.ts
  • bun run --cwd packages/contracts test src/settings.test.ts

Open in Devin Review

Note

Medium Risk
Large refactor of Cursor’s ACP session/turn path affects all ACP providers; new external CLI dependency and child-process auth/model discovery add operational failure modes.

Overview
Adds Grok Build as a first-class provider (grokBuild) wired through contracts, server driver/registry, ACP runtime, structured text generation, and web/mobile picker/settings with x.ai branding.

Server: New GrokBuildDriver spawns grok --agent build agent stdio, probes health/models via ACP, and reuses Cursor-style model discovery. Cursor’s large ACP adapter implementation moves into shared makeAcpProviderAdapter; Cursor and Grok thin-wrap it. ACP hardening for all consumers: per-thread turn exclusivity (prompt runs outside the lock), failed turn.completed after prompt errors, session/set_model when sessions expose models without config options, and auth-method fallback from initialize.

Clients:GrokBuildSettings (default off), model defaults, composer draft keys, provider icons, and registry tests include the fifth driver.

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

Note

Add Grok Build as a new provider via shared ACP adapter

  • Introduces the grokBuild provider driver in GrokBuildDriver.ts, registered in the built-in driver registry alongside Cursor and OpenCode.
  • Adds GrokBuildAdapter.ts and GrokAcpSupport.ts to wire the grok CLI binary via ACP stdio with grok_login auth.
  • Refactors CursorAdapter to delegate to a new shared makeAcpProviderAdapter in AcpProviderAdapter.ts, which GrokBuildAdapter also uses.
  • Adds GrokBuildTextGeneration.ts for commit messages, PR content, branch names, and thread titles with a 180s timeout and structured JSON parsing.
  • Extends contracts, web UI, and mobile to register grokBuild with display name 'Grok Build', a new XAI icon, and an 'Early Access' badge.
  • AcpSessionRuntime.setModel now issues a session/set_model RPC when the session exposes models without a config option, rather than always writing a config option.
📊 Macroscope summarized 8ae98ac. 2 files reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

coderabbitaiBot commented Jun 3, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 7b8e0414-de95-43a1-bf94-1c60ad94f80f

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

Use the checkbox below for a quick retry:

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

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

❤️ Share

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

@gmackiegmackie mentioned this pull request Jun 3, 2026
4 tasks
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Jun 3, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

? { message: "Grok Build ACP model discovery returned no built-in models." }
: {}),
},
});

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.

Grok probe ignores models list

Medium Severity

checkGrokBuildProviderStatus discovers models only from ACP configOptions, but Grok Build can expose models via a models session payload without config options. In that case discovery returns no models and the probe warns even though in-session session/set_model works.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

},
});
return yield* Effect.failCause(promptExit.cause);
}

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.

No terminal turn after stop

Medium Severity

sendTurn emits turn.started then runs session/prompt outside the per-thread lock. If the session is stopped while the prompt is in flight, the finalize step finds no session and returns without emitting turn.completed, leaving the thread stuck in a started turn.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new Grok Build provider integration with ~2500 lines of new code spanning driver, adapter, text generation, settings, and UI layers. New feature additions of this scope require human review, and two unresolved comments identify potential bugs in model discovery and turn state handling.

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

@gmackie
gmackie marked this pull request as draft June 3, 2026 19:41
stopped: false,
};

const nf = yield* Stream.runDrain(

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/AcpProviderAdapter.ts:834

When a single event fails to process (e.g., makeEventStamp() throws), the Effect.catch at line 919-924 catches the error and terminates the entire notificationFiber. The session continues running but silently stops emitting all runtime events because the stream is drained. The catch should wrap individual event processing inside mapEffect so one bad event doesn't kill the whole stream.

🤖 Copy this AI Prompt to have your agent fix this:
In file apps/server/src/provider/Layers/AcpProviderAdapter.ts around line 834:
When a single event fails to process (e.g., `makeEventStamp()` throws), the `Effect.catch` at line 919-924 catches the error and terminates the entire `notificationFiber`. The session continues running but silently stops emitting all runtime events because the stream is drained. The `catch` should wrap individual event processing inside `mapEffect` so one bad event doesn't kill the whole stream.
Evidence trail:
apps/server/src/provider/Layers/AcpProviderAdapter.ts lines 834-928: Stream.runDrain wraps entire stream, Effect.catch at lines 919-924 catches runDrain failure, Effect.forkChild at line 925 forks it as child fiber, fiber stored at line 928. makeEventStamp defined at line 390 as an Effect that could fail. Session stored at line 929 and continues running after fiber completes.

@gmackiegmackie closed this Jun 6, 2026
@DerpedyeaDerpedyea mentioned this pull request Jul 1, 2026
4 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ 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.

1 participant

@gmackie
, '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: add Grok Build provider via shared ACP adapter - #2932

Closed
gmackie wants to merge 2 commits into
pingdotgg:mainfrom
gmackie:grok-build-provider
Closed

feat: add Grok Build provider via shared ACP adapter#2932
gmackie wants to merge 2 commits into
pingdotgg:mainfrom
gmackie:grok-build-provider

Conversation

@gmackie

@gmackiegmackie commented Jun 3, 2026

Copy link
Copy Markdown

Context

This draft PR is a supporting/reference implementation for #2809 and the review concerns raised there. The goal is to help get Grok Build support landed in T3 Code with the ACP lifecycle issues addressed in a shared adapter; maintainers or the #2809 author should feel free to use, cherry-pick, supersede, or close this if it creates review noise.

Summary

  • Adds Grok Build as a provider using grok --agent build agent stdio, with settings, model selection, x.ai branding, web UI, and mobile provider icon support.
  • Extracts Cursor's ACP lifecycle into a shared makeAcpProviderAdapter(...) so Cursor and Grok Build share turn dispatch, resume, interrupt, and approval handling.
  • Keeps T3 Code responsible for worktree ownership by launching Grok in the resolved thread cwd and intentionally not passing Grok's --worktree flag.

ACP lifecycle hardening

  • Rejects overlapping turns for the same ACP thread/session while leaving session/prompt outside the per-thread lock so approval/cancel flows do not deadlock.
  • Ensures a prompt failure after turn.started emits a terminal failed turn.completed event before surfacing the original failure.
  • Coordinates interruptTurn with the same per-thread state lock used by send/stop.
  • Adds auth-method fallback and session/set_model fallback when an ACP server exposes models but no config option.

Test plan

  • bun fmt
  • bun lint (9 warnings, 0 errors)
  • bun typecheck (14/14 packages)
  • bun run --cwd apps/server test src/provider/acp/AcpJsonRpcConnection.test.ts src/provider/acp/GrokAcpSupport.test.ts src/provider/Layers/ProviderInstanceRegistryLive.test.ts src/provider/Layers/CursorAdapter.test.ts src/provider/Layers/GrokBuildProvider.test.ts
  • bun run --cwd apps/web test src/components/chat/providerIconUtils.test.ts src/components/settings/providerDriverMeta.test.ts src/components/settings/ProviderSettingsForm.test.ts
  • bun run --cwd packages/contracts test src/settings.test.ts

Open in Devin Review

Note

Medium Risk
Large refactor of Cursor’s ACP session/turn path affects all ACP providers; new external CLI dependency and child-process auth/model discovery add operational failure modes.

Overview
Adds Grok Build as a first-class provider (grokBuild) wired through contracts, server driver/registry, ACP runtime, structured text generation, and web/mobile picker/settings with x.ai branding.

Server: New GrokBuildDriver spawns grok --agent build agent stdio, probes health/models via ACP, and reuses Cursor-style model discovery. Cursor’s large ACP adapter implementation moves into shared makeAcpProviderAdapter; Cursor and Grok thin-wrap it. ACP hardening for all consumers: per-thread turn exclusivity (prompt runs outside the lock), failed turn.completed after prompt errors, session/set_model when sessions expose models without config options, and auth-method fallback from initialize.

Clients:GrokBuildSettings (default off), model defaults, composer draft keys, provider icons, and registry tests include the fifth driver.

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

Note

Add Grok Build as a new provider via shared ACP adapter

  • Introduces the grokBuild provider driver in GrokBuildDriver.ts, registered in the built-in driver registry alongside Cursor and OpenCode.
  • Adds GrokBuildAdapter.ts and GrokAcpSupport.ts to wire the grok CLI binary via ACP stdio with grok_login auth.
  • Refactors CursorAdapter to delegate to a new shared makeAcpProviderAdapter in AcpProviderAdapter.ts, which GrokBuildAdapter also uses.
  • Adds GrokBuildTextGeneration.ts for commit messages, PR content, branch names, and thread titles with a 180s timeout and structured JSON parsing.
  • Extends contracts, web UI, and mobile to register grokBuild with display name 'Grok Build', a new XAI icon, and an 'Early Access' badge.
  • AcpSessionRuntime.setModel now issues a session/set_model RPC when the session exposes models without a config option, rather than always writing a config option.
📊 Macroscope summarized 8ae98ac. 2 files reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

coderabbitaiBot commented Jun 3, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 7b8e0414-de95-43a1-bf94-1c60ad94f80f

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

Use the checkbox below for a quick retry:

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

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

❤️ Share

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

@gmackiegmackie mentioned this pull request Jun 3, 2026
4 tasks
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Jun 3, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

? { message: "Grok Build ACP model discovery returned no built-in models." }
: {}),
},
});

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.

Grok probe ignores models list

Medium Severity

checkGrokBuildProviderStatus discovers models only from ACP configOptions, but Grok Build can expose models via a models session payload without config options. In that case discovery returns no models and the probe warns even though in-session session/set_model works.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

},
});
return yield* Effect.failCause(promptExit.cause);
}

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.

No terminal turn after stop

Medium Severity

sendTurn emits turn.started then runs session/prompt outside the per-thread lock. If the session is stopped while the prompt is in flight, the finalize step finds no session and returns without emitting turn.completed, leaving the thread stuck in a started turn.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new Grok Build provider integration with ~2500 lines of new code spanning driver, adapter, text generation, settings, and UI layers. New feature additions of this scope require human review, and two unresolved comments identify potential bugs in model discovery and turn state handling.

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

@gmackie
gmackie marked this pull request as draft June 3, 2026 19:41
stopped: false,
};

const nf = yield* Stream.runDrain(

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/AcpProviderAdapter.ts:834

When a single event fails to process (e.g., makeEventStamp() throws), the Effect.catch at line 919-924 catches the error and terminates the entire notificationFiber. The session continues running but silently stops emitting all runtime events because the stream is drained. The catch should wrap individual event processing inside mapEffect so one bad event doesn't kill the whole stream.

🤖 Copy this AI Prompt to have your agent fix this:
In file apps/server/src/provider/Layers/AcpProviderAdapter.ts around line 834:
When a single event fails to process (e.g., `makeEventStamp()` throws), the `Effect.catch` at line 919-924 catches the error and terminates the entire `notificationFiber`. The session continues running but silently stops emitting all runtime events because the stream is drained. The `catch` should wrap individual event processing inside `mapEffect` so one bad event doesn't kill the whole stream.
Evidence trail:
apps/server/src/provider/Layers/AcpProviderAdapter.ts lines 834-928: Stream.runDrain wraps entire stream, Effect.catch at lines 919-924 catches runDrain failure, Effect.forkChild at line 925 forks it as child fiber, fiber stored at line 928. makeEventStamp defined at line 390 as an Effect that could fail. Session stored at line 929 and continues running after fiber completes.

@gmackiegmackie closed this Jun 6, 2026
@DerpedyeaDerpedyea mentioned this pull request Jul 1, 2026
4 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ 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.

1 participant

@gmackie
, '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: add Grok Build provider via shared ACP adapter - #2932

Closed
gmackie wants to merge 2 commits into
pingdotgg:mainfrom
gmackie:grok-build-provider
Closed

feat: add Grok Build provider via shared ACP adapter#2932
gmackie wants to merge 2 commits into
pingdotgg:mainfrom
gmackie:grok-build-provider

Conversation

@gmackie

@gmackiegmackie commented Jun 3, 2026

Copy link
Copy Markdown

Context

This draft PR is a supporting/reference implementation for #2809 and the review concerns raised there. The goal is to help get Grok Build support landed in T3 Code with the ACP lifecycle issues addressed in a shared adapter; maintainers or the #2809 author should feel free to use, cherry-pick, supersede, or close this if it creates review noise.

Summary

  • Adds Grok Build as a provider using grok --agent build agent stdio, with settings, model selection, x.ai branding, web UI, and mobile provider icon support.
  • Extracts Cursor's ACP lifecycle into a shared makeAcpProviderAdapter(...) so Cursor and Grok Build share turn dispatch, resume, interrupt, and approval handling.
  • Keeps T3 Code responsible for worktree ownership by launching Grok in the resolved thread cwd and intentionally not passing Grok's --worktree flag.

ACP lifecycle hardening

  • Rejects overlapping turns for the same ACP thread/session while leaving session/prompt outside the per-thread lock so approval/cancel flows do not deadlock.
  • Ensures a prompt failure after turn.started emits a terminal failed turn.completed event before surfacing the original failure.
  • Coordinates interruptTurn with the same per-thread state lock used by send/stop.
  • Adds auth-method fallback and session/set_model fallback when an ACP server exposes models but no config option.

Test plan

  • bun fmt
  • bun lint (9 warnings, 0 errors)
  • bun typecheck (14/14 packages)
  • bun run --cwd apps/server test src/provider/acp/AcpJsonRpcConnection.test.ts src/provider/acp/GrokAcpSupport.test.ts src/provider/Layers/ProviderInstanceRegistryLive.test.ts src/provider/Layers/CursorAdapter.test.ts src/provider/Layers/GrokBuildProvider.test.ts
  • bun run --cwd apps/web test src/components/chat/providerIconUtils.test.ts src/components/settings/providerDriverMeta.test.ts src/components/settings/ProviderSettingsForm.test.ts
  • bun run --cwd packages/contracts test src/settings.test.ts

Open in Devin Review

Note

Medium Risk
Large refactor of Cursor’s ACP session/turn path affects all ACP providers; new external CLI dependency and child-process auth/model discovery add operational failure modes.

Overview
Adds Grok Build as a first-class provider (grokBuild) wired through contracts, server driver/registry, ACP runtime, structured text generation, and web/mobile picker/settings with x.ai branding.

Server: New GrokBuildDriver spawns grok --agent build agent stdio, probes health/models via ACP, and reuses Cursor-style model discovery. Cursor’s large ACP adapter implementation moves into shared makeAcpProviderAdapter; Cursor and Grok thin-wrap it. ACP hardening for all consumers: per-thread turn exclusivity (prompt runs outside the lock), failed turn.completed after prompt errors, session/set_model when sessions expose models without config options, and auth-method fallback from initialize.

Clients:GrokBuildSettings (default off), model defaults, composer draft keys, provider icons, and registry tests include the fifth driver.

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

Note

Add Grok Build as a new provider via shared ACP adapter

  • Introduces the grokBuild provider driver in GrokBuildDriver.ts, registered in the built-in driver registry alongside Cursor and OpenCode.
  • Adds GrokBuildAdapter.ts and GrokAcpSupport.ts to wire the grok CLI binary via ACP stdio with grok_login auth.
  • Refactors CursorAdapter to delegate to a new shared makeAcpProviderAdapter in AcpProviderAdapter.ts, which GrokBuildAdapter also uses.
  • Adds GrokBuildTextGeneration.ts for commit messages, PR content, branch names, and thread titles with a 180s timeout and structured JSON parsing.
  • Extends contracts, web UI, and mobile to register grokBuild with display name 'Grok Build', a new XAI icon, and an 'Early Access' badge.
  • AcpSessionRuntime.setModel now issues a session/set_model RPC when the session exposes models without a config option, rather than always writing a config option.
📊 Macroscope summarized 8ae98ac. 2 files reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

coderabbitaiBot commented Jun 3, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 7b8e0414-de95-43a1-bf94-1c60ad94f80f

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

Use the checkbox below for a quick retry:

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

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

❤️ Share

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

@gmackiegmackie mentioned this pull request Jun 3, 2026
4 tasks
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Jun 3, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

? { message: "Grok Build ACP model discovery returned no built-in models." }
: {}),
},
});

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.

Grok probe ignores models list

Medium Severity

checkGrokBuildProviderStatus discovers models only from ACP configOptions, but Grok Build can expose models via a models session payload without config options. In that case discovery returns no models and the probe warns even though in-session session/set_model works.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

},
});
return yield* Effect.failCause(promptExit.cause);
}

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.

No terminal turn after stop

Medium Severity

sendTurn emits turn.started then runs session/prompt outside the per-thread lock. If the session is stopped while the prompt is in flight, the finalize step finds no session and returns without emitting turn.completed, leaving the thread stuck in a started turn.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new Grok Build provider integration with ~2500 lines of new code spanning driver, adapter, text generation, settings, and UI layers. New feature additions of this scope require human review, and two unresolved comments identify potential bugs in model discovery and turn state handling.

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

@gmackie
gmackie marked this pull request as draft June 3, 2026 19:41
stopped: false,
};

const nf = yield* Stream.runDrain(

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/AcpProviderAdapter.ts:834

When a single event fails to process (e.g., makeEventStamp() throws), the Effect.catch at line 919-924 catches the error and terminates the entire notificationFiber. The session continues running but silently stops emitting all runtime events because the stream is drained. The catch should wrap individual event processing inside mapEffect so one bad event doesn't kill the whole stream.

🤖 Copy this AI Prompt to have your agent fix this:
In file apps/server/src/provider/Layers/AcpProviderAdapter.ts around line 834:
When a single event fails to process (e.g., `makeEventStamp()` throws), the `Effect.catch` at line 919-924 catches the error and terminates the entire `notificationFiber`. The session continues running but silently stops emitting all runtime events because the stream is drained. The `catch` should wrap individual event processing inside `mapEffect` so one bad event doesn't kill the whole stream.
Evidence trail:
apps/server/src/provider/Layers/AcpProviderAdapter.ts lines 834-928: Stream.runDrain wraps entire stream, Effect.catch at lines 919-924 catches runDrain failure, Effect.forkChild at line 925 forks it as child fiber, fiber stored at line 928. makeEventStamp defined at line 390 as an Effect that could fail. Session stored at line 929 and continues running after fiber completes.

@gmackiegmackie closed this Jun 6, 2026
@DerpedyeaDerpedyea mentioned this pull request Jul 1, 2026
4 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ 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.

1 participant

@gmackie
, '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: add Grok Build provider via shared ACP adapter - #2932

Closed
gmackie wants to merge 2 commits into
pingdotgg:mainfrom
gmackie:grok-build-provider
Closed

feat: add Grok Build provider via shared ACP adapter#2932
gmackie wants to merge 2 commits into
pingdotgg:mainfrom
gmackie:grok-build-provider

Conversation

@gmackie

@gmackiegmackie commented Jun 3, 2026

Copy link
Copy Markdown

Context

This draft PR is a supporting/reference implementation for #2809 and the review concerns raised there. The goal is to help get Grok Build support landed in T3 Code with the ACP lifecycle issues addressed in a shared adapter; maintainers or the #2809 author should feel free to use, cherry-pick, supersede, or close this if it creates review noise.

Summary

  • Adds Grok Build as a provider using grok --agent build agent stdio, with settings, model selection, x.ai branding, web UI, and mobile provider icon support.
  • Extracts Cursor's ACP lifecycle into a shared makeAcpProviderAdapter(...) so Cursor and Grok Build share turn dispatch, resume, interrupt, and approval handling.
  • Keeps T3 Code responsible for worktree ownership by launching Grok in the resolved thread cwd and intentionally not passing Grok's --worktree flag.

ACP lifecycle hardening

  • Rejects overlapping turns for the same ACP thread/session while leaving session/prompt outside the per-thread lock so approval/cancel flows do not deadlock.
  • Ensures a prompt failure after turn.started emits a terminal failed turn.completed event before surfacing the original failure.
  • Coordinates interruptTurn with the same per-thread state lock used by send/stop.
  • Adds auth-method fallback and session/set_model fallback when an ACP server exposes models but no config option.

Test plan

  • bun fmt
  • bun lint (9 warnings, 0 errors)
  • bun typecheck (14/14 packages)
  • bun run --cwd apps/server test src/provider/acp/AcpJsonRpcConnection.test.ts src/provider/acp/GrokAcpSupport.test.ts src/provider/Layers/ProviderInstanceRegistryLive.test.ts src/provider/Layers/CursorAdapter.test.ts src/provider/Layers/GrokBuildProvider.test.ts
  • bun run --cwd apps/web test src/components/chat/providerIconUtils.test.ts src/components/settings/providerDriverMeta.test.ts src/components/settings/ProviderSettingsForm.test.ts
  • bun run --cwd packages/contracts test src/settings.test.ts

Open in Devin Review

Note

Medium Risk
Large refactor of Cursor’s ACP session/turn path affects all ACP providers; new external CLI dependency and child-process auth/model discovery add operational failure modes.

Overview
Adds Grok Build as a first-class provider (grokBuild) wired through contracts, server driver/registry, ACP runtime, structured text generation, and web/mobile picker/settings with x.ai branding.

Server: New GrokBuildDriver spawns grok --agent build agent stdio, probes health/models via ACP, and reuses Cursor-style model discovery. Cursor’s large ACP adapter implementation moves into shared makeAcpProviderAdapter; Cursor and Grok thin-wrap it. ACP hardening for all consumers: per-thread turn exclusivity (prompt runs outside the lock), failed turn.completed after prompt errors, session/set_model when sessions expose models without config options, and auth-method fallback from initialize.

Clients:GrokBuildSettings (default off), model defaults, composer draft keys, provider icons, and registry tests include the fifth driver.

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

Note

Add Grok Build as a new provider via shared ACP adapter

  • Introduces the grokBuild provider driver in GrokBuildDriver.ts, registered in the built-in driver registry alongside Cursor and OpenCode.
  • Adds GrokBuildAdapter.ts and GrokAcpSupport.ts to wire the grok CLI binary via ACP stdio with grok_login auth.
  • Refactors CursorAdapter to delegate to a new shared makeAcpProviderAdapter in AcpProviderAdapter.ts, which GrokBuildAdapter also uses.
  • Adds GrokBuildTextGeneration.ts for commit messages, PR content, branch names, and thread titles with a 180s timeout and structured JSON parsing.
  • Extends contracts, web UI, and mobile to register grokBuild with display name 'Grok Build', a new XAI icon, and an 'Early Access' badge.
  • AcpSessionRuntime.setModel now issues a session/set_model RPC when the session exposes models without a config option, rather than always writing a config option.
📊 Macroscope summarized 8ae98ac. 2 files reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

coderabbitaiBot commented Jun 3, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 7b8e0414-de95-43a1-bf94-1c60ad94f80f

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

Use the checkbox below for a quick retry:

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

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

❤️ Share

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

@gmackiegmackie mentioned this pull request Jun 3, 2026
4 tasks
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Jun 3, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

? { message: "Grok Build ACP model discovery returned no built-in models." }
: {}),
},
});

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.

Grok probe ignores models list

Medium Severity

checkGrokBuildProviderStatus discovers models only from ACP configOptions, but Grok Build can expose models via a models session payload without config options. In that case discovery returns no models and the probe warns even though in-session session/set_model works.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

},
});
return yield* Effect.failCause(promptExit.cause);
}

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.

No terminal turn after stop

Medium Severity

sendTurn emits turn.started then runs session/prompt outside the per-thread lock. If the session is stopped while the prompt is in flight, the finalize step finds no session and returns without emitting turn.completed, leaving the thread stuck in a started turn.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new Grok Build provider integration with ~2500 lines of new code spanning driver, adapter, text generation, settings, and UI layers. New feature additions of this scope require human review, and two unresolved comments identify potential bugs in model discovery and turn state handling.

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

@gmackie
gmackie marked this pull request as draft June 3, 2026 19:41
stopped: false,
};

const nf = yield* Stream.runDrain(

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/AcpProviderAdapter.ts:834

When a single event fails to process (e.g., makeEventStamp() throws), the Effect.catch at line 919-924 catches the error and terminates the entire notificationFiber. The session continues running but silently stops emitting all runtime events because the stream is drained. The catch should wrap individual event processing inside mapEffect so one bad event doesn't kill the whole stream.

🤖 Copy this AI Prompt to have your agent fix this:
In file apps/server/src/provider/Layers/AcpProviderAdapter.ts around line 834:
When a single event fails to process (e.g., `makeEventStamp()` throws), the `Effect.catch` at line 919-924 catches the error and terminates the entire `notificationFiber`. The session continues running but silently stops emitting all runtime events because the stream is drained. The `catch` should wrap individual event processing inside `mapEffect` so one bad event doesn't kill the whole stream.
Evidence trail:
apps/server/src/provider/Layers/AcpProviderAdapter.ts lines 834-928: Stream.runDrain wraps entire stream, Effect.catch at lines 919-924 catches runDrain failure, Effect.forkChild at line 925 forks it as child fiber, fiber stored at line 928. makeEventStamp defined at line 390 as an Effect that could fail. Session stored at line 929 and continues running after fiber completes.

@gmackiegmackie closed this Jun 6, 2026
@DerpedyeaDerpedyea mentioned this pull request Jul 1, 2026
4 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ 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.

1 participant

@gmackie
, '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: add Grok Build provider via shared ACP adapter - #2932

Closed
gmackie wants to merge 2 commits into
pingdotgg:mainfrom
gmackie:grok-build-provider
Closed

feat: add Grok Build provider via shared ACP adapter#2932
gmackie wants to merge 2 commits into
pingdotgg:mainfrom
gmackie:grok-build-provider

Conversation

@gmackie

@gmackiegmackie commented Jun 3, 2026

Copy link
Copy Markdown

Context

This draft PR is a supporting/reference implementation for #2809 and the review concerns raised there. The goal is to help get Grok Build support landed in T3 Code with the ACP lifecycle issues addressed in a shared adapter; maintainers or the #2809 author should feel free to use, cherry-pick, supersede, or close this if it creates review noise.

Summary

  • Adds Grok Build as a provider using grok --agent build agent stdio, with settings, model selection, x.ai branding, web UI, and mobile provider icon support.
  • Extracts Cursor's ACP lifecycle into a shared makeAcpProviderAdapter(...) so Cursor and Grok Build share turn dispatch, resume, interrupt, and approval handling.
  • Keeps T3 Code responsible for worktree ownership by launching Grok in the resolved thread cwd and intentionally not passing Grok's --worktree flag.

ACP lifecycle hardening

  • Rejects overlapping turns for the same ACP thread/session while leaving session/prompt outside the per-thread lock so approval/cancel flows do not deadlock.
  • Ensures a prompt failure after turn.started emits a terminal failed turn.completed event before surfacing the original failure.
  • Coordinates interruptTurn with the same per-thread state lock used by send/stop.
  • Adds auth-method fallback and session/set_model fallback when an ACP server exposes models but no config option.

Test plan

  • bun fmt
  • bun lint (9 warnings, 0 errors)
  • bun typecheck (14/14 packages)
  • bun run --cwd apps/server test src/provider/acp/AcpJsonRpcConnection.test.ts src/provider/acp/GrokAcpSupport.test.ts src/provider/Layers/ProviderInstanceRegistryLive.test.ts src/provider/Layers/CursorAdapter.test.ts src/provider/Layers/GrokBuildProvider.test.ts
  • bun run --cwd apps/web test src/components/chat/providerIconUtils.test.ts src/components/settings/providerDriverMeta.test.ts src/components/settings/ProviderSettingsForm.test.ts
  • bun run --cwd packages/contracts test src/settings.test.ts

Open in Devin Review

Note

Medium Risk
Large refactor of Cursor’s ACP session/turn path affects all ACP providers; new external CLI dependency and child-process auth/model discovery add operational failure modes.

Overview
Adds Grok Build as a first-class provider (grokBuild) wired through contracts, server driver/registry, ACP runtime, structured text generation, and web/mobile picker/settings with x.ai branding.

Server: New GrokBuildDriver spawns grok --agent build agent stdio, probes health/models via ACP, and reuses Cursor-style model discovery. Cursor’s large ACP adapter implementation moves into shared makeAcpProviderAdapter; Cursor and Grok thin-wrap it. ACP hardening for all consumers: per-thread turn exclusivity (prompt runs outside the lock), failed turn.completed after prompt errors, session/set_model when sessions expose models without config options, and auth-method fallback from initialize.

Clients:GrokBuildSettings (default off), model defaults, composer draft keys, provider icons, and registry tests include the fifth driver.

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

Note

Add Grok Build as a new provider via shared ACP adapter

  • Introduces the grokBuild provider driver in GrokBuildDriver.ts, registered in the built-in driver registry alongside Cursor and OpenCode.
  • Adds GrokBuildAdapter.ts and GrokAcpSupport.ts to wire the grok CLI binary via ACP stdio with grok_login auth.
  • Refactors CursorAdapter to delegate to a new shared makeAcpProviderAdapter in AcpProviderAdapter.ts, which GrokBuildAdapter also uses.
  • Adds GrokBuildTextGeneration.ts for commit messages, PR content, branch names, and thread titles with a 180s timeout and structured JSON parsing.
  • Extends contracts, web UI, and mobile to register grokBuild with display name 'Grok Build', a new XAI icon, and an 'Early Access' badge.
  • AcpSessionRuntime.setModel now issues a session/set_model RPC when the session exposes models without a config option, rather than always writing a config option.
📊 Macroscope summarized 8ae98ac. 2 files reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

coderabbitaiBot commented Jun 3, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 7b8e0414-de95-43a1-bf94-1c60ad94f80f

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

Use the checkbox below for a quick retry:

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

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

❤️ Share

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

@gmackiegmackie mentioned this pull request Jun 3, 2026
4 tasks
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Jun 3, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

? { message: "Grok Build ACP model discovery returned no built-in models." }
: {}),
},
});

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.

Grok probe ignores models list

Medium Severity

checkGrokBuildProviderStatus discovers models only from ACP configOptions, but Grok Build can expose models via a models session payload without config options. In that case discovery returns no models and the probe warns even though in-session session/set_model works.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

},
});
return yield* Effect.failCause(promptExit.cause);
}

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.

No terminal turn after stop

Medium Severity

sendTurn emits turn.started then runs session/prompt outside the per-thread lock. If the session is stopped while the prompt is in flight, the finalize step finds no session and returns without emitting turn.completed, leaving the thread stuck in a started turn.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new Grok Build provider integration with ~2500 lines of new code spanning driver, adapter, text generation, settings, and UI layers. New feature additions of this scope require human review, and two unresolved comments identify potential bugs in model discovery and turn state handling.

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

@gmackie
gmackie marked this pull request as draft June 3, 2026 19:41
stopped: false,
};

const nf = yield* Stream.runDrain(

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/AcpProviderAdapter.ts:834

When a single event fails to process (e.g., makeEventStamp() throws), the Effect.catch at line 919-924 catches the error and terminates the entire notificationFiber. The session continues running but silently stops emitting all runtime events because the stream is drained. The catch should wrap individual event processing inside mapEffect so one bad event doesn't kill the whole stream.

🤖 Copy this AI Prompt to have your agent fix this:
In file apps/server/src/provider/Layers/AcpProviderAdapter.ts around line 834:
When a single event fails to process (e.g., `makeEventStamp()` throws), the `Effect.catch` at line 919-924 catches the error and terminates the entire `notificationFiber`. The session continues running but silently stops emitting all runtime events because the stream is drained. The `catch` should wrap individual event processing inside `mapEffect` so one bad event doesn't kill the whole stream.
Evidence trail:
apps/server/src/provider/Layers/AcpProviderAdapter.ts lines 834-928: Stream.runDrain wraps entire stream, Effect.catch at lines 919-924 catches runDrain failure, Effect.forkChild at line 925 forks it as child fiber, fiber stored at line 928. makeEventStamp defined at line 390 as an Effect that could fail. Session stored at line 929 and continues running after fiber completes.

@gmackiegmackie closed this Jun 6, 2026
@DerpedyeaDerpedyea mentioned this pull request Jul 1, 2026
4 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ 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.

1 participant

@gmackie
, '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: add Grok Build provider via shared ACP adapter - #2932

Closed
gmackie wants to merge 2 commits into
pingdotgg:mainfrom
gmackie:grok-build-provider
Closed

feat: add Grok Build provider via shared ACP adapter#2932
gmackie wants to merge 2 commits into
pingdotgg:mainfrom
gmackie:grok-build-provider

Conversation

@gmackie

@gmackiegmackie commented Jun 3, 2026

Copy link
Copy Markdown

Context

This draft PR is a supporting/reference implementation for #2809 and the review concerns raised there. The goal is to help get Grok Build support landed in T3 Code with the ACP lifecycle issues addressed in a shared adapter; maintainers or the #2809 author should feel free to use, cherry-pick, supersede, or close this if it creates review noise.

Summary

  • Adds Grok Build as a provider using grok --agent build agent stdio, with settings, model selection, x.ai branding, web UI, and mobile provider icon support.
  • Extracts Cursor's ACP lifecycle into a shared makeAcpProviderAdapter(...) so Cursor and Grok Build share turn dispatch, resume, interrupt, and approval handling.
  • Keeps T3 Code responsible for worktree ownership by launching Grok in the resolved thread cwd and intentionally not passing Grok's --worktree flag.

ACP lifecycle hardening

  • Rejects overlapping turns for the same ACP thread/session while leaving session/prompt outside the per-thread lock so approval/cancel flows do not deadlock.
  • Ensures a prompt failure after turn.started emits a terminal failed turn.completed event before surfacing the original failure.
  • Coordinates interruptTurn with the same per-thread state lock used by send/stop.
  • Adds auth-method fallback and session/set_model fallback when an ACP server exposes models but no config option.

Test plan

  • bun fmt
  • bun lint (9 warnings, 0 errors)
  • bun typecheck (14/14 packages)
  • bun run --cwd apps/server test src/provider/acp/AcpJsonRpcConnection.test.ts src/provider/acp/GrokAcpSupport.test.ts src/provider/Layers/ProviderInstanceRegistryLive.test.ts src/provider/Layers/CursorAdapter.test.ts src/provider/Layers/GrokBuildProvider.test.ts
  • bun run --cwd apps/web test src/components/chat/providerIconUtils.test.ts src/components/settings/providerDriverMeta.test.ts src/components/settings/ProviderSettingsForm.test.ts
  • bun run --cwd packages/contracts test src/settings.test.ts

Open in Devin Review

Note

Medium Risk
Large refactor of Cursor’s ACP session/turn path affects all ACP providers; new external CLI dependency and child-process auth/model discovery add operational failure modes.

Overview
Adds Grok Build as a first-class provider (grokBuild) wired through contracts, server driver/registry, ACP runtime, structured text generation, and web/mobile picker/settings with x.ai branding.

Server: New GrokBuildDriver spawns grok --agent build agent stdio, probes health/models via ACP, and reuses Cursor-style model discovery. Cursor’s large ACP adapter implementation moves into shared makeAcpProviderAdapter; Cursor and Grok thin-wrap it. ACP hardening for all consumers: per-thread turn exclusivity (prompt runs outside the lock), failed turn.completed after prompt errors, session/set_model when sessions expose models without config options, and auth-method fallback from initialize.

Clients:GrokBuildSettings (default off), model defaults, composer draft keys, provider icons, and registry tests include the fifth driver.

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

Note

Add Grok Build as a new provider via shared ACP adapter

  • Introduces the grokBuild provider driver in GrokBuildDriver.ts, registered in the built-in driver registry alongside Cursor and OpenCode.
  • Adds GrokBuildAdapter.ts and GrokAcpSupport.ts to wire the grok CLI binary via ACP stdio with grok_login auth.
  • Refactors CursorAdapter to delegate to a new shared makeAcpProviderAdapter in AcpProviderAdapter.ts, which GrokBuildAdapter also uses.
  • Adds GrokBuildTextGeneration.ts for commit messages, PR content, branch names, and thread titles with a 180s timeout and structured JSON parsing.
  • Extends contracts, web UI, and mobile to register grokBuild with display name 'Grok Build', a new XAI icon, and an 'Early Access' badge.
  • AcpSessionRuntime.setModel now issues a session/set_model RPC when the session exposes models without a config option, rather than always writing a config option.
📊 Macroscope summarized 8ae98ac. 2 files reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

coderabbitaiBot commented Jun 3, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 7b8e0414-de95-43a1-bf94-1c60ad94f80f

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

Use the checkbox below for a quick retry:

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

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

❤️ Share

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

@gmackiegmackie mentioned this pull request Jun 3, 2026
4 tasks
@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Jun 3, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

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

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

? { message: "Grok Build ACP model discovery returned no built-in models." }
: {}),
},
});

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.

Grok probe ignores models list

Medium Severity

checkGrokBuildProviderStatus discovers models only from ACP configOptions, but Grok Build can expose models via a models session payload without config options. In that case discovery returns no models and the probe warns even though in-session session/set_model works.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

},
});
return yield* Effect.failCause(promptExit.cause);
}

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.

No terminal turn after stop

Medium Severity

sendTurn emits turn.started then runs session/prompt outside the per-thread lock. If the session is stopped while the prompt is in flight, the finalize step finds no session and returns without emitting turn.completed, leaving the thread stuck in a started turn.

Fix in CursorFix in Web

Reviewed by Cursor Bugbot for commit d4e5db1. Configure here.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new Grok Build provider integration with ~2500 lines of new code spanning driver, adapter, text generation, settings, and UI layers. New feature additions of this scope require human review, and two unresolved comments identify potential bugs in model discovery and turn state handling.

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

@gmackie
gmackie marked this pull request as draft June 3, 2026 19:41
stopped: false,
};

const nf = yield* Stream.runDrain(

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/AcpProviderAdapter.ts:834

When a single event fails to process (e.g., makeEventStamp() throws), the Effect.catch at line 919-924 catches the error and terminates the entire notificationFiber. The session continues running but silently stops emitting all runtime events because the stream is drained. The catch should wrap individual event processing inside mapEffect so one bad event doesn't kill the whole stream.

🤖 Copy this AI Prompt to have your agent fix this:
In file apps/server/src/provider/Layers/AcpProviderAdapter.ts around line 834:
When a single event fails to process (e.g., `makeEventStamp()` throws), the `Effect.catch` at line 919-924 catches the error and terminates the entire `notificationFiber`. The session continues running but silently stops emitting all runtime events because the stream is drained. The `catch` should wrap individual event processing inside `mapEffect` so one bad event doesn't kill the whole stream.
Evidence trail:
apps/server/src/provider/Layers/AcpProviderAdapter.ts lines 834-928: Stream.runDrain wraps entire stream, Effect.catch at lines 919-924 catches runDrain failure, Effect.forkChild at line 925 forks it as child fiber, fiber stored at line 928. makeEventStamp defined at line 390 as an Effect that could fail. Session stored at line 929 and continues running after fiber completes.

@gmackiegmackie closed this Jun 6, 2026
@DerpedyeaDerpedyea mentioned this pull request Jul 1, 2026
4 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ 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.

1 participant

@gmackie