fix(cli): persist defaulted finish reason so loop break check sees it

The loop reloads messages from storage at the top of each iteration via filterCompactedEffect, so an in-memory mutation on handle.message does not propagate. Persist the defaulted finish via updateMessage so the next iteration's break check actually observes it.
This commit is contained in:
kiloconnect[bot]
2026-05-06 14:59:51 +00:00
parent eb77fbc13b
commit d8642deec6
+10 -5
View File
@@ -1603,11 +1603,16 @@ NOTE: At any point in time through this workflow you should feel free to ask the
// kilocode_change start - guard against providers that end the stream
// without a terminal stop_reason (e.g. an Anthropic-style message_delta
// with stop_reason: null followed immediately by message_stop). Without
// a finishReason, the loop-exit check below sees a falsy `finish` and
// keeps stepping forever. Default to "unknown" so the regular break
// condition fires when there are no tool calls, while still allowing
// the loop to continue when tool calls were emitted.
handle.message.finish = handle.message.finish ?? "unknown"
// a finishReason, the loop-exit check at the top of the next iteration
// sees a falsy `finish` (loaded from storage via filterCompactedEffect)
// and keeps stepping forever. Default to "unknown" and persist so the
// regular break condition fires when there are no tool calls — the
// tool-call path is unaffected because `!hasToolCalls` keeps the break
// gated when the assistant did emit tool calls.
if (!handle.message.finish) {
handle.message.finish = "unknown"
yield* sessions.updateMessage(handle.message)
}
// kilocode_change end
if (structured !== undefined) {