Codex Handbook
core/src/tasks/compact.rs 66 lines
use std::sync::Arc;use super::SessionTask;use super::SessionTaskContext;use super::emit_compact_metric;use crate::session::TurnInput;use crate::session::turn_context::TurnContext;use crate::state::TaskKind;use codex_protocol::user_input::UserInput;use tokio_util::sync::CancellationToken;#[derive(Clone, Copy, Default)]pub(crate) struct CompactTask;impl SessionTask for CompactTask {    fn kind(&self) -> TaskKind {        TaskKind::Compact    }    fn span_name(&self) -> &'static str {        "session_task.compact"    }    async fn run(        self: Arc<Self>,        session: Arc<SessionTaskContext>,        ctx: Arc<TurnContext>,        _input: Vec<TurnInput>,        _cancellation_token: CancellationToken,    ) -> Option<String> {        let session = session.clone_session();        let _ = if crate::compact::should_use_remote_compact_task(ctx.provider.info()) {            if ctx                .features                .enabled(codex_features::Feature::RemoteCompactionV2)            {                emit_compact_metric(                    &session.services.session_telemetry,                    "remote_v2",                    /*manual*/ true,                );                crate::compact_remote_v2::run_remote_compact_task(session.clone(), ctx).await            } else {                emit_compact_metric(                    &session.services.session_telemetry,                    "remote",                    /*manual*/ true,                );                crate::compact_remote::run_remote_compact_task(session.clone(), ctx).await            }        } else {            emit_compact_metric(                &session.services.session_telemetry,                "local",                /*manual*/ true,            );            let input = vec![UserInput::Text {                text: ctx.compact_prompt().to_string(),                // Compaction prompt is synthesized; no UI element ranges to preserve.                text_elements: Vec::new(),            }];            crate::compact::run_compact_task(session.clone(), ctx, input).await        };        None    }}