141 lines
3.6 KiB
Rust
141 lines
3.6 KiB
Rust
use anyhow::Result;
|
|
use clap::{Parser, Subcommand};
|
|
|
|
use aigpt::core::{Memory, MemoryStore};
|
|
use aigpt::mcp::BaseMCPServer;
|
|
|
|
#[derive(Parser)]
|
|
#[command(name = "aigpt")]
|
|
#[command(about = "Simple memory storage for Claude with MCP - Layer 1")]
|
|
#[command(version)]
|
|
struct Cli {
|
|
#[command(subcommand)]
|
|
command: Commands,
|
|
}
|
|
|
|
#[derive(Subcommand)]
|
|
enum Commands {
|
|
/// Start MCP server
|
|
Server {
|
|
/// Enable Layer 4 relationship features (for games/companions)
|
|
#[arg(long)]
|
|
enable_layer4: bool,
|
|
},
|
|
|
|
/// Create a new memory
|
|
Create {
|
|
/// Content of the memory
|
|
content: String,
|
|
},
|
|
|
|
/// Get a memory by ID
|
|
Get {
|
|
/// Memory ID
|
|
id: String,
|
|
},
|
|
|
|
/// Update a memory
|
|
Update {
|
|
/// Memory ID
|
|
id: String,
|
|
/// New content
|
|
content: String,
|
|
},
|
|
|
|
/// Delete a memory
|
|
Delete {
|
|
/// Memory ID
|
|
id: String,
|
|
},
|
|
|
|
/// List all memories
|
|
List,
|
|
|
|
/// Search memories by content
|
|
Search {
|
|
/// Search query
|
|
query: String,
|
|
},
|
|
|
|
/// Show statistics
|
|
Stats,
|
|
}
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<()> {
|
|
let cli = Cli::parse();
|
|
|
|
match cli.command {
|
|
Commands::Server { enable_layer4 } => {
|
|
let server = BaseMCPServer::new(enable_layer4)?;
|
|
server.run()?;
|
|
}
|
|
|
|
Commands::Create { content } => {
|
|
let store = MemoryStore::default()?;
|
|
let memory = Memory::new(content);
|
|
store.create(&memory)?;
|
|
println!("Created memory: {}", memory.id);
|
|
}
|
|
|
|
Commands::Get { id } => {
|
|
let store = MemoryStore::default()?;
|
|
let memory = store.get(&id)?;
|
|
println!("ID: {}", memory.id);
|
|
println!("Content: {}", memory.content);
|
|
println!("Created: {}", memory.created_at);
|
|
println!("Updated: {}", memory.updated_at);
|
|
}
|
|
|
|
Commands::Update { id, content } => {
|
|
let store = MemoryStore::default()?;
|
|
let mut memory = store.get(&id)?;
|
|
memory.update_content(content);
|
|
store.update(&memory)?;
|
|
println!("Updated memory: {}", memory.id);
|
|
}
|
|
|
|
Commands::Delete { id } => {
|
|
let store = MemoryStore::default()?;
|
|
store.delete(&id)?;
|
|
println!("Deleted memory: {}", id);
|
|
}
|
|
|
|
Commands::List => {
|
|
let store = MemoryStore::default()?;
|
|
let memories = store.list()?;
|
|
if memories.is_empty() {
|
|
println!("No memories found");
|
|
} else {
|
|
for memory in memories {
|
|
println!("\n[{}]", memory.id);
|
|
println!(" {}", memory.content);
|
|
println!(" Created: {}", memory.created_at);
|
|
}
|
|
}
|
|
}
|
|
|
|
Commands::Search { query } => {
|
|
let store = MemoryStore::default()?;
|
|
let memories = store.search(&query)?;
|
|
if memories.is_empty() {
|
|
println!("No memories found matching '{}'", query);
|
|
} else {
|
|
println!("Found {} memory(ies):", memories.len());
|
|
for memory in memories {
|
|
println!("\n[{}]", memory.id);
|
|
println!(" {}", memory.content);
|
|
println!(" Created: {}", memory.created_at);
|
|
}
|
|
}
|
|
}
|
|
|
|
Commands::Stats => {
|
|
let store = MemoryStore::default()?;
|
|
let count = store.count()?;
|
|
println!("Total memories: {}", count);
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
} |