//! Tipos núcleo de hammer, compartidos por el lab, la CLI y el daemon.
//!
//! Ver `docs/01-architecture.md` y siguientes. Esto es el esqueleto de Fase 0: los tipos y
//! contratos están definidos; la lógica pesada (sandbox, fanotify, bus) vive en los otros
//! crates y se irá rellenando por fase.

pub mod apply;
pub mod caps;
pub mod compat;
pub mod differs;
pub mod hash;
pub mod installed;
pub mod proto;
pub mod query;
pub mod recipe;
pub mod repo;
pub mod sign;
pub mod store;
pub mod swm;

pub use caps::{AgentCapsConfig, CapRule};
pub use differs::{why_differs, Causa, Divergencia, Informe};
pub use hash::ArtifactHash;
pub use installed::{InstalledDb, InstalledPackage};
pub use compat::Veredicto as CompatVeredicto;
pub use recipe::{
    CheckOutcome, Compiler, Deps, Evidence, EvidenceCheck, EvidenceKind, LinkMode, Phases, Recipe,
    Slots, Source, SourceKind,
};
pub use repo::{PackageEntry, RepoIndex};
pub use sign::{KeyPair, SigStatus, TrustStore};
pub use store::Store;
pub use swm::{Base, BaseCompat, BaseRef, Mutation, PinDiff, Signature, Swm, SwmBuild};

/// Error común del ecosistema hammer.
#[derive(Debug, thiserror::Error)]
pub enum Error {
    #[error("io: {0}")]
    Io(#[from] std::io::Error),
    #[error("serialización: {0}")]
    Serde(String),
    #[error("receta inválida: {0}")]
    Recipe(String),
    #[error("store: {0}")]
    Store(String),
    #[error(transparent)]
    Other(#[from] anyhow::Error),
}

pub type Result<T> = std::result::Result<T, Error>;
