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
+36 -36
View File
@@ -16,7 +16,7 @@ use crate::terminal::shared_session::{
SharedSessionActionSource, SharedSessionScrollbackType, SharedSessionSource,
};
use crate::util::image::{infer_mime_type, MAX_IMAGE_SIZE_BYTES_FOR_CLI_AGENT, MIME_SNIFF_BYTES};
mod warpify_footer;
mod wormhole_footer;
use std::path::Path;
use std::sync::{Arc, LazyLock};
@@ -44,7 +44,7 @@ use galaxyui::{
};
use parking_lot::FairMutex;
use pathfinder_color::ColorU;
use warpify_footer::{WarpifyFooterView, WarpifyFooterViewEvent};
use wormhole_footer::{WormholeFooterView, WormholeFooterViewEvent};
use super::{RichContentInsertionPosition, TerminalAction, TerminalView};
use crate::ai::blocklist::agent_view::agent_view_bg_fill;
@@ -267,11 +267,11 @@ impl TerminalView {
UseAgentToolbarEvent::HideRichInput => {
self.close_cli_agent_rich_input_and_disable_auto_toggle(ctx);
}
UseAgentToolbarEvent::Warpify => {
UseAgentToolbarEvent::Wormhole => {
self.hide_use_agent_footer_in_blocklist(ctx);
self.handle_action(&TerminalAction::TriggerSubshellBootstrap, ctx);
send_telemetry_from_ctx!(
TelemetryEvent::WarpifyFooterAcceptedWarpify { is_ssh: false },
TelemetryEvent::WormholeFooterAcceptedWormhole { is_ssh: false },
ctx
);
}
@@ -295,8 +295,8 @@ impl TerminalView {
) -> bool {
let ai_settings = AISettings::as_ref(app);
// If the warpify footer is active, a subshell was detected and we should show the footer.
if self.use_agent_footer.as_ref(app).is_warpify_active(app) {
// If the wormhole footer is active, a subshell was detected and we should show the footer.
if self.use_agent_footer.as_ref(app).is_wormhole_active(app) {
return true;
}
@@ -421,7 +421,7 @@ impl TerminalView {
if !self.model.lock().is_alt_screen_active() {
self.use_agent_footer.update(ctx, |footer, ctx| {
footer.clear_warpify(ctx);
footer.clear_wormhole(ctx);
});
self.hide_use_agent_footer_in_blocklist(ctx);
}
@@ -1046,8 +1046,8 @@ pub struct UseAgentToolbar {
// Shared agent input footer (renders CLI agent mode when a CLI session is active).
agent_input_footer: ViewHandle<AgentInputFooter>,
// Warpify footer UI (shown when a subshell/SSH command is detected).
warpify_footer_view: ViewHandle<WarpifyFooterView>,
// Wormhole footer UI (shown when a subshell/SSH command is detected).
wormhole_footer_view: ViewHandle<WormholeFooterView>,
// `true` if the user has dismissed the footer.
//
@@ -1120,11 +1120,11 @@ impl UseAgentToolbar {
me.handle_agent_input_footer_event(event, ctx);
});
let warpify_footer_view =
ctx.add_typed_action_view(|ctx| WarpifyFooterView::new(terminal_model.clone(), ctx));
let wormhole_footer_view =
ctx.add_typed_action_view(|ctx| WormholeFooterView::new(terminal_model.clone(), ctx));
ctx.subscribe_to_view(&warpify_footer_view, |me, _, event, ctx| {
me.handle_warpify_footer_event(event, ctx);
ctx.subscribe_to_view(&wormhole_footer_view, |me, _, event, ctx| {
me.handle_wormhole_footer_event(event, ctx);
});
ctx.subscribe_to_model(model_event_dispatcher, |me, _, event, ctx| {
@@ -1150,7 +1150,7 @@ impl UseAgentToolbar {
dismiss_button,
dont_show_again_button,
agent_input_footer,
warpify_footer_view,
wormhole_footer_view,
terminal_model,
did_user_dismiss: false,
}
@@ -1186,19 +1186,19 @@ impl UseAgentToolbar {
}
}
fn handle_warpify_footer_event(
fn handle_wormhole_footer_event(
&mut self,
event: &WarpifyFooterViewEvent,
event: &WormholeFooterViewEvent,
ctx: &mut ViewContext<Self>,
) {
match event {
WarpifyFooterViewEvent::Warpify => {
ctx.emit(UseAgentToolbarEvent::Warpify);
WormholeFooterViewEvent::Wormhole => {
ctx.emit(UseAgentToolbarEvent::Wormhole);
}
WarpifyFooterViewEvent::UseAgent => {
WormholeFooterViewEvent::UseAgent => {
ctx.emit(UseAgentToolbarEvent::UseAgent);
}
WarpifyFooterViewEvent::Dismiss => {
WormholeFooterViewEvent::Dismiss => {
ctx.emit(UseAgentToolbarEvent::Dismiss);
}
}
@@ -1207,7 +1207,7 @@ impl UseAgentToolbar {
pub(in crate::terminal) fn notify_and_notify_children(&mut self, ctx: &mut ViewContext<Self>) {
ctx.notify();
self.agent_input_footer.update(ctx, |_, ctx| ctx.notify());
self.warpify_footer_view.update(ctx, |_, ctx| ctx.notify());
self.wormhole_footer_view.update(ctx, |_, ctx| ctx.notify());
self.button.update(ctx, |_, ctx| ctx.notify());
self.give_control_back_button
.update(ctx, |_, ctx| ctx.notify());
@@ -1227,26 +1227,26 @@ impl UseAgentToolbar {
.map(|session| session.agent)
}
/// Activates the warpify footer. When active, the footer shows the
/// warpify view instead of the CLI agent or regular "Use agent" views.
pub(in crate::terminal) fn show_warpify(&mut self, ctx: &mut ViewContext<Self>) {
self.warpify_footer_view.update(ctx, |view, ctx| {
/// Activates the wormhole footer. When active, the footer shows the
/// wormhole view instead of the CLI agent or regular "Use agent" views.
pub(in crate::terminal) fn show_wormhole(&mut self, ctx: &mut ViewContext<Self>) {
self.wormhole_footer_view.update(ctx, |view, ctx| {
view.show(ctx);
});
ctx.notify();
}
/// Deactivates the warpify footer so it reverts to its default behavior.
pub(in crate::terminal) fn clear_warpify(&mut self, ctx: &mut ViewContext<Self>) {
self.warpify_footer_view.update(ctx, |view, ctx| {
/// Deactivates the wormhole footer so it reverts to its default behavior.
pub(in crate::terminal) fn clear_wormhole(&mut self, ctx: &mut ViewContext<Self>) {
self.wormhole_footer_view.update(ctx, |view, ctx| {
view.clear(ctx);
});
ctx.notify();
}
/// Returns whether the warpify footer is currently active.
pub(in crate::terminal) fn is_warpify_active(&self, app: &AppContext) -> bool {
self.warpify_footer_view.as_ref(app).is_active()
/// Returns whether the wormhole footer is currently active.
pub(in crate::terminal) fn is_wormhole_active(&self, app: &AppContext) -> bool {
self.wormhole_footer_view.as_ref(app).is_active()
}
/// Returns whether there's a current CLI agent (like Claude Code).
@@ -1272,8 +1272,8 @@ pub enum UseAgentToolbarEvent {
OpenRichInput,
/// Hide the rich input editor (same as Escape).
HideRichInput,
/// User chose to warpify the subshell.
Warpify,
/// User chose to wormhole the subshell.
Wormhole,
/// User chose to use the agent.
UseAgent,
StartRemoteControl {
@@ -1292,9 +1292,9 @@ impl View for UseAgentToolbar {
}
fn render(&self, app: &AppContext) -> Box<dyn Element> {
// If the warpify footer is active, delegate rendering to the warpify footer view.
if self.warpify_footer_view.as_ref(app).is_active() {
return ChildView::new(&self.warpify_footer_view).finish();
// If the wormhole footer is active, delegate rendering to the wormhole footer view.
if self.wormhole_footer_view.as_ref(app).is_active() {
return ChildView::new(&self.wormhole_footer_view).finish();
}
// Hide the toolbar entirely when CLI rich input is open,