fix: stop 8s terminal blank-flash on non-Claude surfaces

The periodic Claude-mode re-check (setInterval 8s) called
setClaudeMode(false) on plain/codex surfaces, which ran
claudeRenderer.clear() unconditionally. clear() empties the shared
output element (this.el), blanking live terminal/codex content until
the next repaint — perceived as text fading out then back every 8s.

- app.js: remove the 8s claude re-check interval
- terminal-view.js: only clear the renderer on an actual mode
  transition (changed), so redundant setClaudeMode/setCodexMode(false)
  no longer wipes the shared output
- index.html: bump terminal-view.js v12, app.js v21

Verified deterministically in Playwright: pre-fix the output wiped
48->0 ~350ms after each 8s /api/claude-surfaces fetch; post-fix 18s
window shows 0 fetches and content intact.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
main
I Luk Kim 2 months ago
parent 1f50014296
commit 5e473b9ff6

@ -119,7 +119,7 @@
</aside>
<script src="/js/websocket-client.js?v=4"></script>
<script src="/js/terminal-view.js?v=11"></script>
<script src="/js/terminal-view.js?v=12"></script>
<script src="/js/virtual-keyboard.js?v=10"></script>
<script src="/js/sidebar.js?v=5"></script>
<script src="/js/gestures.js?v=3"></script>
@ -129,7 +129,7 @@
<script src="/js/claude-keyboard.js?v=5"></script>
<script src="/js/codex-parser.js?v=1"></script>
<script src="/js/codex-renderer.js?v=1"></script>
<script src="/js/app.js?v=20"></script>
<script src="/js/app.js?v=21"></script>
<script src="/js/debug-safe-area.js"></script>
<script src="/js/sw-unregister.js"></script>
</body>

@ -541,13 +541,6 @@
}
}
// Periodically re-check Claude mode in case initial detection failed transiently.
setInterval(() => {
if (currentSurface && !document.body.classList.contains('claude-mode')) {
updateClaudeMode(currentSurface);
}
}, 8000);
// Browser back/forward navigation
window.addEventListener('hashchange', () => {
const saved = getHashSurface();

@ -138,7 +138,8 @@ class TerminalView {
if (!this.codexRenderer) this.codexRenderer = new CodexRenderer(this.el);
if (changed && this.lines.length > 0) this.scheduleRender();
} else {
if (this.codexRenderer) this.codexRenderer.clear();
// Same as setClaudeMode: only clear on a real transition out of codex mode.
if (changed && this.codexRenderer) this.codexRenderer.clear();
}
}
@ -159,7 +160,11 @@ class TerminalView {
// Re-render existing content in claude mode (fixes race with async mode detection)
if (changed && this.lines.length > 0) this.scheduleRender();
} else {
if (this.claudeRenderer) this.claudeRenderer.clear();
// Only clear on an actual transition OUT of claude mode. A redundant
// setClaudeMode(false) on an already-plain surface must NOT wipe the
// output — claudeRenderer.clear() empties the shared `this.el`, which
// would blank the live terminal/codex content until the next repaint.
if (changed && this.claudeRenderer) this.claudeRenderer.clear();
}
}

Loading…
Cancel
Save