mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-31 11:51:22 +00:00
* fix(msteams): reset stream state after preparePayload suppresses delivery When an agent uses tools mid-response (text → tool calls → more text), the stream controller's preparePayload would suppress fallback delivery for ALL text segments because streamReceivedTokens stayed true. This caused the second text segment to be silently lost or duplicated. Fix: after preparePayload suppresses delivery for a streamed segment, finalize the stream and reset streamReceivedTokens so subsequent segments use fallback delivery. Fixes openclaw/openclaw#56040 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(msteams): guard preparePayload against finalized stream re-suppression When onPartialReply fires after the stream is finalized (post-tool partial tokens), streamReceivedTokens gets set back to true but the stream can't deliver. Add stream.isFinalized check so a finalized stream never suppresses fallback delivery. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(msteams): await pending finalize in controller to prevent race Store the fire-and-forget finalize promise from preparePayload and await it in the controller's finalize() method. This ensures markDispatchIdle waits for the in-flight stream finalization to complete before context cleanup. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test(msteams): add edge case tests for multi-round and media payloads Add tests for 3+ tool call rounds (text → tool → text → tool → text) and media+text payloads after stream finalization, covering the full contract of preparePayload across all input types and cycle counts. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>