supercode-interchange 0.4.6

Canonical, provider-neutral session interchange primitives for Supercode
Documentation
//! Read-only support for Supercode's own persisted session family.

use std::path::Path;

use crate::{Result, Session};

/// Load a Supercode-native session family when `path` has a matching metadata
/// file. Returns `None` when the path belongs to a foreign harness.
#[doc(hidden)]
pub fn load_native_store_family(path: &Path) -> Result<Option<Session>> {
    let Some(name) = path.file_stem().and_then(|value| value.to_str()) else {
        return Ok(None);
    };
    let Some(parent) = path.parent() else {
        return Ok(None);
    };
    if !parent.join(format!("{name}.meta.json")).is_file() {
        return Ok(None);
    }
    let sidecar = parent.join(format!("{name}.sidecar.jsonl"));
    let mut session = if sidecar.is_file() {
        Session::from_sidecar_str(&std::fs::read_to_string(sidecar)?)?
    } else {
        let text = std::fs::read_to_string(path)?;
        let messages = text
            .lines()
            .filter(|line| !line.trim().is_empty())
            .map(serde_json::from_str)
            .collect::<std::result::Result<Vec<_>, _>>()?;
        Session::from_native_messages(messages)
    };
    session.meta.session_id = Some(name.to_string());
    Ok(Some(session))
}