use crate::auth::SharedAuthProvider; use crate::common::CompactionInput; use crate::endpoint::session::EndpointSession; use crate::error::ApiError; use crate::provider::Provider; use codex_client::HttpTransport; use codex_client::RequestTelemetry; use codex_protocol::models::ResponseItem; use http::HeaderMap; use http::Method; use serde::Deserialize; use serde_json::to_value; use std::sync::Arc; pub struct CompactClient { session: EndpointSession, } impl CompactClient { pub fn new(transport: T, provider: Provider, auth: SharedAuthProvider) -> Self { Self { session: EndpointSession::new(transport, provider, auth), } } pub fn with_telemetry(self, request: Option>) -> Self { Self { session: self.session.with_request_telemetry(request), } } fn path() -> &'static str { "responses/compact" } pub async fn compact( &self, body: serde_json::Value, extra_headers: HeaderMap, ) -> Result, ApiError> { let resp = self .session .execute(Method::POST, Self::path(), extra_headers, Some(body)) .await?; let parsed: CompactHistoryResponse = serde_json::from_slice(&resp.body).map_err(|e| ApiError::Stream(e.to_string()))?; Ok(parsed.output) } pub async fn compact_input( &self, input: &CompactionInput<'_>, extra_headers: HeaderMap, ) -> Result, ApiError> { let body = to_value(input) .map_err(|e| ApiError::Stream(format!("failed to encode compaction input: {e}")))?; self.compact(body, extra_headers).await } } #[derive(Debug, Deserialize)] struct CompactHistoryResponse { output: Vec, } #[cfg(test)] mod tests { use super::*; use async_trait::async_trait; use codex_client::Request; use codex_client::Response; use codex_client::StreamResponse; use codex_client::TransportError; #[derive(Clone, Default)] struct DummyTransport; #[async_trait] impl HttpTransport for DummyTransport { async fn execute(&self, _req: Request) -> Result { Err(TransportError::Build("execute should not run".to_string())) } async fn stream(&self, _req: Request) -> Result { Err(TransportError::Build("stream should not run".to_string())) } } #[test] fn path_is_responses_compact() { assert_eq!(CompactClient::::path(), "responses/compact"); } }