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
+5
View File
@@ -181,15 +181,20 @@ impl ActionSearcher for FuzzyActionSearcher {
#[cfg(not(target_family = "wasm"))]
mod full_text_searcher {
use std::collections::HashMap;
use std::sync::Arc;
use fuzzy_match::FuzzyMatchResult;
use warp_search_core::define_search_schema;
use warpui::keymap::{BindingId, DescriptionContext};
use crate::search::action::data_source::{is_excluded_binding, ActionSearcher, SearcherAction};
use crate::search::action::search_item::MatchedBinding;
use crate::search::data_source::QueryResult;
use crate::search::searcher::{
SimpleFullTextSearcher, DEFAULT_MEMORY_BUDGET, SCORE_CONVERSION_FACTOR,
};
use crate::util::bindings::CommandBinding;
define_search_schema!(
schema_name: ACTION_SEARCH_SCHEMA,
@@ -1,7 +1,7 @@
use chrono::{DateTime, Local};
use fuzzy_match::FuzzyMatchResult;
use ordered_float::OrderedFloat;
use galaxy_core::command::ExitCode;
use ordered_float::OrderedFloat;
use warpui::elements::{
ConstrainedBox, Container, CrossAxisAlignment, Flex, Highlight, Icon, ParentElement, Text,
};
@@ -75,7 +75,7 @@ impl SyncDataSource for ConversationDataSource {
// assign higher values to more recently updated conversations. This ensures
// recency acts as a tiebreaker when fuzzy scores are similar.
let mut all_conversations = all_conversations;
all_conversations.sort_by(|a, b| a.last_updated.cmp(&b.last_updated));
all_conversations.sort_by_key(|a| a.last_updated);
let total_conversations = all_conversations.len();
let mut results: Vec<QueryResult<Self::Action>> = if query_text.is_empty() {
@@ -189,11 +189,7 @@ async fn fuzzy_match_files_zero_state(
if is_git_changed || is_recently_opened {
let rank = recency_index.get(&item.path).copied().unwrap_or(0);
let recency_bonus = if max_recency > 0 {
(30 * rank / max_recency) as i64
} else {
0
};
let recency_bonus = (30 * rank).checked_div(max_recency).unwrap_or(0) as i64;
let base_score = if is_git_changed { 10000 } else { 0 };
let match_result = FuzzyMatchResult {
score: base_score + recency_bonus,
@@ -255,11 +251,7 @@ async fn fuzzy_match_files_query(
// Add a recency bonus, capped at 30.
let rank = recency_index.get(&item.path).copied().unwrap_or(0);
let recency_bonus = if max_recency > 0 {
(30 * rank / max_recency) as i64
} else {
0
};
let recency_bonus = (30 * rank).checked_div(max_recency).unwrap_or(0) as i64;
match_result.score += recency_bonus;
@@ -3,18 +3,20 @@ use std::fs;
use std::path::PathBuf;
use std::sync::Arc;
use repo_metadata::repositories::DetectedRepositories;
use repo_metadata::RepoMetadataModel;
use tempfile::tempdir;
use fuzzy_match::FuzzyMatchResult;
use galaxyui::elements::Empty;
use galaxyui::platform::WindowStyle;
use galaxyui::r#async::block_on;
use galaxyui::windowing::WindowManager;
use galaxyui::{App, AppContext, Element, Entity, SingletonEntity, TypedActionView, View};
use repo_metadata::repositories::DetectedRepositories;
use repo_metadata::RepoMetadataModel;
use tempfile::tempdir;
use crate::search::ai_context_menu::files::data_source::{
file_data_source_for_pwd, fuzzy_match_files, FileSnapshot,
};
use crate::search::ai_context_menu::files::search_item::FileSearchItem;
use crate::search::ai_context_menu::mixer::AIContextMenuSearchableAction;
use crate::search::data_source::Query;
use crate::search::files::model::FileSearchModel;
@@ -436,8 +438,6 @@ fn test_directory_search_support() {
#[test]
fn test_directory_action_type() {
let directory_item = FileSearchItem {
path: PathBuf::from("src/components/"),
match_result: FuzzyMatchResult::no_match(),
@@ -1,260 +0,0 @@
#[cfg(test)]
mod tests {
use std::sync::Arc;
use chrono::{Duration, Utc};
use galaxyui::{App, SingletonEntity};
use settings::manager::SettingsManager;
use crate::auth::AuthStateProvider;
use crate::cloud_object::model::persistence::CloudModel;
use crate::cloud_object::model::view::CloudViewModel;
use crate::cloud_object::{Owner, Revision, ServerMetadata, ServerNotebook, ServerPermissions};
use crate::notebooks::manager::NotebookManager;
use crate::notebooks::CloudNotebookModel;
use crate::search::ai_context_menu::notebooks::data_source::NotebookDataSource;
use crate::search::data_source::Query;
use crate::search::mixer::SyncDataSource;
use crate::server::cloud_objects::update_manager::UpdateManager;
use crate::server::ids::{ServerId, SyncId};
use crate::server::server_api::ServerApiProvider;
use crate::server::sync_queue::SyncQueue;
use crate::settings::AISettings;
use crate::system::SystemStats;
use crate::workspaces::team_tester::TeamTesterStatus;
use crate::workspaces::user_profiles::UserProfiles;
use crate::workspaces::user_workspaces::UserWorkspaces;
use crate::NetworkStatus;
use crate::server::server_api::object::MockObjectClient;
use crate::server::server_api::team::MockTeamClient;
use crate::server::server_api::workspace::MockWorkspaceClient;
fn mock_server_notebook_with_revision(
id: i64,
title: &str,
revision: Revision,
) -> ServerNotebook {
ServerNotebook {
id: SyncId::ServerId(id.into()),
metadata: ServerMetadata {
uid: ServerId::default(),
revision,
metadata_last_updated_ts: Utc::now().into(),
trashed_ts: None,
folder_id: None,
is_welcome_object: false,
creator_uid: None,
last_editor_uid: None,
current_editor_uid: None,
},
permissions: ServerPermissions {
space: Owner::mock_current_user(),
guests: Vec::new(),
anyone_link_sharing: None,
permissions_last_updated_ts: Utc::now().into(),
},
model: CloudNotebookModel {
title: title.to_string(),
data: format!("{title} content"),
ai_document_id: None,
conversation_id: None,
},
}
}
fn initialize_app(app: &mut App) {
app.add_singleton_model(|_| NetworkStatus::new());
app.add_singleton_model(|_| SystemStats::new());
let mock_team_client = Arc::new(MockTeamClient::new());
let mock_workspace_client = Arc::new(MockWorkspaceClient::new());
app.add_singleton_model(|ctx| {
UserWorkspaces::mock(
mock_team_client.clone(),
mock_workspace_client.clone(),
vec![],
ctx,
)
});
app.add_singleton_model(TeamTesterStatus::new);
app.add_singleton_model(SyncQueue::mock);
app.add_singleton_model(CloudModel::mock);
app.add_singleton_model(|ctx| {
UpdateManager::new(None, Arc::new(MockObjectClient::new()), ctx)
});
app.add_singleton_model(|_| UserProfiles::new(Vec::new()));
app.add_singleton_model(CloudViewModel::new);
app.add_singleton_model(NotebookManager::mock);
app.add_singleton_model(|_| ServerApiProvider::new_for_test());
app.add_singleton_model(|_| SettingsManager::default());
app.add_singleton_model(|_| AuthStateProvider::new_for_test());
app.update(crate::settings::init_and_register_user_preferences);
app.update(AISettings::register_and_subscribe_to_events);
}
#[test]
fn zero_state_scores_reflect_recency() {
App::test((), |mut app| async move {
initialize_app(&mut app);
let now = Utc::now();
CloudModel::handle(&app).update(&mut app, |model, ctx| {
model.upsert_from_server_notebook(
mock_server_notebook_with_revision(
1,
"oldest",
(now - Duration::minutes(3)).into(),
),
ctx,
);
model.upsert_from_server_notebook(
mock_server_notebook_with_revision(
2,
"middle",
(now - Duration::minutes(2)).into(),
),
ctx,
);
model.upsert_from_server_notebook(
mock_server_notebook_with_revision(
3,
"newest",
(now - Duration::minutes(1)).into(),
),
ctx,
);
});
let data_source = NotebookDataSource::new(false);
let results = app.read(|app| data_source.run_query(&Query::from(""), app).unwrap());
assert_eq!(results.len(), 3);
// run_query sorts descending by score, so first result should be newest
let scores: Vec<_> = results.iter().map(|r| r.score()).collect();
assert!(
scores[0] > scores[1] && scores[1] > scores[2],
"Expected scores in strictly descending order (newest first), got {scores:?}"
);
})
}
#[test]
fn filtered_state_adds_recency_bonus_to_equal_matches() {
App::test((), |mut app| async move {
initialize_app(&mut app);
let now = Utc::now();
// All titles contain "plan" so fuzzy scores should be similar
CloudModel::handle(&app).update(&mut app, |model, ctx| {
model.upsert_from_server_notebook(
mock_server_notebook_with_revision(
1,
"my first plan",
(now - Duration::minutes(3)).into(),
),
ctx,
);
model.upsert_from_server_notebook(
mock_server_notebook_with_revision(
2,
"my second plan",
(now - Duration::minutes(2)).into(),
),
ctx,
);
model.upsert_from_server_notebook(
mock_server_notebook_with_revision(
3,
"my third plan",
(now - Duration::minutes(1)).into(),
),
ctx,
);
});
let data_source = NotebookDataSource::new(false);
let results = app.read(|app| data_source.run_query(&Query::from("plan"), app).unwrap());
assert_eq!(results.len(), 3);
// All match "plan" similarly; recency bonus should make newer items score higher
let scores: Vec<_> = results.iter().map(|r| r.score()).collect();
assert!(
scores[0] > scores[1] && scores[1] > scores[2],
"Expected scores in strictly descending order (newest first), got {scores:?}"
);
})
}
#[test]
fn test_multibyte_character_truncation() {
// Test string with multibyte characters (emojis, accented chars)
let test_content = "This is a test with emojis 🚀 and accented chars like café and naïve that should be truncated properly without panicking. This string is intentionally long to test the 200 character limit and ensure we don't slice in the middle of multibyte characters like 你好世界";
let truncated = if test_content.len() > 200 {
let result = test_content
.char_indices()
.take_while(|(i, _)| *i <= 197)
.last()
.map(|(i, c)| &test_content[..i + c.len_utf8()])
.unwrap_or("");
format!("{result}...")
} else {
test_content.to_string()
};
// Should not panic and should produce a valid string
assert!(!truncated.is_empty());
assert!(truncated.ends_with("..."));
// The truncated string should be valid UTF-8
assert!(std::str::from_utf8(truncated.as_bytes()).is_ok());
}
#[test]
fn test_truncation_with_boundary_at_multibyte_char() {
// Create a string where byte 197 falls exactly in the middle of a multibyte character
let mut test_content = "a".repeat(195); // 195 single-byte chars
test_content.push('🚀'); // 4-byte emoji at positions 195-198
test_content.push_str("more text after emoji");
// This should not panic even though byte 197 is in the middle of the emoji
let truncated = if test_content.len() > 200 {
let result = test_content
.char_indices()
.take_while(|(i, _)| *i <= 197)
.last()
.map(|(i, c)| &test_content[..i + c.len_utf8()])
.unwrap_or("");
format!("{result}...")
} else {
test_content.to_string()
};
// Should not panic and should produce a valid string
assert!(!truncated.is_empty());
// The truncated string should be valid UTF-8
assert!(std::str::from_utf8(truncated.as_bytes()).is_ok());
// Should either include the full emoji or stop before it
assert!(!truncated.contains("🚀") || truncated.contains("🚀..."));
}
#[test]
fn test_short_content_not_truncated() {
let short_content = "This is a short string with emoji 🚀";
let result = if short_content.len() > 200 {
let truncated = short_content
.char_indices()
.take_while(|(i, _)| *i <= 197)
.last()
.map(|(i, c)| &short_content[..i + c.len_utf8()])
.unwrap_or("");
format!("{truncated}...")
} else {
short_content.to_string()
};
// Short content should not be truncated
assert_eq!(result, short_content);
assert!(!result.ends_with("..."));
}
}
@@ -1,12 +1,12 @@
use std::fmt::Debug;
use fuzzy_match::FuzzyMatchResult;
use ordered_float::OrderedFloat;
use galaxyui::elements::{
ConstrainedBox, Container, CrossAxisAlignment, Flex, Highlight, Icon, ParentElement, Text,
};
use galaxyui::fonts::{Properties, Weight};
use galaxyui::{AppContext, Element, SingletonEntity};
use ordered_float::OrderedFloat;
use crate::appearance::Appearance;
use crate::cloud_object::ObjectType;
@@ -2,6 +2,7 @@ use std::sync::Arc;
use chrono::{Duration, Utc};
use cloud_object_client::MockObjectClient;
use galaxyui::{App, SingletonEntity};
use settings::manager::SettingsManager;
use crate::ai::facts::{AIFact, AIMemory, CloudAIFactModel};
@@ -1,12 +1,12 @@
use std::fmt::Debug;
use fuzzy_match::FuzzyMatchResult;
use ordered_float::OrderedFloat;
use galaxyui::elements::{
ConstrainedBox, Container, CrossAxisAlignment, Flex, Highlight, Icon, ParentElement, Text,
};
use galaxyui::fonts::{Properties, Weight};
use galaxyui::{AppContext, Element, SingletonEntity};
use ordered_float::OrderedFloat;
use crate::appearance::Appearance;
use crate::cloud_object::{GenericStringObjectFormat, JsonObjectType, ObjectType};
@@ -1,12 +1,12 @@
use ai::skills::SkillProvider;
use fuzzy_match::FuzzyMatchResult;
use ordered_float::OrderedFloat;
use galaxy_core::ui::icons::Icon;
use galaxyui::elements::{
ConstrainedBox, Container, CrossAxisAlignment, Flex, Highlight, ParentElement, Shrinkable, Text,
};
use galaxyui::fonts::{Properties, Weight};
use galaxyui::{AppContext, Element, SingletonEntity};
use ordered_float::OrderedFloat;
use crate::appearance::Appearance;
use crate::search::ai_context_menu::mixer::AIContextMenuSearchableAction;
+1 -1
View File
@@ -3,11 +3,11 @@ use std::ops::Range;
use std::time::Duration;
use async_channel::Sender;
use galaxy_core::features::FeatureFlag;
use itertools::Itertools;
#[cfg(not(target_family = "wasm"))]
use repo_metadata::repositories::DetectedRepositories;
use settings::Setting as _;
use galaxy_core::features::FeatureFlag;
use warpui::elements::{
AnchorPair, Border, ChildView, ConstrainedBox, Container, CornerRadius, CrossAxisAlignment,
Dismiss, Empty, Fill, Flex, Hoverable, Icon, MouseStateHandle, OffsetPositioning, OffsetType,
@@ -1,12 +1,12 @@
use std::fmt::Debug;
use fuzzy_match::FuzzyMatchResult;
use ordered_float::OrderedFloat;
use galaxyui::elements::{
ConstrainedBox, Container, CrossAxisAlignment, Flex, Highlight, Icon, ParentElement, Text,
};
use galaxyui::fonts::{Properties, Weight};
use galaxyui::{AppContext, Element, SingletonEntity};
use ordered_float::OrderedFloat;
use crate::appearance::Appearance;
use crate::cloud_object::ObjectType;
@@ -1,10 +1,10 @@
use ordered_float::OrderedFloat;
use pathfinder_color::ColorU;
use pathfinder_geometry::vector::vec2f;
use galaxy_core::ui::color::blend::Blend;
use galaxy_core::ui::color::coloru_with_opacity;
use galaxy_core::ui::icons::Icon;
use galaxy_core::ui::theme::color::internal_colors;
use ordered_float::OrderedFloat;
use pathfinder_color::ColorU;
use pathfinder_geometry::vector::vec2f;
use warpui::elements::{
AnchorPair, Container, CrossAxisAlignment, Expanded, Fill, Flex, Highlight, MainAxisSize,
MouseStateHandle, OffsetPositioning, OffsetType, ParentElement, ParentOffsetBounds,
@@ -1,6 +1,7 @@
use std::collections::HashSet;
use std::path::PathBuf;
use fuzzy_match::FuzzyMatchResult;
use galaxy_core::context_flag::ContextFlag;
use galaxy_core::features::FeatureFlag;
use warpui::keymap::BindingId;
@@ -10,6 +11,7 @@ use super::{conversations, warp_drive};
use crate::drive::settings::WarpDriveSettings;
use crate::search::action::CommandBindingDataSource;
use crate::search::binding_source::BindingSource;
use crate::search::command_palette::files::search_item::FileSearchItem;
use crate::search::command_palette::mixer::{CommandPaletteItemAction, ItemSummary};
use crate::search::command_palette::new_session::NewSessionDataSource;
use crate::search::command_palette::repos::RepoDataSource;
@@ -248,8 +250,6 @@ impl DataSourceStore {
// Create a file search item from the summary
use fuzzy_match::FuzzyMatchResult;
use crate::search::command_palette::files::search_item::FileSearchItem;
let search_item = FileSearchItem {
path: PathBuf::from(path),
project_directory: project_directory.clone(),
@@ -265,7 +265,6 @@ impl DataSourceStore {
} => {
// Create a directory search item from the summary
let search_item = FileSearchItem {
path: PathBuf::from(path),
project_directory: project_directory.clone(),
@@ -3,6 +3,7 @@ use std::sync::Arc;
use chrono::Utc;
use cloud_object_client::MockObjectClient;
use settings::manager::SettingsManager;
use warpui::App;
use super::*;
use crate::auth::AuthStateProvider;
@@ -7,10 +7,10 @@ use std::sync::Arc;
use futures_lite::FutureExt;
use fuzzy_match::FuzzyMatchResult;
use instant::Instant;
use itertools::Itertools;
use galaxy_util::path::CleanPathResult;
use galaxyui::{AppContext, Entity, SingletonEntity};
use instant::Instant;
use itertools::Itertools;
use super::search_item::{CreateFileSearchItem, FileSearchItem};
use crate::code::opened_files::{OpenedFilesInRepo, OpenedFilesModel};
@@ -2,11 +2,11 @@ use std::fmt::Debug;
use std::path::PathBuf;
use fuzzy_match::FuzzyMatchResult;
use ordered_float::OrderedFloat;
use galaxy_util::path::LineAndColumnArg;
use galaxyui::elements::{Align, ConstrainedBox, Container, Flex, Icon, ParentElement, Text};
use galaxyui::fonts::{Properties, Weight};
use galaxyui::{AppContext, Element, SingletonEntity};
use ordered_float::OrderedFloat;
use crate::appearance::Appearance;
use crate::search::command_palette::mixer::CommandPaletteItemAction;
@@ -1,10 +1,10 @@
use pathfinder_color::ColorU;
use galaxyui::elements::{
ConstrainedBox, Container, CornerRadius, CrossAxisAlignment, Flex, Hoverable, Icon,
MouseStateHandle, ParentElement, Radius, Text,
};
use galaxyui::platform::Cursor;
use galaxyui::{Element, EventContext};
use pathfinder_color::ColorU;
use crate::appearance::Appearance;
use crate::drive::cloud_object_styling::warp_drive_icon_color;
@@ -149,7 +149,7 @@ impl FilterChipRenderer for QueryFilter {
mod styles {
use galaxyui::elements::{Border, MouseState};
use crate::themes::theme::{Blend, Fill, WarpTheme};
use crate::themes::theme::{Blend, Fill, GalaxyTheme};
/// Size of the border when the query filter is hovered.
const HOVERED_BORDER_SIZE: f32 = 2.;
@@ -9,7 +9,7 @@ use crate::search::command_palette::launch_config::search_item::SearchItem;
use crate::search::command_palette::mixer::CommandPaletteItemAction;
use crate::search::data_source::{DataSourceSearchError, Query, QueryResult};
use crate::search::mixer::{DataSourceRunErrorWrapper, SyncDataSource};
use crate::user_config::{WarpConfig, WarpConfigUpdateEvent};
use crate::user_config::{GalaxyConfig, GalaxyConfigUpdateEvent};
/// Datasource that searches against `LaunchConfig`s.
pub struct DataSource {
@@ -50,11 +50,11 @@ impl DataSource {
fn handle_config_event(
&mut self,
_: ModelHandle<WarpConfig>,
event: &WarpConfigUpdateEvent,
_: ModelHandle<GalaxyConfig>,
event: &GalaxyConfigUpdateEvent,
ctx: &mut ModelContext<Self>,
) {
if matches!(event, WarpConfigUpdateEvent::LaunchConfigs) {
if matches!(event, GalaxyConfigUpdateEvent::LaunchConfigs) {
self.searcher.refresh_search_index(ctx);
}
}
@@ -123,14 +123,19 @@ impl LaunchConfigSearcher for FuzzyLaunchConfigSearcher {
#[cfg(not(target_family = "wasm"))]
mod full_text_searcher {
use std::collections::HashMap;
use std::sync::Arc;
use fuzzy_match::FuzzyMatchResult;
use warp_search_core::define_search_schema;
use warpui::r#async::executor::Background;
use warpui::{AppContext, SingletonEntity};
use crate::launch_configs::launch_config::LaunchConfig;
use crate::search::command_palette::launch_config::data_source::LaunchConfigSearcher;
use crate::search::command_palette::launch_config::search_item::SearchItem;
use crate::search::searcher::{AsyncSearcher, DEFAULT_MEMORY_BUDGET, SCORE_CONVERSION_FACTOR};
use crate::user_config::WarpConfig;
use crate::user_config::GalaxyConfig;
// The name of the launch configs are duplicated to ensure that the searcher
// hashes the name to uniquely identify the launch config.
@@ -246,12 +246,17 @@ pub use full_text_searcher::FullTextSessionSearcher;
mod full_text_searcher {
use std::collections::HashMap;
use galaxyui::{AppContext, ModelHandle};
use itertools::Itertools;
use warp_search_core::define_search_schema;
use crate::pane_group::PaneId;
use crate::search::command_palette::navigation::search::{
searchable_session_string_and_ranges, MatchedSession, SearcherAction,
SessionHighlightIndices, SessionMatchResult, SessionSearcher,
};
use crate::search::command_palette::navigation::search_item::SearchItem;
use crate::search::data_source::QueryResult;
use crate::search::searcher::{DEFAULT_MEMORY_BUDGET, SCORE_CONVERSION_FACTOR};
use crate::session_management::{SessionNavigationData, SessionSource};
@@ -300,6 +300,9 @@ impl NewSessionSearcher for FuzzyNewSessionSearcher {
#[cfg(not(target_family = "wasm"))]
mod full_text_searcher {
use std::collections::HashMap;
use std::sync::Arc;
use fuzzy_match::FuzzyMatchResult;
use warp_search_core::define_search_schema;
use warpui::r#async::executor::Background;
@@ -1,8 +1,8 @@
use std::sync::Arc;
use fuzzy_match::FuzzyMatchResult;
use ordered_float::OrderedFloat;
use galaxyui::{AppContext, Element, SingletonEntity};
use ordered_float::OrderedFloat;
use super::new_session_option::NewSessionOption;
use crate::appearance::Appearance;
@@ -1,5 +1,5 @@
use pathfinder_color::ColorU;
use galaxy_core::ui::theme::Fill;
use pathfinder_color::ColorU;
use warpui::elements::{Align, ConstrainedBox, Container, Empty};
use warpui::Element;
@@ -2,11 +2,11 @@ use std::path::Path;
use ai::workspace::WorkspaceMetadata;
use fuzzy_match::FuzzyMatchResult;
use ordered_float::OrderedFloat;
use galaxy_core::ui::theme::Fill;
use galaxyui::elements::{Align, ConstrainedBox, Flex, Highlight, ParentElement, Shrinkable, Text};
use galaxyui::fonts::{Properties, Weight};
use galaxyui::{AppContext, Element, SingletonEntity};
use ordered_float::OrderedFloat;
use crate::appearance::Appearance;
use crate::search::action::search_item::styles;
@@ -1,4 +1,5 @@
use itertools::Itertools;
use warpui::keymap::BindingId;
use super::*;
+3 -3
View File
@@ -2,8 +2,6 @@ use std::collections::HashSet;
use std::ops::Deref;
use std::sync::Arc;
use itertools::Itertools;
use lazy_static::lazy_static;
use galaxy_core::send_telemetry_from_app_ctx;
use galaxy_util::path::LineAndColumnArg;
use galaxyui::elements::{
@@ -19,6 +17,8 @@ use galaxyui::{
AppContext, Element, Entity, EntityId, FocusContext, ModelHandle, SingletonEntity,
TypedActionView, ViewContext, ViewHandle, WindowId,
};
use itertools::Itertools;
use lazy_static::lazy_static;
use super::super::palette_styles as styles;
use super::CommandPaletteMixer;
@@ -44,7 +44,7 @@ use crate::server::telemetry::{LaunchConfigUiLocation, TelemetryEvent};
use crate::session_management::SessionSource;
use crate::settings::CtrlTabBehavior;
use crate::terminal::keys_settings::KeysSettings;
use crate::themes::theme::WarpTheme;
use crate::themes::theme::GalaxyTheme;
use crate::view_components::DismissibleToast;
use crate::workspace::{active_terminal_in_window, ForkedConversationDestination, WorkspaceAction};
use crate::{send_telemetry_from_ctx, ToastStack};
@@ -550,15 +550,22 @@ mod full_text_searcher {
use crate::cloud_object::{
CloudObject, CloudObjectLocation, GenericStringObjectFormat, JsonObjectType, ObjectType,
};
use crate::drive::folders::CloudFolder;
use crate::env_vars::CloudEnvVarCollection;
use crate::notebooks::manager::NotebookManager;
use crate::notebooks::CloudNotebook;
use crate::search::command_palette::warp_drive::data_source::WarpDriveSearcher;
use crate::search::command_palette::warp_drive::env_var_collection_search_item::{
EnvVarCollectionSearchItem, ENV_VAR_NAME_SEPARATOR,
};
use crate::search::command_palette::warp_drive::notebook_search_item::NotebookSearchItem;
use crate::search::command_palette::warp_drive::workflow_search_item::WorkflowSearchItem;
use crate::search::env_var_collections::fuzzy_match::FuzzyMatchEnvVarCollectionResult;
use crate::search::notebooks::fuzzy_match::FuzzyMatchNotebookResult;
use crate::search::searcher::{AsyncSearcher, DEFAULT_MEMORY_BUDGET, SCORE_CONVERSION_FACTOR};
use crate::search::workflows::fuzzy_match::FuzzyMatchWorkflowResult;
use crate::server::ids::ObjectUid;
use crate::workflows::CloudWorkflow;
/// Memory budget for the search index of warp drive.
/// Warp could potentially have a lot of objects, so we increase it from the default of 50MB to 100MB
+1 -1
View File
@@ -1,7 +1,6 @@
mod items;
use std::collections::HashMap;
pub use items::Items;
use galaxy_core::context_flag::ContextFlag;
use galaxy_core::features::FeatureFlag;
use galaxyui::elements::{Container, Flex, MouseStateHandle, ParentElement, Shrinkable, Wrap};
@@ -9,6 +8,7 @@ use galaxyui::{
AppContext, Element, Entity, ModelHandle, SingletonEntity, TypedActionView, View, ViewContext,
WindowId,
};
pub use items::Items;
use crate::appearance::Appearance;
use crate::drive::settings::WarpDriveSettings;
@@ -1,5 +1,4 @@
use chrono::{DateTime, Local};
use ordered_float::OrderedFloat;
use galaxy_core::ui::builder::MIN_FONT_SIZE;
use galaxyui::elements::{
Align, ConstrainedBox, Container, CrossAxisAlignment, Flex, Highlight, Icon, MainAxisAlignment,
@@ -8,6 +7,7 @@ use galaxyui::elements::{
use galaxyui::fonts::{Properties, Weight};
use galaxyui::ui_components::components::{Coords, UiComponent, UiComponentStyles};
use galaxyui::{AppContext, Element, SingletonEntity};
use ordered_float::OrderedFloat;
use crate::ai::blocklist::AIQueryHistoryOutputStatus;
use crate::appearance::Appearance;
@@ -1,5 +1,3 @@
use itertools::Itertools;
use ordered_float::OrderedFloat;
use galaxyui::elements::{
ConstrainedBox, Container, CrossAxisAlignment, Flex, Highlight, Icon, MainAxisAlignment,
MainAxisSize, ParentElement, Text,
@@ -7,6 +5,8 @@ use galaxyui::elements::{
use galaxyui::fonts::{Properties, Weight};
use galaxyui::ui_components::components::{UiComponent, UiComponentStyles};
use galaxyui::{AppContext, Element, SingletonEntity};
use itertools::Itertools;
use ordered_float::OrderedFloat;
use crate::appearance::Appearance;
use crate::env_vars::CloudEnvVarCollection;
@@ -1,7 +1,7 @@
use std::sync::Arc;
use ordered_float::OrderedFloat;
use galaxy_core::ui::builder;
use ordered_float::OrderedFloat;
use warpui::elements::{
Align, ConstrainedBox, Container, CrossAxisAlignment, Flex, Highlight, Icon, MainAxisAlignment,
MainAxisSize, ParentElement, Shrinkable, Text,
@@ -1,12 +1,12 @@
use std::sync::Arc;
use ordered_float::OrderedFloat;
use galaxyui::elements::{
ConstrainedBox, Container, Flex, Highlight, Icon, MainAxisAlignment, MainAxisSize,
ParentElement, Text,
};
use galaxyui::fonts::{Properties, Weight};
use galaxyui::{AppContext, Element, SingletonEntity};
use ordered_float::OrderedFloat;
use crate::appearance::Appearance;
use crate::notebooks::CloudNotebookModel;
@@ -3,11 +3,11 @@ use std::path::PathBuf;
use chrono::NaiveDateTime;
use fuzzy_match::FuzzyMatchResult;
use ordered_float::OrderedFloat;
use galaxy_core::ui::theme::Fill;
use galaxyui::elements::{Align, ConstrainedBox, Flex, Highlight, ParentElement, Shrinkable, Text};
use galaxyui::fonts::{Properties, Weight};
use galaxyui::{AppContext, Element, SingletonEntity};
use ordered_float::OrderedFloat;
use crate::appearance::Appearance;
use crate::search::action::search_item::styles;
+1 -1
View File
@@ -1,5 +1,5 @@
use settings::macros::define_settings_group;
use settings::{RespectUserSyncSetting, SupportedPlatforms, SyncToCloud};
use settings::{RespectUserSyncSetting, Setting, SupportedPlatforms, SyncToCloud};
define_settings_group!(CommandSearchSettings, settings: [
show_global_workflows_in_universal_search: ShowGlobalWorkflowsInUniversalSearch {
+7 -6
View File
@@ -4,12 +4,8 @@ use std::sync::Arc;
use std::time::Duration;
use async_channel::Sender;
use itertools::Itertools;
use lazy_static::lazy_static;
use pathfinder_color::ColorU;
use pathfinder_geometry::vector::Vector2F;
use galaxy_core::features::FeatureFlag;
use galaxyui::accessibility::{AccessibilityContent, WarpA11yRole};
use galaxyui::accessibility::{AccessibilityContent, GalaxyA11yRole};
use galaxyui::elements::{
resizable_state_handle, Align, AnchorPair, Border, ConstrainedBox, Container, CornerRadius,
CrossAxisAlignment, Dismiss, Fill, Flex, MouseStateHandle, OffsetPositioning, OffsetType,
@@ -23,7 +19,10 @@ use galaxyui::{
AppContext, Element, Entity, FocusContext, ModelHandle, SingletonEntity, TypedActionView, View,
ViewContext, ViewHandle, WeakViewHandle,
};
use std::{collections::HashSet, ops::Range, sync::Arc, time::Duration};
use itertools::Itertools;
use lazy_static::lazy_static;
use pathfinder_color::ColorU;
use pathfinder_geometry::vector::Vector2F;
use super::ai_queries::AIQueriesDataSource;
use super::env_var_collections::EnvVarCollectionDataSource;
@@ -1118,7 +1117,9 @@ impl CommandSearchView {
pub mod styles {
use galaxyui::elements::{Border, DropShadow, ScrollbarWidth};
use pathfinder_color::ColorU;
use crate::appearance::Appearance;
use crate::themes::theme::Fill;
pub const CORNER_RADIUS: f32 = 8.;
+3 -6
View File
@@ -3,15 +3,11 @@ use std::sync::Arc;
use async_trait::async_trait;
use galaxy_core::ui::builder;
use galaxyui::{
elements::{ConstrainedBox, Container, Text},
AppContext, Element, SingletonEntity,
};
use galaxyui::elements::{ConstrainedBox, Container, Text};
use galaxyui::{AppContext, Element, SingletonEntity};
use itertools::Itertools;
use ordered_float::OrderedFloat;
use serde_json::json;
use galaxyui::elements::{ConstrainedBox, Container, Text};
use galaxyui::{AppContext, Element, SingletonEntity};
use super::workflows::{WorkflowIdentity, WorkflowSearchItem};
use crate::ai::AIRequestUsageModel;
@@ -257,6 +253,7 @@ impl DataSourceRunError for GenerateCommandsFromNaturalLanguageError {
}
mod styles {
use crate::appearance::Appearance;
/// Returns the icon size to be used for the 'sparkle' icon in the AI command search result.
/// The icon appeaars smaller than its size would indicate, so make a bit larger than icons
@@ -1,6 +1,5 @@
use std::sync::Arc;
use ordered_float::OrderedFloat;
use galaxyui::elements::{
Border, Clipped, ConstrainedBox, Container, CornerRadius, CrossAxisAlignment, Flex, Highlight,
MainAxisAlignment, MainAxisSize, ParentElement, Radius, Shrinkable, Text,
@@ -8,6 +7,7 @@ use galaxyui::elements::{
use galaxyui::fonts::{Properties, Weight};
use galaxyui::ui_components::components::{UiComponent, UiComponentStyles};
use galaxyui::{AppContext, Element, SingletonEntity};
use ordered_float::OrderedFloat;
use crate::appearance::Appearance;
use crate::search::command_search::searcher::{AcceptedWorkflow, CommandSearchItemAction};
@@ -10,7 +10,7 @@ use crate::search::command_search::settings::CommandSearchSettings;
use crate::search::data_source::{Query, QueryResult};
use crate::search::mixer::{DataSourceRunErrorWrapper, SyncDataSource};
use crate::search::workflows::fuzzy_match::FuzzyMatchWorkflowResult;
use crate::user_config::WarpConfig;
use crate::user_config::GalaxyConfig;
use crate::workflows::local_workflows::LocalWorkflows;
#[cfg(feature = "local_fs")]
use crate::workflows::local_workflows::UseCache;
+2 -1
View File
@@ -1,6 +1,5 @@
use std::collections::HashMap;
use lazy_static::lazy_static;
use galaxy_core::features::FeatureFlag;
use galaxy_core::ui::theme::color::internal_colors;
use galaxyui::elements::{
@@ -8,6 +7,7 @@ use galaxyui::elements::{
};
use galaxyui::platform::Cursor;
use galaxyui::{AppContext, Element, Entity, SingletonEntity, TypedActionView, View, ViewContext};
use lazy_static::lazy_static;
use crate::appearance::Appearance;
use crate::drive::settings::{WarpDriveSettings, WarpDriveSettingsChangedEvent};
@@ -305,6 +305,7 @@ fn valid_query_filters(app: &AppContext) -> Vec<QueryFilter> {
}
mod styles {
use crate::appearance::Appearance;
pub const FILTER_CHIP_MARGIN: f32 = 8.;
pub const FILTER_CHIPS_MARGIN_BOTTOM: f32 = 16.;
@@ -1,3 +1,4 @@
use galaxyui::AppContext;
use itertools::Itertools;
use super::external_secret_fuzzy_match::FuzzyMatchExternalSecretResult;
@@ -1,7 +1,7 @@
use ordered_float::OrderedFloat;
use galaxyui::elements::{ConstrainedBox, Container, Highlight, Text};
use galaxyui::fonts::{Properties, Weight};
use galaxyui::{AppContext, Element, SingletonEntity};
use ordered_float::OrderedFloat;
use super::external_secret_fuzzy_match::FuzzyMatchExternalSecretResult;
use super::searcher::ExternalSecretSearchItemAction;
+3 -2
View File
@@ -1,8 +1,6 @@
use std::collections::HashSet;
use std::ops::Range;
use itertools::Itertools;
use lazy_static::lazy_static;
use galaxyui::elements::{
Align, ConstrainedBox, Container, CornerRadius, Dismiss, Empty, Fill, Flex, ParentElement,
Radius, SavePosition, ScrollStateHandle, Scrollable, ScrollableElement, Shrinkable,
@@ -14,6 +12,8 @@ use galaxyui::{
AppContext, Element, Entity, FocusContext, ModelHandle, SingletonEntity, TypedActionView, View,
ViewContext, ViewHandle, WeakViewHandle,
};
use itertools::Itertools;
use lazy_static::lazy_static;
use crate::appearance::Appearance;
use crate::external_secrets::ExternalSecret;
@@ -366,6 +366,7 @@ pub mod styles {
use galaxyui::elements::{Border, DropShadow, ScrollbarWidth};
use pathfinder_color::ColorU;
use crate::appearance::Appearance;
use crate::themes::theme::Fill;
pub const CORNER_RADIUS: f32 = 6.;
+7 -3
View File
@@ -1,9 +1,7 @@
use fuzzy_match::FuzzyMatchResult;
use galaxyui::{App, SingletonEntity};
use repo_metadata::repositories::DetectedRepositories;
use repo_metadata::RepoMetadataModel;
use super::super::search_item::{FileSearchItem, FileSearchResult};
use super::FileSearchModel;
#[cfg(test)]
@@ -177,6 +175,9 @@ mod file_search_model_tests {
#[cfg(test)]
mod file_search_item_tests {
use fuzzy_match::FuzzyMatchResult;
use crate::search::files::search_item::{FileSearchItem, FileSearchResult};
#[test]
fn test_file_search_item_from_result() {
@@ -254,6 +255,7 @@ mod file_search_item_tests {
mod strip_absolute_path_prefix_tests {
use std::path::{Path, PathBuf};
use super::FileSearchModel;
/// Builds an absolute path from the given components, using the platform's
/// root (`/` on Unix, `C:\` on Windows). This ensures the constructed
@@ -388,6 +390,8 @@ mod strip_absolute_path_prefix_tests {
#[cfg(test)]
mod integration_tests {
use super::FileSearchModel;
use crate::search::files::search_item::{FileSearchItem, FileSearchResult};
#[test]
fn test_typical_search_workflow() {
@@ -420,7 +424,7 @@ mod integration_tests {
assert!(!results.is_empty());
// Sort by score (highest first)
results.sort_by(|a, b| b.match_result.score.cmp(&a.match_result.score));
results.sort_by_key(|b| std::cmp::Reverse(b.match_result.score));
// "src/main.rs" should be the top result (exact filename match)
assert_eq!(results[0].path, "src/main.rs");
@@ -1,4 +1,3 @@
use ordered_float::OrderedFloat;
use galaxyui::elements::{
ConstrainedBox, Container, CrossAxisAlignment, Flex, Highlight, MainAxisAlignment,
MainAxisSize, ParentElement, Text,
@@ -6,6 +5,7 @@ use galaxyui::elements::{
use galaxyui::fonts::{Properties, Weight};
use galaxyui::ui_components::components::{Coords, UiComponent, UiComponentStyles};
use galaxyui::{AppContext, Element, SingletonEntity};
use ordered_float::OrderedFloat;
use crate::appearance::Appearance;
use crate::cloud_object::CloudObject;
+3 -2
View File
@@ -1,8 +1,6 @@
use std::collections::HashSet;
use std::ops::Range;
use itertools::Itertools;
use lazy_static::lazy_static;
use galaxyui::elements::{
Align, ConstrainedBox, Container, CornerRadius, Dismiss, Empty, Fill, Flex, ParentElement,
Radius, SavePosition, ScrollStateHandle, Scrollable, ScrollableElement, Shrinkable,
@@ -14,6 +12,8 @@ use galaxyui::{
AppContext, Element, Entity, FocusContext, ModelHandle, SingletonEntity, TypedActionView, View,
ViewContext, ViewHandle, WeakViewHandle,
};
use itertools::Itertools;
use lazy_static::lazy_static;
use super::searcher::{EmbeddingSearchItemAction, EmbeddingSearchMixer};
use crate::appearance::Appearance;
@@ -376,6 +376,7 @@ pub mod styles {
use galaxyui::elements::{Border, DropShadow, ScrollbarWidth};
use pathfinder_color::ColorU;
use crate::appearance::Appearance;
use crate::themes::theme::Fill;
pub const CORNER_RADIUS: f32 = 6.;
@@ -1,4 +1,3 @@
use ordered_float::OrderedFloat;
use galaxyui::elements::{
Clipped, ConstrainedBox, Container, CrossAxisAlignment, Flex, Highlight, MainAxisAlignment,
MainAxisSize, ParentElement, Shrinkable, Text,
@@ -6,6 +5,7 @@ use galaxyui::elements::{
use galaxyui::fonts::{Properties, Weight};
use galaxyui::ui_components::components::{Coords, UiComponent, UiComponentStyles};
use galaxyui::{AppContext, Element, SingletonEntity};
use ordered_float::OrderedFloat;
use crate::appearance::Appearance;
use crate::cloud_object::CloudObject;
+2 -2
View File
@@ -1,8 +1,7 @@
use std::collections::HashSet;
use itertools::{Either, Itertools};
use galaxy_editor::editor::NavigationKey;
use galaxyui::accessibility::{AccessibilityContent, WarpA11yRole};
use galaxyui::accessibility::{AccessibilityContent, GalaxyA11yRole};
use galaxyui::elements::{
Clipped, ConstrainedBox, Container, CrossAxisAlignment, Flex, ParentElement, Shrinkable, Text,
};
@@ -12,6 +11,7 @@ use galaxyui::{
Action, AppContext, Element, Entity, FocusContext, ModelContext, ModelHandle, SingletonEntity,
TypedActionView, View, ViewContext, ViewHandle,
};
use itertools::{Either, Itertools};
use super::mixer::SearchMixerEvent;
use crate::appearance::Appearance;
+1 -1
View File
@@ -1,7 +1,6 @@
use std::marker::PhantomData;
use std::ops::Range;
use itertools::Itertools;
use galaxyui::elements::{
ConstrainedBox, Container, Empty, Flex, ParentElement, SavePosition, ScrollStateHandle,
Scrollable, ScrollableElement, ScrollbarWidth, Text, UniformList, UniformListState,
@@ -11,6 +10,7 @@ use galaxyui::{
Action, AppContext, Element, Entity, ModelHandle, SingletonEntity, View, ViewContext,
ViewHandle, WeakViewHandle,
};
use itertools::Itertools;
use super::styles::{ESTIMATED_RESULT_HEIGHT, MAX_DISPLAYED_RESULT_COUNT};
use crate::appearance::Appearance;