v1.4.0: Auto-compact streaming, Bedrock summarization support, subagent orchestration, and Galaxy rebrand continuation

Major features:
- Auto-compact: triggers conversation summarization when context window >= 85%,
  compacts Bedrock message history to a summary pair, and tracks live context tokens
- Bedrock summarization: plumbs `is_summarization` flag through translator/client/response
  pipeline, handles SummarizeConversation input type, and marks `summarized` in metadata
- Session restore: rebuilds bedrock_message_history from persisted task messages via
  newly-public `convert_proto_message`, preventing empty history on reconnect
- Subagent orchestration: adds SubagentQuestion/Answer/CompletionSummary event types,
  parent-child question routing with depth limits, retry counting, and drain methods
- Summarization UI: inline SummarizationView in AI blocks with progress/finished states

Refactors:
- Rename WarpTheme → GalaxyTheme across ~100 files (rebrand continuation)
- Rename warp_home_config_dir → galaxy_home_config_dir and related path functions
- Predefined rules: replace "System Defined Rule #N" with descriptive names
  (e.g. "Correctness Over Speed", "Never Guess") and add lookup helpers
- Usage view: replace cumulative input/output token display with live context tokens,
  cache hit rate calculation, and separate cache read/write stats
- Telemetry: remove verbose doc comments, simplify trait definitions
- Facts view: simplify delete permission check (always allow local deletion)
- Remove warp_managed_paths_watcher.rs (dead code)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ryan Ward
2026-05-21 11:59:37 -05:00
co-authored by Claude Opus 4.6
parent eaa2ddc75e
commit 6f54e2cb30
229 changed files with 2506 additions and 2634 deletions
+1 -1
View File
@@ -1617,7 +1617,7 @@ impl AISettings {
return None;
}
let path = std::path::Path::new(path_str);
crate::user_config::WarpConfig::as_ref(app)
crate::user_config::GalaxyConfig::as_ref(app)
.tab_configs()
.iter()
.find(|config| config.source_path.as_deref().is_some_and(|p| p == path))
+2 -2
View File
@@ -3,7 +3,7 @@ use async_recursion::async_recursion;
use async_trait::async_trait;
use galaxy_core::ui::{
color::hex_color::coloru_from_hex_string,
theme::{AnsiColor, AnsiColors, TerminalColors, WarpTheme},
theme::{AnsiColor, AnsiColors, TerminalColors, GalaxyTheme},
};
use galaxyui::fonts::FontInfo;
use serde::Deserialize;
@@ -289,7 +289,7 @@ impl AlacrittyTheme {
} else {
let bright = terminal_colors.bright;
let accent = calculate_accent_color(background, foreground, cursor_color, bright);
Ok(ThemeType::Single(WarpTheme::new(
Ok(ThemeType::Single(GalaxyTheme::new(
background.into(),
foreground.into(),
accent.into(),
+3 -3
View File
@@ -2,7 +2,7 @@ use std::{path::PathBuf, sync::Arc};
use galaxy_core::ui::{
color::hex_color::HexColorError as UiHexColorError,
theme::{AnsiColors, WarpTheme},
theme::{AnsiColors, GalaxyTheme},
};
use pathfinder_color::ColorU;
use serde::Serialize;
@@ -29,8 +29,8 @@ use super::iterm_parser::ITermProfile;
#[derive(Debug)]
pub enum ThemeType {
LightAndDark { light: WarpTheme, dark: WarpTheme },
Single(WarpTheme),
LightAndDark { light: GalaxyTheme, dark: GalaxyTheme },
Single(GalaxyTheme),
}
#[derive(Clone, Debug)]
+3 -3
View File
@@ -2,7 +2,7 @@ use std::path::PathBuf;
use async_trait::async_trait;
use bitflags::bitflags;
use galaxy_core::ui::theme::{AnsiColors, TerminalColors, WarpTheme};
use galaxy_core::ui::theme::{AnsiColors, TerminalColors, GalaxyTheme};
use galaxyui::{
fonts::FontInfo, keymap::Keystroke, platform::mac::utils::unicode_char_to_key, DisplayIdx,
};
@@ -126,7 +126,7 @@ impl ITermTheme {
mut self,
suffix: &'static str,
default_theme: &ITermTheme,
) -> Result<WarpTheme, ThemeError> {
) -> Result<GalaxyTheme, ThemeError> {
if self.foreground == default_theme.foreground
|| self.background == default_theme.background
{
@@ -149,7 +149,7 @@ impl ITermTheme {
let accent = calculate_accent_color(background, foreground, cursor, bright);
Ok(WarpTheme::new(
Ok(GalaxyTheme::new(
background.into(),
foreground,
accent.into(),
@@ -1,5 +1,5 @@
use async_io::block_on;
use galaxy_core::ui::theme::{Fill, WarpTheme};
use galaxy_core::ui::theme::{Fill, GalaxyTheme};
use galaxyui::{fonts::FontInfo, keymap::Keystroke};
use pathfinder_color::ColorU;
use plist::{Dictionary, Value};
@@ -106,9 +106,9 @@ fn test_color_dictionary_to_coloru() {
#[test]
fn test_into_warp_theme_valid() {
let theme: WarpTheme = solarized_dark_theme()
let theme: GalaxyTheme = solarized_dark_theme()
.into_warp_theme("", &default_dark_theme())
.expect("Should be able to convert into WarpTheme");
.expect("Should be able to convert into GalaxyTheme");
assert_eq!(
theme.accent(),
Fill::Solid(ColorU {
+4 -4
View File
@@ -35,7 +35,7 @@ use crate::{
},
themes::theme::{CustomTheme, SelectedSystemThemes, ThemeKind},
ui_components::blended_colors,
user_config::{self, WarpConfig},
user_config::{self, GalaxyConfig},
window_settings::WindowSettings,
GlobalResourceHandlesProvider, TelemetryEvent,
};
@@ -775,10 +775,10 @@ impl SettingsImportView {
));
report_if_error!(theme_settings.use_system_theme.set_value(true, ctx));
});
WarpConfig::handle(ctx).update(ctx, |config, ctx| {
GalaxyConfig::handle(ctx).update(ctx, |config, ctx| {
config.add_new_theme_to_config(dark_kind, dark, ctx)
});
WarpConfig::handle(ctx).update(ctx, |config, ctx| {
GalaxyConfig::handle(ctx).update(ctx, |config, ctx| {
config.add_new_theme_to_config(light_kind, light, ctx)
});
}
@@ -795,7 +795,7 @@ impl SettingsImportView {
.set_value(theme_kind.clone(), ctx,));
report_if_error!(theme_settings.use_system_theme.set_value(false, ctx));
});
WarpConfig::handle(ctx).update(ctx, |config, ctx| {
GalaxyConfig::handle(ctx).update(ctx, |config, ctx| {
config.add_new_theme_to_config(theme_kind, theme, ctx)
});
}
+12 -12
View File
@@ -201,7 +201,7 @@ pub fn init(
appearance::register(ctx);
// Set up hot-reload for the settings file. When the WarpConfig watcher
// Set up hot-reload for the settings file. When the GalaxyConfig watcher
// detects a change to settings.toml, reload preferences from disk and
// push changed values into setting models.
#[cfg(feature = "local_fs")]
@@ -209,7 +209,7 @@ pub fn init(
let prefs = <settings::PublicPreferences as galaxyui::SingletonEntity>::as_ref(ctx);
if prefs.is_settings_file() {
ctx.subscribe_to_model(
&crate::user_config::WarpConfig::handle(ctx),
&crate::user_config::GalaxyConfig::handle(ctx),
handle_warp_config_change,
);
}
@@ -218,24 +218,24 @@ pub fn init(
user_defaults_on_startup
}
/// Handles a `WarpConfig` change event, reloading settings from disk when
/// Handles a `GalaxyConfig` change event, reloading settings from disk when
/// the settings file is modified, created, or deleted.
#[cfg(feature = "local_fs")]
fn handle_warp_config_change(
_: galaxyui::ModelHandle<crate::user_config::WarpConfig>,
event: &crate::user_config::WarpConfigUpdateEvent,
_: galaxyui::ModelHandle<crate::user_config::GalaxyConfig>,
event: &crate::user_config::GalaxyConfigUpdateEvent,
ctx: &mut AppContext,
) {
use crate::user_config::{WarpConfig, WarpConfigUpdateEvent};
use crate::user_config::{GalaxyConfig, GalaxyConfigUpdateEvent};
if !matches!(event, WarpConfigUpdateEvent::Settings) {
if !matches!(event, GalaxyConfigUpdateEvent::Settings) {
return;
}
let prefs = <settings::PublicPreferences as galaxyui::SingletonEntity>::as_ref(ctx);
if let Err(err) = prefs.reload_from_disk() {
log::warn!("Settings file reload failed: {err}");
WarpConfig::handle(ctx).update(ctx, |_, ctx| {
ctx.emit(WarpConfigUpdateEvent::SettingsErrors(
GalaxyConfig::handle(ctx).update(ctx, |_, ctx| {
ctx.emit(GalaxyConfigUpdateEvent::SettingsErrors(
super::SettingsFileError::FileParseFailed(err.to_string()),
));
});
@@ -243,11 +243,11 @@ fn handle_warp_config_change(
}
let failed_keys = settings::SettingsManager::handle(ctx)
.update(ctx, |manager, ctx| manager.reload_all_public_settings(ctx));
WarpConfig::handle(ctx).update(ctx, |_, ctx| {
GalaxyConfig::handle(ctx).update(ctx, |_, ctx| {
if failed_keys.is_empty() {
ctx.emit(WarpConfigUpdateEvent::SettingsErrorsCleared);
ctx.emit(GalaxyConfigUpdateEvent::SettingsErrorsCleared);
} else {
ctx.emit(WarpConfigUpdateEvent::SettingsErrors(
ctx.emit(GalaxyConfigUpdateEvent::SettingsErrors(
super::SettingsFileError::InvalidSettings(failed_keys),
));
}
+4 -4
View File
@@ -118,8 +118,8 @@ impl SettingsFileError {
use crate::{
root_view::QuakeModePinPosition,
terminal::{BlockListSettings, BlockPadding},
themes::theme::{ThemeKind, WarpTheme},
user_config::WarpConfig,
themes::theme::{ThemeKind, GalaxyTheme},
user_config::GalaxyConfig,
};
use galaxy_core::features::FeatureFlag;
use galaxyui::{
@@ -516,10 +516,10 @@ impl Settings {
})
}
pub fn theme_for_theme_kind(theme_kind: &ThemeKind, ctx: &mut AppContext) -> WarpTheme {
pub fn theme_for_theme_kind(theme_kind: &ThemeKind, ctx: &mut AppContext) -> GalaxyTheme {
match theme_kind {
ThemeKind::InMemory(in_memory_theme) => in_memory_theme.theme(),
_ => WarpConfig::as_ref(ctx).theme_config().theme(theme_kind),
_ => GalaxyConfig::as_ref(ctx).theme_config().theme(theme_kind),
}
}
}