remem-ai 0.3.8

Persistent memory for Claude Code — single binary, zero subprocesses
Documentation
use serde::Deserialize;

use crate::adapter::ParsedHookEvent;
use crate::db;

#[derive(Debug, Deserialize)]
struct HookInput {
    session_id: Option<String>,
    cwd: Option<String>,
    tool_name: Option<String>,
    tool_input: Option<serde_json::Value>,
    tool_response: Option<serde_json::Value>,
}

pub(super) fn parse_hook(raw_json: &str) -> Option<ParsedHookEvent> {
    let hook: HookInput = serde_json::from_str(raw_json).ok()?;
    let session_id = hook.session_id?;
    let cwd = hook.cwd;
    let project = db::project_from_cwd(cwd.as_deref().unwrap_or("."));
    Some(ParsedHookEvent {
        session_id,
        cwd,
        project,
        tool_name: hook.tool_name.unwrap_or_else(|| "unknown".into()),
        tool_input: hook.tool_input,
        tool_response: hook.tool_response,
    })
}