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:
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
+225
-909
File diff suppressed because it is too large
Load Diff
@@ -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(),
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user