@kybernesis/brain-storage-sqlite 0.2.0 → 0.6.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/dist/entity-graph.d.ts +12 -0
- package/dist/entity-graph.d.ts.map +1 -0
- package/dist/entity-graph.js +620 -0
- package/dist/entity-graph.js.map +1 -0
- package/dist/fact-retrieval-queries.d.ts +12 -0
- package/dist/fact-retrieval-queries.d.ts.map +1 -0
- package/dist/fact-retrieval-queries.js +116 -0
- package/dist/fact-retrieval-queries.js.map +1 -0
- package/dist/fact-store.d.ts +8 -0
- package/dist/fact-store.d.ts.map +1 -0
- package/dist/fact-store.js +222 -0
- package/dist/fact-store.js.map +1 -0
- package/dist/fts-sanitizer.d.ts +30 -0
- package/dist/fts-sanitizer.d.ts.map +1 -0
- package/dist/fts-sanitizer.js +59 -0
- package/dist/fts-sanitizer.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/provider.d.ts +16 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +93 -0
- package/dist/provider.js.map +1 -0
- package/dist/search-queries.d.ts +14 -0
- package/dist/search-queries.d.ts.map +1 -0
- package/dist/search-queries.js +84 -0
- package/dist/search-queries.js.map +1 -0
- package/dist/sleep-maintenance.d.ts +15 -0
- package/dist/sleep-maintenance.d.ts.map +1 -0
- package/dist/sleep-maintenance.js +227 -0
- package/dist/sleep-maintenance.js.map +1 -0
- package/dist/sleep-store.d.ts +29 -0
- package/dist/sleep-store.d.ts.map +1 -0
- package/dist/sleep-store.js +377 -0
- package/dist/sleep-store.js.map +1 -0
- package/dist/timeline.d.ts +11 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +351 -0
- package/dist/timeline.js.map +1 -0
- package/package.json +6 -3
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SleepRepository (SQLite impl) — CRUD/persistence for the maintenance engine.
|
|
3
|
+
*
|
|
4
|
+
* The cohesive sleep store (decision 1): each method opens whichever DB kind it
|
|
5
|
+
* needs. As of U3a it carries the run lifecycle (sleep_runs), checkpoints,
|
|
6
|
+
* telemetry, schema bootstrap, and the existing memory_edges read. The
|
|
7
|
+
* per-step CRUD (tier/decay/link/queue/event reads+writes) lands at U3b–U3f.
|
|
8
|
+
*
|
|
9
|
+
* SQL moved VERBATIM from brain-core/sleep/{db,index,utils/checkpoint}.ts;
|
|
10
|
+
* behaviour held constant.
|
|
11
|
+
*/
|
|
12
|
+
import { getDb } from './index.js';
|
|
13
|
+
/** Sleep schema DDL — identical to KAD (port-faithful). */
|
|
14
|
+
const SLEEP_SCHEMA = `
|
|
15
|
+
CREATE TABLE IF NOT EXISTS sleep_runs (
|
|
16
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
17
|
+
started_at TEXT NOT NULL,
|
|
18
|
+
completed_at TEXT,
|
|
19
|
+
status TEXT NOT NULL DEFAULT 'running' CHECK(status IN ('running', 'completed', 'failed', 'paused')),
|
|
20
|
+
checkpoint_step TEXT,
|
|
21
|
+
checkpoint_data TEXT,
|
|
22
|
+
metrics TEXT,
|
|
23
|
+
error_message TEXT,
|
|
24
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
CREATE INDEX IF NOT EXISTS idx_sleep_runs_status ON sleep_runs(status);
|
|
28
|
+
CREATE INDEX IF NOT EXISTS idx_sleep_runs_started ON sleep_runs(started_at DESC);
|
|
29
|
+
|
|
30
|
+
CREATE TABLE IF NOT EXISTS maintenance_queue (
|
|
31
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
32
|
+
item_type TEXT NOT NULL CHECK(item_type IN ('timeline', 'entity', 'file')),
|
|
33
|
+
item_id TEXT NOT NULL,
|
|
34
|
+
task TEXT NOT NULL,
|
|
35
|
+
priority INTEGER DEFAULT 0,
|
|
36
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
37
|
+
processed_at TEXT,
|
|
38
|
+
error_message TEXT,
|
|
39
|
+
UNIQUE(item_type, item_id, task)
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
CREATE INDEX IF NOT EXISTS idx_queue_pending ON maintenance_queue(processed_at) WHERE processed_at IS NULL;
|
|
43
|
+
CREATE INDEX IF NOT EXISTS idx_queue_priority ON maintenance_queue(priority DESC);
|
|
44
|
+
|
|
45
|
+
CREATE TABLE IF NOT EXISTS memory_edges (
|
|
46
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
47
|
+
from_path TEXT NOT NULL,
|
|
48
|
+
to_path TEXT NOT NULL,
|
|
49
|
+
relation TEXT NOT NULL DEFAULT 'related',
|
|
50
|
+
weight REAL DEFAULT 1.0,
|
|
51
|
+
confidence REAL DEFAULT 0.5,
|
|
52
|
+
shared_tags TEXT,
|
|
53
|
+
rationale TEXT,
|
|
54
|
+
method TEXT DEFAULT 'sleep-agent',
|
|
55
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
56
|
+
last_verified TEXT,
|
|
57
|
+
UNIQUE(from_path, to_path)
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
CREATE INDEX IF NOT EXISTS idx_edges_from ON memory_edges(from_path);
|
|
61
|
+
CREATE INDEX IF NOT EXISTS idx_edges_to ON memory_edges(to_path);
|
|
62
|
+
CREATE INDEX IF NOT EXISTS idx_edges_confidence ON memory_edges(confidence DESC);
|
|
63
|
+
CREATE INDEX IF NOT EXISTS idx_edges_relation ON memory_edges(relation);
|
|
64
|
+
|
|
65
|
+
CREATE TABLE IF NOT EXISTS sleep_telemetry (
|
|
66
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
67
|
+
run_id INTEGER REFERENCES sleep_runs(id),
|
|
68
|
+
step TEXT NOT NULL,
|
|
69
|
+
event_type TEXT NOT NULL,
|
|
70
|
+
count INTEGER DEFAULT 0,
|
|
71
|
+
duration_ms INTEGER,
|
|
72
|
+
metadata TEXT,
|
|
73
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
CREATE INDEX IF NOT EXISTS idx_telemetry_run ON sleep_telemetry(run_id);
|
|
77
|
+
CREATE INDEX IF NOT EXISTS idx_telemetry_step ON sleep_telemetry(step);
|
|
78
|
+
|
|
79
|
+
CREATE TABLE IF NOT EXISTS tier_transitions (
|
|
80
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
81
|
+
item_id INTEGER NOT NULL,
|
|
82
|
+
from_tier TEXT,
|
|
83
|
+
to_tier TEXT NOT NULL,
|
|
84
|
+
reason TEXT,
|
|
85
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
CREATE INDEX IF NOT EXISTS idx_tier_transitions_item ON tier_transitions(item_id);
|
|
89
|
+
`;
|
|
90
|
+
const initialized = new Set();
|
|
91
|
+
/**
|
|
92
|
+
* Ensure the sleep schema exists; returns the pooled sleep handle.
|
|
93
|
+
*
|
|
94
|
+
* This is the PUBLIC re-export surface (brain-core/sleep/db.ts re-exports it),
|
|
95
|
+
* kept handle-returning for 0.5.0 API parity (U4 decision A: frozen public API).
|
|
96
|
+
* The sleep ENGINE no longer consumes the handle — 0.6.0 routes every step
|
|
97
|
+
* through the seam — so a future release can deprecate the handle return. Lives
|
|
98
|
+
* HERE (storage package) so brain-core/src stays free of raw getDb.
|
|
99
|
+
*/
|
|
100
|
+
export function ensureSleepSchema(t) {
|
|
101
|
+
const db = getDb(t, 'sleep');
|
|
102
|
+
if (!initialized.has(t.slug)) {
|
|
103
|
+
db.exec(SLEEP_SCHEMA);
|
|
104
|
+
initialized.add(t.slug);
|
|
105
|
+
}
|
|
106
|
+
return db;
|
|
107
|
+
}
|
|
108
|
+
/** Reap >2h-old 'running' rows to 'failed'; returns rows changed. (public re-export) */
|
|
109
|
+
export function recoverStaleSleepRuns(t) {
|
|
110
|
+
const db = ensureSleepSchema(t);
|
|
111
|
+
const r = db.prepare(`
|
|
112
|
+
UPDATE sleep_runs
|
|
113
|
+
SET status = 'failed',
|
|
114
|
+
completed_at = datetime('now'),
|
|
115
|
+
error_message = COALESCE(error_message, 'aborted by daemon restart')
|
|
116
|
+
WHERE status = 'running'
|
|
117
|
+
AND started_at < datetime('now', '-2 hours')
|
|
118
|
+
`).run();
|
|
119
|
+
return r.changes;
|
|
120
|
+
}
|
|
121
|
+
/** Reset the per-tenant schema-init cache. (public re-export; test/utility) */
|
|
122
|
+
export function resetSleepSchemaCache(slug) {
|
|
123
|
+
if (slug)
|
|
124
|
+
initialized.delete(slug);
|
|
125
|
+
else
|
|
126
|
+
initialized.clear();
|
|
127
|
+
}
|
|
128
|
+
export const sqliteSleepStore = {
|
|
129
|
+
// ── run lifecycle + schema (U3a) ──
|
|
130
|
+
async ensureSchema(t) {
|
|
131
|
+
ensureSleepSchema(t);
|
|
132
|
+
},
|
|
133
|
+
async findRunningRun(t) {
|
|
134
|
+
const db = getDb(t, 'sleep');
|
|
135
|
+
const row = db.prepare(`SELECT id FROM sleep_runs WHERE status = 'running' LIMIT 1`).get();
|
|
136
|
+
return row ? row.id : null;
|
|
137
|
+
},
|
|
138
|
+
async startRun(t) {
|
|
139
|
+
const db = getDb(t, 'sleep');
|
|
140
|
+
const r = db.prepare(`INSERT INTO sleep_runs (started_at, status) VALUES (datetime('now'), 'running')`).run();
|
|
141
|
+
return r.lastInsertRowid;
|
|
142
|
+
},
|
|
143
|
+
async completeRun(t, runId, metricsJson) {
|
|
144
|
+
const db = getDb(t, 'sleep');
|
|
145
|
+
db.prepare(`
|
|
146
|
+
UPDATE sleep_runs
|
|
147
|
+
SET status = 'completed', completed_at = datetime('now'), metrics = ?
|
|
148
|
+
WHERE id = ?
|
|
149
|
+
`).run(metricsJson, runId);
|
|
150
|
+
},
|
|
151
|
+
async failRun(t, runId, errorMessage) {
|
|
152
|
+
const db = getDb(t, 'sleep');
|
|
153
|
+
db.prepare(`
|
|
154
|
+
UPDATE sleep_runs
|
|
155
|
+
SET status = 'failed', completed_at = datetime('now'), error_message = ?
|
|
156
|
+
WHERE id = ?
|
|
157
|
+
`).run(errorMessage, runId);
|
|
158
|
+
},
|
|
159
|
+
async recordTelemetry(t, runId, step, eventType, count, durationMs, metadataJson) {
|
|
160
|
+
try {
|
|
161
|
+
const db = getDb(t, 'sleep');
|
|
162
|
+
db.prepare(`
|
|
163
|
+
INSERT INTO sleep_telemetry (run_id, step, event_type, count, duration_ms, metadata)
|
|
164
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
165
|
+
`).run(runId, step, eventType, count, durationMs, metadataJson);
|
|
166
|
+
}
|
|
167
|
+
catch { /* telemetry must never break the cycle */ }
|
|
168
|
+
},
|
|
169
|
+
async saveCheckpoint(t, runId, step, dataJson) {
|
|
170
|
+
const db = getDb(t, 'sleep');
|
|
171
|
+
db.prepare(`
|
|
172
|
+
UPDATE sleep_runs SET checkpoint_step = ?, checkpoint_data = ? WHERE id = ?
|
|
173
|
+
`).run(step, dataJson, runId);
|
|
174
|
+
},
|
|
175
|
+
async getLastCheckpoint(t, runId) {
|
|
176
|
+
const db = getDb(t, 'sleep');
|
|
177
|
+
const row = db.prepare(`
|
|
178
|
+
SELECT checkpoint_step, checkpoint_data FROM sleep_runs WHERE id = ?
|
|
179
|
+
`).get(runId);
|
|
180
|
+
return row ?? null;
|
|
181
|
+
},
|
|
182
|
+
async recoverStaleRuns(t) {
|
|
183
|
+
return recoverStaleSleepRuns(t);
|
|
184
|
+
},
|
|
185
|
+
// ── memory_edges (existing 0.5.0 surface) ──
|
|
186
|
+
async getRelatedEdges(t, sourcePath, limit) {
|
|
187
|
+
let db;
|
|
188
|
+
try {
|
|
189
|
+
db = getDb(t, 'sleep');
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
return db.prepare(`
|
|
196
|
+
SELECT CASE WHEN from_path = ? THEN to_path ELSE from_path END as related_path,
|
|
197
|
+
confidence, shared_tags
|
|
198
|
+
FROM memory_edges
|
|
199
|
+
WHERE from_path = ? OR to_path = ?
|
|
200
|
+
ORDER BY confidence DESC LIMIT ?
|
|
201
|
+
`).all(sourcePath, sourcePath, sourcePath, limit);
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
// memory_edges may not exist yet (no sleep run has created the schema)
|
|
205
|
+
return [];
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
// ── timeline_events: decay + tag (U3b) ──
|
|
209
|
+
async fetchDecayCandidates(t, limit) {
|
|
210
|
+
const db = getDb(t, 'timeline');
|
|
211
|
+
return db.prepare(`
|
|
212
|
+
SELECT id, title, source_path, timestamp, priority, decay_score, access_count, is_pinned
|
|
213
|
+
FROM timeline_events
|
|
214
|
+
WHERE tier != 'archive' OR tier IS NULL
|
|
215
|
+
ORDER BY priority DESC
|
|
216
|
+
LIMIT ?
|
|
217
|
+
`).all(limit);
|
|
218
|
+
},
|
|
219
|
+
async updateEventDecay(t, itemId, decayScore, priority) {
|
|
220
|
+
const db = getDb(t, 'timeline');
|
|
221
|
+
db.prepare(`UPDATE timeline_events SET decay_score = ?, priority = ? WHERE id = ?`).run(decayScore, priority, itemId);
|
|
222
|
+
},
|
|
223
|
+
async fetchTagCandidates(t, staleDate, limit) {
|
|
224
|
+
const db = getDb(t, 'timeline');
|
|
225
|
+
return db.prepare(`
|
|
226
|
+
SELECT id, source_path, title, summary, tags_json, topics_json
|
|
227
|
+
FROM timeline_events
|
|
228
|
+
WHERE (last_enriched IS NULL OR last_enriched < ?)
|
|
229
|
+
OR (tags_json IS NULL OR tags_json = '[]')
|
|
230
|
+
ORDER BY priority DESC
|
|
231
|
+
LIMIT ?
|
|
232
|
+
`).all(staleDate, limit);
|
|
233
|
+
},
|
|
234
|
+
async updateEventTags(t, itemId, tagsJson) {
|
|
235
|
+
const db = getDb(t, 'timeline');
|
|
236
|
+
db.prepare(`UPDATE timeline_events SET tags_json = ?, last_enriched = datetime('now') WHERE id = ?`).run(tagsJson, itemId);
|
|
237
|
+
},
|
|
238
|
+
// ── tier + link (U3c; cross-kind) ──
|
|
239
|
+
async getEdgeStats(t, sourcePath) {
|
|
240
|
+
const db = getDb(t, 'sleep');
|
|
241
|
+
return db.prepare(`
|
|
242
|
+
SELECT COUNT(*) as count, COALESCE(SUM(confidence), 0) as total_confidence
|
|
243
|
+
FROM memory_edges
|
|
244
|
+
WHERE from_path = ? OR to_path = ?
|
|
245
|
+
`).get(sourcePath, sourcePath);
|
|
246
|
+
},
|
|
247
|
+
async edgeExists(t, pathA, pathB) {
|
|
248
|
+
const db = getDb(t, 'sleep');
|
|
249
|
+
const row = db.prepare(`
|
|
250
|
+
SELECT id FROM memory_edges
|
|
251
|
+
WHERE (from_path = ? AND to_path = ?) OR (from_path = ? AND to_path = ?)
|
|
252
|
+
`).get(pathA, pathB, pathB, pathA);
|
|
253
|
+
return row !== undefined;
|
|
254
|
+
},
|
|
255
|
+
async insertMemoryEdge(t, edge) {
|
|
256
|
+
const db = getDb(t, 'sleep');
|
|
257
|
+
db.prepare(`
|
|
258
|
+
INSERT INTO memory_edges
|
|
259
|
+
(from_path, to_path, relation, confidence, shared_tags, rationale, method, created_at, last_verified)
|
|
260
|
+
VALUES (?, ?, ?, ?, ?, ?, 'sleep-agent', datetime('now'), datetime('now'))
|
|
261
|
+
`).run(edge.from_path, edge.to_path, edge.relation, edge.confidence, edge.shared_tags, edge.rationale);
|
|
262
|
+
},
|
|
263
|
+
async listEdgesByRelation(t, relation, limit) {
|
|
264
|
+
const db = getDb(t, 'sleep');
|
|
265
|
+
return db.prepare(`
|
|
266
|
+
SELECT id, from_path, to_path FROM memory_edges
|
|
267
|
+
WHERE relation = ?
|
|
268
|
+
LIMIT ?
|
|
269
|
+
`).all(relation, limit);
|
|
270
|
+
},
|
|
271
|
+
async updateEdgeRelation(t, edgeId, relation) {
|
|
272
|
+
const db = getDb(t, 'sleep');
|
|
273
|
+
db.prepare('UPDATE memory_edges SET relation = ? WHERE id = ?').run(relation, edgeId);
|
|
274
|
+
},
|
|
275
|
+
async enqueueResummarize(t, itemId, priority) {
|
|
276
|
+
const db = getDb(t, 'sleep');
|
|
277
|
+
db.prepare(`
|
|
278
|
+
INSERT OR REPLACE INTO maintenance_queue
|
|
279
|
+
(item_type, item_id, task, priority, created_at)
|
|
280
|
+
VALUES ('timeline', ?, 'resummarize', ?, datetime('now'))
|
|
281
|
+
`).run(itemId.toString(), priority);
|
|
282
|
+
},
|
|
283
|
+
async recordTierTransition(t, itemId, fromTier, toTier, reason) {
|
|
284
|
+
try {
|
|
285
|
+
const db = getDb(t, 'sleep');
|
|
286
|
+
db.prepare(`
|
|
287
|
+
INSERT INTO tier_transitions (item_id, from_tier, to_tier, reason)
|
|
288
|
+
VALUES (?, ?, ?, ?)
|
|
289
|
+
`).run(itemId, fromTier, toTier, reason);
|
|
290
|
+
}
|
|
291
|
+
catch { /* non-critical */ }
|
|
292
|
+
},
|
|
293
|
+
async fetchTierCandidates(t, limit) {
|
|
294
|
+
const db = getDb(t, 'timeline');
|
|
295
|
+
return db.prepare(`
|
|
296
|
+
SELECT id, source_path, priority, decay_score, tier, last_accessed, access_count, is_pinned
|
|
297
|
+
FROM timeline_events
|
|
298
|
+
LIMIT ?
|
|
299
|
+
`).all(limit);
|
|
300
|
+
},
|
|
301
|
+
async updateEventTier(t, itemId, tier) {
|
|
302
|
+
const db = getDb(t, 'timeline');
|
|
303
|
+
db.prepare(`UPDATE timeline_events SET tier = ? WHERE id = ?`).run(tier, itemId);
|
|
304
|
+
},
|
|
305
|
+
async fetchLinkCandidates(t, limit) {
|
|
306
|
+
const db = getDb(t, 'timeline');
|
|
307
|
+
return db.prepare(`
|
|
308
|
+
SELECT id, source_path, title, tier, tags_json, topics_json, entities_json
|
|
309
|
+
FROM timeline_events
|
|
310
|
+
WHERE (tags_json IS NOT NULL AND tags_json != '[]')
|
|
311
|
+
OR (topics_json IS NOT NULL AND topics_json != '[]')
|
|
312
|
+
ORDER BY priority DESC
|
|
313
|
+
LIMIT ?
|
|
314
|
+
`).all(limit);
|
|
315
|
+
},
|
|
316
|
+
// ── summarize + observe + reasoning (U3f) ──
|
|
317
|
+
async fetchResummarizeQueue(t, limit) {
|
|
318
|
+
const db = getDb(t, 'sleep');
|
|
319
|
+
return db.prepare(`
|
|
320
|
+
SELECT id as queue_id, item_id
|
|
321
|
+
FROM maintenance_queue
|
|
322
|
+
WHERE task = 'resummarize' AND processed_at IS NULL
|
|
323
|
+
ORDER BY priority DESC
|
|
324
|
+
LIMIT ?
|
|
325
|
+
`).all(limit);
|
|
326
|
+
},
|
|
327
|
+
async markQueueProcessed(t, queueId) {
|
|
328
|
+
const db = getDb(t, 'sleep');
|
|
329
|
+
db.prepare(`UPDATE maintenance_queue SET processed_at = datetime('now') WHERE id = ?`).run(queueId);
|
|
330
|
+
},
|
|
331
|
+
async markQueueError(t, queueId, error) {
|
|
332
|
+
const db = getDb(t, 'sleep');
|
|
333
|
+
db.prepare(`
|
|
334
|
+
UPDATE maintenance_queue
|
|
335
|
+
SET processed_at = datetime('now'), error_message = ?
|
|
336
|
+
WHERE id = ?
|
|
337
|
+
`).run(error, queueId);
|
|
338
|
+
},
|
|
339
|
+
async getEventForSummary(t, itemId) {
|
|
340
|
+
const db = getDb(t, 'timeline');
|
|
341
|
+
const row = db.prepare(`
|
|
342
|
+
SELECT id, source_path, title, tier, summary, tags_json, entities_json
|
|
343
|
+
FROM timeline_events WHERE id = ?
|
|
344
|
+
`).get(itemId);
|
|
345
|
+
return row ?? null;
|
|
346
|
+
},
|
|
347
|
+
async updateEventSummary(t, itemId, summary) {
|
|
348
|
+
const db = getDb(t, 'timeline');
|
|
349
|
+
db.prepare(`
|
|
350
|
+
UPDATE timeline_events
|
|
351
|
+
SET summary = ?, last_enriched = datetime('now')
|
|
352
|
+
WHERE id = ?
|
|
353
|
+
`).run(summary, itemId);
|
|
354
|
+
},
|
|
355
|
+
async getSummaryEdges(t, sourcePath, limit) {
|
|
356
|
+
const db = getDb(t, 'sleep');
|
|
357
|
+
return db.prepare(`
|
|
358
|
+
SELECT
|
|
359
|
+
CASE WHEN from_path = ? THEN to_path ELSE from_path END as related_path,
|
|
360
|
+
shared_tags
|
|
361
|
+
FROM memory_edges
|
|
362
|
+
WHERE from_path = ? OR to_path = ?
|
|
363
|
+
LIMIT ?
|
|
364
|
+
`).all(sourcePath, sourcePath, sourcePath, limit);
|
|
365
|
+
},
|
|
366
|
+
async findEntityIdByName(t, nameLower) {
|
|
367
|
+
const db = getDb(t, 'entityGraph');
|
|
368
|
+
const row = db.prepare('SELECT id FROM entities WHERE LOWER(name) = ? OR LOWER(normalized_name) = ? LIMIT 1').get(nameLower, nameLower);
|
|
369
|
+
return row ? row.id : null;
|
|
370
|
+
},
|
|
371
|
+
async fetchEntityStats(t, entityId) {
|
|
372
|
+
const db = getDb(t, 'entityGraph');
|
|
373
|
+
const row = db.prepare('SELECT * FROM entities WHERE id = ?').get(entityId);
|
|
374
|
+
return row ? { mention_count: row.mention_count, first_seen: row.first_seen, last_seen: row.last_seen } : null;
|
|
375
|
+
},
|
|
376
|
+
};
|
|
377
|
+
//# sourceMappingURL=sleep-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sleep-store.js","sourceRoot":"","sources":["../src/sleep-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TimelineRepository (SQLite impl). SQL moved verbatim from brain-core/timeline.ts
|
|
3
|
+
* during the storage-seam migration (G2) — behaviour held constant.
|
|
4
|
+
* ensureSchema creates timeline_events + timeline_fts + the facts TABLE (the
|
|
5
|
+
* facts FTS index is owned by FactRepository.ensureFactsTable).
|
|
6
|
+
*/
|
|
7
|
+
import type { TimelineRepository } from '@kybernesis/brain-contracts';
|
|
8
|
+
/** Test/utility hook — clears the per-slug schema-init cache. */
|
|
9
|
+
export declare function resetTimelineSchemaCache(slug?: string): void;
|
|
10
|
+
export declare const sqliteTimelineStore: TimelineRepository;
|
|
11
|
+
//# sourceMappingURL=timeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAOV,kBAAkB,EACnB,MAAM,6BAA6B,CAAC;AAwDrC,iEAAiE;AACjE,wBAAgB,wBAAwB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAG5D;AAuGD,eAAO,MAAM,mBAAmB,EAAE,kBAiNjC,CAAC"}
|