From 13ac63c3cd2e5dd132cdf01b91afe5c488b0a8a3 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Wed, 4 Feb 2026 13:22:43 +0100 Subject: [PATCH] fix(coding-agent): fork writes to new session file, not parent (fixes #1242) - Store previousSessionFile before creating branched session - Update sessionFile after writing new branch file - Pass parentSession when forking from first message - Add --local to git config in tests to prevent repo escape --- packages/coding-agent/src/core/agent-session.ts | 2 +- packages/coding-agent/src/core/session-manager.ts | 5 ++++- packages/coding-agent/test/git-update.test.ts | 8 ++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/coding-agent/src/core/agent-session.ts b/packages/coding-agent/src/core/agent-session.ts index fe450e5e..54dbb1a8 100644 --- a/packages/coding-agent/src/core/agent-session.ts +++ b/packages/coding-agent/src/core/agent-session.ts @@ -2370,7 +2370,7 @@ export class AgentSession { this._pendingNextTurnMessages = []; if (!selectedEntry.parentId) { - this.sessionManager.newSession(); + this.sessionManager.newSession({ parentSession: previousSessionFile }); } else { this.sessionManager.createBranchedSession(selectedEntry.parentId); } diff --git a/packages/coding-agent/src/core/session-manager.ts b/packages/coding-agent/src/core/session-manager.ts index b8c74c69..839a9e9b 100644 --- a/packages/coding-agent/src/core/session-manager.ts +++ b/packages/coding-agent/src/core/session-manager.ts @@ -1150,6 +1150,7 @@ export class SessionManager { * Returns the new session file path, or undefined if not persisting. */ createBranchedSession(leafId: string): string | undefined { + const previousSessionFile = this.sessionFile; const path = this.getBranch(leafId); if (path.length === 0) { throw new Error(`Entry ${leafId} not found`); @@ -1169,7 +1170,7 @@ export class SessionManager { id: newSessionId, timestamp, cwd: this.cwd, - parentSession: this.persist ? this.sessionFile : undefined, + parentSession: this.persist ? previousSessionFile : undefined, }; // Collect labels for entries in the path @@ -1206,6 +1207,8 @@ export class SessionManager { } this.fileEntries = [header, ...pathWithoutLabels, ...labelEntries]; this.sessionId = newSessionId; + this.sessionFile = newSessionFile; + this.flushed = true; this._buildIndex(); return newSessionFile; } diff --git a/packages/coding-agent/test/git-update.test.ts b/packages/coding-agent/test/git-update.test.ts index 72e6bdc9..c79521dc 100644 --- a/packages/coding-agent/test/git-update.test.ts +++ b/packages/coding-agent/test/git-update.test.ts @@ -88,15 +88,15 @@ describe("DefaultPackageManager git update", () => { // Create "remote" repository mkdirSync(remoteDir, { recursive: true }); git(["init"], remoteDir); - git(["config", "user.email", "test@test.com"], remoteDir); - git(["config", "user.name", "Test"], remoteDir); + git(["config", "--local", "user.email", "test@test.com"], remoteDir); + git(["config", "--local", "user.name", "Test"], remoteDir); createCommit(remoteDir, "extension.ts", "// v1", "Initial commit"); // Clone to installed directory (simulating what install() does) mkdirSync(join(agentDir, "git", "github.com", "test"), { recursive: true }); git(["clone", remoteDir, installedDir], tempDir); - git(["config", "user.email", "test@test.com"], installedDir); - git(["config", "user.name", "Test"], installedDir); + git(["config", "--local", "user.email", "test@test.com"], installedDir); + git(["config", "--local", "user.name", "Test"], installedDir); // Add to global packages so update() processes this source settingsManager.setPackages([gitSource]);