///|
/// Create a secure supply chain manifest and compute its Merkle root directly from memory buffers.
pub fn create_manifest(
  name : String,
  version : String,
  entries : Array[(String, Bytes)],
) -> @manifest.Manifest {
  let files : Array[@manifest.FileSnapshot] = []
  for i = 0; i < entries.length(); i = i + 1 {
    let (path, data) = entries[i]
    files.push(@manifest.FileSnapshot::from_bytes(path, data))
  }
  @manifest.Manifest::new(name, version, "2026-07-08T12:00:00Z", files)
}

///|
/// Compute SHA-256 hex digest for any byte array.
pub fn sha256_hex(data : Bytes) -> String {
  @digest.sha256_hex(data)
}

///|
/// Compute XXHash64 content fingerprint for any byte array.
pub fn xxhash64(data : Bytes) -> UInt64 {
  @digest.xxhash64(data)
}

///|
/// Encode bytes to Base64 (or Base64URL).
pub fn to_base64(data : Bytes, url_safe? : Bool = false) -> String {
  @codec.to_base64(data, url_safe~)
}

///|
/// Decode Base64 string to bytes.
pub fn from_base64(s : String) -> Result[Bytes, String] {
  @codec.from_base64(s)
}

///|
/// Construct a Merkle tree directly from leaf bytes.
pub fn make_merkle_tree(leaves : Array[Bytes]) -> @merkle.MerkleTree {
  @merkle.MerkleTree::new(leaves)
}

///|
/// Audit a manifest with the default path, hash, duplicate, and root checks.
pub fn audit_manifest(manifest : @manifest.Manifest) -> @manifest.AuditReport {
  manifest.audit()
}

///|
/// Audit dependency provenance and licenses using an explicit policy.
pub fn audit_dependencies(
  dependencies : Array[@manifest.Dependency],
  policy : @manifest.LicensePolicy,
) -> @manifest.DependencyAudit {
  @manifest.audit_dependencies(dependencies, policy)
}