| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- import { RequestError, type McpServer } from "@agentclientprotocol/sdk"
- import type { ACPSessionState } from "./types"
- import { Log } from "@/util/log"
- import type { OpencodeClient } from "@opencode-ai/sdk"
- const log = Log.create({ service: "acp-session-manager" })
- export class ACPSessionManager {
- private sessions = new Map<string, ACPSessionState>()
- private sdk: OpencodeClient
- constructor(sdk: OpencodeClient) {
- this.sdk = sdk
- }
- async create(
- cwd: string,
- mcpServers: McpServer[],
- model?: ACPSessionState["model"],
- ): Promise<ACPSessionState> {
- const session = await this.sdk.session
- .create({
- body: {
- title: `ACP Session ${crypto.randomUUID()}`,
- },
- query: {
- 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
- }
- }
|