|
@@ -83,6 +83,7 @@ export function make(input: {
|
|
|
const session = input.session ?? makeSessionService()
|
|
const session = input.session ?? makeSessionService()
|
|
|
const directoryService = input.directory ?? makeDirectoryService(input.sdk)
|
|
const directoryService = input.directory ?? makeDirectoryService(input.sdk)
|
|
|
const registeredMcp = new Map<string, Set<string>>()
|
|
const registeredMcp = new Map<string, Set<string>>()
|
|
|
|
|
+ const sessionSnapshots = new Map<string, Directory.Snapshot>()
|
|
|
const events = input.connection
|
|
const events = input.connection
|
|
|
? ACPNextEvent.start({ sdk: input.sdk, connection: input.connection, session })
|
|
? ACPNextEvent.start({ sdk: input.sdk, connection: input.connection, session })
|
|
|
: undefined
|
|
: undefined
|
|
@@ -149,6 +150,14 @@ export function make(input: {
|
|
|
return snapshot
|
|
return snapshot
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
+ const configSnapshot = Effect.fn("ACPNext.configSnapshot")(function* (state: ACPNextSession.Info) {
|
|
|
|
|
+ const snapshot = sessionSnapshots.get(state.id)
|
|
|
|
|
+ if (snapshot) return snapshot
|
|
|
|
|
+ const loaded = yield* directorySnapshot(state.cwd)
|
|
|
|
|
+ sessionSnapshots.set(state.id, loaded)
|
|
|
|
|
+ return loaded
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
const newSession = Effect.fn("ACPNext.newSession")(function* (params: NewSessionRequest) {
|
|
const newSession = Effect.fn("ACPNext.newSession")(function* (params: NewSessionRequest) {
|
|
|
const started = performance.now()
|
|
const started = performance.now()
|
|
|
const snapshot = yield* directorySnapshot(params.cwd)
|
|
const snapshot = yield* directorySnapshot(params.cwd)
|
|
@@ -180,6 +189,7 @@ export function make(input: {
|
|
|
variant,
|
|
variant,
|
|
|
modeId,
|
|
modeId,
|
|
|
})
|
|
})
|
|
|
|
|
+ sessionSnapshots.set(state.id, snapshot)
|
|
|
|
|
|
|
|
yield* registerMcpServers(input.sdk, registeredMcp, params.cwd, state.id, params.mcpServers)
|
|
yield* registerMcpServers(input.sdk, registeredMcp, params.cwd, state.id, params.mcpServers)
|
|
|
yield* sendAvailableCommands(input.connection, state.id, snapshot)
|
|
yield* sendAvailableCommands(input.connection, state.id, snapshot)
|
|
@@ -220,6 +230,7 @@ export function make(input: {
|
|
|
variant: restored.variant ?? selectVariant(snapshot, model),
|
|
variant: restored.variant ?? selectVariant(snapshot, model),
|
|
|
modeId: restored.modeId ?? (snapshot.availableModes.length > 0 ? snapshot.defaultModeID : undefined),
|
|
modeId: restored.modeId ?? (snapshot.availableModes.length > 0 ? snapshot.defaultModeID : undefined),
|
|
|
})
|
|
})
|
|
|
|
|
+ sessionSnapshots.set(state.id, snapshot)
|
|
|
|
|
|
|
|
yield* registerMcpServers(input.sdk, registeredMcp, params.cwd, state.id, params.mcpServers)
|
|
yield* registerMcpServers(input.sdk, registeredMcp, params.cwd, state.id, params.mcpServers)
|
|
|
yield* sendAvailableCommands(input.connection, state.id, snapshot)
|
|
yield* sendAvailableCommands(input.connection, state.id, snapshot)
|
|
@@ -290,6 +301,7 @@ export function make(input: {
|
|
|
variant: restored.variant ?? selectVariant(snapshot, model),
|
|
variant: restored.variant ?? selectVariant(snapshot, model),
|
|
|
modeId: restored.modeId ?? (snapshot.availableModes.length > 0 ? snapshot.defaultModeID : undefined),
|
|
modeId: restored.modeId ?? (snapshot.availableModes.length > 0 ? snapshot.defaultModeID : undefined),
|
|
|
})
|
|
})
|
|
|
|
|
+ sessionSnapshots.set(state.id, snapshot)
|
|
|
|
|
|
|
|
yield* registerMcpServers(input.sdk, registeredMcp, params.cwd, state.id, params.mcpServers ?? [])
|
|
yield* registerMcpServers(input.sdk, registeredMcp, params.cwd, state.id, params.mcpServers ?? [])
|
|
|
yield* sendAvailableCommands(input.connection, state.id, snapshot)
|
|
yield* sendAvailableCommands(input.connection, state.id, snapshot)
|
|
@@ -307,6 +319,7 @@ export function make(input: {
|
|
|
const closeSession = Effect.fn("ACPNext.closeSession")(function* (params: CloseSessionRequest) {
|
|
const closeSession = Effect.fn("ACPNext.closeSession")(function* (params: CloseSessionRequest) {
|
|
|
const removed = yield* session.remove(params.sessionId)
|
|
const removed = yield* session.remove(params.sessionId)
|
|
|
registeredMcp.delete(params.sessionId)
|
|
registeredMcp.delete(params.sessionId)
|
|
|
|
|
+ sessionSnapshots.delete(params.sessionId)
|
|
|
if (!removed) return {}
|
|
if (!removed) return {}
|
|
|
|
|
|
|
|
yield* request(
|
|
yield* request(
|
|
@@ -350,6 +363,7 @@ export function make(input: {
|
|
|
variant: restored.variant ?? selectVariant(snapshot, model),
|
|
variant: restored.variant ?? selectVariant(snapshot, model),
|
|
|
modeId: restored.modeId ?? (snapshot.availableModes.length > 0 ? snapshot.defaultModeID : undefined),
|
|
modeId: restored.modeId ?? (snapshot.availableModes.length > 0 ? snapshot.defaultModeID : undefined),
|
|
|
})
|
|
})
|
|
|
|
|
+ sessionSnapshots.set(state.id, snapshot)
|
|
|
|
|
|
|
|
yield* registerMcpServers(input.sdk, registeredMcp, params.cwd, state.id, params.mcpServers ?? [])
|
|
yield* registerMcpServers(input.sdk, registeredMcp, params.cwd, state.id, params.mcpServers ?? [])
|
|
|
yield* sendAvailableCommands(input.connection, state.id, snapshot)
|
|
yield* sendAvailableCommands(input.connection, state.id, snapshot)
|
|
@@ -369,7 +383,7 @@ export function make(input: {
|
|
|
params: SetSessionConfigOptionRequest,
|
|
params: SetSessionConfigOptionRequest,
|
|
|
) {
|
|
) {
|
|
|
const current = yield* session.get(params.sessionId)
|
|
const current = yield* session.get(params.sessionId)
|
|
|
- const snapshot = yield* directorySnapshot(current.cwd)
|
|
|
|
|
|
|
+ const snapshot = yield* configSnapshot(current)
|
|
|
if (typeof params.value !== "string") {
|
|
if (typeof params.value !== "string") {
|
|
|
return yield* new ACPNextError.InvalidConfigOptionError({ configId: params.configId })
|
|
return yield* new ACPNextError.InvalidConfigOptionError({ configId: params.configId })
|
|
|
}
|
|
}
|
|
@@ -424,7 +438,7 @@ export function make(input: {
|
|
|
|
|
|
|
|
const setSessionMode = Effect.fn("ACPNext.setSessionMode")(function* (params: SetSessionModeRequest) {
|
|
const setSessionMode = Effect.fn("ACPNext.setSessionMode")(function* (params: SetSessionModeRequest) {
|
|
|
const current = yield* session.get(params.sessionId)
|
|
const current = yield* session.get(params.sessionId)
|
|
|
- const snapshot = yield* directorySnapshot(current.cwd)
|
|
|
|
|
|
|
+ const snapshot = yield* configSnapshot(current)
|
|
|
if (!snapshot.availableModes.some((mode) => mode.id === params.modeId)) {
|
|
if (!snapshot.availableModes.some((mode) => mode.id === params.modeId)) {
|
|
|
return yield* new ACPNextError.InvalidModeError({ mode: params.modeId })
|
|
return yield* new ACPNextError.InvalidModeError({ mode: params.modeId })
|
|
|
}
|
|
}
|
|
@@ -434,7 +448,7 @@ export function make(input: {
|
|
|
|
|
|
|
|
const setSessionModel = Effect.fn("ACPNext.setSessionModel")(function* (params: SetSessionModelRequest) {
|
|
const setSessionModel = Effect.fn("ACPNext.setSessionModel")(function* (params: SetSessionModelRequest) {
|
|
|
const current = yield* session.get(params.sessionId)
|
|
const current = yield* session.get(params.sessionId)
|
|
|
- const snapshot = yield* directorySnapshot(current.cwd)
|
|
|
|
|
|
|
+ const snapshot = yield* configSnapshot(current)
|
|
|
const selected = yield* parseSelectedModel(snapshot, params.modelId)
|
|
const selected = yield* parseSelectedModel(snapshot, params.modelId)
|
|
|
yield* session
|
|
yield* session
|
|
|
.setVariant(
|
|
.setVariant(
|