@@ -59,7 +59,12 @@ import { fetchMcpToolMetadata } from "./mcp/tool-metadata";
5959import { canUseTool } from "./permissions/permission-handlers" ;
6060import { getAvailableSlashCommands } from "./session/commands" ;
6161import { parseMcpServers } from "./session/mcp-config" ;
62- import { DEFAULT_MODEL , toSdkModelId } from "./session/models" ;
62+ import {
63+ DEFAULT_MODEL ,
64+ getDefaultContextWindow ,
65+ getEffortOptions ,
66+ toSdkModelId ,
67+ } from "./session/models" ;
6368import {
6469 buildSessionOptions ,
6570 buildSystemPrompt ,
@@ -337,7 +342,9 @@ export class ClaudeAcpAgent extends BaseAcpAgent {
337342 ( m ) => m . contextWindow ,
338343 ) ;
339344 const contextWindowSize =
340- contextWindows . length > 0 ? Math . min ( ...contextWindows ) : 200000 ;
345+ contextWindows . length > 0
346+ ? Math . min ( ...contextWindows )
347+ : getDefaultContextWindow ( this . session . modelId ?? "" ) ;
341348
342349 // Send usage_update notification
343350 if ( lastAssistantTotalUsage !== null ) {
@@ -509,6 +516,7 @@ export class ClaudeAcpAgent extends BaseAcpAgent {
509516 const sdkModelId = toSdkModelId ( params . modelId ) ;
510517 await this . session . query . setModel ( sdkModelId ) ;
511518 this . session . modelId = params . modelId ;
519+ this . rebuildEffortConfigOption ( params . modelId ) ;
512520 await this . updateConfigOption ( "model" , params . modelId ) ;
513521 return { } ;
514522 }
@@ -559,6 +567,7 @@ export class ClaudeAcpAgent extends BaseAcpAgent {
559567 const sdkModelId = toSdkModelId ( params . value ) ;
560568 await this . session . query . setModel ( sdkModelId ) ;
561569 this . session . modelId = params . value ;
570+ this . rebuildEffortConfigOption ( params . value ) ;
562571 } else if ( params . configId === "effort" ) {
563572 const newEffort = params . value as EffortLevel ;
564573 this . session . effort = newEffort ;
@@ -865,7 +874,7 @@ export class ClaudeAcpAgent extends BaseAcpAgent {
865874 description : mode . description ?? undefined ,
866875 } ) ) ;
867876
868- return [
877+ const configOptions : SessionConfigOption [ ] = [
869878 {
870879 id : "mode" ,
871880 name : "Approval Preset" ,
@@ -885,21 +894,67 @@ export class ClaudeAcpAgent extends BaseAcpAgent {
885894 category : "model" as SessionConfigOptionCategory ,
886895 description : "Choose which model Claude should use" ,
887896 } ,
888- {
897+ ] ;
898+
899+ const effortOptions = getEffortOptions ( modelOptions . currentModelId ) ;
900+ if ( effortOptions ) {
901+ configOptions . push ( {
889902 id : "effort" ,
890903 name : "Effort" ,
891904 type : "select" ,
892905 currentValue : currentEffort ,
893- options : [
894- { value : "low" , name : "Low" } ,
895- { value : "medium" , name : "Medium" } ,
896- { value : "high" , name : "High" } ,
897- { value : "max" , name : "Max" } ,
898- ] ,
906+ options : effortOptions ,
899907 category : "thought_level" as SessionConfigOptionCategory ,
900908 description : "Controls how much effort Claude puts into its response" ,
901- } ,
902- ] ;
909+ } ) ;
910+ }
911+
912+ return configOptions ;
913+ }
914+
915+ private rebuildEffortConfigOption ( modelId : string ) : void {
916+ const effortOptions = getEffortOptions ( modelId ) ;
917+ const existingEffort = this . session . configOptions . find (
918+ ( o ) => o . id === "effort" ,
919+ ) ;
920+
921+ if ( ! effortOptions ) {
922+ this . session . configOptions = this . session . configOptions . filter (
923+ ( o ) => o . id !== "effort" ,
924+ ) ;
925+ if ( this . session . effort ) {
926+ this . session . effort = undefined ;
927+ this . session . queryOptions . effort = undefined ;
928+ }
929+ return ;
930+ }
931+
932+ const currentValue = existingEffort ?. currentValue ?? "high" ;
933+ const isValidValue = effortOptions . some ( ( o ) => o . value === currentValue ) ;
934+ const resolvedValue = isValidValue ? currentValue : "high" ;
935+
936+ if ( resolvedValue !== currentValue && this . session . effort ) {
937+ this . session . effort = resolvedValue as EffortLevel ;
938+ this . session . queryOptions . effort = resolvedValue as EffortLevel ;
939+ }
940+
941+ const effortConfig : SessionConfigOption = {
942+ id : "effort" ,
943+ name : "Effort" ,
944+ type : "select" ,
945+ currentValue : resolvedValue ,
946+ options : effortOptions ,
947+ category : "thought_level" as SessionConfigOptionCategory ,
948+ description : "Controls how much effort Claude puts into its response" ,
949+ } ;
950+
951+ if ( existingEffort ) {
952+ this . session . configOptions = this . session . configOptions . map ( ( o ) =>
953+ o . id === "effort" ? effortConfig : o ,
954+ ) ;
955+ } else {
956+ this . session . configOptions . push ( effortConfig ) ;
957+ }
903958 }
904959
905960 private async sendAvailableCommandsUpdate ( ) : Promise < void > {
0 commit comments