Lead the ca Manage tree with agents instead of projects - #1067
Merged
codyde merged 3 commits intoAug 11, 2026
Merged
Conversation
Scrolling was clamped to one screenful — a documented workaround for vt100 0.15's view composition underflowing past the screen height. vt100 0.16 fixes that, and ratatui 0.30 (via ratatui-core) drops the exact unicode-width pin that blocked the upgrade. Bump both, migrate the moved Parser::set_size/set_scrollback calls to Screen, drop the one-page ceilings in scroll_by and resize, and pin the behavior with tests: full-depth scroll, multi-notch wheel walks, deep offsets across resizes, churn (output + scroll + reshape interleaved), retention-limit clamping, and a full-frame render from deep history.
Opt+] already cycles forward through open session panes; this adds the reverse chord. Opt+[ is recognized where the terminal can express it unambiguously: as a real ALT event under the kitty keyboard protocol (which the TUI already enables), or as the composed curly double quote macOS sends when Option is not mapped to Meta. Under legacy Option-as-Meta, Opt+[ is the two bytes ESC [ — identical to the CSI prefix every arrow key starts with — so it never surfaces as a key event there. The chord goes dead in those terminals but can never misfire or steal a cursor key. Also updates the footer hint to advertise both directions.
The Manage screen is about cloud agents, but they rendered at depth 3 of a workspace > project > environment > agent > session tree — two container levels to expand before reaching the thing the screen exists to show, with the environment level almost always a single-child passthrough. Invert the presentation: every environment that has agents is promoted to an always-expanded top-level group, labelled with its project (plus /env when the environment isn't production and the project has several). Agents render directly beneath with their status glyphs, sessions still nested under their agent. Groups sort by liveliness — anything running floats up — then default project, then name; the cursor is anchored by row identity so re-sorts never move the selection. Projects with agent-less environments wait in a collapsible "other projects" tail, default project first and undimmed. The tail opens itself while there are no agents to show (so a fresh account still gets the browse tree, behind a hint) and folds away once groups exist; toggling it by hand sticks. Every environment stays reachable there for n, t, and r — including empty ones in projects whose other environments have agents. Refreshes no longer blank a loaded environment while the reply is in flight, so groups stay put through the wake/sleep watch polls, and a failed refresh keeps the stale list with the error in the status line instead of hiding agents that exist. The data model and RowKind index tuples are unchanged — this is a rework of the rows() flattener, the expansion handlers, and the rendering; myCloudAgents already delivered everything at startup.
codyde
force-pushed
the
railway/agent-first-manage-tree
branch
from
August 11, 2026 05:29
88f4cb4 to
3adbda5
Compare
Base automatically changed from
railway/opt-bracket-back
to
railway/ca-manage-reset-refresh-auth
August 11, 2026 05:34
codyde
merged commit Aug 11, 2026
50c0d67
into
railway/ca-manage-reset-refresh-auth
11 checks passed
codyde
added a commit
that referenced
this pull request
Aug 11, 2026
* Unlock full scrollback depth in railway ca session panes Scrolling was clamped to one screenful — a documented workaround for vt100 0.15's view composition underflowing past the screen height. vt100 0.16 fixes that, and ratatui 0.30 (via ratatui-core) drops the exact unicode-width pin that blocked the upgrade. Bump both, migrate the moved Parser::set_size/set_scrollback calls to Screen, drop the one-page ceilings in scroll_by and resize, and pin the behavior with tests: full-depth scroll, multi-notch wheel walks, deep offsets across resizes, churn (output + scroll + reshape interleaved), retention-limit clamping, and a full-frame render from deep history. * feat(ca): add Opt+[ to cycle back to the previous session Opt+] already cycles forward through open session panes; this adds the reverse chord. Opt+[ is recognized where the terminal can express it unambiguously: as a real ALT event under the kitty keyboard protocol (which the TUI already enables), or as the composed curly double quote macOS sends when Option is not mapped to Meta. Under legacy Option-as-Meta, Opt+[ is the two bytes ESC [ — identical to the CSI prefix every arrow key starts with — so it never surfaces as a key event there. The chord goes dead in those terminals but can never misfire or steal a cursor key. Also updates the footer hint to advertise both directions. * Lead the ca Manage tree with agents instead of projects The Manage screen is about cloud agents, but they rendered at depth 3 of a workspace > project > environment > agent > session tree — two container levels to expand before reaching the thing the screen exists to show, with the environment level almost always a single-child passthrough. Invert the presentation: every environment that has agents is promoted to an always-expanded top-level group, labelled with its project (plus /env when the environment isn't production and the project has several). Agents render directly beneath with their status glyphs, sessions still nested under their agent. Groups sort by liveliness — anything running floats up — then default project, then name; the cursor is anchored by row identity so re-sorts never move the selection. Projects with agent-less environments wait in a collapsible "other projects" tail, default project first and undimmed. The tail opens itself while there are no agents to show (so a fresh account still gets the browse tree, behind a hint) and folds away once groups exist; toggling it by hand sticks. Every environment stays reachable there for n, t, and r — including empty ones in projects whose other environments have agents. Refreshes no longer blank a loaded environment while the reply is in flight, so groups stay put through the wake/sleep watch polls, and a failed refresh keeps the stale list with the error in the status line instead of hiding agents that exist. The data model and RowKind index tuples are unchanged — this is a rework of the rows() flattener, the expansion handlers, and the rendering; myCloudAgents already delivered everything at startup.
codyde
added a commit
that referenced
this pull request
Aug 11, 2026
* Add railway ca manage, clear cached auth on refresh, and setup reset `railway ca manage` jumps the TUI straight to the manage screen, skipping the front-door menu. `--refresh-auth` now clears the local Claude setup-token cache before re-minting, instead of only skipping the remote reuse check (a stale/revoked cached token previously never got replaced). `railway ca setup --reset`, and a "Reset to default" choice in the interactive prompts, clear saved cloud agent preferences and the cached token together. * Unlock full scrollback depth in railway ca session panes (#1065) Scrolling was clamped to one screenful — a documented workaround for vt100 0.15's view composition underflowing past the screen height. vt100 0.16 fixes that, and ratatui 0.30 (via ratatui-core) drops the exact unicode-width pin that blocked the upgrade. Bump both, migrate the moved Parser::set_size/set_scrollback calls to Screen, drop the one-page ceilings in scroll_by and resize, and pin the behavior with tests: full-depth scroll, multi-notch wheel walks, deep offsets across resizes, churn (output + scroll + reshape interleaved), retention-limit clamping, and a full-frame render from deep history. * feat(ca): add Opt+[ to cycle back to the previous session (#1066) * Unlock full scrollback depth in railway ca session panes Scrolling was clamped to one screenful — a documented workaround for vt100 0.15's view composition underflowing past the screen height. vt100 0.16 fixes that, and ratatui 0.30 (via ratatui-core) drops the exact unicode-width pin that blocked the upgrade. Bump both, migrate the moved Parser::set_size/set_scrollback calls to Screen, drop the one-page ceilings in scroll_by and resize, and pin the behavior with tests: full-depth scroll, multi-notch wheel walks, deep offsets across resizes, churn (output + scroll + reshape interleaved), retention-limit clamping, and a full-frame render from deep history. * feat(ca): add Opt+[ to cycle back to the previous session Opt+] already cycles forward through open session panes; this adds the reverse chord. Opt+[ is recognized where the terminal can express it unambiguously: as a real ALT event under the kitty keyboard protocol (which the TUI already enables), or as the composed curly double quote macOS sends when Option is not mapped to Meta. Under legacy Option-as-Meta, Opt+[ is the two bytes ESC [ — identical to the CSI prefix every arrow key starts with — so it never surfaces as a key event there. The chord goes dead in those terminals but can never misfire or steal a cursor key. Also updates the footer hint to advertise both directions. * Lead the ca Manage tree with agents instead of projects (#1067) * Unlock full scrollback depth in railway ca session panes Scrolling was clamped to one screenful — a documented workaround for vt100 0.15's view composition underflowing past the screen height. vt100 0.16 fixes that, and ratatui 0.30 (via ratatui-core) drops the exact unicode-width pin that blocked the upgrade. Bump both, migrate the moved Parser::set_size/set_scrollback calls to Screen, drop the one-page ceilings in scroll_by and resize, and pin the behavior with tests: full-depth scroll, multi-notch wheel walks, deep offsets across resizes, churn (output + scroll + reshape interleaved), retention-limit clamping, and a full-frame render from deep history. * feat(ca): add Opt+[ to cycle back to the previous session Opt+] already cycles forward through open session panes; this adds the reverse chord. Opt+[ is recognized where the terminal can express it unambiguously: as a real ALT event under the kitty keyboard protocol (which the TUI already enables), or as the composed curly double quote macOS sends when Option is not mapped to Meta. Under legacy Option-as-Meta, Opt+[ is the two bytes ESC [ — identical to the CSI prefix every arrow key starts with — so it never surfaces as a key event there. The chord goes dead in those terminals but can never misfire or steal a cursor key. Also updates the footer hint to advertise both directions. * Lead the ca Manage tree with agents instead of projects The Manage screen is about cloud agents, but they rendered at depth 3 of a workspace > project > environment > agent > session tree — two container levels to expand before reaching the thing the screen exists to show, with the environment level almost always a single-child passthrough. Invert the presentation: every environment that has agents is promoted to an always-expanded top-level group, labelled with its project (plus /env when the environment isn't production and the project has several). Agents render directly beneath with their status glyphs, sessions still nested under their agent. Groups sort by liveliness — anything running floats up — then default project, then name; the cursor is anchored by row identity so re-sorts never move the selection. Projects with agent-less environments wait in a collapsible "other projects" tail, default project first and undimmed. The tail opens itself while there are no agents to show (so a fresh account still gets the browse tree, behind a hint) and folds away once groups exist; toggling it by hand sticks. Every environment stays reachable there for n, t, and r — including empty ones in projects whose other environments have agents. Refreshes no longer blank a loaded environment while the reply is in flight, so groups stay put through the wake/sleep watch polls, and a failed refresh keeps the stale list with the error in the status line instead of hiding agents that exist. The data model and RowKind index tuples are unchanged — this is a rework of the rows() flattener, the expansion handlers, and the rendering; myCloudAgents already delivered everything at startup.
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.
What
Reworks the
railway caManage screen's left tree from project-first to agent-first. Same layout, same panes — only the tree changes.Before: workspace > project > environment > agent > session, five levels with agents at depth 3 behind two expand clicks, even though
myCloudAgentsalready fetched everything at startup.After:
How
RowKind::Group), labelledproject(orproject/envwhen the env isn't production and the project has several). Groups sort by liveliness (running first), then default project, then name; within a group agents sort running → starting → sleeping.no cloud agents yet — n creates onehint), auto-folded once groups exist, sticky once toggled. Projects whose production has agents but whose staging is empty appear in both places, so every environment stays reachable forn/t/r.r, and the wake/sleep watch poll) no longer blank a loaded environment while the reply is in flight — groups stay put instead of flickering out every poll tick — and a failed refresh keeps the stale list with the error in the status line.RowKind::Agent/Sessionindex tuples and theWorkspaceNode/ProjectNode/EnvNodemodel are untouched; this is a rework of therows()flattener, expansion/keyboard/mouse handlers, and rendering.Testing
cloud_agenttests pass — 13 rewritten to the new semantics, 10 new (group labels/sorting, separator behavior, tail counts and toggling, refresh-keeps-groups, failed-refresh-keeps-agents, reachable empty envs,nfallback from the tail header, cursor-follows-promotion, hint-state accuracy).cargo fmtclean; clippy warning count identical to master (48, none in this module). The 3auth_simfailures in the full suite fail identically on unmodified master (environment-dependent).