mirror of
https://github.com/Kilo-Org/kilocode.git
synced 2026-09-24 16:02:55 +08:00
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:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user