use anyhow::Result; use codex_protocol::ConversationId; use codex_protocol::protocol::SessionMeta; use codex_protocol::protocol::SessionSource; use serde_json::json; use std::fs; use std::path::Path; use std::path::PathBuf; use uuid::Uuid; /// Create a minimal rollout file under `CODEX_HOME/sessions/YYYY/MM/DD/`. /// /// - `filename_ts` is the filename timestamp component in `YYYY-MM-DDThh-mm-ss` format. /// - `meta_rfc3339` is the envelope timestamp used in JSON lines. /// - `preview` is the user message preview text. /// - `model_provider` optionally sets the provider in the session meta payload. /// /// Returns the generated conversation/session UUID as a string. pub fn create_fake_rollout( codex_home: &Path, filename_ts: &str, meta_rfc3339: &str, preview: &str, model_provider: Option<&str>, ) -> Result { let uuid = Uuid::new_v4(); let uuid_str = uuid.to_string(); let conversation_id = ConversationId::from_string(&uuid_str)?; // sessions/YYYY/MM/DD derived from filename_ts (YYYY-MM-DDThh-mm-ss) let year = &filename_ts[0..4]; let month = &filename_ts[5..7]; let day = &filename_ts[8..10]; let dir = codex_home.join("sessions").join(year).join(month).join(day); fs::create_dir_all(&dir)?; let file_path = dir.join(format!("rollout-{filename_ts}-{uuid}.jsonl")); // Build JSONL lines let payload = serde_json::to_value(SessionMeta { id: conversation_id, timestamp: meta_rfc3339.to_string(), cwd: PathBuf::from("/"), originator: "codex".to_string(), cli_version: "0.0.0".to_string(), instructions: None, source: SessionSource::Cli, model_provider: model_provider.map(str::to_string), })?; let lines = [ json!({ "timestamp": meta_rfc3339, "type": "session_meta", "payload": payload }) .to_string(), json!({ "timestamp": meta_rfc3339, "type":"response_item", "payload": { "type":"message", "role":"user", "content":[{"type":"input_text","text": preview}] } }) .to_string(), json!({ "timestamp": meta_rfc3339, "type":"event_msg", "payload": { "type":"user_message", "message": preview, "kind": "plain" } }) .to_string(), ]; fs::write(file_path, lines.join("\n") + "\n")?; Ok(uuid_str) }