mirror of
https://github.com/Kilo-Org/kilocode.git
synced 2026-09-19 01:51:21 +08:00
The mode picker only synced from user messages (role === 'user'), ignoring the agent field on assistant messages. This caused the picker to stay stale when: - A user message SSE was missed but the assistant SSE arrived - Session reload where the last message is an assistant - Any backend flow where the assistant carries the authoritative agent Remove the role === 'user' guard in handleMessageCreated and the role !== 'user' filter in resolveSessionAgent so both user and assistant messages can drive mode picker updates. Subagent safety is preserved: agentNames() is built from agents() which already excludes subagent/hidden agents via filterVisibleAgents(), so assistant messages from subtask turns are silently ignored.
79 lines
2.2 KiB
TypeScript
79 lines
2.2 KiB
TypeScript
import { describe, it, expect } from "bun:test"
|
|
import { resolveSessionAgent } from "../../webview-ui/src/context/session-agent"
|
|
import type { Message } from "../../webview-ui/src/types/messages"
|
|
|
|
function makeMessage(overrides: Partial<Message> = {}): Message {
|
|
return {
|
|
id: "msg-1",
|
|
sessionID: "sess-1",
|
|
role: "user",
|
|
createdAt: new Date(0).toISOString(),
|
|
...overrides,
|
|
}
|
|
}
|
|
|
|
describe("resolveSessionAgent", () => {
|
|
it("returns the latest valid user agent", () => {
|
|
const result = resolveSessionAgent(
|
|
[
|
|
makeMessage({ id: "1", agent: "plan" }),
|
|
makeMessage({ id: "2", role: "assistant", agent: "ask" }),
|
|
makeMessage({ id: "3", agent: "code" }),
|
|
],
|
|
new Set(["plan", "code", "ask"]),
|
|
)
|
|
|
|
expect(result).toBe("code")
|
|
})
|
|
|
|
it("returns the latest assistant agent when it is last", () => {
|
|
const result = resolveSessionAgent(
|
|
[makeMessage({ agent: "plan" }), makeMessage({ role: "assistant", agent: "code" })],
|
|
new Set(["plan", "code"]),
|
|
)
|
|
|
|
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", () => {
|
|
const result = resolveSessionAgent(
|
|
[makeMessage({ agent: "missing" }), makeMessage({ agent: "code" })],
|
|
new Set(["code"]),
|
|
)
|
|
|
|
expect(result).toBe("code")
|
|
})
|
|
|
|
it("ignores empty agent values", () => {
|
|
const result = resolveSessionAgent([makeMessage({ agent: " " })], new Set(["code"]))
|
|
expect(result).toBeUndefined()
|
|
})
|
|
|
|
it("returns agent from assistant when no user has agent", () => {
|
|
const result = resolveSessionAgent(
|
|
[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"]),
|
|
)
|
|
|
|
expect(result).toBeUndefined()
|
|
})
|
|
})
|