magi-code 0.77.1

Repository-aware CLI coding agent for terminal work
Documentation
use super::ShellState;

pub(super) fn handle_compact_builtin(
    arg: Option<&str>,
    state: &mut ShellState,
) -> anyhow::Result<String> {
    let Some(session) = state.current_session.clone() else {
        anyhow::bail!(
            "/compact requires an active persisted session; start without --no-session or run /new"
        )
    };
    let mut active_config = state
        .config
        .clone()
        .ok_or_else(|| anyhow::anyhow!("/compact requires loaded runtime config"))?;
    active_config.model = Some(state.model.clone());
    let settings = crate::config::read_settings(&active_config.paths)?;
    if let Some(auth_state) = crate::compaction::refresh_active_auth_for_compaction_if_inherited(
        &mut active_config,
        &settings,
        &state.auth_state,
    )? {
        state.auth_state = auth_state;
    }
    if let Some(config) = &mut state.config {
        config.auth = active_config.auth.clone();
        config.model = active_config.model.clone();
    }
    let result = crate::compaction::compact_session(crate::compaction::CompactSessionJob {
        active_config,
        settings,
        session,
        cwd: state.cwd.clone(),
        cancellation: crate::cancellation::AgentCancellation::default(),
        custom_instructions: arg.map(str::to_string),
        additional_instructions: None,
    })?;
    match result {
        Some(result) => {
            let mut message = crate::compaction::compaction_success_message(&result);
            if let Some(warning) = result.rotation_warning.as_deref() {
                message.push('\n');
                message.push_str(warning);
            }
            if let Some(requested_service_tier) = result.requested_service_tier.as_deref() {
                let prompt_order = state.next_prompt_order();
                let observation = crate::fast::FastObservation {
                    requested_service_tier: requested_service_tier.to_string(),
                    outcome: result.fast_outcome.clone(),
                    request_sequence: 1,
                    run_order: None,
                };
                state.accept_fast_observation(
                    &result.provider,
                    &result.model,
                    requested_service_tier,
                    &result.fast_outcome,
                    prompt_order,
                    observation.request_sequence,
                );
                if let Some(warning) = crate::fast::fast_observation_warning(
                    &result.provider,
                    &result.model,
                    &observation,
                ) {
                    message.push('\n');
                    message.push_str(&warning);
                }
            }
            Ok(message)
        }
        None => Ok("compaction produced empty summary; no checkpoint was written".to_string()),
    }
}