From 9cbf5da3fd77578c913d5edd53ff1afecd4ce8cf Mon Sep 17 00:00:00 2001 From: syui Date: Thu, 22 May 2025 18:40:36 +0900 Subject: [PATCH] add memory --- src/commands/mcp.rs | 3 +++ src/main.rs | 1 + src/memory.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 src/memory.rs diff --git a/src/commands/mcp.rs b/src/commands/mcp.rs index db03704..b090f39 100644 --- a/src/commands/mcp.rs +++ b/src/commands/mcp.rs @@ -10,6 +10,7 @@ use crate::git::{git_init, git_status}; use crate::config::ConfigPaths; use crate::commands::git_repo::read_all_git_files; use crate::metrics::{load_user_data, save_user_data}; +use crate::memory::{log_message}; pub fn mcp_setup() { let config = ConfigPaths::new(); @@ -197,6 +198,7 @@ fn chat_cmd() -> Command { // 通常のチャット処理(repoが指定されていない場合) match c.args.get(0) { Some(question) => { + log_message(&config.base_dir, "user", question); let response = ask_chat(c, question); if let Some(ref text) = response { @@ -207,6 +209,7 @@ fn chat_cmd() -> Command { } else if text.contains("hate") || text.contains("bad") { user.metrics.trust -= 0.05; } + log_message(&config.base_dir, "ai", &text); save_user_data(&user_path, &user); } else { eprintln!("❗ 応答が取得できませんでした"); diff --git a/src/main.rs b/src/main.rs index 5ded38d..d80fc36 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,7 @@ mod config; mod git; mod chat; mod metrics; +mod memory; use cli::cli_app; use seahorse::App; diff --git a/src/memory.rs b/src/memory.rs new file mode 100644 index 0000000..9d4b41a --- /dev/null +++ b/src/memory.rs @@ -0,0 +1,49 @@ +// src/memory.rs +use chrono::{DateTime, Local, Utc}; +use serde::{Deserialize, Serialize}; +use std::fs::{self}; +//use std::fs::{self, OpenOptions}; +use std::io::{BufReader, BufWriter}; +use std::path::PathBuf; +use std::{fs::File}; +//use std::{env, fs::File}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct MemoryEntry { + pub timestamp: DateTime, + pub sender: String, + pub message: String, +} + +pub fn log_message(base_dir: &PathBuf, sender: &str, message: &str) { + let now_utc = Utc::now(); + let date_str = Local::now().format("%Y-%m-%d").to_string(); + let mut file_path = base_dir.clone(); + file_path.push("memory"); + let _ = fs::create_dir_all(&file_path); + file_path.push(format!("{}.json", date_str)); + + let new_entry = MemoryEntry { + timestamp: now_utc, + sender: sender.to_string(), + message: message.to_string(), + }; + + let mut entries = if file_path.exists() { + let file = File::open(&file_path).expect("💥 メモリファイルの読み込み失敗"); + let reader = BufReader::new(file); + serde_json::from_reader(reader).unwrap_or_else(|_| vec![]) + } else { + vec![] + }; + + entries.push(new_entry); + + let file = File::create(&file_path).expect("💥 メモリファイルの書き込み失敗"); + let writer = BufWriter::new(file); + serde_json::to_writer_pretty(writer, &entries).expect("💥 JSONの書き込み失敗"); +} + +// 利用例(ask_chatの中) +// log_message(&config.base_dir, "user", question); +// log_message(&config.base_dir, "ai", &response);