Skip to content

fix(server): Cursor turns send the picker's default options - #175

Merged
adampeterhiggins merged 1 commit into
mainfrom
fix/cursor-send-default-options
Oct 6, 2026
Merged

adampeterhiggins merged 1 commit into
mainfrom
fix/cursor-send-default-options

Conversation

@adampeterhiggins

@adampeterhiggins adampeterhiggins commented Oct 6, 2026 •

Copy link
Copy Markdown
Owner

Problem

T3 only sends Cursor the options the user changed, and Cursor treats an omitted option as the model's standard tier. The picker shows Cursor's default variant: 1M for Opus, Sonnet, Fable and GPT-5.x, and 500K for Grok 4.7. But these all actually ran at about 300K:

  • an untouched composer, which sends only fast=false
  • delegate_task with only an effort, and delegate_task to another model
  • thread launches and scheduled tasks

Separately, delegate_task with options on the parent's own model replaced the parent's options, so an effort-only child of a parent that chose 300K lost that choice. This is upstream pingdotgg/t3code#16149, which is triaged with no fix yet.

Fix

  • withCursorDefaultParameters (apps/server/src/provider/cursorSdkModel.ts) fills each option the selection leaves out with the value the picker shows for that model, using the same getProviderOptionCurrentValue the composer uses. Chosen options always win. Fast stays off unless chosen. Cursor defaults Fast on for Grok, Composer and some GPT models, but T3 deliberately keeps it off (withImplicitFastModeDefault).
  • CursorDriver applies it where it already wraps the SDK runner per instance, on agent open and on every send, using that instance's provider snapshot. That covers composer turns, resumes, delegate_task, launches and scheduled tasks without touching the adapter. No extra network call: the snapshot is the catalog the picker already uses.
  • delegate_task on the parent's provider and model now merges the requested options over the parent's by id. On a different model it still sends only what was requested, which the driver then fills with defaults. This applies to every provider. The option description agents see says so.

Text generation (commit messages, titles) still sends only the configured options, so those small prompts don't move into Max Mode.

Cost: default Cursor turns on models whose default is the long tier now run at 1M (500K for Grok 4.7) in Max Mode, billed per token on usage-based plans. That's what the picker already claims, and what Cursor's own apps do.

Verification

  • New tests: withCursorDefaultParameters goes through the real catalog → descriptor mapping, covering fill-all, keeping chosen options (including Fast on and 300K), and models with no options. The delegate_task merge test fails on the old code.
  • vp test run on CursorProvider, CursorDriver, CursorAdapterV2, CursorAgentSdk, cursorSdk, OrchestratorMcpService (+ spawn, toolkit integration) and spawnPolicy: all pass.
  • tsc --noEmit for apps/server and packages/contracts: 0 errors. vp lint and vp fmt clean on the changed files.
  • Live, real Cursor account, Opus 5.5 with what an untouched composer sends (fast=false), effective window read from Cursor's checkpoint:
Params sent Window
Before fast=false 300,000
After fast=false, effort=medium, context=1m 1,000,000

Not exercised: a full T3 turn through the UI; mobile and desktop share this server path.

docs/fork-differences.md has a section to remove once upstream fixes pingdotgg#16149.

Model: Claude Opus 5.5 (1M context). Harness: Claude Code.

🤖 Generated with Claude Code

@adampeterhiggins
adampeterhiggins force-pushed the fix/cursor-long-context-max-mode branch from a9f80dd to fa3f1cc Compare October 6, 2026 09:20
@adampeterhiggins
adampeterhiggins force-pushed the fix/cursor-send-default-options branch 2 times, most recently from 7fa11ac to d5c2ce7 Compare October 6, 2026 09:23
@adampeterhiggins
adampeterhiggins changed the base branch from fix/cursor-long-context-max-mode to main October 6, 2026 09:23
Cursor treats an omitted option as the model's standard tier, but T3 only
sends options the user changed. An untouched composer, delegated task,
launched thread or scheduled task ran at ~300K while the picker showed 1M
(500K for Grok 4.7).

The Cursor driver now fills options the selection leaves out with the
defaults the picker shows, on agent open and every send. Fast stays off
unless chosen, matching the composer.

delegate_task on the parent's provider and model now merges requested
options over the parent's instead of replacing them, so an effort-only
child keeps the parent's context window.

Fixes upstream pingdotgg#16149 in the fork.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@adampeterhiggins
adampeterhiggins force-pushed the fix/cursor-send-default-options branch from d5c2ce7 to c441eac Compare October 6, 2026 09:25
@adampeterhiggins
adampeterhiggins merged commit 3703431 into main Oct 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Cursor options left at their default aren't sent, so delegated tasks and untouched threads run at 300K while T3 shows 1M

1 participant