From ac20eab501618c3e2f693d5d1b958e0546fa7055 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sun, 5 Apr 2026 15:48:25 -0500 Subject: [PATCH] fix: address adversarial review findings for #3576 - Use `git reset --hard ` for rollback instead of `git branch -f` which fails on checked-out branches and worktrees - Clear pendingProviderRegistrations after preflush to prevent duplicate registration when bindCore() runs - Process Ollama stream content on terminal `done:true` chunks to avoid truncating trailing assistant text --- packages/pi-coding-agent/src/core/sdk.ts | 5 ++--- .../extensions/gsd/safety/git-checkpoint.ts | 18 ++++-------------- .../extensions/ollama/ollama-chat-provider.ts | 2 +- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/packages/pi-coding-agent/src/core/sdk.ts b/packages/pi-coding-agent/src/core/sdk.ts index 8d8f8cf04..74dc2a962 100644 --- a/packages/pi-coding-agent/src/core/sdk.ts +++ b/packages/pi-coding-agent/src/core/sdk.ts @@ -221,9 +221,8 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {} for (const { name, config } of extensionsForModelResolution.runtime.pendingProviderRegistrations) { modelRegistry.registerProvider(name, config); } - // Note: we do NOT clear pendingProviderRegistrations here — bindCore() will iterate - // an empty array harmlessly, and clearing here would require the runtime to track - // whether the flush already happened. + // Clear the queue so bindCore() doesn't re-register the same providers. + extensionsForModelResolution.runtime.pendingProviderRegistrations = []; // If still no model, use findInitialModel (checks settings default, then provider defaults) if (!model) { diff --git a/src/resources/extensions/gsd/safety/git-checkpoint.ts b/src/resources/extensions/gsd/safety/git-checkpoint.ts index 3658d0723..4f66b6dbb 100644 --- a/src/resources/extensions/gsd/safety/git-checkpoint.ts +++ b/src/resources/extensions/gsd/safety/git-checkpoint.ts @@ -72,20 +72,10 @@ export function rollbackToCheckpoint( return false; } - // Reset working tree - execFileSync("git", ["reset", "--hard"], { - cwd: basePath, - stdio: ["ignore", "pipe", "pipe"], - }); - - // Move branch pointer back to checkpoint - execFileSync("git", ["branch", "-f", branch, sha], { - cwd: basePath, - stdio: ["ignore", "pipe", "pipe"], - }); - - // Sync working tree with moved branch - execFileSync("git", ["reset", "--hard"], { + // Reset branch pointer and working tree to checkpoint SHA in one step. + // Using `git reset --hard ` works on the currently checked-out branch + // (unlike `git branch -f` which is rejected for checked-out branches). + execFileSync("git", ["reset", "--hard", sha], { cwd: basePath, stdio: ["ignore", "pipe", "pipe"], }); diff --git a/src/resources/extensions/ollama/ollama-chat-provider.ts b/src/resources/extensions/ollama/ollama-chat-provider.ts index f02361622..81e1de6f4 100644 --- a/src/resources/extensions/ollama/ollama-chat-provider.ts +++ b/src/resources/extensions/ollama/ollama-chat-provider.ts @@ -149,7 +149,7 @@ export function streamOllamaChat( // Handle text content — process independently of tool_calls // (a chunk may contain both content and tool_calls) const content = chunk.message?.content ?? ""; - if (content && !chunk.done) { + if (content) { if (thinkParser) { processChunks(thinkParser.push(content)); } else {