mirror of
https://github.com/stablyai/orca.git
synced 2026-10-20 16:03:20 +00:00
Two ways a committed composition was lost or corrupted. The composition route called preventDefault() before checking whether it owned the session. A route installed mid-composition never saw the matching session start, so it suppressed xterm's own insertion and then returned without delivering anything — the commit vanished. Ownership is now decided first; preventDefault stays for sessions the route does own, including the ones it deliberately drops after a transport swap, since that drop is its decision to make. The deferred-newline fallback fired `finish` directly, bypassing the pending-composition re-check that the event path uses. A composition still open at 200 ms got a newline sent into the middle of its preedit. The deadline now re-arms while a composition is pending, and its 2 s ceiling is measured from the last compositionupdate rather than from the start. A slow candidate window no longer splits the preedit, and neither does multi-segment bunsetsu conversion, which stays legitimately pending well past any fixed total-elapsed ceiling. A composition that stops progressing still cannot strand the keystroke. Co-authored-by: Orca <help@stably.ai> The re-arm also treats a live compositionupdate as evidence in its own right, not just a session the route recorded. A route installed while a composition was already in flight never saw that session start, so it has nothing to report as pending and the deadline would otherwise split that composition too.