Fix chat terminal flicker during streaming (#298598)

This commit is contained in:
John Sanchirico
2026-03-02 13:07:18 -05:00
committed by GitHub
parent 9497369946
commit cceac1afda
2 changed files with 10 additions and 16 deletions

View File

@@ -308,12 +308,10 @@ export class DetachedTerminalCommandMirror extends Disposable implements IDetach
// if we blindly append.
const canAppend = !!this._lastVT && vt.text.length >= this._lastVT.length && this._vtBoundaryMatches(vt.text, this._lastVT.length);
if (!canAppend) {
// Reset the terminal if we had previous content (can't append, need full rewrite)
if (this._lastVT) {
detached.xterm.reset();
}
if (vt.text) {
detached.xterm.write(vt.text, resolve);
// Use \x1bc (RIS) + new content in one write to avoid a blank frame
const payload = this._lastVT ? `\x1bc${vt.text}` : vt.text;
if (payload) {
detached.xterm.write(payload, resolve);
} else {
resolve();
}
@@ -542,12 +540,10 @@ export class DetachedTerminalCommandMirror extends Disposable implements IDetach
const canAppend = !!this._lastVT && startLine >= previousCursor && vt.text.length >= this._lastVT.length && this._vtBoundaryMatches(vt.text, this._lastVT.length);
await new Promise<void>(resolve => {
if (!canAppend) {
// Reset the terminal if we had previous content (can't append, need full rewrite)
if (this._lastVT) {
detachedRaw.reset();
}
if (vt.text) {
detachedRaw.write(vt.text, resolve);
// Use \x1bc (RIS) + new content in one write to avoid a blank frame
const payload = this._lastVT ? `\x1bc${vt.text}` : vt.text;
if (payload) {
detachedRaw.write(payload, resolve);
} else {
resolve();
}

View File

@@ -261,10 +261,8 @@ suite('Workbench - ChatTerminalCommandMirror', () => {
// Boundary should NOT match because the prefix diverged
strictEqual(boundaryMatches, false, 'Boundary check should detect divergence');
// When boundary doesn't match, the fix does a full reset + rewrite
// instead of corrupting the output by blind slicing
mirror.raw.reset();
await write(mirror, vt2);
// Use \x1bc (RIS) + new content in one write to avoid a blank frame
await write(mirror, `\x1bc${vt2}`);
// Final content should be the complete new VT, not corrupted
strictEqual(getBufferText(mirror), 'DifferentPrefixLine3');