fix(tui): make all TUI list views scrollable (#1351)#1363
Merged
Aaronontheweb merged 8 commits intoJun 9, 2026
Merged
Conversation
All SelectionList-based pages now call .WithFillHeight() so the list expands to fill the terminal and scrolls natively via Termina 0.11. McpToolPermissionsPage gets a ScrollableContainerNode wrapping a dedicated DynamicLayoutNode for tool rows, with EnsureToolCursorVisible() keeping the cursor row in the viewport. Cursor navigation invalidates only the tool rows node (not the whole content node) so the scroll container's offset survives between keystrokes. SessionsPage replaces the raw TextNode for-loop with SelectionListNode using .WithHighlightedIndex(), delegating scroll entirely to Termina. ProviderStepView drops the 30-item model truncation and "... and N more" sentinel — now that the list scrolls natively those workarounds are gone. Adds four smoke tapes (mcp-permissions, approvals, model-manager, sessions-tui) for the TUI surfaces that had no interactive coverage.
Aaronontheweb
commented
Jun 9, 2026
| private DynamicLayoutNode? _contentNode; | ||
| private DynamicLayoutNode? _footerNode; | ||
| private DynamicLayoutNode? _toolRowsNode; | ||
| private ScrollableContainerNode? _toolScrollNode; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
netclaw mcp permissionstool grid was not scrollable when a server had many tools; same gap existed on five other TUI screensSelectionList-based pages (ApprovalsManagerPage,ModelManagerPage,ProviderManagerPage,ProviderStepView) now call.WithFillHeight()— the native Termina 0.11 fill mode, removing the need for the customFillSelectionListNode<T>workaroundMcpToolPermissionsPagewraps its tool rows in aScrollableContainerNodewith a dedicatedDynamicLayoutNode; cursor navigation invalidates only the tool rows node so the scroll offset survives between keystrokes;EnsureToolCursorVisible()keeps the cursor row in the viewportSessionsPagereplaces the rawTextNodefor-loop withSelectionListNode.WithFillHeight()+.WithHighlightedIndex(), delegating scroll to TerminaProviderStepViewdrops the 30-item model truncation and"... and N more"sentinel — no longer needed now that the list scrolls nativelySmoke coverage
Adds four VHS tapes for TUI surfaces that previously had no interactive smoke coverage:
mcp-permissions.tape— opensnetclaw mcp permissions, anchors on header, exits cleanlyapprovals.tape— opensnetclaw approvals, anchors on panel title, exits cleanlymodel-manager.tape— opensnetclaw model, anchors on panel title, exits cleanlysessions-tui.tape— opensnetclaw sessions, anchors on panel title, exits cleanlyAll four run without a live daemon (exercise empty/loading-state rendering). All four added to
LIGHT_TAPES.Test plan
dotnet buildpasses (0 errors)dotnet slopwatch analyzepasses (0 new violations)./scripts/smoke/run-smoke.sh mcp-permissions— new tape./scripts/smoke/run-smoke.sh approvals— new tape./scripts/smoke/run-smoke.sh model-manager— new tape./scripts/smoke/run-smoke.sh sessions-tui— new tape./scripts/smoke/run-smoke.sh light— full light suite