117 lines · 2.9 KB · TypeScript
RawDownload
import { RequestError, type McpServer } from "@agentclientprotocol/sdk"import type { ACPSessionState } from "./types"import { Log } from "@/util/log"import type { OpenScienceClient } from "@synsci/sdk/v2" const log = Log.create({ service: "acp-session-manager" }) export class ACPSessionManager {  private sessions = new Map<string, ACPSessionState>()  private sdk: OpenScienceClient   constructor(sdk: OpenScienceClient) {    this.sdk = sdk  }   tryGet(sessionId: string): ACPSessionState | undefined {    return this.sessions.get(sessionId)  }   async create(cwd: string, mcpServers: McpServer[], model?: ACPSessionState["model"]): Promise<ACPSessionState> {    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  }   async load(    sessionId: string,    cwd: string,    mcpServers: McpServer[],    model?: ACPSessionState["model"],  ): Promise<ACPSessionState> {    const session = await this.sdk.session      .get(        {          sessionID: sessionId,          directory: cwd,        },        { throwOnError: true },      )      .then((x) => x.data!)     const resolvedModel = model     const state: ACPSessionState = {      id: sessionId,      cwd,      mcpServers,      createdAt: new Date(session.time.created),      model: resolvedModel,    }    log.info("loading_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  }   getVariant(sessionId: string) {    const session = this.get(sessionId)    return session.variant  }   setVariant(sessionId: string, variant?: string) {    const session = this.get(sessionId)    session.variant = variant    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  }}