fix: terminal left shift and instance naming scheme

- Debounce terminal ResizeObserver (100ms) and only send resize when cols/rows actually change
- Send initial resize on WebSocket connect/reconnect to prevent PTY default 80x24 shift
- Replace random hex instance names with sequential project-tool-NNN naming
- Add _sanitize_name() and _generate_instance_name() helpers for readable Docker names
This commit is contained in:
Developer
2026-06-02 12:11:19 +00:00
parent 7000f2075d
commit 5a8eca814d
2 changed files with 63 additions and 5 deletions
+24 -3
View File
@@ -177,15 +177,28 @@ export const TerminalComponent: React.FC<TerminalProps> = ({
});
// Resize observer for container-level resize detection
let resizeTimeout: ReturnType<typeof setTimeout> | null = null;
const resizeObserver = new ResizeObserver(() => {
fitAddon.fit();
const { cols, rows } = term;
sendResize(cols, rows);
if (resizeTimeout) {
clearTimeout(resizeTimeout);
}
resizeTimeout = setTimeout(() => {
resizeTimeout = null;
const prevCols = term.cols;
const prevRows = term.rows;
fitAddon.fit();
if (term.cols !== prevCols || term.rows !== prevRows) {
sendResize(term.cols, term.rows);
}
}, 100);
});
resizeObserver.observe(terminalRef.current);
resizeObserverRef.current = resizeObserver;
return () => {
if (resizeTimeout) {
clearTimeout(resizeTimeout);
}
disposable.dispose();
resizeObserver.disconnect();
term.dispose();
@@ -195,6 +208,14 @@ export const TerminalComponent: React.FC<TerminalProps> = ({
};
}, [instanceId, isDarkMode, sendInput, sendResize]);
// Send initial terminal size once connected (and on reconnect)
useEffect(() => {
if (state.status === "connected" && xtermRef.current) {
const { cols, rows } = xtermRef.current;
sendResize(cols, rows);
}
}, [state.status, sendResize]);
return (
<div className="terminal-wrapper">
<div className="terminal-header">