From 98425ab6bc9c86af04f0822cb4d5249823bb1138 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Mon, 2 Feb 2026 18:57:28 +0700 Subject: [PATCH] feat: add branch validation handler to session --- packages/server/src/server/session.ts | 79 +++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/packages/server/src/server/session.ts b/packages/server/src/server/session.ts index 201439867..640d9d194 100644 --- a/packages/server/src/server/session.ts +++ b/packages/server/src/server/session.ts @@ -870,6 +870,10 @@ export class Session { await this.handleCheckoutStatusRequest(msg); break; + case "validate_branch_request": + await this.handleValidateBranchRequest(msg); + break; + case "checkout_diff_request": await this.handleCheckoutDiffRequest(msg); break; @@ -2515,6 +2519,81 @@ export class Session { } } + private async handleValidateBranchRequest( + msg: Extract + ): Promise { + const { cwd, branchName, requestId } = msg; + + try { + const resolvedCwd = expandTilde(cwd); + + // Try local branch first + try { + await execAsync(`git rev-parse --verify ${branchName}`, { + cwd: resolvedCwd, + env: READ_ONLY_GIT_ENV, + }); + this.emit({ + type: "validate_branch_response", + payload: { + exists: true, + resolvedRef: branchName, + isRemote: false, + error: null, + requestId, + }, + }); + return; + } catch { + // Local branch doesn't exist, try remote + } + + // Try remote branch (origin/{branchName}) + try { + await execAsync(`git rev-parse --verify origin/${branchName}`, { + cwd: resolvedCwd, + env: READ_ONLY_GIT_ENV, + }); + this.emit({ + type: "validate_branch_response", + payload: { + exists: true, + resolvedRef: `origin/${branchName}`, + isRemote: true, + error: null, + requestId, + }, + }); + return; + } catch { + // Remote branch doesn't exist either + } + + // Branch not found anywhere + this.emit({ + type: "validate_branch_response", + payload: { + exists: false, + resolvedRef: null, + isRemote: false, + error: null, + requestId, + }, + }); + } catch (error) { + this.emit({ + type: "validate_branch_response", + payload: { + exists: false, + resolvedRef: null, + isRemote: false, + error: error instanceof Error ? error.message : String(error), + requestId, + }, + }); + } + } + private async handleCheckoutDiffRequest( msg: Extract ): Promise {