@@ -10,7 +10,7 @@ export const gemini: Chatbot = {
1010 wait_until_ready : async ( ) => {
1111 await new Promise ( ( resolve ) => {
1212 const check_for_element = ( ) => {
13- if ( document . querySelector ( 'toolbox-drawer ' ) ) {
13+ if ( document . querySelector ( 'button[data-test-id="bard-mode-menu-button"] ' ) ) {
1414 resolve ( null )
1515 } else {
1616 setTimeout ( check_for_element , 100 )
@@ -38,30 +38,33 @@ export const gemini: Chatbot = {
3838 }
3939
4040 const model_label = CHATBOTS [ 'Gemini' ] . models [ model ] . label
41- if ( model_selector_trigger . textContent == model_label ) {
41+ const trigger_text = model_selector_trigger . textContent ?. trim ( ) . toLowerCase ( ) || ''
42+ const target_label_lower = model_label . toLowerCase ( )
43+ if (
44+ trigger_text . includes ( target_label_lower ) &&
45+ ! ( target_label_lower == 'flash' && trigger_text . includes ( 'flash-lite' ) )
46+ ) {
4247 return
4348 }
4449
4550 model_selector_trigger . click ( )
4651 await new Promise ( ( r ) => requestAnimationFrame ( r ) )
4752 const menu_content =
48- document . querySelector ( '.mat-mdc-menu-content' ) ||
49- document . querySelector ( 'mat-bottom-sheet-container' )
53+ document . querySelector ( 'gem-menu' )
5054 if ( ! menu_content ) {
5155 report_initialization_error ( {
5256 function_name : 'set_model' ,
5357 log_message : 'Model selector menu not found'
5458 } )
5559 return
5660 }
57- const model_options = Array . from ( menu_content . querySelectorAll ( 'button' ) )
58- const target_data_test_id = model_label . toLowerCase ( )
61+ const model_options = Array . from ( menu_content . querySelectorAll ( '[role="menuitem"]' ) )
5962 let found = false
6063 for ( const option of model_options ) {
61- if (
62- option . getAttribute ( 'data-test-id' ) ?. includes ( target_data_test_id )
63- ) {
64- option . click ( )
64+ const label_element = option . querySelector ( '.label' )
65+ const text = label_element ?. textContent ?. trim ( ) . toLowerCase ( )
66+ if ( text && text . endsWith ( target_label_lower ) ) {
67+ ; ( option as HTMLElement ) . click ( )
6568 found = true
6669 break
6770 }
@@ -75,6 +78,72 @@ export const gemini: Chatbot = {
7578 await new Promise ( ( r ) => requestAnimationFrame ( r ) )
7679 }
7780 } ,
81+ set_reasoning_effort : async ( chat ) => {
82+ const reasoning_effort = chat . reasoning_effort
83+ if ( ! reasoning_effort ) return
84+
85+ const model_selector_trigger = document . querySelector (
86+ 'bard-mode-switcher button'
87+ ) as HTMLButtonElement
88+ if ( ! model_selector_trigger ) {
89+ report_initialization_error ( {
90+ function_name : 'set_reasoning_effort' ,
91+ log_message : 'Model selector trigger not found'
92+ } )
93+ return
94+ }
95+
96+ model_selector_trigger . click ( )
97+ await new Promise ( ( resolve ) => requestAnimationFrame ( resolve ) )
98+
99+ const menu_content = document . querySelector ( 'gem-menu' )
100+ if ( ! menu_content ) {
101+ report_initialization_error ( {
102+ function_name : 'set_reasoning_effort' ,
103+ log_message : 'Model selector menu not found'
104+ } )
105+ return
106+ }
107+
108+ const thinking_level_item = Array . from (
109+ menu_content . querySelectorAll ( 'gem-menu-item' )
110+ ) . find ( ( item ) => item . getAttribute ( 'value' ) == 'thinking_level' ) as HTMLElement
111+
112+ if ( ! thinking_level_item ) {
113+ document . dispatchEvent ( new KeyboardEvent ( 'keydown' , { key : 'Escape' , bubbles : true } ) )
114+ return
115+ }
116+
117+ const current_level = thinking_level_item
118+ . querySelector ( '.sublabel' )
119+ ?. textContent ?. trim ( )
120+
121+ if ( current_level ?. toLowerCase ( ) == reasoning_effort . toLowerCase ( ) ) {
122+ document . dispatchEvent ( new KeyboardEvent ( 'keydown' , { key : 'Escape' , bubbles : true } ) )
123+ return
124+ }
125+
126+ thinking_level_item . click ( )
127+ await new Promise ( ( resolve ) => requestAnimationFrame ( resolve ) )
128+
129+ const all_menu_items = Array . from ( document . querySelectorAll ( 'gem-menu-item' ) )
130+ let found = false
131+ for ( const option of all_menu_items ) {
132+ const label_element = option . querySelector ( '.label' )
133+ const text = label_element ?. textContent ?. trim ( ) . toLowerCase ( )
134+ if ( text == reasoning_effort . toLowerCase ( ) ) {
135+ ; ( option as HTMLElement ) . click ( )
136+ found = true
137+ break
138+ }
139+ }
140+
141+ if ( ! found ) {
142+ document . dispatchEvent ( new KeyboardEvent ( 'keydown' , { key : 'Escape' , bubbles : true } ) )
143+ }
144+
145+ await new Promise ( ( resolve ) => requestAnimationFrame ( resolve ) )
146+ } ,
78147 set_options : async ( chat ) => {
79148 const options = chat . options
80149 if ( ! options ) return
@@ -161,7 +230,7 @@ export const gemini: Chatbot = {
161230 get_chat_turn : ( f ) => f . closest ( 'response-container' ) ,
162231 perform_copy : ( f ) => {
163232 const copy_button = f . querySelector (
164- 'copy-button > button'
233+ 'copy-button button'
165234 ) as HTMLElement
166235 if ( ! copy_button ) {
167236 report_initialization_error ( {
0 commit comments