Skip to content

Commit 5b43c13

Browse files
authored
fix(acp): restore session metadata on resuming (#2915)
1 parent 66533e8 commit 5b43c13

2 files changed

Lines changed: 76 additions & 11 deletions

File tree

lua/codecompanion/acp/init.lua

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -362,12 +362,25 @@ function Connection:_establish_session()
362362
session_args.mcpServers = require("codecompanion.mcp").transform_to_acp()
363363
end
364364

365+
local function apply_session_metadata(session_data, source)
366+
if session_data.modes then
367+
self._modes = session_data.modes
368+
log:debug("[acp::_establish_session] %s modes: %s", source, session_data.modes)
369+
end
370+
if session_data.models then
371+
self._models = session_data.models
372+
log:debug("[acp::_establish_session] %s models: %s", source, session_data.models)
373+
end
374+
end
375+
365376
if self.session_id and can_load then
366-
local ok = self:send_rpc_request(
377+
local loaded_session = self:send_rpc_request(
367378
METHODS.SESSION_LOAD,
368379
vim.tbl_extend("force", session_args, { sessionId = self.session_id })
369380
)
370-
if ok == nil then
381+
if loaded_session then
382+
apply_session_metadata(loaded_session, "Loaded session")
383+
else
371384
can_load = false
372385
end
373386
end
@@ -379,15 +392,7 @@ function Connection:_establish_session()
379392
return false
380393
end
381394
self.session_id = new_session.sessionId
382-
383-
if new_session.modes then
384-
self._modes = new_session.modes
385-
log:debug("[acp::_establish_session] Available modes: %s", new_session.modes)
386-
end
387-
if new_session.models then
388-
self._models = new_session.models
389-
log:debug("[acp::_establish_session] Available models: %s", new_session.models)
390-
end
395+
apply_session_metadata(new_session, "New session")
391396
end
392397

393398
return true

tests/acp/test_acp.lua

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,66 @@ T["ACP Connection"]["uses session/load when agent supports it"] = function()
189189
h.eq(result.session_id, "prev-session")
190190
end
191191

192+
T["ACP Connection"]["session/load restores modes and models metadata"] = function()
193+
local result = child.lua([[
194+
local connection = create_init_connection()
195+
connection.session_id = "prev-session"
196+
function connection:send_rpc_request(method, params)
197+
if method == "initialize" then
198+
return { protocolVersion = 1, authMethods = {}, agentCapabilities = { loadSession = true } }
199+
elseif method == "session/load" then
200+
return {
201+
modes = { { id = "code", name = "Code" }, { id = "ask", name = "Ask" } },
202+
models = { { id = "claude-sonnet", name = "Claude Sonnet" } },
203+
}
204+
end
205+
end
206+
207+
local ok = connection:connect_and_initialize()
208+
return {
209+
ok = ok ~= nil,
210+
modes = connection._modes,
211+
models = connection._models,
212+
}
213+
]])
214+
215+
h.eq(result.ok, true)
216+
h.eq(#result.modes, 2)
217+
h.eq(result.modes[1].id, "code")
218+
h.eq(#result.models, 1)
219+
h.eq(result.models[1].id, "claude-sonnet")
220+
end
221+
222+
T["ACP Connection"]["session/new stores modes and models metadata"] = function()
223+
local result = child.lua([[
224+
local connection = create_init_connection()
225+
function connection:send_rpc_request(method, params)
226+
if method == "initialize" then
227+
return { protocolVersion = 1, authMethods = {}, agentCapabilities = { loadSession = false } }
228+
elseif method == "session/new" then
229+
return {
230+
sessionId = "new-session",
231+
modes = { { id = "agent", name = "Agent" } },
232+
models = { { id = "claude-opus", name = "Claude Opus" } },
233+
}
234+
end
235+
end
236+
237+
local ok = connection:connect_and_initialize()
238+
return {
239+
ok = ok ~= nil,
240+
modes = connection._modes,
241+
models = connection._models,
242+
}
243+
]])
244+
245+
h.eq(result.ok, true)
246+
h.eq(#result.modes, 1)
247+
h.eq(result.modes[1].id, "agent")
248+
h.eq(#result.models, 1)
249+
h.eq(result.models[1].id, "claude-opus")
250+
end
251+
192252
T["ACP Connection"]["falls back to session/new if session/load fails"] = function()
193253
local result = child.lua([[
194254
local calls = {}

0 commit comments

Comments
 (0)