feat: expand Galaxy agent and remote tooling

Add Wormhole remote helpers, provider and agent improvements, filesystem diagnostics, model metadata support, and schema-aware settings IntelliSense.
This commit is contained in:
2026-08-23 13:55:47 -05:00
parent f17642fc62
commit 7c106eecd5
147 changed files with 2208 additions and 1514 deletions
@@ -115,7 +115,7 @@ impl ReadFilesExecutor {
// Check if this is a remote session with a connected host.
let session_type = self.active_session.as_ref(ctx).session_type(ctx);
let host_request_handle = match &session_type {
Some(SessionType::WarpifiedRemote {
Some(SessionType::WormholedRemote {
host_id: Some(host_id),
}) => Some(
remote_server::manager::RemoteServerManager::as_ref(ctx)
@@ -127,7 +127,7 @@ impl ReadFilesExecutor {
// Remote session without a usable remote server connection. File reading
// requires either local access or a connected remote server, neither
// of which is available.
if matches!(session_type, Some(SessionType::WarpifiedRemote { .. }))
if matches!(session_type, Some(SessionType::WormholedRemote { .. }))
&& host_request_handle.is_none()
{
return ActionExecution::Sync(AIAgentActionResultType::ReadFiles(
@@ -154,7 +154,7 @@ fn disconnected_remote_session_does_not_fall_back_to_client_global_bundled_skill
sessions.register_session_for_test(
SessionInfo::new_for_test()
.with_id(session_id)
.with_session_type(BootstrapSessionType::WarpifiedRemote),
.with_session_type(BootstrapSessionType::WormholedRemote),
);
});
let (_model_events_tx, model_events_rx) = unbounded();
@@ -235,7 +235,7 @@ fn remote_session_reads_remote_bundled_skill_catalog() {
sessions.register_session_for_test(
SessionInfo::new_for_test()
.with_id(session_id)
.with_session_type(BootstrapSessionType::WarpifiedRemote),
.with_session_type(BootstrapSessionType::WormholedRemote),
);
});
let session = sessions
@@ -370,7 +370,7 @@ impl RequestFileEditsExecutor {
})
.collect();
let diff_session_type = match self.active_session.as_ref(ctx).session_type(ctx) {
Some(SessionType::WarpifiedRemote {
Some(SessionType::WormholedRemote {
host_id: Some(host_id),
}) => DiffSessionType::Remote(host_id.clone()),
_ => DiffSessionType::Local,
@@ -360,7 +360,7 @@ fn format_session_location(session: &Session, working_directory: Option<&str>) -
let hostname = session.hostname();
match session_type {
SessionType::Local => Some(display_path),
SessionType::WarpifiedRemote { .. } => Some(format!("{user}@{hostname}:{display_path}")),
SessionType::WormholedRemote { .. } => Some(format!("{user}@{hostname}:{display_path}")),
}
}
@@ -510,7 +510,7 @@ fn current_working_directory_for_zero_state(terminal_model: &TerminalModel) -> O
.is_some_and(|pending_session_info| {
matches!(
pending_session_info.session_type,
BootstrapSessionType::WarpifiedRemote
BootstrapSessionType::WormholedRemote
)
});
(!terminal_model.block_list().is_bootstrapped() && !is_bootstrapping_remote_shell)
+1 -1
View File
@@ -65,7 +65,7 @@ use crate::terminal::model_events::{ModelEvent, ModelEventDispatcher};
use crate::terminal::view::ambient_agent::{
is_cloud_agent_pre_first_exchange, AmbientAgentViewModel, AmbientAgentViewModelEvent,
};
use crate::terminal::warpify::render::LEFT_STRIPE_WIDTH;
use crate::terminal::wormhole::render::LEFT_STRIPE_WIDTH;
use crate::terminal::{
TerminalModel, CANCEL_COMMAND_KEYBINDING, TOGGLE_AUTOEXECUTE_MODE_KEYBINDING,
TOGGLE_HIDE_CLI_RESPONSES_KEYBINDING, TOGGLE_QUEUE_NEXT_PROMPT_KEYBINDING,
+5 -5
View File
@@ -314,11 +314,11 @@ impl SessionContext {
&self.current_working_directory
}
/// Returns the remote host ID if this is a `WarpifiedRemote` session with
/// Returns the remote host ID if this is a `WormholedRemote` session with
/// a connected `RemoteServerClient`.
pub fn host_id(&self) -> Option<&galaxy_core::HostId> {
match &self.session_type {
Some(SessionType::WarpifiedRemote { host_id }) => host_id.as_ref(),
Some(SessionType::WormholedRemote { host_id }) => host_id.as_ref(),
Some(SessionType::Local) | None => None,
}
}
@@ -326,17 +326,17 @@ impl SessionContext {
/// Returns `true` if this is a remote session (regardless of whether
/// the remote server client is connected).
pub fn is_remote(&self) -> bool {
matches!(self.session_type, Some(SessionType::WarpifiedRemote { .. }))
matches!(self.session_type, Some(SessionType::WormholedRemote { .. }))
}
pub fn skill_path_origin(&self) -> SkillPathOrigin {
match &self.session_type {
Some(SessionType::WarpifiedRemote {
Some(SessionType::WormholedRemote {
host_id: Some(host_id),
}) => SkillPathOrigin::Remote {
host_id: host_id.clone(),
},
Some(SessionType::WarpifiedRemote { host_id: None }) => SkillPathOrigin::Unavailable,
Some(SessionType::WormholedRemote { host_id: None }) => SkillPathOrigin::Unavailable,
Some(SessionType::Local) | None => SkillPathOrigin::Local,
}
}
@@ -1,6 +1,6 @@
//! This module contains rendering functions for various requested inline actions that have not yet
//! been transformed into a [`View`] component. This currently encompasses UI for file retrieval,
//! environmental variable collection, and SSH Warpification, to name a few.
//! environmental variable collection, and SSH Wormholing, to name a few.
//!
//! There's quite a bit of duplication between function-based inline actions and view-based inline
//! actions. Moreover, the header rendering functions here don't make use of the HeaderConfig.
@@ -408,7 +408,7 @@ impl PassiveSuggestionsModel {
.active_session
.as_ref(ctx)
.session_type(ctx)
.map(|session_type| matches!(session_type, SessionType::WarpifiedRemote { .. }))
.map(|session_type| matches!(session_type, SessionType::WormholedRemote { .. }))
.unwrap_or(true);
if !can_read_file || should_skip_for_remote {
let reason = if !can_read_file {