rework acp to compensate for changes in Zed IDE (#4050)

This commit is contained in:
Aiden Cline
2025-11-07 11:57:12 -08:00
committed by GitHub
parent b46c3f2a26
commit 73cd8a334c
10 changed files with 621 additions and 361 deletions

View File

@@ -1,66 +1,74 @@
import type { McpServer } from "@agentclientprotocol/sdk"
import { Session } from "../session"
import { Provider } from "../provider/provider"
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 Session.create({ title: `ACP Session ${crypto.randomUUID()}` })
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 ?? (await Provider.defaultModel())
const resolvedModel = model
const state: ACPSessionState = {
id: sessionId,
parentId: session.parentID,
cwd,
mcpServers,
createdAt: new Date(),
model: resolvedModel,
}
log.info("creating_session", { state })
this.sessions.set(sessionId, state)
return state
}
get(sessionId: string) {
return this.sessions.get(sessionId)
}
async remove(sessionId: string) {
const state = this.sessions.get(sessionId)
if (!state) return
await Session.remove(sessionId).catch(() => {})
this.sessions.delete(sessionId)
}
has(sessionId: string) {
return this.sessions.has(sessionId)
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.sessions.get(sessionId)
if (!session) return
const session = this.get(sessionId)
return session.model
}
setModel(sessionId: string, model: ACPSessionState["model"]) {
const session = this.sessions.get(sessionId)
if (!session) return
const session = this.get(sessionId)
session.model = model
this.sessions.set(sessionId, session)
return session
}
setMode(sessionId: string, modeId: string) {
const session = this.sessions.get(sessionId)
if (!session) return
const session = this.get(sessionId)
session.modeId = modeId
this.sessions.set(sessionId, session)
return session