agent-diva-files
内容寻址存储模块 — 为 Agent Diva 提供文件管理能力
特性
- 内容寻址:SHA256 哈希去重,相同内容只存一份
- 引用计数:安全生命周期管理,ref_count=0 才真正删除
- Hook 系统:存储/读取/清理各阶段可注入自定义逻辑
- 软删除:Steam 风格回收站,支持恢复和自动清理
- Channel 隔离:逻辑隔离文件,可属于多个 Channel
快速开始
环境要求
构建
cargo build
cargo build --release
运行测试
cargo test
cargo test test_store_and_get
cargo test -- --nocapture
代码检查
cargo fmt -- --check
cargo fmt
cargo clippy -- -D warnings
完整 CI 检查
cargo fmt
cargo clippy -- -D warnings
cargo test
使用示例
use agent_diva_files::{FileManager, FileConfig, FileMetadata};
use std::path::PathBuf;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = FileConfig::with_path(PathBuf::from("./data"));
let manager = FileManager::new(config).await?;
let data = b"Hello, World!";
let metadata = FileMetadata {
name: "hello.txt".to_string(),
size: data.len() as u64,
mime_type: Some("text/plain".to_string()),
source: Some("example".to_string()),
created_at: chrono::Utc::now(),
last_accessed_at: None,
preview: None,
};
let handle = manager.store(data, metadata).await?;
println!("Stored: {}", handle.id);
let content = manager.read(&handle).await?;
println!("Content: {}", String::from_utf8_lossy(&content));
manager.release(&handle).await?;
Ok(())
}
模块结构
src/
├── lib.rs # 公共 API 导出
├── config.rs # 配置管理
├── storage.rs # 文件 I/O 和 SHA256 计算
├── backend.rs # 存储后端 trait
├── handle.rs # FileHandle 和元数据
├── index.rs # SQLite 索引
├── manager.rs # FileManager 主接口
├── hooks.rs # Hook 钩子系统
└── channel.rs # Channel 文件管理
学习资源