aboutsummaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-09-06 02:27:06 +0300
committerGitHub <noreply@github.com>2026-09-06 02:27:06 +0300
commit9e9bc8a144667a6b7debfd4f0c7a31ff0e11493a (patch)
tree03f1259f91fd9edeacfd4b904f2e84d4acf25232 /src/ui
parent35b0dff96579f099e0436290085024424ffb289c (diff)
feat: manage multiple ssh machines from one client (#3670)
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/sidebar.rs4
-rw-r--r--src/ui/sidebar/tokens.rs35
2 files changed, 38 insertions, 1 deletions
diff --git a/src/ui/sidebar.rs b/src/ui/sidebar.rs
index 3da1e9f9..178bdb1f 100644
--- a/src/ui/sidebar.rs
+++ b/src/ui/sidebar.rs
@@ -129,6 +129,7 @@ pub(crate) fn resolved_token_spans(
.iter()
.map(|token| match &token.kind {
ResolvedTokenKind::StateText(text)
+ | ResolvedTokenKind::Machine(text)
| ResolvedTokenKind::Workspace(text)
| ResolvedTokenKind::Tab(text)
| ResolvedTokenKind::Pane(text)
@@ -236,7 +237,8 @@ pub(crate) fn resolved_token_spans(
truncate_end(text, budgets[index]),
apply_token_style(workspace_style, token.style),
)),
- ResolvedTokenKind::Tab(text)
+ ResolvedTokenKind::Machine(text)
+ | ResolvedTokenKind::Tab(text)
| ResolvedTokenKind::Pane(text)
| ResolvedTokenKind::Agent(text)
| ResolvedTokenKind::Branch(text) => spans.push(Span::styled(
diff --git a/src/ui/sidebar/tokens.rs b/src/ui/sidebar/tokens.rs
index eaec154b..911c87f9 100644
--- a/src/ui/sidebar/tokens.rs
+++ b/src/ui/sidebar/tokens.rs
@@ -13,6 +13,7 @@ pub(crate) struct ResolvedToken {
pub(crate) enum ResolvedTokenKind {
StateIcon,
StateText(String),
+ Machine(String),
Workspace(String),
Tab(String),
Pane(String),
@@ -35,6 +36,7 @@ impl ResolvedToken {
}
pub(crate) struct AgentTokenContext<'a> {
+ pub(crate) machine: Option<&'a str>,
pub(crate) workspace: &'a str,
pub(crate) tab: Option<&'a str>,
pub(crate) pane: Option<&'a str>,
@@ -63,6 +65,9 @@ pub(crate) fn agent_rows(
AgentSidebarToken::StateText => {
Some(ResolvedTokenKind::StateText(state_text.to_string()))
}
+ AgentSidebarToken::Machine => context
+ .machine
+ .map(|value| ResolvedTokenKind::Machine(value.to_string())),
AgentSidebarToken::Workspace => {
Some(ResolvedTokenKind::Workspace(context.workspace.to_string()))
}
@@ -190,6 +195,7 @@ mod tests {
fn context(entry: &Entry) -> AgentTokenContext<'_> {
AgentTokenContext {
+ machine: None,
workspace: &entry.workspace,
tab: entry.tab.as_deref(),
pane: entry.pane.as_deref(),
@@ -232,6 +238,35 @@ mod tests {
}
#[test]
+ fn machine_token_only_resolves_for_multi_machine_rows() {
+ let entry = entry();
+ let config = AgentsSidebarConfig {
+ rows: vec![vec![
+ AgentSidebarToken::Machine,
+ AgentSidebarToken::Workspace,
+ ]],
+ ..Default::default()
+ };
+
+ assert_eq!(
+ agent_rows(&config, context(&entry), "working"),
+ vec![vec![ResolvedToken::unstyled(ResolvedTokenKind::Workspace(
+ "repo".into()
+ ))]]
+ );
+
+ let mut remote_context = context(&entry);
+ remote_context.machine = Some("Build");
+ assert_eq!(
+ agent_rows(&config, remote_context, "working"),
+ vec![vec![
+ ResolvedToken::unstyled(ResolvedTokenKind::Machine("Build".into())),
+ ResolvedToken::unstyled(ResolvedTokenKind::Workspace("repo".into())),
+ ]]
+ );
+ }
+
+ #[test]
fn state_text_and_arbitrary_values_are_independent_tokens() {
let mut entry = entry();
entry