Complete agent monitoring and Galaxy Control integration

- expose command-monitor conversations and preserve visible agent transcripts
- add bounded polling and a dedicated shell interrupt tool
- improve direct-provider images, skills, tool history, and usage handling
- package and brand Galaxy Control across releases, installers, persistence, and docs
This commit is contained in:
2026-07-29 15:04:58 -05:00
parent 100f1eff1c
commit dbfa8bcd48
172 changed files with 6357 additions and 3825 deletions
+2 -4
View File
@@ -7994,14 +7994,12 @@ impl SettingsWidget for ExperimentsWidget {
app,
);
let column = Flex::column()
Flex::column()
.with_child(header)
.with_child(crosscheck_toggle)
.with_child(crosscheck_description)
.with_child(model_description)
.finish();
column
.finish()
}
}
+9 -5
View File
@@ -267,7 +267,7 @@ impl Display for SettingsSection {
match self {
SettingsSection::Keybindings => write!(f, "Keyboard shortcuts"),
SettingsSection::MCPServers => write!(f, "MCP Servers"),
SettingsSection::Scripting => write!(f, "Scripting"),
SettingsSection::Scripting => write!(f, "Galaxy Control"),
SettingsSection::WarpDrive => write!(f, "Galaxy Drive"),
SettingsSection::WarpAgent => write!(f, "Galaxy Agent"),
SettingsSection::AgentProfiles => write!(f, "Profiles"),
@@ -302,6 +302,7 @@ impl SettingsSection {
| Self::ThirdPartyCLIAgents
| Self::Bedrock
| Self::OpenAI
| Self::Experiments
)
}
@@ -357,7 +358,7 @@ impl FromStr for SettingsSection {
"Features" => Ok(Self::Features),
"Keyboard shortcuts" => Ok(Self::Keybindings),
"Privacy" => Ok(Self::Privacy),
"Scripting" => Ok(Self::Scripting),
"Galaxy Control" | "Scripting" => Ok(Self::Scripting),
"Teams" => Ok(Self::Teams),
"Warpify" => Ok(Self::Warpify),
"WarpDrive" | "Galaxy Drive" => Ok(Self::WarpDrive),
@@ -367,9 +368,11 @@ impl FromStr for SettingsSection {
"Knowledge" => Ok(Self::Knowledge),
"Third party CLI agents" | "ThirdPartyCLIAgents" => Ok(Self::ThirdPartyCLIAgents),
"AWS Bedrock" | "Bedrock" => Ok(Self::Bedrock),
"OpenAI / LiteLLM" | "OpenAI" => Ok(Self::OpenAI),
"Indexing and projects" | "CodeIndexing" => Ok(Self::CodeIndexing),
"Editor and Code Review" | "EditorAndCodeReview" => Ok(Self::EditorAndCodeReview),
"Experiments" => Ok(Self::Experiments),
"Wormhole" => Ok(Self::Warpify),
_ => Err(()),
}
}
@@ -587,6 +590,7 @@ pub mod flags {
"AutoOpenRichInputOnCLIAgentStart";
pub const AUTO_DISMISS_RICH_INPUT_AFTER_SUBMIT_FLAG: &str = "AutoDismissRichInputAfterSubmit";
pub const ENABLE_WARP_DRIVE: &str = "EnableWarpDrive";
pub const GALAXY_CONTROL_ENABLED: &str = "GalaxyControlEnabled";
// Tools panel settings
pub const SHOW_CONVERSATION_HISTORY: &str = "ShowConversationHistory";
pub const SHOW_PROJECT_EXPLORER: &str = "ShowProjectExplorer";
@@ -1150,7 +1154,7 @@ impl SettingsView {
me.handle_privacy_page_event(event, ctx);
});
let scripting_page_handle = if FeatureFlag::WarpControlCli.is_enabled() {
let scripting_page_handle = if FeatureFlag::GalaxyControlCli.is_enabled() {
Some(ctx.add_typed_action_view(ScriptingSettingsPageView::new))
} else {
None
@@ -1246,7 +1250,7 @@ impl SettingsView {
SettingsNavItem::Page(SettingsSection::About),
];
if FeatureFlag::WarpControlCli.is_enabled() {
if FeatureFlag::GalaxyControlCli.is_enabled() {
nav_items.push(SettingsNavItem::Page(SettingsSection::Scripting));
}
@@ -1254,7 +1258,7 @@ impl SettingsView {
let initial_page = match page {
Some(SettingsSection::AI) => SettingsSection::WarpAgent,
Some(SettingsSection::Code) => SettingsSection::CodeIndexing,
Some(SettingsSection::Scripting) if !FeatureFlag::WarpControlCli.is_enabled() => {
Some(SettingsSection::Scripting) if !FeatureFlag::GalaxyControlCli.is_enabled() => {
SettingsSection::About
}
Some(section) if section.is_subpage() => section,
File diff suppressed because it is too large Load Diff
+32 -29
View File
@@ -1,4 +1,4 @@
//! Settings UI for local scripting and Warp control permissions.
//! Settings UI for Galaxy Control installation and local automation permissions.
use std::cell::RefCell;
use std::collections::HashMap;
@@ -31,7 +31,7 @@ use crate::workspace::{cli_install, ToastStack};
pub enum ScriptingSettingsPageAction {
SetLocalControlMode(LocalControlMode),
#[cfg(target_os = "macos")]
InstallWarpControlCli,
InstallGalaxyControlCli,
}
pub struct ScriptingSettingsPageView {
@@ -39,7 +39,7 @@ pub struct ScriptingSettingsPageView {
local_only_icon_tooltip_states: RefCell<HashMap<String, MouseStateHandle>>,
local_control_mode_dropdown: ViewHandle<Dropdown<ScriptingSettingsPageAction>>,
#[cfg(target_os = "macos")]
warpctrl_installing: bool,
galaxyctrl_installing: bool,
}
impl ScriptingSettingsPageView {
@@ -51,7 +51,7 @@ impl ScriptingSettingsPageView {
});
Self::update_local_control_mode_dropdown(local_control_mode_dropdown.clone(), ctx);
if FeatureFlag::WarpControlCli.is_enabled() {
if FeatureFlag::GalaxyControlCli.is_enabled() {
ctx.subscribe_to_model(&LocalControlSettings::handle(ctx), |view, _, _, ctx| {
Self::update_local_control_mode_dropdown(
view.local_control_mode_dropdown.clone(),
@@ -63,7 +63,7 @@ impl ScriptingSettingsPageView {
#[cfg(target_os = "macos")]
let widgets: Vec<Box<dyn SettingsWidget<View = Self>>> = vec![
Box::new(WarpControlCliInstallWidget::default()),
Box::new(GalaxyControlCliInstallWidget::default()),
Box::new(LocalControlModeWidget),
];
#[cfg(not(target_os = "macos"))]
@@ -71,11 +71,11 @@ impl ScriptingSettingsPageView {
vec![Box::new(LocalControlModeWidget)];
Self {
page: PageType::new_uncategorized(widgets, Some("Scripting")),
page: PageType::new_uncategorized(widgets, Some("Galaxy Control")),
local_only_icon_tooltip_states: RefCell::new(HashMap::new()),
local_control_mode_dropdown,
#[cfg(target_os = "macos")]
warpctrl_installing: false,
galaxyctrl_installing: false,
}
}
@@ -105,23 +105,23 @@ impl ScriptingSettingsPageView {
}
#[cfg(target_os = "macos")]
fn install_warpctrl(&mut self, ctx: &mut ViewContext<Self>) {
if self.warpctrl_installing || cli_install::is_warpctrl_installed() {
fn install_galaxyctrl(&mut self, ctx: &mut ViewContext<Self>) {
if self.galaxyctrl_installing || cli_install::is_galaxyctrl_installed() {
return;
}
self.warpctrl_installing = true;
self.galaxyctrl_installing = true;
ctx.notify();
let window_id = ctx.window_id();
ctx.spawn(
async { cli_install::install_warpctrl() },
async { cli_install::install_galaxyctrl() },
move |view, result, ctx| {
view.warpctrl_installing = false;
view.galaxyctrl_installing = false;
match result {
Ok(()) => {
let command_name = ChannelState::channel().warpctrl_command_name();
let command_name = ChannelState::channel().galaxyctrl_command_name();
let message = format!(
"Successfully installed the Warp Control CLI! You can now run '{command_name}' from the command line."
"Galaxy Control CLI installed. You can now run '{command_name}' from any terminal."
);
ToastStack::handle(ctx).update(ctx, |toast_stack, ctx| {
toast_stack.add_ephemeral_toast(
@@ -132,7 +132,7 @@ impl ScriptingSettingsPageView {
});
}
Err(error) => {
let message = format!("Failed to install Warp Control command: {error}");
let message = format!("Failed to install Galaxy Control CLI: {error}");
log::warn!("{message}");
ToastStack::handle(ctx).update(ctx, |toast_stack, ctx| {
toast_stack.add_persistent_toast(
@@ -165,7 +165,7 @@ impl TypedActionView for ScriptingSettingsPageView {
ctx.notify();
}
#[cfg(target_os = "macos")]
ScriptingSettingsPageAction::InstallWarpControlCli => self.install_warpctrl(ctx),
ScriptingSettingsPageAction::InstallGalaxyControlCli => self.install_galaxyctrl(ctx),
}
}
}
@@ -186,7 +186,7 @@ impl SettingsPageMeta for ScriptingSettingsPageView {
}
fn should_render(&self, _ctx: &AppContext) -> bool {
cfg!(not(target_family = "wasm")) && FeatureFlag::WarpControlCli.is_enabled()
cfg!(not(target_family = "wasm")) && FeatureFlag::GalaxyControlCli.is_enabled()
}
fn update_filter(&mut self, query: &str, ctx: &mut ViewContext<Self>) -> MatchData {
@@ -210,16 +210,16 @@ impl From<ViewHandle<ScriptingSettingsPageView>> for SettingsPageViewHandle {
#[cfg(target_os = "macos")]
#[derive(Default)]
struct WarpControlCliInstallWidget {
struct GalaxyControlCliInstallWidget {
install_button_mouse_state: MouseStateHandle,
}
#[cfg(target_os = "macos")]
impl SettingsWidget for WarpControlCliInstallWidget {
impl SettingsWidget for GalaxyControlCliInstallWidget {
type View = ScriptingSettingsPageView;
fn search_terms(&self) -> &str {
"warp control cli command warpctrl install scripting"
"galaxy control cli command galaxyctrl install scripting automation"
}
fn render(
@@ -228,9 +228,9 @@ impl SettingsWidget for WarpControlCliInstallWidget {
appearance: &Appearance,
_app: &AppContext,
) -> Box<dyn Element> {
let installed = cli_install::is_warpctrl_installed();
let disabled = view.warpctrl_installing || installed;
let label = if view.warpctrl_installing {
let installed = cli_install::is_galaxyctrl_installed();
let disabled = view.galaxyctrl_installing || installed;
let label = if view.galaxyctrl_installing {
"Installing…"
} else if installed {
"Installed"
@@ -253,19 +253,19 @@ impl SettingsWidget for WarpControlCliInstallWidget {
button
.build()
.on_click(|ctx, _, _| {
ctx.dispatch_typed_action(ScriptingSettingsPageAction::InstallWarpControlCli);
ctx.dispatch_typed_action(ScriptingSettingsPageAction::InstallGalaxyControlCli);
})
.finish()
};
render_body_item::<ScriptingSettingsPageAction>(
"Warp Control CLI command".into(),
"Galaxy Control CLI".into(),
None,
LocalOnlyIconState::Hidden,
ToggleState::Enabled,
appearance,
button,
Some("Install the warpctrl command for scripting Warp from your terminal.".to_owned()),
Some("Install the galaxyctrl command to control Galaxy from your terminal.".to_owned()),
)
}
}
@@ -275,7 +275,7 @@ impl SettingsWidget for LocalControlModeWidget {
type View = ScriptingSettingsPageView;
fn search_terms(&self) -> &str {
"scripting warp control automation warpctrl local cli scripts disabled enabled"
"galaxy control scripting automation galaxyctrl local cli scripts access disabled enabled"
}
fn render(
@@ -285,7 +285,7 @@ impl SettingsWidget for LocalControlModeWidget {
app: &AppContext,
) -> Box<dyn Element> {
render_body_item::<ScriptingSettingsPageAction>(
"warpctrl CLI".into(),
"Local automation access".into(),
None,
LocalOnlyIconState::for_setting(
LocalControlModeSetting::storage_key(),
@@ -296,7 +296,10 @@ impl SettingsWidget for LocalControlModeWidget {
ToggleState::Enabled,
appearance,
ChildView::new(&view.local_control_mode_dropdown).finish(),
Some("warpctrl allows for scripting Warp's UI. Use with care.".to_owned()),
Some(
"Allow local scripts and agents running as your user account to control approved parts of Galaxy. Enable this only when you trust other software running on this computer."
.to_owned(),
),
)
}
}