fix(coding-agent): add live retry countdown\n\ncloses #3187

This commit is contained in:
Mario Zechner
2026-04-15 14:07:46 +02:00
parent 79df7c3114
commit a8f51764c8
2 changed files with 28 additions and 2 deletions

View File

@@ -77,6 +77,7 @@ import { BashExecutionComponent } from "./components/bash-execution.js";
import { BorderedLoader } from "./components/bordered-loader.js";
import { BranchSummaryMessageComponent } from "./components/branch-summary-message.js";
import { CompactionSummaryMessageComponent } from "./components/compaction-summary-message.js";
import { CountdownTimer } from "./components/countdown-timer.js";
import { CustomEditor } from "./components/custom-editor.js";
import { CustomMessageComponent } from "./components/custom-message.js";
import { DaxnutsComponent } from "./components/daxnuts.js";
@@ -227,6 +228,7 @@ export class InteractiveMode {
// Auto-retry state
private retryLoader: Loader | undefined = undefined;
private retryCountdown: CountdownTimer | undefined = undefined;
private retryEscapeHandler?: () => void;
// Messages queued while compaction is running
@@ -2337,6 +2339,10 @@ export class InteractiveMode {
this.defaultEditor.onEscape = this.retryEscapeHandler;
this.retryEscapeHandler = undefined;
}
if (this.retryCountdown) {
this.retryCountdown.dispose();
this.retryCountdown = undefined;
}
if (this.retryLoader) {
this.retryLoader.stop();
this.retryLoader = undefined;
@@ -2593,12 +2599,24 @@ export class InteractiveMode {
};
// Show retry indicator
this.statusContainer.clear();
const delaySeconds = Math.round(event.delayMs / 1000);
this.retryCountdown?.dispose();
const retryMessage = (seconds: number) =>
`Retrying (${event.attempt}/${event.maxAttempts}) in ${seconds}s... (${keyText("app.interrupt")} to cancel)`;
this.retryLoader = new Loader(
this.ui,
(spinner) => theme.fg("warning", spinner),
(text) => theme.fg("muted", text),
`Retrying (${event.attempt}/${event.maxAttempts}) in ${delaySeconds}s... (${keyText("app.interrupt")} to cancel)`,
retryMessage(Math.ceil(event.delayMs / 1000)),
);
this.retryCountdown = new CountdownTimer(
event.delayMs,
this.ui,
(seconds) => {
this.retryLoader?.setMessage(retryMessage(seconds));
},
() => {
this.retryCountdown = undefined;
},
);
this.statusContainer.addChild(this.retryLoader);
this.ui.requestRender();
@@ -2611,6 +2629,10 @@ export class InteractiveMode {
this.defaultEditor.onEscape = this.retryEscapeHandler;
this.retryEscapeHandler = undefined;
}
if (this.retryCountdown) {
this.retryCountdown.dispose();
this.retryCountdown = undefined;
}
// Stop loader
if (this.retryLoader) {
this.retryLoader.stop();