feat(gastown): configurable terminal orientation with drag-to-resize#1299
Merged
feat(gastown): configurable terminal orientation with drag-to-resize#1299
Conversation
Contributor
Code Review SummaryStatus: 2 Issues Found | Recommendation: Address before merge Overview
Fix these issues in Kilo Cloud Issue Details (click to expand)No new issues in the incremental diff. Other Observations (not in diff)Issues found in unchanged code that cannot receive inline comments:
Files Reviewed (1 files)
Reviewed by gpt-5.4-20260305 · 258,239 tokens |
…1237) Terminal bar can be positioned at bottom/top/left/right with drag-to-resize. Position and size persisted to localStorage. Collapsed state only reserves the tab bar strip. Dynamic page padding replaces static pb-[340px]. DrawerStack offsets when terminal is on the right.
…tton Re-clamp persisted size when switching position so horizontal minimum (100px) doesn't persist as a too-small vertical width (min 200px). Show close button on agent tabs in vertical mode via absolute positioning on hover.
e852334 to
1a4a5e5
Compare
| style={{ | ||
| right: rightOffset, | ||
| width: DRAWER_WIDTH, | ||
| maxWidth: '94vw', |
Contributor
There was a problem hiding this comment.
WARNING: Drawer width is still capped against the full viewport
When the terminal is docked on the right, rightOffset can grow to COLLAPSED_SIZE + size, but the drawer still uses maxWidth: '94vw'. On narrower viewports, a wide right-side terminal pushes the drawer's left edge off-screen because the width limit does not subtract the reserved terminal space. Clamp against the remaining width (for example calc(100vw - rightOffset)) before applying the offset.
…/right orientations - Make resize handle a flex child instead of absolute positioned to avoid z-index conflicts with framer-motion stacking contexts - Add visible hover indicator pill on resize handle for discoverability - Remove width/height from CSS transition so drag resize is immediate - Use fixed positioning with viewport clamping for position picker popup to prevent overflow on left/right orientations
pandemicsyn
approved these changes
Mar 21, 2026
jrf0110
added a commit
that referenced
this pull request
Mar 21, 2026
…age (#1365) * feat(gastown): configurable terminal orientation with drag-to-resize (#1299) * feat(gastown): configurable terminal orientation and drag-to-resize (#1237) Terminal bar can be positioned at bottom/top/left/right with drag-to-resize. Position and size persisted to localStorage. Collapsed state only reserves the tab bar strip. Dynamic page padding replaces static pb-[340px]. DrawerStack offsets when terminal is on the right. * fix(gastown): clamp size on orientation switch, add vertical close button Re-clamp persisted size when switching position so horizontal minimum (100px) doesn't persist as a too-small vertical width (min 200px). Show close button on agent tabs in vertical mode via absolute positioning on hover. * fix(gastown): fix terminal resize handle and position picker for left/right orientations - Make resize handle a flex child instead of absolute positioned to avoid z-index conflicts with framer-motion stacking contexts - Add visible hover indicator pill on resize handle for discoverability - Remove width/height from CSS transition so drag resize is immediate - Use fixed positioning with viewport clamping for position picker popup to prevent overflow on left/right orientations * chore: cherry-pick getMergeQueueData types from bead 0 * feat(gastown): build 'Needs Your Attention' section for Merge Queue page Add NeedsAttention component with: - Three attention categories: open PRs, failed reviews, stale PRs - Convoy grouping with header cards showing progress, branch, merge mode - Action buttons: Open PR, Retry Review, Fail Bead, View Bead - DrawerStack integration for bead and convoy drawer opening - Confirmation dialogs for destructive actions - Empty state when no items need attention Rewrite MergesPageClient to use getMergeQueueData tRPC procedure with 5s polling interval.
jrf0110
added a commit
that referenced
this pull request
Mar 23, 2026
… log (#1378) * feat(gastown): add getMergeQueueData tRPC procedure for merge queue page Add a dedicated tRPC query that returns structured merge queue data: - needsAttention section with openPRs, failedReviews, and stalePRs - activityLog with enriched review-related bead events - Full JOINs to review_metadata, source beads, convoy_metadata, agents, rigs - Input params: townId (required), rigId, limit, since for filtering/polling - Zod schemas with rpcSafe wrappers and type declarations for frontend * feat(gastown): build 'Needs Your Attention' section for Merge Queue page (#1365) * feat(gastown): configurable terminal orientation with drag-to-resize (#1299) * feat(gastown): configurable terminal orientation and drag-to-resize (#1237) Terminal bar can be positioned at bottom/top/left/right with drag-to-resize. Position and size persisted to localStorage. Collapsed state only reserves the tab bar strip. Dynamic page padding replaces static pb-[340px]. DrawerStack offsets when terminal is on the right. * fix(gastown): clamp size on orientation switch, add vertical close button Re-clamp persisted size when switching position so horizontal minimum (100px) doesn't persist as a too-small vertical width (min 200px). Show close button on agent tabs in vertical mode via absolute positioning on hover. * fix(gastown): fix terminal resize handle and position picker for left/right orientations - Make resize handle a flex child instead of absolute positioned to avoid z-index conflicts with framer-motion stacking contexts - Add visible hover indicator pill on resize handle for discoverability - Remove width/height from CSS transition so drag resize is immediate - Use fixed positioning with viewport clamping for position picker popup to prevent overflow on left/right orientations * chore: cherry-pick getMergeQueueData types from bead 0 * feat(gastown): build 'Needs Your Attention' section for Merge Queue page Add NeedsAttention component with: - Three attention categories: open PRs, failed reviews, stale PRs - Convoy grouping with header cards showing progress, branch, merge mode - Action buttons: Open PR, Retry Review, Fail Bead, View Bead - DrawerStack integration for bead and convoy drawer opening - Confirmation dialogs for destructive actions - Empty state when no items need attention Rewrite MergesPageClient to use getMergeQueueData tRPC procedure with 5s polling interval. * feat(gastown): add convoy grouping and per-rig filtering to Merge Queue page (#1366) * feat(gastown): add convoy grouping and per-rig filtering to Merge Queue page - Add RefineryActivityLog with convoy grouping: entries grouped by convoy with header cards showing title, branch, progress, clickable to open convoy drawer - Add per-rig filter dropdown using listRigs query and shadcn Select, passes rigId to getMergeQueueData for server-side filtering - Include status_changed ActionType with type guard (no unsafe 'as' cast) - Polish layout: page title, rig filter, Needs Attention, Activity Log sections with consistent headers and empty states * fix(gastown): move hooks above early returns and paginate by convoy groups - Move all useMemo hooks above isLoading/empty early returns to prevent React crash when entries transition from 0 to non-zero (hooks must be called in the same order on every render) - Replace flat-entry pagination with group-based pagination: convoy groups (sorted by most recent activity) are kept whole, and standalone entries fill remaining page budget. This ensures recently active convoys appear on page 1 regardless of other convoys' sizes. * fix(gastown): interleave convoy groups and standalone entries by recency in pagination The previous pagination showed all convoy groups before any standalone entries regardless of timestamps. A standalone entry more recent than all convoy groups would still appear below them on page 1. Merge convoy groups and standalone entries into a unified DisplayItem list sorted by most-recent timestamp, then paginate over that list. Convoy groups use their latestTimestamp as sort key; standalone entries use their event.created_at. This ensures the most recently active items appear first on page 1 regardless of whether they are convoy-grouped or standalone. Hooks were already correctly placed before early returns (no conditional hooks issue in the current code). * fix(gastown): gate fail button behind admin check and fix pagination remaining count Hide the admin-only 'Fail Bead' button for non-admin users by checking isAdmin from the session. Fix the activity log pagination to compute hasMore and remaining count based on actual visible entries rather than the budget, preventing incorrect 'Show more' state when a convoy group exceeds the page budget.
4 tasks
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
pb-[340px]with aTerminalBarPaddingclient component that dynamically adjusts padding based on position, size, and collapsed state. Collapsed state only reserves the tab bar strip (38px).rightposition when the terminal is placed on the right side of the viewport.Closes #1237
Verification
pnpm typecheck— passes across all workspace packagespnpm run format:check(oxfmt) — passespnpm run lint(oxlint + eslint fallback) — passes across all packagesVisual Changes
Reviewer Notes
TerminalBarPaddingclient component was extracted because the layout files are Server Components and can't consume React context directly.DrawerStackRendererWithContextwrapper readsuseTerminalBar()to compute the drawer right offset. This is safe becauseDrawerStackProvideris always rendered insideTerminalBarProviderin both layout files.ResizeObserver+fitAddon.fit()inuseXtermPty.ts. TheMayorTerminalPaneadditionally re-fits onposition/sizechanges.MayorTerminalPaneduplicates xterm setup (identified in Fix terminal stability — WebSocket reconnection, resize debounce, control frame filtering #1195) — deduplication is out of scope for this PR.