From da72d0d6ee689c7ef15bfd7075c91d7c7583b90b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Tue, 24 Feb 2026 14:20:59 +0000 Subject: [PATCH] Fixed semantic conflict between #377 and #354 (#380) * Move out checking out PRs from `etupGit` (#377 intent) * Keep subagent-related changes from #377 --- entry | 16 ++++++---------- mcp/server.ts | 23 +++++++++++++++++------ utils/setup.ts | 20 +++----------------- 3 files changed, 26 insertions(+), 33 deletions(-) diff --git a/entry b/entry index 0bd3792..753f504 100755 --- a/entry +++ b/entry @@ -144201,7 +144201,7 @@ function initToolState(params) { return { progressCommentId: resolvedId, subagents: /* @__PURE__ */ new Map(), - activeSubagentId: void 0, + selfSubagentId: void 0, backgroundProcesses: /* @__PURE__ */ new Map(), usageEntries: [] }; @@ -144379,12 +144379,13 @@ async function startMcpHttpServer(ctx) { } }; } -async function startSubagentMcpServer(ctx) { +async function startSubagentMcpServer(params) { const subagentToolState = { - ...ctx.toolState, + ...params.ctx.toolState, + selfSubagentId: params.subagentId, backgroundProcesses: /* @__PURE__ */ new Map() }; - const subagentCtx = { ...ctx, toolState: subagentToolState }; + const subagentCtx = { ...params.ctx, toolState: subagentToolState }; const tools = buildSubagentTools(subagentCtx); const startResult = await selectMcpPort(subagentCtx, tools); return { url: startResult.url, stop: () => startResult.server.stop() }; @@ -147464,12 +147465,7 @@ async function setupGit(params) { $("git", ["remote", "set-url", "origin", originUrl], { cwd: repoDir }); params.toolState.pushUrl = originUrl; $("git", ["config", "--local", "credential.helper", ""], { cwd: repoDir }); - if (params.event.is_pr !== true || !params.event.issue_number) { - log.info("\xBB git authentication configured"); - return; - } - const prNumber = params.event.issue_number; - await checkoutPrBranch(prNumber, params); + log.info("\xBB git authentication configured"); } // utils/time.ts diff --git a/mcp/server.ts b/mcp/server.ts index 101d7bb..815aa1a 100644 --- a/mcp/server.ts +++ b/mcp/server.ts @@ -25,6 +25,7 @@ export type SubagentStatus = "running" | "completed" | "failed"; export type SubagentState = { id: string; + label: string; status: SubagentStatus; mode: string; stdoutFilePath: string; @@ -46,8 +47,9 @@ export interface ToolState { selectedMode?: string; // per-subagent lifecycle tracking (keyed by subagent uuid) subagents: Map; - // set while a subagent is running — routes set_output to the correct subagent and prevents nesting - activeSubagentId: string | undefined; + // only set on subagent shallow copies — routes set_output to the owning subagent. + // never set on the orchestrator's shared state. + selfSubagentId: string | undefined; backgroundProcesses: Map; review?: { id: number; @@ -81,7 +83,7 @@ export function initToolState(params: InitToolStateParams): ToolState { return { progressCommentId: resolvedId, subagents: new Map(), - activeSubagentId: undefined, + selfSubagentId: undefined, backgroundProcesses: new Map(), usageEntries: [], }; @@ -391,21 +393,30 @@ export type ManagedMcpServer = { stop: () => Promise; }; +type StartSubagentMcpServerParams = { + ctx: ToolContext; + subagentId: string; +}; + /** * Start a per-subagent MCP server (common tools only — no push/PR/delegation). * Each subagent gets its own server; call stop() when the subagent completes. * * The subagent gets its own shallow copy of toolState so scalar writes * (pushUrl, pushDest, selectedMode, etc.) don't mutate the orchestrator's state. + * selfSubagentId is set on the copy so set_output routes to the correct subagent. * Shared references (subagents Map, usageEntries array, dependencyInstallation) * are intentionally shared for coordination (set_output routing, usage tracking). */ -export async function startSubagentMcpServer(ctx: ToolContext): Promise { +export async function startSubagentMcpServer( + params: StartSubagentMcpServerParams +): Promise { const subagentToolState: ToolState = { - ...ctx.toolState, + ...params.ctx.toolState, + selfSubagentId: params.subagentId, backgroundProcesses: new Map(), }; - const subagentCtx: ToolContext = { ...ctx, toolState: subagentToolState }; + const subagentCtx: ToolContext = { ...params.ctx, toolState: subagentToolState }; const tools = buildSubagentTools(subagentCtx); const startResult = await selectMcpPort(subagentCtx, tools); return { url: startResult.url, stop: () => startResult.server.stop() }; diff --git a/utils/setup.ts b/utils/setup.ts index 4cd4f2c..2e5ba5e 100644 --- a/utils/setup.ts +++ b/utils/setup.ts @@ -2,8 +2,7 @@ import { execSync } from "node:child_process"; import { mkdtempSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; -import type { PayloadEvent, ShellPermission } from "../external.ts"; -import { checkoutPrBranch } from "../mcp/checkout.ts"; +import type { ShellPermission } from "../external.ts"; import type { ToolState } from "../mcp/server.ts"; import { log } from "./cli.ts"; import type { OctokitWithPlugins } from "./github.ts"; @@ -59,9 +58,7 @@ export interface GitContext { postCheckoutScript: string | null; } -export interface SetupGitParams extends GitContext { - event: PayloadEvent; -} +export type SetupGitParams = GitContext; /** * setup git configuration and authentication for the repository. @@ -170,16 +167,5 @@ export async function setupGit(params: SetupGitParams): Promise { // disable credential helpers to prevent prompts and ensure clean auth state $("git", ["config", "--local", "credential.helper", ""], { cwd: repoDir }); - // non-PR events: stay on default branch - if (params.event.is_pr !== true || !params.event.issue_number) { - log.info("» git authentication configured"); - return; - } - - // PR event: checkout PR branch using shared helper - const prNumber = params.event.issue_number; - - // use shared checkout helper (handles fork remotes, push config, post-checkout hook) - // this updates toolState.pushUrl for fork PRs and sets toolState.issueNumber - await checkoutPrBranch(prNumber, params); + log.info("» git authentication configured"); }