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

View File

@@ -189,7 +189,7 @@ describe('<ShellToolMessage />', () => {
[
'respects availableTerminalHeight when it is smaller than ACTIVE_SHELL_MAX_LINES',
10,
3, // 10 - 1 (static) - 6 (ASB reserved) = 3
10,
false,
],
[
@@ -201,7 +201,7 @@ describe('<ShellToolMessage />', () => {
[
'uses full availableTerminalHeight when focused in alternate buffer mode',
100,
93, // 100 - 1 (static) - 6 (ASB reserved) = 93
100,
true,
],
[

View File

@@ -191,7 +191,7 @@ export const ToolGroupMessage: React.FC<ToolGroupMessageProps> = ({
maxLinesLimit: maxLines,
});
if (contentMaxLines === undefined) return false;
if (!contentMaxLines) return false;
if (typeof tool.resultDisplay === 'string') {
const text = tool.resultDisplay;

View File

@@ -23,10 +23,7 @@ import { Scrollable } from '../shared/Scrollable.js';
import { ScrollableList } from '../shared/ScrollableList.js';
import { SCROLL_TO_ITEM_END } from '../shared/VirtualizedList.js';
import { ACTIVE_SHELL_MAX_LINES } from '../../constants.js';
import {
calculateToolContentMaxLines,
TOOL_RESULT_MIN_LINES_SHOWN,
} from '../../utils/toolLayoutUtils.js';
import { calculateToolContentMaxLines } from '../../utils/toolLayoutUtils.js';
import { SubagentProgressDisplay } from './SubagentProgressDisplay.js';
// 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,
});
const effectiveMaxHeight =
availableHeight !== undefined
? Math.max(TOOL_RESULT_MIN_LINES_SHOWN, availableHeight)
: undefined;
const combinedPaddingAndBorderWidth = 4;
const childWidth = terminalWidth - combinedPaddingAndBorderWidth;
@@ -140,7 +132,7 @@ export const ToolResultDisplay: React.FC<ToolResultDisplayProps> = ({
if (isAlternateBuffer && Array.isArray(truncatedResultDisplay)) {
// If availableHeight is undefined, fallback to a safe default to prevents infinite loop
// 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(
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
(truncatedResultDisplay as AnsiOutput).length,
@@ -213,7 +205,7 @@ export const ToolResultDisplay: React.FC<ToolResultDisplayProps> = ({
diffContent={(truncatedResultDisplay as FileDiffResult).fileDiff}
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
filename={(truncatedResultDisplay as FileDiffResult).fileName}
availableTerminalHeight={effectiveMaxHeight}
availableTerminalHeight={availableHeight}
terminalWidth={childWidth}
/>
);
@@ -227,7 +219,7 @@ export const ToolResultDisplay: React.FC<ToolResultDisplayProps> = ({
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
data={truncatedResultDisplay as AnsiOutput}
availableTerminalHeight={
isAlternateBuffer ? undefined : effectiveMaxHeight
isAlternateBuffer ? undefined : availableHeight
}
width={childWidth}
maxLines={isAlternateBuffer ? undefined : maxLines}
@@ -241,7 +233,7 @@ export const ToolResultDisplay: React.FC<ToolResultDisplayProps> = ({
return (
<Scrollable
width={childWidth}
maxHeight={maxLines ?? effectiveMaxHeight}
maxHeight={maxLines ?? availableHeight}
hasFocus={hasFocus} // Allow scrolling via keyboard (Shift+Up/Down)
scrollToBottom={true}
>
@@ -253,7 +245,7 @@ export const ToolResultDisplay: React.FC<ToolResultDisplayProps> = ({
return (
<Box width={childWidth} flexDirection="column">
<MaxSizedBox
maxHeight={effectiveMaxHeight}
maxHeight={availableHeight}
maxWidth={childWidth}
additionalHiddenLinesCount={hiddenLinesCount}
>

View File

@@ -133,6 +133,13 @@ exports[`<ShellToolMessage /> > Height Constraints > respects availableTerminalH
"╭──────────────────────────────────────────────────────────────────────────────╮
│ ⊶ Shell Command A shell command │
│ │
│ Line 91 │
│ Line 92 │
│ Line 93 │
│ Line 94 │
│ Line 95 │
│ Line 96 │
│ Line 97 │
│ Line 98 │
│ Line 99 │
│ Line 100 █ │
@@ -187,99 +194,106 @@ exports[`<ShellToolMessage /> > Height Constraints > uses full availableTerminal
"╭──────────────────────────────────────────────────────────────────────────────╮
│ ⊶ 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 9 │
│ Line 10 │
│ Line 11 │
│ Line 12 │
│ Line 13 │
│ Line 14
│ Line 15
│ Line 16
│ Line 17
│ Line 18
│ Line 19
│ Line 20
│ Line 21
│ Line 22
│ Line 23
│ Line 24
│ Line 25
│ Line 26
│ Line 27
│ Line 28
│ Line 29
│ Line 30
│ Line 31
│ Line 32
│ Line 33
│ Line 34
│ Line 35
│ Line 36
│ Line 37
│ Line 38
│ Line 39
│ Line 40
│ Line 41
│ Line 42
│ Line 43
│ Line 44
│ Line 45
│ Line 46
│ Line 47
│ Line 48
│ Line 49
│ Line 50
│ Line 51
│ Line 52
│ Line 53
│ Line 54
│ Line 55
│ Line 56
│ Line 57
│ Line 58
│ Line 59
│ Line 60
│ Line 61
│ Line 62
│ Line 63
│ Line 64
│ Line 65
│ Line 66
│ Line 67
│ Line 68
│ Line 69
│ Line 70
│ Line 71
│ Line 72
│ Line 73
│ Line 74
│ Line 75
│ Line 76
│ Line 77
│ Line 78
│ Line 79
│ Line 80
│ Line 81
│ Line 82
│ Line 83
│ Line 84
│ Line 85
│ Line 86
│ Line 87
│ Line 88
│ Line 89
│ Line 90
│ Line 91
│ Line 92
│ Line 93
│ Line 94
│ Line 95
│ Line 96
│ Line 97
│ Line 98
│ Line 99
│ Line 100
│ Line 14
│ Line 15
│ Line 16
│ Line 17
│ Line 18
│ Line 19
│ Line 20
│ Line 21
│ Line 22
│ Line 23
│ Line 24
│ Line 25
│ Line 26
│ Line 27
│ Line 28
│ Line 29
│ Line 30
│ Line 31
│ Line 32
│ Line 33
│ Line 34
│ Line 35
│ Line 36
│ Line 37
│ Line 38
│ Line 39
│ Line 40
│ Line 41
│ Line 42
│ Line 43
│ Line 44
│ Line 45
│ Line 46
│ Line 47
│ Line 48
│ Line 49
│ Line 50
│ Line 51
│ Line 52
│ Line 53
│ Line 54
│ Line 55
│ Line 56
│ Line 57
│ Line 58
│ Line 59
│ Line 60
│ Line 61
│ Line 62
│ Line 63
│ Line 64
│ Line 65
│ Line 66
│ Line 67
│ Line 68
│ Line 69
│ Line 70
│ Line 71
│ Line 72
│ Line 73
│ Line 74
│ Line 75
│ Line 76
│ Line 77
│ Line 78
│ Line 79
│ Line 80
│ Line 81
│ Line 82
│ Line 83
│ Line 84
│ Line 85
│ Line 86
│ Line 87
│ Line 88
│ Line 89
│ Line 90
│ Line 91
│ Line 92
│ Line 93
│ Line 94
│ Line 95
│ Line 96
│ Line 97
│ Line 98
│ Line 99
│ Line 100
"
`;

View File

@@ -37,7 +37,10 @@ exports[`ToolResultDisplay > renders string result as plain text when renderOutp
`;
exports[`ToolResultDisplay > truncates very long string results 1`] = `
"... 248 hidden (Ctrl+O) ...
"... 245 hidden (Ctrl+O) ...
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

View File

@@ -33,17 +33,10 @@ export function calculateToolContentMaxLines(options: {
isAlternateBuffer: boolean;
maxLinesLimit?: number;
}): number | undefined {
const { availableTerminalHeight, isAlternateBuffer, maxLinesLimit } = options;
const reservedLines = isAlternateBuffer
? TOOL_RESULT_ASB_RESERVED_LINE_COUNT
: TOOL_RESULT_STANDARD_RESERVED_LINE_COUNT;
const { availableTerminalHeight, maxLinesLimit } = options;
let contentHeight = availableTerminalHeight
? Math.max(
0,
availableTerminalHeight - TOOL_RESULT_STATIC_HEIGHT - reservedLines,
)
? Math.max(TOOL_RESULT_STATIC_HEIGHT, availableTerminalHeight)
: undefined;
if (maxLinesLimit) {
@@ -91,14 +84,7 @@ export function calculateShellMaxLines(options: {
return isAlternateBuffer ? ACTIVE_SHELL_MAX_LINES : undefined;
}
const reservedLines = isAlternateBuffer
? TOOL_RESULT_ASB_RESERVED_LINE_COUNT
: TOOL_RESULT_STANDARD_RESERVED_LINE_COUNT;
const maxLinesBasedOnHeight = Math.max(
0,
availableTerminalHeight - TOOL_RESULT_STATIC_HEIGHT - reservedLines,
);
const maxLinesBasedOnHeight = Math.max(1, availableTerminalHeight);
// 3. Handle ASB mode focus expansion.
// We allow a focused shell in ASB mode to take up the full available height,