From 967429cf29ab49ad495db96f13d402eb72f57f43 Mon Sep 17 00:00:00 2001 From: Flux Labs Date: Sun, 15 Mar 2026 09:22:07 -0500 Subject: [PATCH] fix: avoid ctx.log in gsd provider error recovery --- src/resources/extensions/gsd/index.ts | 4 +-- .../extensions/gsd/provider-error-pause.ts | 12 ++++++++ .../tests/agent-end-provider-error.test.ts | 29 +++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 src/resources/extensions/gsd/provider-error-pause.ts create mode 100644 src/resources/extensions/gsd/tests/agent-end-provider-error.test.ts diff --git a/src/resources/extensions/gsd/index.ts b/src/resources/extensions/gsd/index.ts index d51b59125..cae32ff21 100644 --- a/src/resources/extensions/gsd/index.ts +++ b/src/resources/extensions/gsd/index.ts @@ -53,6 +53,7 @@ import { join } from "node:path"; import { existsSync } from "node:fs"; import { shortcutDesc } from "../shared/terminal.js"; import { Text } from "@gsd/pi-tui"; +import { pauseAutoForProviderError } from "./provider-error-pause.js"; // ── Depth verification state ────────────────────────────────────────────── let depthVerificationDone = false; @@ -385,8 +386,7 @@ export default function (pi: ExtensionAPI) { } } - (ctx as any).log(`Auto-mode paused due to provider error${errorDetail}`); - await pauseAuto(ctx, pi); + await pauseAutoForProviderError(ctx.ui, errorDetail, () => pauseAuto(ctx, pi)); return; } diff --git a/src/resources/extensions/gsd/provider-error-pause.ts b/src/resources/extensions/gsd/provider-error-pause.ts new file mode 100644 index 000000000..4eded1a7c --- /dev/null +++ b/src/resources/extensions/gsd/provider-error-pause.ts @@ -0,0 +1,12 @@ +export type ProviderErrorPauseUI = { + notify(message: string, level: string): void; +}; + +export async function pauseAutoForProviderError( + ui: ProviderErrorPauseUI, + errorDetail: string, + pause: () => Promise, +): Promise { + ui.notify(`Auto-mode paused due to provider error${errorDetail}`, "warning"); + await pause(); +} diff --git a/src/resources/extensions/gsd/tests/agent-end-provider-error.test.ts b/src/resources/extensions/gsd/tests/agent-end-provider-error.test.ts new file mode 100644 index 000000000..2a5899c87 --- /dev/null +++ b/src/resources/extensions/gsd/tests/agent-end-provider-error.test.ts @@ -0,0 +1,29 @@ +import test from "node:test"; +import assert from "node:assert/strict"; + +import { pauseAutoForProviderError } from "../provider-error-pause.ts"; + +test("pauseAutoForProviderError warns and pauses without requiring ctx.log", async () => { + const notifications: Array<{ message: string; level: string }> = []; + let pauseCalls = 0; + + await pauseAutoForProviderError( + { + notify(message, level) { + notifications.push({ message, level }); + }, + }, + ": terminated", + async () => { + pauseCalls += 1; + }, + ); + + assert.equal(pauseCalls, 1, "should pause auto-mode exactly once"); + assert.deepEqual(notifications, [ + { + message: "Auto-mode paused due to provider error: terminated", + level: "warning", + }, + ]); +});