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
+4 -4
View File
@@ -134,14 +134,14 @@ where
}
}
/// Refresh Warp Drive before executing an operation.
/// Refresh Galaxy Drive before executing an operation.
pub fn refresh_warp_drive(
ctx: &AppContext,
) -> impl Future<Output = anyhow::Result<()>> + Send + 'static {
UpdateManager::as_ref(ctx)
.initial_load_complete()
.with_timeout(WARP_DRIVE_SYNC_TIMEOUT)
.map_err(|_| anyhow::anyhow!("Timed out waiting for Warp Drive to sync"))
.map_err(|_| anyhow::anyhow!("Timed out waiting for Galaxy Drive to sync"))
}
/// Fetch the conversation's server metadata and validate that its harness matches the caller's
@@ -213,7 +213,7 @@ pub enum EnvironmentChoice {
impl EnvironmentChoice {
/// Resolve the environment to use when creating an agent integration.
/// Warp Drive *must* have been synced first.
/// Galaxy Drive *must* have been synced first.
pub fn resolve_for_create(
args: EnvironmentCreateArgs,
ctx: &AppContext,
@@ -279,7 +279,7 @@ Without an environment, the agent will not be able to access private repositorie
/// Resolve the environment to use when updating an agent integration. If the user did not
/// request any changes to the environment, this returns `Ok(None)`.
/// Warp Drive *must* have been synced first.
/// Galaxy Drive *must* have been synced first.
pub fn resolve_for_update(
args: EnvironmentUpdateArgs,
ctx: &AppContext,
+2 -2
View File
@@ -357,7 +357,7 @@ pub enum AgentDriverError {
#[error("Agent profile \"{0}\" not found")]
ProfileError(String),
#[error(
"Failed to authenticate with server - please log in via 'oz login', provide an API key via '--api-key <key>', or set the WARP_API_KEY environment variable"
"Failed to authenticate with server - please log in via 'oz login', provide an API key via '--api-key <key>', or set the GALAXY_API_KEY environment variable"
)]
NotLoggedIn,
#[error("Saved prompt not found for id {0}")]
@@ -369,7 +369,7 @@ pub enum AgentDriverError {
#[source]
error: terminal::ShareSessionError,
},
#[error("Error syncing Warp Drive")]
#[error("Error syncing Galaxy Drive")]
WarpDriveSyncFailed,
#[error("Requested environment not found: {0}")]
EnvironmentNotFound(String),
@@ -1,3 +1,4 @@
use crate::ai::agent::RenderableAIError;
use crate::ai::blocklist::task_status_sync_model::classify_renderable_error;
use crate::server::server_api::ai::TaskStatusUpdate;
use galaxy_graphql::ai::{AgentTaskState, PlatformErrorCode};
@@ -66,7 +67,7 @@ pub fn classify_driver_error(error: &AgentDriverError) -> (AgentTaskState, TaskS
AgentDriverError::WarpDriveSyncFailed => (
AgentTaskState::Error,
TaskStatusUpdate::with_error_code(
"Warp Drive failed to sync. Please check your network connection and try again.",
"Galaxy Drive failed to sync. Please check your network connection and try again.",
PlatformErrorCode::InternalError,
),
),
@@ -76,7 +77,7 @@ pub fn classify_driver_error(error: &AgentDriverError) -> (AgentTaskState, TaskS
AgentTaskState::Error,
TaskStatusUpdate::with_error_code(
format!(
"Authentication required. Log in via '{bin} login', provide an API key via '--api-key', or set the WARP_API_KEY environment variable."
"Authentication required. Log in via '{bin} login', provide an API key via '--api-key', or set the GALAXY_API_KEY environment variable."
),
PlatformErrorCode::AuthenticationRequired,
),
@@ -95,7 +96,7 @@ pub fn classify_driver_error(error: &AgentDriverError) -> (AgentTaskState, TaskS
AgentTaskState::Failed,
TaskStatusUpdate::with_error_code(
format!(
"MCP server {uuid} was not found. Verify the server exists in your Warp Drive and the UUID is correct."
"MCP server {uuid} was not found. Verify the server exists in your Galaxy Drive and the UUID is correct."
),
PlatformErrorCode::EnvironmentSetupFailed,
),
@@ -125,7 +126,7 @@ pub fn classify_driver_error(error: &AgentDriverError) -> (AgentTaskState, TaskS
AgentTaskState::Failed,
TaskStatusUpdate::with_error_code(
format!(
"Agent profile \"{name}\" not found. Check the profile ID and ensure it exists in your team's Warp Drive."
"Agent profile \"{name}\" not found. Check the profile ID and ensure it exists in your team's Galaxy Drive."
),
PlatformErrorCode::ResourceNotFound,
),
@@ -134,7 +135,7 @@ pub fn classify_driver_error(error: &AgentDriverError) -> (AgentTaskState, TaskS
AgentTaskState::Failed,
TaskStatusUpdate::with_error_code(
format!(
"Saved prompt not found for ID {id}. Verify the prompt exists in your Warp Drive."
"Saved prompt not found for ID {id}. Verify the prompt exists in your Galaxy Drive."
),
PlatformErrorCode::ResourceNotFound,
),
@@ -302,6 +303,31 @@ pub fn classify_driver_error(error: &AgentDriverError) -> (AgentTaskState, TaskS
}
}
/// Returns true if an `AgentDriverError` represents a transient condition that
/// a subagent can recover from by retrying (e.g., network issues, rate limits,
/// server overload). Permanent errors (auth, config, cancelled) return false.
pub fn is_self_recoverable(error: &AgentDriverError) -> bool {
match error {
AgentDriverError::ConversationError { error: renderable } => {
matches!(
renderable,
RenderableAIError::ServerOverloaded
| RenderableAIError::Other {
will_attempt_resume: true,
..
}
)
}
AgentDriverError::WarpDriveSyncFailed
| AgentDriverError::TeamMetadataRefreshTimeout
| AgentDriverError::ShareSessionFailed {
error: ShareSessionError::Timeout,
..
} => true,
_ => false,
}
}
#[cfg(test)]
#[path = "error_classification_tests.rs"]
mod tests;
+5 -5
View File
@@ -194,7 +194,7 @@ impl EnvironmentCommandRunner {
ctx.spawn(initial_sync, move |_, result, ctx| {
if result.is_err() {
super::report_fatal_error(
anyhow::anyhow!("Timed out waiting for Warp Drive to sync"),
anyhow::anyhow!("Timed out waiting for Galaxy Drive to sync"),
ctx,
);
return;
@@ -265,7 +265,7 @@ impl EnvironmentCommandRunner {
ctx.spawn(initial_sync, move |_, result, ctx| {
if result.is_err() {
super::report_fatal_error(
anyhow::anyhow!("Timed out waiting for Warp Drive to sync"),
anyhow::anyhow!("Timed out waiting for Galaxy Drive to sync"),
ctx,
);
return;
@@ -474,7 +474,7 @@ impl EnvironmentCommandRunner {
ctx.spawn(initial_sync, move |_, result, ctx| {
if result.is_err() {
super::report_fatal_error(
anyhow::anyhow!("Timed out waiting for Warp Drive to sync"),
anyhow::anyhow!("Timed out waiting for Galaxy Drive to sync"),
ctx,
);
return;
@@ -856,7 +856,7 @@ impl EnvironmentCommandRunner {
ctx.spawn(initial_sync, move |_, result, ctx| {
if result.is_err() {
super::report_fatal_error(
anyhow::anyhow!("Timed out waiting for Warp Drive to sync"),
anyhow::anyhow!("Timed out waiting for Galaxy Drive to sync"),
ctx,
);
return;
@@ -1035,7 +1035,7 @@ impl EnvironmentCommandRunner {
ctx.spawn(initial_sync, move |_, result, ctx| {
if result.is_err() {
super::report_fatal_error(
anyhow::anyhow!("Timed out waiting for Warp Drive to sync"),
anyhow::anyhow!("Timed out waiting for Galaxy Drive to sync"),
ctx,
);
return;
+3 -3
View File
@@ -175,7 +175,7 @@ fn dispatch_command(
schedule::run(ctx, global_options, schedule_cmd)
}
CliCommand::Secret(secret_cmd) => {
if !FeatureFlag::WarpManagedSecrets.is_enabled() {
if !FeatureFlag::GalaxyManagedSecrets.is_enabled() {
return Err(anyhow::anyhow!("invalid value 'secret'"));
}
secret::run(ctx, global_options, secret_cmd)
@@ -547,7 +547,7 @@ impl AgentDriverRunner {
// Ensure we've synced team state before starting the driver.
Self::refresh_team_metadata(&foreground).await?;
// Wait for Warp Drive to sync before building the task config, since
// Wait for Galaxy Drive to sync before building the task config, since
// prompt resolution (SavedPrompt -> workflow lookup) and environment
// resolution (CloudAmbientAgentEnvironment lookup) depend on it.
if foreground
@@ -1328,7 +1328,7 @@ fn launch_command(
dispatched = true;
let auth_state = AuthStateProvider::handle(ctx).as_ref(ctx).get();
let message = if auth_state.is_api_key_authenticated() {
"Your API key is invalid. Please provide a valid key via '--api-key' or the WARP_API_KEY environment variable.".to_string()
"Your API key is invalid. Please provide a valid key via '--api-key' or the GALAXY_API_KEY environment variable.".to_string()
} else {
format!("Your credentials are invalid. Please log in again with `{cli_name} login`.")
};
+1 -1
View File
@@ -72,7 +72,7 @@ pub fn run(
global_options: GlobalOptions,
command: SecretCommand,
) -> Result<()> {
if !FeatureFlag::WarpManagedSecrets.is_enabled() {
if !FeatureFlag::GalaxyManagedSecrets.is_enabled() {
return Err(anyhow::anyhow!("This feature is not enabled"));
}