use crate::core::session::Session;
use anyhow::{Context, Result};
use serde::Deserialize;
use serde_json::json;
#[derive(Debug, Deserialize, Default)]
struct CompressPayload {
#[serde(default)]
session_id: Option<String>,
#[serde(default, rename = "sessionId")]
session_id_camel: Option<String>,
}
pub fn handle(stdin_payload: &str) -> Result<String> {
if std::env::var_os("DRIP_DISABLE").is_some() {
return Ok(empty());
}
if let Err(e) = drop_baselines(stdin_payload) {
eprintln!("drip: gemini-compress handler failed: {e:#}");
}
Ok(empty())
}
fn drop_baselines(stdin_payload: &str) -> Result<()> {
let p: CompressPayload = if stdin_payload.trim().is_empty() {
CompressPayload::default()
} else {
serde_json::from_str(stdin_payload).context("Gemini compress payload malformed")?
};
let session = match p
.session_id
.or(p.session_id_camel)
.filter(|s| !s.is_empty())
{
Some(id) => Session::open_with_id(id)?,
None => Session::open()?,
};
session.reset_for_compaction()?;
Ok(())
}
fn empty() -> String {
json!({}).to_string()
}