fix(ui): resolve unwanted vertical spacing around various tool output treatments (#24449)

This commit is contained in:
Jarrod Whelan
2026-04-01 23:29:56 -07:00
committed by GitHub
parent 40b73c9447
commit 66c07d7296
14 changed files with 168 additions and 117 deletions
@@ -4,16 +4,14 @@
</style> </style>
<rect width="920" height="666" fill="#000000" /> <rect width="920" height="666" fill="#000000" />
<g transform="translate(10, 10)"> <g transform="translate(10, 10)">
<rect x="0" y="0" width="900" height="17" fill="#141414" /> <rect x="0" y="0" width="9" height="17" fill="#141414" />
<text x="0" y="2" fill="#000000" textLength="900" lengthAdjust="spacingAndGlyphs">▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀</text> <rect x="9" y="0" width="18" height="17" fill="#141414" />
<rect x="0" y="17" width="9" height="17" fill="#141414" /> <text x="9" y="2" fill="#d7afff" textLength="18" lengthAdjust="spacingAndGlyphs">&gt; </text>
<rect x="9" y="17" width="18" height="17" fill="#141414" /> <rect x="27" y="0" width="324" height="17" fill="#141414" />
<text x="9" y="19" fill="#d7afff" textLength="18" lengthAdjust="spacingAndGlyphs">&gt; </text> <text x="27" y="2" fill="#ffffff" textLength="324" lengthAdjust="spacingAndGlyphs">Can you edit InputPrompt.tsx for me?</text>
<rect x="27" y="17" width="324" height="17" fill="#141414" /> <rect x="351" y="0" width="549" height="17" fill="#141414" />
<text x="27" y="19" fill="#ffffff" textLength="324" lengthAdjust="spacingAndGlyphs">Can you edit InputPrompt.tsx for me?</text> <rect x="0" y="17" width="900" height="17" fill="#141414" />
<rect x="351" y="17" width="549" height="17" fill="#141414" /> <text x="0" y="19" fill="#000000" textLength="900" lengthAdjust="spacingAndGlyphs">▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄</text>
<rect x="0" y="34" width="900" height="17" fill="#141414" />
<text x="0" y="36" fill="#000000" textLength="900" lengthAdjust="spacingAndGlyphs">▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄</text>
<text x="0" y="53" fill="#ffffaf" textLength="891" lengthAdjust="spacingAndGlyphs">╭─────────────────────────────────────────────────────────────────────────────────────────────────╮</text> <text x="0" y="53" fill="#ffffaf" textLength="891" lengthAdjust="spacingAndGlyphs">╭─────────────────────────────────────────────────────────────────────────────────────────────────╮</text>
<text x="0" y="70" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="0" y="70" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="18" y="70" fill="#ffffaf" textLength="135" lengthAdjust="spacingAndGlyphs" font-weight="bold">Action Required</text> <text x="18" y="70" fill="#ffffaf" textLength="135" lengthAdjust="spacingAndGlyphs" font-weight="bold">Action Required</text>
@@ -55,7 +53,7 @@
<text x="198" y="189" fill="#0000ee" textLength="36" lengthAdjust="spacingAndGlyphs">true</text> <text x="198" y="189" fill="#0000ee" textLength="36" lengthAdjust="spacingAndGlyphs">true</text>
<text x="234" y="189" fill="#00cd00" textLength="9" lengthAdjust="spacingAndGlyphs">;</text> <text x="234" y="189" fill="#00cd00" textLength="9" lengthAdjust="spacingAndGlyphs">;</text>
<text x="882" y="189" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="882" y="189" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="891" y="189" fill="#333333" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="891" y="189" fill="#333333" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="0" y="206" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="0" y="206" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="18" y="206" fill="#afafaf" textLength="18" lengthAdjust="spacingAndGlyphs">48</text> <text x="18" y="206" fill="#afafaf" textLength="18" lengthAdjust="spacingAndGlyphs">48</text>
<text x="63" y="206" fill="#e5e5e5" textLength="54" lengthAdjust="spacingAndGlyphs">const </text> <text x="63" y="206" fill="#e5e5e5" textLength="54" lengthAdjust="spacingAndGlyphs">const </text>

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

@@ -1,9 +1,9 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`Full Terminal Tool Confirmation Snapshot > renders tool confirmation box in the frame of the entire terminal 1`] = ` exports[`Full Terminal Tool Confirmation Snapshot > renders tool confirmation box in the frame of the entire terminal 1`] = `
"▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ " > Can you edit InputPrompt.tsx for me?
> Can you edit InputPrompt.tsx for me?
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
╭─────────────────────────────────────────────────────────────────────────────────────────────────╮ ╭─────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Action Required │ │ Action Required │
│ │ │ │
@@ -12,7 +12,7 @@ exports[`Full Terminal Tool Confirmation Snapshot > renders tool confirmation bo
│ ... first 44 lines hidden (Ctrl+O to show) ... │ │ ... first 44 lines hidden (Ctrl+O to show) ... │
│ 45 const line45 = true; │ │ 45 const line45 = true; │
│ 46 const line46 = true; │ │ 46 const line46 = true; │
│ 47 const line47 = true; │ │ 47 const line47 = true; │
│ 48 const line48 = true; │█ │ 48 const line48 = true; │█
│ 49 const line49 = true; │█ │ 49 const line49 = true; │█
│ 50 const line50 = true; │█ │ 50 const line50 = true; │█
@@ -49,6 +49,7 @@ interface HistoryItemDisplayProps {
isExpandable?: boolean; isExpandable?: boolean;
isFirstThinking?: boolean; isFirstThinking?: boolean;
isFirstAfterThinking?: boolean; isFirstAfterThinking?: boolean;
isToolGroupBoundary?: boolean;
suppressNarration?: boolean; suppressNarration?: boolean;
} }
@@ -62,14 +63,17 @@ export const HistoryItemDisplay: React.FC<HistoryItemDisplayProps> = ({
isExpandable, isExpandable,
isFirstThinking = false, isFirstThinking = false,
isFirstAfterThinking = false, isFirstAfterThinking = false,
isToolGroupBoundary = false,
suppressNarration = false, suppressNarration = false,
}) => { }) => {
const settings = useSettings(); const settings = useSettings();
const inlineThinkingMode = getInlineThinkingMode(settings); const inlineThinkingMode = getInlineThinkingMode(settings);
const itemForDisplay = useMemo(() => escapeAnsiCtrlCodes(item), [item]); const itemForDisplay = useMemo(() => escapeAnsiCtrlCodes(item), [item]);
const needsTopMarginAfterThinking = const needTopMargin = !!(
isFirstAfterThinking && inlineThinkingMode !== 'off'; (isFirstAfterThinking && inlineThinkingMode !== 'off') ||
isToolGroupBoundary
);
// If there's a topic update in this turn, we suppress the regular narration // If there's a topic update in this turn, we suppress the regular narration
// and thoughts as they are being "replaced" by the update_topic tool. // and thoughts as they are being "replaced" by the update_topic tool.
@@ -87,7 +91,7 @@ export const HistoryItemDisplay: React.FC<HistoryItemDisplayProps> = ({
flexDirection="column" flexDirection="column"
key={itemForDisplay.id} key={itemForDisplay.id}
width={terminalWidth} width={terminalWidth}
marginTop={needsTopMarginAfterThinking ? 1 : 0} marginTop={needTopMargin ? 1 : 0}
> >
{/* Render standard message types */} {/* Render standard message types */}
{itemForDisplay.type === 'thinking' && inlineThinkingMode !== 'off' && ( {itemForDisplay.type === 'thinking' && inlineThinkingMode !== 'off' && (
@@ -214,6 +218,7 @@ export const HistoryItemDisplay: React.FC<HistoryItemDisplayProps> = ({
borderTop={itemForDisplay.borderTop} borderTop={itemForDisplay.borderTop}
borderBottom={itemForDisplay.borderBottom} borderBottom={itemForDisplay.borderBottom}
isExpandable={isExpandable} isExpandable={isExpandable}
isToolGroupBoundary={isToolGroupBoundary}
/> />
)} )}
{itemForDisplay.type === 'subagent' && ( {itemForDisplay.type === 'subagent' && (
@@ -103,12 +103,16 @@ export const MainContent = () => {
item.type === 'thinking' && prevType !== 'thinking'; item.type === 'thinking' && prevType !== 'thinking';
const isFirstAfterThinking = const isFirstAfterThinking =
item.type !== 'thinking' && prevType === 'thinking'; item.type !== 'thinking' && prevType === 'thinking';
const isToolGroupBoundary =
(item.type !== 'tool_group' && prevType === 'tool_group') ||
(item.type === 'tool_group' && prevType !== 'tool_group');
return { return {
item, item,
isExpandable: i > lastUserPromptIndex, isExpandable: i > lastUserPromptIndex,
isFirstThinking, isFirstThinking,
isFirstAfterThinking, isFirstAfterThinking,
isToolGroupBoundary,
suppressNarration: suppressNarrationFlags[i] ?? false, suppressNarration: suppressNarrationFlags[i] ?? false,
}; };
}), }),
@@ -123,6 +127,7 @@ export const MainContent = () => {
isExpandable, isExpandable,
isFirstThinking, isFirstThinking,
isFirstAfterThinking, isFirstAfterThinking,
isToolGroupBoundary,
suppressNarration, suppressNarration,
}) => ( }) => (
<MemoizedHistoryItemDisplay <MemoizedHistoryItemDisplay
@@ -140,6 +145,7 @@ export const MainContent = () => {
isExpandable={isExpandable} isExpandable={isExpandable}
isFirstThinking={isFirstThinking} isFirstThinking={isFirstThinking}
isFirstAfterThinking={isFirstAfterThinking} isFirstAfterThinking={isFirstAfterThinking}
isToolGroupBoundary={isToolGroupBoundary}
suppressNarration={suppressNarration} suppressNarration={suppressNarration}
/> />
), ),
@@ -175,6 +181,9 @@ export const MainContent = () => {
item.type === 'thinking' && prevType !== 'thinking'; item.type === 'thinking' && prevType !== 'thinking';
const isFirstAfterThinking = const isFirstAfterThinking =
item.type !== 'thinking' && prevType === 'thinking'; item.type !== 'thinking' && prevType === 'thinking';
const isToolGroupBoundary =
(item.type !== 'tool_group' && prevType === 'tool_group') ||
(item.type === 'tool_group' && prevType !== 'tool_group');
const suppressNarration = const suppressNarration =
suppressNarrationFlags[uiState.history.length + i] ?? false; suppressNarrationFlags[uiState.history.length + i] ?? false;
@@ -191,6 +200,7 @@ export const MainContent = () => {
isExpandable={true} isExpandable={true}
isFirstThinking={isFirstThinking} isFirstThinking={isFirstThinking}
isFirstAfterThinking={isFirstAfterThinking} isFirstAfterThinking={isFirstAfterThinking}
isToolGroupBoundary={isToolGroupBoundary}
suppressNarration={suppressNarration} suppressNarration={suppressNarration}
/> />
); );
@@ -224,6 +234,7 @@ export const MainContent = () => {
isExpandable, isExpandable,
isFirstThinking, isFirstThinking,
isFirstAfterThinking, isFirstAfterThinking,
isToolGroupBoundary,
suppressNarration, suppressNarration,
}) => ({ }) => ({
type: 'history' as const, type: 'history' as const,
@@ -231,6 +242,7 @@ export const MainContent = () => {
isExpandable, isExpandable,
isFirstThinking, isFirstThinking,
isFirstAfterThinking, isFirstAfterThinking,
isToolGroupBoundary,
suppressNarration, suppressNarration,
}), }),
), ),
@@ -266,6 +278,7 @@ export const MainContent = () => {
isExpandable={item.isExpandable} isExpandable={item.isExpandable}
isFirstThinking={item.isFirstThinking} isFirstThinking={item.isFirstThinking}
isFirstAfterThinking={item.isFirstAfterThinking} isFirstAfterThinking={item.isFirstAfterThinking}
isToolGroupBoundary={item.isToolGroupBoundary}
suppressNarration={item.suppressNarration} suppressNarration={item.suppressNarration}
/> />
); );
@@ -43,12 +43,10 @@ Tips for getting started:
│ ✓ tool1 Description for tool 1 │ │ ✓ tool1 Description for tool 1 │
│ │ │ │
╰──────────────────────────────────────────────────────────────────────────╯ ╰──────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────────────────────────╮
│ ✓ tool2 Description for tool 2 │ │ ✓ tool2 Description for tool 2 │
│ │ │ │
╰──────────────────────────────────────────────────────────────────────────╯ ╰──────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────────────────────────╮
│ o tool3 Description for tool 3 │ │ o tool3 Description for tool 3 │
│ │ │ │
@@ -95,7 +93,6 @@ Tips for getting started:
│ ✓ tool1 Description for tool 1 │ │ ✓ tool1 Description for tool 1 │
│ │ │ │
╰──────────────────────────────────────────────────────────────────────────╯ ╰──────────────────────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────────────────────────╮
│ ✓ tool2 Description for tool 2 │ │ ✓ tool2 Description for tool 2 │
│ │ │ │
@@ -3,6 +3,7 @@
exports[`MainContent > MainContent Tool Output Height Logic > 'ASB mode - Focused shell should expand' 1`] = ` exports[`MainContent > MainContent Tool Output Height Logic > 'ASB mode - Focused shell should expand' 1`] = `
"ScrollableList "ScrollableList
AppHeader(full) AppHeader(full)
╭──────────────────────────────────────────────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────────────────────────────────────────────╮
│ ⠋ Shell Command Running a long command... │ │ ⠋ Shell Command Running a long command... │
│ │ │ │
@@ -23,6 +24,7 @@ AppHeader(full)
exports[`MainContent > MainContent Tool Output Height Logic > 'ASB mode - Unfocused shell' 1`] = ` exports[`MainContent > MainContent Tool Output Height Logic > 'ASB mode - Unfocused shell' 1`] = `
"ScrollableList "ScrollableList
AppHeader(full) AppHeader(full)
╭──────────────────────────────────────────────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────────────────────────────────────────────╮
│ ⠋ Shell Command Running a long command... │ │ ⠋ Shell Command Running a long command... │
│ │ │ │
@@ -42,6 +44,7 @@ AppHeader(full)
exports[`MainContent > MainContent Tool Output Height Logic > 'Normal mode - Constrained height' 1`] = ` exports[`MainContent > MainContent Tool Output Height Logic > 'Normal mode - Constrained height' 1`] = `
"AppHeader(full) "AppHeader(full)
╭──────────────────────────────────────────────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────────────────────────────────────────────╮
│ ⠋ Shell Command Running a long command... │ │ ⠋ Shell Command Running a long command... │
│ │ │ │
@@ -61,6 +64,7 @@ exports[`MainContent > MainContent Tool Output Height Logic > 'Normal mode - Con
exports[`MainContent > MainContent Tool Output Height Logic > 'Normal mode - Unconstrained height' 1`] = ` exports[`MainContent > MainContent Tool Output Height Logic > 'Normal mode - Unconstrained height' 1`] = `
"AppHeader(full) "AppHeader(full)
╭──────────────────────────────────────────────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────────────────────────────────────────────╮
│ ⠋ Shell Command Running a long command... │ │ ⠋ Shell Command Running a long command... │
│ │ │ │
@@ -93,6 +97,7 @@ exports[`MainContent > renders a ToolConfirmationQueue without an extra line whe
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
> Apply plan > Apply plan
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
╭──────────────────────────────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────────────────────────────╮
│ Ready to start implementation? │ │ Ready to start implementation? │
│ │ │ │
@@ -103,6 +108,7 @@ exports[`MainContent > renders a ToolConfirmationQueue without an extra line whe
exports[`MainContent > renders a split tool group without a gap between static and pending areas 1`] = ` exports[`MainContent > renders a split tool group without a gap between static and pending areas 1`] = `
"AppHeader(full) "AppHeader(full)
╭──────────────────────────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────────────────────────╮
│ ✓ test-tool A tool for testing │ │ ✓ test-tool A tool for testing │
│ │ │ │
@@ -128,6 +134,7 @@ exports[`MainContent > renders a subagent with a complete box including bottom b
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
> Investigate > Investigate
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
╭──────────────────────────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────────────────────────╮
│ ≡ Running Agent... (ctrl+o to collapse) │ │ ≡ Running Agent... (ctrl+o to collapse) │
│ │ │ │
@@ -113,6 +113,7 @@ interface ToolGroupMessageProps {
borderTop?: boolean; borderTop?: boolean;
borderBottom?: boolean; borderBottom?: boolean;
isExpandable?: boolean; isExpandable?: boolean;
isToolGroupBoundary?: boolean;
} }
// Main component renders the border and maps the tools using ToolMessage // Main component renders the border and maps the tools using ToolMessage
@@ -126,6 +127,7 @@ export const ToolGroupMessage: React.FC<ToolGroupMessageProps> = ({
borderTop: borderTopOverride, borderTop: borderTopOverride,
borderBottom: borderBottomOverride, borderBottom: borderBottomOverride,
isExpandable, isExpandable,
isToolGroupBoundary,
}) => { }) => {
const settings = useSettings(); const settings = useSettings();
const isLowErrorVerbosity = settings.merged.ui?.errorVerbosity !== 'full'; const isLowErrorVerbosity = settings.merged.ui?.errorVerbosity !== 'full';
@@ -219,10 +221,11 @@ export const ToolGroupMessage: React.FC<ToolGroupMessageProps> = ({
const staticHeight = useMemo(() => { const staticHeight = useMemo(() => {
let height = 0; let height = 0;
for (let i = 0; i < groupedTools.length; i++) { for (let i = 0; i < groupedTools.length; i++) {
const group = groupedTools[i]; const group = groupedTools[i];
const isFirst = i === 0;
const isLast = i === groupedTools.length - 1; const isLast = i === groupedTools.length - 1;
const prevGroup = i > 0 ? groupedTools[i - 1] : null; const prevGroup = i > 0 ? groupedTools[i - 1] : null;
const prevIsCompact = const prevIsCompact =
prevGroup && prevGroup &&
@@ -235,42 +238,85 @@ export const ToolGroupMessage: React.FC<ToolGroupMessageProps> = ({
!Array.isArray(nextGroup) && !Array.isArray(nextGroup) &&
isCompactTool(nextGroup, isCompactModeEnabled); isCompactTool(nextGroup, isCompactModeEnabled);
const nextIsTopicToolCall =
nextGroup && !Array.isArray(nextGroup) && isTopicTool(nextGroup.name);
const isAgentGroup = Array.isArray(group); const isAgentGroup = Array.isArray(group);
const isCompact = const isCompact =
!isAgentGroup && isCompactTool(group, isCompactModeEnabled); !isAgentGroup && isCompactTool(group, isCompactModeEnabled);
const isTopicToolCall = !isAgentGroup && isTopicTool(group.name);
const showClosingBorder = !isCompact && (nextIsCompact || isLast); // Align isFirst logic with rendering
let isFirst = i === 0;
if (isFirst) { if (!isFirst) {
height += borderTopOverride ? 1 : 0; // Check if all previous tools were topics (matches rendering logic exactly)
} else if (isCompact !== prevIsCompact) { let allPreviousTopics = true;
// Add a 1-line gap when transitioning between compact and standard tools (or vice versa) for (let j = 0; j < i; j++) {
height += 1; const prevGroupItem = groupedTools[j];
if (
Array.isArray(prevGroupItem) ||
!isTopicTool(prevGroupItem.name)
) {
allPreviousTopics = false;
break;
}
}
isFirst = allPreviousTopics;
} }
const isFirstProp = !!(isFirst const isFirstProp = !!(isFirst
? (borderTopOverride ?? true) ? (borderTopOverride ?? true)
: prevIsCompact); : prevIsCompact);
const showClosingBorder =
!isCompact &&
!isTopicToolCall &&
(nextIsCompact || nextIsTopicToolCall || isLast);
if (isAgentGroup) { if (isAgentGroup) {
// Agent group // Agent Group Spacing Breakdown:
height += 1; // Header // 1. Top Boundary (0 or 1): Only present via borderTop if isFirstProp is true.
height += group.length; // 1 line per agent // 2. Header Content (1): The "≡ Running Agent..." status text.
if (isFirstProp) height += 1; // Top border // 3. Agent List (group.length lines): One line per agent in the group.
if (showClosingBorder) height += 1; // Bottom border // 4. Closing Border (1): Added if transition logic (showClosingBorder) requires it.
height +=
(isFirstProp ? 1 : 0) +
1 +
group.length +
(showClosingBorder ? 1 : 0);
} else if (isTopicToolCall) {
// Topic Message Spacing Breakdown:
// 1. Top Margin (1): Present unless it's the very first item following a boundary.
// 2. Topic Content (1).
// 3. Bottom Margin (1): Always present around TopicMessage for breathing room.
const hasTopMargin = !(isFirst && isToolGroupBoundary);
height += (hasTopMargin ? 1 : 0) + 1 + 1;
} else if (isCompact) {
// Compact Tool: Always renders as a single dense line.
height += 1;
} else { } else {
if (isCompact) { // Standard Tool (ToolMessage / ShellToolMessage) Spacing Breakdown:
height += 1; // Base height for compact tool // 1. TOOL_RESULT_STANDARD_RESERVED_LINE_COUNT (4) accounts for the top boundary,
} else { // internal separator, header padding, and the group closing border.
// Static overhead for standard tool header: // (Subtract 1 to isolate the group-level closing border.)
height += // 2. Header Content (1): TOOL_RESULT_STATIC_HEIGHT (the tool name/status).
TOOL_RESULT_STATIC_HEIGHT + // 3. Output File Message (1): (conditional) if outputFile is present.
TOOL_RESULT_STANDARD_RESERVED_LINE_COUNT; // 4. Group Closing Border (1): (conditional) if transition logic (showClosingBorder) requires it.
} height +=
TOOL_RESULT_STANDARD_RESERVED_LINE_COUNT -
1 +
TOOL_RESULT_STATIC_HEIGHT +
(group.outputFile ? 1 : 0) +
(showClosingBorder ? 1 : 0);
} }
} }
return height; return height;
}, [groupedTools, isCompactModeEnabled, borderTopOverride]); }, [
groupedTools,
isCompactModeEnabled,
borderTopOverride,
isToolGroupBoundary,
]);
let countToolCallsWithResults = 0; let countToolCallsWithResults = 0;
for (const tool of visibleToolCalls) { for (const tool of visibleToolCalls) {
@@ -325,9 +371,7 @@ export const ToolGroupMessage: React.FC<ToolGroupMessageProps> = ({
*/ */
width={terminalWidth} width={terminalWidth}
paddingRight={TOOL_MESSAGE_HORIZONTAL_MARGIN} paddingRight={TOOL_MESSAGE_HORIZONTAL_MARGIN}
// When border will be present, add margin of 1 to create spacing from the marginBottom={0}
// previous message.
marginBottom={(borderBottomOverride ?? true) ? 1 : 0}
> >
{visibleToolCalls.length === 0 && {visibleToolCalls.length === 0 &&
isExplicitClosingSlice && isExplicitClosingSlice &&
@@ -371,41 +415,27 @@ export const ToolGroupMessage: React.FC<ToolGroupMessageProps> = ({
nextGroup && nextGroup &&
!Array.isArray(nextGroup) && !Array.isArray(nextGroup) &&
isCompactTool(nextGroup, isCompactModeEnabled); isCompactTool(nextGroup, isCompactModeEnabled);
const nextIsTopicToolCall =
nextGroup && !Array.isArray(nextGroup) && isTopicTool(nextGroup.name);
const isAgentGroup = Array.isArray(group); const isAgentGroup = Array.isArray(group);
const isCompact = const isCompact =
!isAgentGroup && isCompactTool(group, isCompactModeEnabled); !isAgentGroup && isCompactTool(group, isCompactModeEnabled);
const isTopicToolCall = !isAgentGroup && isTopicTool(group.name); const isTopicToolCall = !isAgentGroup && isTopicTool(group.name);
// When border is present, add margin of 1 to create spacing from the
// previous message.
let marginTop = 0;
if (isFirst) {
marginTop = (borderTopOverride ?? false) ? 1 : 0;
} else if (isCompact && prevIsCompact) {
marginTop = 0;
} else if (isCompact || prevIsCompact) {
marginTop = 1;
} else {
// For subsequent standard tools scenarios, the ToolMessage and
// ShellToolMessage components manage their own top spacing by passing
// `isFirst=false` to their internal StickyHeader which then applies
// a paddingTop=1 to create desired gap between standard tool outputs.
marginTop = 0;
}
const isFirstProp = !!(isFirst const isFirstProp = !!(isFirst
? (borderTopOverride ?? true) ? (borderTopOverride ?? true)
: prevIsCompact); : prevIsCompact);
const showClosingBorder = const showClosingBorder =
!isCompact && !isTopicToolCall && (nextIsCompact || isLast); !isCompact &&
!isTopicToolCall &&
(nextIsCompact || nextIsTopicToolCall || isLast);
if (isAgentGroup) { if (isAgentGroup) {
return ( return (
<Box <Box
key={group[0].callId} key={group[0].callId}
marginTop={marginTop}
flexDirection="column" flexDirection="column"
width={contentWidth} width={contentWidth}
> >
@@ -450,16 +480,16 @@ export const ToolGroupMessage: React.FC<ToolGroupMessageProps> = ({
return ( return (
<Fragment key={tool.callId}> <Fragment key={tool.callId}>
<Box <Box flexDirection="column" minHeight={1} width={contentWidth}>
flexDirection="column"
minHeight={1}
width={contentWidth}
marginTop={marginTop}
>
{isCompact ? ( {isCompact ? (
<DenseToolMessage {...commonProps} /> <DenseToolMessage {...commonProps} />
) : isTopicToolCall ? ( ) : isTopicToolCall ? (
<TopicMessage {...commonProps} /> <Box
marginTop={isFirst && isToolGroupBoundary ? 0 : 1}
marginBottom={1}
>
<TopicMessage {...commonProps} />
</Box>
) : isShellToolCall ? ( ) : isShellToolCall ? (
<ShellToolMessage {...commonProps} config={config} /> <ShellToolMessage {...commonProps} config={config} />
) : ( ) : (
@@ -2,7 +2,6 @@
exports[`ToolGroupMessage Compact Rendering > does not add an extra empty line between a compact tool and a standard tool 1`] = ` exports[`ToolGroupMessage Compact Rendering > does not add an extra empty line between a compact tool and a standard tool 1`] = `
" ✓ ReadFolder Listing files → file1.txt " ✓ ReadFolder Listing files → file1.txt
╭──────────────────────────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────────────────────────╮
│ ✓ non-compact-tool Doing something │ │ ✓ non-compact-tool Doing something │
│ │ │ │
@@ -17,7 +16,6 @@ exports[`ToolGroupMessage Compact Rendering > does not add an extra empty line b
│ │ │ │
│ some large output │ │ some large output │
╰──────────────────────────────────────────────────────────────────────────╯ ╰──────────────────────────────────────────────────────────────────────────╯
✓ ReadFolder Listing files → file1.txt ✓ ReadFolder Listing files → file1.txt
" "
`; `;
@@ -62,8 +62,9 @@ exports[`<ToolGroupMessage /> > Golden Snapshots > renders empty tool calls arra
exports[`<ToolGroupMessage /> > Golden Snapshots > renders header when scrolled 1`] = ` exports[`<ToolGroupMessage /> > Golden Snapshots > renders header when scrolled 1`] = `
"╭──────────────────────────────────────────────────────────────────────────╮ "╭──────────────────────────────────────────────────────────────────────────╮
│ ✓ tool-1 Description 1. This is a long description that will need to b… │ │ ✓ tool-1 Description 1. This is a long description that will need to b… │
│──────────────────────────────────────────────────────────────────────────│ │──────────────────────────────────────────────────────────────────────────│
│ line3 │ █
│ line4 │ █ │ line4 │ █
│ line5 │ █ │ line5 │ █
│ │ █ │ │ █
@@ -72,12 +73,13 @@ exports[`<ToolGroupMessage /> > Golden Snapshots > renders header when scrolled
│ line1 │ █ │ line1 │ █
│ line2 │ █ │ line2 │ █
╰──────────────────────────────────────────────────────────────────────────╯ █ ╰──────────────────────────────────────────────────────────────────────────╯ █
" "
`; `;
exports[`<ToolGroupMessage /> > Golden Snapshots > renders mixed tool calls including update_topic 1`] = ` exports[`<ToolGroupMessage /> > Golden Snapshots > renders mixed tool calls including update_topic 1`] = `
" Testing Topic: This is the description "
Testing Topic: This is the description
╭──────────────────────────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────────────────────────╮
│ ✓ read_file Read a file │ │ ✓ read_file Read a file │
│ │ │ │
@@ -131,17 +133,18 @@ exports[`<ToolGroupMessage /> > Golden Snapshots > renders tool call with output
`; `;
exports[`<ToolGroupMessage /> > Golden Snapshots > renders two tool groups where only the last line of the previous group is visible 1`] = ` exports[`<ToolGroupMessage /> > Golden Snapshots > renders two tool groups where only the last line of the previous group is visible 1`] = `
"────────────────────────────────────────────────────────────────────────── "──────────────────────────────────────────────────────────────────────────
╭──────────────────────────────────────────────────────────────────────────╮
│ ✓ tool-2 Description 2 │ │ ✓ tool-2 Description 2 │
│ │ │ │
│ line1 │ │ line1 │
╰──────────────────────────────────────────────────────────────────────────╯ █ ╰──────────────────────────────────────────────────────────────────────────╯ █
" "
`; `;
exports[`<ToolGroupMessage /> > Golden Snapshots > renders update_topic tool call using TopicMessage > update_topic_tool 1`] = ` exports[`<ToolGroupMessage /> > Golden Snapshots > renders update_topic tool call using TopicMessage > update_topic_tool 1`] = `
" Testing Topic: This is the description "
Testing Topic: This is the description
" "
`; `;
@@ -2,7 +2,7 @@
exports[`ToolMessage Sticky Header Regression > verifies that ShellToolMessage in a ToolGroupMessage in a ScrollableList has sticky headers 1`] = ` exports[`ToolMessage Sticky Header Regression > verifies that ShellToolMessage in a ToolGroupMessage in a ScrollableList has sticky headers 1`] = `
"╭────────────────────────────────────────────────────────────────────────╮ █ "╭────────────────────────────────────────────────────────────────────────╮ █
│ ✓ Shell Command Description for Shell Command │ │ ✓ Shell Command Description for Shell Command │
│ │ │ │
│ shell-01 │ │ shell-01 │
│ shell-02 │ │ shell-02 │
@@ -11,7 +11,7 @@ exports[`ToolMessage Sticky Header Regression > verifies that ShellToolMessage i
exports[`ToolMessage Sticky Header Regression > verifies that ShellToolMessage in a ToolGroupMessage in a ScrollableList has sticky headers 2`] = ` exports[`ToolMessage Sticky Header Regression > verifies that ShellToolMessage in a ToolGroupMessage in a ScrollableList has sticky headers 2`] = `
"╭────────────────────────────────────────────────────────────────────────╮ "╭────────────────────────────────────────────────────────────────────────╮
│ ✓ Shell Command Description for Shell Command │ │ ✓ Shell Command Description for Shell Command │
│────────────────────────────────────────────────────────────────────────│ █ │────────────────────────────────────────────────────────────────────────│ █
│ shell-06 │ ▀ │ shell-06 │ ▀
│ shell-07 │ │ shell-07 │
@@ -1,8 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="920" height="343" viewBox="0 0 920 343"> <svg xmlns="http://www.w3.org/2000/svg" width="920" height="360" viewBox="0 0 920 360">
<style> <style>
text { font-family: Consolas, "Courier New", monospace; font-size: 14px; dominant-baseline: text-before-edge; white-space: pre; } text { font-family: Consolas, "Courier New", monospace; font-size: 14px; dominant-baseline: text-before-edge; white-space: pre; }
</style> </style>
<rect width="920" height="343" fill="#000000" /> <rect width="920" height="360" fill="#000000" />
<g transform="translate(10, 10)"> <g transform="translate(10, 10)">
<text x="9" y="19" fill="#4796e4" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="9" y="19" fill="#4796e4" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="18" y="19" fill="#6688d9" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="18" y="19" fill="#6688d9" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
@@ -30,16 +30,16 @@
<text x="72" y="189" fill="#ffffff" textLength="189" lengthAdjust="spacingAndGlyphs"> for more information</text> <text x="72" y="189" fill="#ffffff" textLength="189" lengthAdjust="spacingAndGlyphs"> for more information</text>
<text x="0" y="206" fill="#ffffff" textLength="450" lengthAdjust="spacingAndGlyphs">3. Ask coding questions, edit code or run commands</text> <text x="0" y="206" fill="#ffffff" textLength="450" lengthAdjust="spacingAndGlyphs">3. Ask coding questions, edit code or run commands</text>
<text x="0" y="223" fill="#ffffff" textLength="315" lengthAdjust="spacingAndGlyphs">4. Be specific for the best results</text> <text x="0" y="223" fill="#ffffff" textLength="315" lengthAdjust="spacingAndGlyphs">4. Be specific for the best results</text>
<text x="0" y="240" fill="#ffffaf" textLength="864" lengthAdjust="spacingAndGlyphs">╭──────────────────────────────────────────────────────────────────────────────────────────────╮</text> <text x="0" y="257" fill="#ffffaf" textLength="864" lengthAdjust="spacingAndGlyphs">╭──────────────────────────────────────────────────────────────────────────────────────────────╮</text>
<text x="0" y="257" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="18" y="257" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="45" y="257" fill="#ffffff" textLength="153" lengthAdjust="spacingAndGlyphs" font-weight="bold">google_web_search</text>
<text x="855" y="257" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="0" y="274" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="0" y="274" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="18" y="274" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="45" y="274" fill="#ffffff" textLength="153" lengthAdjust="spacingAndGlyphs" font-weight="bold">google_web_search</text>
<text x="855" y="274" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="855" y="274" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="0" y="291" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="0" y="291" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="18" y="291" fill="#ffffff" textLength="108" lengthAdjust="spacingAndGlyphs">Searching...</text>
<text x="855" y="291" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="855" y="291" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="0" y="308" fill="#ffffaf" textLength="864" lengthAdjust="spacingAndGlyphs">╰──────────────────────────────────────────────────────────────────────────────────────────────╯</text> <text x="0" y="308" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="18" y="308" fill="#ffffff" textLength="108" lengthAdjust="spacingAndGlyphs">Searching...</text>
<text x="855" y="308" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="0" y="325" fill="#ffffaf" textLength="864" lengthAdjust="spacingAndGlyphs">╰──────────────────────────────────────────────────────────────────────────────────────────────╯</text>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

@@ -1,8 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="920" height="343" viewBox="0 0 920 343"> <svg xmlns="http://www.w3.org/2000/svg" width="920" height="360" viewBox="0 0 920 360">
<style> <style>
text { font-family: Consolas, "Courier New", monospace; font-size: 14px; dominant-baseline: text-before-edge; white-space: pre; } text { font-family: Consolas, "Courier New", monospace; font-size: 14px; dominant-baseline: text-before-edge; white-space: pre; }
</style> </style>
<rect width="920" height="343" fill="#000000" /> <rect width="920" height="360" fill="#000000" />
<g transform="translate(10, 10)"> <g transform="translate(10, 10)">
<text x="9" y="19" fill="#4796e4" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="9" y="19" fill="#4796e4" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="18" y="19" fill="#6688d9" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="18" y="19" fill="#6688d9" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
@@ -30,16 +30,16 @@
<text x="72" y="189" fill="#ffffff" textLength="189" lengthAdjust="spacingAndGlyphs"> for more information</text> <text x="72" y="189" fill="#ffffff" textLength="189" lengthAdjust="spacingAndGlyphs"> for more information</text>
<text x="0" y="206" fill="#ffffff" textLength="450" lengthAdjust="spacingAndGlyphs">3. Ask coding questions, edit code or run commands</text> <text x="0" y="206" fill="#ffffff" textLength="450" lengthAdjust="spacingAndGlyphs">3. Ask coding questions, edit code or run commands</text>
<text x="0" y="223" fill="#ffffff" textLength="315" lengthAdjust="spacingAndGlyphs">4. Be specific for the best results</text> <text x="0" y="223" fill="#ffffff" textLength="315" lengthAdjust="spacingAndGlyphs">4. Be specific for the best results</text>
<text x="0" y="240" fill="#87afff" textLength="864" lengthAdjust="spacingAndGlyphs">╭──────────────────────────────────────────────────────────────────────────────────────────────╮</text> <text x="0" y="257" fill="#87afff" textLength="864" lengthAdjust="spacingAndGlyphs">╭──────────────────────────────────────────────────────────────────────────────────────────────╮</text>
<text x="0" y="257" fill="#87afff" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="18" y="257" fill="#87afff" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="45" y="257" fill="#ffffff" textLength="153" lengthAdjust="spacingAndGlyphs" font-weight="bold">run_shell_command</text>
<text x="855" y="257" fill="#87afff" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="0" y="274" fill="#87afff" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="0" y="274" fill="#87afff" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="18" y="274" fill="#87afff" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="45" y="274" fill="#ffffff" textLength="153" lengthAdjust="spacingAndGlyphs" font-weight="bold">run_shell_command</text>
<text x="855" y="274" fill="#87afff" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="855" y="274" fill="#87afff" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="0" y="291" fill="#87afff" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="0" y="291" fill="#87afff" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="18" y="291" fill="#ffffff" textLength="162" lengthAdjust="spacingAndGlyphs">Running command...</text>
<text x="855" y="291" fill="#87afff" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="855" y="291" fill="#87afff" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="0" y="308" fill="#87afff" textLength="864" lengthAdjust="spacingAndGlyphs">╰──────────────────────────────────────────────────────────────────────────────────────────────╯</text> <text x="0" y="308" fill="#87afff" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="18" y="308" fill="#ffffff" textLength="162" lengthAdjust="spacingAndGlyphs">Running command...</text>
<text x="855" y="308" fill="#87afff" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="0" y="325" fill="#87afff" textLength="864" lengthAdjust="spacingAndGlyphs">╰──────────────────────────────────────────────────────────────────────────────────────────────╯</text>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

@@ -1,8 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="920" height="343" viewBox="0 0 920 343"> <svg xmlns="http://www.w3.org/2000/svg" width="920" height="360" viewBox="0 0 920 360">
<style> <style>
text { font-family: Consolas, "Courier New", monospace; font-size: 14px; dominant-baseline: text-before-edge; white-space: pre; } text { font-family: Consolas, "Courier New", monospace; font-size: 14px; dominant-baseline: text-before-edge; white-space: pre; }
</style> </style>
<rect width="920" height="343" fill="#000000" /> <rect width="920" height="360" fill="#000000" />
<g transform="translate(10, 10)"> <g transform="translate(10, 10)">
<text x="9" y="19" fill="#4796e4" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="9" y="19" fill="#4796e4" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="18" y="19" fill="#6688d9" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="18" y="19" fill="#6688d9" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
@@ -30,16 +30,16 @@
<text x="72" y="189" fill="#ffffff" textLength="189" lengthAdjust="spacingAndGlyphs"> for more information</text> <text x="72" y="189" fill="#ffffff" textLength="189" lengthAdjust="spacingAndGlyphs"> for more information</text>
<text x="0" y="206" fill="#ffffff" textLength="450" lengthAdjust="spacingAndGlyphs">3. Ask coding questions, edit code or run commands</text> <text x="0" y="206" fill="#ffffff" textLength="450" lengthAdjust="spacingAndGlyphs">3. Ask coding questions, edit code or run commands</text>
<text x="0" y="223" fill="#ffffff" textLength="315" lengthAdjust="spacingAndGlyphs">4. Be specific for the best results</text> <text x="0" y="223" fill="#ffffff" textLength="315" lengthAdjust="spacingAndGlyphs">4. Be specific for the best results</text>
<text x="0" y="240" fill="#ffffaf" textLength="864" lengthAdjust="spacingAndGlyphs">╭──────────────────────────────────────────────────────────────────────────────────────────────╮</text> <text x="0" y="257" fill="#ffffaf" textLength="864" lengthAdjust="spacingAndGlyphs">╭──────────────────────────────────────────────────────────────────────────────────────────────╮</text>
<text x="0" y="257" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="18" y="257" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="45" y="257" fill="#ffffff" textLength="153" lengthAdjust="spacingAndGlyphs" font-weight="bold">google_web_search</text>
<text x="855" y="257" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="0" y="274" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="0" y="274" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="18" y="274" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="45" y="274" fill="#ffffff" textLength="153" lengthAdjust="spacingAndGlyphs" font-weight="bold">google_web_search</text>
<text x="855" y="274" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="855" y="274" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="0" y="291" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="0" y="291" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="18" y="291" fill="#ffffff" textLength="108" lengthAdjust="spacingAndGlyphs">Searching...</text>
<text x="855" y="291" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text> <text x="855" y="291" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="0" y="308" fill="#ffffaf" textLength="864" lengthAdjust="spacingAndGlyphs">╰──────────────────────────────────────────────────────────────────────────────────────────────╯</text> <text x="0" y="308" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="18" y="308" fill="#ffffff" textLength="108" lengthAdjust="spacingAndGlyphs">Searching...</text>
<text x="855" y="308" fill="#ffffaf" textLength="9" lengthAdjust="spacingAndGlyphs"></text>
<text x="0" y="325" fill="#ffffaf" textLength="864" lengthAdjust="spacingAndGlyphs">╰──────────────────────────────────────────────────────────────────────────────────────────────╯</text>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

@@ -15,12 +15,12 @@ Tips for getting started:
2. /help for more information 2. /help for more information
3. Ask coding questions, edit code or run commands 3. Ask coding questions, edit code or run commands
4. Be specific for the best results 4. Be specific for the best results
╭──────────────────────────────────────────────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────────────────────────────────────────────╮
│ ⊶ google_web_search │ │ ⊶ google_web_search │
│ │ │ │
│ Searching... │ │ Searching... │
╰──────────────────────────────────────────────────────────────────────────────────────────────╯ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯"
"
`; `;
exports[`MainContent tool group border SVG snapshots > should render SVG snapshot for a shell tool 1`] = ` exports[`MainContent tool group border SVG snapshots > should render SVG snapshot for a shell tool 1`] = `
@@ -38,12 +38,12 @@ Tips for getting started:
2. /help for more information 2. /help for more information
3. Ask coding questions, edit code or run commands 3. Ask coding questions, edit code or run commands
4. Be specific for the best results 4. Be specific for the best results
╭──────────────────────────────────────────────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────────────────────────────────────────────╮
│ ⊶ run_shell_command │ │ ⊶ run_shell_command │
│ │ │ │
│ Running command... │ │ Running command... │
╰──────────────────────────────────────────────────────────────────────────────────────────────╯ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯"
"
`; `;
exports[`MainContent tool group border SVG snapshots > should render SVG snapshot for an empty slice following a search tool 1`] = ` exports[`MainContent tool group border SVG snapshots > should render SVG snapshot for an empty slice following a search tool 1`] = `
@@ -61,10 +61,10 @@ Tips for getting started:
2. /help for more information 2. /help for more information
3. Ask coding questions, edit code or run commands 3. Ask coding questions, edit code or run commands
4. Be specific for the best results 4. Be specific for the best results
╭──────────────────────────────────────────────────────────────────────────────────────────────╮ ╭──────────────────────────────────────────────────────────────────────────────────────────────╮
│ ⊶ google_web_search │ │ ⊶ google_web_search │
│ │ │ │
│ Searching... │ │ Searching... │
╰──────────────────────────────────────────────────────────────────────────────────────────────╯ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯"
"
`; `;