@@ -450,6 +450,7 @@ export const RightPanel: React.FC<RightPanelProps> = React.memo(({
450450 const requestIdRef = useRef ( 0 ) ;
451451 const historyRequestIdRef = useRef ( 0 ) ;
452452 const refreshTimerRef = useRef < number | null > ( null ) ;
453+ const changesRefreshTimerRef = useRef < number | null > ( null ) ;
453454 const selectedCommitHashRef = useRef < string | null > ( null ) ;
454455 const selectedIsUncommittedRef = useRef ( false ) ;
455456
@@ -676,6 +677,10 @@ export const RightPanel: React.FC<RightPanelProps> = React.memo(({
676677 window . clearTimeout ( refreshTimerRef . current ) ;
677678 refreshTimerRef . current = null ;
678679 }
680+ if ( changesRefreshTimerRef . current ) {
681+ window . clearTimeout ( changesRefreshTimerRef . current ) ;
682+ changesRefreshTimerRef . current = null ;
683+ }
679684 } ;
680685 } , [ ] ) ;
681686
@@ -703,6 +708,19 @@ export const RightPanel: React.FC<RightPanelProps> = React.memo(({
703708 } , 200 ) ;
704709 } , [ session . id , fetchCommits , fetchFiles , selectedIsUncommitted ] ) ;
705710
711+ const scheduleChangesRefresh = useCallback ( ( ) => {
712+ if ( ! session . id ) return ;
713+ if ( changesRefreshTimerRef . current ) {
714+ window . clearTimeout ( changesRefreshTimerRef . current ) ;
715+ }
716+ changesRefreshTimerRef . current = window . setTimeout ( ( ) => {
717+ changesRefreshTimerRef . current = null ;
718+ if ( selectedIsUncommittedRef . current ) {
719+ fetchFiles ( ) ;
720+ }
721+ } , 80 ) ;
722+ } , [ session . id , fetchFiles ] ) ;
723+
706724 // Refresh once after a run completes (running -> waiting/error/etc).
707725 const prevStatusRef = useRef ( session . status ) ;
708726 useEffect ( ( ) => {
@@ -737,6 +755,17 @@ export const RightPanel: React.FC<RightPanelProps> = React.memo(({
737755 scheduleRefresh ( ) ;
738756 } , [ session . id , gitSig , scheduleRefresh ] ) ;
739757
758+ // Zed-style: refresh changes whenever git status is updated for this session.
759+ // This covers staging operations that don't change the "has changes" booleans.
760+ useEffect ( ( ) => {
761+ if ( ! session . id ) return ;
762+ const unsub = window . electronAPI ?. events ?. onGitStatusUpdated ?.( ( data ) => {
763+ if ( ! data || data . sessionId !== session . id ) return ;
764+ scheduleChangesRefresh ( ) ;
765+ } ) ;
766+ return ( ) => { if ( unsub ) unsub ( ) ; } ;
767+ } , [ session . id , scheduleChangesRefresh ] ) ;
768+
740769 // Refresh after agent-run git commands that can change History/WT state.
741770 useEffect ( ( ) => {
742771 if ( ! session . id ) return ;
@@ -803,10 +832,10 @@ export const RightPanel: React.FC<RightPanelProps> = React.memo(({
803832 console . error ( '[RightPanel] Failed to change stage state' , err ) ;
804833 } finally {
805834 setIsStageChanging ( false ) ;
806- handleRefresh ( ) ;
835+ scheduleChangesRefresh ( ) ;
807836 }
808837 } ,
809- [ handleRefresh , isStageChanging , session . id ]
838+ [ isStageChanging , scheduleChangesRefresh , session . id ]
810839 ) ;
811840
812841 const handleChangeFileStage = useCallback (
@@ -819,10 +848,10 @@ export const RightPanel: React.FC<RightPanelProps> = React.memo(({
819848 console . error ( '[RightPanel] Failed to change file stage state' , err ) ;
820849 } finally {
821850 setIsStageChanging ( false ) ;
822- handleRefresh ( ) ;
851+ scheduleChangesRefresh ( ) ;
823852 }
824853 } ,
825- [ handleRefresh , isStageChanging , session . id ]
854+ [ isStageChanging , scheduleChangesRefresh , session . id ]
826855 ) ;
827856
828857 const trackedFiles = useMemo ( ( ) => {
0 commit comments