@@ -115,9 +115,12 @@ import {
115115 resolveInitialModelId ,
116116} from "./session/model-config" ;
117117import {
118+ CONTEXT_WINDOW_1M_BETA ,
119+ CONTEXT_WINDOW_200K_TOKENS ,
118120 DEFAULT_EFFORT ,
119121 DEFAULT_MODEL ,
120122 fastModeStateEnabled ,
123+ getContextWindowOptions ,
121124 getEffortOptions ,
122125 resolveEffortForModel ,
123126 resolveModelPreference ,
@@ -131,6 +134,8 @@ import {
131134 buildSystemPrompt ,
132135 type GatewayEnv ,
133136 type ProcessSpawnedInfo ,
137+ toEffortFlagSettings ,
138+ toSdkEffort ,
134139} from "./session/options" ;
135140import { SettingsManager } from "./session/settings" ;
136141import {
@@ -1752,15 +1757,24 @@ export class ClaudeAcpAgent extends BaseAcpAgent {
17521757 this . session . lastContextWindowSize =
17531758 this . getContextWindowForModel ( resolvedValue ) ;
17541759 this . rebuildEffortConfigOption ( resolvedValue ) ;
1760+ this . rebuildContextWindowConfigOption ( resolvedValue ) ;
17551761 this . rebuildFastModeConfigOption ( resolvedValue ) ;
17561762 } else if ( params . configId === "effort" ) {
17571763 const newEffort = resolvedValue as EffortLevel ;
17581764 this . session . effort = newEffort ;
1759- this . session . queryOptions . effort = newEffort ;
1760- await this . session . query . applyFlagSettings ( {
1761- // @ts -expect-error SDK Settings.effortLevel omits "max" but runtime accepts it
1762- effortLevel : newEffort ,
1763- } ) ;
1765+ this . session . queryOptions . effort = toSdkEffort ( newEffort ) ;
1766+ await this . session . query . applyFlagSettings (
1767+ toEffortFlagSettings ( newEffort ) ,
1768+ ) ;
1769+ } else if ( params . configId === "context_window" ) {
1770+ const enable1M = resolvedValue === "1m" ;
1771+ // queryOptions is read per prompt, so this applies from the next turn.
1772+ this . session . queryOptions . betas = enable1M
1773+ ? [ CONTEXT_WINDOW_1M_BETA ]
1774+ : undefined ;
1775+ this . session . lastContextWindowSize = enable1M
1776+ ? this . getContextWindowForModel ( this . session . modelId ?? "" )
1777+ : CONTEXT_WINDOW_200K_TOKENS ;
17641778 } else if ( params . configId === "fast" ) {
17651779 // SDK flag first: a rejected control request leaves state untouched.
17661780 const enabled = resolvedValue === "on" ;
@@ -1949,8 +1963,10 @@ export class ClaudeAcpAgent extends BaseAcpAgent {
19491963 const settingsManager = new SettingsManager ( cwd ) ;
19501964 await settingsManager . initialize ( ) ;
19511965
1966+ // The session's explicit pick outranks the shared claude settings file:
1967+ // that file is cross-session state and must only ever be a fallback.
19521968 const earlyModelId =
1953- settingsManager . getSettings ( ) . model || meta ? .model || "" ;
1969+ meta ?. model || settingsManager . getSettings ( ) . model || "" ;
19541970
19551971 // Register the in-process general local-tools MCP server. Tools self-gate
19561972 // via the registry (e.g. signed-commit is cloud-only and needs a GH token),
@@ -2184,7 +2200,7 @@ export class ClaudeAcpAgent extends BaseAcpAgent {
21842200
21852201 const [ rawModelOptions ] = await Promise . all ( [
21862202 this . getModelConfigOptions (
2187- settingsManager . getSettings ( ) . model || meta ? .model || undefined ,
2203+ meta ?. model || settingsManager . getSettings ( ) . model || undefined ,
21882204 this . options ?. gatewayEnv ?. anthropicBaseUrl ,
21892205 this . options ?. gatewayEnv ?. anthropicAuthToken ,
21902206 ) ,
@@ -2249,13 +2265,15 @@ export class ClaudeAcpAgent extends BaseAcpAgent {
22492265 }
22502266
22512267 const resolvedModelId = resolveInitialModelId ( modelOptions , [
2252- settingsManager . getSettings ( ) . model ,
22532268 meta ?. model ,
2269+ settingsManager . getSettings ( ) . model ,
22542270 ] ) ;
22552271 modelOptions . currentModelId = resolvedModelId ;
22562272 session . modelId = resolvedModelId ;
22572273 session . lastContextWindowSize =
2258- this . getContextWindowForModel ( resolvedModelId ) ;
2274+ meta ?. contextWindow === "200k"
2275+ ? CONTEXT_WINDOW_200K_TOKENS
2276+ : this . getContextWindowForModel ( resolvedModelId ) ;
22592277
22602278 const resolvedSdkModel = toSdkModelId ( resolvedModelId ) ;
22612279
@@ -2270,17 +2288,26 @@ export class ClaudeAcpAgent extends BaseAcpAgent {
22702288 // Keep thinking enabled by default for effort-capable models (see
22712289 // DEFAULT_EFFORT).
22722290 const resolvedEffort = resolveEffortForModel ( resolvedModelId , effort ) ;
2273- if ( resolvedEffort && resolvedEffort !== effort ) {
2291+ // Ultracode re-applies even when the requested effort stands: the flag
2292+ // only reaches the session through applyFlagSettings.
2293+ if (
2294+ resolvedEffort &&
2295+ ( resolvedEffort !== effort || resolvedEffort === "ultracode" )
2296+ ) {
22742297 this . session . effort = resolvedEffort ;
2275- this . session . queryOptions . effort = resolvedEffort ;
2276- await this . session . query . applyFlagSettings ( {
2277- // @ts -expect-error SDK Settings.effortLevel omits "max" but runtime accepts it
2278- effortLevel : resolvedEffort ,
2279- } ) ;
2298+ this . session . queryOptions . effort = toSdkEffort ( resolvedEffort ) ;
2299+ await this . session . query . applyFlagSettings (
2300+ toEffortFlagSettings ( resolvedEffort ) ,
2301+ ) ;
2302+ }
2303+
2304+ if ( supports1MContext ( resolvedModelId ) && meta ?. contextWindow !== "200k" ) {
2305+ options . betas = [ CONTEXT_WINDOW_1M_BETA ] ;
22802306 }
22812307
2282- if ( supports1MContext ( resolvedModelId ) ) {
2283- options . betas = [ "context-1m-2025-08-07" ] ;
2308+ if ( meta ?. fastMode && supportsFastMode ( resolvedModelId ) ) {
2309+ this . session . fastModeEnabled = true ;
2310+ await this . session . query . applyFlagSettings ( { fastMode : true } ) ;
22842311 }
22852312
22862313 const availableModes = getAvailableModes ( ) ;
@@ -2460,23 +2487,67 @@ export class ClaudeAcpAgent extends BaseAcpAgent {
24602487 } ) ;
24612488 }
24622489
2490+ const contextOption = this . contextWindowConfigOption (
2491+ modelOptions . currentModelId ,
2492+ ) ;
2493+ if ( contextOption ) {
2494+ configOptions . push ( contextOption ) ;
2495+ }
2496+
24632497 if ( supportsFastMode ( modelOptions . currentModelId ) ) {
24642498 configOptions . push ( this . fastModeConfigOption ( fastModeEnabled ?? false ) ) ;
24652499 }
24662500
24672501 return configOptions ;
24682502 }
24692503
2504+ private contextWindowConfigOption (
2505+ modelId : string ,
2506+ ) : SessionConfigOption | null {
2507+ const contextOptions = getContextWindowOptions ( modelId ) ;
2508+ if ( ! contextOptions ) return null ;
2509+ const is1M = this . session . queryOptions . betas ?. includes (
2510+ CONTEXT_WINDOW_1M_BETA ,
2511+ ) ;
2512+ return {
2513+ id : "context_window" ,
2514+ name : "Context Window" ,
2515+ type : "select" ,
2516+ currentValue : is1M ? "1m" : "200k" ,
2517+ options : contextOptions ,
2518+ category : "_context_window" as SessionConfigOptionCategory ,
2519+ description : "Choose the context window size for this session" ,
2520+ } ;
2521+ }
2522+
2523+ private rebuildContextWindowConfigOption ( modelId : string ) : void {
2524+ const withoutContext = this . session . configOptions . filter (
2525+ ( o ) => o . id !== "context_window" ,
2526+ ) ;
2527+ if ( ! supports1MContext ( modelId ) ) {
2528+ this . session . queryOptions . betas = undefined ;
2529+ this . session . configOptions = withoutContext ;
2530+ return ;
2531+ }
2532+ // Switching onto a 1M-capable model restores the default 1M window.
2533+ this . session . queryOptions . betas = [ CONTEXT_WINDOW_1M_BETA ] ;
2534+ const contextOption = this . contextWindowConfigOption ( modelId ) ;
2535+ this . session . configOptions = contextOption
2536+ ? [ ...withoutContext , contextOption ]
2537+ : withoutContext ;
2538+ }
2539+
24702540 private fastModeConfigOption ( enabled : boolean ) : SessionConfigOption {
24712541 return {
24722542 id : "fast" ,
2473- name : "Fast mode " ,
2543+ name : "Fast Mode " ,
24742544 type : "select" ,
24752545 currentValue : enabled ? "on" : "off" ,
24762546 options : [
24772547 { value : "on" , name : "On" } ,
24782548 { value : "off" , name : "Off" } ,
24792549 ] ,
2550+ category : "_fast_mode" as SessionConfigOptionCategory ,
24802551 description : "Faster responses on supported models" ,
24812552 } ;
24822553 }
@@ -2564,6 +2635,7 @@ export class ClaudeAcpAgent extends BaseAcpAgent {
25642635 this . session . queryOptions . effort = undefined ;
25652636 void this . session . query . applyFlagSettings ( {
25662637 effortLevel : undefined ,
2638+ ultracode : false ,
25672639 } ) ;
25682640 }
25692641 return ;
@@ -2578,12 +2650,12 @@ export class ClaudeAcpAgent extends BaseAcpAgent {
25782650 // Set the default when none is chosen yet (see DEFAULT_EFFORT), or re-apply
25792651 // when the prior level is invalid for the newly selected model.
25802652 if ( ! this . session . effort || resolvedValue !== currentValue ) {
2581- this . session . effort = resolvedValue as EffortLevel ;
2582- this . session . queryOptions . effort = resolvedValue as EffortLevel ;
2583- void this . session . query . applyFlagSettings ( {
2584- // @ts -expect-error SDK Settings.effortLevel omits "max" but runtime accepts it
2585- effortLevel : resolvedValue ,
2586- } ) ;
2653+ const resolvedEffort = resolvedValue as EffortLevel ;
2654+ this . session . effort = resolvedEffort ;
2655+ this . session . queryOptions . effort = toSdkEffort ( resolvedEffort ) ;
2656+ void this . session . query . applyFlagSettings (
2657+ toEffortFlagSettings ( resolvedEffort ) ,
2658+ ) ;
25872659 }
25882660
25892661 const effortConfig : SessionConfigOption = {
0 commit comments