diff --git a/packages/pi-ai/src/providers/openai-codex-responses.ts b/packages/pi-ai/src/providers/openai-codex-responses.ts index e45a3eee6..fa130515b 100644 --- a/packages/pi-ai/src/providers/openai-codex-responses.ts +++ b/packages/pi-ai/src/providers/openai-codex-responses.ts @@ -438,7 +438,14 @@ async function* parseSSE(response: Response): AsyncGenerator {}) } catch {} + // Log stop failures to stderr for head/headless parity — interactive-mode logs its + // stop errors too. Exit code is already forced via process.exit, so logging is + // purely observability and doesn't change shutdown semantics. + try { + client.stop().catch((err: unknown) => { + process.stderr.write(`[headless] client.stop() rejected: ${err instanceof Error ? err.message : String(err)}\n`) + }) + } catch (err) { + process.stderr.write(`[headless] client.stop() threw: ${err instanceof Error ? err.message : String(err)}\n`) + } if (timeoutTimer) clearTimeout(timeoutTimer) if (idleTimer) clearTimeout(idleTimer) // Emit batch JSON result if in json mode before exiting diff --git a/src/web/cleanup-service.ts b/src/web/cleanup-service.ts index dd0d2c492..0975c1ec0 100644 --- a/src/web/cleanup-service.ts +++ b/src/web/cleanup-service.ts @@ -42,17 +42,17 @@ export async function collectCleanupData(projectCwdOverride?: string): Promise ({ name: b, merged: mergedSet.has(b) }));', // Get snapshot refs 'let refs = [];', - 'try { refs = mod.nativeForEachRef(basePath, "refs/sf/snapshots/"); } catch {}', + 'try { refs = mod.nativeForEachRef(basePath, "refs/sf/snapshots/"); } catch (e) { console.warn("[cleanup-service] nativeForEachRef failed:", e && e.message ? e.message : e); }', 'const snapshotList = refs.map(r => {', ' const parts = r.split(" ");', ' return { ref: parts[0] || r, date: parts.length > 1 ? parts.slice(1).join(" ") : "" };', diff --git a/src/web/undo-service.ts b/src/web/undo-service.ts index b38df2ee8..292e2c72a 100644 --- a/src/web/undo-service.ts +++ b/src/web/undo-service.ts @@ -163,7 +163,7 @@ export async function executeUndo(projectCwdOverride?: string): Promise