Skip to main content

offline_intelligence/memory_db/
schema.rs

1// "D:\_ProjectWorks\AUDIO_Interface\Server\src\memory_db\schema.rs"
2//! Database schema definitions for the memory system
3
4use serde::{Deserialize, Serialize};
5use chrono::{DateTime, Utc};
6use std::collections::HashMap;
7
8/// Represents a conversation session
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct Session {
11    pub id: String,
12    pub created_at: DateTime<Utc>,
13    pub last_accessed: DateTime<Utc>,
14    pub metadata: SessionMetadata,
15}
16
17// Chat persistence: Session metadata with serde defaults for backward compatibility with existing database records
18#[derive(Debug, Clone, Serialize, Deserialize, Default)]
19pub struct SessionMetadata {
20    pub title: Option<String>,
21    #[serde(default)]  // Handle old records missing this field
22    pub tags: Vec<String>,
23    #[serde(default)]  // Handle old records missing this field
24    pub user_defined: HashMap<String, String>,
25    #[serde(default)]  // Handle old records missing this field
26    pub pinned: bool,
27}
28
29/// Represents a single message in a conversation
30#[derive(Debug, Clone, Serialize, Deserialize)]
31pub struct StoredMessage {
32    pub id: i64,
33    pub session_id: String,
34    pub message_index: i32,
35    pub role: String,
36    pub content: String,
37    pub tokens: i32,
38    pub timestamp: DateTime<Utc>,
39    pub importance_score: f32,
40    pub embedding_generated: bool,
41}
42
43/// Represents a conversation summary
44#[derive(Debug, Clone, Serialize, Deserialize)]
45pub struct Summary {
46    pub id: i64,
47    pub session_id: String,
48    pub message_range_start: i32,
49    pub message_range_end: i32,
50    pub summary_text: String,
51    pub compression_ratio: f32,
52    pub key_topics: Vec<String>,
53    pub generated_at: DateTime<Utc>,
54}
55
56/// Represents a preserved detail from a message
57#[derive(Debug, Clone, Serialize, Deserialize)]
58pub struct Detail {
59    pub id: i64,
60    pub session_id: String,
61    pub message_id: i64,
62    pub detail_type: String,
63    pub content: String,
64    pub context: String,
65    pub importance_score: f32,
66    pub accessed_count: i32,
67    pub last_accessed: DateTime<Utc>,
68}
69
70/// Represents an embedding vector for semantic search
71#[derive(Debug, Clone)]
72pub struct Embedding {
73    pub id: i64,
74    pub message_id: i64,
75    pub embedding: Vec<f32>,
76    pub embedding_model: String,
77    pub generated_at: DateTime<Utc>,
78}
79
80/// Represents KV snapshot for cache management
81#[derive(Debug, Clone, Serialize, Deserialize)]
82pub struct KvSnapshot {
83    pub id: i64,
84    pub session_id: String,
85    pub message_id: i64,
86    pub snapshot_type: String,
87    pub kv_state: Vec<u8>,
88    pub kv_state_hash: String,
89    pub access_pattern: Option<String>,
90    pub size_bytes: i64,
91    pub created_at: DateTime<Utc>,
92}
93
94/// Represents search result
95#[derive(Debug, Clone)]
96pub struct SearchResult {
97    pub message: StoredMessage,
98    pub similarity_score: f32,
99    pub source: SearchSource,
100}
101
102#[derive(Debug, Clone)]
103pub enum SearchSource {
104    Semantic,
105    Keyword,
106    Hybrid,
107}
108
109/// Database statistics
110#[derive(Debug, Clone)]
111pub struct DatabaseStats {
112    pub total_sessions: i64,
113    pub total_messages: i64,
114    pub total_summaries: i64,
115    pub total_details: i64,
116    pub total_embeddings: i64,
117    pub database_size_bytes: i64,
118}
119
120/// SQL statements for table creation
121pub const SCHEMA_SQL: &str = "
122-- Sessions table
123CREATE TABLE IF NOT EXISTS sessions (
124    id TEXT PRIMARY KEY,
125    created_at TIMESTAMP NOT NULL,
126    last_accessed TIMESTAMP NOT NULL,
127    metadata TEXT NOT NULL
128);
129
130-- Messages table
131CREATE TABLE IF NOT EXISTS messages (
132    id INTEGER PRIMARY KEY AUTOINCREMENT,
133    session_id TEXT NOT NULL,
134    message_index INTEGER NOT NULL,
135    role TEXT NOT NULL,
136    content TEXT NOT NULL,
137    tokens INTEGER NOT NULL,
138    timestamp TIMESTAMP NOT NULL,
139    importance_score REAL NOT NULL DEFAULT 0.5,
140    embedding_generated BOOLEAN NOT NULL DEFAULT FALSE,
141    FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE,
142    UNIQUE(session_id, message_index)
143);
144
145-- Summaries table
146CREATE TABLE IF NOT EXISTS summaries (
147    id INTEGER PRIMARY KEY AUTOINCREMENT,
148    session_id TEXT NOT NULL,
149    message_range_start INTEGER NOT NULL,
150    message_range_end INTEGER NOT NULL,
151    summary_text TEXT NOT NULL,
152    compression_ratio REAL NOT NULL,
153    key_topics TEXT NOT NULL,
154    generated_at TIMESTAMP NOT NULL,
155    FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE,
156    UNIQUE(session_id, message_range_start, message_range_end)
157);
158
159-- Details table
160CREATE TABLE IF NOT EXISTS details (
161    id INTEGER PRIMARY KEY AUTOINCREMENT,
162    session_id TEXT NOT NULL,
163    message_id INTEGER NOT NULL,
164    detail_type TEXT NOT NULL,
165    content TEXT NOT NULL,
166    context TEXT NOT NULL,
167    importance_score REAL NOT NULL,
168    accessed_count INTEGER NOT NULL DEFAULT 0,
169    last_accessed TIMESTAMP NOT NULL,
170    FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE,
171    FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE
172);
173
174-- Embeddings table
175CREATE TABLE IF NOT EXISTS embeddings (
176    id INTEGER PRIMARY KEY AUTOINCREMENT,
177    message_id INTEGER NOT NULL,
178    embedding BLOB NOT NULL,
179    embedding_model TEXT NOT NULL,
180    generated_at TIMESTAMP NOT NULL,
181    FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE,
182    UNIQUE(message_id, embedding_model)
183);
184
185-- Indexes for performance
186CREATE INDEX IF NOT EXISTS idx_messages_session ON messages (session_id);
187CREATE INDEX IF NOT EXISTS idx_messages_timestamp ON messages (timestamp);
188CREATE INDEX IF NOT EXISTS idx_summaries_session ON summaries (session_id);
189CREATE INDEX IF NOT EXISTS idx_details_session ON details (session_id);
190CREATE INDEX IF NOT EXISTS idx_details_type ON details (detail_type);
191CREATE INDEX IF NOT EXISTS idx_embeddings_message ON embeddings (message_id);
192";