use std::path::PathBuf;
use std::sync::Arc;
use relayburn_sdk::{ingest_codex_sessions, Ledger, LedgerOpenOptions, RawIngestOptions};
use super::pending_stamp::{self, IngestSessionsFn, PendingStampAdapter};
use super::HarnessAdapter;
fn codex_sessions_dir() -> PathBuf {
let home = std::env::var_os("HOME")
.map(PathBuf::from)
.unwrap_or_else(|| PathBuf::from("."));
home.join(".codex").join("sessions")
}
pub fn config() -> PendingStampAdapter {
let session_root: Arc<dyn Fn() -> PathBuf + Send + Sync> = Arc::new(codex_sessions_dir);
let ingest_sessions: IngestSessionsFn = Arc::new(|ledger_home| {
Box::pin(async move {
let ledger_opts = match ledger_home.as_deref() {
Some(home) => LedgerOpenOptions::with_home(home),
None => LedgerOpenOptions::default(),
};
let mut handle = Ledger::open(ledger_opts)?;
let opts = RawIngestOptions {
ledger_home,
..RawIngestOptions::default()
};
ingest_codex_sessions(handle.raw_mut(), &opts).await
})
});
PendingStampAdapter::new("codex", session_root, ingest_sessions)
}
pub fn adapter() -> &'static dyn HarnessAdapter {
pending_stamp::adapter_static(config())
}
#[cfg(test)]
mod tests {
use super::*;
use crate::harnesses::test_env::with_test_home;
#[test]
fn config_has_codex_name() {
let cfg = config();
assert_eq!(cfg.name, "codex");
with_test_home("/tmp/burn-codex-test-home", || {
let resolved = (cfg.session_root)();
assert_eq!(
resolved,
PathBuf::from("/tmp/burn-codex-test-home/.codex/sessions")
);
});
}
#[test]
fn adapter_round_trip() {
let a: &'static dyn HarnessAdapter = adapter();
assert_eq!(a.name(), "codex");
with_test_home("/tmp/burn-codex-test-home", || {
assert_eq!(
a.session_root(),
PathBuf::from("/tmp/burn-codex-test-home/.codex/sessions")
);
});
}
}