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
+2 -1
View File
@@ -5,10 +5,11 @@ use galaxyui::elements::{
Align, AnchorPair, Border, ConstrainedBox, Container, CornerRadius, CrossAxisAlignment,
DispatchEventResult, DropTarget, Element, Empty, EventHandler, Expanded, Flex, Hoverable,
MainAxisSize, OffsetPositioning, OffsetType, ParentElement, PositionedElementOffsetBounds,
PositioningAxis, Radius, SavePosition, Stack, XAxisAnchor, YAxisAnchor,
PositioningAxis, Radius, SavePosition, Stack, Text, XAxisAnchor, YAxisAnchor,
};
use galaxyui::presenter::ChildView;
use galaxyui::{AppContext, SingletonEntity as _};
use pathfinder_color::ColorU;
use super::common::{
add_command_xray_overlay, add_input_suggestions_overlays, add_voltron_overlay,
+2 -2
View File
@@ -1,11 +1,11 @@
use pathfinder_geometry::vector::vec2f;
use settings::Setting;
use galaxyui::elements::{
Border, ChildAnchor, ChildView, Clipped, Container, DropTarget, Element, Empty, Flex,
Hoverable, OffsetPositioning, ParentAnchor, ParentElement, ParentOffsetBounds, SavePosition,
Stack,
};
use galaxyui::{AppContext, SingletonEntity};
use pathfinder_geometry::vector::vec2f;
use settings::Setting;
use super::{should_render_prompt_using_editor_decorator_elements, Input, SubshellRenderState};
use crate::ai::blocklist::InputType;
@@ -1,6 +1,5 @@
use std::collections::HashSet;
use pathfinder_color::ColorU;
use galaxy_core::ui::appearance::Appearance;
use galaxy_core::ui::theme::color::internal_colors;
use galaxyui::elements::{
@@ -10,6 +9,7 @@ use galaxyui::{
AppContext, Element, Entity, EntityId, ModelHandle, SingletonEntity, View, ViewContext,
ViewHandle,
};
use pathfinder_color::ColorU;
use crate::ai::blocklist::agent_view::AgentViewController;
use crate::search::data_source::{Query, QueryFilter};
+2 -3
View File
@@ -1,7 +1,5 @@
use std::sync::Arc;
use pathfinder_geometry::vector::vec2f;
use vim::vim::{VimMode, VimState};
use galaxy_completer::completer::Description;
use galaxy_core::features::FeatureFlag;
use galaxyui::elements::{
@@ -14,6 +12,8 @@ use galaxyui::fonts::Weight;
use galaxyui::presenter::ChildView;
use galaxyui::ui_components::components::{UiComponent, UiComponentStyles};
use galaxyui::{AppContext, EntityId, SingletonEntity, ViewHandle};
use pathfinder_geometry::vector::vec2f;
use vim::vim::{VimMode, VimState};
use crate::ai::llms::{is_using_api_key_for_provider, LLMPreferences};
use crate::ai::{AIRequestUsageModel, BuyCreditsBannerDisplayState};
@@ -517,7 +517,6 @@ fn add_buy_credits_banner_overlay(
buy_credits_banner: &ViewHandle<BuyCreditsBanner>,
is_input_at_top: bool,
) {
let (parent_anchor, child_anchor, y_offset) = if is_input_at_top {
(ParentAnchor::BottomLeft, ChildAnchor::TopLeft, 8.)
} else {
@@ -1,9 +1,8 @@
//! Data source for the inline conversation menu.
use galaxyui::{AppContext, Entity, ModelHandle};
use galaxyui::{AppContext, Entity, ModelHandle, SingletonEntity};
use itertools::Itertools;
use ordered_float::OrderedFloat;
use galaxyui::{AppContext, Entity, ModelHandle, SingletonEntity};
use crate::ai::agent_conversations_model::{
AgentConversationEntry, AgentConversationEntryId, AgentManagementFilters,
+2 -2
View File
@@ -4,11 +4,11 @@ mod data_source;
mod search_item;
mod view;
use pathfinder_color::ColorU;
pub use view::{InlineConversationMenuEvent, InlineConversationMenuView};
use galaxy_core::ui::appearance::Appearance;
use galaxyui::keymap::Keystroke;
use galaxyui::SingletonEntity;
use pathfinder_color::ColorU;
pub use view::{InlineConversationMenuEvent, InlineConversationMenuView};
use crate::ai::active_agent_views_model::{ActiveAgentViewsModel, ConversationOrTaskId};
use crate::ai::agent_conversations_model::AgentConversationEntryId;
+3 -3
View File
@@ -4,13 +4,13 @@
use std::collections::HashMap;
use std::ops::Range;
pub use galaxy_completer::completer::SuggestionTypeName;
pub use galaxy_completer::util::parse_current_commands_and_tokens;
pub use galaxy_completer::{ParsedTokenData, ParsedTokensSnapshot};
use galaxy_core::features::FeatureFlag;
use galaxyui::{AppContext, SingletonEntity, ViewContext};
use settings::Setting as _;
use string_offset::{ByteOffset, CharOffset};
pub use galaxy_completer::completer::SuggestionTypeName;
pub use galaxy_completer::util::parse_current_commands_and_tokens;
pub use galaxy_completer::{ParsedTokenData, ParsedTokensSnapshot};
use super::Input;
use crate::appearance::Appearance;
@@ -234,7 +234,7 @@ fn interleave_conversations(base: Vec<MenuEntry>, conversations: Vec<MenuEntry>)
let base_current = base.into_iter().skip(current_start_idx).collect::<Vec<_>>();
let mut conversations = conversations;
conversations.sort_by(|a, b| a.sort_timestamp.cmp(&b.sort_timestamp));
conversations.sort_by_key(|a| a.sort_timestamp);
let mut i = 0;
for conv in conversations {
+2 -2
View File
@@ -1,8 +1,8 @@
//! Generic model for tracking the selected item in an inline menu.
use galaxyui::elements::MouseStateHandle;
use galaxyui::{Entity, ModelContext};
use std::collections::HashSet;
use galaxyui::elements::MouseStateHandle;
use galaxyui::{Entity, ModelContext};
use crate::search::data_source::QueryFilter;
use crate::terminal::input::inline_menu::view::InlineMenuAction;
@@ -1,9 +1,9 @@
use std::collections::HashMap;
use settings::Setting as _;
use galaxy_core::features::FeatureFlag;
use galaxyui::units::{IntoPixels, Pixels};
use galaxyui::{AppContext, Entity, ModelContext, ModelHandle, SingletonEntity, WindowId};
use settings::Setting as _;
use super::styles::{HEADER_BORDER, HEADER_ROW_HEIGHT};
use crate::ai::blocklist::agent_view::AgentViewController;
+2 -2
View File
@@ -1,8 +1,6 @@
//! Generic inline menu view for rendering search results with selection and navigation.
use std::sync::LazyLock;
use itertools::Itertools;
use pathfinder_geometry::vector::vec2f;
use galaxy_core::features::FeatureFlag;
use galaxy_core::ui::appearance::Appearance;
use galaxy_core::ui::color::blend::Blend;
@@ -30,6 +28,8 @@ use galaxyui::{
Action, AppContext, Element, Entity, ModelHandle, SingletonEntity, TypedActionView, View,
ViewContext, ViewHandle, WeakViewHandle,
};
use itertools::Itertools;
use pathfinder_geometry::vector::vec2f;
use crate::ai::blocklist::agent_view::{
agent_view_bg_color, AgentViewController, AgentViewControllerEvent,
+6 -2
View File
@@ -1,5 +1,3 @@
use markdown_parser::{FormattedText, FormattedTextFragment, FormattedTextLine};
use pathfinder_color::ColorU;
use galaxy_core::ui::appearance::Appearance;
use galaxy_core::ui::theme::Fill;
use galaxy_core::ui::Icon;
@@ -11,6 +9,8 @@ use galaxyui::platform::Cursor;
use galaxyui::prelude::{Align, ConstrainedBox, CrossAxisAlignment, Flex, MainAxisSize, Text};
use galaxyui::ui_components::keyboard_shortcut::keystroke_to_keys;
use galaxyui::{AppContext, SingletonEntity};
use markdown_parser::{FormattedText, FormattedTextFragment, FormattedTextLine};
use pathfinder_color::ColorU;
use crate::ai::blocklist::agent_view::agent_view_bg_color;
use crate::ai::blocklist::agent_view::shortcuts::render_keystroke_with_color_overrides;
@@ -516,7 +516,11 @@ pub fn disableable_message_item_color_overrides(
}
pub mod styles {
use galaxy_core::ui::appearance::Appearance;
use galaxyui::{AppContext, SingletonEntity};
use pathfinder_color::ColorU;
use crate::ui_components::blended_colors;
pub fn font_size(app: &AppContext) -> f32 {
let appearance = Appearance::as_ref(app);
+5 -3
View File
@@ -4,8 +4,8 @@ use galaxy_core::ui::icons::Icon;
use galaxy_core::ui::theme::color::internal_colors;
use galaxy_core::ui::theme::Fill;
use galaxyui::elements::{
ConstrainedBox, Container, CornerRadius, FormattedTextElement, Highlight, HighlightedHyperlink,
MouseStateHandle, Radius, Text,
ConstrainedBox, Container, CornerRadius, Flex, FormattedTextElement, Highlight,
HighlightedHyperlink, MouseStateHandle, ParentElement, Radius, Text,
};
use galaxyui::fonts::{Properties, Style, Weight};
use galaxyui::keymap::Keystroke;
@@ -14,6 +14,9 @@ use galaxyui::text_layout::ClipConfig;
use galaxyui::ui_components::button::ButtonVariant;
use galaxyui::ui_components::components::{Coords, UiComponent, UiComponentStyles};
use galaxyui::{AppContext, Element, Entity, EntityId, ModelHandle, SingletonEntity as _};
use itertools::Itertools;
use markdown_parser::{FormattedText, FormattedTextFragment, FormattedTextLine};
use ordered_float::OrderedFloat;
use super::model_spec_scores::{
render_model_spec_header, render_model_spec_scores, CostRow, CostRowTooltip,
@@ -504,7 +507,6 @@ impl SearchItem for ModelSearchItem {
}
fn render_details(&self, app: &AppContext) -> Option<Box<dyn Element>> {
let appearance = crate::appearance::Appearance::as_ref(app);
let theme = appearance.theme();
@@ -1,5 +1,3 @@
use pathfinder_color::ColorU;
use pathfinder_geometry::vector::vec2f;
use galaxy_core::ui::theme::color::internal_colors;
use galaxyui::elements::{
Border, ChildAnchor, ConstrainedBox, Container, CornerRadius, Expanded, Flex, Hoverable,
@@ -10,6 +8,8 @@ use galaxyui::prelude::{Align, CrossAxisAlignment};
use galaxyui::text_layout::ClipConfig;
use galaxyui::ui_components::components::UiComponent;
use galaxyui::{AppContext, Element, SingletonEntity as _};
use pathfinder_color::ColorU;
use pathfinder_geometry::vector::vec2f;
use crate::ai::llms::LLMSpec;
use crate::appearance::Appearance;
+1 -1
View File
@@ -2,7 +2,6 @@ use std::collections::HashSet;
use std::sync::LazyLock;
use ai::api_keys::{ApiKeyManager, ApiKeyManagerEvent};
use pathfinder_color::ColorU;
use galaxy_core::ui::appearance::Appearance;
use galaxy_core::ui::theme::color::internal_colors;
use galaxy_core::ui::theme::Fill;
@@ -11,6 +10,7 @@ use galaxyui::{
AppContext, Element, Entity, EntityId, ModelHandle, SingletonEntity as _, View, ViewContext,
ViewHandle,
};
use pathfinder_color::ColorU;
use crate::ai::blocklist::agent_view::AgentViewController;
use crate::ai::blocklist::block::cli_controller::{CLISubagentController, CLISubagentEvent};
+1 -1
View File
@@ -4,8 +4,8 @@ mod search_item;
mod view;
use ai::document::AIDocumentId;
pub use view::{InlinePlanMenuEvent, InlinePlanMenuView};
use galaxyui::keymap::Keystroke;
pub use view::{InlinePlanMenuEvent, InlinePlanMenuView};
use crate::ai::document::ai_document_model::AIDocumentVersion;
use crate::terminal::input::inline_menu::{
@@ -68,7 +68,7 @@ impl SyncDataSource for ProfileSelectorDataSource {
Some((profile_id, profile_name))
})
.collect();
profiles.sort_by(|(_, a), (_, b)| a.to_lowercase().cmp(&b.to_lowercase()));
profiles.sort_by_key(|(_, a)| a.to_lowercase());
for (profile_id, profile_name) in profiles {
if query_text.is_empty() {
+1 -1
View File
@@ -6,8 +6,8 @@ mod view;
use std::path::PathBuf;
pub use view::{InlineReposMenuEvent, InlineReposMenuView};
use galaxyui::keymap::Keystroke;
pub use view::{InlineReposMenuEvent, InlineReposMenuView};
use crate::terminal::input::inline_menu::{
default_navigation_message_items, InlineMenuAction, InlineMenuMessageArgs, InlineMenuRowAction,
+1 -2
View File
@@ -6,9 +6,8 @@ mod search_item;
mod view;
pub use data_source::SelectRewindPoint;
pub use view::{RewindMenuEvent, RewindMenuView};
use galaxyui::keymap::Keystroke;
pub use view::{RewindMenuEvent, RewindMenuView};
use crate::terminal::input::inline_menu::{
default_navigation_message_items, InlineMenuAction, InlineMenuMessageArgs, InlineMenuType,
+1 -1
View File
@@ -1,6 +1,5 @@
use ai::skills::{SkillProvider, SkillReference, SkillScope};
use fuzzy_match::{match_indices_case_insensitive, FuzzyMatchResult};
use ordered_float::OrderedFloat;
use galaxy_core::ui::icons::Icon;
use galaxy_core::ui::theme::Fill;
use galaxy_util::local_or_remote_path::LocalOrRemotePath;
@@ -14,6 +13,7 @@ use galaxyui::text_layout::ClipConfig;
use galaxyui::{
AppContext, Element, Entity, EntityId, ModelContext, ModelHandle, SingletonEntity as _,
};
use ordered_float::OrderedFloat;
use crate::ai::skills::SkillManager;
use crate::appearance::Appearance;
@@ -1,9 +1,9 @@
use std::collections::{HashMap, HashSet};
use std::sync::LazyLock;
use pathfinder_geometry::vector::vec2f;
use galaxy_core::ui::appearance::Appearance;
use galaxy_core::ui::theme::Fill;
use pathfinder_geometry::vector::vec2f;
use warpui::elements::{
Border, ChildAnchor, Clipped, ClippedScrollStateHandle, ClippedScrollable, ConstrainedBox,
Container, CornerRadius, CrossAxisAlignment, DispatchEventResult, DropShadow, EventHandler,
@@ -6,15 +6,15 @@ use std::path::PathBuf;
use ai::skills::SkillProvider;
use fuzzy_match::FuzzyMatchResult;
#[cfg(not(target_family = "wasm"))]
use galaxy_cli::agent::Harness;
use galaxy_core::features::FeatureFlag;
use galaxy_core::ui::appearance::Appearance;
use galaxy_core::ui::Icon as GalaxyIcon;
use galaxyui::fonts::FamilyId;
use galaxyui::{AppContext, Entity, EntityId, ModelContext, ModelHandle, SingletonEntity};
use ordered_float::OrderedFloat;
pub(crate) use saved_prompts::*;
#[cfg(not(target_family = "wasm"))]
use galaxy_cli::agent::Harness;
use galaxy_core::features::FeatureFlag;
use galaxy_core::ui::Icon as WarpIcon;
pub use zero_state::*;
use super::AcceptSlashCommandOrSavedPrompt;
@@ -1,7 +1,6 @@
use galaxyui::{Entity, ModelHandle};
use itertools::Itertools;
use galaxy_core::features::FeatureFlag;
use galaxyui::{Entity, ModelHandle, SingletonEntity};
use itertools::Itertools;
use crate::ai::skills::SkillManager;
use crate::cloud_object::model::persistence::CloudModel;
+15 -17
View File
@@ -9,7 +9,6 @@ use std::path::PathBuf;
use ai::skills::SkillReference;
pub use cloud_mode_v2_view::{CloudModeV2SlashCommandView, Section as CloudModeV2Section};
pub use data_source::*;
pub use view::{CloseReason, InlineSlashCommandView, SlashCommandsEvent};
#[cfg(not(target_family = "wasm"))]
use galaxy_cli::agent::Harness;
use galaxy_core::features::FeatureFlag;
@@ -20,6 +19,7 @@ use galaxy_core::ui::theme::AnsiColorIdentifier;
use galaxy_util::path::{CleanPathResult, LineAndColumnArg};
use galaxyui::clipboard::ClipboardContent;
use galaxyui::{AppContext, SingletonEntity, ViewContext};
pub use view::{CloseReason, InlineSlashCommandView, SlashCommandsEvent};
use crate::ai::agent::conversation::AIConversationId;
#[cfg(not(target_family = "wasm"))]
@@ -476,7 +476,7 @@ impl Input {
_create_docker_sandbox if command.name == commands::CREATE_DOCKER_SANDBOX.name => {
ctx.emit(Event::CreateDockerSandbox);
}
conversations if command.name == commands::CONVERSATIONS.name => {
_ if command.name == commands::CONVERSATIONS.name => {
if self.is_cloud_mode_input_v2_composing(ctx) {
self.suggestions_mode_model.update(ctx, |model, ctx| {
model.set_mode(InputSuggestionsMode::Closed, ctx);
@@ -523,7 +523,7 @@ impl Input {
};
rename_conversation(conversation_id, argument.cloned().unwrap_or_default(), ctx);
}
set_tab_color if command.name == commands::SET_TAB_COLOR.name => {
_ if command.name == commands::SET_TAB_COLOR.name => {
let supported_options = || {
color_dot::TAB_COLOR_OPTIONS
.iter()
@@ -571,7 +571,7 @@ impl Input {
ctx.dispatch_typed_action(&WorkspaceAction::SetActiveTabColor(color));
}
create_env if command.name == commands::CREATE_ENVIRONMENT.name => {
_ if command.name == commands::CREATE_ENVIRONMENT.name => {
// If the user included args after the slash command, treat them as repo paths/URLs.
let repos = argument
.map(|arg| {
@@ -776,7 +776,7 @@ impl Input {
// Open the skill selector menu for invocation - skill command will be inserted into buffer
self.open_invoke_skill_selector(ctx);
}
host if command.name == commands::HOST.name => {
_ if command.name == commands::HOST.name => {
if !self.is_cloud_mode_input_v2_composing(ctx) {
return false;
}
@@ -794,7 +794,7 @@ impl Input {
self.open_v2_host_selector(ctx);
return true;
}
harness if command.name == commands::HARNESS.name => {
_ if command.name == commands::HARNESS.name => {
if !self.is_cloud_mode_input_v2_composing(ctx) {
// Defensive: the command is registered only when the V2 flag is on and its
// availability requires CLOUD_MODE_V2_COMPOSER, so this branch should be unreachable.
@@ -807,7 +807,7 @@ impl Input {
self.open_v2_harness_selector(ctx);
return true;
}
environment if command.name == commands::ENVIRONMENT.name => {
_ if command.name == commands::ENVIRONMENT.name => {
if !self.is_cloud_mode_input_v2_composing(ctx) {
return false;
}
@@ -818,7 +818,7 @@ impl Input {
self.open_v2_environment_selector(ctx);
return true;
}
models if command.name == commands::MODEL.name => {
_ if command.name == commands::MODEL.name => {
if self.is_cloud_mode_input_v2_composing(ctx) {
self.suggestions_mode_model.update(ctx, |model, ctx| {
model.set_mode(InputSuggestionsMode::Closed, ctx);
@@ -853,7 +853,7 @@ impl Input {
self.open_profile_selector(ctx);
}
prompts if command.name == commands::PROMPTS.name => {
_ if command.name == commands::PROMPTS.name => {
if self.is_cloud_mode_input_v2_composing(ctx) {
self.apply_v2_slash_section_filter(CloudModeV2Section::Prompts, ctx);
return true;
@@ -916,7 +916,7 @@ impl Input {
}
}
#[cfg(all(feature = "local_fs", not(target_family = "wasm")))]
move_to_cloud if command.name == commands::MOVE_TO_CLOUD.name => {
_ if command.name == commands::MOVE_TO_CLOUD.name => {
if !AISettings::as_ref(ctx).is_cloud_handoff_enabled(ctx) {
return false;
}
@@ -961,7 +961,7 @@ impl Input {
);
}
}
fork if command.name == commands::FORK.name => {
_ if command.name == commands::FORK.name => {
let Some(conversation_id) = self
.ai_context_model
.as_ref(ctx)
@@ -996,7 +996,7 @@ impl Input {
return true;
}
#[cfg(not(target_family = "wasm"))]
continue_locally if command.name == commands::CONTINUE_LOCALLY.name => {
_ if command.name == commands::CONTINUE_LOCALLY.name => {
let Some(conversation_id) = self
.ai_context_model
.as_ref(ctx)
@@ -1043,7 +1043,7 @@ impl Input {
destination,
});
}
fork_and_compact if command.name == commands::FORK_AND_COMPACT.name => {
_ if command.name == commands::FORK_AND_COMPACT.name => {
let Some(conversation_id) = self
.ai_context_model
.as_ref(ctx)
@@ -1069,7 +1069,7 @@ impl Input {
destination,
});
}
compact_and if command.name == commands::COMPACT_AND.name => {
_ if command.name == commands::COMPACT_AND.name => {
let conversation_id = if is_queued_prompt {
let Some(conversation_id) = queued_conversation_id else {
log::error!("Queued /compact-and missing conversation id");
@@ -1162,9 +1162,7 @@ impl Input {
}
self.open_repos_menu(ctx);
}
command_that_just_sends_ai_request_with_prefix
if slash_command_is_submitted_as_prompt(command) =>
{
_ if slash_command_is_submitted_as_prompt(command) => {
// These slash commands just send AI requests with the slash command text as a
// prefix, and special handling is done downstream as an implementation detail
// of handling user queries with specific slash command prefixes.
@@ -2,10 +2,8 @@ use std::collections::HashSet;
use ai::skills::SkillReference;
use galaxyui::elements::ChildView;
use galaxyui::{AppContext, Element, ViewContext};
use galaxyui::{Entity, ModelHandle, View, ViewHandle};
use lazy_static::lazy_static;
use galaxyui::{AppContext, Element, Entity, ModelHandle, View, ViewContext, ViewHandle};
use lazy_static::lazy_static;
use crate::ai::blocklist::agent_view::AgentViewController;
use crate::search::data_source::{Query, QueryFilter};
@@ -26,7 +26,7 @@ use crate::input_suggestions::{
DETAILS_PANEL_MARGIN, DETAILS_PANEL_PADDING, HISTORY_DETAILS_PANEL_WIDTH,
LABEL_PADDING as InputSuggestionsLabelPadding,
};
use crate::themes::theme::WarpTheme;
use crate::themes::theme::GalaxyTheme;
enum SuggestionsResizeConfig {
WidthAndHeight,
+1 -1
View File
@@ -1,9 +1,9 @@
use settings::Setting;
use galaxyui::elements::{
Border, ChildView, Container, CornerRadius, DropTarget, Element, Flex, Hoverable,
ParentElement, Radius, SavePosition, Stack,
};
use galaxyui::{AppContext, SingletonEntity};
use settings::Setting;
use super::common::{
add_command_xray_overlay, add_input_suggestions_overlays, add_vim_status_to_stack,
+1 -2
View File
@@ -6,10 +6,9 @@ mod search_item;
mod view;
pub use data_source::SelectUserQuery;
pub use view::{UserQueryMenuEvent, UserQueryMenuView};
use galaxyui::keymap::Keystroke;
use galaxyui::platform::OperatingSystem;
pub use view::{UserQueryMenuEvent, UserQueryMenuView};
use crate::terminal::input::inline_menu::{
default_navigation_message_items, InlineMenuAction, InlineMenuMessageArgs, InlineMenuRowAction,