fix(coding-agent): add live retry countdown\n\ncloses #3187
This commit is contained in:
@@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed interactive auto-retry status updates to show a live countdown during backoff instead of a static retry delay message ([#3187](https://github.com/badlogic/pi-mono/issues/3187))
|
||||||
|
|
||||||
## [0.67.2] - 2026-04-14
|
## [0.67.2] - 2026-04-14
|
||||||
|
|
||||||
### New Features
|
### New Features
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ import { BashExecutionComponent } from "./components/bash-execution.js";
|
|||||||
import { BorderedLoader } from "./components/bordered-loader.js";
|
import { BorderedLoader } from "./components/bordered-loader.js";
|
||||||
import { BranchSummaryMessageComponent } from "./components/branch-summary-message.js";
|
import { BranchSummaryMessageComponent } from "./components/branch-summary-message.js";
|
||||||
import { CompactionSummaryMessageComponent } from "./components/compaction-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 { CustomEditor } from "./components/custom-editor.js";
|
||||||
import { CustomMessageComponent } from "./components/custom-message.js";
|
import { CustomMessageComponent } from "./components/custom-message.js";
|
||||||
import { DaxnutsComponent } from "./components/daxnuts.js";
|
import { DaxnutsComponent } from "./components/daxnuts.js";
|
||||||
@@ -227,6 +228,7 @@ export class InteractiveMode {
|
|||||||
|
|
||||||
// Auto-retry state
|
// Auto-retry state
|
||||||
private retryLoader: Loader | undefined = undefined;
|
private retryLoader: Loader | undefined = undefined;
|
||||||
|
private retryCountdown: CountdownTimer | undefined = undefined;
|
||||||
private retryEscapeHandler?: () => void;
|
private retryEscapeHandler?: () => void;
|
||||||
|
|
||||||
// Messages queued while compaction is running
|
// Messages queued while compaction is running
|
||||||
@@ -2337,6 +2339,10 @@ export class InteractiveMode {
|
|||||||
this.defaultEditor.onEscape = this.retryEscapeHandler;
|
this.defaultEditor.onEscape = this.retryEscapeHandler;
|
||||||
this.retryEscapeHandler = undefined;
|
this.retryEscapeHandler = undefined;
|
||||||
}
|
}
|
||||||
|
if (this.retryCountdown) {
|
||||||
|
this.retryCountdown.dispose();
|
||||||
|
this.retryCountdown = undefined;
|
||||||
|
}
|
||||||
if (this.retryLoader) {
|
if (this.retryLoader) {
|
||||||
this.retryLoader.stop();
|
this.retryLoader.stop();
|
||||||
this.retryLoader = undefined;
|
this.retryLoader = undefined;
|
||||||
@@ -2593,12 +2599,24 @@ export class InteractiveMode {
|
|||||||
};
|
};
|
||||||
// Show retry indicator
|
// Show retry indicator
|
||||||
this.statusContainer.clear();
|
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.retryLoader = new Loader(
|
||||||
this.ui,
|
this.ui,
|
||||||
(spinner) => theme.fg("warning", spinner),
|
(spinner) => theme.fg("warning", spinner),
|
||||||
(text) => theme.fg("muted", text),
|
(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.statusContainer.addChild(this.retryLoader);
|
||||||
this.ui.requestRender();
|
this.ui.requestRender();
|
||||||
@@ -2611,6 +2629,10 @@ export class InteractiveMode {
|
|||||||
this.defaultEditor.onEscape = this.retryEscapeHandler;
|
this.defaultEditor.onEscape = this.retryEscapeHandler;
|
||||||
this.retryEscapeHandler = undefined;
|
this.retryEscapeHandler = undefined;
|
||||||
}
|
}
|
||||||
|
if (this.retryCountdown) {
|
||||||
|
this.retryCountdown.dispose();
|
||||||
|
this.retryCountdown = undefined;
|
||||||
|
}
|
||||||
// Stop loader
|
// Stop loader
|
||||||
if (this.retryLoader) {
|
if (this.retryLoader) {
|
||||||
this.retryLoader.stop();
|
this.retryLoader.stop();
|
||||||
|
|||||||
Reference in New Issue
Block a user