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()),
}
}