Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions app/src/workspace/view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6114,10 +6114,16 @@ impl Workspace {
});
}

/// Builds the unified new-session menu items
/// tab bar chevron and the vertical tab bar `+` button.
///
/// Order: Agent → Terminal (sidecar) → Cloud Oz → [tab configs] → separator → New worktree config (sidecar) → New tab config → separator → Reopen closed session.
fn cloud_agent_new_session_label() -> &'static str {
if FeatureFlag::AgentHarness.is_enabled() {
"Cloud Agent"
} else {
"Cloud Oz"
}
}

/// Builds the unified new-session menu items used by the tab bar chevron
/// and the vertical tab bar `+` button.
fn unified_new_session_menu_items(
&self,
ctx: &mut ViewContext<Self>,
Expand Down Expand Up @@ -6199,12 +6205,12 @@ impl Workspace {
}
}

// 3. Cloud Oz (if flags enabled)
// 3. Cloud agent entry (if flags enabled)
if is_any_ai_enabled
&& FeatureFlag::AgentView.is_enabled()
&& FeatureFlag::CloudMode.is_enabled()
{
let mut cloud_item = MenuItemFields::new("Cloud Oz")
let mut cloud_item = MenuItemFields::new(Self::cloud_agent_new_session_label())
.with_on_select_action(WorkspaceAction::AddAmbientAgentTab)
.with_icon(icons::Icon::LayoutAlt01);
if effective_default == DefaultSessionMode::CloudAgent {
Expand Down
58 changes: 58 additions & 0 deletions app/src/workspace/view_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -697,6 +697,25 @@ fn reopen_closed_session_menu_item(
}
}

fn cloud_agent_new_session_menu_item(
menu_items: &[MenuItem<WorkspaceAction>],
) -> &MenuItemFields<WorkspaceAction> {
menu_items
.iter()
.find_map(|item| {
if let MenuItem::Item(fields) = item {
if matches!(
fields.on_select_action(),
Some(WorkspaceAction::AddAmbientAgentTab)
) {
return Some(fields);
}
}
None
})
.expect("expected a cloud agent menu item")
}

#[test]
fn test_reward_modal_no_overlap() {
App::test((), |mut app| async move {
Expand Down Expand Up @@ -2698,6 +2717,45 @@ fn test_unified_new_session_menu_uses_new_worktree_config_label_and_order() {
});
}

#[test]
fn test_unified_new_session_menu_uses_cloud_agent_label_when_agent_harness_enabled() {
let _agent_view_guard = FeatureFlag::AgentView.override_enabled(true);
let _cloud_mode_guard = FeatureFlag::CloudMode.override_enabled(true);
let _agent_harness_guard = FeatureFlag::AgentHarness.override_enabled(true);

App::test((), |mut app| async move {
initialize_app(&mut app);

let workspace = mock_workspace(&mut app);

workspace.update(&mut app, |workspace, ctx| {
let menu_items = workspace.unified_new_session_menu_items(ctx);
let cloud_item = cloud_agent_new_session_menu_item(&menu_items);

assert_eq!(cloud_item.label(), "Cloud Agent");
});
});
}

#[test]
fn test_unified_new_session_menu_uses_cloud_oz_label_when_agent_harness_disabled() {
let _agent_view_guard = FeatureFlag::AgentView.override_enabled(true);
let _cloud_mode_guard = FeatureFlag::CloudMode.override_enabled(true);
let _agent_harness_guard = FeatureFlag::AgentHarness.override_enabled(false);

App::test((), |mut app| async move {
initialize_app(&mut app);

let workspace = mock_workspace(&mut app);

workspace.update(&mut app, |workspace, ctx| {
let menu_items = workspace.unified_new_session_menu_items(ctx);
let cloud_item = cloud_agent_new_session_menu_item(&menu_items);

assert_eq!(cloud_item.label(), "Cloud Oz");
});
});
}
#[test]
fn test_unified_new_session_menu_includes_reopen_closed_session() {
App::test((), |mut app| async move {
Expand Down
Loading