lllv_core/
manifest.rs

1//! Capsule manifest struct and sealing helper for signed facts.
2use crate::errors::LllvError;
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct CapsuleManifest {
7    pub vector_id: String,
8    pub source_uri: String,
9    pub mime: String,
10    pub content_hash: String, // blake3 do conteúdo de origem (não a cápsula)
11    pub dim: u16,
12    pub quant: String,      // ex.: "q8"
13    pub encoder: String,    // ex.: "text-embedding-3-large"
14    pub policy_ref: String, // ex.: "tdln://policy/default"
15    pub ts_ingest: String,  // ISO8601
16}
17
18impl CapsuleManifest {
19    #[must_use]
20    pub fn minimal(id: &str, mime: &str, dim: u16, quant: &str) -> Self {
21        Self {
22            vector_id: id.into(),
23            source_uri: String::new(),
24            mime: mime.into(),
25            content_hash: String::new(),
26            dim,
27            quant: quant.into(),
28            encoder: String::new(),
29            policy_ref: String::new(),
30            ts_ingest: String::new(),
31        }
32    }
33}
34
35#[cfg(feature = "manifest")]
36/// Sela um `CapsuleManifest` em um `SignedFact`.
37///
38/// # Errors
39///
40/// - `LllvError::Serde` se a selagem falhar
41pub fn seal_manifest(
42    mf: &CapsuleManifest,
43    sk: &ed25519_dalek::SigningKey,
44) -> Result<json_atomic::SignedFact, LllvError> {
45    use json_atomic::seal_value;
46    seal_value(mf, sk).map_err(|_| LllvError::Serde("seal".into()))
47}