mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-21 11:30:38 -07:00
1. Scaffolding and Foundation Changes
- feat(cli): add compactToolOutput ui setting
- feat(cli): add DenseToolMessage component and supporting rendering logic
- feat(cli): implement compact tool output rendering logic in ToolGroupMessage
- feat(core): add tool display name constants and update tool constructors
- feat(cli): update compact output allowlist to use DISPLAY_NAME constants
- test(cli): add compact tool output rendering and spacing tests
2. Output Layout, Borders and Spacing
- fix(ui): update ToolGroupMessage to support stitched borders and dynamic margins
- fix(ui): implement border stitching in history pushing to eliminate gaps
- test(ui): update snapshots and test assertions for new layout
- style(ui): wrap dense tool payloads with vertical margins
- Adds margins above and below dense payload content to allow compact output to consume a single line until expanded.
- fix(ui): unify spacing logic and border handling for tool groups
- Corrects transitions between compact and standard tools to not add redundant empty lines and ensures history stitching respects boundaries.
- fix(ui): ensure top border is rendered within completed history for standard tool output when following compact tool output
- Addresses an issue where non-compact tools pushed to history at the end of a batch (via onComplete) were missing their top border and proper margin if they followed compact tools already pushed to history.
- The fix updates the onComplete callback in useGeminiStream.ts to be transition-aware. It now explicitly detects when a final push starts with a non-compact tool following a compact tool from the same batch, forcing borderTop: true in that case.
- Previously, the logic relied solely on isFirstToolInGroupRef, which would be false if any earlier tools in the batch had already been pushed, causing the final non-compact tools to incorrectly inherit a borderless state from the preceding compact tools.
3. Tool Content Fixes/Changes
fix(core): use full file content for accurate diff stats in edit tool
- Ensures the edit tool uses fully calculated new file content (instead of just the replacement snippet) when generating diff stats. This prevents the bug where 'mass deletion' were inaccurately reports in the UI.
- The fix calculates the 'AI-recommended' full file state when user modifications are present. This allows getDiffStat to receive three full-file strings, maintaining accurate telemetry for AI vs. user contributions while fixing the visual bug.
feat(ui): structured compact payloads for list and grep tool output
- leverages structured object return types (ReadManyFilesResult, ListDirectoryResult, GrepResult) to enable rich, expandable compact output in the CLI.
- Updates the underlying core tools (read_many_files, ls, grep) to return these objects and wires up the UI in DenseToolMessage to parse and render them as expandable lists.
4. fix(cli,core): resolve build issues with structured tool result display
- Added `isStructuredToolResult` type guard to safely check for `summary` properties on tool results in `ToolResultDisplay`.
- Resolved `data.slice is not a function` errors in UI tests caused by structured tool results falling back to `AnsiOutput` parsing.
- Updated `DiffRenderer` assertions to include `disableColor: false`.
- Updated `ReadManyFilesTool` tests to assert against the new `ReadManyFilesResult` object structure instead of flat strings.
- wrap waitUntilReady in `act` to resolve spinner warnings
5. fix(cli): strengthen identity management and resolve key collisions / key duplication issues
- Improve history ID generation logic to be strictly increasing, preventing "Transition Race" collisions between pending and finalized items.
- Strengthen ID tracking to correctly handle session resumes by ensuring new IDs always start after the highest existing entry.
- Assign unique negative IDs and negatively indexed keys (`pending-${i}`) to pending history items in `MainContent`.
- Add a global `callIdCounter` to `acpClient` to safeguard against sub-millisecond tool call collisions.
- Harden `DenseToolMessage` rendering with stable string keys for conditional UI components.
- Update unit tests to verify strictly increasing ID generation and align with negatively indexed pending IDs.
6. consolidate Ctrl+O expansion toggle logic between shell tool and compact tool output; resolve rendering issues
Interaction:
- Unify SHOW_MORE_LINES (Ctrl+O) handler in AppContainer to atomically toggle height constraints and compact tool expansions.
- Update DenseToolMessage toggle text to "[click here to show/hide details]" for improved clarity.
Rendering:
- Adjust ToolGroupMessage and HistoryItemDisplay layout logic to correctly manage margins and spacing, especially after thinking blocks.
- Fix "Double Empty Line" issue by removing redundant top margins from the first tool in a group.
- Fix ToolStickyHeaderRegression test expectations to correctly account for 3-line headers.
- Update snapshots across multiple components to reflect layout and text refinements.
- Update generated docs and setting artifacts
Structural:
- Shifts large logic blocks within AppContainer.tsx to resolve functional dependencies related to keyboard handlers, user feedback events, and window titles.
- Hoist tool expansion state to AppContainer for centralized control and synchronized layout updates.
- Refactor ToolActionsContext.test.tsx to use real React state for verified behavior.
============================================
Rebase Cleanup
cleanup tasks
- remove redundant tool alias; simplify core tool error paths and data structures
- update default compact tool success summary text ("Returned")
- refactor ToolGroupMessage logic & border transitions across Compact, Standard, and Subagent output types
feat(ui): make result summary the *diff toggle target* and refine styling in dense output
- Makes the entire result summary (action word + stats) the clickable trigger for diff visibility.
- Styles the action word (e.g., "Accepted") with an underline to indicate interactivity.
- Removes the redundant "[click to show/hide details]" text to clean up the UI.
- Updates tests and snapshots to reflect the new interaction model.
fix(core): derive and preserve *diffstat* info for rejected edit operations
- Adds getDiffStatFromPatch utility to derive numeric stats from unified diff strings.
- Updates ToolEditConfirmationDetails to include an optional diffStat property.
- Modifies StateManager and CoreToolScheduler to populate diffStat when an edit/write is cancelled.
- Ensures the UI can display rich information (e.g., "+5, -2") for rejected operations.
- Adds a core test to verify correct stats derivation on tool rejection.
<<-- INTEGRATION OF SIGNIFICANT SUBAGENT CHANGES -->>
refactor(cli): consolidate pendingHistoryItems and remove shadowing in AppContainer
refactor(cli): refine tool layout and modernize test infrastructure
- fix(ui): remove default top margin (1 -> 0) for the first tool in a group
- Aligns with dense output goal of reducing vertical whitespace.
- Updates ToolGroupMessage.tsx to default borderTopOverride to false for margin calculation.
- refactor(test): modernize renderWithProviders and update affected tests
- Removes the legacy useAlternateBuffer prop from renderWithProviders.
- Shifts alternate buffer configuration to standard config and settings mocks for better consistency.
- Updates DenseToolMessage.test.tsx and ShellToolMessage.test.tsx to use the new pattern.
- Wraps waitUntilReady and waitFor calls in act to resolve React state update warnings.
- fix(ui): improve AskUserDialog layout and scroll visibility
- Refines maxItemsToShow logic to properly account for available terminal height.
- Ensures scroll arrows are correctly visible in alternate buffer mode.
- test(ui): update snapshots and assertions for tool layout regression tests
- Updates ToolStickyHeaderRegression.test.tsx assertions to match the new 0-line margin layout.
- Regenerates snapshots for AskUserDialog, DenseToolMessage, and ToolStickyHeaderRegression.
fix(ui): correct shell height calculation and modernize test utilities
- Update TOOL_RESULT_STANDARD_RESERVED_LINE_COUNT to 3 to match actual header overhead.
- Fix renderWithProviders to correctly respect useAlternateBuffer and dynamically load config.
- Ensure all tests await renderWithProviders for reliable component initialization.
- Refactor height calculation in tests to use layout constants and fix off-by-one errors.
- Add fake timer support to ShellToolMessage tests to resolve act() warnings from spinners.
- Refresh snapshots for MainContent, ShellToolMessage, and ToolResultDisplay.
refactor(cli): reduce code duplication while addressing /review-frontend feedback
fix(cli): resolve IDE client race condition and memory leak within `useEffect` hook in `ToolActionsContext.tsx`.
fix(cli): improve type safety for colorizeCode
- Adds function overloads to `colorizeCode` in `CodeColorizer.tsx` to correctly type the return value when `returnLines` is enabled.
- Removes unsafe `as React.ReactNode[]` cast and associated ESLint disable comment in `DenseToolMessage.tsx`.
- Adds a unit test in `CodeColorizer.test.tsx` to verify the `returnLines: true` contract.