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
This commit is contained in:
Mario Zechner 2026-02-04 13:22:43 +01:00
parent b1c2c95f23
commit 13ac63c3cd
3 changed files with 9 additions and 6 deletions

View file

@ -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);
}

View file

@ -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;
}

View file

@ -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]);