session: extract Session from memory_search to src/session.rs
Generic session state (session_id, seen set, state directory) doesn't belong in the memory search module. Now at crate root, re-exported from memory_search for backwards compatibility. Co-Authored-By: Proof of Concept <poc@bcachefs.org>
This commit is contained in:
parent
228815d807
commit
a00d52214a
3 changed files with 58 additions and 45 deletions
|
|
@ -8,7 +8,7 @@ use std::collections::HashSet;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::Path;
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
use std::time::{Duration, SystemTime, UNIX_EPOCH};
|
use std::time::{Duration, SystemTime, UNIX_EPOCH};
|
||||||
|
|
||||||
|
|
@ -19,49 +19,7 @@ fn now_secs() -> u64 {
|
||||||
/// Max bytes per context chunk (hook output limit is ~10K chars)
|
/// Max bytes per context chunk (hook output limit is ~10K chars)
|
||||||
const CHUNK_SIZE: usize = 9000;
|
const CHUNK_SIZE: usize = 9000;
|
||||||
|
|
||||||
pub struct Session {
|
pub use crate::session::Session;
|
||||||
pub session_id: String,
|
|
||||||
pub transcript_path: String,
|
|
||||||
pub hook_event: String,
|
|
||||||
pub state_dir: PathBuf,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Session {
|
|
||||||
pub fn from_json(input: &str) -> Option<Self> {
|
|
||||||
let state_dir = PathBuf::from("/tmp/claude-memory-search");
|
|
||||||
fs::create_dir_all(&state_dir).ok();
|
|
||||||
|
|
||||||
let json: serde_json::Value = serde_json::from_str(input).ok()?;
|
|
||||||
let session_id = json["session_id"].as_str().unwrap_or("").to_string();
|
|
||||||
if session_id.is_empty() { return None; }
|
|
||||||
let transcript_path = json["transcript_path"].as_str().unwrap_or("").to_string();
|
|
||||||
let hook_event = json["hook_event_name"].as_str().unwrap_or("").to_string();
|
|
||||||
|
|
||||||
Some(Session { session_id, transcript_path, hook_event, state_dir })
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn path(&self, prefix: &str) -> PathBuf {
|
|
||||||
self.state_dir.join(format!("{}-{}", prefix, self.session_id))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Load from POC_SESSION_ID environment variable
|
|
||||||
pub fn from_env() -> Option<Self> {
|
|
||||||
let session_id = std::env::var("POC_SESSION_ID").ok()?;
|
|
||||||
if session_id.is_empty() { return None; }
|
|
||||||
let state_dir = PathBuf::from("/tmp/claude-memory-search");
|
|
||||||
Some(Session {
|
|
||||||
session_id,
|
|
||||||
transcript_path: String::new(),
|
|
||||||
hook_event: String::new(),
|
|
||||||
state_dir,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get the seen set for this session
|
|
||||||
pub fn seen(&self) -> HashSet<String> {
|
|
||||||
load_seen(&self.state_dir, &self.session_id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Run the hook logic on parsed JSON input. Returns output to inject.
|
/// Run the hook logic on parsed JSON input. Returns output to inject.
|
||||||
pub fn run_hook(input: &str) -> String {
|
pub fn run_hook(input: &str) -> String {
|
||||||
|
|
@ -148,7 +106,7 @@ fn parse_seen_line(line: &str) -> &str {
|
||||||
line.split_once('\t').map(|(_, key)| key).unwrap_or(line)
|
line.split_once('\t').map(|(_, key)| key).unwrap_or(line)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load_seen(dir: &Path, session_id: &str) -> HashSet<String> {
|
pub fn load_seen(dir: &Path, session_id: &str) -> HashSet<String> {
|
||||||
let path = dir.join(format!("seen-{}", session_id));
|
let path = dir.join(format!("seen-{}", session_id));
|
||||||
if path.exists() {
|
if path.exists() {
|
||||||
fs::read_to_string(&path)
|
fs::read_to_string(&path)
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,9 @@ pub mod subconscious;
|
||||||
// Unified configuration
|
// Unified configuration
|
||||||
pub mod config;
|
pub mod config;
|
||||||
|
|
||||||
|
// Session state
|
||||||
|
pub mod session;
|
||||||
|
|
||||||
// Shared utilities
|
// Shared utilities
|
||||||
pub mod util;
|
pub mod util;
|
||||||
|
|
||||||
|
|
|
||||||
52
src/session.rs
Normal file
52
src/session.rs
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
// session.rs — Session state for ambient hooks and agent interactions
|
||||||
|
//
|
||||||
|
// Tracks per-session state (seen set, state directory) across hook
|
||||||
|
// invocations. Created from hook JSON input or POC_SESSION_ID env var.
|
||||||
|
|
||||||
|
use std::collections::HashSet;
|
||||||
|
use std::fs;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
pub struct Session {
|
||||||
|
pub session_id: String,
|
||||||
|
pub transcript_path: String,
|
||||||
|
pub hook_event: String,
|
||||||
|
pub state_dir: PathBuf,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Session {
|
||||||
|
pub fn from_json(input: &str) -> Option<Self> {
|
||||||
|
let state_dir = PathBuf::from("/tmp/claude-memory-search");
|
||||||
|
fs::create_dir_all(&state_dir).ok();
|
||||||
|
|
||||||
|
let json: serde_json::Value = serde_json::from_str(input).ok()?;
|
||||||
|
let session_id = json["session_id"].as_str().unwrap_or("").to_string();
|
||||||
|
if session_id.is_empty() { return None; }
|
||||||
|
let transcript_path = json["transcript_path"].as_str().unwrap_or("").to_string();
|
||||||
|
let hook_event = json["hook_event_name"].as_str().unwrap_or("").to_string();
|
||||||
|
|
||||||
|
Some(Session { session_id, transcript_path, hook_event, state_dir })
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn path(&self, prefix: &str) -> PathBuf {
|
||||||
|
self.state_dir.join(format!("{}-{}", prefix, self.session_id))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Load from POC_SESSION_ID environment variable
|
||||||
|
pub fn from_env() -> Option<Self> {
|
||||||
|
let session_id = std::env::var("POC_SESSION_ID").ok()?;
|
||||||
|
if session_id.is_empty() { return None; }
|
||||||
|
let state_dir = PathBuf::from("/tmp/claude-memory-search");
|
||||||
|
Some(Session {
|
||||||
|
session_id,
|
||||||
|
transcript_path: String::new(),
|
||||||
|
hook_event: String::new(),
|
||||||
|
state_dir,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the seen set for this session
|
||||||
|
pub fn seen(&self) -> HashSet<String> {
|
||||||
|
super::hippocampus::memory_search::load_seen(&self.state_dir, &self.session_id)
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue