kiromi-ai-memory 0.2.2

Local-first multi-tenant memory store engine: Markdown/text content on object storage, metadata in SQLite, plugin-shaped embedder/storage/metadata, hybrid text+vector search.
Documentation
// SPDX-License-Identifier: Apache-2.0 OR MIT
//! Audit-log op tags.

use serde::{Deserialize, Serialize};

/// Audit-log op tag. New variants land non-breakingly thanks to `#[non_exhaustive]`.
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum AuditOp {
    /// `Memory::append`.
    Append,
    /// `Memory::delete`.
    Delete,
    /// `Memory::delete_partition`.
    DeletePartition,
    /// `Memory::add_link`.
    LinkAdd,
    /// `Memory::remove_link`.
    LinkRemove,
    /// Reserved for Plan 3.
    IndexCheckpoint,
    /// `Memory::attach_summary` — Plan 9 first-class summary entity attached.
    SummaryAttach,
    /// `Memory::delete_summary` — Plan 9 summary tombstoned.
    SummaryDelete,
    /// `Memory::set_attribute` (or `AppendOpts::with_attribute`) — Plan 11
    /// typed memory metadata assigned.
    AttributeSet,
    /// `Memory::clear_attribute` — Plan 11 typed memory metadata removed.
    AttributeClear,
    /// `Memory::snapshot` — Plan 12 point-in-time freeze recorded.
    Snapshot,
    /// `Memory::delete_snapshot` — Plan 12 snapshot row removed (manifest
    /// blob reaped by `gc()` only).
    SnapshotDelete,
    /// `Memory::restore` — Plan 12 hard rollback to a snapshot.
    Restore,
    /// `Memory::regenerate_embeddings` — Plan 12 atomic shard swap on
    /// embedder change.
    RegenerateEmbeddings,
    /// `Memory::migrate_scheme` — Plan 12 partition scheme evolution
    /// (memories + indices moved).
    MigrateScheme,
    /// `Memory::gc` — Plan 12 orphan-blob retention sweep.
    Gc,
    /// `Memory::set_validity` — Plan 15 bi-temporal validity update.
    ValiditySet,
    /// Plan 16: `Memory::summary_set_attribute` — typed attribute on a
    /// summary row was upserted.
    SummaryAttributeSet,
    /// Plan 16: `Memory::summary_clear_attribute` — typed attribute on a
    /// summary row was removed.
    SummaryAttributeClear,
    /// Plan 16: `Memory::link/unlink` — generalized node↔node link
    /// added or removed.
    NodeLinkAdd,
    /// Plan 16: `Memory::unlink` — generalized node↔node link removed.
    NodeLinkRemove,
    /// Plan 16: `Memory::evolve` — single-transaction batch update of
    /// the memory catalog. The audit row's detail JSON carries the
    /// serialised [`crate::evolve::EvolutionOps`].
    Evolve,
}

impl AuditOp {
    /// String tag persisted in `audit_log.op`.
    #[must_use]
    pub const fn as_str(self) -> &'static str {
        match self {
            AuditOp::Append => "append",
            AuditOp::Delete => "delete",
            AuditOp::DeletePartition => "delete_partition",
            AuditOp::LinkAdd => "link_add",
            AuditOp::LinkRemove => "link_remove",
            AuditOp::IndexCheckpoint => "index_checkpoint",
            AuditOp::SummaryAttach => "summary_attach",
            AuditOp::SummaryDelete => "summary_delete",
            AuditOp::AttributeSet => "attribute_set",
            AuditOp::AttributeClear => "attribute_clear",
            AuditOp::Snapshot => "snapshot",
            AuditOp::SnapshotDelete => "snapshot_delete",
            AuditOp::Restore => "restore",
            AuditOp::RegenerateEmbeddings => "regenerate_embeddings",
            AuditOp::MigrateScheme => "migrate_scheme",
            AuditOp::Gc => "gc",
            AuditOp::ValiditySet => "validity_set",
            AuditOp::SummaryAttributeSet => "summary_attribute_set",
            AuditOp::SummaryAttributeClear => "summary_attribute_clear",
            AuditOp::NodeLinkAdd => "node_link_add",
            AuditOp::NodeLinkRemove => "node_link_remove",
            AuditOp::Evolve => "evolve",
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn tags_are_lowercase_snake() {
        assert_eq!(AuditOp::Append.as_str(), "append");
        assert_eq!(AuditOp::DeletePartition.as_str(), "delete_partition");
    }
}