fix(tui): G jumps to last log; Agents ←/→ switch panes

The global "switch to Settings" shortcut matched both g and G, so
uppercase G never reached the logs panel and the vim-style "jump to
end" never fired. Restrict the global handler to lowercase g; G
falls through to the active panel — including the status-mode logs
list (jump-to-newest) and any other scrollable panel that opts in.

Agents view: ← focuses the list pane, → focuses the detail pane,
matching the visual layout. Tab still cycles either direction.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsxdsm
2026-04-25 00:11:49 -07:00
parent 21569e6d48
commit d46aa988cc

View File

@@ -1491,8 +1491,9 @@ function BoardView({ state, controller }: { state: DashboardState; controller: D
} }
// Cross-view shortcuts — explicit so they work regardless of any // Cross-view shortcuts — explicit so they work regardless of any
// global-handler ordering quirks. p/n stay board-local. // global-handler ordering quirks. Lowercase only; uppercase G is
if (input === "g" || input === "G") { // reserved for "jump to end" semantics in scrollable panels.
if (input === "g") {
controller.setInteractiveView("settings"); controller.setInteractiveView("settings");
return; return;
} }
@@ -1774,10 +1775,21 @@ function AgentsView({ state }: { state: DashboardState }) {
return; return;
} }
// Tab cycles list ↔ detail. Left/right also switch — the list is the
// "left" pane and detail the "right" pane, so the arrow direction
// matches the visual layout.
if (key.tab) { if (key.tab) {
setDetailFocused((f) => !f); setDetailFocused((f) => !f);
return; return;
} }
if (key.leftArrow) {
setDetailFocused(false);
return;
}
if (key.rightArrow) {
setDetailFocused(true);
return;
}
if (!detailFocused) { if (!detailFocused) {
if (key.upArrow || input === "k") { if (key.upArrow || input === "k") {
@@ -3425,7 +3437,9 @@ export function DashboardApp({ controller }: DashboardAppProps) {
controller.setInteractiveView("agents"); controller.setInteractiveView("agents");
return; return;
} }
if (input === "g" || input === "G") { // Lowercase only — uppercase G is reserved for vim-style "jump to end"
// in panels that opt-in (e.g. logs in status mode, file preview, etc.).
if (input === "g") {
controller.setMode("interactive"); controller.setMode("interactive");
controller.setInteractiveView("settings"); controller.setInteractiveView("settings");
return; return;