@kybernesis/brain-core 0.1.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/claude-call.d.ts +37 -0
- package/dist/claude-call.d.ts.map +1 -0
- package/dist/claude-call.js +55 -0
- package/dist/claude-call.js.map +1 -0
- package/dist/entity-graph.d.ts +79 -0
- package/dist/entity-graph.d.ts.map +1 -0
- package/dist/entity-graph.js +611 -0
- package/dist/entity-graph.js.map +1 -0
- package/dist/fact-contradiction.d.ts +25 -0
- package/dist/fact-contradiction.d.ts.map +1 -0
- package/dist/fact-contradiction.js +109 -0
- package/dist/fact-contradiction.js.map +1 -0
- package/dist/fact-extractor.d.ts +26 -0
- package/dist/fact-extractor.d.ts.map +1 -0
- package/dist/fact-extractor.js +98 -0
- package/dist/fact-extractor.js.map +1 -0
- package/dist/fact-retrieval.d.ts +51 -0
- package/dist/fact-retrieval.d.ts.map +1 -0
- package/dist/fact-retrieval.js +401 -0
- package/dist/fact-retrieval.js.map +1 -0
- package/dist/fact-store.d.ts +26 -0
- package/dist/fact-store.d.ts.map +1 -0
- package/dist/fact-store.js +181 -0
- package/dist/fact-store.js.map +1 -0
- package/dist/fact-temporal.d.ts +20 -0
- package/dist/fact-temporal.d.ts.map +1 -0
- package/dist/fact-temporal.js +79 -0
- package/dist/fact-temporal.js.map +1 -0
- package/dist/fts-sanitizer.d.ts +32 -0
- package/dist/fts-sanitizer.d.ts.map +1 -0
- package/dist/fts-sanitizer.js +61 -0
- package/dist/fts-sanitizer.js.map +1 -0
- package/dist/hybrid-search.d.ts +44 -0
- package/dist/hybrid-search.d.ts.map +1 -0
- package/dist/hybrid-search.js +410 -0
- package/dist/hybrid-search.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/ops.d.ts +28 -0
- package/dist/ops.d.ts.map +1 -0
- package/dist/ops.js +307 -0
- package/dist/ops.js.map +1 -0
- package/dist/queue.d.ts +13 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +28 -0
- package/dist/queue.js.map +1 -0
- package/dist/relationship-extractor.d.ts +38 -0
- package/dist/relationship-extractor.d.ts.map +1 -0
- package/dist/relationship-extractor.js +119 -0
- package/dist/relationship-extractor.js.map +1 -0
- package/dist/sleep/config.d.ts +47 -0
- package/dist/sleep/config.d.ts.map +1 -0
- package/dist/sleep/config.js +46 -0
- package/dist/sleep/config.js.map +1 -0
- package/dist/sleep/db.d.ts +16 -0
- package/dist/sleep/db.d.ts.map +1 -0
- package/dist/sleep/db.js +114 -0
- package/dist/sleep/db.js.map +1 -0
- package/dist/sleep/index.d.ts +69 -0
- package/dist/sleep/index.d.ts.map +1 -0
- package/dist/sleep/index.js +99 -0
- package/dist/sleep/index.js.map +1 -0
- package/dist/sleep/steps/consolidate.d.ts +19 -0
- package/dist/sleep/steps/consolidate.d.ts.map +1 -0
- package/dist/sleep/steps/consolidate.js +74 -0
- package/dist/sleep/steps/consolidate.js.map +1 -0
- package/dist/sleep/steps/decay.d.ts +19 -0
- package/dist/sleep/steps/decay.d.ts.map +1 -0
- package/dist/sleep/steps/decay.js +121 -0
- package/dist/sleep/steps/decay.js.map +1 -0
- package/dist/sleep/steps/entity-hygiene.d.ts +29 -0
- package/dist/sleep/steps/entity-hygiene.d.ts.map +1 -0
- package/dist/sleep/steps/entity-hygiene.js +452 -0
- package/dist/sleep/steps/entity-hygiene.js.map +1 -0
- package/dist/sleep/steps/link.d.ts +20 -0
- package/dist/sleep/steps/link.d.ts.map +1 -0
- package/dist/sleep/steps/link.js +216 -0
- package/dist/sleep/steps/link.js.map +1 -0
- package/dist/sleep/steps/observe.d.ts +17 -0
- package/dist/sleep/steps/observe.d.ts.map +1 -0
- package/dist/sleep/steps/observe.js +192 -0
- package/dist/sleep/steps/observe.js.map +1 -0
- package/dist/sleep/steps/profile.d.ts +15 -0
- package/dist/sleep/steps/profile.d.ts.map +1 -0
- package/dist/sleep/steps/profile.js +26 -0
- package/dist/sleep/steps/profile.js.map +1 -0
- package/dist/sleep/steps/reasoning.d.ts +19 -0
- package/dist/sleep/steps/reasoning.d.ts.map +1 -0
- package/dist/sleep/steps/reasoning.js +173 -0
- package/dist/sleep/steps/reasoning.js.map +1 -0
- package/dist/sleep/steps/summarize.d.ts +21 -0
- package/dist/sleep/steps/summarize.d.ts.map +1 -0
- package/dist/sleep/steps/summarize.js +206 -0
- package/dist/sleep/steps/summarize.js.map +1 -0
- package/dist/sleep/steps/tag.d.ts +16 -0
- package/dist/sleep/steps/tag.d.ts.map +1 -0
- package/dist/sleep/steps/tag.js +84 -0
- package/dist/sleep/steps/tag.js.map +1 -0
- package/dist/sleep/steps/tier.d.ts +18 -0
- package/dist/sleep/steps/tier.d.ts.map +1 -0
- package/dist/sleep/steps/tier.js +112 -0
- package/dist/sleep/steps/tier.js.map +1 -0
- package/dist/sleep/utils/checkpoint.d.ts +11 -0
- package/dist/sleep/utils/checkpoint.d.ts.map +1 -0
- package/dist/sleep/utils/checkpoint.js +26 -0
- package/dist/sleep/utils/checkpoint.js.map +1 -0
- package/dist/sleep/utils/jaccard.d.ts +7 -0
- package/dist/sleep/utils/jaccard.d.ts.map +1 -0
- package/dist/sleep/utils/jaccard.js +19 -0
- package/dist/sleep/utils/jaccard.js.map +1 -0
- package/dist/store-conversation.d.ts +29 -0
- package/dist/store-conversation.d.ts.map +1 -0
- package/dist/store-conversation.js +227 -0
- package/dist/store-conversation.js.map +1 -0
- package/dist/timeline.d.ts +50 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +389 -0
- package/dist/timeline.js.map +1 -0
- package/dist/user-profile.d.ts +30 -0
- package/dist/user-profile.d.ts.map +1 -0
- package/dist/user-profile.js +147 -0
- package/dist/user-profile.js.map +1 -0
- package/dist/vectors.d.ts +56 -0
- package/dist/vectors.d.ts.map +1 -0
- package/dist/vectors.js +132 -0
- package/dist/vectors.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,611 @@
|
|
|
1
|
+
import { getDb } from '@kybernesis/brain-storage-sqlite';
|
|
2
|
+
import { DIRECTIONAL_RELATIONSHIPS } from '@kybernesis/brain-contracts';
|
|
3
|
+
function rowToEntity(row) {
|
|
4
|
+
return {
|
|
5
|
+
id: row.id,
|
|
6
|
+
name: row.name,
|
|
7
|
+
normalizedName: row.normalized_name,
|
|
8
|
+
aliases: JSON.parse(row.aliases || '[]'),
|
|
9
|
+
type: row.type,
|
|
10
|
+
firstSeen: row.first_seen,
|
|
11
|
+
lastSeen: row.last_seen,
|
|
12
|
+
mentionCount: row.mention_count,
|
|
13
|
+
priority: row.priority ?? 0.5,
|
|
14
|
+
decayScore: row.decay_score ?? 0.0,
|
|
15
|
+
tier: (row.tier ?? 'warm'),
|
|
16
|
+
lastAccessed: row.last_accessed ?? undefined,
|
|
17
|
+
accessCount: row.access_count ?? 0,
|
|
18
|
+
isPinned: (row.is_pinned ?? 0) === 1,
|
|
19
|
+
lastReasonedAt: row.last_reasoned_at ?? undefined,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function rowToMention(row) {
|
|
23
|
+
return {
|
|
24
|
+
id: row.id,
|
|
25
|
+
entityId: row.entity_id,
|
|
26
|
+
conversationId: row.conversation_id,
|
|
27
|
+
sourcePath: row.source_path,
|
|
28
|
+
context: row.context ?? undefined,
|
|
29
|
+
timestamp: row.timestamp,
|
|
30
|
+
sourceType: row.source_type ?? 'chat',
|
|
31
|
+
confidence: row.confidence ?? 0.85,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function rowToInsight(row) {
|
|
35
|
+
return {
|
|
36
|
+
id: row.id,
|
|
37
|
+
entityId: row.entity_id,
|
|
38
|
+
insightType: row.insight_type,
|
|
39
|
+
insight: row.insight,
|
|
40
|
+
reasoning: row.reasoning,
|
|
41
|
+
confidence: row.confidence,
|
|
42
|
+
sourceEntityIds: JSON.parse(row.source_entity_ids || '[]'),
|
|
43
|
+
createdAt: row.created_at,
|
|
44
|
+
expiresAt: row.expires_at ?? undefined,
|
|
45
|
+
isStale: (row.is_stale ?? 0) === 1,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// ─── Schema initialization ────────────────────────────────────────────────────
|
|
49
|
+
const initialized = new Set();
|
|
50
|
+
function ensureSchema(t) {
|
|
51
|
+
if (initialized.has(t.slug))
|
|
52
|
+
return;
|
|
53
|
+
const db = getDb(t, 'entityGraph');
|
|
54
|
+
db.exec(`
|
|
55
|
+
CREATE TABLE IF NOT EXISTS entities (
|
|
56
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
57
|
+
name TEXT NOT NULL,
|
|
58
|
+
normalized_name TEXT NOT NULL,
|
|
59
|
+
aliases TEXT DEFAULT '[]',
|
|
60
|
+
type TEXT NOT NULL CHECK(type IN ('person', 'company', 'project', 'place', 'topic')),
|
|
61
|
+
first_seen TEXT NOT NULL,
|
|
62
|
+
last_seen TEXT NOT NULL,
|
|
63
|
+
mention_count INTEGER DEFAULT 1,
|
|
64
|
+
priority REAL DEFAULT 0.5,
|
|
65
|
+
decay_score REAL DEFAULT 0.0,
|
|
66
|
+
tier TEXT DEFAULT 'warm',
|
|
67
|
+
last_accessed TEXT,
|
|
68
|
+
access_count INTEGER DEFAULT 0,
|
|
69
|
+
is_pinned INTEGER DEFAULT 0,
|
|
70
|
+
last_reasoned_at TEXT,
|
|
71
|
+
UNIQUE(normalized_name, type)
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
CREATE INDEX IF NOT EXISTS idx_entities_normalized ON entities(normalized_name);
|
|
75
|
+
CREATE INDEX IF NOT EXISTS idx_entities_type ON entities(type);
|
|
76
|
+
CREATE INDEX IF NOT EXISTS idx_entities_tier ON entities(tier);
|
|
77
|
+
CREATE INDEX IF NOT EXISTS idx_entities_priority ON entities(priority DESC);
|
|
78
|
+
|
|
79
|
+
CREATE TABLE IF NOT EXISTS entity_mentions (
|
|
80
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
81
|
+
entity_id INTEGER NOT NULL,
|
|
82
|
+
conversation_id TEXT NOT NULL,
|
|
83
|
+
source_path TEXT NOT NULL,
|
|
84
|
+
context TEXT,
|
|
85
|
+
timestamp TEXT NOT NULL,
|
|
86
|
+
source_type TEXT DEFAULT 'chat',
|
|
87
|
+
confidence REAL DEFAULT 0.85,
|
|
88
|
+
FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
CREATE INDEX IF NOT EXISTS idx_mentions_conversation ON entity_mentions(conversation_id);
|
|
92
|
+
CREATE INDEX IF NOT EXISTS idx_mentions_entity ON entity_mentions(entity_id);
|
|
93
|
+
CREATE INDEX IF NOT EXISTS idx_mentions_timestamp ON entity_mentions(timestamp);
|
|
94
|
+
|
|
95
|
+
CREATE TABLE IF NOT EXISTS entity_relations (
|
|
96
|
+
source_id INTEGER NOT NULL,
|
|
97
|
+
target_id INTEGER NOT NULL,
|
|
98
|
+
relationship TEXT DEFAULT 'co-occurred',
|
|
99
|
+
strength INTEGER DEFAULT 1,
|
|
100
|
+
confidence REAL DEFAULT 0.5,
|
|
101
|
+
method TEXT DEFAULT 'co-occurred',
|
|
102
|
+
rationale TEXT,
|
|
103
|
+
last_verified TEXT,
|
|
104
|
+
PRIMARY KEY (source_id, target_id),
|
|
105
|
+
FOREIGN KEY (source_id) REFERENCES entities(id) ON DELETE CASCADE,
|
|
106
|
+
FOREIGN KEY (target_id) REFERENCES entities(id) ON DELETE CASCADE
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
CREATE INDEX IF NOT EXISTS idx_relations_source ON entity_relations(source_id);
|
|
110
|
+
CREATE INDEX IF NOT EXISTS idx_relations_target ON entity_relations(target_id);
|
|
111
|
+
CREATE INDEX IF NOT EXISTS idx_relations_confidence ON entity_relations(confidence DESC);
|
|
112
|
+
|
|
113
|
+
CREATE TABLE IF NOT EXISTS entity_merges (
|
|
114
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
115
|
+
keep_id INTEGER NOT NULL,
|
|
116
|
+
remove_id INTEGER NOT NULL,
|
|
117
|
+
keep_name TEXT, remove_name TEXT, keep_type TEXT, remove_type TEXT,
|
|
118
|
+
reason TEXT NOT NULL,
|
|
119
|
+
confidence REAL,
|
|
120
|
+
ai_rationale TEXT,
|
|
121
|
+
mentions_moved INTEGER DEFAULT 0,
|
|
122
|
+
relations_moved INTEGER DEFAULT 0,
|
|
123
|
+
merged_at TEXT DEFAULT (datetime('now')),
|
|
124
|
+
merged_by TEXT DEFAULT 'sleep:entity-hygiene'
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
CREATE TABLE IF NOT EXISTS entity_profiles (
|
|
128
|
+
entity_id INTEGER PRIMARY KEY REFERENCES entities(id) ON DELETE CASCADE,
|
|
129
|
+
profile TEXT NOT NULL,
|
|
130
|
+
generated_at TEXT DEFAULT (datetime('now')),
|
|
131
|
+
fact_count INTEGER DEFAULT 0
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
CREATE TABLE IF NOT EXISTS contradictions (
|
|
135
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
136
|
+
entity_id INTEGER,
|
|
137
|
+
fact_a_id INTEGER,
|
|
138
|
+
fact_b_id INTEGER,
|
|
139
|
+
fact_a TEXT,
|
|
140
|
+
fact_b TEXT,
|
|
141
|
+
description TEXT,
|
|
142
|
+
status TEXT DEFAULT 'open',
|
|
143
|
+
resolved_by TEXT,
|
|
144
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
145
|
+
);
|
|
146
|
+
CREATE INDEX IF NOT EXISTS idx_contradictions_entity ON contradictions(entity_id);
|
|
147
|
+
CREATE INDEX IF NOT EXISTS idx_contradictions_status ON contradictions(status);
|
|
148
|
+
|
|
149
|
+
CREATE TABLE IF NOT EXISTS entity_insights (
|
|
150
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
151
|
+
entity_id INTEGER NOT NULL REFERENCES entities(id) ON DELETE CASCADE,
|
|
152
|
+
insight_type TEXT NOT NULL,
|
|
153
|
+
insight TEXT NOT NULL,
|
|
154
|
+
reasoning TEXT NOT NULL,
|
|
155
|
+
confidence REAL DEFAULT 0.70,
|
|
156
|
+
source_entity_ids TEXT DEFAULT '[]',
|
|
157
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
158
|
+
expires_at TEXT,
|
|
159
|
+
is_stale INTEGER DEFAULT 0
|
|
160
|
+
);
|
|
161
|
+
CREATE INDEX IF NOT EXISTS idx_insights_entity ON entity_insights(entity_id);
|
|
162
|
+
CREATE INDEX IF NOT EXISTS idx_insights_type ON entity_insights(insight_type);
|
|
163
|
+
`);
|
|
164
|
+
initialized.add(t.slug);
|
|
165
|
+
}
|
|
166
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
167
|
+
function normalizeEntityName(name) {
|
|
168
|
+
return name.toLowerCase().trim().replace(/\s+/g, ' ');
|
|
169
|
+
}
|
|
170
|
+
function escapeLike(value) {
|
|
171
|
+
return value.replace(/[%_\\]/g, ch => `\\${ch}`);
|
|
172
|
+
}
|
|
173
|
+
function escapeRegex(str) {
|
|
174
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
175
|
+
}
|
|
176
|
+
// ─── Entity operations ────────────────────────────────────────────────────────
|
|
177
|
+
export async function findOrCreateEntity(t, name, type, timestamp) {
|
|
178
|
+
ensureSchema(t);
|
|
179
|
+
const db = getDb(t, 'entityGraph');
|
|
180
|
+
const normalizedName = normalizeEntityName(name);
|
|
181
|
+
let existing = db.prepare('SELECT * FROM entities WHERE normalized_name = ? AND type = ?')
|
|
182
|
+
.get(normalizedName, type);
|
|
183
|
+
if (!existing) {
|
|
184
|
+
existing = db.prepare(`SELECT * FROM entities WHERE type = ? AND LOWER(aliases) LIKE ? ESCAPE '\\'`)
|
|
185
|
+
.get(type, `%"${escapeLike(normalizedName)}"%`);
|
|
186
|
+
}
|
|
187
|
+
if (existing) {
|
|
188
|
+
db.prepare('UPDATE entities SET last_seen = ?, mention_count = mention_count + 1 WHERE id = ?')
|
|
189
|
+
.run(timestamp, existing.id);
|
|
190
|
+
return rowToEntity({ ...existing, last_seen: timestamp, mention_count: existing.mention_count + 1 });
|
|
191
|
+
}
|
|
192
|
+
const result = db.prepare(`
|
|
193
|
+
INSERT INTO entities (name, normalized_name, aliases, type, first_seen, last_seen, mention_count)
|
|
194
|
+
VALUES (?, ?, ?, ?, ?, ?, 1)
|
|
195
|
+
`).run(name, normalizedName, '[]', type, timestamp, timestamp);
|
|
196
|
+
return {
|
|
197
|
+
id: result.lastInsertRowid,
|
|
198
|
+
name,
|
|
199
|
+
normalizedName: normalizedName,
|
|
200
|
+
aliases: [],
|
|
201
|
+
type,
|
|
202
|
+
firstSeen: timestamp,
|
|
203
|
+
lastSeen: timestamp,
|
|
204
|
+
mentionCount: 1,
|
|
205
|
+
priority: 0.5,
|
|
206
|
+
decayScore: 0.0,
|
|
207
|
+
tier: 'warm',
|
|
208
|
+
accessCount: 0,
|
|
209
|
+
isPinned: false,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
export async function addEntityAlias(t, entityId, alias) {
|
|
213
|
+
ensureSchema(t);
|
|
214
|
+
const db = getDb(t, 'entityGraph');
|
|
215
|
+
const entity = db.prepare('SELECT aliases FROM entities WHERE id = ?').get(entityId);
|
|
216
|
+
if (!entity)
|
|
217
|
+
return;
|
|
218
|
+
const aliases = JSON.parse(entity.aliases);
|
|
219
|
+
const normalizedAlias = normalizeEntityName(alias);
|
|
220
|
+
if (!aliases.includes(normalizedAlias)) {
|
|
221
|
+
aliases.push(normalizedAlias);
|
|
222
|
+
db.prepare('UPDATE entities SET aliases = ? WHERE id = ?').run(JSON.stringify(aliases), entityId);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
export async function addEntityMention(t, entityId, conversationId, sourcePath, context, timestamp, sourceType = 'chat', confidence = 0.85) {
|
|
226
|
+
ensureSchema(t);
|
|
227
|
+
const db = getDb(t, 'entityGraph');
|
|
228
|
+
db.prepare(`
|
|
229
|
+
INSERT INTO entity_mentions (entity_id, conversation_id, source_path, context, timestamp, source_type, confidence)
|
|
230
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
231
|
+
`).run(entityId, conversationId, sourcePath, context, timestamp, sourceType, confidence);
|
|
232
|
+
}
|
|
233
|
+
export async function linkEntities(t, sourceId, targetId, relationship = 'co-occurred') {
|
|
234
|
+
ensureSchema(t);
|
|
235
|
+
const db = getDb(t, 'entityGraph');
|
|
236
|
+
const [id1, id2] = sourceId < targetId ? [sourceId, targetId] : [targetId, sourceId];
|
|
237
|
+
db.prepare(`
|
|
238
|
+
INSERT INTO entity_relations (source_id, target_id, relationship, strength)
|
|
239
|
+
VALUES (?, ?, ?, 1)
|
|
240
|
+
ON CONFLICT(source_id, target_id) DO UPDATE SET strength = strength + 1
|
|
241
|
+
`).run(id1, id2, relationship);
|
|
242
|
+
}
|
|
243
|
+
export async function linkEntitiesWithType(t, sourceId, targetId, options) {
|
|
244
|
+
ensureSchema(t);
|
|
245
|
+
const db = getDb(t, 'entityGraph');
|
|
246
|
+
const isDirectional = DIRECTIONAL_RELATIONSHIPS.has(options.relationship);
|
|
247
|
+
const [id1, id2] = isDirectional
|
|
248
|
+
? [sourceId, targetId]
|
|
249
|
+
: sourceId < targetId ? [sourceId, targetId] : [targetId, sourceId];
|
|
250
|
+
const confidence = options.confidence ?? 0.7;
|
|
251
|
+
const method = options.method ?? 'ai-extraction';
|
|
252
|
+
const now = new Date().toISOString();
|
|
253
|
+
db.prepare(`
|
|
254
|
+
INSERT INTO entity_relations (source_id, target_id, relationship, strength, confidence, method, rationale, last_verified)
|
|
255
|
+
VALUES (?, ?, ?, 1, ?, ?, ?, ?)
|
|
256
|
+
ON CONFLICT(source_id, target_id) DO UPDATE SET
|
|
257
|
+
relationship = CASE
|
|
258
|
+
WHEN excluded.confidence > entity_relations.confidence THEN excluded.relationship
|
|
259
|
+
ELSE entity_relations.relationship
|
|
260
|
+
END,
|
|
261
|
+
strength = strength + 1,
|
|
262
|
+
confidence = MAX(entity_relations.confidence, excluded.confidence),
|
|
263
|
+
rationale = COALESCE(excluded.rationale, entity_relations.rationale),
|
|
264
|
+
last_verified = excluded.last_verified
|
|
265
|
+
`).run(id1, id2, options.relationship, confidence, method, options.rationale ?? null, now);
|
|
266
|
+
}
|
|
267
|
+
export async function getTypedRelationships(t, entityId) {
|
|
268
|
+
ensureSchema(t);
|
|
269
|
+
const db = getDb(t, 'entityGraph');
|
|
270
|
+
const results = db.prepare(`
|
|
271
|
+
SELECT
|
|
272
|
+
er.source_id, er.target_id, er.relationship, er.confidence, er.rationale,
|
|
273
|
+
e.id, e.name, e.normalized_name, e.type, e.aliases,
|
|
274
|
+
e.first_seen, e.last_seen, e.mention_count, e.priority, e.decay_score,
|
|
275
|
+
e.tier, e.last_accessed, e.access_count, e.is_pinned, e.last_reasoned_at
|
|
276
|
+
FROM entity_relations er
|
|
277
|
+
JOIN entities e ON (
|
|
278
|
+
CASE WHEN er.source_id = ? THEN er.target_id ELSE er.source_id END = e.id
|
|
279
|
+
)
|
|
280
|
+
WHERE (er.source_id = ? OR er.target_id = ?)
|
|
281
|
+
AND er.relationship != 'co-occurred'
|
|
282
|
+
ORDER BY er.confidence DESC, er.strength DESC
|
|
283
|
+
`).all(entityId, entityId, entityId);
|
|
284
|
+
return results.map(row => ({
|
|
285
|
+
entity: rowToEntity({
|
|
286
|
+
id: row.id, name: row.name, normalized_name: row.normalized_name, type: row.type, aliases: row.aliases,
|
|
287
|
+
first_seen: row.first_seen, last_seen: row.last_seen, mention_count: row.mention_count,
|
|
288
|
+
priority: row.priority, decay_score: row.decay_score, tier: row.tier, last_accessed: row.last_accessed,
|
|
289
|
+
access_count: row.access_count, is_pinned: row.is_pinned, last_reasoned_at: row.last_reasoned_at,
|
|
290
|
+
}),
|
|
291
|
+
relationship: row.relationship,
|
|
292
|
+
direction: row.source_id === entityId ? 'outgoing' : 'incoming',
|
|
293
|
+
confidence: row.confidence ?? 0.5,
|
|
294
|
+
rationale: row.rationale ?? undefined,
|
|
295
|
+
}));
|
|
296
|
+
}
|
|
297
|
+
export async function linkEntitiesFromConversation(t, conversationId, sourcePath, timestamp, entities) {
|
|
298
|
+
if (entities.length === 0)
|
|
299
|
+
return;
|
|
300
|
+
for (const entity of entities) {
|
|
301
|
+
const dbEntity = await findOrCreateEntity(t, entity.name, entity.type, timestamp);
|
|
302
|
+
await addEntityMention(t, dbEntity.id, conversationId, sourcePath, entity.context ?? '', timestamp);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// ─── Query operations ─────────────────────────────────────────────────────────
|
|
306
|
+
export async function getEntityContext(t, nameOrId) {
|
|
307
|
+
ensureSchema(t);
|
|
308
|
+
const db = getDb(t, 'entityGraph');
|
|
309
|
+
let entity;
|
|
310
|
+
if (typeof nameOrId === 'number') {
|
|
311
|
+
entity = db.prepare('SELECT * FROM entities WHERE id = ?').get(nameOrId);
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
const normalized = normalizeEntityName(nameOrId);
|
|
315
|
+
entity = db.prepare(`SELECT * FROM entities WHERE normalized_name = ? OR aliases LIKE ? ESCAPE '\\'`)
|
|
316
|
+
.get(normalized, `%"${escapeLike(normalized)}"%`);
|
|
317
|
+
}
|
|
318
|
+
if (!entity)
|
|
319
|
+
return null;
|
|
320
|
+
const mentions = db.prepare('SELECT * FROM entity_mentions WHERE entity_id = ? ORDER BY timestamp DESC').all(entity.id)
|
|
321
|
+
.map(rowToMention);
|
|
322
|
+
const relations = db.prepare(`
|
|
323
|
+
SELECT
|
|
324
|
+
CASE WHEN source_id = ? THEN target_id ELSE source_id END as related_id,
|
|
325
|
+
relationship, strength
|
|
326
|
+
FROM entity_relations
|
|
327
|
+
WHERE source_id = ? OR target_id = ?
|
|
328
|
+
ORDER BY strength DESC LIMIT 20
|
|
329
|
+
`).all(entity.id, entity.id, entity.id);
|
|
330
|
+
const relatedEntities = relations.flatMap(rel => {
|
|
331
|
+
const related = db.prepare('SELECT * FROM entities WHERE id = ?').get(rel.related_id);
|
|
332
|
+
if (!related)
|
|
333
|
+
return [];
|
|
334
|
+
return [{ entity: rowToEntity(related), relationship: rel.relationship, strength: rel.strength }];
|
|
335
|
+
});
|
|
336
|
+
return { entity: rowToEntity(entity), mentions, relatedEntities };
|
|
337
|
+
}
|
|
338
|
+
export async function searchEntities(t, query, options = {}) {
|
|
339
|
+
ensureSchema(t);
|
|
340
|
+
const db = getDb(t, 'entityGraph');
|
|
341
|
+
const normalized = normalizeEntityName(query);
|
|
342
|
+
const escaped = escapeLike(normalized);
|
|
343
|
+
const limit = options.limit ?? 20;
|
|
344
|
+
let sql = `SELECT * FROM entities WHERE (normalized_name LIKE ? ESCAPE '\\' OR aliases LIKE ? ESCAPE '\\')`;
|
|
345
|
+
const params = [`%${escaped}%`, `%${escaped}%`];
|
|
346
|
+
if (options.type) {
|
|
347
|
+
sql += ' AND type = ?';
|
|
348
|
+
params.push(options.type);
|
|
349
|
+
}
|
|
350
|
+
sql += ' ORDER BY mention_count DESC LIMIT ?';
|
|
351
|
+
params.push(limit);
|
|
352
|
+
return db.prepare(sql).all(...params).map(rowToEntity);
|
|
353
|
+
}
|
|
354
|
+
export async function getRecentEntities(t, limit = 20) {
|
|
355
|
+
ensureSchema(t);
|
|
356
|
+
const db = getDb(t, 'entityGraph');
|
|
357
|
+
return db.prepare('SELECT * FROM entities ORDER BY last_seen DESC LIMIT ?').all(limit).map(rowToEntity);
|
|
358
|
+
}
|
|
359
|
+
export async function getMostMentionedEntities(t, options = {}) {
|
|
360
|
+
ensureSchema(t);
|
|
361
|
+
const db = getDb(t, 'entityGraph');
|
|
362
|
+
const limit = options.limit ?? 20;
|
|
363
|
+
let sql = 'SELECT * FROM entities';
|
|
364
|
+
const params = [];
|
|
365
|
+
if (options.type) {
|
|
366
|
+
sql += ' WHERE type = ?';
|
|
367
|
+
params.push(options.type);
|
|
368
|
+
}
|
|
369
|
+
sql += ' ORDER BY mention_count DESC LIMIT ?';
|
|
370
|
+
params.push(limit);
|
|
371
|
+
return db.prepare(sql).all(...params).map(rowToEntity);
|
|
372
|
+
}
|
|
373
|
+
export async function getEntityGraphStats(t) {
|
|
374
|
+
ensureSchema(t);
|
|
375
|
+
const db = getDb(t, 'entityGraph');
|
|
376
|
+
const { count: totalEntities } = db.prepare('SELECT COUNT(*) as count FROM entities').get();
|
|
377
|
+
const { count: totalMentions } = db.prepare('SELECT COUNT(*) as count FROM entity_mentions').get();
|
|
378
|
+
const { count: totalRelations } = db.prepare('SELECT COUNT(*) as count FROM entity_relations').get();
|
|
379
|
+
const byTypeRows = db.prepare('SELECT type, COUNT(*) as count FROM entities GROUP BY type').all();
|
|
380
|
+
const byType = { person: 0, company: 0, project: 0, place: 0, topic: 0 };
|
|
381
|
+
for (const row of byTypeRows)
|
|
382
|
+
byType[row.type] = row.count;
|
|
383
|
+
return { totalEntities, totalMentions, totalRelations, byType };
|
|
384
|
+
}
|
|
385
|
+
export async function detectEntitiesInQuery(t, query) {
|
|
386
|
+
ensureSchema(t);
|
|
387
|
+
const db = getDb(t, 'entityGraph');
|
|
388
|
+
const allEntities = db.prepare(`
|
|
389
|
+
SELECT name, normalized_name, type FROM entities
|
|
390
|
+
WHERE type IN ('person', 'project', 'company')
|
|
391
|
+
ORDER BY mention_count DESC
|
|
392
|
+
`).all();
|
|
393
|
+
const detectedEntities = [];
|
|
394
|
+
let remainingQuery = query;
|
|
395
|
+
for (const entity of allEntities) {
|
|
396
|
+
const nameRegex = new RegExp(`\\b${escapeRegex(entity.name.toLowerCase())}\\b`, 'i');
|
|
397
|
+
const normalizedRegex = new RegExp(`\\b${escapeRegex(entity.normalized_name.toLowerCase())}\\b`, 'i');
|
|
398
|
+
if (nameRegex.test(query) || normalizedRegex.test(query)) {
|
|
399
|
+
detectedEntities.push(entity.name);
|
|
400
|
+
remainingQuery = remainingQuery.replace(nameRegex, '').replace(normalizedRegex, '');
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
remainingQuery = remainingQuery.replace(/\b(and|or|with|about)\b/gi, '').replace(/\s+/g, ' ').trim();
|
|
404
|
+
return { entities: detectedEntities, remainingQuery };
|
|
405
|
+
}
|
|
406
|
+
// ─── Merge + delete ───────────────────────────────────────────────────────────
|
|
407
|
+
export async function mergeEntities(t, keepId, removeId, reason, confidence, aiRationale, mergedBy) {
|
|
408
|
+
ensureSchema(t);
|
|
409
|
+
const db = getDb(t, 'entityGraph');
|
|
410
|
+
const keepEntity = db.prepare('SELECT * FROM entities WHERE id = ?').get(keepId);
|
|
411
|
+
const removeEntity = db.prepare('SELECT * FROM entities WHERE id = ?').get(removeId);
|
|
412
|
+
if (!keepEntity || !removeEntity)
|
|
413
|
+
throw new Error(`Entity not found: keep=${keepId} remove=${removeId}`);
|
|
414
|
+
let mentionsMoved = 0;
|
|
415
|
+
let relationsMoved = 0;
|
|
416
|
+
const doMerge = db.transaction(() => {
|
|
417
|
+
const mentionResult = db.prepare('UPDATE entity_mentions SET entity_id = ? WHERE entity_id = ?').run(keepId, removeId);
|
|
418
|
+
mentionsMoved = mentionResult.changes;
|
|
419
|
+
const entityExists = (id) => db.prepare('SELECT 1 FROM entities WHERE id = ?').get(id) !== undefined;
|
|
420
|
+
for (const rel of db.prepare('SELECT * FROM entity_relations WHERE source_id = ?').all(removeId)) {
|
|
421
|
+
const targetId = rel.targetId === removeId ? keepId : rel.targetId;
|
|
422
|
+
if (targetId === keepId || !entityExists(targetId))
|
|
423
|
+
continue;
|
|
424
|
+
const existing = db.prepare('SELECT 1 FROM entity_relations WHERE source_id = ? AND target_id = ?').get(keepId, targetId);
|
|
425
|
+
if (existing) {
|
|
426
|
+
db.prepare('UPDATE entity_relations SET strength = strength + ?, confidence = MAX(confidence, ?) WHERE source_id = ? AND target_id = ?')
|
|
427
|
+
.run(rel.strength, rel.confidence ?? 0.5, keepId, targetId);
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
db.prepare('INSERT INTO entity_relations (source_id, target_id, relationship, strength, confidence, method, rationale) VALUES (?, ?, ?, ?, ?, ?, ?)')
|
|
431
|
+
.run(keepId, targetId, rel.relationship, rel.strength, rel.confidence ?? 0.5, rel.method ?? 'merged', rel.rationale ?? null);
|
|
432
|
+
relationsMoved++;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
for (const rel of db.prepare('SELECT * FROM entity_relations WHERE target_id = ?').all(removeId)) {
|
|
436
|
+
const sourceId = rel.sourceId === removeId ? keepId : rel.sourceId;
|
|
437
|
+
if (sourceId === keepId || !entityExists(sourceId))
|
|
438
|
+
continue;
|
|
439
|
+
const existing = db.prepare('SELECT 1 FROM entity_relations WHERE source_id = ? AND target_id = ?').get(sourceId, keepId);
|
|
440
|
+
if (existing) {
|
|
441
|
+
db.prepare('UPDATE entity_relations SET strength = strength + ?, confidence = MAX(confidence, ?) WHERE source_id = ? AND target_id = ?')
|
|
442
|
+
.run(rel.strength, rel.confidence ?? 0.5, sourceId, keepId);
|
|
443
|
+
}
|
|
444
|
+
else {
|
|
445
|
+
db.prepare('INSERT INTO entity_relations (source_id, target_id, relationship, strength, confidence, method, rationale) VALUES (?, ?, ?, ?, ?, ?, ?)')
|
|
446
|
+
.run(sourceId, keepId, rel.relationship, rel.strength, rel.confidence ?? 0.5, rel.method ?? 'merged', rel.rationale ?? null);
|
|
447
|
+
relationsMoved++;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
db.prepare('DELETE FROM entity_relations WHERE source_id = ? OR target_id = ?').run(removeId, removeId);
|
|
451
|
+
db.prepare('DELETE FROM entity_relations WHERE source_id = ? AND target_id = ?').run(keepId, keepId);
|
|
452
|
+
const keepAliases = JSON.parse(keepEntity.aliases || '[]');
|
|
453
|
+
const removeAliases = JSON.parse(removeEntity.aliases || '[]');
|
|
454
|
+
const allAliases = new Set([...keepAliases, ...removeAliases, normalizeEntityName(removeEntity.name)]);
|
|
455
|
+
allAliases.delete(normalizeEntityName(keepEntity.name));
|
|
456
|
+
db.prepare('UPDATE entities SET aliases = ? WHERE id = ?').run(JSON.stringify([...allAliases]), keepId);
|
|
457
|
+
db.prepare(`
|
|
458
|
+
UPDATE entities SET
|
|
459
|
+
mention_count = mention_count + ?,
|
|
460
|
+
first_seen = MIN(first_seen, ?),
|
|
461
|
+
last_seen = MAX(last_seen, ?)
|
|
462
|
+
WHERE id = ?
|
|
463
|
+
`).run(removeEntity.mention_count, removeEntity.first_seen, removeEntity.last_seen, keepId);
|
|
464
|
+
db.prepare(`
|
|
465
|
+
INSERT INTO entity_merges (keep_id, remove_id, keep_name, remove_name, keep_type, remove_type, reason, confidence, ai_rationale, mentions_moved, relations_moved, merged_by)
|
|
466
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
467
|
+
`).run(keepId, removeId, keepEntity.name, removeEntity.name, keepEntity.type, removeEntity.type, reason, confidence ?? null, aiRationale ?? null, mentionsMoved, relationsMoved, mergedBy ?? 'sleep:entity-hygiene');
|
|
468
|
+
db.prepare('DELETE FROM entities WHERE id = ?').run(removeId);
|
|
469
|
+
});
|
|
470
|
+
doMerge();
|
|
471
|
+
return { mentionsMoved, relationsMoved };
|
|
472
|
+
}
|
|
473
|
+
export async function deleteEntity(t, entityId, reason, mergedBy) {
|
|
474
|
+
ensureSchema(t);
|
|
475
|
+
const db = getDb(t, 'entityGraph');
|
|
476
|
+
const entity = db.prepare('SELECT * FROM entities WHERE id = ?').get(entityId);
|
|
477
|
+
if (!entity)
|
|
478
|
+
return;
|
|
479
|
+
const doDelete = db.transaction(() => {
|
|
480
|
+
const mentionCount = db.prepare('SELECT COUNT(*) as c FROM entity_mentions WHERE entity_id = ?').get(entityId).c;
|
|
481
|
+
const relCount = db.prepare('SELECT COUNT(*) as c FROM entity_relations WHERE source_id = ? OR target_id = ?').get(entityId, entityId).c;
|
|
482
|
+
db.prepare('DELETE FROM entity_mentions WHERE entity_id = ?').run(entityId);
|
|
483
|
+
db.prepare('DELETE FROM entity_relations WHERE source_id = ? OR target_id = ?').run(entityId, entityId);
|
|
484
|
+
db.prepare('DELETE FROM entities WHERE id = ?').run(entityId);
|
|
485
|
+
db.prepare(`
|
|
486
|
+
INSERT INTO entity_merges (keep_id, remove_id, keep_name, remove_name, keep_type, remove_type, reason, mentions_moved, relations_moved, merged_by)
|
|
487
|
+
VALUES (0, ?, NULL, ?, NULL, ?, ?, ?, ?, ?)
|
|
488
|
+
`).run(entityId, entity.name, entity.type, reason, mentionCount, relCount, mergedBy ?? 'sleep:entity-hygiene');
|
|
489
|
+
});
|
|
490
|
+
doDelete();
|
|
491
|
+
}
|
|
492
|
+
// ─── Entity profiles ──────────────────────────────────────────────────────────
|
|
493
|
+
export async function getEntityProfile(t, entityId) {
|
|
494
|
+
ensureSchema(t);
|
|
495
|
+
const db = getDb(t, 'entityGraph');
|
|
496
|
+
const row = db.prepare('SELECT profile, generated_at, fact_count FROM entity_profiles WHERE entity_id = ?')
|
|
497
|
+
.get(entityId);
|
|
498
|
+
if (!row)
|
|
499
|
+
return null;
|
|
500
|
+
return { profile: row.profile, generatedAt: row.generated_at, factCount: row.fact_count };
|
|
501
|
+
}
|
|
502
|
+
export async function saveEntityProfile(t, entityId, profile, factCount) {
|
|
503
|
+
ensureSchema(t);
|
|
504
|
+
const db = getDb(t, 'entityGraph');
|
|
505
|
+
db.prepare(`
|
|
506
|
+
INSERT INTO entity_profiles (entity_id, profile, generated_at, fact_count)
|
|
507
|
+
VALUES (?, ?, datetime('now'), ?)
|
|
508
|
+
ON CONFLICT(entity_id) DO UPDATE SET
|
|
509
|
+
profile = excluded.profile,
|
|
510
|
+
generated_at = excluded.generated_at,
|
|
511
|
+
fact_count = excluded.fact_count
|
|
512
|
+
`).run(entityId, profile, factCount);
|
|
513
|
+
}
|
|
514
|
+
// ─── Contradictions ───────────────────────────────────────────────────────────
|
|
515
|
+
export async function createContradiction(t, entityId, factAId, factBId, factA, factB, description) {
|
|
516
|
+
ensureSchema(t);
|
|
517
|
+
const db = getDb(t, 'entityGraph');
|
|
518
|
+
const result = db.prepare(`
|
|
519
|
+
INSERT INTO contradictions (entity_id, fact_a_id, fact_b_id, fact_a, fact_b, description)
|
|
520
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
521
|
+
`).run(entityId, factAId, factBId, factA, factB, description);
|
|
522
|
+
return result.lastInsertRowid;
|
|
523
|
+
}
|
|
524
|
+
export async function getOpenContradictions(t, entityId) {
|
|
525
|
+
ensureSchema(t);
|
|
526
|
+
const db = getDb(t, 'entityGraph');
|
|
527
|
+
const rows = db.prepare(`SELECT * FROM contradictions WHERE entity_id = ? AND status = 'open'`).all(entityId);
|
|
528
|
+
return rows.map(r => ({
|
|
529
|
+
id: r.id, entityId: r.entity_id ?? undefined, factAId: r.fact_a_id ?? undefined,
|
|
530
|
+
factBId: r.fact_b_id ?? undefined, factA: r.fact_a ?? undefined, factB: r.fact_b ?? undefined,
|
|
531
|
+
description: r.description ?? undefined, status: r.status,
|
|
532
|
+
resolvedBy: r.resolved_by ?? undefined, createdAt: r.created_at,
|
|
533
|
+
}));
|
|
534
|
+
}
|
|
535
|
+
export async function resolveContradiction(t, contradictionId, resolvedBy) {
|
|
536
|
+
ensureSchema(t);
|
|
537
|
+
const db = getDb(t, 'entityGraph');
|
|
538
|
+
db.prepare(`UPDATE contradictions SET status = 'resolved', resolved_by = ? WHERE id = ?`).run(resolvedBy, contradictionId);
|
|
539
|
+
}
|
|
540
|
+
export async function applyContradictions(t, entityId, factIds) {
|
|
541
|
+
// Placeholder: contradiction application logic is in fact-contradiction module (Day 3).
|
|
542
|
+
// This stub marks contradictions as resolved when caller provides the winning fact ids.
|
|
543
|
+
ensureSchema(t);
|
|
544
|
+
const db = getDb(t, 'entityGraph');
|
|
545
|
+
if (factIds.length > 0) {
|
|
546
|
+
db.prepare(`UPDATE contradictions SET status = 'resolved', resolved_by = 'sleep:observe' WHERE entity_id = ? AND status = 'open'`)
|
|
547
|
+
.run(entityId);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
// ─── Entity insights ──────────────────────────────────────────────────────────
|
|
551
|
+
export async function saveEntityInsight(t, entityId, insightType, insight, reasoning, confidence, sourceEntityIds = [], expiresAt) {
|
|
552
|
+
ensureSchema(t);
|
|
553
|
+
const db = getDb(t, 'entityGraph');
|
|
554
|
+
const result = db.prepare(`
|
|
555
|
+
INSERT INTO entity_insights (entity_id, insight_type, insight, reasoning, confidence, source_entity_ids, expires_at)
|
|
556
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
557
|
+
`).run(entityId, insightType, insight, reasoning, confidence, JSON.stringify(sourceEntityIds), expiresAt ?? null);
|
|
558
|
+
return result.lastInsertRowid;
|
|
559
|
+
}
|
|
560
|
+
export async function getEntityInsights(t, entityId, minConfidence = 0.60) {
|
|
561
|
+
ensureSchema(t);
|
|
562
|
+
const db = getDb(t, 'entityGraph');
|
|
563
|
+
const rows = db.prepare(`
|
|
564
|
+
SELECT * FROM entity_insights
|
|
565
|
+
WHERE entity_id = ? AND is_stale = 0 AND confidence >= ?
|
|
566
|
+
AND (expires_at IS NULL OR expires_at > datetime('now'))
|
|
567
|
+
ORDER BY confidence DESC, created_at DESC
|
|
568
|
+
`).all(entityId, minConfidence);
|
|
569
|
+
return rows.map(rowToInsight);
|
|
570
|
+
}
|
|
571
|
+
export async function markInsightsStale(t, entityId) {
|
|
572
|
+
ensureSchema(t);
|
|
573
|
+
const db = getDb(t, 'entityGraph');
|
|
574
|
+
db.prepare('UPDATE entity_insights SET is_stale = 1 WHERE entity_id = ?').run(entityId);
|
|
575
|
+
}
|
|
576
|
+
export async function getEntitiesForReasoning(t, limit = 5, staleDays = 7, recencyDays = 14) {
|
|
577
|
+
ensureSchema(t);
|
|
578
|
+
const db = getDb(t, 'entityGraph');
|
|
579
|
+
return db.prepare(`
|
|
580
|
+
SELECT id, name, type FROM entities
|
|
581
|
+
WHERE mention_count >= 3
|
|
582
|
+
AND (last_reasoned_at IS NULL OR last_reasoned_at < datetime('now', ?))
|
|
583
|
+
AND (last_seen IS NULL OR last_seen > datetime('now', ?))
|
|
584
|
+
ORDER BY mention_count DESC
|
|
585
|
+
LIMIT ?
|
|
586
|
+
`).all(`-${staleDays} days`, `-${recencyDays} days`, limit);
|
|
587
|
+
}
|
|
588
|
+
export async function markEntityReasoned(t, entityId) {
|
|
589
|
+
ensureSchema(t);
|
|
590
|
+
const db = getDb(t, 'entityGraph');
|
|
591
|
+
db.prepare(`UPDATE entities SET last_reasoned_at = datetime('now') WHERE id = ?`).run(entityId);
|
|
592
|
+
}
|
|
593
|
+
// ─── Pin operations ───────────────────────────────────────────────────────────
|
|
594
|
+
export async function pinEntity(t, entityId, pinned = true) {
|
|
595
|
+
ensureSchema(t);
|
|
596
|
+
const db = getDb(t, 'entityGraph');
|
|
597
|
+
db.prepare('UPDATE entities SET is_pinned = ? WHERE id = ?').run(pinned ? 1 : 0, entityId);
|
|
598
|
+
}
|
|
599
|
+
export async function listPinned(t, type) {
|
|
600
|
+
ensureSchema(t);
|
|
601
|
+
const db = getDb(t, 'entityGraph');
|
|
602
|
+
let sql = 'SELECT * FROM entities WHERE is_pinned = 1';
|
|
603
|
+
const params = [];
|
|
604
|
+
if (type) {
|
|
605
|
+
sql += ' AND type = ?';
|
|
606
|
+
params.push(type);
|
|
607
|
+
}
|
|
608
|
+
sql += ' ORDER BY last_seen DESC';
|
|
609
|
+
return db.prepare(sql).all(...params).map(rowToEntity);
|
|
610
|
+
}
|
|
611
|
+
//# sourceMappingURL=entity-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-graph.js","sourceRoot":"","sources":["../src/entity-graph.ts"],"names":[],"mappings":"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"}
|