diff --git a/packages/opencode/src/acp/agent.ts b/packages/opencode/src/acp/agent.ts index af16cba114fe..1732251f9d16 100644 --- a/packages/opencode/src/acp/agent.ts +++ b/packages/opencode/src/acp/agent.ts @@ -189,6 +189,19 @@ export class Agent implements ACPAgent { private async handleEvent(event: Event) { switch (event.type) { + case "session.created": { + const info = event.properties.info + if (info.parentID) { + this.sessionManager.registerChild(event.properties.sessionID, info.parentID) + } + return + } + + case "session.deleted": { + this.sessionManager.unregisterChild(event.properties.sessionID) + return + } + case "permission.asked": { const permission = event.properties const session = this.sessionManager.tryGet(permission.sessionID) diff --git a/packages/opencode/src/acp/session.ts b/packages/opencode/src/acp/session.ts index d932b65701a4..8840ef00ccff 100644 --- a/packages/opencode/src/acp/session.ts +++ b/packages/opencode/src/acp/session.ts @@ -8,13 +8,32 @@ const log = Log.create({ service: "acp-session-manager" }) export class ACPSessionManager { private sessions = new Map() private sdk: OpencodeClient + private childToRoot = new Map() constructor(sdk: OpencodeClient) { this.sdk = sdk } tryGet(sessionId: string): ACPSessionState | undefined { - return this.sessions.get(sessionId) + const direct = this.sessions.get(sessionId) + if (direct) return direct + const rootId = this.childToRoot.get(sessionId) + if (rootId) return this.sessions.get(rootId) + return undefined + } + + registerChild(childSessionID: string, parentSessionID: string) { + const rootId = + this.childToRoot.get(parentSessionID) ?? + (this.sessions.has(parentSessionID) ? parentSessionID : undefined) + if (rootId) { + this.childToRoot.set(childSessionID, rootId) + log.info("registered child session", { child: childSessionID, root: rootId }) + } + } + + unregisterChild(childSessionID: string) { + this.childToRoot.delete(childSessionID) } async create(cwd: string, mcpServers: McpServer[], model?: ACPSessionState["model"]): Promise {