From 1b36194b51e5927aa54709e2991fc1a5adb4fa16 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 13 Apr 2026 22:57:12 +0900 Subject: [PATCH] fix(cli): treat missing session status as idle in run completion --- src/cli/run/poll-for-completion.test.ts | 21 +++++++++++++++++++++ src/cli/run/poll-for-completion.ts | 3 +++ 2 files changed, 24 insertions(+) diff --git a/src/cli/run/poll-for-completion.test.ts b/src/cli/run/poll-for-completion.test.ts index dea0a9ff3..670c6ba05 100644 --- a/src/cli/run/poll-for-completion.test.ts +++ b/src/cli/run/poll-for-completion.test.ts @@ -235,6 +235,27 @@ describe("pollForCompletion", () => { expect(result).toBe(0) }) + it("treats missing main session status as idle when status API omits idle sessions", async () => { + //#given - latest opencode omits idle sessions from the status map + const ctx = createMockContext({ + statuses: {}, + }) + const eventState = createEventState() + eventState.mainSessionIdle = false + eventState.hasReceivedMeaningfulWork = true + const abortController = new AbortController() + + //#when + const result = await pollForCompletion(ctx, eventState, abortController, { + pollIntervalMs: 10, + requiredConsecutive: 2, + minStabilizationMs: 10, + }) + + //#then - missing entry is treated as idle instead of hanging forever + expect(result).toBe(0) + }) + it("allows silent completion after stabilization when no meaningful work is received", async () => { //#given - session is idle and stable but no assistant message/tool event arrived const ctx = createMockContext() diff --git a/src/cli/run/poll-for-completion.ts b/src/cli/run/poll-for-completion.ts index 51c1dfc13..f393b5b9d 100644 --- a/src/cli/run/poll-for-completion.ts +++ b/src/cli/run/poll-for-completion.ts @@ -193,6 +193,9 @@ async function getMainSessionStatus( statusesRes, {} as Record ) + if (!(ctx.sessionID in statuses)) { + return "idle" + } const status = statuses[ctx.sessionID]?.type if (status === "idle" || status === "busy" || status === "retry") { return status