mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-10-03 14:09:42 +02:00
fix(predictive-echo): anchor hold after unpredicted wire edits (review findings)
Independent post-build review found three gaps, all one family: input that changes the composer without a prediction leaves the DISPLAYED cursor stale for one RTT, and anchoring a new run on it painted ghosts one cell off (blank-neutral, so they lived out the full TTL: "tehh" on backspace-then-retype, exactly on the links the feature targets). Fix: the addon now HOLDS new predictions after any such edit (backspace with nothing outstanding = deleting echoed text, clearPredictions, and now also IME/plain-paste 'text' commits, which the hook clears like 'clear') until the next PARSED write releases the hold. The inline predictChar reconcile deliberately does not count: only the emitter pass or the public reconcile() is the display-caught-up contract. Worst case is exactly one unpredicted keystroke, whose own echo releases the hold. Also patched the one bypass path the PR had missed: _handleCjkInput now clears predictions like insertTerminalText and the other bypass sends. Package suite 230, vm gating 85, E2E 10/10 all green after the change. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -2563,8 +2563,10 @@ Object.assign(CodemanApp.prototype, {
|
||||
const kind = window.CodemanTerminalInput.classifyPredictInput(data);
|
||||
if (kind === 'char') this._predictiveEcho.predictChar(data);
|
||||
else if (kind === 'backspace') this._predictiveEcho.predictBackspace();
|
||||
else if (kind === 'clear') this._predictiveEcho.clearPredictions();
|
||||
// kind === 'text' (plain multi-char paste): wire only, no visual
|
||||
// 'clear' AND 'text' (plain paste, IME word commits) both change the
|
||||
// composer in ways the display has not shown yet: clear the run and let
|
||||
// the addon's anchor hold suppress prediction until the echo catches up
|
||||
else this._predictiveEcho.clearPredictions();
|
||||
} catch {
|
||||
/* predictions must never block the wire */
|
||||
}
|
||||
@@ -2577,6 +2579,8 @@ Object.assign(CodemanApp.prototype, {
|
||||
_crashDiag.log(`CJK send DROP no-session len=${text.length}`);
|
||||
return;
|
||||
}
|
||||
// Bypasses onData (like insertTerminalText): predictions cannot see this
|
||||
if (this._localEchoPolicy === 'predict') this._predictiveEcho?.clearPredictions();
|
||||
_crashDiag.log(`CJK send→${this.activeSessionId.slice(0, 8)} len=${text.length}`);
|
||||
this._sendInputAsync(this.activeSessionId, text);
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user