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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user