Merge branch 'main' into imanolmaiztegui/kilo-opencode-v1.15.9

This commit is contained in:
Imanol Maiztegui
2026-06-17 20:05:58 +02:00
324 changed files with 13487 additions and 1377 deletions
@@ -136,7 +136,8 @@ describe("internal notifications TUI plugin", () => {
])
})
test("notifies when an active session becomes idle and suppresses no-op idle", async () => {
// kilocode_change start
test("notifies only when an active turn closes as completed", async () => {
const harness = await setup()
harness.emit({
@@ -154,6 +155,11 @@ describe("internal notifications TUI plugin", () => {
type: "session.status",
properties: { sessionID: "session", status: { type: "idle" } },
})
harness.emit({
id: "event-4",
type: "session.turn.close",
properties: { sessionID: "session", reason: "completed" },
})
expect(harness.notifications).toEqual([
{
@@ -165,6 +171,28 @@ describe("internal notifications TUI plugin", () => {
])
})
test("stays silent when an active turn closes as interrupted after becoming idle", async () => {
const harness = await setup()
harness.emit({
id: "event-1",
type: "session.status",
properties: { sessionID: "session", status: { type: "busy" } },
})
harness.emit({
id: "event-2",
type: "session.status",
properties: { sessionID: "session", status: { type: "idle" } },
})
harness.emit({
id: "event-3",
type: "session.turn.close",
properties: { sessionID: "session", reason: "interrupted" },
})
expect(harness.notifications).toEqual([])
})
test("uses sound-only notifications and subagent_done sound for subagent sessions", async () => {
const harness = await setup()
@@ -179,6 +207,11 @@ describe("internal notifications TUI plugin", () => {
type: "session.status",
properties: { sessionID: "subagent", status: { type: "idle" } },
})
harness.emit({
id: "event-4",
type: "session.turn.close",
properties: { sessionID: "subagent", reason: "completed" },
})
expect(harness.notifications).toEqual([
{
@@ -225,7 +258,7 @@ describe("internal notifications TUI plugin", () => {
])
})
test("special-cases aborts and model response timeouts", async () => {
test("stays silent for manual aborts and identifies model response timeouts", async () => {
const harness = await setup()
harness.emit({
@@ -241,21 +274,25 @@ describe("internal notifications TUI plugin", () => {
harness.emit({
id: "event-3",
type: "session.status",
properties: { sessionID: "timeout", status: { type: "busy" } },
properties: { sessionID: "abort", status: { type: "idle" } },
})
harness.emit({
id: "event-4",
type: "session.turn.close",
properties: { sessionID: "abort", reason: "interrupted" },
})
harness.emit({
id: "event-5",
type: "session.status",
properties: { sessionID: "timeout", status: { type: "busy" } },
})
harness.emit({
id: "event-6",
type: "session.error",
properties: { sessionID: "timeout", error: { name: "UnknownError", data: { message: "SSE read timed out" } } },
})
expect(harness.notifications).toEqual([
{
title: "Abort session",
message: "Session aborted",
notification: { when: "blurred" },
sound: { name: "error", when: "always" },
},
{
title: "Timeout session",
message: "Model stopped responding",
@@ -264,4 +301,5 @@ describe("internal notifications TUI plugin", () => {
},
])
})
// kilocode_change end
})