@prometheus-ai/memory 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +107 -0
- package/dist/types/cli.d.ts +35 -0
- package/dist/types/config.d.ts +77 -0
- package/dist/types/core/aaak.d.ts +55 -0
- package/dist/types/core/annotations.d.ts +75 -0
- package/dist/types/core/banks.d.ts +33 -0
- package/dist/types/core/beam/consolidate.d.ts +32 -0
- package/dist/types/core/beam/helpers.d.ts +76 -0
- package/dist/types/core/beam/index.d.ts +59 -0
- package/dist/types/core/beam/recall.d.ts +32 -0
- package/dist/types/core/beam/schema.d.ts +2 -0
- package/dist/types/core/beam/store.d.ts +35 -0
- package/dist/types/core/beam/types.d.ts +233 -0
- package/dist/types/core/binary-vectors.d.ts +54 -0
- package/dist/types/core/chat-normalize.d.ts +13 -0
- package/dist/types/core/content-sanitizer.d.ts +18 -0
- package/dist/types/core/cost-log.d.ts +13 -0
- package/dist/types/core/embeddings.d.ts +44 -0
- package/dist/types/core/entities.d.ts +7 -0
- package/dist/types/core/episodic-graph.d.ts +89 -0
- package/dist/types/core/extraction/client.d.ts +31 -0
- package/dist/types/core/extraction/diagnostics.d.ts +51 -0
- package/dist/types/core/extraction/prompts.d.ts +2 -0
- package/dist/types/core/extraction.d.ts +6 -0
- package/dist/types/core/index.d.ts +4 -0
- package/dist/types/core/llm-backends.d.ts +21 -0
- package/dist/types/core/local-llm.d.ts +15 -0
- package/dist/types/core/memory.d.ts +160 -0
- package/dist/types/core/migrations/e6-triplestore-split.d.ts +17 -0
- package/dist/types/core/migrations/index.d.ts +1 -0
- package/dist/types/core/mmr.d.ts +8 -0
- package/dist/types/core/orchestrator.d.ts +20 -0
- package/dist/types/core/patterns.d.ts +61 -0
- package/dist/types/core/plugins.d.ts +109 -0
- package/dist/types/core/polyphonic-recall.d.ts +66 -0
- package/dist/types/core/query-cache.d.ts +46 -0
- package/dist/types/core/query-intent.d.ts +20 -0
- package/dist/types/core/recall-diagnostics.d.ts +48 -0
- package/dist/types/core/runtime-options.d.ts +68 -0
- package/dist/types/core/shmr.d.ts +56 -0
- package/dist/types/core/streaming.d.ts +136 -0
- package/dist/types/core/synonyms.d.ts +46 -0
- package/dist/types/core/temporal-parser.d.ts +16 -0
- package/dist/types/core/token-counter.d.ts +8 -0
- package/dist/types/core/triples.d.ts +63 -0
- package/dist/types/core/typed-memory.d.ts +39 -0
- package/dist/types/core/vector-math.d.ts +1 -0
- package/dist/types/core/veracity-consolidation.d.ts +60 -0
- package/dist/types/core/weibull.d.ts +96 -0
- package/dist/types/db.d.ts +16 -0
- package/dist/types/diagnose.d.ts +24 -0
- package/dist/types/dr/index.d.ts +1 -0
- package/dist/types/dr/recovery.d.ts +68 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/mcp-server.d.ts +40 -0
- package/dist/types/mcp-tools.d.ts +484 -0
- package/dist/types/migrations/e6-triplestore-split.d.ts +1 -0
- package/dist/types/migrations/index.d.ts +1 -0
- package/dist/types/types.d.ts +145 -0
- package/dist/types/util/datetime.d.ts +8 -0
- package/dist/types/util/env.d.ts +10 -0
- package/dist/types/util/ids.d.ts +3 -0
- package/dist/types/util/lru.d.ts +12 -0
- package/dist/types/util/regex.d.ts +10 -0
- package/package.json +85 -0
- package/src/cli.ts +398 -0
- package/src/config.ts +326 -0
- package/src/core/aaak.ts +142 -0
- package/src/core/annotations.ts +457 -0
- package/src/core/banks.ts +133 -0
- package/src/core/beam/consolidate.ts +965 -0
- package/src/core/beam/helpers.ts +977 -0
- package/src/core/beam/index.ts +353 -0
- package/src/core/beam/recall.ts +1100 -0
- package/src/core/beam/schema.ts +423 -0
- package/src/core/beam/store.ts +829 -0
- package/src/core/beam/types.ts +268 -0
- package/src/core/binary-vectors.ts +317 -0
- package/src/core/chat-normalize.ts +160 -0
- package/src/core/content-sanitizer.ts +136 -0
- package/src/core/cost-log.ts +103 -0
- package/src/core/embeddings.ts +423 -0
- package/src/core/entities.ts +259 -0
- package/src/core/episodic-graph.ts +708 -0
- package/src/core/extraction/client.ts +162 -0
- package/src/core/extraction/diagnostics.ts +193 -0
- package/src/core/extraction/prompts.ts +31 -0
- package/src/core/extraction.ts +335 -0
- package/src/core/index.ts +30 -0
- package/src/core/llm-backends.ts +51 -0
- package/src/core/local-llm.ts +436 -0
- package/src/core/memory.ts +630 -0
- package/src/core/migrations/e6-triplestore-split.ts +211 -0
- package/src/core/migrations/index.ts +1 -0
- package/src/core/mmr.ts +71 -0
- package/src/core/orchestrator.ts +62 -0
- package/src/core/patterns.ts +484 -0
- package/src/core/plugins.ts +375 -0
- package/src/core/polyphonic-recall.ts +563 -0
- package/src/core/query-cache.ts +354 -0
- package/src/core/query-intent.ts +139 -0
- package/src/core/recall-diagnostics.ts +157 -0
- package/src/core/runtime-options.ts +119 -0
- package/src/core/shmr.ts +460 -0
- package/src/core/streaming.ts +419 -0
- package/src/core/synonyms.ts +197 -0
- package/src/core/temporal-parser.ts +363 -0
- package/src/core/token-counter.ts +30 -0
- package/src/core/triples.ts +454 -0
- package/src/core/typed-memory.ts +407 -0
- package/src/core/vector-math.ts +23 -0
- package/src/core/veracity-consolidation.ts +477 -0
- package/src/core/weibull.ts +124 -0
- package/src/db.ts +128 -0
- package/src/diagnose.ts +174 -0
- package/src/dr/index.ts +1 -0
- package/src/dr/recovery.ts +405 -0
- package/src/index.ts +33 -0
- package/src/mcp-server.ts +155 -0
- package/src/mcp-tools.ts +970 -0
- package/src/migrations/e6-triplestore-split.ts +1 -0
- package/src/migrations/index.ts +1 -0
- package/src/types.ts +157 -0
- package/src/util/datetime.ts +69 -0
- package/src/util/env.ts +65 -0
- package/src/util/ids.ts +19 -0
- package/src/util/lru.ts +48 -0
- package/src/util/regex.ts +165 -0
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
import type { Database } from "bun:sqlite";
|
|
2
|
+
|
|
3
|
+
type PragmaTableInfoRow = {
|
|
4
|
+
name: string;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
function addColumnIfMissing(db: Database, table: string, column: string, definition: string): boolean {
|
|
8
|
+
const rows = db.query(`PRAGMA table_info(${table})`).all() as PragmaTableInfoRow[];
|
|
9
|
+
for (const row of rows) {
|
|
10
|
+
if (row.name === column) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
db.run(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function runAll(db: Database, statements: readonly string[]): void {
|
|
19
|
+
for (const statement of statements) {
|
|
20
|
+
db.run(statement);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function initBeam(db: Database): void {
|
|
25
|
+
db.run(`
|
|
26
|
+
CREATE TABLE IF NOT EXISTS working_memory (
|
|
27
|
+
id TEXT PRIMARY KEY,
|
|
28
|
+
content TEXT NOT NULL,
|
|
29
|
+
source TEXT,
|
|
30
|
+
timestamp TEXT,
|
|
31
|
+
session_id TEXT DEFAULT 'default',
|
|
32
|
+
importance REAL DEFAULT 0.5,
|
|
33
|
+
metadata_json TEXT,
|
|
34
|
+
veracity TEXT DEFAULT 'unknown',
|
|
35
|
+
memory_type TEXT DEFAULT 'unknown',
|
|
36
|
+
consolidated_at TEXT,
|
|
37
|
+
recall_count INTEGER DEFAULT 0,
|
|
38
|
+
last_recalled TIMESTAMP DEFAULT NULL,
|
|
39
|
+
valid_until TIMESTAMP DEFAULT NULL,
|
|
40
|
+
superseded_by TEXT DEFAULT NULL,
|
|
41
|
+
scope TEXT DEFAULT 'global',
|
|
42
|
+
author_id TEXT DEFAULT NULL,
|
|
43
|
+
author_type TEXT DEFAULT NULL,
|
|
44
|
+
channel_id TEXT DEFAULT NULL,
|
|
45
|
+
trust_tier TEXT DEFAULT 'STATED',
|
|
46
|
+
validator TEXT DEFAULT NULL,
|
|
47
|
+
validated_at TIMESTAMP DEFAULT NULL,
|
|
48
|
+
validation_count INTEGER DEFAULT 0,
|
|
49
|
+
event_date TEXT DEFAULT NULL,
|
|
50
|
+
event_date_precision TEXT DEFAULT 'unknown',
|
|
51
|
+
temporal_tags TEXT DEFAULT '[]',
|
|
52
|
+
corrected_by INTEGER DEFAULT NULL,
|
|
53
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
54
|
+
)
|
|
55
|
+
`);
|
|
56
|
+
|
|
57
|
+
db.run(`
|
|
58
|
+
CREATE TABLE IF NOT EXISTS episodic_memory (
|
|
59
|
+
rowid INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
60
|
+
id TEXT UNIQUE NOT NULL,
|
|
61
|
+
content TEXT NOT NULL,
|
|
62
|
+
source TEXT,
|
|
63
|
+
timestamp TEXT,
|
|
64
|
+
session_id TEXT DEFAULT 'default',
|
|
65
|
+
importance REAL DEFAULT 0.5,
|
|
66
|
+
metadata_json TEXT,
|
|
67
|
+
summary_of TEXT DEFAULT '',
|
|
68
|
+
veracity TEXT DEFAULT 'unknown',
|
|
69
|
+
tier INTEGER DEFAULT 1,
|
|
70
|
+
degraded_at TEXT,
|
|
71
|
+
memory_type TEXT DEFAULT 'unknown',
|
|
72
|
+
binary_vector BLOB,
|
|
73
|
+
recall_count INTEGER DEFAULT 0,
|
|
74
|
+
last_recalled TIMESTAMP DEFAULT NULL,
|
|
75
|
+
valid_until TIMESTAMP DEFAULT NULL,
|
|
76
|
+
superseded_by TEXT DEFAULT NULL,
|
|
77
|
+
scope TEXT DEFAULT 'global',
|
|
78
|
+
author_id TEXT DEFAULT NULL,
|
|
79
|
+
author_type TEXT DEFAULT NULL,
|
|
80
|
+
channel_id TEXT DEFAULT NULL,
|
|
81
|
+
trust_tier TEXT DEFAULT 'STATED',
|
|
82
|
+
validator TEXT DEFAULT NULL,
|
|
83
|
+
validated_at TIMESTAMP DEFAULT NULL,
|
|
84
|
+
validation_count INTEGER DEFAULT 0,
|
|
85
|
+
event_date TEXT DEFAULT NULL,
|
|
86
|
+
event_date_precision TEXT DEFAULT 'unknown',
|
|
87
|
+
temporal_tags TEXT DEFAULT '[]',
|
|
88
|
+
corrected_by INTEGER DEFAULT NULL,
|
|
89
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
90
|
+
)
|
|
91
|
+
`);
|
|
92
|
+
|
|
93
|
+
runAll(db, [
|
|
94
|
+
"CREATE INDEX IF NOT EXISTS idx_wm_session ON working_memory(session_id)",
|
|
95
|
+
"CREATE INDEX IF NOT EXISTS idx_wm_timestamp ON working_memory(timestamp)",
|
|
96
|
+
"CREATE INDEX IF NOT EXISTS idx_wm_source ON working_memory(source)",
|
|
97
|
+
"CREATE INDEX IF NOT EXISTS idx_em_session ON episodic_memory(session_id)",
|
|
98
|
+
"CREATE INDEX IF NOT EXISTS idx_em_timestamp ON episodic_memory(timestamp)",
|
|
99
|
+
"CREATE INDEX IF NOT EXISTS idx_em_source ON episodic_memory(source)",
|
|
100
|
+
]);
|
|
101
|
+
|
|
102
|
+
addColumnIfMissing(db, "episodic_memory", "tier", "INTEGER DEFAULT 1");
|
|
103
|
+
addColumnIfMissing(db, "episodic_memory", "degraded_at", "TEXT");
|
|
104
|
+
db.run("CREATE INDEX IF NOT EXISTS idx_em_tier ON episodic_memory(tier)");
|
|
105
|
+
addColumnIfMissing(db, "working_memory", "veracity", "TEXT DEFAULT 'unknown'");
|
|
106
|
+
addColumnIfMissing(db, "episodic_memory", "veracity", "TEXT DEFAULT 'unknown'");
|
|
107
|
+
addColumnIfMissing(db, "working_memory", "memory_type", "TEXT DEFAULT 'unknown'");
|
|
108
|
+
addColumnIfMissing(db, "episodic_memory", "memory_type", "TEXT DEFAULT 'unknown'");
|
|
109
|
+
addColumnIfMissing(db, "episodic_memory", "binary_vector", "BLOB");
|
|
110
|
+
const consolidatedAtAdded = addColumnIfMissing(db, "working_memory", "consolidated_at", "TEXT");
|
|
111
|
+
if (consolidatedAtAdded) {
|
|
112
|
+
db.run("UPDATE working_memory SET consolidated_at = ? WHERE consolidated_at IS NULL", [new Date().toISOString()]);
|
|
113
|
+
}
|
|
114
|
+
db.run(
|
|
115
|
+
"CREATE INDEX IF NOT EXISTS idx_wm_unconsolidated ON working_memory(session_id, timestamp) WHERE consolidated_at IS NULL",
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
db.run(`
|
|
119
|
+
CREATE TABLE IF NOT EXISTS scratchpad (
|
|
120
|
+
id TEXT PRIMARY KEY,
|
|
121
|
+
content TEXT NOT NULL,
|
|
122
|
+
session_id TEXT DEFAULT 'default',
|
|
123
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
124
|
+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
125
|
+
)
|
|
126
|
+
`);
|
|
127
|
+
db.run("CREATE INDEX IF NOT EXISTS idx_sp_session ON scratchpad(session_id)");
|
|
128
|
+
|
|
129
|
+
db.run(`
|
|
130
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS fts_episodes USING fts5(
|
|
131
|
+
content,
|
|
132
|
+
content='episodic_memory',
|
|
133
|
+
content_rowid='rowid'
|
|
134
|
+
)
|
|
135
|
+
`);
|
|
136
|
+
db.run(`
|
|
137
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS fts_working USING fts5(
|
|
138
|
+
id UNINDEXED,
|
|
139
|
+
content
|
|
140
|
+
)
|
|
141
|
+
`);
|
|
142
|
+
runAll(db, [
|
|
143
|
+
`CREATE TRIGGER IF NOT EXISTS em_ai AFTER INSERT ON episodic_memory BEGIN
|
|
144
|
+
INSERT INTO fts_episodes(rowid, content) VALUES (new.rowid, new.content);
|
|
145
|
+
END`,
|
|
146
|
+
`CREATE TRIGGER IF NOT EXISTS em_ad AFTER DELETE ON episodic_memory BEGIN
|
|
147
|
+
INSERT INTO fts_episodes(fts_episodes, rowid, content) VALUES ('delete', old.rowid, old.content);
|
|
148
|
+
END`,
|
|
149
|
+
`CREATE TRIGGER IF NOT EXISTS em_au AFTER UPDATE ON episodic_memory BEGIN
|
|
150
|
+
INSERT INTO fts_episodes(fts_episodes, rowid, content) VALUES ('delete', old.rowid, old.content);
|
|
151
|
+
INSERT INTO fts_episodes(rowid, content) VALUES (new.rowid, new.content);
|
|
152
|
+
END`,
|
|
153
|
+
`CREATE TRIGGER IF NOT EXISTS wm_ai AFTER INSERT ON working_memory BEGIN
|
|
154
|
+
INSERT INTO fts_working(id, content) VALUES (new.id, new.content);
|
|
155
|
+
END`,
|
|
156
|
+
`CREATE TRIGGER IF NOT EXISTS wm_ad AFTER DELETE ON working_memory BEGIN
|
|
157
|
+
DELETE FROM fts_working WHERE id = old.id;
|
|
158
|
+
END`,
|
|
159
|
+
"DROP TRIGGER IF EXISTS wm_au",
|
|
160
|
+
`CREATE TRIGGER IF NOT EXISTS wm_au AFTER UPDATE OF content ON working_memory BEGIN
|
|
161
|
+
DELETE FROM fts_working WHERE id = old.id;
|
|
162
|
+
INSERT INTO fts_working(id, content) VALUES (new.id, new.content);
|
|
163
|
+
END`,
|
|
164
|
+
]);
|
|
165
|
+
|
|
166
|
+
db.run(`
|
|
167
|
+
CREATE TABLE IF NOT EXISTS memoria_facts (
|
|
168
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
169
|
+
session_id TEXT DEFAULT 'default',
|
|
170
|
+
message_idx INTEGER,
|
|
171
|
+
fact_type TEXT,
|
|
172
|
+
key TEXT,
|
|
173
|
+
value TEXT,
|
|
174
|
+
context_snippet TEXT,
|
|
175
|
+
importance REAL DEFAULT 0.5,
|
|
176
|
+
timestamp TEXT,
|
|
177
|
+
version_id INTEGER DEFAULT 0,
|
|
178
|
+
previous_value TEXT,
|
|
179
|
+
updated_msg_idx INTEGER,
|
|
180
|
+
valid_from_msg_idx INTEGER,
|
|
181
|
+
valid_to_msg_idx INTEGER,
|
|
182
|
+
source_memory_id TEXT
|
|
183
|
+
)
|
|
184
|
+
`);
|
|
185
|
+
runAll(db, [
|
|
186
|
+
"CREATE INDEX IF NOT EXISTS idx_facts_key ON memoria_facts(key)",
|
|
187
|
+
"CREATE INDEX IF NOT EXISTS idx_facts_type ON memoria_facts(fact_type)",
|
|
188
|
+
"CREATE INDEX IF NOT EXISTS idx_facts_session ON memoria_facts(session_id)",
|
|
189
|
+
]);
|
|
190
|
+
addColumnIfMissing(db, "memoria_facts", "version_id", "INTEGER DEFAULT 0");
|
|
191
|
+
addColumnIfMissing(db, "memoria_facts", "previous_value", "TEXT");
|
|
192
|
+
addColumnIfMissing(db, "memoria_facts", "updated_msg_idx", "INTEGER");
|
|
193
|
+
addColumnIfMissing(db, "memoria_facts", "valid_from_msg_idx", "INTEGER");
|
|
194
|
+
addColumnIfMissing(db, "memoria_facts", "valid_to_msg_idx", "INTEGER");
|
|
195
|
+
addColumnIfMissing(db, "memoria_facts", "source_memory_id", "TEXT");
|
|
196
|
+
|
|
197
|
+
db.run(`
|
|
198
|
+
CREATE TABLE IF NOT EXISTS memoria_timelines (
|
|
199
|
+
event_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
200
|
+
session_id TEXT DEFAULT 'default',
|
|
201
|
+
date TEXT,
|
|
202
|
+
message_idx INTEGER,
|
|
203
|
+
description TEXT,
|
|
204
|
+
source TEXT,
|
|
205
|
+
source_memory_id TEXT
|
|
206
|
+
)
|
|
207
|
+
`);
|
|
208
|
+
runAll(db, [
|
|
209
|
+
"CREATE INDEX IF NOT EXISTS idx_timelines_date ON memoria_timelines(date)",
|
|
210
|
+
"CREATE INDEX IF NOT EXISTS idx_timelines_session ON memoria_timelines(session_id)",
|
|
211
|
+
]);
|
|
212
|
+
db.run(`
|
|
213
|
+
CREATE TABLE IF NOT EXISTS memoria_instructions (
|
|
214
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
215
|
+
session_id TEXT DEFAULT 'default',
|
|
216
|
+
message_idx INTEGER,
|
|
217
|
+
instruction TEXT,
|
|
218
|
+
active INTEGER DEFAULT 1,
|
|
219
|
+
topic TEXT,
|
|
220
|
+
context_snippet TEXT,
|
|
221
|
+
source_memory_id TEXT
|
|
222
|
+
)
|
|
223
|
+
`);
|
|
224
|
+
runAll(db, [
|
|
225
|
+
"CREATE INDEX IF NOT EXISTS idx_instr_session ON memoria_instructions(session_id)",
|
|
226
|
+
"CREATE INDEX IF NOT EXISTS idx_instr_active ON memoria_instructions(active)",
|
|
227
|
+
]);
|
|
228
|
+
db.run(`
|
|
229
|
+
CREATE TABLE IF NOT EXISTS memoria_preferences (
|
|
230
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
231
|
+
session_id TEXT DEFAULT 'default',
|
|
232
|
+
message_idx INTEGER,
|
|
233
|
+
preference TEXT,
|
|
234
|
+
topic TEXT,
|
|
235
|
+
evolution TEXT,
|
|
236
|
+
context_snippet TEXT,
|
|
237
|
+
source_memory_id TEXT
|
|
238
|
+
)
|
|
239
|
+
`);
|
|
240
|
+
db.run("CREATE INDEX IF NOT EXISTS idx_pref_session ON memoria_preferences(session_id)");
|
|
241
|
+
db.run(`
|
|
242
|
+
CREATE TABLE IF NOT EXISTS memoria_kg (
|
|
243
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
244
|
+
session_id TEXT DEFAULT 'default',
|
|
245
|
+
subject TEXT,
|
|
246
|
+
predicate TEXT,
|
|
247
|
+
object TEXT,
|
|
248
|
+
message_idx INTEGER,
|
|
249
|
+
confidence REAL DEFAULT 0.7,
|
|
250
|
+
source_memory_id TEXT
|
|
251
|
+
)
|
|
252
|
+
`);
|
|
253
|
+
runAll(db, [
|
|
254
|
+
"CREATE INDEX IF NOT EXISTS idx_kg_subject ON memoria_kg(subject)",
|
|
255
|
+
"CREATE INDEX IF NOT EXISTS idx_kg_predicate ON memoria_kg(predicate)",
|
|
256
|
+
"CREATE INDEX IF NOT EXISTS idx_kg_session ON memoria_kg(session_id)",
|
|
257
|
+
]);
|
|
258
|
+
for (const table of ["memoria_timelines", "memoria_instructions", "memoria_preferences", "memoria_kg"] as const) {
|
|
259
|
+
addColumnIfMissing(db, table, "source_memory_id", "TEXT");
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
db.run(`
|
|
263
|
+
CREATE TABLE IF NOT EXISTS consolidation_log (
|
|
264
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
265
|
+
session_id TEXT,
|
|
266
|
+
items_consolidated INTEGER,
|
|
267
|
+
summary_preview TEXT,
|
|
268
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
269
|
+
)
|
|
270
|
+
`);
|
|
271
|
+
db.run(`
|
|
272
|
+
CREATE TABLE IF NOT EXISTS memory_embeddings (
|
|
273
|
+
memory_id TEXT PRIMARY KEY,
|
|
274
|
+
embedding_json TEXT NOT NULL,
|
|
275
|
+
model TEXT,
|
|
276
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
277
|
+
)
|
|
278
|
+
`);
|
|
279
|
+
|
|
280
|
+
addColumnIfMissing(db, "working_memory", "recall_count", "INTEGER DEFAULT 0");
|
|
281
|
+
addColumnIfMissing(db, "working_memory", "last_recalled", "TIMESTAMP DEFAULT NULL");
|
|
282
|
+
addColumnIfMissing(db, "episodic_memory", "recall_count", "INTEGER DEFAULT 0");
|
|
283
|
+
addColumnIfMissing(db, "episodic_memory", "last_recalled", "TIMESTAMP DEFAULT NULL");
|
|
284
|
+
addColumnIfMissing(db, "working_memory", "valid_until", "TIMESTAMP DEFAULT NULL");
|
|
285
|
+
addColumnIfMissing(db, "working_memory", "superseded_by", "TEXT DEFAULT NULL");
|
|
286
|
+
addColumnIfMissing(db, "working_memory", "scope", "TEXT DEFAULT 'global'");
|
|
287
|
+
addColumnIfMissing(db, "episodic_memory", "valid_until", "TIMESTAMP DEFAULT NULL");
|
|
288
|
+
addColumnIfMissing(db, "episodic_memory", "superseded_by", "TEXT DEFAULT NULL");
|
|
289
|
+
addColumnIfMissing(db, "episodic_memory", "scope", "TEXT DEFAULT 'global'");
|
|
290
|
+
runAll(db, [
|
|
291
|
+
"CREATE INDEX IF NOT EXISTS idx_em_scope_imp ON episodic_memory(scope, importance) WHERE superseded_by IS NULL",
|
|
292
|
+
"CREATE INDEX IF NOT EXISTS idx_wm_session_recall ON working_memory(session_id, last_recalled) WHERE valid_until IS NULL",
|
|
293
|
+
"CREATE INDEX IF NOT EXISTS idx_mem_emb_type ON memory_embeddings(memory_id, model)",
|
|
294
|
+
]);
|
|
295
|
+
|
|
296
|
+
for (const table of ["working_memory", "episodic_memory"] as const) {
|
|
297
|
+
addColumnIfMissing(db, table, "author_id", "TEXT DEFAULT NULL");
|
|
298
|
+
addColumnIfMissing(db, table, "author_type", "TEXT DEFAULT NULL");
|
|
299
|
+
addColumnIfMissing(db, table, "channel_id", "TEXT DEFAULT NULL");
|
|
300
|
+
addColumnIfMissing(db, table, "trust_tier", "TEXT DEFAULT 'STATED'");
|
|
301
|
+
addColumnIfMissing(db, table, "validator", "TEXT DEFAULT NULL");
|
|
302
|
+
addColumnIfMissing(db, table, "validated_at", "TIMESTAMP DEFAULT NULL");
|
|
303
|
+
addColumnIfMissing(db, table, "validation_count", "INTEGER DEFAULT 0");
|
|
304
|
+
}
|
|
305
|
+
runAll(db, [
|
|
306
|
+
"CREATE INDEX IF NOT EXISTS idx_wm_author ON working_memory(author_id)",
|
|
307
|
+
"CREATE INDEX IF NOT EXISTS idx_wm_channel ON working_memory(channel_id)",
|
|
308
|
+
"CREATE INDEX IF NOT EXISTS idx_em_author ON episodic_memory(author_id)",
|
|
309
|
+
"CREATE INDEX IF NOT EXISTS idx_em_channel ON episodic_memory(channel_id)",
|
|
310
|
+
"CREATE INDEX IF NOT EXISTS idx_wm_validator ON working_memory(validator)",
|
|
311
|
+
"CREATE INDEX IF NOT EXISTS idx_wm_validated_at ON working_memory(validated_at)",
|
|
312
|
+
]);
|
|
313
|
+
|
|
314
|
+
db.run(`
|
|
315
|
+
CREATE TABLE IF NOT EXISTS memory_validations (
|
|
316
|
+
validation_id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
317
|
+
memory_id TEXT NOT NULL,
|
|
318
|
+
validator TEXT NOT NULL,
|
|
319
|
+
validated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
320
|
+
action TEXT NOT NULL,
|
|
321
|
+
new_content TEXT,
|
|
322
|
+
note TEXT
|
|
323
|
+
)
|
|
324
|
+
`);
|
|
325
|
+
runAll(db, [
|
|
326
|
+
"CREATE INDEX IF NOT EXISTS idx_validations_memory ON memory_validations(memory_id)",
|
|
327
|
+
"CREATE INDEX IF NOT EXISTS idx_validations_validator ON memory_validations(validator)",
|
|
328
|
+
`CREATE TRIGGER IF NOT EXISTS trim_validations_to_3
|
|
329
|
+
AFTER INSERT ON memory_validations
|
|
330
|
+
BEGIN
|
|
331
|
+
DELETE FROM memory_validations
|
|
332
|
+
WHERE memory_id = NEW.memory_id
|
|
333
|
+
AND validation_id NOT IN (
|
|
334
|
+
SELECT validation_id FROM memory_validations
|
|
335
|
+
WHERE memory_id = NEW.memory_id
|
|
336
|
+
ORDER BY validation_id DESC
|
|
337
|
+
LIMIT 3
|
|
338
|
+
);
|
|
339
|
+
END`,
|
|
340
|
+
]);
|
|
341
|
+
|
|
342
|
+
db.run(`
|
|
343
|
+
CREATE TABLE IF NOT EXISTS facts (
|
|
344
|
+
fact_id TEXT PRIMARY KEY,
|
|
345
|
+
session_id TEXT NOT NULL,
|
|
346
|
+
subject TEXT NOT NULL,
|
|
347
|
+
predicate TEXT NOT NULL,
|
|
348
|
+
object TEXT NOT NULL,
|
|
349
|
+
timestamp TEXT,
|
|
350
|
+
source_msg_id TEXT,
|
|
351
|
+
confidence REAL DEFAULT 1.0,
|
|
352
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
353
|
+
)
|
|
354
|
+
`);
|
|
355
|
+
runAll(db, [
|
|
356
|
+
"CREATE INDEX IF NOT EXISTS idx_facts_session ON facts(session_id)",
|
|
357
|
+
"CREATE INDEX IF NOT EXISTS idx_facts_subject ON facts(subject)",
|
|
358
|
+
"CREATE INDEX IF NOT EXISTS idx_facts_source ON facts(source_msg_id)",
|
|
359
|
+
]);
|
|
360
|
+
db.run(`
|
|
361
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS fts_facts USING fts5(
|
|
362
|
+
subject, predicate, object, content='facts'
|
|
363
|
+
)
|
|
364
|
+
`);
|
|
365
|
+
runAll(db, [
|
|
366
|
+
`CREATE TRIGGER IF NOT EXISTS facts_ai AFTER INSERT ON facts BEGIN
|
|
367
|
+
INSERT INTO fts_facts(rowid, subject, predicate, object)
|
|
368
|
+
VALUES (new.rowid, new.subject, new.predicate, new.object);
|
|
369
|
+
END`,
|
|
370
|
+
`CREATE TRIGGER IF NOT EXISTS facts_ad AFTER DELETE ON facts BEGIN
|
|
371
|
+
INSERT INTO fts_facts(fts_facts, rowid, subject, predicate, object)
|
|
372
|
+
VALUES ('delete', old.rowid, old.subject, old.predicate, old.object);
|
|
373
|
+
END`,
|
|
374
|
+
]);
|
|
375
|
+
|
|
376
|
+
for (const table of ["working_memory", "episodic_memory"] as const) {
|
|
377
|
+
addColumnIfMissing(db, table, "event_date", "TEXT DEFAULT NULL");
|
|
378
|
+
addColumnIfMissing(db, table, "event_date_precision", "TEXT DEFAULT 'unknown'");
|
|
379
|
+
addColumnIfMissing(db, table, "temporal_tags", "TEXT DEFAULT '[]'");
|
|
380
|
+
addColumnIfMissing(db, table, "corrected_by", "INTEGER DEFAULT NULL");
|
|
381
|
+
}
|
|
382
|
+
runAll(db, [
|
|
383
|
+
"CREATE INDEX IF NOT EXISTS idx_wm_event_date ON working_memory(event_date)",
|
|
384
|
+
"CREATE INDEX IF NOT EXISTS idx_em_event_date ON episodic_memory(event_date)",
|
|
385
|
+
]);
|
|
386
|
+
|
|
387
|
+
db.run(`
|
|
388
|
+
CREATE TABLE IF NOT EXISTS annotations (
|
|
389
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
390
|
+
memory_id TEXT NOT NULL,
|
|
391
|
+
kind TEXT NOT NULL,
|
|
392
|
+
value TEXT NOT NULL,
|
|
393
|
+
source TEXT,
|
|
394
|
+
confidence REAL DEFAULT 1.0,
|
|
395
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
396
|
+
)
|
|
397
|
+
`);
|
|
398
|
+
runAll(db, [
|
|
399
|
+
"CREATE INDEX IF NOT EXISTS idx_annot_memory_kind ON annotations(memory_id, kind)",
|
|
400
|
+
"CREATE INDEX IF NOT EXISTS idx_annot_kind_value ON annotations(kind, value)",
|
|
401
|
+
"CREATE UNIQUE INDEX IF NOT EXISTS idx_annot_unique ON annotations(memory_id, kind, value)",
|
|
402
|
+
]);
|
|
403
|
+
|
|
404
|
+
db.run(`
|
|
405
|
+
CREATE TABLE IF NOT EXISTS triples (
|
|
406
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
407
|
+
subject TEXT NOT NULL,
|
|
408
|
+
predicate TEXT NOT NULL,
|
|
409
|
+
object TEXT NOT NULL,
|
|
410
|
+
valid_from TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
411
|
+
valid_until TEXT,
|
|
412
|
+
source TEXT,
|
|
413
|
+
confidence REAL DEFAULT 1.0,
|
|
414
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
415
|
+
)
|
|
416
|
+
`);
|
|
417
|
+
runAll(db, [
|
|
418
|
+
"CREATE INDEX IF NOT EXISTS idx_triples_subject ON triples(subject)",
|
|
419
|
+
"CREATE INDEX IF NOT EXISTS idx_triples_predicate ON triples(predicate)",
|
|
420
|
+
"CREATE INDEX IF NOT EXISTS idx_triples_object ON triples(object)",
|
|
421
|
+
"CREATE INDEX IF NOT EXISTS idx_triples_valid_from ON triples(valid_from)",
|
|
422
|
+
]);
|
|
423
|
+
}
|