Repository navigation
Add configurable native TUI resource views - #9447
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughThe PR adds configurable sidebar rails and resource projections. It adds tabs and agent navigation, native machine creation and connection flows, SSH host discovery, client-machine and surface renaming, searchable menus, localization, and related tests. ChangesSidebar and source configuration
Machine runtime and catalog flow
Resource projection and rail interaction
Searchable menus and action routing
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant User
participant App
participant SidebarProjection
participant MachineRuntime
participant WorkspaceState
User->>App: focus rail or open searchable menu
App->>SidebarProjection: build resource rows and targets
App->>MachineRuntime: submit creation, connection, or rename request
MachineRuntime-->>App: return updated machine UI state
App->>WorkspaceState: activate selected surface or tab
WorkspaceState-->>User: render updated sidebar state
Possibly related PRs
Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (3 errors, 1 warning)
✅ Passed checks (21 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Actionable comments posted: 5
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@cmux-tui/crates/cmux-tui/src/app.rs`:
- Around line 7335-7348: Update activate_sidebar_tab to avoid redundant
destination mutations: compare target.workspace with self.tree.active_workspace,
target.screen with that workspace’s active_screen, and target.pane with that
screen’s active_pane, then call select_workspace, select_screen, and focus_pane
only when their targets differ; keep select_tab behavior unchanged.
- Around line 16086-16096: Update the Hit::SidebarTab branch to avoid calling
sidebar_tab_targets, which materializes and scans every sidebar target on each
click. Use the identity fields already carried by Hit::SidebarTab (workspace,
screen, pane, index, and surface) to resolve the selected rail index through a
lightweight lookup, then preserve the existing focus, follow-selection,
selection, and activate_sidebar_tab behavior.
- Around line 14218-14236: Update the focus selection in focus_sidebar to derive
the preferred rail exclusively from visible_rail_order(), rather than
self.config.sidebar.columns. Select the first visible rail in the existing
preference order, and leave focus on the pane when visible_rail_order() is empty
so no invisible rail receives focus.
In `@cmux-tui/crates/cmux-tui/src/config.rs`:
- Around line 2445-2492: Update the resolved.is_empty() fallback in the sidebar
configuration flow to rebuild config.sidebar.columns using the resolved
config.machine_sidebar and config.sidebar width/max_width values, matching the
existing else branch. Preserve the warning, and ensure the fallback restores the
Machines and Workspaces columns instead of retaining Sidebar::default() values.
In `@cmux-tui/crates/cmux-tui/src/ui/sidebar.rs`:
- Around line 265-294: Update the sidebar render path around sidebar_tab_targets
so it no longer rebuilds and allocates every SidebarTabTarget each frame. Keep
TreeView authoritative, maintain a derived tab index/count when tree state
changes, and materialize only targets needed for visible viewport rows and hit
regions; preserve selection clamping, empty-state rendering, scrolling, and
existing row behavior.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: d868cccc-3d1f-4d48-9d45-9e4cb3b76547
📒 Files selected for processing (16)
cmux-tui/crates/cmux-tui/src/app.rscmux-tui/crates/cmux-tui/src/config.rscmux-tui/crates/cmux-tui/src/localization.rscmux-tui/crates/cmux-tui/src/machine.rscmux-tui/crates/cmux-tui/src/machine_provider_runtime.rscmux-tui/crates/cmux-tui/src/machine_runtime.rscmux-tui/crates/cmux-tui/src/main.rscmux-tui/crates/cmux-tui/src/ui/mod.rscmux-tui/crates/cmux-tui/src/ui/sidebar.rscmux-tui/docs/configuration.mdcmux-tui/docs/keyboard.mdcmux-tui/docs/machines.mdcmux-tui/docs/mouse.mdcmux-tui/examples/resource-columns.prototype.jsoncmux-tui/scripts/check-spec-inventory.pycmux-tui/spec/inventory.json
There was a problem hiding this comment.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
cmux-tui/crates/cmux-tui/src/app.rs (1)
13216-13227: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick winAvoid rebuilding every tab target on each tabs-rail keypress.
handle_tabs_sidebar_keycallssidebar_tab_targets()for every key, including plain navigation keys.sidebar_tab_targetswalks every screen, pane, and tab of the selected workspace and allocates twoStringvalues per tab. Navigation only needs the target count, and activation only needs one entry.Resolve the count and the single selected target without materializing the full list.
♻️ Proposed refactor sketch
- let targets = self.sidebar_tab_targets(); - self.tabs_rail_selection = self.tabs_rail_selection.min(targets.len().saturating_sub(1)); + let target_count = self.sidebar_tab_target_count(); + self.tabs_rail_selection = self.tabs_rail_selection.min(target_count.saturating_sub(1)); let page = rail_page_size(self.sidebar_layout.tabs); if let Some(next) = - rail_navigation_index(key, self.tabs_rail_selection, targets.len(), page) + rail_navigation_index(key, self.tabs_rail_selection, target_count, page) { self.tabs_rail_selection = next; } else if key.code == KeyCode::Enter - && let Some(target) = targets.get(self.tabs_rail_selection) + && let Some(target) = self.sidebar_tab_target_at(self.tabs_rail_selection) { - self.activate_sidebar_tab(target)?; + self.activate_sidebar_tab(&target)?; }As per coding guidelines: "Avoid repeated full scans, sorting, filtering, or per-item nested scans over scalable collections in production code, especially in UI, event-driven, backend, and persistence paths."
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@cmux-tui/crates/cmux-tui/src/app.rs` around lines 13216 - 13227, The handle_tabs_sidebar_key flow should avoid calling sidebar_tab_targets() and materializing every target for ordinary navigation. Add or reuse lightweight logic to compute only the sidebar tab count, use that count with rail_navigation_index and selection clamping, and resolve/create only the selected target when handling Enter before activate_sidebar_tab. Preserve existing navigation and activation behavior.Source: Coding guidelines
cmux-tui/crates/cmux-tui/src/machine_runtime.rs (1)
192-214: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick winRoute
create_from's error messages through the localization catalog.Lines 198 and 202 use raw English strings:
anyhow::anyhow!("unknown machine creation source {source_id:?}")andanyhow::anyhow!("machine creation is unavailable in this client").rename_machine, added in this same diff just below, correctly usescrate::localization::catalog().sidebar...for its error text. Use the same pattern here for consistency with the localization convention this file (andmachine_provider_runtime.rs, which has a dedicated test asserting notices are catalog-backed) otherwise follows.🌐 Proposed fix
let source = self .creation_sources .iter() .find(|source| source.id == source_id) .cloned() - .ok_or_else(|| anyhow::anyhow!("unknown machine creation source {source_id:?}"))?; + .ok_or_else(|| { + anyhow::anyhow!( + "{}: {source_id:?}", + crate::localization::catalog().sidebar.machine_creation_source_unavailable + ) + })?; let target = self .prototype_target .clone() - .ok_or_else(|| anyhow::anyhow!("machine creation is unavailable in this client"))?; + .ok_or_else(|| { + anyhow::anyhow!(crate::localization::catalog().sidebar.client_machine_unavailable) + })?;🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@cmux-tui/crates/cmux-tui/src/machine_runtime.rs` around lines 192 - 214, Update create_from to obtain both error messages from crate::localization::catalog(), matching the localized sidebar error pattern used by rename_machine: use the catalog entry for an unknown creation source and the catalog entry for unavailable machine creation, preserving the existing error flow and source_id context.cmux-tui/crates/cmux-tui/src/main.rs (1)
1633-1643: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd a test for
StaticMachineController::perform'sCreateFrom/RenameClientMachinedispatch.Existing tests cover the UI layer (
app.rs) that producesMachineRequest::CreateFrom, and the runtime layer (machine_runtime.rs::create_from), but no test exercises this controller dispatch directly. Add a test that callsStaticMachineController::perform(MachineRequest::CreateFrom { .. })and asserts the resulting notice andui.snapshot.machinesreflect the new row, to catch regressions in this wiring.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@cmux-tui/crates/cmux-tui/src/main.rs` around lines 1633 - 1643, Add a focused test for StaticMachineController::perform covering CreateFrom and RenameClientMachine dispatch, using the existing test setup and request types. Assert that CreateFrom returns the expected notice and adds the new machine row to ui.snapshot.machines, then exercise RenameClientMachine to verify the renamed result and corresponding UI state.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@cmux-tui/crates/cmux-tui/src/app.rs`:
- Around line 3682-3706: Update the searchable menu item construction to cache
each item's lowercase label once, then change refresh_search to compare terms
against that cached value instead of calling label.to_lowercase() for every
candidate on each keystroke. Preserve the existing filtering, separator,
fallback, and level replacement behavior in refresh_search.
In `@cmux-tui/crates/cmux-tui/src/localization.rs`:
- Line 1351: Update the English localization value for machine_name_required to
use an actionable instruction such as “Enter a machine name” instead of “Machine
name is required”, and update the corresponding assertion near line 2058 to
expect the new wording.
In `@cmux-tui/crates/cmux-tui/src/machine_runtime.rs`:
- Line 90: Trace all callers of MachineRuntime::with_creation_sources and
MachineRuntime::external to verify whether SSH discovery runs on the interactive
render/main thread. If either constructor can run there, move
discover_ssh_config_hosts to a bounded background operation with a timeout and
fall back to an empty connection-target list when it does not complete;
otherwise document or enforce the non-interactive execution context while
preserving both existing construction paths.
In `@cmux-tui/crates/cmux-tui/src/ui/overlay.rs`:
- Around line 254-257: Update the search overlay rendering around
visible_text_and_cursor to retain and use its returned cursor offset when
computing cursor_x, converting the offset to display columns if it is a
character index. Preserve correct cursor placement at the start, middle, and end
of input, including wide Unicode text, and add focused tests covering those
cases.
---
Outside diff comments:
In `@cmux-tui/crates/cmux-tui/src/app.rs`:
- Around line 13216-13227: The handle_tabs_sidebar_key flow should avoid calling
sidebar_tab_targets() and materializing every target for ordinary navigation.
Add or reuse lightweight logic to compute only the sidebar tab count, use that
count with rail_navigation_index and selection clamping, and resolve/create only
the selected target when handling Enter before activate_sidebar_tab. Preserve
existing navigation and activation behavior.
In `@cmux-tui/crates/cmux-tui/src/machine_runtime.rs`:
- Around line 192-214: Update create_from to obtain both error messages from
crate::localization::catalog(), matching the localized sidebar error pattern
used by rename_machine: use the catalog entry for an unknown creation source and
the catalog entry for unavailable machine creation, preserving the existing
error flow and source_id context.
In `@cmux-tui/crates/cmux-tui/src/main.rs`:
- Around line 1633-1643: Add a focused test for StaticMachineController::perform
covering CreateFrom and RenameClientMachine dispatch, using the existing test
setup and request types. Assert that CreateFrom returns the expected notice and
adds the new machine row to ui.snapshot.machines, then exercise
RenameClientMachine to verify the renamed result and corresponding UI state.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 59c79848-8808-42ad-8b58-2ba8ac620c6f
⛔ Files ignored due to path filters (1)
cmux-tui/Cargo.lockis excluded by!**/*.lock
📒 Files selected for processing (12)
cmux-tui/Cargo.tomlcmux-tui/crates/cmux-tui/Cargo.tomlcmux-tui/crates/cmux-tui/src/app.rscmux-tui/crates/cmux-tui/src/localization.rscmux-tui/crates/cmux-tui/src/machine.rscmux-tui/crates/cmux-tui/src/machine_provider_runtime.rscmux-tui/crates/cmux-tui/src/machine_runtime.rscmux-tui/crates/cmux-tui/src/main.rscmux-tui/crates/cmux-tui/src/ui/overlay.rscmux-tui/docs/machines.mdcmux-tui/scripts/check-spec-inventory.pycmux-tui/spec/inventory.json
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
There was a problem hiding this comment.
Actionable comments posted: 6
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
cmux-tui/crates/cmux-tui/src/localization.rs (1)
1371-1371: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick winNew English machine messages state a condition without a next action. The shared root cause is that these three new user-facing English strings describe what happened but do not tell the user what to do next. Give each one a concrete next action, and keep the Japanese values at Lines 1866-1868 equivalent in form.
cmux-tui/crates/cmux-tui/src/localization.rs#L1371-L1371: replace "Machine name is required" with an instruction such as "Enter a machine name", and update the matching localization assertion.cmux-tui/crates/cmux-tui/src/localization.rs#L1370-L1370: extend "This machine creation source is unavailable" with a next action, such as choosing a different source from the picker.cmux-tui/crates/cmux-tui/src/localization.rs#L1372-L1372: extend "This client-owned machine is unavailable" with a next action, such as selecting another machine in the rail.As per coding guidelines, user-facing errors should state what happened in product terms and provide one or two concrete next actions.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@cmux-tui/crates/cmux-tui/src/localization.rs` at line 1371, Update the three English machine messages in cmux-tui/crates/cmux-tui/src/localization.rs at lines 1370-1372: make machine_name_required instruct the user to enter a machine name, extend the unavailable creation-source message with guidance to choose another source, and extend the unavailable client-owned-machine message with guidance to select another machine. Keep the Japanese values at lines 1866-1868 equivalent in form and update the matching localization assertion.Source: Coding guidelines
cmux-tui/crates/cmux-tui/src/config.rs (1)
2592-2597: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winThe empty-resolved
sidebar.columnsfallback keeps hardcoded struct defaults.When
raw.sidebar.columnsisSomebut every entry is invalid or duplicate,resolvedis empty andconfig.sidebar.columnsstill holds theSidebar::default()widths (22/0) instead of the resolvedconfig.machine_sidebar.width/max_widthandconfig.sidebar.width/max_width. Line 2612 then derivesviewsfrom those stale values. Rebuild the columns the same way as theelsebranch at Line 2598.🐛 Proposed fix
if resolved.is_empty() { eprintln!("cmux-tui: sidebar.columns had no usable entries; keeping defaults"); + config.sidebar.columns = vec![ + SidebarColumn { + kind: SidebarColumnKind::Machines, + width: config.machine_sidebar.width, + max_width: config.machine_sidebar.max_width, + }, + SidebarColumn { + kind: SidebarColumnKind::Workspaces, + width: config.sidebar.width, + max_width: config.sidebar.max_width, + }, + ]; } else {🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@cmux-tui/crates/cmux-tui/src/config.rs` around lines 2592 - 2597, Update the empty-resolved branch in the sidebar column resolution logic to rebuild `config.sidebar.columns` from the resolved machine-sidebar and sidebar width/max_width settings, matching the construction used in the non-empty `else` branch. Keep `columns_explicit` unchanged for this fallback so subsequent view derivation uses the current configuration values rather than `Sidebar::default()` widths.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@cmux-tui/crates/cmux-tui/src/app.rs`:
- Around line 7610-7651: Update activate_projection_target to route workspace,
screen, and pane activation through select_workspace_for_client,
select_screen_for_client, and focus_pane_after_input instead of directly
mutating tree selection fields or calling lower-level session methods. Preserve
the existing prepare_pty_input_before_mutation guard and pane focus recording
behavior, and keep Surface activation delegated to activate_sidebar_tab.
- Around line 7505-7524: Update projection_rows and its callers to avoid
rebuilding projection data during navigation: borrow the collapsed state instead
of cloning it, and introduce frame-scoped caching so
handle_projection_sidebar_key reuses the rows already produced for rendering.
Ensure the cache is invalidated when relevant sidebar, workspace, pane, surface,
agent, or collapse state changes, while preserving the existing projection_rows
output.
In `@cmux-tui/crates/cmux-tui/src/cli/command.rs`:
- Around line 2621-2635: Extend the CLI parser tests near the existing
noncanonical state cases to cover `agent list` as well as `agent report`. For
each of "running", "waiting", and "error", build an `agent list` invocation with
the state and assert parsing fails, matching the rejection coverage provided by
the separate validator near `agent list`.
In `@cmux-tui/crates/cmux-tui/src/session/mod.rs`:
- Around line 539-555: The agent snapshot is rebuilt or cloned for every
agent-enabled projection in the render path. In
cmux-tui/crates/cmux-tui/src/session/mod.rs:539-555, update Session::agents and
the local agent-state update flow to cache or share one local snapshot per
update/paint instead of rescanning and allocating per projection; in
cmux-tui/crates/cmux-tui/src/session/remote.rs:3007-3010, change the remote path
to reuse the cached snapshot without cloning it for each projection.
In `@cmux-tui/crates/cmux-tui/src/session/remote.rs`:
- Around line 3035-3039: Update the agent refresh flow around the list-agents
request and cache assignment to track agent freshness independently from
workspace freshness. When the request or AgentInfo decoding fails, clear or
disable cached agent rows so cached_agents() cannot expose stale selectable
state; only publish agent rows after a successful snapshot, and preserve the
existing successful update path. Add a regression test covering a successful
workspace refresh followed by a failed agent refresh.
In `@cmux-tui/crates/cmux-tui/src/sidebar_projection.rs`:
- Around line 211-214: Build a single HashMap<SurfaceId, &AgentInfo> in rows
from the existing agents collection and pass it into append_level. Change
append_level’s agents parameter to the map type, then replace the per-tab
agents.iter().find lookup with an O(1) lookup by tab.surface while preserving
the existing agent_only filtering and TreeView/AgentInfo sources of truth.
---
Outside diff comments:
In `@cmux-tui/crates/cmux-tui/src/config.rs`:
- Around line 2592-2597: Update the empty-resolved branch in the sidebar column
resolution logic to rebuild `config.sidebar.columns` from the resolved
machine-sidebar and sidebar width/max_width settings, matching the construction
used in the non-empty `else` branch. Keep `columns_explicit` unchanged for this
fallback so subsequent view derivation uses the current configuration values
rather than `Sidebar::default()` widths.
In `@cmux-tui/crates/cmux-tui/src/localization.rs`:
- Line 1371: Update the three English machine messages in
cmux-tui/crates/cmux-tui/src/localization.rs at lines 1370-1372: make
machine_name_required instruct the user to enter a machine name, extend the
unavailable creation-source message with guidance to choose another source, and
extend the unavailable client-owned-machine message with guidance to select
another machine. Keep the Japanese values at lines 1866-1868 equivalent in form
and update the matching localization assertion.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: b6a655a6-41e4-4a26-9c11-b6f7e58bf053
📒 Files selected for processing (19)
cmux-tui/crates/cmux-tui-core/src/mux.rscmux-tui/crates/cmux-tui/src/app.rscmux-tui/crates/cmux-tui/src/cli/command.rscmux-tui/crates/cmux-tui/src/config.rscmux-tui/crates/cmux-tui/src/localization.rscmux-tui/crates/cmux-tui/src/main.rscmux-tui/crates/cmux-tui/src/session/mod.rscmux-tui/crates/cmux-tui/src/session/remote.rscmux-tui/crates/cmux-tui/src/sidebar_projection.rscmux-tui/crates/cmux-tui/src/ui/mod.rscmux-tui/crates/cmux-tui/src/ui/rail.rscmux-tui/crates/cmux-tui/src/ui/sidebar.rscmux-tui/docs/configuration.mdcmux-tui/docs/keyboard.mdcmux-tui/docs/machines.mdcmux-tui/docs/mouse.mdcmux-tui/examples/resource-columns.prototype.jsoncmux-tui/examples/resource-tree-no-agents.prototype.jsoncmux-tui/examples/resource-tree.prototype.json
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@cmux-tui/crates/cmux-tui/src/app.rs`:
- Around line 7723-7745: Extract the SidebarColumnKind-to-RailKind match into a
shared helper, then update rail_kind_for_view, reload_config, and focus_sidebar
to call it instead of maintaining local mappings. Preserve the existing
projection fallback and each caller’s current behavior while ensuring all
legacy-kind conversions use the single helper.
- Around line 13204-13218: Update the current-selection calculation in the
sidebar selection logic so an out-of-range Some(selected_action) returns None
rather than falling back to state.selected; preserve the existing action-row
offset for valid selected_action values and the state.selected fallback only
when selected_action is None.
In `@cmux-tui/crates/cmux-tui/src/ui/sidebar.rs`:
- Around line 370-372: Update the header construction near
projection_resource_label to obtain the projection path separator or complete
formatted header from localization::catalog() instead of hardcoding " › ". Add
the corresponding entry to every supported localization catalog and preserve the
existing label ordering and rail::header rendering.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 3352d746-f5fe-4ae7-bd18-9d3407689229
📒 Files selected for processing (8)
cmux-tui/crates/cmux-tui/src/app.rscmux-tui/crates/cmux-tui/src/config.rscmux-tui/crates/cmux-tui/src/sidebar_projection.rscmux-tui/crates/cmux-tui/src/ui/sidebar.rscmux-tui/docs/configuration.mdcmux-tui/examples/resource-columns.prototype.jsoncmux-tui/examples/resource-tree-no-agents.prototype.jsoncmux-tui/examples/resource-tree.prototype.json
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit d5feb39. Configure here.

Build configurable native resource views in cmux-tui.
Verification:
Note
Medium Risk
New subscribe event and regenerated protocol IR affect all protocol clients; machine SSH discovery and documented bootstrap behavior touch remote connection infrastructure.
Overview
Adds a new protocol v11
agent-changedsubscribe event (surface, agent source/state, optional session,updated_at_ms) and regenerates all language SDK bindings and manifests to match the updated IR.Introduces the
globdependency so SSH configIncludepatterns can be expanded when discovering direct SSH aliases for the machine rail.README updates document that the machine rail and
cmux sshshare the managed remote lifecycle (compatibility probe, pinned binary install for packaged builds, on-demand session start), and positionmachine-agent/ rawrelayas low-level diagnostics rather than the primary attach path.Reviewed by Cursor Bugbot for commit 54f3fae. Bugbot is set up for automated code reviews on this repo. Configure here.