Fixed
- ๐ Chat streaming no longer drops final content. Fixed a race where the
donesocket event arrived before the DB commit, causing a transient blank message. The streamed content now stays visible until the reload confirms it. - ๐ Unflushed text no longer lost at end of chat responses. The final text buffer is now properly flushed and emitted before marking a message as done, across all exit paths (normal completion, cancellation, and errors).
- ๐ Intermediate chat state persisted during tool loops. Content and output items are now saved to the database between tool call iterations, so progress survives crashes or disconnects.
- ๐งน In-memory task state cleaned up on completion. The
_task_statedict entry is now removed when a chat task finishes (done, cancelled, errored, or max iterations), preventing unbounded memory growth. - ๐ฑ Sidebar stays closed on mobile. The sidebar default breakpoint was raised to 1024px and an auto-close listener now collapses it whenever the viewport shrinks below 768px.
- ๐ Stale chat loads discarded. Rapid chat switches no longer apply data from a slow earlier load, fixing a race condition that could show the wrong conversation.
Changed
- โก All blocking filesystem I/O offloaded to threads. File reads, writes, directory walks, search, archive creation, uploads, renames, and deletions in the workspace and tool routers now run via
asyncio.to_thread(), preventing event-loop stalls under heavy file operations. - โก Port scanner made fully async. Platform-specific port scanning (Darwin
lsof, Linux/proc, Windowsnetstat) and PID-to-process lookups now useasyncio.create_subprocess_execorasyncio.to_threadinstead of blockingsubprocess.run. - โก Welcome endpoint system info collected off the event loop. The
/welcomehandler now gathers hostname, memory, disk, CPU, network, and process data in a background thread.