@@ -324,67 +324,99 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie
324324 /*
325325 This logic depends on the useEffect[messages] above to set clineAsk, after which buttons are shown and we then send an askResponse to the extension.
326326 */
327- const handlePrimaryButtonClick = useCallback ( ( ) => {
328- switch ( clineAsk ) {
329- case "api_req_failed" :
330- case "command" :
331- case "command_output" :
332- case "tool" :
333- case "browser_action_launch" :
334- case "use_mcp_server" :
335- case "resume_task" :
336- case "mistake_limit_reached" :
337- case "auto_approval_max_req_reached" :
338- vscode . postMessage ( {
339- type : "askResponse" ,
340- askResponse : "yesButtonClicked" ,
341- } )
342- break
343- case "completion_result" :
344- case "resume_completed_task" :
345- // extension waiting for feedback. but we can just present a new task button
346- startNewTask ( )
347- break
348- }
349- setTextAreaDisabled ( true )
350- setClineAsk ( undefined )
351- setEnableButtons ( false )
352- // setPrimaryButtonText(undefined)
353- // setSecondaryButtonText(undefined)
354- disableAutoScrollRef . current = false
355- } , [ clineAsk , startNewTask ] )
356-
357- const handleSecondaryButtonClick = useCallback ( ( ) => {
358- if ( isStreaming ) {
359- vscode . postMessage ( { type : "cancelTask" } )
360- setDidClickCancel ( true )
361- return
362- }
327+ const handlePrimaryButtonClick = useCallback (
328+ ( text ?: string , images ?: string [ ] ) => {
329+ const trimmedInput = text ?. trim ( )
330+ switch ( clineAsk ) {
331+ case "api_req_failed" :
332+ case "command" :
333+ case "command_output" :
334+ case "tool" :
335+ case "browser_action_launch" :
336+ case "use_mcp_server" :
337+ case "resume_task" :
338+ case "mistake_limit_reached" :
339+ case "auto_approval_max_req_reached" :
340+ if ( trimmedInput || ( images && images . length > 0 ) ) {
341+ vscode . postMessage ( {
342+ type : "askResponse" ,
343+ askResponse : "yesButtonClicked" ,
344+ text : trimmedInput ,
345+ images : images ,
346+ } )
347+ } else {
348+ vscode . postMessage ( {
349+ type : "askResponse" ,
350+ askResponse : "yesButtonClicked" ,
351+ } )
352+ }
353+ // Clear input state after sending
354+ setInputValue ( "" )
355+ setSelectedImages ( [ ] )
356+ break
357+ case "completion_result" :
358+ case "resume_completed_task" :
359+ // extension waiting for feedback. but we can just present a new task button
360+ startNewTask ( )
361+ break
362+ }
363+ setTextAreaDisabled ( true )
364+ setClineAsk ( undefined )
365+ setEnableButtons ( false )
366+ // setPrimaryButtonText(undefined)
367+ // setSecondaryButtonText(undefined)
368+ disableAutoScrollRef . current = false
369+ } ,
370+ [ clineAsk , startNewTask ] ,
371+ )
363372
364- switch ( clineAsk ) {
365- case "api_req_failed" :
366- case "mistake_limit_reached" :
367- case "auto_approval_max_req_reached" :
368- startNewTask ( )
369- break
370- case "command" :
371- case "tool" :
372- case "browser_action_launch" :
373- case "use_mcp_server" :
374- // responds to the API with a "This operation failed" and lets it try again
375- vscode . postMessage ( {
376- type : "askResponse" ,
377- askResponse : "noButtonClicked" ,
378- } )
379- break
380- }
381- setTextAreaDisabled ( true )
382- setClineAsk ( undefined )
383- setEnableButtons ( false )
384- // setPrimaryButtonText(undefined)
385- // setSecondaryButtonText(undefined)
386- disableAutoScrollRef . current = false
387- } , [ clineAsk , startNewTask , isStreaming ] )
373+ const handleSecondaryButtonClick = useCallback (
374+ ( text ?: string , images ?: string [ ] ) => {
375+ const trimmedInput = text ?. trim ( )
376+ if ( isStreaming ) {
377+ vscode . postMessage ( { type : "cancelTask" } )
378+ setDidClickCancel ( true )
379+ return
380+ }
381+
382+ switch ( clineAsk ) {
383+ case "api_req_failed" :
384+ case "mistake_limit_reached" :
385+ case "auto_approval_max_req_reached" :
386+ startNewTask ( )
387+ break
388+ case "command" :
389+ case "tool" :
390+ case "browser_action_launch" :
391+ case "use_mcp_server" :
392+ if ( trimmedInput || ( images && images . length > 0 ) ) {
393+ vscode . postMessage ( {
394+ type : "askResponse" ,
395+ askResponse : "noButtonClicked" ,
396+ text : trimmedInput ,
397+ images : images ,
398+ } )
399+ } else {
400+ // responds to the API with a "This operation failed" and lets it try again
401+ vscode . postMessage ( {
402+ type : "askResponse" ,
403+ askResponse : "noButtonClicked" ,
404+ } )
405+ }
406+ // Clear input state after sending
407+ setInputValue ( "" )
408+ setSelectedImages ( [ ] )
409+ break
410+ }
411+ setTextAreaDisabled ( true )
412+ setClineAsk ( undefined )
413+ setEnableButtons ( false )
414+ // setPrimaryButtonText(undefined)
415+ // setSecondaryButtonText(undefined)
416+ disableAutoScrollRef . current = false
417+ } ,
418+ [ clineAsk , startNewTask , isStreaming ] ,
419+ )
388420
389421 const handleTaskCloseButtonClick = useCallback ( ( ) => {
390422 startNewTask ( )
@@ -426,10 +458,10 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie
426458 handleSendMessage ( message . text ?? "" , message . images ?? [ ] )
427459 break
428460 case "primaryButtonClick" :
429- handlePrimaryButtonClick ( )
461+ handlePrimaryButtonClick ( message . text ?? "" , message . images ?? [ ] )
430462 break
431463 case "secondaryButtonClick" :
432- handleSecondaryButtonClick ( )
464+ handleSecondaryButtonClick ( message . text ?? "" , message . images ?? [ ] )
433465 break
434466 }
435467 }
@@ -869,7 +901,7 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie
869901 flex : secondaryButtonText ? 1 : 2 ,
870902 marginRight : secondaryButtonText ? "6px" : "0" ,
871903 } }
872- onClick = { handlePrimaryButtonClick } >
904+ onClick = { ( ) => handlePrimaryButtonClick ( inputValue , selectedImages ) } >
873905 { primaryButtonText }
874906 </ VSCodeButton >
875907 ) }
@@ -881,7 +913,7 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie
881913 flex : isStreaming ? 2 : 1 ,
882914 marginLeft : isStreaming ? 0 : "6px" ,
883915 } }
884- onClick = { handleSecondaryButtonClick } >
916+ onClick = { ( ) => handleSecondaryButtonClick ( inputValue , selectedImages ) } >
885917 { isStreaming ? "Cancel" : secondaryButtonText }
886918 </ VSCodeButton >
887919 ) }
0 commit comments