import { RequestError, type McpServer } from "@agentclientprotocol/sdk" import type { ACPSessionState } from "./types" import { Log } from "@/util/log" import type { OpencodeClient } from "@opencode-ai/sdk/v2" const log = Log.create({ service: "acp-session-manager" }) export class ACPSessionManager { private sessions = new Map() private sdk: OpencodeClient constructor(sdk: OpencodeClient) { this.sdk = sdk } async create(cwd: string, mcpServers: McpServer[], model?: ACPSessionState["model"]): Promise { const session = await this.sdk.session .create( { title: `ACP Session ${crypto.randomUUID()}`, directory: cwd, }, { throwOnError: true }, ) .then((x) => x.data!) const sessionId = session.id const resolvedModel = model const state: ACPSessionState = { id: sessionId, cwd, mcpServers, createdAt: new Date(), model: resolvedModel, } log.info("creating_session", { state }) this.sessions.set(sessionId, state) return state } get(sessionId: string): ACPSessionState { const session = this.sessions.get(sessionId) if (!session) { log.error("session not found", { sessionId }) throw RequestError.invalidParams(JSON.stringify({ error: `Session not found: ${sessionId}` })) } return session } getModel(sessionId: string) { const session = this.get(sessionId) return session.model } setModel(sessionId: string, model: ACPSessionState["model"]) { const session = this.get(sessionId) session.model = model this.sessions.set(sessionId, session) return session } setMode(sessionId: string, modeId: string) { const session = this.get(sessionId) session.modeId = modeId this.sessions.set(sessionId, session) return session } }