feat: Add ACP (Agent Client Protocol) support (#2947)

Co-authored-by: opencode-bot <devnull@opencode.local>
Co-authored-by: Dax Raad <d@ironbay.co>
Co-authored-by: GitHub Action <action@github.com>
This commit is contained in:
Joe Schmitt
2025-10-20 17:55:22 -04:00
committed by GitHub
parent 835fa9fb81
commit f3f21194ae
13 changed files with 991 additions and 160 deletions

View File

@@ -0,0 +1,60 @@
import type { McpServer } from "@zed-industries/agent-client-protocol"
import { Identifier } from "../id/id"
import { Session } from "../session"
import type { ACPSessionState } from "./types"
export class ACPSessionManager {
private sessions = new Map<string, ACPSessionState>()
async create(cwd: string, mcpServers: McpServer[]): Promise<ACPSessionState> {
const sessionId = `acp_${Identifier.ascending("session")}`
const openCodeSession = await Session.create({ title: `ACP Session ${sessionId}` })
const state: ACPSessionState = {
id: sessionId,
cwd,
mcpServers,
openCodeSessionId: openCodeSession.id,
createdAt: new Date(),
}
this.sessions.set(sessionId, state)
return state
}
get(sessionId: string): ACPSessionState | undefined {
return this.sessions.get(sessionId)
}
async remove(sessionId: string): Promise<void> {
const state = this.sessions.get(sessionId)
if (!state) return
await Session.remove(state.openCodeSessionId).catch(() => {})
this.sessions.delete(sessionId)
}
has(sessionId: string): boolean {
return this.sessions.has(sessionId)
}
async load(sessionId: string, cwd: string, mcpServers: McpServer[]): Promise<ACPSessionState> {
const existing = this.sessions.get(sessionId)
if (existing) {
return existing
}
const openCodeSession = await Session.create({ title: `ACP Session ${sessionId} (loaded)` })
const state: ACPSessionState = {
id: sessionId,
cwd,
mcpServers,
openCodeSessionId: openCodeSession.id,
createdAt: new Date(),
}
this.sessions.set(sessionId, state)
return state
}
}