feat(web): sticky provider options and Grok composer affordances - #5426

Closed
EnzoTironi wants to merge 3 commits into
pingdotgg:mainfrom
EnzoTironi:pr/web-sticky-options
Closed

feat(web): sticky provider options and Grok composer affordances#5426
EnzoTironi wants to merge 3 commits into
pingdotgg:mainfrom
EnzoTironi:pr/web-sticky-options

Conversation

@EnzoTironi

@EnzoTironiEnzoTironi commented Aug 5, 2026

Copy link
Copy Markdown

What Changed

  • Sticky composer options fall back when the per-thread draft has no options, so picker changes (e.g. Grok effort) reach sendTurn on existing threads
  • Sticky does not override the thread/project model slug
  • Sticky options re-keyed under the selected instance id (custom instances work)
  • Gate built-in /plan/default slash items on showInteractionModeToggle
  • Remove Grok "Early Access" badge

Fixes#5421

Why

Without sticky option fallback, changing effort on an existing thread kept stale thread-turn options. Folding sticky into selectedModel would silently switch models — fixed so sticky is options-only.

UI Changes

Grok Early Access badge removed

Before (badge present):

Before: Grok shows Early Access badge

After (badge removed; Cursor still has Early Access):

After: Grok has no Early Access badge

Composer effort control (sticky options apply to this picker)

Grok 4.5 Reasoning effort menu

Sticky is send-payload behavior (no new components). /plan slash only when the provider exposes plan mode.

Checklist

  • This PR is small and focused (~+237 / 4 files)
  • I explained what changed and why
  • Before/after screenshots for badge removal
  • Effort picker screenshot (sticky option surface)
  • Video N/A

Test plan

  • composerDraftStore unit tests (sticky options, model preserve, instance re-key)

Model: grok-4.5 (Grok Build)


Note

Medium Risk
Changes send-time model option resolution across threads and custom provider instances; wrong precedence could ship stale or cross-provider options, though behavior is heavily unit-tested.

Overview
Sticky composer options now feed deriveEffectiveComposerModelState when the per-thread draft has no options for the selected instance, so picker changes (e.g. Grok reasoning effort) apply on existing threads without overriding the thread/project model slug. Resolution is instance-scoped: options from other instances or kind-keyed legacy drafts no longer block sticky, and sticky options are re-keyed under the active custom instance id.

Grok is included in setProviderModelOptions draft persistence, the Grok Early Access badge is removed in settings metadata, and built-in /plan / /default slash menu items only appear when showInteractionModeToggle is true (hiding no-ops on providers like OpenCode).

Unit tests cover sticky vs draft/thread precedence and Grok sticky persistence.

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

Note

Add sticky provider options and Grok composer affordances in the chat composer

  • deriveEffectiveComposerModelState now accepts stickyModelSelectionByProvider and uses it as a fallback when the draft lacks options for the selected provider instance, without affecting model slug resolution.
  • Option lookups are scoped to the selected provider instance via a new optionsForInstance helper, replacing the broader modelSelectionByProviderToOptions.
  • Grok is added to the providers whose options are persisted in setProviderModelOptions, matching the behavior of codex, claudeAgent, cursor, and opencode.
  • /plan and /default slash commands are gated behind composerProviderControls.showInteractionModeToggle, hiding them for providers that don't expose an interaction mode toggle.
  • The "Early Access" badge is removed from the Grok provider entry in providerDriverMeta.ts.

Macroscope summarized 1d77552.

@coderabbitai

coderabbitaiBot commented Aug 5, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3d1ee52c-3742-43a8-b678-ff97d59e5982

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 5, 2026
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new feature (sticky provider options) that changes how model options persist across threads, adding new user-facing capability. New features introducing runtime behavior changes warrant human review.

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

@EnzoTironi

Copy link
Copy Markdown
Author

