Made tool calls take the entire terminal height

This commit is contained in:
Dev Randalpura
2026-03-12 13:05:56 -05:00
parent 18b6482ea4
commit d2e5ae7750
6 changed files with 117 additions and 122 deletions
@@ -189,7 +189,7 @@ describe('<ShellToolMessage />', () => {
[ [
'respects availableTerminalHeight when it is smaller than ACTIVE_SHELL_MAX_LINES', 'respects availableTerminalHeight when it is smaller than ACTIVE_SHELL_MAX_LINES',
10, 10,
3, // 10 - 1 (static) - 6 (ASB reserved) = 3 10,
false, false,
], ],
[ [
@@ -201,7 +201,7 @@ describe('<ShellToolMessage />', () => {
[ [
'uses full availableTerminalHeight when focused in alternate buffer mode', 'uses full availableTerminalHeight when focused in alternate buffer mode',
100, 100,
93, // 100 - 1 (static) - 6 (ASB reserved) = 93 100,
true, true,
], ],
[ [
@@ -191,7 +191,7 @@ export const ToolGroupMessage: React.FC<ToolGroupMessageProps> = ({
maxLinesLimit: maxLines, maxLinesLimit: maxLines,
}); });
if (contentMaxLines === undefined) return false; if (!contentMaxLines) return false;
if (typeof tool.resultDisplay === 'string') { if (typeof tool.resultDisplay === 'string') {
const text = tool.resultDisplay; const text = tool.resultDisplay;
@@ -23,10 +23,7 @@ import { Scrollable } from '../shared/Scrollable.js';
import { ScrollableList } from '../shared/ScrollableList.js'; import { ScrollableList } from '../shared/ScrollableList.js';
import { SCROLL_TO_ITEM_END } from '../shared/VirtualizedList.js'; import { SCROLL_TO_ITEM_END } from '../shared/VirtualizedList.js';
import { ACTIVE_SHELL_MAX_LINES } from '../../constants.js'; import { ACTIVE_SHELL_MAX_LINES } from '../../constants.js';
import { import { calculateToolContentMaxLines } from '../../utils/toolLayoutUtils.js';
calculateToolContentMaxLines,
TOOL_RESULT_MIN_LINES_SHOWN,
} from '../../utils/toolLayoutUtils.js';
import { SubagentProgressDisplay } from './SubagentProgressDisplay.js'; import { SubagentProgressDisplay } from './SubagentProgressDisplay.js';
// Large threshold to ensure we don't cause performance issues for very large // Large threshold to ensure we don't cause performance issues for very large
@@ -64,11 +61,6 @@ export const ToolResultDisplay: React.FC<ToolResultDisplayProps> = ({
maxLinesLimit: maxLines, maxLinesLimit: maxLines,
}); });
const effectiveMaxHeight =
availableHeight !== undefined
? Math.max(TOOL_RESULT_MIN_LINES_SHOWN, availableHeight)
: undefined;
const combinedPaddingAndBorderWidth = 4; const combinedPaddingAndBorderWidth = 4;
const childWidth = terminalWidth - combinedPaddingAndBorderWidth; const childWidth = terminalWidth - combinedPaddingAndBorderWidth;
@@ -140,7 +132,7 @@ export const ToolResultDisplay: React.FC<ToolResultDisplayProps> = ({
if (isAlternateBuffer && Array.isArray(truncatedResultDisplay)) { if (isAlternateBuffer && Array.isArray(truncatedResultDisplay)) {
// If availableHeight is undefined, fallback to a safe default to prevents infinite loop // If availableHeight is undefined, fallback to a safe default to prevents infinite loop
// where Container grows -> List renders more -> Container grows. // where Container grows -> List renders more -> Container grows.
const limit = maxLines ?? effectiveMaxHeight ?? ACTIVE_SHELL_MAX_LINES; const limit = maxLines ?? availableHeight ?? ACTIVE_SHELL_MAX_LINES;
const listHeight = Math.min( const listHeight = Math.min(
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
(truncatedResultDisplay as AnsiOutput).length, (truncatedResultDisplay as AnsiOutput).length,
@@ -213,7 +205,7 @@ export const ToolResultDisplay: React.FC<ToolResultDisplayProps> = ({
diffContent={(truncatedResultDisplay as FileDiffResult).fileDiff} diffContent={(truncatedResultDisplay as FileDiffResult).fileDiff}
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
filename={(truncatedResultDisplay as FileDiffResult).fileName} filename={(truncatedResultDisplay as FileDiffResult).fileName}
availableTerminalHeight={effectiveMaxHeight} availableTerminalHeight={availableHeight}
terminalWidth={childWidth} terminalWidth={childWidth}
/> />
); );
@@ -227,7 +219,7 @@ export const ToolResultDisplay: React.FC<ToolResultDisplayProps> = ({
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
data={truncatedResultDisplay as AnsiOutput} data={truncatedResultDisplay as AnsiOutput}
availableTerminalHeight={ availableTerminalHeight={
isAlternateBuffer ? undefined : effectiveMaxHeight isAlternateBuffer ? undefined : availableHeight
} }
width={childWidth} width={childWidth}
maxLines={isAlternateBuffer ? undefined : maxLines} maxLines={isAlternateBuffer ? undefined : maxLines}
@@ -241,7 +233,7 @@ export const ToolResultDisplay: React.FC<ToolResultDisplayProps> = ({
return ( return (
<Scrollable <Scrollable
width={childWidth} width={childWidth}
maxHeight={maxLines ?? effectiveMaxHeight} maxHeight={maxLines ?? availableHeight}
hasFocus={hasFocus} // Allow scrolling via keyboard (Shift+Up/Down) hasFocus={hasFocus} // Allow scrolling via keyboard (Shift+Up/Down)
scrollToBottom={true} scrollToBottom={true}
> >
@@ -253,7 +245,7 @@ export const ToolResultDisplay: React.FC<ToolResultDisplayProps> = ({
return ( return (
<Box width={childWidth} flexDirection="column"> <Box width={childWidth} flexDirection="column">
<MaxSizedBox <MaxSizedBox
maxHeight={effectiveMaxHeight} maxHeight={availableHeight}
maxWidth={childWidth} maxWidth={childWidth}
additionalHiddenLinesCount={hiddenLinesCount} additionalHiddenLinesCount={hiddenLinesCount}
> >
@@ -133,6 +133,13 @@ exports[`<ShellToolMessage /> > Height Constraints > respects availableTerminalH
"╭──────────────────────────────────────────────────────────────────────────────╮ "╭──────────────────────────────────────────────────────────────────────────────╮
│ ⊶ Shell Command A shell command │ │ ⊶ Shell Command A shell command │
│ │ │ │
│ Line 91 │
│ Line 92 │
│ Line 93 │
│ Line 94 │
│ Line 95 │
│ Line 96 │
│ Line 97 │
│ Line 98 │ │ Line 98 │
│ Line 99 │ │ Line 99 │
│ Line 100 █ │ │ Line 100 █ │
@@ -187,99 +194,106 @@ exports[`<ShellToolMessage /> > Height Constraints > uses full availableTerminal
"╭──────────────────────────────────────────────────────────────────────────────╮ "╭──────────────────────────────────────────────────────────────────────────────╮
│ ⊶ Shell Command A shell command (Shift+Tab to unfocus) │ │ ⊶ Shell Command A shell command (Shift+Tab to unfocus) │
│ │ │ │
│ Line 1 │
│ Line 2 │
│ Line 3 │
│ Line 4 │
│ Line 5 │
│ Line 6 │
│ Line 7 │
│ Line 8 │ │ Line 8 │
│ Line 9 │ │ Line 9 │
│ Line 10 │ │ Line 10 │
│ Line 11 │ │ Line 11 │
│ Line 12 │ │ Line 12 │
│ Line 13 │ │ Line 13 │
│ Line 14 │ Line 14
│ Line 15 │ Line 15
│ Line 16 │ Line 16
│ Line 17 │ Line 17
│ Line 18 │ Line 18
│ Line 19 │ Line 19
│ Line 20 │ Line 20
│ Line 21 │ Line 21
│ Line 22 │ Line 22
│ Line 23 │ Line 23
│ Line 24 │ Line 24
│ Line 25 │ Line 25
│ Line 26 │ Line 26
│ Line 27 │ Line 27
│ Line 28 │ Line 28
│ Line 29 │ Line 29
│ Line 30 │ Line 30
│ Line 31 │ Line 31
│ Line 32 │ Line 32
│ Line 33 │ Line 33
│ Line 34 │ Line 34
│ Line 35 │ Line 35
│ Line 36 │ Line 36
│ Line 37 │ Line 37
│ Line 38 │ Line 38
│ Line 39 │ Line 39
│ Line 40 │ Line 40
│ Line 41 │ Line 41
│ Line 42 │ Line 42
│ Line 43 │ Line 43
│ Line 44 │ Line 44
│ Line 45 │ Line 45
│ Line 46 │ Line 46
│ Line 47 │ Line 47
│ Line 48 │ Line 48
│ Line 49 │ Line 49
│ Line 50 │ Line 50
│ Line 51 │ Line 51
│ Line 52 │ Line 52
│ Line 53 │ Line 53
│ Line 54 │ Line 54
│ Line 55 │ Line 55
│ Line 56 │ Line 56
│ Line 57 │ Line 57
│ Line 58 │ Line 58
│ Line 59 │ Line 59
│ Line 60 │ Line 60
│ Line 61 │ Line 61
│ Line 62 │ Line 62
│ Line 63 │ Line 63
│ Line 64 │ Line 64
│ Line 65 │ Line 65
│ Line 66 │ Line 66
│ Line 67 │ Line 67
│ Line 68 │ Line 68
│ Line 69 │ Line 69
│ Line 70 │ Line 70
│ Line 71 │ Line 71
│ Line 72 │ Line 72
│ Line 73 │ Line 73
│ Line 74 │ Line 74
│ Line 75 │ Line 75
│ Line 76 │ Line 76
│ Line 77 │ Line 77
│ Line 78 │ Line 78
│ Line 79 │ Line 79
│ Line 80 │ Line 80
│ Line 81 │ Line 81
│ Line 82 │ Line 82
│ Line 83 │ Line 83
│ Line 84 │ Line 84
│ Line 85 │ Line 85
│ Line 86 │ Line 86
│ Line 87 │ Line 87
│ Line 88 │ Line 88
│ Line 89 │ Line 89
│ Line 90 │ Line 90
│ Line 91 │ Line 91
│ Line 92 │ Line 92
│ Line 93 │ Line 93
│ Line 94 │ Line 94
│ Line 95 │ Line 95
│ Line 96 │ Line 96
│ Line 97 │ Line 97
│ Line 98 │ Line 98
│ Line 99 │ Line 99
│ Line 100 │ Line 100
" "
`; `;
@@ -37,7 +37,10 @@ exports[`ToolResultDisplay > renders string result as plain text when renderOutp
`; `;
exports[`ToolResultDisplay > truncates very long string results 1`] = ` exports[`ToolResultDisplay > truncates very long string results 1`] = `
"... 248 hidden (Ctrl+O) ... "... 245 hidden (Ctrl+O) ...
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+3 -17
View File
@@ -33,17 +33,10 @@ export function calculateToolContentMaxLines(options: {
isAlternateBuffer: boolean; isAlternateBuffer: boolean;
maxLinesLimit?: number; maxLinesLimit?: number;
}): number | undefined { }): number | undefined {
const { availableTerminalHeight, isAlternateBuffer, maxLinesLimit } = options; const { availableTerminalHeight, maxLinesLimit } = options;
const reservedLines = isAlternateBuffer
? TOOL_RESULT_ASB_RESERVED_LINE_COUNT
: TOOL_RESULT_STANDARD_RESERVED_LINE_COUNT;
let contentHeight = availableTerminalHeight let contentHeight = availableTerminalHeight
? Math.max( ? Math.max(TOOL_RESULT_STATIC_HEIGHT, availableTerminalHeight)
0,
availableTerminalHeight - TOOL_RESULT_STATIC_HEIGHT - reservedLines,
)
: undefined; : undefined;
if (maxLinesLimit) { if (maxLinesLimit) {
@@ -91,14 +84,7 @@ export function calculateShellMaxLines(options: {
return isAlternateBuffer ? ACTIVE_SHELL_MAX_LINES : undefined; return isAlternateBuffer ? ACTIVE_SHELL_MAX_LINES : undefined;
} }
const reservedLines = isAlternateBuffer const maxLinesBasedOnHeight = Math.max(1, availableTerminalHeight);
? TOOL_RESULT_ASB_RESERVED_LINE_COUNT
: TOOL_RESULT_STANDARD_RESERVED_LINE_COUNT;
const maxLinesBasedOnHeight = Math.max(
0,
availableTerminalHeight - TOOL_RESULT_STATIC_HEIGHT - reservedLines,
);
// 3. Handle ASB mode focus expansion. // 3. Handle ASB mode focus expansion.
// We allow a focused shell in ASB mode to take up the full available height, // We allow a focused shell in ASB mode to take up the full available height,