mirror of
https://github.com/nesquena/hermes-webui.git
synced 2026-05-25 19:20:16 +00:00
a4b56642d9
saveInflightState() is called from syncInflightAssistantMessage() on every token. It does localStorage.getItem + JSON.parse + mutate + JSON.stringify + localStorage.setItem on the full inflight state map. For a 5000-token response with a 10KB messages array this produces ~36MB of JSON churn per second. This O(response_length) work per token is the primary source of GC pressure that causes the renderer to crash (Chrome error codes 4/5). The 13.6-second RunTask we observed in perf traces is a direct consequence: accumulated rAF callbacks execute all at once after each multi-second GC pause. Fix: add _throttledPersist() which writes at most once every 2 seconds during token streaming. State transitions that matter for crash recovery (tool events, done, start) still call persistInflightState() directly, so at most 2s of in-flight progress is lost if the tab crashes mid-stream. The _persistTimer is cleared on 'done' so the final state is always flushed. Co-authored with Claude Sonnet 4.6 / Anthropic.