Review findings from Bugbot/Macroscope for this slice are fixed on the Zoen product tip (zoen/main @ 16474ab0d). Will restack / re-push these PR heads after further slim-slicing. Open remaining: effort restart without session.exited (or adopt #5403 set_model path).

@EnzoTironi
EnzoTironiforce-pushed the pr/web-sticky-options branch from d93ecf6 to ad5b707CompareAugust 5, 2026 16:22
@EnzoTironi
EnzoTironiforce-pushed the pr/web-sticky-options branch from ad5b707 to d882090CompareAugust 5, 2026 16:22
@EnzoTironiEnzoTironi changed the title feat(web): sticky provider options for sendTurnfeat(web): sticky provider options and Grok composer affordancesAug 5, 2026
Comment threadapps/web/src/composerDraftStore.ts
@EnzoTironi

Copy link
Copy Markdown
Author

UI screenshots

Badge removal

Before — Grok had Early Access:

before

After — badge removed (Cursor keeps Early Access):

after

Sticky options surface (effort picker)

effort

Draft options for another provider/instance no longer short-circuit sticky
or thread options for the currently selected instance.
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 5, 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 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.

Reviewed by Cursor Bugbot for commit cb97299. Configure here.

Comment threadapps/web/src/composerDraftStore.ts
When the selected instance already has a draft entry without options, skip
legacy kind-key option fallback so sticky/thread options can apply — matching
the model path which only falls back when the instance entry is missing.
@EnzoTironiEnzoTironi closed this by deleting the head repository Aug 6, 2026
@EnzoTironi

Copy link
Copy Markdown
Author

Head fork was deleted and GitHub closed this PR permanently (cannot reopen).

Correct recovery PR: pull request title must not be blank

Same commits/branch tip as this one. #5424 and #5425 stay closed on purpose (absorbed into the Grok native parity PR).

@EnzoTironi

Copy link
Copy Markdown
Author

Correction — recovery PR is: #5504

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.

Web: sticky provider options win over stale thread selection

1 participant

@EnzoTironi
, '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(web): sticky provider options and Grok composer affordances - #5426

Closed
EnzoTironi wants to merge 3 commits into
pingdotgg:mainfrom
EnzoTironi:pr/web-sticky-options
Closed

feat(web): sticky provider options and Grok composer affordances#5426
EnzoTironi wants to merge 3 commits into
pingdotgg:mainfrom
EnzoTironi:pr/web-sticky-options

Conversation

@EnzoTironi

@EnzoTironiEnzoTironi commented Aug 5, 2026

Copy link
Copy Markdown

What Changed

  • Sticky composer options fall back when the per-thread draft has no options, so picker changes (e.g. Grok effort) reach sendTurn on existing threads
  • Sticky does not override the thread/project model slug
  • Sticky options re-keyed under the selected instance id (custom instances work)
  • Gate built-in /plan/default slash items on showInteractionModeToggle
  • Remove Grok "Early Access" badge

Fixes#5421

Why

Without sticky option fallback, changing effort on an existing thread kept stale thread-turn options. Folding sticky into selectedModel would silently switch models — fixed so sticky is options-only.

UI Changes

Grok Early Access badge removed

Before (badge present):

Before: Grok shows Early Access badge

After (badge removed; Cursor still has Early Access):

After: Grok has no Early Access badge

Composer effort control (sticky options apply to this picker)

Grok 4.5 Reasoning effort menu

Sticky is send-payload behavior (no new components). /plan slash only when the provider exposes plan mode.

Checklist

  • This PR is small and focused (~+237 / 4 files)
  • I explained what changed and why
  • Before/after screenshots for badge removal
  • Effort picker screenshot (sticky option surface)
  • Video N/A

Test plan

  • composerDraftStore unit tests (sticky options, model preserve, instance re-key)

Model: grok-4.5 (Grok Build)


Note

Medium Risk
Changes send-time model option resolution across threads and custom provider instances; wrong precedence could ship stale or cross-provider options, though behavior is heavily unit-tested.

Overview
Sticky composer options now feed deriveEffectiveComposerModelState when the per-thread draft has no options for the selected instance, so picker changes (e.g. Grok reasoning effort) apply on existing threads without overriding the thread/project model slug. Resolution is instance-scoped: options from other instances or kind-keyed legacy drafts no longer block sticky, and sticky options are re-keyed under the active custom instance id.

Grok is included in setProviderModelOptions draft persistence, the Grok Early Access badge is removed in settings metadata, and built-in /plan / /default slash menu items only appear when showInteractionModeToggle is true (hiding no-ops on providers like OpenCode).

Unit tests cover sticky vs draft/thread precedence and Grok sticky persistence.

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

Note

Add sticky provider options and Grok composer affordances in the chat composer

  • deriveEffectiveComposerModelState now accepts stickyModelSelectionByProvider and uses it as a fallback when the draft lacks options for the selected provider instance, without affecting model slug resolution.
  • Option lookups are scoped to the selected provider instance via a new optionsForInstance helper, replacing the broader modelSelectionByProviderToOptions.
  • Grok is added to the providers whose options are persisted in setProviderModelOptions, matching the behavior of codex, claudeAgent, cursor, and opencode.
  • /plan and /default slash commands are gated behind composerProviderControls.showInteractionModeToggle, hiding them for providers that don't expose an interaction mode toggle.
  • The "Early Access" badge is removed from the Grok provider entry in providerDriverMeta.ts.

Macroscope summarized 1d77552.

@coderabbitai

coderabbitaiBot commented Aug 5, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3d1ee52c-3742-43a8-b678-ff97d59e5982

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 5, 2026
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new feature (sticky provider options) that changes how model options persist across threads, adding new user-facing capability. New features introducing runtime behavior changes warrant human review.

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

@EnzoTironi

Copy link
Copy Markdown
Author

Review findings from Bugbot/Macroscope for this slice are fixed on the Zoen product tip (zoen/main @ 16474ab0d). Will restack / re-push these PR heads after further slim-slicing. Open remaining: effort restart without session.exited (or adopt #5403 set_model path).

@EnzoTironi
EnzoTironiforce-pushed the pr/web-sticky-options branch from d93ecf6 to ad5b707CompareAugust 5, 2026 16:22
@EnzoTironi
EnzoTironiforce-pushed the pr/web-sticky-options branch from ad5b707 to d882090CompareAugust 5, 2026 16:22
@EnzoTironiEnzoTironi changed the title feat(web): sticky provider options for sendTurnfeat(web): sticky provider options and Grok composer affordancesAug 5, 2026
Comment threadapps/web/src/composerDraftStore.ts
@EnzoTironi

Copy link
Copy Markdown
Author

UI screenshots

Badge removal

Before — Grok had Early Access:

before

After — badge removed (Cursor keeps Early Access):

after

Sticky options surface (effort picker)

effort

Draft options for another provider/instance no longer short-circuit sticky
or thread options for the currently selected instance.
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 5, 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 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.

Reviewed by Cursor Bugbot for commit cb97299. Configure here.

Comment threadapps/web/src/composerDraftStore.ts
When the selected instance already has a draft entry without options, skip
legacy kind-key option fallback so sticky/thread options can apply — matching
the model path which only falls back when the instance entry is missing.
@EnzoTironiEnzoTironi closed this by deleting the head repository Aug 6, 2026
@EnzoTironi

Copy link
Copy Markdown
Author

Head fork was deleted and GitHub closed this PR permanently (cannot reopen).

Correct recovery PR: pull request title must not be blank

Same commits/branch tip as this one. #5424 and #5425 stay closed on purpose (absorbed into the Grok native parity PR).

@EnzoTironi

Copy link
Copy Markdown
Author

Correction — recovery PR is: #5504

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.

Web: sticky provider options win over stale thread selection

1 participant

@EnzoTironi
, '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(web): sticky provider options and Grok composer affordances - #5426

Closed
EnzoTironi wants to merge 3 commits into
pingdotgg:mainfrom
EnzoTironi:pr/web-sticky-options
Closed

feat(web): sticky provider options and Grok composer affordances#5426
EnzoTironi wants to merge 3 commits into
pingdotgg:mainfrom
EnzoTironi:pr/web-sticky-options

Conversation

@EnzoTironi

@EnzoTironiEnzoTironi commented Aug 5, 2026

Copy link
Copy Markdown

What Changed

  • Sticky composer options fall back when the per-thread draft has no options, so picker changes (e.g. Grok effort) reach sendTurn on existing threads
  • Sticky does not override the thread/project model slug
  • Sticky options re-keyed under the selected instance id (custom instances work)
  • Gate built-in /plan/default slash items on showInteractionModeToggle
  • Remove Grok "Early Access" badge

Fixes#5421

Why

Without sticky option fallback, changing effort on an existing thread kept stale thread-turn options. Folding sticky into selectedModel would silently switch models — fixed so sticky is options-only.

UI Changes

Grok Early Access badge removed

Before (badge present):

Before: Grok shows Early Access badge

After (badge removed; Cursor still has Early Access):

After: Grok has no Early Access badge

Composer effort control (sticky options apply to this picker)

Grok 4.5 Reasoning effort menu

Sticky is send-payload behavior (no new components). /plan slash only when the provider exposes plan mode.

Checklist

  • This PR is small and focused (~+237 / 4 files)
  • I explained what changed and why
  • Before/after screenshots for badge removal
  • Effort picker screenshot (sticky option surface)
  • Video N/A

Test plan

  • composerDraftStore unit tests (sticky options, model preserve, instance re-key)

Model: grok-4.5 (Grok Build)


Note

Medium Risk
Changes send-time model option resolution across threads and custom provider instances; wrong precedence could ship stale or cross-provider options, though behavior is heavily unit-tested.

Overview
Sticky composer options now feed deriveEffectiveComposerModelState when the per-thread draft has no options for the selected instance, so picker changes (e.g. Grok reasoning effort) apply on existing threads without overriding the thread/project model slug. Resolution is instance-scoped: options from other instances or kind-keyed legacy drafts no longer block sticky, and sticky options are re-keyed under the active custom instance id.

Grok is included in setProviderModelOptions draft persistence, the Grok Early Access badge is removed in settings metadata, and built-in /plan / /default slash menu items only appear when showInteractionModeToggle is true (hiding no-ops on providers like OpenCode).

Unit tests cover sticky vs draft/thread precedence and Grok sticky persistence.

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

Note

Add sticky provider options and Grok composer affordances in the chat composer

  • deriveEffectiveComposerModelState now accepts stickyModelSelectionByProvider and uses it as a fallback when the draft lacks options for the selected provider instance, without affecting model slug resolution.
  • Option lookups are scoped to the selected provider instance via a new optionsForInstance helper, replacing the broader modelSelectionByProviderToOptions.
  • Grok is added to the providers whose options are persisted in setProviderModelOptions, matching the behavior of codex, claudeAgent, cursor, and opencode.
  • /plan and /default slash commands are gated behind composerProviderControls.showInteractionModeToggle, hiding them for providers that don't expose an interaction mode toggle.
  • The "Early Access" badge is removed from the Grok provider entry in providerDriverMeta.ts.

Macroscope summarized 1d77552.

@coderabbitai

coderabbitaiBot commented Aug 5, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3d1ee52c-3742-43a8-b678-ff97d59e5982

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 5, 2026
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new feature (sticky provider options) that changes how model options persist across threads, adding new user-facing capability. New features introducing runtime behavior changes warrant human review.

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

@EnzoTironi

Copy link
Copy Markdown
Author

Review findings from Bugbot/Macroscope for this slice are fixed on the Zoen product tip (zoen/main @ 16474ab0d). Will restack / re-push these PR heads after further slim-slicing. Open remaining: effort restart without session.exited (or adopt #5403 set_model path).

@EnzoTironi
EnzoTironiforce-pushed the pr/web-sticky-options branch from d93ecf6 to ad5b707CompareAugust 5, 2026 16:22
@EnzoTironi
EnzoTironiforce-pushed the pr/web-sticky-options branch from ad5b707 to d882090CompareAugust 5, 2026 16:22
@EnzoTironiEnzoTironi changed the title feat(web): sticky provider options for sendTurnfeat(web): sticky provider options and Grok composer affordancesAug 5, 2026
Comment threadapps/web/src/composerDraftStore.ts
@EnzoTironi

Copy link
Copy Markdown
Author

UI screenshots

Badge removal

Before — Grok had Early Access:

before

After — badge removed (Cursor keeps Early Access):

after

Sticky options surface (effort picker)

effort

Draft options for another provider/instance no longer short-circuit sticky
or thread options for the currently selected instance.
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 5, 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 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.

Reviewed by Cursor Bugbot for commit cb97299. Configure here.

Comment threadapps/web/src/composerDraftStore.ts
When the selected instance already has a draft entry without options, skip
legacy kind-key option fallback so sticky/thread options can apply — matching
the model path which only falls back when the instance entry is missing.
@EnzoTironiEnzoTironi closed this by deleting the head repository Aug 6, 2026
@EnzoTironi

Copy link
Copy Markdown
Author

Head fork was deleted and GitHub closed this PR permanently (cannot reopen).

Correct recovery PR: pull request title must not be blank

Same commits/branch tip as this one. #5424 and #5425 stay closed on purpose (absorbed into the Grok native parity PR).

@EnzoTironi

Copy link
Copy Markdown
Author

Correction — recovery PR is: #5504

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.

Web: sticky provider options win over stale thread selection

1 participant

@EnzoTironi
, '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(web): sticky provider options and Grok composer affordances - #5426

Closed
EnzoTironi wants to merge 3 commits into
pingdotgg:mainfrom
EnzoTironi:pr/web-sticky-options
Closed

feat(web): sticky provider options and Grok composer affordances#5426
EnzoTironi wants to merge 3 commits into
pingdotgg:mainfrom
EnzoTironi:pr/web-sticky-options

Conversation

@EnzoTironi

@EnzoTironiEnzoTironi commented Aug 5, 2026

Copy link
Copy Markdown

What Changed

  • Sticky composer options fall back when the per-thread draft has no options, so picker changes (e.g. Grok effort) reach sendTurn on existing threads
  • Sticky does not override the thread/project model slug
  • Sticky options re-keyed under the selected instance id (custom instances work)
  • Gate built-in /plan/default slash items on showInteractionModeToggle
  • Remove Grok "Early Access" badge

Fixes#5421

Why

Without sticky option fallback, changing effort on an existing thread kept stale thread-turn options. Folding sticky into selectedModel would silently switch models — fixed so sticky is options-only.

UI Changes

Grok Early Access badge removed

Before (badge present):

Before: Grok shows Early Access badge

After (badge removed; Cursor still has Early Access):

After: Grok has no Early Access badge

Composer effort control (sticky options apply to this picker)

Grok 4.5 Reasoning effort menu

Sticky is send-payload behavior (no new components). /plan slash only when the provider exposes plan mode.

Checklist

  • This PR is small and focused (~+237 / 4 files)
  • I explained what changed and why
  • Before/after screenshots for badge removal
  • Effort picker screenshot (sticky option surface)
  • Video N/A

Test plan

  • composerDraftStore unit tests (sticky options, model preserve, instance re-key)

Model: grok-4.5 (Grok Build)


Note

Medium Risk
Changes send-time model option resolution across threads and custom provider instances; wrong precedence could ship stale or cross-provider options, though behavior is heavily unit-tested.

Overview
Sticky composer options now feed deriveEffectiveComposerModelState when the per-thread draft has no options for the selected instance, so picker changes (e.g. Grok reasoning effort) apply on existing threads without overriding the thread/project model slug. Resolution is instance-scoped: options from other instances or kind-keyed legacy drafts no longer block sticky, and sticky options are re-keyed under the active custom instance id.

Grok is included in setProviderModelOptions draft persistence, the Grok Early Access badge is removed in settings metadata, and built-in /plan / /default slash menu items only appear when showInteractionModeToggle is true (hiding no-ops on providers like OpenCode).

Unit tests cover sticky vs draft/thread precedence and Grok sticky persistence.

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

Note

Add sticky provider options and Grok composer affordances in the chat composer

  • deriveEffectiveComposerModelState now accepts stickyModelSelectionByProvider and uses it as a fallback when the draft lacks options for the selected provider instance, without affecting model slug resolution.
  • Option lookups are scoped to the selected provider instance via a new optionsForInstance helper, replacing the broader modelSelectionByProviderToOptions.
  • Grok is added to the providers whose options are persisted in setProviderModelOptions, matching the behavior of codex, claudeAgent, cursor, and opencode.
  • /plan and /default slash commands are gated behind composerProviderControls.showInteractionModeToggle, hiding them for providers that don't expose an interaction mode toggle.
  • The "Early Access" badge is removed from the Grok provider entry in providerDriverMeta.ts.

Macroscope summarized 1d77552.

@coderabbitai

coderabbitaiBot commented Aug 5, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3d1ee52c-3742-43a8-b678-ff97d59e5982

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 5, 2026
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new feature (sticky provider options) that changes how model options persist across threads, adding new user-facing capability. New features introducing runtime behavior changes warrant human review.

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

@EnzoTironi

Copy link
Copy Markdown
Author

Review findings from Bugbot/Macroscope for this slice are fixed on the Zoen product tip (zoen/main @ 16474ab0d). Will restack / re-push these PR heads after further slim-slicing. Open remaining: effort restart without session.exited (or adopt #5403 set_model path).

@EnzoTironi
EnzoTironiforce-pushed the pr/web-sticky-options branch from d93ecf6 to ad5b707CompareAugust 5, 2026 16:22
@EnzoTironi
EnzoTironiforce-pushed the pr/web-sticky-options branch from ad5b707 to d882090CompareAugust 5, 2026 16:22
@EnzoTironiEnzoTironi changed the title feat(web): sticky provider options for sendTurnfeat(web): sticky provider options and Grok composer affordancesAug 5, 2026
Comment threadapps/web/src/composerDraftStore.ts
@EnzoTironi

Copy link
Copy Markdown
Author

UI screenshots

Badge removal

Before — Grok had Early Access:

before

After — badge removed (Cursor keeps Early Access):

after

Sticky options surface (effort picker)

effort

Draft options for another provider/instance no longer short-circuit sticky
or thread options for the currently selected instance.
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 5, 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 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.

Reviewed by Cursor Bugbot for commit cb97299. Configure here.

Comment threadapps/web/src/composerDraftStore.ts
When the selected instance already has a draft entry without options, skip
legacy kind-key option fallback so sticky/thread options can apply — matching
the model path which only falls back when the instance entry is missing.
@EnzoTironiEnzoTironi closed this by deleting the head repository Aug 6, 2026
@EnzoTironi

Copy link
Copy Markdown
Author

Head fork was deleted and GitHub closed this PR permanently (cannot reopen).

Correct recovery PR: pull request title must not be blank

Same commits/branch tip as this one. #5424 and #5425 stay closed on purpose (absorbed into the Grok native parity PR).

@EnzoTironi

Copy link
Copy Markdown
Author

Correction — recovery PR is: #5504

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.

Web: sticky provider options win over stale thread selection

1 participant

@EnzoTironi
, '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(web): sticky provider options and Grok composer affordances - #5426

Closed
EnzoTironi wants to merge 3 commits into
pingdotgg:mainfrom
EnzoTironi:pr/web-sticky-options
Closed

feat(web): sticky provider options and Grok composer affordances#5426
EnzoTironi wants to merge 3 commits into
pingdotgg:mainfrom
EnzoTironi:pr/web-sticky-options

Conversation

@EnzoTironi

@EnzoTironiEnzoTironi commented Aug 5, 2026

Copy link
Copy Markdown

What Changed

  • Sticky composer options fall back when the per-thread draft has no options, so picker changes (e.g. Grok effort) reach sendTurn on existing threads
  • Sticky does not override the thread/project model slug
  • Sticky options re-keyed under the selected instance id (custom instances work)
  • Gate built-in /plan/default slash items on showInteractionModeToggle
  • Remove Grok "Early Access" badge

Fixes#5421

Why

Without sticky option fallback, changing effort on an existing thread kept stale thread-turn options. Folding sticky into selectedModel would silently switch models — fixed so sticky is options-only.

UI Changes

Grok Early Access badge removed

Before (badge present):

Before: Grok shows Early Access badge

After (badge removed; Cursor still has Early Access):

After: Grok has no Early Access badge

Composer effort control (sticky options apply to this picker)

Grok 4.5 Reasoning effort menu

Sticky is send-payload behavior (no new components). /plan slash only when the provider exposes plan mode.

Checklist

  • This PR is small and focused (~+237 / 4 files)
  • I explained what changed and why
  • Before/after screenshots for badge removal
  • Effort picker screenshot (sticky option surface)
  • Video N/A

Test plan

  • composerDraftStore unit tests (sticky options, model preserve, instance re-key)

Model: grok-4.5 (Grok Build)


Note

Medium Risk
Changes send-time model option resolution across threads and custom provider instances; wrong precedence could ship stale or cross-provider options, though behavior is heavily unit-tested.

Overview
Sticky composer options now feed deriveEffectiveComposerModelState when the per-thread draft has no options for the selected instance, so picker changes (e.g. Grok reasoning effort) apply on existing threads without overriding the thread/project model slug. Resolution is instance-scoped: options from other instances or kind-keyed legacy drafts no longer block sticky, and sticky options are re-keyed under the active custom instance id.

Grok is included in setProviderModelOptions draft persistence, the Grok Early Access badge is removed in settings metadata, and built-in /plan / /default slash menu items only appear when showInteractionModeToggle is true (hiding no-ops on providers like OpenCode).

Unit tests cover sticky vs draft/thread precedence and Grok sticky persistence.

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

Note

Add sticky provider options and Grok composer affordances in the chat composer

  • deriveEffectiveComposerModelState now accepts stickyModelSelectionByProvider and uses it as a fallback when the draft lacks options for the selected provider instance, without affecting model slug resolution.
  • Option lookups are scoped to the selected provider instance via a new optionsForInstance helper, replacing the broader modelSelectionByProviderToOptions.
  • Grok is added to the providers whose options are persisted in setProviderModelOptions, matching the behavior of codex, claudeAgent, cursor, and opencode.
  • /plan and /default slash commands are gated behind composerProviderControls.showInteractionModeToggle, hiding them for providers that don't expose an interaction mode toggle.
  • The "Early Access" badge is removed from the Grok provider entry in providerDriverMeta.ts.

Macroscope summarized 1d77552.

@coderabbitai

coderabbitaiBot commented Aug 5, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3d1ee52c-3742-43a8-b678-ff97d59e5982

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 5, 2026
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new feature (sticky provider options) that changes how model options persist across threads, adding new user-facing capability. New features introducing runtime behavior changes warrant human review.

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

@EnzoTironi

Copy link
Copy Markdown
Author

Review findings from Bugbot/Macroscope for this slice are fixed on the Zoen product tip (zoen/main @ 16474ab0d). Will restack / re-push these PR heads after further slim-slicing. Open remaining: effort restart without session.exited (or adopt #5403 set_model path).

@EnzoTironi
EnzoTironiforce-pushed the pr/web-sticky-options branch from d93ecf6 to ad5b707CompareAugust 5, 2026 16:22
@EnzoTironi
EnzoTironiforce-pushed the pr/web-sticky-options branch from ad5b707 to d882090CompareAugust 5, 2026 16:22
@EnzoTironiEnzoTironi changed the title feat(web): sticky provider options for sendTurnfeat(web): sticky provider options and Grok composer affordancesAug 5, 2026
Comment threadapps/web/src/composerDraftStore.ts
@EnzoTironi

Copy link
Copy Markdown
Author

UI screenshots

Badge removal

Before — Grok had Early Access:

before

After — badge removed (Cursor keeps Early Access):

after

Sticky options surface (effort picker)

effort

Draft options for another provider/instance no longer short-circuit sticky
or thread options for the currently selected instance.
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 5, 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 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.

Reviewed by Cursor Bugbot for commit cb97299. Configure here.

Comment threadapps/web/src/composerDraftStore.ts
When the selected instance already has a draft entry without options, skip
legacy kind-key option fallback so sticky/thread options can apply — matching
the model path which only falls back when the instance entry is missing.
@EnzoTironiEnzoTironi closed this by deleting the head repository Aug 6, 2026
@EnzoTironi

Copy link
Copy Markdown
Author

Head fork was deleted and GitHub closed this PR permanently (cannot reopen).

Correct recovery PR: pull request title must not be blank

Same commits/branch tip as this one. #5424 and #5425 stay closed on purpose (absorbed into the Grok native parity PR).

@EnzoTironi

Copy link
Copy Markdown
Author

Correction — recovery PR is: #5504

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.

Web: sticky provider options win over stale thread selection

1 participant

@EnzoTironi
, '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(web): sticky provider options and Grok composer affordances - #5426

Closed
EnzoTironi wants to merge 3 commits into
pingdotgg:mainfrom
EnzoTironi:pr/web-sticky-options
Closed

feat(web): sticky provider options and Grok composer affordances#5426
EnzoTironi wants to merge 3 commits into
pingdotgg:mainfrom
EnzoTironi:pr/web-sticky-options

Conversation

@EnzoTironi

@EnzoTironiEnzoTironi commented Aug 5, 2026

Copy link
Copy Markdown

What Changed

  • Sticky composer options fall back when the per-thread draft has no options, so picker changes (e.g. Grok effort) reach sendTurn on existing threads
  • Sticky does not override the thread/project model slug
  • Sticky options re-keyed under the selected instance id (custom instances work)
  • Gate built-in /plan/default slash items on showInteractionModeToggle
  • Remove Grok "Early Access" badge

Fixes#5421

Why

Without sticky option fallback, changing effort on an existing thread kept stale thread-turn options. Folding sticky into selectedModel would silently switch models — fixed so sticky is options-only.

UI Changes

Grok Early Access badge removed

Before (badge present):

Before: Grok shows Early Access badge

After (badge removed; Cursor still has Early Access):

After: Grok has no Early Access badge

Composer effort control (sticky options apply to this picker)

Grok 4.5 Reasoning effort menu

Sticky is send-payload behavior (no new components). /plan slash only when the provider exposes plan mode.

Checklist

  • This PR is small and focused (~+237 / 4 files)
  • I explained what changed and why
  • Before/after screenshots for badge removal
  • Effort picker screenshot (sticky option surface)
  • Video N/A

Test plan

  • composerDraftStore unit tests (sticky options, model preserve, instance re-key)

Model: grok-4.5 (Grok Build)


Note

Medium Risk
Changes send-time model option resolution across threads and custom provider instances; wrong precedence could ship stale or cross-provider options, though behavior is heavily unit-tested.

Overview
Sticky composer options now feed deriveEffectiveComposerModelState when the per-thread draft has no options for the selected instance, so picker changes (e.g. Grok reasoning effort) apply on existing threads without overriding the thread/project model slug. Resolution is instance-scoped: options from other instances or kind-keyed legacy drafts no longer block sticky, and sticky options are re-keyed under the active custom instance id.

Grok is included in setProviderModelOptions draft persistence, the Grok Early Access badge is removed in settings metadata, and built-in /plan / /default slash menu items only appear when showInteractionModeToggle is true (hiding no-ops on providers like OpenCode).

Unit tests cover sticky vs draft/thread precedence and Grok sticky persistence.

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

Note

Add sticky provider options and Grok composer affordances in the chat composer

  • deriveEffectiveComposerModelState now accepts stickyModelSelectionByProvider and uses it as a fallback when the draft lacks options for the selected provider instance, without affecting model slug resolution.
  • Option lookups are scoped to the selected provider instance via a new optionsForInstance helper, replacing the broader modelSelectionByProviderToOptions.
  • Grok is added to the providers whose options are persisted in setProviderModelOptions, matching the behavior of codex, claudeAgent, cursor, and opencode.
  • /plan and /default slash commands are gated behind composerProviderControls.showInteractionModeToggle, hiding them for providers that don't expose an interaction mode toggle.
  • The "Early Access" badge is removed from the Grok provider entry in providerDriverMeta.ts.

Macroscope summarized 1d77552.

@coderabbitai

coderabbitaiBot commented Aug 5, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3d1ee52c-3742-43a8-b678-ff97d59e5982

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 5, 2026
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new feature (sticky provider options) that changes how model options persist across threads, adding new user-facing capability. New features introducing runtime behavior changes warrant human review.

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

@EnzoTironi

Copy link
Copy Markdown
Author

Review findings from Bugbot/Macroscope for this slice are fixed on the Zoen product tip (zoen/main @ 16474ab0d). Will restack / re-push these PR heads after further slim-slicing. Open remaining: effort restart without session.exited (or adopt #5403 set_model path).

@EnzoTironi
EnzoTironiforce-pushed the pr/web-sticky-options branch from d93ecf6 to ad5b707CompareAugust 5, 2026 16:22
@EnzoTironi
EnzoTironiforce-pushed the pr/web-sticky-options branch from ad5b707 to d882090CompareAugust 5, 2026 16:22
@EnzoTironiEnzoTironi changed the title feat(web): sticky provider options for sendTurnfeat(web): sticky provider options and Grok composer affordancesAug 5, 2026
Comment threadapps/web/src/composerDraftStore.ts
@EnzoTironi

Copy link
Copy Markdown
Author

UI screenshots

Badge removal

Before — Grok had Early Access:

before

After — badge removed (Cursor keeps Early Access):

after

Sticky options surface (effort picker)

effort

Draft options for another provider/instance no longer short-circuit sticky
or thread options for the currently selected instance.
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 5, 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 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.

Reviewed by Cursor Bugbot for commit cb97299. Configure here.

Comment threadapps/web/src/composerDraftStore.ts
When the selected instance already has a draft entry without options, skip
legacy kind-key option fallback so sticky/thread options can apply — matching
the model path which only falls back when the instance entry is missing.
@EnzoTironiEnzoTironi closed this by deleting the head repository Aug 6, 2026
@EnzoTironi

Copy link
Copy Markdown
Author

Head fork was deleted and GitHub closed this PR permanently (cannot reopen).

Correct recovery PR: pull request title must not be blank

Same commits/branch tip as this one. #5424 and #5425 stay closed on purpose (absorbed into the Grok native parity PR).

@EnzoTironi

Copy link
Copy Markdown
Author

Correction — recovery PR is: #5504

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.

Web: sticky provider options win over stale thread selection

1 participant

@EnzoTironi
, '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(web): sticky provider options and Grok composer affordances - #5426

Closed
EnzoTironi wants to merge 3 commits into
pingdotgg:mainfrom
EnzoTironi:pr/web-sticky-options
Closed

feat(web): sticky provider options and Grok composer affordances#5426
EnzoTironi wants to merge 3 commits into
pingdotgg:mainfrom
EnzoTironi:pr/web-sticky-options

Conversation

@EnzoTironi

@EnzoTironiEnzoTironi commented Aug 5, 2026

Copy link
Copy Markdown

What Changed

  • Sticky composer options fall back when the per-thread draft has no options, so picker changes (e.g. Grok effort) reach sendTurn on existing threads
  • Sticky does not override the thread/project model slug
  • Sticky options re-keyed under the selected instance id (custom instances work)
  • Gate built-in /plan/default slash items on showInteractionModeToggle
  • Remove Grok "Early Access" badge

Fixes#5421

Why

Without sticky option fallback, changing effort on an existing thread kept stale thread-turn options. Folding sticky into selectedModel would silently switch models — fixed so sticky is options-only.

UI Changes

Grok Early Access badge removed

Before (badge present):

Before: Grok shows Early Access badge

After (badge removed; Cursor still has Early Access):

After: Grok has no Early Access badge

Composer effort control (sticky options apply to this picker)

Grok 4.5 Reasoning effort menu

Sticky is send-payload behavior (no new components). /plan slash only when the provider exposes plan mode.

Checklist

  • This PR is small and focused (~+237 / 4 files)
  • I explained what changed and why
  • Before/after screenshots for badge removal
  • Effort picker screenshot (sticky option surface)
  • Video N/A

Test plan

  • composerDraftStore unit tests (sticky options, model preserve, instance re-key)

Model: grok-4.5 (Grok Build)


Note

Medium Risk
Changes send-time model option resolution across threads and custom provider instances; wrong precedence could ship stale or cross-provider options, though behavior is heavily unit-tested.

Overview
Sticky composer options now feed deriveEffectiveComposerModelState when the per-thread draft has no options for the selected instance, so picker changes (e.g. Grok reasoning effort) apply on existing threads without overriding the thread/project model slug. Resolution is instance-scoped: options from other instances or kind-keyed legacy drafts no longer block sticky, and sticky options are re-keyed under the active custom instance id.

Grok is included in setProviderModelOptions draft persistence, the Grok Early Access badge is removed in settings metadata, and built-in /plan / /default slash menu items only appear when showInteractionModeToggle is true (hiding no-ops on providers like OpenCode).

Unit tests cover sticky vs draft/thread precedence and Grok sticky persistence.

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

Note

Add sticky provider options and Grok composer affordances in the chat composer

  • deriveEffectiveComposerModelState now accepts stickyModelSelectionByProvider and uses it as a fallback when the draft lacks options for the selected provider instance, without affecting model slug resolution.
  • Option lookups are scoped to the selected provider instance via a new optionsForInstance helper, replacing the broader modelSelectionByProviderToOptions.
  • Grok is added to the providers whose options are persisted in setProviderModelOptions, matching the behavior of codex, claudeAgent, cursor, and opencode.
  • /plan and /default slash commands are gated behind composerProviderControls.showInteractionModeToggle, hiding them for providers that don't expose an interaction mode toggle.
  • The "Early Access" badge is removed from the Grok provider entry in providerDriverMeta.ts.

Macroscope summarized 1d77552.

@coderabbitai

coderabbitaiBot commented Aug 5, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3d1ee52c-3742-43a8-b678-ff97d59e5982

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 5, 2026
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new feature (sticky provider options) that changes how model options persist across threads, adding new user-facing capability. New features introducing runtime behavior changes warrant human review.

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

@EnzoTironi

Copy link
Copy Markdown
Author

Review findings from Bugbot/Macroscope for this slice are fixed on the Zoen product tip (zoen/main @ 16474ab0d). Will restack / re-push these PR heads after further slim-slicing. Open remaining: effort restart without session.exited (or adopt #5403 set_model path).

@EnzoTironi
EnzoTironiforce-pushed the pr/web-sticky-options branch from d93ecf6 to ad5b707CompareAugust 5, 2026 16:22
@EnzoTironi
EnzoTironiforce-pushed the pr/web-sticky-options branch from ad5b707 to d882090CompareAugust 5, 2026 16:22
@EnzoTironiEnzoTironi changed the title feat(web): sticky provider options for sendTurnfeat(web): sticky provider options and Grok composer affordancesAug 5, 2026
Comment threadapps/web/src/composerDraftStore.ts
@EnzoTironi

Copy link
Copy Markdown
Author

UI screenshots

Badge removal

Before — Grok had Early Access:

before

After — badge removed (Cursor keeps Early Access):

after

Sticky options surface (effort picker)

effort

Draft options for another provider/instance no longer short-circuit sticky
or thread options for the currently selected instance.
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 5, 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 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.

Reviewed by Cursor Bugbot for commit cb97299. Configure here.

Comment threadapps/web/src/composerDraftStore.ts
When the selected instance already has a draft entry without options, skip
legacy kind-key option fallback so sticky/thread options can apply — matching
the model path which only falls back when the instance entry is missing.
@EnzoTironiEnzoTironi closed this by deleting the head repository Aug 6, 2026
@EnzoTironi

Copy link
Copy Markdown
Author

Head fork was deleted and GitHub closed this PR permanently (cannot reopen).

Correct recovery PR: pull request title must not be blank

Same commits/branch tip as this one. #5424 and #5425 stay closed on purpose (absorbed into the Grok native parity PR).

@EnzoTironi

Copy link
Copy Markdown
Author

Correction — recovery PR is: #5504

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.

Web: sticky provider options win over stale thread selection

1 participant

@EnzoTironi
, '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(web): sticky provider options and Grok composer affordances - #5426

Closed
EnzoTironi wants to merge 3 commits into
pingdotgg:mainfrom
EnzoTironi:pr/web-sticky-options
Closed

feat(web): sticky provider options and Grok composer affordances#5426
EnzoTironi wants to merge 3 commits into
pingdotgg:mainfrom
EnzoTironi:pr/web-sticky-options

Conversation

@EnzoTironi

@EnzoTironiEnzoTironi commented Aug 5, 2026

Copy link
Copy Markdown

What Changed

  • Sticky composer options fall back when the per-thread draft has no options, so picker changes (e.g. Grok effort) reach sendTurn on existing threads
  • Sticky does not override the thread/project model slug
  • Sticky options re-keyed under the selected instance id (custom instances work)
  • Gate built-in /plan/default slash items on showInteractionModeToggle
  • Remove Grok "Early Access" badge

Fixes#5421

Why

Without sticky option fallback, changing effort on an existing thread kept stale thread-turn options. Folding sticky into selectedModel would silently switch models — fixed so sticky is options-only.

UI Changes

Grok Early Access badge removed

Before (badge present):

Before: Grok shows Early Access badge

After (badge removed; Cursor still has Early Access):

After: Grok has no Early Access badge

Composer effort control (sticky options apply to this picker)

Grok 4.5 Reasoning effort menu

Sticky is send-payload behavior (no new components). /plan slash only when the provider exposes plan mode.

Checklist

  • This PR is small and focused (~+237 / 4 files)
  • I explained what changed and why
  • Before/after screenshots for badge removal
  • Effort picker screenshot (sticky option surface)
  • Video N/A

Test plan

  • composerDraftStore unit tests (sticky options, model preserve, instance re-key)

Model: grok-4.5 (Grok Build)


Note

Medium Risk
Changes send-time model option resolution across threads and custom provider instances; wrong precedence could ship stale or cross-provider options, though behavior is heavily unit-tested.

Overview
Sticky composer options now feed deriveEffectiveComposerModelState when the per-thread draft has no options for the selected instance, so picker changes (e.g. Grok reasoning effort) apply on existing threads without overriding the thread/project model slug. Resolution is instance-scoped: options from other instances or kind-keyed legacy drafts no longer block sticky, and sticky options are re-keyed under the active custom instance id.

Grok is included in setProviderModelOptions draft persistence, the Grok Early Access badge is removed in settings metadata, and built-in /plan / /default slash menu items only appear when showInteractionModeToggle is true (hiding no-ops on providers like OpenCode).

Unit tests cover sticky vs draft/thread precedence and Grok sticky persistence.

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

Note

Add sticky provider options and Grok composer affordances in the chat composer

  • deriveEffectiveComposerModelState now accepts stickyModelSelectionByProvider and uses it as a fallback when the draft lacks options for the selected provider instance, without affecting model slug resolution.
  • Option lookups are scoped to the selected provider instance via a new optionsForInstance helper, replacing the broader modelSelectionByProviderToOptions.
  • Grok is added to the providers whose options are persisted in setProviderModelOptions, matching the behavior of codex, claudeAgent, cursor, and opencode.
  • /plan and /default slash commands are gated behind composerProviderControls.showInteractionModeToggle, hiding them for providers that don't expose an interaction mode toggle.
  • The "Early Access" badge is removed from the Grok provider entry in providerDriverMeta.ts.

Macroscope summarized 1d77552.

@coderabbitai

coderabbitaiBot commented Aug 5, 2026

Copy link
Copy Markdown

Important

Review skipped

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

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 3d1ee52c-3742-43a8-b678-ff97d59e5982

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

❤️ Share

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

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 5, 2026
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts Outdated
Comment threadapps/web/src/composerDraftStore.ts Outdated
@macroscopeapp

macroscopeappBot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a new feature (sticky provider options) that changes how model options persist across threads, adding new user-facing capability. New features introducing runtime behavior changes warrant human review.

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

@EnzoTironi

Copy link
Copy Markdown
Author

Review findings from Bugbot/Macroscope for this slice are fixed on the Zoen product tip (zoen/main @ 16474ab0d). Will restack / re-push these PR heads after further slim-slicing. Open remaining: effort restart without session.exited (or adopt #5403 set_model path).

@EnzoTironi
EnzoTironiforce-pushed the pr/web-sticky-options branch from d93ecf6 to ad5b707CompareAugust 5, 2026 16:22
@EnzoTironi
EnzoTironiforce-pushed the pr/web-sticky-options branch from ad5b707 to d882090CompareAugust 5, 2026 16:22
@EnzoTironiEnzoTironi changed the title feat(web): sticky provider options for sendTurnfeat(web): sticky provider options and Grok composer affordancesAug 5, 2026
Comment threadapps/web/src/composerDraftStore.ts
@EnzoTironi

Copy link
Copy Markdown
Author

UI screenshots

Badge removal

Before — Grok had Early Access:

before

After — badge removed (Cursor keeps Early Access):

after

Sticky options surface (effort picker)

effort

Draft options for another provider/instance no longer short-circuit sticky
or thread options for the currently selected instance.
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 5, 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 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.

Reviewed by Cursor Bugbot for commit cb97299. Configure here.

Comment threadapps/web/src/composerDraftStore.ts
When the selected instance already has a draft entry without options, skip
legacy kind-key option fallback so sticky/thread options can apply — matching
the model path which only falls back when the instance entry is missing.
@EnzoTironiEnzoTironi closed this by deleting the head repository Aug 6, 2026
@EnzoTironi

Copy link
Copy Markdown
Author

Head fork was deleted and GitHub closed this PR permanently (cannot reopen).

Correct recovery PR: pull request title must not be blank

Same commits/branch tip as this one. #5424 and #5425 stay closed on purpose (absorbed into the Grok native parity PR).

@EnzoTironi

Copy link
Copy Markdown
Author

Correction — recovery PR is: #5504

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.

Web: sticky provider options win over stale thread selection

1 participant

@EnzoTironi