@@ -13,13 +13,13 @@ const optimistic: Array<{
1313 sessionID ?: string
1414 message : {
1515 agent : string
16- model : { providerID : string ; modelID : string }
17- variant ?: string
16+ model : { providerID : string ; modelID : string ; variant ?: string }
1817 }
1918} > = [ ]
2019const optimisticSeeded : boolean [ ] = [ ]
2120const storedSessions : Record < string , Array < { id : string ; title ?: string } > > = { }
2221const promoted : Array < { directory : string ; sessionID : string } > = [ ]
22+ const promotedVariants : Array < string | null | undefined > = [ ]
2323const sentShell : string [ ] = [ ]
2424const syncedDirectories : string [ ] = [ ]
2525const promotedDrafts : Array < { draftID : string ; server : string ; sessionId : string } > = [ ]
@@ -28,6 +28,7 @@ let params: { id?: string } = {}
2828let search : { draftId ?: string } = { }
2929let selected = "/repo/worktree-a"
3030let variant : string | undefined
31+ let selectedVariant : string | null | undefined
3132let permissionServer = "server-a"
3233let createSessionGate : Promise < void > | undefined
3334
@@ -106,8 +107,7 @@ beforeAll(async () => {
106107 } ,
107108 } ) )
108109
109- mock . module ( "@opencode-ai/ui/toast" , ( ) => ( {
110- Toast : { Region : ( ) => null } ,
110+ mock . module ( "@/utils/toast" , ( ) => ( {
111111 showToast : ( ) => 0 ,
112112 } ) )
113113
@@ -119,14 +119,15 @@ beforeAll(async () => {
119119 useLocal : ( ) => ( {
120120 model : {
121121 current : ( ) => ( { id : "model" , provider : { id : "provider" } } ) ,
122- variant : { current : ( ) => variant } ,
122+ variant : { current : ( ) => variant , selected : ( ) => selectedVariant } ,
123123 } ,
124124 agent : {
125125 current : ( ) => ( { name : "agent" } ) ,
126126 } ,
127127 session : {
128- promote ( directory : string , sessionID : string ) {
128+ promote ( directory : string , sessionID : string , state ?: { variant ?: string | null } ) {
129129 promoted . push ( { directory, sessionID } )
130+ promotedVariants . push ( state ?. variant )
130131 } ,
131132 } ,
132133 } ) ,
@@ -255,13 +256,15 @@ beforeEach(() => {
255256 optimistic . length = 0
256257 optimisticSeeded . length = 0
257258 promoted . length = 0
259+ promotedVariants . length = 0
258260 promotedDrafts . length = 0
259261 params = { }
260262 search = { }
261263 sentShell . length = 0
262264 syncedDirectories . length = 0
263265 selected = "/repo/worktree-a"
264266 variant = undefined
267+ selectedVariant = undefined
265268 permissionServer = "server-a"
266269 createSessionGate = undefined
267270 for ( const key of Object . keys ( storedSessions ) ) delete storedSessions [ key ]
@@ -433,7 +436,7 @@ describe("prompt submit worktree selection", () => {
433436 params = { id : "session-1" }
434437 const model = {
435438 current : ( ) => ( { id : "draft-model" , provider : { id : "draft-provider" } } ) ,
436- variant : { current : ( ) => "draft-variant" } ,
439+ variant : { current : ( ) => "draft-variant" , selected : ( ) => undefined } ,
437440 } as unknown as ModelSelection
438441 const submit = createPromptSubmit ( {
439442 prompt,
@@ -462,6 +465,68 @@ describe("prompt submit worktree selection", () => {
462465 } )
463466 } )
464467
468+ test ( "sends explicit default variant on optimistic prompts" , async ( ) => {
469+ params = { id : "session-1" }
470+ selectedVariant = null
471+
472+ const submit = createPromptSubmit ( {
473+ prompt,
474+ info : ( ) => ( { id : "session-1" } ) ,
475+ imageAttachments : ( ) => [ ] ,
476+ commentCount : ( ) => 0 ,
477+ autoAccept : ( ) => false ,
478+ mode : ( ) => "normal" ,
479+ working : ( ) => false ,
480+ editor : ( ) => undefined ,
481+ queueScroll : ( ) => undefined ,
482+ promptLength : ( value ) => value . reduce ( ( sum , part ) => sum + ( "content" in part ? part . content . length : 0 ) , 0 ) ,
483+ addToHistory : ( ) => undefined ,
484+ resetHistoryNavigation : ( ) => undefined ,
485+ setMode : ( ) => undefined ,
486+ setPopover : ( ) => undefined ,
487+ onSubmit : ( ) => undefined ,
488+ } )
489+
490+ const event = { preventDefault : ( ) => undefined } as unknown as Event
491+
492+ await submit . handleSubmit ( event )
493+
494+ expect ( optimistic ) . toHaveLength ( 1 )
495+ expect ( optimistic [ 0 ] ) . toMatchObject ( {
496+ message : {
497+ agent : "agent" ,
498+ model : { providerID : "provider" , modelID : "model" , variant : "default" } ,
499+ } ,
500+ } )
501+ } )
502+
503+ test ( "preserves explicit default when promoting a new session" , async ( ) => {
504+ selectedVariant = null
505+
506+ const submit = createPromptSubmit ( {
507+ prompt,
508+ info : ( ) => undefined ,
509+ imageAttachments : ( ) => [ ] ,
510+ commentCount : ( ) => 0 ,
511+ autoAccept : ( ) => false ,
512+ mode : ( ) => "normal" ,
513+ working : ( ) => false ,
514+ editor : ( ) => undefined ,
515+ queueScroll : ( ) => undefined ,
516+ promptLength : ( value ) => value . reduce ( ( sum , part ) => sum + ( "content" in part ? part . content . length : 0 ) , 0 ) ,
517+ addToHistory : ( ) => undefined ,
518+ resetHistoryNavigation : ( ) => undefined ,
519+ setMode : ( ) => undefined ,
520+ setPopover : ( ) => undefined ,
521+ onSubmit : ( ) => undefined ,
522+ } )
523+
524+ await submit . handleSubmit ( { preventDefault : ( ) => undefined } as unknown as Event )
525+
526+ expect ( promotedVariants ) . toEqual ( [ null ] )
527+ expect ( optimistic [ 0 ] ?. message . model . variant ) . toBe ( "default" )
528+ } )
529+
465530 test ( "seeds new sessions before optimistic prompts are added" , async ( ) => {
466531 const submit = createPromptSubmit ( {
467532 prompt,
0 commit comments