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:
co-authored by
Claude Opus 4.6
parent
eaa2ddc75e
commit
6f54e2cb30
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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`.")
|
||||
};
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user