fix: patch subagent display (#512)

Co-authored-by: Letta <noreply@letta.com>
This commit is contained in:
Charles Packer
2026-01-10 09:59:00 -08:00
committed by GitHub
parent ff9ad0deb0
commit 3fa18f7699
5 changed files with 663 additions and 429 deletions

View File

@@ -7,21 +7,33 @@ const getStdout = () => {
};
const getTerminalWidth = () => getStdout()?.columns ?? 80;
const getTerminalRows = () => getStdout()?.rows ?? 24;
type Listener = (columns: number) => void;
type WidthListener = (columns: number) => void;
type RowsListener = (rows: number) => void;
const listeners = new Set<Listener>();
const widthListeners = new Set<WidthListener>();
const rowsListeners = new Set<RowsListener>();
let resizeHandlerRegistered = false;
let trackedColumns = getTerminalWidth();
let trackedRows = getTerminalRows();
const resizeHandler = () => {
const nextColumns = getTerminalWidth();
if (nextColumns === trackedColumns) {
return;
const nextRows = getTerminalRows();
if (nextColumns !== trackedColumns) {
trackedColumns = nextColumns;
for (const listener of widthListeners) {
listener(nextColumns);
}
}
trackedColumns = nextColumns;
for (const listener of listeners) {
listener(nextColumns);
if (nextRows !== trackedRows) {
trackedRows = nextRows;
for (const listener of rowsListeners) {
listener(nextRows);
}
}
};
@@ -34,7 +46,8 @@ const ensureResizeHandler = () => {
};
const removeResizeHandlerIfIdle = () => {
if (!resizeHandlerRegistered || listeners.size > 0) return;
if (!resizeHandlerRegistered) return;
if (widthListeners.size > 0 || rowsListeners.size > 0) return;
const stdout = getStdout();
if (!stdout) return;
stdout.off("resize", resizeHandler);
@@ -50,16 +63,39 @@ export function useTerminalWidth(): number {
useEffect(() => {
ensureResizeHandler();
const listener: Listener = (value) => {
const listener: WidthListener = (value) => {
setColumns(value);
};
listeners.add(listener);
widthListeners.add(listener);
return () => {
listeners.delete(listener);
widthListeners.delete(listener);
removeResizeHandlerIfIdle();
};
}, []);
return columns;
}
/**
* Hook to get terminal rows and reactively update on resize.
* Uses the same shared resize listener as useTerminalWidth.
*/
export function useTerminalRows(): number {
const [rows, setRows] = useState(trackedRows);
useEffect(() => {
ensureResizeHandler();
const listener: RowsListener = (value) => {
setRows(value);
};
rowsListeners.add(listener);
return () => {
rowsListeners.delete(listener);
removeResizeHandlerIfIdle();
};
}, []);
return rows;
}