use crate::ui::slash::CompactionRequest;
pub(crate) enum CompactionThen {
Nothing,
SendPrompt {
run_prompt: String,
record_text: String,
},
RetryAfterOverflow {
prompt: String,
tools_already_ran: bool,
},
}
pub(crate) enum CompactionPhaseEvent {
Done { summary: String },
Failed { error: String },
}
pub(crate) struct CompactionPhaseHandle {
pub rx: tokio::sync::mpsc::Receiver<CompactionPhaseEvent>,
pub task: tokio::task::JoinHandle<()>,
pub cut_idx: usize,
pub tokens_before: u64,
pub then: CompactionThen,
}
pub(crate) fn spawn(req: CompactionRequest, then: CompactionThen) -> CompactionPhaseHandle {
let CompactionRequest {
model,
prompt,
cut_idx,
tokens_before,
} = req;
let (tx, rx) = tokio::sync::mpsc::channel::<CompactionPhaseEvent>(1);
let task = tokio::spawn(async move {
let event = match crate::provider::run_compaction(model, prompt).await {
Ok(summary) => CompactionPhaseEvent::Done { summary },
Err(e) => CompactionPhaseEvent::Failed {
error: e.to_string(),
},
};
let _ = tx.send(event).await;
});
CompactionPhaseHandle {
rx,
task,
cut_idx,
tokens_before,
then,
}
}