From a9b3ee768aa7a658777ddf6b2ee386beedfa1456 Mon Sep 17 00:00:00 2001 From: Jay Yu Date: Wed, 26 Aug 2026 14:09:22 -0400 Subject: [PATCH] fix(coding-agent): keep evolution refresh available --- .../modes/interactive/components/evolution-menu.ts | 2 +- packages/coding-agent/test/evolution-menu.test.ts | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/coding-agent/src/modes/interactive/components/evolution-menu.ts b/packages/coding-agent/src/modes/interactive/components/evolution-menu.ts index 2e4d6e5c7..b53138339 100644 --- a/packages/coding-agent/src/modes/interactive/components/evolution-menu.ts +++ b/packages/coding-agent/src/modes/interactive/components/evolution-menu.ts @@ -323,7 +323,7 @@ export class EvolutionMenuComponent extends Container implements Focusable { const cancellableJob = [overview.activeJob, overview.newestResumableJob].find((job) => job?.cancellable === true) ?? null; return [ - { label: "Refresh", enabled: evolutionEnabled, select: () => void this.refresh() }, + { label: "Refresh", enabled: true, select: () => void this.refresh() }, { label: "Evolve", enabled: evolutionEnabled && overview.activeJob === null, diff --git a/packages/coding-agent/test/evolution-menu.test.ts b/packages/coding-agent/test/evolution-menu.test.ts index 8ffc4e0a5..c0547e124 100644 --- a/packages/coding-agent/test/evolution-menu.test.ts +++ b/packages/coding-agent/test/evolution-menu.test.ts @@ -357,7 +357,7 @@ describe("EvolutionMenuComponent", () => { component.dispose(); }); - it("persists the self-evolution toggle and disables every other action", async () => { + it("keeps durable refresh available when self-evolution is disabled", async () => { const fixture = client(overview()); const component = new EvolutionMenuComponent( fixture.client, @@ -375,9 +375,17 @@ describe("EvolutionMenuComponent", () => { const output = stripAnsi(component.render(180).join("\n")); expect(output).toContain("Toggle [off]"); expect(output).toContain("Next automatic evolution: Disabled"); - for (const action of ["Refresh", "Evolve", "View", "Resume", "Browse", "Rollback", "Cancel"]) { + expect(output).toContain("Refresh"); + expect(output).not.toContain("Refresh [unavailable]"); + for (const action of ["Evolve", "View", "Resume", "Browse", "Rollback", "Cancel"]) { expect(output).toContain(`${action} [unavailable]`); } + + const overviewCallsBeforeRefresh = fixture.overviewCall.mock.calls.length; + for (let index = 0; index < 7; index += 1) component.handleInput("\u001b[A"); + component.handleInput("\n"); + await vi.waitFor(() => expect(fixture.overviewCall).toHaveBeenCalledTimes(overviewCallsBeforeRefresh + 1)); + component.dispose(); }); it("polls durable job state without rendering removed diagnostics", async () => {