This repository has been archived on 2026-10-29. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
Epiphany/epiphany-codex-bridge/src/state.rs
2026-05-19 15:24:57 +01:00

53 lines
1.6 KiB
Rust

use std::fs;
use std::path::Path;
use std::path::PathBuf;
use epiphany_core::write_thread_state;
use epiphany_state_model::EpiphanyThreadState;
use tracing::warn;
use crate::retrieve::epiphany_retrieval_state_for_paths;
pub async fn client_visible_epiphany_state_for_paths(
mut state: EpiphanyThreadState,
workspace_root: &Path,
codex_home: PathBuf,
mirror_thread_id: Option<&str>,
) -> EpiphanyThreadState {
if state.retrieval.is_none() {
state.retrieval = Some(
epiphany_retrieval_state_for_paths(workspace_root.to_path_buf(), codex_home).await,
);
}
if let Some(thread_id) = mirror_thread_id
&& let Err(err) = mirror_thread_state_to_workspace(workspace_root, thread_id, &state)
{
warn!("failed to mirror Epiphany thread state into native store: {err}");
}
state
}
pub fn thread_state_store_path(workspace_root: &Path) -> PathBuf {
workspace_root.join("state").join("thread-state.msgpack")
}
pub fn mirror_thread_state_to_workspace(
workspace_root: &Path,
thread_id: &str,
state: &EpiphanyThreadState,
) -> anyhow::Result<PathBuf> {
let store_path = thread_state_store_path(workspace_root);
if let Some(parent) = store_path.parent() {
fs::create_dir_all(parent)?;
}
write_thread_state(&store_path, thread_id, state)?;
Ok(store_path)
}
pub fn thread_state_mirror_id_from_rollout_path(rollout_path: Option<&Path>) -> String {
rollout_path
.and_then(|path| path.file_stem())
.and_then(|stem| stem.to_str())
.map(str::to_string)
.unwrap_or_else(|| "live-thread".to_string())
}