mirror of
https://github.com/windmill-labs/windmill.git
synced 2026-09-21 08:02:38 +00:00
The client was deciding whether a turn had ended from whether its own stream was alive, which it cannot know. It asks the run instead. Nothing in the browser survives a reload, so a chat opened while its flow was running read as idle and the composer took a message — two turns writing one agent memory. The row the server writes when a turn starts carries its flow job; that job is asked whether it is over, and if not the turn is picked back up and followed. The chat is held from the moment the question is asked rather than from the answer, since a send accepted during that round trip is the thing this prevents. A stream resumed this way replays the rounds an agent has already persisted, and the transcript cannot tell a replayed round from a second one, so the turn's own rows are dropped before re-attaching; the final poll brings them back. With that, a turn whose stream dies no longer needs a rule for giving up: it polls its job until the run says it is over. The retry cap, the cancel fallback and the settled/unsettled split go — a run that cannot be reached has said nothing, and Stop is on screen throughout for the reader who wants out. A turn with more rows than a page has no user row on the page to name its job and is not picked up; finding it needs the server to say which turn is running. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Windmill frontend
The Windmill frontend written in Svelte 5 + Tailwind CSS
The frontend is under AGPL, see the LICENSE file at the root of this repo