tandem-server 0.6.8

HTTP server for Tandem engine APIs
use axum::http::StatusCode;
use tandem_types::TenantContext;

use crate::governance_store::{self, GovernanceStoreFile};
use crate::AppState;

pub(crate) async fn append_memory_audit(
    state: &AppState,
    tenant_context: &TenantContext,
    mut event: crate::MemoryAuditEvent,
) -> Result<(), StatusCode> {
    event.tenant_context = tenant_context.clone();
    let line = serde_json::to_string(&event).map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
    governance_store::for_state(state)
        .append_jsonl_line(GovernanceStoreFile::MemoryAudit, &line, true)
        .await
        .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
    let mut audit = state.memory_audit_log.write().await;
    audit.push(event);
    Ok(())
}

pub(crate) async fn load_memory_audit_events(state: &AppState) -> Vec<crate::MemoryAuditEvent> {
    let Ok(Some(lines)) = governance_store::for_state(state)
        .read_jsonl_lines(GovernanceStoreFile::MemoryAudit)
        .await
    else {
        return Vec::new();
    };

    lines
        .iter()
        .filter_map(|line| serde_json::from_str::<crate::MemoryAuditEvent>(line.trim()).ok())
        .collect()
}