@@ -40,6 +40,7 @@ import TaskHeader from "./TaskHeader"
4040import AutoApproveMenu from "./AutoApproveMenu"
4141import SystemPromptWarning from "./SystemPromptWarning"
4242import { CheckpointWarning } from "./CheckpointWarning"
43+ import { jumpToLastCheckpoint } from "@src/utils/checkpoint-navigation" // Added import
4344
4445export interface ChatViewProps {
4546 isHidden : boolean
@@ -537,68 +538,6 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
537538 const shouldDisableImages =
538539 ! model ?. supportsImages || textAreaDisabled || selectedImages . length >= MAX_IMAGES_PER_MESSAGE
539540
540- const handleMessage = useCallback (
541- ( e : MessageEvent ) => {
542- const message : ExtensionMessage = e . data
543-
544- switch ( message . type ) {
545- case "action" :
546- switch ( message . action ! ) {
547- case "didBecomeVisible" :
548- if ( ! isHidden && ! textAreaDisabled && ! enableButtons ) {
549- textAreaRef . current ?. focus ( )
550- }
551- break
552- case "focusInput" :
553- textAreaRef . current ?. focus ( )
554- break
555- }
556- break
557- case "selectedImages" :
558- const newImages = message . images ?? [ ]
559- if ( newImages . length > 0 ) {
560- setSelectedImages ( ( prevImages ) =>
561- [ ...prevImages , ...newImages ] . slice ( 0 , MAX_IMAGES_PER_MESSAGE ) ,
562- )
563- }
564- break
565- case "invoke" :
566- switch ( message . invoke ! ) {
567- case "newChat" :
568- handleChatReset ( )
569- break
570- case "sendMessage" :
571- handleSendMessage ( message . text ?? "" , message . images ?? [ ] )
572- break
573- case "setChatBoxMessage" :
574- handleSetChatBoxMessage ( message . text ?? "" , message . images ?? [ ] )
575- break
576- case "primaryButtonClick" :
577- handlePrimaryButtonClick ( message . text ?? "" , message . images ?? [ ] )
578- break
579- case "secondaryButtonClick" :
580- handleSecondaryButtonClick ( message . text ?? "" , message . images ?? [ ] )
581- break
582- }
583- }
584- // textAreaRef.current is not explicitly required here since React
585- // guarantees that ref will be stable across re-renders, and we're
586- // not using its value but its reference.
587- } ,
588- [
589- isHidden ,
590- textAreaDisabled ,
591- enableButtons ,
592- handleChatReset ,
593- handleSendMessage ,
594- handleSetChatBoxMessage ,
595- handlePrimaryButtonClick ,
596- handleSecondaryButtonClick ,
597- ] ,
598- )
599-
600- useEvent ( "message" , handleMessage )
601-
602541 // NOTE: the VSCode window needs to be focused for this to work.
603542 useMount ( ( ) => textAreaRef . current ?. focus ( ) )
604543
@@ -930,6 +869,85 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
930869 return result
931870 } , [ visibleMessages ] )
932871
872+ // Define handleMessage *after* groupedMessages and other dependencies
873+ const handleMessage = useCallback (
874+ ( e : MessageEvent ) => {
875+ const message : ExtensionMessage = e . data
876+
877+ switch ( message . type ) {
878+ case "action" :
879+ // Handle jumpToCheckpoint based on message.text FIRST
880+ if ( message . text === "jumpToCheckpoint" ) {
881+ console . log ( "[Webview Frontend] Received jumpToCheckpoint message" )
882+ // Ensure 'groupedMessages' (or the equivalent variable holding the message list) is used
883+ jumpToLastCheckpoint ( virtuosoRef , groupedMessages , ( ) => {
884+ console . log ( "[Webview Frontend] Checkpoint navigation complete" )
885+ // Optional: Re-enable auto-scrolling if it was disabled
886+ // disableAutoScrollRef.current = false;
887+ } )
888+ } else {
889+ // If not jumpToCheckpoint, THEN handle other actions based on message.action
890+ // Handle regular action messages that use the action field
891+ switch ( message . action ! ) {
892+ case "didBecomeVisible" :
893+ if ( ! isHidden && ! textAreaDisabled && ! enableButtons ) {
894+ textAreaRef . current ?. focus ( )
895+ }
896+ break
897+ case "focusInput" :
898+ textAreaRef . current ?. focus ( )
899+ break
900+ // ... other action cases ...
901+ }
902+ }
903+ break // Keep this break for the outer "action" case
904+ case "selectedImages" :
905+ const newImages = message . images ?? [ ]
906+ if ( newImages . length > 0 ) {
907+ setSelectedImages ( ( prevImages ) =>
908+ [ ...prevImages , ...newImages ] . slice ( 0 , MAX_IMAGES_PER_MESSAGE ) ,
909+ )
910+ }
911+ break
912+ case "invoke" :
913+ switch ( message . invoke ! ) {
914+ case "newChat" :
915+ handleChatReset ( )
916+ break
917+ case "sendMessage" :
918+ handleSendMessage ( message . text ?? "" , message . images ?? [ ] )
919+ break
920+ case "setChatBoxMessage" :
921+ handleSetChatBoxMessage ( message . text ?? "" , message . images ?? [ ] )
922+ break
923+ case "primaryButtonClick" :
924+ handlePrimaryButtonClick ( message . text ?? "" , message . images ?? [ ] )
925+ break
926+ case "secondaryButtonClick" :
927+ handleSecondaryButtonClick ( message . text ?? "" , message . images ?? [ ] )
928+ break
929+ }
930+ break // Keep this break
931+ // Add other message types if needed
932+ }
933+ } ,
934+ [
935+ isHidden ,
936+ textAreaDisabled ,
937+ enableButtons ,
938+ groupedMessages , // Dependency is correctly placed now
939+ handleChatReset ,
940+ handleSendMessage ,
941+ handleSetChatBoxMessage ,
942+ handlePrimaryButtonClick ,
943+ handleSecondaryButtonClick ,
944+ // virtuosoRef is stable, no need to add
945+ ] ,
946+ )
947+
948+ // Register the message handler
949+ useEvent ( "message" , handleMessage )
950+
933951 // scrolling
934952
935953 const scrollToBottomSmooth = useMemo (
0 commit comments