[1.3.25] - 2026-08-31
Changed
- The stream-idle deadline now defaults to 30 minutes instead of 120 seconds. Reasoning models (o-series, GPT-5, extended thinking) stay silent for minutes after headers arrive; the old default killed healthy streams. Setting the API request timeout to 0 disables both deadlines.
- Message list scroll, pinning, and history-load viewport state is extracted from
MessageList.tsxinto a dedicated viewport module — the component shrinks by ~1000 lines to presentation only.
Fixed
- Fixed summarized turns leaking back into the model context: the compaction watermark cut is now refused whenever the summary row is missing (windowed load miss or not-yet-committed summary), instead of silently dropping the compacted range and leaving the model with only the latest turn.
- Fixed the Worker context source hiding the compacted range when the watermark's summary row was not on disk; the chat store now re-fetches a just-committed summary before applying the cut.
- Fixed streamed text and thinking doubling when a gateway replayed a snapshot or the live stream, reattach, and sync echo delivered the same chunk in one frame. The Worker now takes only the incremental part of deltas, ignores
reasoning_summary_text.donesnapshots that duplicate streamed deltas, and the renderer no longer subscribes twice while the live send loop owns the session. - Fixed tool calls failing required-field validation when a model sent
pathortarget_fileinstead of the schema'sfile_path/notebook_path; common aliases are now coerced onto the canonical property.