@@ -12,13 +12,13 @@ const optimistic: Array<{
1212 sessionID ?: string
1313 message : {
1414 agent : string
15- model : { providerID : string ; modelID : string }
16- variant ?: string
15+ model : { providerID : string ; modelID : string ; variant ?: string }
1716 }
1817} > = [ ]
1918const optimisticSeeded : boolean [ ] = [ ]
2019const storedSessions : Record < string , Array < { id : string ; title ?: string } > > = { }
2120const promoted : Array < { directory : string ; sessionID : string } > = [ ]
21+ const promotedVariants : Array < string | null | undefined > = [ ]
2222const sentShell : string [ ] = [ ]
2323const syncedDirectories : string [ ] = [ ]
2424const promotedDrafts : Array < { draftID : string ; server : string ; sessionId : string } > = [ ]
@@ -27,6 +27,7 @@ let params: { id?: string } = {}
2727let search : { draftId ?: string } = { }
2828let selected = "/repo/worktree-a"
2929let variant : string | undefined
30+ let selectedVariant : string | null | undefined
3031let permissionServer = "server-a"
3132let createSessionGate : Promise < void > | undefined
3233
@@ -99,8 +100,7 @@ beforeAll(async () => {
99100 } ,
100101 } ) )
101102
102- mock . module ( "@opencode-ai/ui/toast" , ( ) => ( {
103- Toast : { Region : ( ) => null } ,
103+ mock . module ( "@/utils/toast" , ( ) => ( {
104104 showToast : ( ) => 0 ,
105105 } ) )
106106
@@ -112,14 +112,15 @@ beforeAll(async () => {
112112 useLocal : ( ) => ( {
113113 model : {
114114 current : ( ) => ( { id : "model" , provider : { id : "provider" } } ) ,
115- variant : { current : ( ) => variant } ,
115+ variant : { current : ( ) => variant , selected : ( ) => selectedVariant } ,
116116 } ,
117117 agent : {
118118 current : ( ) => ( { name : "agent" } ) ,
119119 } ,
120120 session : {
121- promote ( directory : string , sessionID : string ) {
121+ promote ( directory : string , sessionID : string , state ?: { variant ?: string | null } ) {
122122 promoted . push ( { directory, sessionID } )
123+ promotedVariants . push ( state ?. variant )
123124 } ,
124125 } ,
125126 } ) ,
@@ -248,13 +249,15 @@ beforeEach(() => {
248249 optimistic . length = 0
249250 optimisticSeeded . length = 0
250251 promoted . length = 0
252+ promotedVariants . length = 0
251253 promotedDrafts . length = 0
252254 params = { }
253255 search = { }
254256 sentShell . length = 0
255257 syncedDirectories . length = 0
256258 selected = "/repo/worktree-a"
257259 variant = undefined
260+ selectedVariant = undefined
258261 permissionServer = "server-a"
259262 createSessionGate = undefined
260263 for ( const key of Object . keys ( storedSessions ) ) delete storedSessions [ key ]
@@ -426,7 +429,7 @@ describe("prompt submit worktree selection", () => {
426429 params = { id : "session-1" }
427430 const model = {
428431 current : ( ) => ( { id : "draft-model" , provider : { id : "draft-provider" } } ) ,
429- variant : { current : ( ) => "draft-variant" } ,
432+ variant : { current : ( ) => "draft-variant" , selected : ( ) => undefined } ,
430433 } as unknown as ModelSelection
431434 const submit = createPromptSubmit ( {
432435 prompt,
@@ -455,6 +458,68 @@ describe("prompt submit worktree selection", () => {
455458 } )
456459 } )
457460
461+ test ( "sends explicit default variant on optimistic prompts" , async ( ) => {
462+ params = { id : "session-1" }
463+ selectedVariant = null
464+
465+ const submit = createPromptSubmit ( {
466+ prompt,
467+ info : ( ) => ( { id : "session-1" } ) ,
468+ imageAttachments : ( ) => [ ] ,
469+ commentCount : ( ) => 0 ,
470+ autoAccept : ( ) => false ,
471+ mode : ( ) => "normal" ,
472+ working : ( ) => false ,
473+ editor : ( ) => undefined ,
474+ queueScroll : ( ) => undefined ,
475+ promptLength : ( value ) => value . reduce ( ( sum , part ) => sum + ( "content" in part ? part . content . length : 0 ) , 0 ) ,
476+ addToHistory : ( ) => undefined ,
477+ resetHistoryNavigation : ( ) => undefined ,
478+ setMode : ( ) => undefined ,
479+ setPopover : ( ) => undefined ,
480+ onSubmit : ( ) => undefined ,
481+ } )
482+
483+ const event = { preventDefault : ( ) => undefined } as unknown as Event
484+
485+ await submit . handleSubmit ( event )
486+
487+ expect ( optimistic ) . toHaveLength ( 1 )
488+ expect ( optimistic [ 0 ] ) . toMatchObject ( {
489+ message : {
490+ agent : "agent" ,
491+ model : { providerID : "provider" , modelID : "model" , variant : "default" } ,
492+ } ,
493+ } )
494+ } )
495+
496+ test ( "preserves explicit default when promoting a new session" , async ( ) => {
497+ selectedVariant = null
498+
499+ const submit = createPromptSubmit ( {
500+ prompt,
501+ info : ( ) => undefined ,
502+ imageAttachments : ( ) => [ ] ,
503+ commentCount : ( ) => 0 ,
504+ autoAccept : ( ) => false ,
505+ mode : ( ) => "normal" ,
506+ working : ( ) => false ,
507+ editor : ( ) => undefined ,
508+ queueScroll : ( ) => undefined ,
509+ promptLength : ( value ) => value . reduce ( ( sum , part ) => sum + ( "content" in part ? part . content . length : 0 ) , 0 ) ,
510+ addToHistory : ( ) => undefined ,
511+ resetHistoryNavigation : ( ) => undefined ,
512+ setMode : ( ) => undefined ,
513+ setPopover : ( ) => undefined ,
514+ onSubmit : ( ) => undefined ,
515+ } )
516+
517+ await submit . handleSubmit ( { preventDefault : ( ) => undefined } as unknown as Event )
518+
519+ expect ( promotedVariants ) . toEqual ( [ null ] )
520+ expect ( optimistic [ 0 ] ?. message . model . variant ) . toBe ( "default" )
521+ } )
522+
458523 test ( "seeds new sessions before optimistic prompts are added" , async ( ) => {
459524 const submit = createPromptSubmit ( {
460525 prompt,
0 commit comments