fix(cli/run): handle session.status idle event in addition to deprecated session.idle

This commit is contained in:
YeonGyu-Kim 2026-02-09 21:12:11 +09:00
parent bb2df9fec6
commit 0565ce839e
2 changed files with 78 additions and 1 deletions

View File

@ -0,0 +1,73 @@
import { describe, it, expect } from "bun:test"
import type { RunContext } from "./types"
import { createEventState } from "./events"
import { handleSessionStatus } from "./event-handlers"
const createMockContext = (sessionID: string = "test-session"): RunContext => ({
sessionID,
} as RunContext)
describe("handleSessionStatus", () => {
it("recognizes idle from session.status event (not just deprecated session.idle)", () => {
//#given - state with mainSessionIdle=false
const ctx = createMockContext("test-session")
const state = createEventState()
state.mainSessionIdle = false
const payload = {
type: "session.status",
properties: {
sessionID: "test-session",
status: { type: "idle" as const },
},
}
//#when - handleSessionStatus called with idle status
handleSessionStatus(ctx, payload as any, state)
//#then - state.mainSessionIdle === true
expect(state.mainSessionIdle).toBe(true)
})
it("handleSessionStatus sets idle=false on busy", () => {
//#given - state with mainSessionIdle=true
const ctx = createMockContext("test-session")
const state = createEventState()
state.mainSessionIdle = true
const payload = {
type: "session.status",
properties: {
sessionID: "test-session",
status: { type: "busy" as const },
},
}
//#when - handleSessionStatus called with busy status
handleSessionStatus(ctx, payload as any, state)
//#then - state.mainSessionIdle === false
expect(state.mainSessionIdle).toBe(false)
})
it("does nothing for different session ID", () => {
//#given - state with mainSessionIdle=true
const ctx = createMockContext("test-session")
const state = createEventState()
state.mainSessionIdle = true
const payload = {
type: "session.status",
properties: {
sessionID: "other-session",
status: { type: "idle" as const },
},
}
//#when - handleSessionStatus called with different session ID
handleSessionStatus(ctx, payload as any, state)
//#then - state.mainSessionIdle remains unchanged
expect(state.mainSessionIdle).toBe(true)
})
})

View File

@ -26,8 +26,12 @@ export function handleSessionStatus(ctx: RunContext, payload: EventPayload, stat
if (payload.type !== "session.status") return
const props = payload.properties as SessionStatusProps | undefined
if (props?.sessionID === ctx.sessionID && props?.status?.type === "busy") {
if (props?.sessionID !== ctx.sessionID) return
if (props?.status?.type === "busy") {
state.mainSessionIdle = false
} else if (props?.status?.type === "idle") {
state.mainSessionIdle = true
}
}