carryctx 0.3.0

Persistent project context for coding agents
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct GraphNode {
    pub id: String,
    pub node_type: String,
    pub name: String,
    pub description: Option<String>,
    pub metadata: serde_json::Value,
    pub created_at: String,
    pub updated_at: String,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct GraphEdge {
    pub source_id: String,
    pub target_id: String,
    pub relation_type: String,
    pub created_at: String,
    pub created_by: Option<String>,
    pub metadata: serde_json::Value,
}

impl GraphNode {
    pub fn new(
        id: impl Into<String>,
        node_type: impl Into<String>,
        name: impl Into<String>,
        description: Option<String>,
        metadata: serde_json::Value,
        created_at: impl Into<String>,
    ) -> Self {
        let created_at = created_at.into();
        Self {
            id: id.into(),
            node_type: node_type.into(),
            name: name.into(),
            description,
            metadata,
            updated_at: created_at.clone(),
            created_at,
        }
    }
}

impl GraphEdge {
    pub fn new(
        source_id: impl Into<String>,
        target_id: impl Into<String>,
        relation_type: impl Into<String>,
        created_at: impl Into<String>,
        created_by: Option<String>,
        metadata: serde_json::Value,
    ) -> Self {
        Self {
            source_id: source_id.into(),
            target_id: target_id.into(),
            relation_type: relation_type.into(),
            created_at: created_at.into(),
            created_by,
            metadata,
        }
    }
}