* feat(web): fade in newly streamed response words
Animate only new word-level deltas while markdown is still streaming, and
cache markdown-it instances per parser id so concurrent Response trees do
not rebuild or reparse on every render.
* fix(web): keep CodeMirror editor alive across keystroke re-renders
Deliver onKeyDown through a ref instead of the extensions memo so a new
handler identity no longer tears down the EditorView, which reset the
cursor to the document start and made typing appear right-to-left.
* feat(web): add unsaved changes confirmation dialog in PlaygroundMessageEditor
Implement a confirmation dialog to warn users about unsaved changes when attempting to leave the editor. This includes handling the beforeunload event to prevent accidental navigation away from the editor. Additionally, add tests to verify the dialog's behavior under various scenarios.
* test(web): cover beforeunload guard and fade hydration suppression
Address review feedback: add regression tests for the unsaved-changes
beforeunload guard and the first-render fade suppression of hydrated
content, and annotate getCachedMarkdown's return type.
* fix(channel): debounce inline priority updates
* fix(channel): commit spinner edits only on Enter or focus leave
Blurring the inline edit input to the +/- buttons flushed the pending
priority update immediately, bypassing the container focus-containment
check and defeating the debounce. Commit now happens via the container
blur handler or explicitly on Enter. Add unit tests for the priority
update scheduler.
* fix(channel): preserve row identity when priority updates reorder channels