@@ -8,6 +8,7 @@ import { buildTestCtx } from "./test-ctx.js";
88const mocks = vi . hoisted ( ( ) => ( {
99 createModelSelectionState : vi . fn ( ) ,
1010 applyInlineDirectiveOverrides : vi . fn ( ) ,
11+ listAgentEntries : vi . fn ( ) ,
1112 resolveFastModeState : vi . fn ( ) ,
1213 resolveReplyExecOverrides : vi . fn ( ) ,
1314} ) ) ;
@@ -145,6 +146,8 @@ async function resolveHelloWithModelDefaults(params: {
145146 body ?: string ;
146147 sessionEntry ?: SessionEntry ;
147148 agentCfg ?: { reasoningDefault ?: "off" | "on" | "stream" } ;
149+ agentEntries ?: Array < { id ?: string ; thinkingDefault ?: "off" | "low" } > ;
150+ hasConfiguredThinkingDefault ?: boolean ;
148151 commandAuthorized ?: boolean ;
149152 hasOneTurnModelOverride ?: boolean ;
150153 selectedProvider ?: string ;
@@ -156,13 +159,15 @@ async function resolveHelloWithModelDefaults(params: {
156159} ) {
157160 const resolveDefaultThinkingLevel = vi . fn ( async ( ) => params . defaultThinking ) ;
158161 const resolveDefaultReasoningLevel = vi . fn ( async ( ) => params . defaultReasoning ) ;
162+ mocks . listAgentEntries . mockReturnValue ( params . agentEntries ?? [ ] ) ;
159163 mocks . createModelSelectionState . mockResolvedValueOnce ( {
160164 provider : params . selectedProvider ?? "openai" ,
161165 model : params . selectedModel ?? "gpt-4o-mini" ,
162166 allowedModelKeys : new Set < string > ( ) ,
163167 allowedModelCatalog : [ ] ,
164168 resetModelOverride : false ,
165169 resolveDefaultThinkingLevel,
170+ hasConfiguredThinkingDefault : params . hasConfiguredThinkingDefault ,
166171 resolveDefaultReasoningLevel,
167172 } ) ;
168173
@@ -210,7 +215,7 @@ async function resolveHelloWithModelDefaults(params: {
210215}
211216
212217vi . mock ( "../../agents/agent-scope.js" , ( ) => ( {
213- listAgentEntries : vi . fn ( ( ) => [ ] ) ,
218+ listAgentEntries : ( ... args : unknown [ ] ) => mocks . listAgentEntries ( ... args ) ,
214219} ) ) ;
215220
216221vi . mock ( "../../agents/defaults.js" , ( ) => ( {
@@ -296,9 +301,11 @@ describe("resolveReplyDirectives", () => {
296301 beforeEach ( ( ) => {
297302 mocks . createModelSelectionState . mockReset ( ) ;
298303 mocks . applyInlineDirectiveOverrides . mockReset ( ) ;
304+ mocks . listAgentEntries . mockReset ( ) ;
299305 mocks . resolveFastModeState . mockReset ( ) ;
300306 mocks . resolveReplyExecOverrides . mockReset ( ) ;
301307
308+ mocks . listAgentEntries . mockReturnValue ( [ ] ) ;
302309 mocks . createModelSelectionState . mockResolvedValue ( {
303310 provider : "openai" ,
304311 model : "gpt-4o-mini" ,
@@ -556,6 +563,48 @@ describe("resolveReplyDirectives", () => {
556563 expect ( resolveDefaultReasoningLevel ) . not . toHaveBeenCalled ( ) ;
557564 } ) ;
558565
566+ it ( "does not re-enable model reasoning when thinking override explicitly disables thinking" , async ( ) => {
567+ const { result, resolveDefaultReasoningLevel } = await resolveHelloWithModelDefaults ( {
568+ defaultThinking : "off" ,
569+ defaultReasoning : "on" ,
570+ opts : { thinkingLevelOverride : "off" } ,
571+ } ) ;
572+
573+ expectContinueResult ( result , {
574+ resolvedThinkLevel : "off" ,
575+ resolvedReasoningLevel : "off" ,
576+ } ) ;
577+ expect ( resolveDefaultReasoningLevel ) . not . toHaveBeenCalled ( ) ;
578+ } ) ;
579+
580+ it ( "does not re-enable model reasoning when per-agent thinking default disables thinking" , async ( ) => {
581+ const { result, resolveDefaultReasoningLevel } = await resolveHelloWithModelDefaults ( {
582+ defaultThinking : "off" ,
583+ defaultReasoning : "on" ,
584+ agentEntries : [ { id : "main" , thinkingDefault : "off" } ] ,
585+ } ) ;
586+
587+ expectContinueResult ( result , {
588+ resolvedThinkLevel : "off" ,
589+ resolvedReasoningLevel : "off" ,
590+ } ) ;
591+ expect ( resolveDefaultReasoningLevel ) . not . toHaveBeenCalled ( ) ;
592+ } ) ;
593+
594+ it ( "does not re-enable model reasoning when per-model thinking config disables thinking" , async ( ) => {
595+ const { result, resolveDefaultReasoningLevel } = await resolveHelloWithModelDefaults ( {
596+ defaultThinking : "off" ,
597+ defaultReasoning : "on" ,
598+ hasConfiguredThinkingDefault : true ,
599+ } ) ;
600+
601+ expectContinueResult ( result , {
602+ resolvedThinkLevel : "off" ,
603+ resolvedReasoningLevel : "off" ,
604+ } ) ;
605+ expect ( resolveDefaultReasoningLevel ) . not . toHaveBeenCalled ( ) ;
606+ } ) ;
607+
559608 it ( "skips the model reasoning default when thinking is active" , async ( ) => {
560609 const { result, resolveDefaultReasoningLevel } = await resolveHelloWithModelDefaults ( {
561610 defaultThinking : "low" ,
0 commit comments