offline_intelligence/memory_db/
schema.rs1use serde::{Deserialize, Serialize};
5use chrono::{DateTime, Utc};
6use std::collections::HashMap;
7
8#[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#[derive(Debug, Clone, Serialize, Deserialize, Default)]
19pub struct SessionMetadata {
20 pub title: Option<String>,
21 #[serde(default)] pub tags: Vec<String>,
23 #[serde(default)] pub user_defined: HashMap<String, String>,
25 #[serde(default)] pub pinned: bool,
27}
28
29#[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#[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#[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#[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#[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#[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#[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
120pub 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";