Fix cursor focus and selection in input box, add AWS env var warning box, and remove AWS Bedrock login banner

This commit is contained in:
2026-07-02 14:54:15 -05:00
parent 4770ac06b5
commit 3769646ca6
1194 changed files with 5312 additions and 8032 deletions
@@ -3,9 +3,9 @@
//! Uses the shared [`ChipConfigurator`] with `LeftRightZones` layout to let users
//! drag/drop chips between left, right, and unused banks.
use settings::Setting as _;
use galaxyui::keymap::FixedBinding;
use galaxyui::{AppContext, Element, Entity, SingletonEntity, TypedActionView, View, ViewContext};
use settings::Setting as _;
use super::toolbar_item::AgentToolbarItemKind;
use crate::appearance::AppearanceEvent;
@@ -1,8 +1,5 @@
use std::sync::Arc;
use pathfinder_color::ColorU;
use pathfinder_geometry::vector::vec2f;
use settings::Setting;
use galaxy_core::send_telemetry_from_ctx;
use galaxy_core::ui::color::blend::Blend;
use galaxy_core::ui::theme::Fill;
@@ -14,6 +11,9 @@ use galaxyui::{
AppContext, Element, Entity, ModelHandle, SingletonEntity, TypedActionView, View, ViewContext,
ViewHandle,
};
use pathfinder_color::ColorU;
use pathfinder_geometry::vector::vec2f;
use settings::Setting;
use super::{AgentInputButtonTheme, AmbientAgentViewModel};
use crate::ai::ambient_agents::telemetry::CloudAgentTelemetryEvent;
@@ -13,17 +13,6 @@ use std::time::Duration;
use ai::document::{AIDocumentId, AIDocumentVersion};
use chrono::{DateTime, Local};
use parking_lot::FairMutex;
use pathfinder_color::ColorU;
use pathfinder_geometry::vector::{vec2f, Vector2F};
#[cfg(feature = "voice_input")]
use settings::Setting;
use settings::ToggleableSetting;
#[cfg(not(target_family = "wasm"))]
use tokio::fs;
use toolbar_item::AgentToolbarItemKind;
#[cfg(feature = "voice_input")]
use voice_input::{StartListeningError, VoiceSessionResult};
use galaxy_cli::agent::Harness;
use galaxy_core::context_flag::ContextFlag;
use galaxy_core::report_if_error;
@@ -43,6 +32,17 @@ use galaxyui::{
AppContext, Entity, EntityId, ModelHandle, SingletonEntity, TypedActionView, View, ViewContext,
ViewHandle,
};
use parking_lot::FairMutex;
use pathfinder_color::ColorU;
use pathfinder_geometry::vector::{vec2f, Vector2F};
#[cfg(feature = "voice_input")]
use settings::Setting;
use settings::ToggleableSetting;
#[cfg(not(target_family = "wasm"))]
use tokio::fs;
use toolbar_item::AgentToolbarItemKind;
#[cfg(feature = "voice_input")]
use voice_input::{StartListeningError, VoiceSessionResult};
#[cfg(feature = "local_fs")]
pub(crate) use self::environment_selector::sort_environments_by_recency;
@@ -233,6 +233,9 @@ pub struct AgentInputFooter {
// `Workspace::start_local_to_cloud_handoff`.
handoff_to_cloud_button: ViewHandle<ActionButton>,
start_remote_control_button: ViewHandle<ActionButton>,
stop_remote_control_button: ViewHandle<ActionButton>,
// CLI agent voice input state (self-contained, bypasses editor voice flow).
#[cfg(feature = "voice_input")]
cli_voice_input_state: CLIVoiceInputState,
@@ -579,7 +582,7 @@ impl AgentInputFooter {
let start_remote_control_button = ctx.add_typed_action_view(|_ctx| {
ActionButton::new("/remote-control", RemoteControlButtonTheme)
.with_icon(Icon::Phone01)
.with_tooltip(START_REMOTE_CONTROL_TOOLTIP)
.with_tooltip("Start remote control")
.with_size(cli_button_size)
.with_tooltip_alignment(TooltipAlignment::Left)
.on_click(|ctx| {
@@ -845,6 +848,8 @@ impl AgentInputFooter {
display_chip_config,
fast_forward_button,
handoff_to_cloud_button,
start_remote_control_button,
stop_remote_control_button,
#[cfg(feature = "voice_input")]
cli_voice_input_state: CLIVoiceInputState::default(),
#[cfg(feature = "voice_input")]
@@ -2299,6 +2304,8 @@ pub enum AgentInputFooterAction {
ShowContextMenu {
position: Vector2F,
},
StartRemoteControl,
StopRemoteControl,
}
impl TypedActionView for AgentInputFooter {
@@ -2497,6 +2504,12 @@ impl TypedActionView for AgentInputFooter {
position: *position,
});
}
AgentInputFooterAction::StartRemoteControl => {
ctx.emit(AgentInputFooterEvent::StartRemoteControl);
}
AgentInputFooterAction::StopRemoteControl => {
ctx.emit(AgentInputFooterEvent::StopRemoteControl);
}
}
}
}
@@ -2541,6 +2554,8 @@ pub enum AgentInputFooterEvent {
/// source conversation with content) or activates `&` compose mode
/// (preserving any in-flight prompt).
HandoffChipClicked,
StartRemoteControl,
StopRemoteControl,
}
impl Entity for AgentInputFooter {
@@ -71,6 +71,9 @@ pub enum AgentToolbarItemKind {
// Agent view only "Hand off to cloud" chip.
HandoffToCloud,
// Agent view only "Share session" button.
ShareSession,
}
impl AgentToolbarItemKind {
@@ -81,7 +84,8 @@ impl AgentToolbarItemKind {
| Self::NLDToggle
| Self::ContextWindowUsage
| Self::FastForwardToggle
| Self::HandoffToCloud => ToolbarAvailability::AgentViewOnly,
| Self::HandoffToCloud
| Self::ShareSession => ToolbarAvailability::AgentViewOnly,
Self::FileExplorer | Self::RichInput | Self::Settings => {
ToolbarAvailability::CLIAgentOnly
}
@@ -102,6 +106,7 @@ impl AgentToolbarItemKind {
Self::FastForwardToggle => !status.is_viewer() || status.is_executor(),
// Handoff is host-initiated; viewers cannot hand off another user's conversation.
Self::HandoffToCloud => !status.is_viewer(),
Self::ShareSession => !status.is_viewer(),
Self::ContextChip(_)
| Self::ModelSelector
| Self::NLDToggle
@@ -124,6 +129,7 @@ impl AgentToolbarItemKind {
Self::Settings => "Settings",
Self::FastForwardToggle => "Fast Forward",
Self::HandoffToCloud => "Hand off to cloud",
Self::ShareSession => "Share Session",
}
}
@@ -142,6 +148,7 @@ impl AgentToolbarItemKind {
// The bundled `upload-cloud-01.svg` (cloud-with-upward-arrow) is the
// closest fit among the existing icons for V0; design may swap it later.
Self::HandoffToCloud => Some(Icon::UploadCloud),
Self::ShareSession => Some(Icon::Share),
}
}
@@ -7,11 +7,10 @@ use galaxyui::assets::asset_cache::AssetSource;
use galaxyui::elements::{Container, Element, Empty, MouseStateHandle};
use galaxyui::keymap::Keystroke;
use galaxyui::platform::OperatingSystem;
use galaxyui::{AppContext, Entity, ModelHandle, SingletonEntity, View, ViewContext};
use parking_lot::FairMutex;
use galaxyui::{
AppContext, Entity, ModelHandle, SingletonEntity, TypedActionView, View, ViewContext,
};
use parking_lot::FairMutex;
use super::{AgentViewState, EphemeralMessageModel, EphemeralMessageModelEvent};
use crate::ai::agent::conversation::AIConversation;
@@ -1,6 +1,3 @@
use pathfinder_color::ColorU;
use pathfinder_geometry::vector::Vector2F;
use settings::Setting;
use galaxy_core::ui::appearance::Appearance;
use galaxy_core::ui::Icon;
use galaxyui::elements::{
@@ -16,6 +13,9 @@ use galaxyui::{
AppContext, Element, Entity, EntityId, EventContext, ModelHandle, SingletonEntity,
TypedActionView, View, ViewContext,
};
use pathfinder_color::ColorU;
use pathfinder_geometry::vector::Vector2F;
use settings::Setting;
use super::{AgentViewController, AgentViewEntryOrigin};
use crate::ai::active_agent_views_model::ActiveAgentViewsModel;
@@ -1,12 +1,12 @@
use std::sync::Arc;
use std::time::Duration;
use instant::Instant;
use parking_lot::FairMutex;
use galaxy_core::ui::appearance::Appearance;
use galaxyui::keymap::Keystroke;
use galaxyui::r#async::SpawnedFutureHandle;
use galaxyui::{AppContext, Entity, EntityId, ModelContext, ModelHandle, SingletonEntity};
use instant::Instant;
use parking_lot::FairMutex;
use super::{DismissalStrategy, EphemeralMessage, EphemeralMessageModel};
use crate::ai::agent::conversation::AIConversationId;
@@ -1021,7 +1021,6 @@ fn exit_confirmation_message(
) -> Message {
use galaxyui::SingletonEntity;
let appearance = Appearance::handle(app).as_ref(app);
let (keystroke, text) = match trigger {
@@ -1,12 +1,12 @@
use std::sync::Arc;
use ai::agent::action::{AIAgentActionType, ShellCommandDelay};
use parking_lot::FairMutex;
use galaxy_core::ui::appearance::Appearance;
use galaxyui::elements::{CornerRadius, Radius};
use galaxyui::{
AppContext, Element, Entity, EntityId, ModelHandle, SingletonEntity, View, ViewContext,
};
use parking_lot::FairMutex;
use crate::ai::agent::icons;
use crate::ai::blocklist::block::cli_controller::LongRunningCommandControlState;
+4 -4
View File
@@ -22,15 +22,15 @@ pub use agent_view_block::*;
pub use controller::*;
pub(crate) use conversation_selection::AgentViewConversationSelection;
pub use ephemeral_message_model::*;
use galaxyui::fonts::Properties;
pub use inline_agent_view_header::*;
pub use orchestration_pill_bar::{render_orchestration_breadcrumbs, OrchestrationPillBar};
use pathfinder_color::ColorU;
use galaxy_core::ui::appearance::Appearance;
use galaxy_core::ui::color::blend::Blend;
use galaxy_core::ui::theme::Fill;
use galaxyui::fonts::Properties;
use galaxyui::keymap::Keystroke;
use galaxyui::{AppContext, SingletonEntity};
pub use inline_agent_view_header::*;
pub use orchestration_pill_bar::{render_orchestration_breadcrumbs, OrchestrationPillBar};
use pathfinder_color::ColorU;
pub use zero_state_block::*;
use crate::terminal::model::TerminalModel;
@@ -1,5 +1,3 @@
use pathfinder_color::ColorU;
use pathfinder_geometry::vector::Vector2F;
use galaxy_core::ui::appearance::Appearance;
use galaxy_core::ui::theme::Fill;
use galaxyui::elements::{
@@ -11,6 +9,8 @@ use galaxyui::fonts::Weight::Bold;
use galaxyui::platform::Cursor;
use galaxyui::text_layout::ClipConfig;
use galaxyui::{AppContext, Element, EntityId, EventContext, SingletonEntity};
use pathfinder_color::ColorU;
use pathfinder_geometry::vector::Vector2F;
use crate::ai::agent::api::ServerConversationToken;
use crate::ai::agent::conversation::{AIConversation, AIConversationId};
@@ -7,9 +7,6 @@ use std::collections::hash_map::DefaultHasher;
use std::collections::{HashMap, HashSet};
use std::hash::{Hash, Hasher};
use pathfinder_color::ColorU;
use pathfinder_geometry::vector::vec2f;
use warp_cli::agent::Harness;
use galaxy_core::channel::ChannelState;
use galaxy_core::send_telemetry_from_ctx;
use galaxy_core::ui::appearance::Appearance;
@@ -17,6 +14,9 @@ use galaxy_core::ui::color::blend::Blend;
use galaxy_core::ui::color::coloru_with_opacity;
use galaxy_core::ui::theme::color::internal_colors;
use galaxy_core::ui::theme::{Fill, WarpTheme};
use pathfinder_color::ColorU;
use pathfinder_geometry::vector::vec2f;
use warp_cli::agent::Harness;
use warpui::elements::new_scrollable::{NewScrollable, ScrollableAppearance, SingleAxisConfig};
use warpui::elements::{
Align, AnchorPair, ChildAnchor, ChildView, ClippedScrollStateHandle, ConstrainedBox, Container,
@@ -55,6 +55,7 @@ fn pill_bar_data_layer_finds_restored_children_before_pane_creation() {
autoexecute_override: None,
last_event_sequence: None,
pinned: false,
..Default::default()
})
.expect("child conversation data should serialize"),
last_modified_at: now,
@@ -105,6 +106,7 @@ fn pill_bar_data_layer_finds_restored_children_before_pane_creation() {
autoexecute_override: None,
last_event_sequence: None,
pinned: false,
..Default::default()
})
.expect("parent conversation data should serialize"),
last_modified_at: now - chrono::Duration::seconds(1),
@@ -2,13 +2,13 @@ mod model;
use std::borrow::Cow;
pub use model::*;
use pathfinder_color::ColorU;
use galaxy_core::features::FeatureFlag;
use galaxy_core::ui::appearance::Appearance;
use galaxyui::elements::{
Border, Container, CrossAxisAlignment, Expanded, Flex, ParentElement, Text,
};
pub use model::*;
use pathfinder_color::ColorU;
use warpui::keymap::Keystroke;
use warpui::ui_components::components::{Coords, UiComponent, UiComponentStyles};
use warpui::{AppContext, Element, SingletonEntity};
@@ -259,6 +259,7 @@ pub fn render_agent_shortcuts_view(
}
pub mod styles {
use super::Appearance;
pub fn keystroke_size(appearance: &Appearance) -> f32 {
font_size(appearance) + 2.
@@ -1,3 +1,5 @@
#![allow(dead_code)]
//! Inline subagent panel rendered within the parent agent's chat flow.
//!
//! Shows a collapsible panel with the subagent's status, a mini-transcript of
@@ -11,7 +13,7 @@ use galaxyui::{AppContext, SingletonEntity};
use pathfinder_color::ColorU;
use warp_multi_agent_api as api;
use crate::ai::agent::conversation::{AIConversationId, ConversationStatus};
use crate::ai::agent::conversation::{AIConversationId, ConversationStatus, StatusColorStyle};
use crate::ai::agent::AIAgentActionId;
use crate::ai::blocklist::block::AIBlockAction;
use crate::ai::blocklist::inline_action::inline_action_header::{
@@ -127,7 +129,7 @@ fn render_panel_header(
// Left: status icon + agent name + status text
let mut left_side = Flex::row().with_cross_axis_alignment(CrossAxisAlignment::Center);
let (icon, icon_color) = status.status_icon_and_color(theme);
let (icon, icon_color) = status.status_icon_and_color(theme, StatusColorStyle::Standard);
let status_icon_element =
ConstrainedBox::new(galaxyui::elements::Icon::new(icon.into(), icon_color).finish())
.with_width(icon_size(app))
@@ -151,8 +153,10 @@ fn render_panel_header(
ConversationStatus::InProgress => "Working...",
ConversationStatus::Success => "Complete",
ConversationStatus::Error => "Error",
ConversationStatus::TransientError => "Retrying...",
ConversationStatus::Cancelled => "Cancelled",
ConversationStatus::Blocked { .. } => "Blocked",
ConversationStatus::WaitingForEvents => "Waiting...",
};
let status_text_color = blended_colors::text_disabled(theme, surface);
left_side.add_child(
@@ -1,12 +1,10 @@
#![allow(dead_code)]
use std::borrow::Cow;
use std::cmp::Reverse;
use std::path::Path;
use std::sync::Arc;
use itertools::Itertools as _;
use markdown_parser::{parse_markdown, FormattedText, FormattedTextFragment, FormattedTextLine};
use parking_lot::FairMutex;
use settings::Setting;
use galaxy_core::features::FeatureFlag;
use galaxy_core::report_if_error;
use galaxy_core::ui::Icon;
@@ -25,7 +23,9 @@ use galaxyui::{
Action, AppContext, Element, Entity, ModelHandle, SingletonEntity, TypedActionView, View,
ViewContext,
};
use std::{borrow::Cow, cmp::Reverse, path::Path, sync::Arc};
use itertools::Itertools as _;
use markdown_parser::{parse_markdown, FormattedText, FormattedTextFragment, FormattedTextLine};
use parking_lot::FairMutex;
use crate::ai::active_agent_views_model::{ActiveAgentViewsModel, ConversationOrTaskId};
use crate::ai::agent::conversation::AIConversationId;