Merge pull request #8615 from Kilo-Org/deadpan-agenda

fix(vscode): sync mode picker from assistant messages too
This commit is contained in:
Kirill Kalishev
2026-04-09 09:30:44 -04:00
committed by GitHub
3 changed files with 30 additions and 13 deletions
@@ -26,13 +26,22 @@ describe("resolveSessionAgent", () => {
expect(result).toBe("code")
})
it("ignores assistant messages", () => {
it("returns the latest assistant agent when it is last", () => {
const result = resolveSessionAgent(
[makeMessage({ role: "assistant", agent: "code" }), makeMessage({ agent: "plan" })],
[makeMessage({ agent: "plan" }), makeMessage({ role: "assistant", agent: "code" })],
new Set(["plan", "code"]),
)
expect(result).toBe("plan")
expect(result).toBe("code")
})
it("ignores unknown agent names on assistant messages", () => {
const result = resolveSessionAgent(
[makeMessage({ agent: "code" }), makeMessage({ role: "assistant", agent: "task" })],
new Set(["code"]),
)
expect(result).toBe("code")
})
it("ignores unknown agent names", () => {
@@ -49,9 +58,18 @@ describe("resolveSessionAgent", () => {
expect(result).toBeUndefined()
})
it("returns undefined when no valid user agent exists", () => {
it("returns agent from assistant when no user has agent", () => {
const result = resolveSessionAgent(
[makeMessage({ role: "assistant", agent: "code" }), makeMessage({ agent: undefined })],
[makeMessage({ agent: undefined }), makeMessage({ role: "assistant", agent: "code" })],
new Set(["code"]),
)
expect(result).toBe("code")
})
it("returns undefined when no message has a valid agent", () => {
const result = resolveSessionAgent(
[makeMessage({ agent: undefined }), makeMessage({ role: "assistant", agent: undefined })],
new Set(["code"]),
)
@@ -2,9 +2,7 @@ import type { Message } from "../types/messages"
export function resolveSessionAgent(messages: Message[], names: Set<string>): string | undefined {
for (let i = messages.length - 1; i >= 0; i--) {
const msg = messages[i]
if (msg.role !== "user") continue
const name = msg.agent?.trim()
const name = messages[i]?.agent?.trim()
if (!name) continue
if (!names.has(name)) continue
return name
@@ -857,11 +857,12 @@ export const SessionProvider: ParentComponent = (props) => {
return [...msgs, message]
})
if (message.role === "user") {
const agent = message.agent?.trim()
if (agent && agentNames().has(agent)) {
setStore("agentSelections", message.sessionID, agent)
}
// Sync mode picker from any message role (user or assistant).
// agentNames() already excludes subagent/hidden agents, so subtask
// assistant messages (e.g. "task" agent) are silently ignored.
const agent = message.agent?.trim()
if (agent && agentNames().has(agent)) {
setStore("agentSelections", message.sessionID, agent)
}
if (message.parts && message.parts.length > 0) {