@@ -87,6 +87,14 @@ export function RebaseTab({
8787 const [ selectedPushLaneIds , setSelectedPushLaneIds ] = React . useState < string [ ] > ( [ ] ) ;
8888 const activeRunIdRef = React . useRef < string | null > ( null ) ;
8989
90+ const refreshRebaseNeeds = React . useCallback ( async ( ) => {
91+ try {
92+ await window . ade . rebase . scanNeeds ( ) ;
93+ } catch {
94+ /* best effort */
95+ }
96+ } , [ ] ) ;
97+
9098 // Drift commits state
9199 const [ driftCommits , setDriftCommits ] = React . useState < GitCommitSummary [ ] > ( [ ] ) ;
92100 const [ driftCommitsLoading , setDriftCommitsLoading ] = React . useState ( false ) ;
@@ -177,6 +185,9 @@ export function RebaseTab({
177185 if ( ! selectedNeed || event . run . rootLaneId !== selectedNeed . laneId ) return prev ;
178186 return event . run ;
179187 } ) ;
188+ if ( event . run . state !== "running" ) {
189+ void refreshRebaseNeeds ( ) ;
190+ }
180191 } else if ( event . type === "rebase-run-log" ) {
181192 setRunLogs ( ( prev ) => {
182193 const activeRunId = activeRunIdRef . current ;
@@ -188,7 +199,7 @@ export function RebaseTab({
188199 }
189200 } ) ;
190201 return unsubscribe ;
191- } , [ selectedNeed ] ) ;
202+ } , [ refreshRebaseNeeds , selectedNeed ] ) ;
192203
193204 // Fetch drift commits when selected need changes
194205 React . useEffect ( ( ) => {
@@ -268,6 +279,7 @@ export function RebaseTab({
268279 setActiveRun ( pushed ) ;
269280 setRunLogs ( ( prev ) => [ ...prev , `[${ new Date ( ) . toLocaleTimeString ( ) } ] Push complete` ] . slice ( - 80 ) ) ;
270281 }
282+ await refreshRebaseNeeds ( ) ;
271283 await onRefresh ( ) ;
272284 } catch ( err : unknown ) {
273285 setRebaseError ( err instanceof Error ? err . message : String ( err ) ) ;
@@ -276,6 +288,15 @@ export function RebaseTab({
276288 }
277289 } ;
278290 const selectedRunIsActive = activeRun ?. state === "running" ;
291+ const selectedRunLane = React . useMemo (
292+ ( ) => ( selectedNeed ? activeRun ?. lanes . find ( ( lane ) => lane . laneId === selectedNeed . laneId ) ?? null : null ) ,
293+ [ activeRun , selectedNeed ] ,
294+ ) ;
295+ const selectedNeedResolvedByRun = Boolean (
296+ selectedRunLane
297+ && activeRun ?. state === "completed"
298+ && ( selectedRunLane . status === "succeeded" || selectedRunLane . status === "skipped" ) ,
299+ ) ;
279300
280301 const handleAbortRun = async ( ) => {
281302 if ( ! activeRun ) return ;
@@ -284,6 +305,7 @@ export function RebaseTab({
284305 try {
285306 const next = await window . ade . lanes . rebaseAbort ( { runId : activeRun . runId } ) ;
286307 setActiveRun ( next ) ;
308+ await refreshRebaseNeeds ( ) ;
287309 await onRefresh ( ) ;
288310 } catch ( err : unknown ) {
289311 setRebaseError ( err instanceof Error ? err . message : String ( err ) ) ;
@@ -299,6 +321,7 @@ export function RebaseTab({
299321 try {
300322 const next = await window . ade . lanes . rebaseRollback ( { runId : activeRun . runId } ) ;
301323 setActiveRun ( next ) ;
324+ await refreshRebaseNeeds ( ) ;
302325 await onRefresh ( ) ;
303326 } catch ( err : unknown ) {
304327 setRebaseError ( err instanceof Error ? err . message : String ( err ) ) ;
@@ -314,6 +337,7 @@ export function RebaseTab({
314337 try {
315338 const next = await window . ade . lanes . rebasePush ( { runId : activeRun . runId , laneIds : selectedPushLaneIds } ) ;
316339 setActiveRun ( next ) ;
340+ await refreshRebaseNeeds ( ) ;
317341 await onRefresh ( ) ;
318342 } catch ( err : unknown ) {
319343 setRebaseError ( err instanceof Error ? err . message : String ( err ) ) ;
@@ -943,7 +967,7 @@ export function RebaseTab({
943967 < Button
944968 size = "sm"
945969 variant = "primary"
946- disabled = { rebaseBusy || selectedNeed . behindBy === 0 || selectedRunIsActive }
970+ disabled = { rebaseBusy || selectedNeed . behindBy === 0 || selectedRunIsActive || selectedNeedResolvedByRun }
947971 onClick = { ( ) => void handleRebase ( true ) }
948972 style = { { borderRadius : 0 } }
949973 >
@@ -955,7 +979,7 @@ export function RebaseTab({
955979 < Button
956980 size = "sm"
957981 variant = "outline"
958- disabled = { rebaseBusy || selectedNeed . behindBy === 0 || selectedRunIsActive }
982+ disabled = { rebaseBusy || selectedNeed . behindBy === 0 || selectedRunIsActive || selectedNeedResolvedByRun }
959983 onClick = { ( ) => void handleRebase ( false , "none" ) }
960984 style = { { borderRadius : 0 , borderColor : S . borderSubtle } }
961985 >
@@ -966,7 +990,7 @@ export function RebaseTab({
966990 < Button
967991 size = "sm"
968992 variant = "outline"
969- disabled = { rebaseBusy || selectedNeed . behindBy === 0 || selectedRunIsActive }
993+ disabled = { rebaseBusy || selectedNeed . behindBy === 0 || selectedRunIsActive || selectedNeedResolvedByRun }
970994 onClick = { ( ) => void handleRebase ( false , "review_then_push" ) }
971995 style = { { borderRadius : 0 , borderColor : S . borderSubtle } }
972996 >
0 commit comments