mnueron 0.2.0 → 0.4.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-extractor.js","sourceRoot":"","sources":["../../src/store/entity-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,378 @@
1
+ // ─────────────────────────────────────────────────────────────────────────────
2
+ // P2.3 — Local SQLite entity resolution.
3
+ //
4
+ // Mirrors the hosted resolver (ai-boilerplate-pro/src/lib/entity-resolver.ts)
5
+ // but with one strategic change: where the hosted impl uses pg_trgm for
6
+ // fuzzy match, the local impl uses EMBEDDING SIMILARITY via sqlite-vec.
7
+ // We have @xenova/transformers running locally anyway, so the embedding is
8
+ // "free" (no API call). Embeddings are also more semantically robust than
9
+ // trigrams — "JS" and "JavaScript" cluster as the same entity by embedding
10
+ // where pg_trgm would treat them as totally different strings.
11
+ //
12
+ // Resolution pipeline:
13
+ // 1. Exact lowercase-name match (instant short-circuit, similarity = 1.0).
14
+ // 2. Embedding vector search: top-K candidates by cosine.
15
+ // 3. similarity ≥ HIGH (0.85) and matching type → reuse the canonical.
16
+ // 4. similarity in [AMBIGUOUS_LOW, HIGH) → batch LLM tiebreak (Haiku or
17
+ // gpt-4o-mini depending on which key is set).
18
+ // 5. Otherwise → create a new canonical entity.
19
+ //
20
+ // Fail-open: every error path returns null/empty for that specific entity.
21
+ // The memory save still succeeds. Resolution can be re-run later via
22
+ // `mnueron entities backfill`.
23
+ //
24
+ // IMPORTANT — TIER GATING (LOCAL vs HOSTED):
25
+ // This is the LOCAL resolver. The LLM tiebreak falls through to
26
+ // process.env keys unconditionally because the operator IS the user.
27
+ // When mirroring this to the hosted backend, the env fallback MUST be
28
+ // gated by `allowServerKey` (paid-tier only). See hosted entity-resolver
29
+ // for the existing pattern; free orgs without BYOK fall through to
30
+ // "create new" instead of consuming server LLM budget.
31
+ // ─────────────────────────────────────────────────────────────────────────────
32
+ import { randomUUID } from 'node:crypto';
33
+ import { embed } from './embeddings.js';
34
+ /** Cosine ≥ this on type-match → auto-resolve to the candidate. */
35
+ const HIGH_CONFIDENCE_THRESHOLD = 0.85;
36
+ /** Cosine ≥ this but below HIGH → ambiguous, send to LLM tiebreak. */
37
+ const AMBIGUOUS_THRESHOLD = 0.65;
38
+ /** Top-K candidates considered per entity. */
39
+ const TIEBREAK_MAX_CANDIDATES = 3;
40
+ const ANTHROPIC_MODEL = 'claude-haiku-4-5';
41
+ const OPENAI_MODEL = 'gpt-4o-mini';
42
+ const TIMEOUT_MS = 30000;
43
+ /**
44
+ * Resolve every entity in `extracted` against the canonical entity store.
45
+ * Returns the resolutions in the same order as `extracted`. Also writes
46
+ * memory_entities edges and bumps mention bookkeeping.
47
+ */
48
+ export async function resolveEntitiesForMemory(db, memoryId, extracted, vecAvailable, opts = {}) {
49
+ if (extracted.length === 0)
50
+ return [];
51
+ const resolutions = new Array(extracted.length).fill(null);
52
+ const ambiguousIdxs = [];
53
+ const ambiguousCandidates = [];
54
+ for (let i = 0; i < extracted.length; i++) {
55
+ const ent = extracted[i];
56
+ if (!ent.name)
57
+ continue;
58
+ // Stage 1 — exact match short-circuit.
59
+ const exact = findExactMatch(db, ent.name, ent.type);
60
+ if (exact) {
61
+ resolutions[i] = { canonical_id: exact.id, confidence: 1.0, created: false };
62
+ continue;
63
+ }
64
+ // Stage 2 — embedding similarity (only if sqlite-vec is loaded).
65
+ if (vecAvailable) {
66
+ const candidates = await findEmbeddingCandidates(db, ent);
67
+ const top = candidates[0];
68
+ if (top && top.similarity >= HIGH_CONFIDENCE_THRESHOLD) {
69
+ resolutions[i] = {
70
+ canonical_id: top.entity.id,
71
+ confidence: top.similarity,
72
+ created: false,
73
+ };
74
+ continue;
75
+ }
76
+ if (top && top.similarity >= AMBIGUOUS_THRESHOLD) {
77
+ ambiguousIdxs.push(i);
78
+ ambiguousCandidates.push(candidates);
79
+ continue;
80
+ }
81
+ }
82
+ }
83
+ // Stage 4 — LLM tiebreak for ambiguous batch.
84
+ const wantsLLM = opts.allowLLMTiebreak !== false;
85
+ if (wantsLLM && ambiguousIdxs.length > 0) {
86
+ const decisions = await tiebreakWithLLM(ambiguousIdxs.map((idx, k) => ({
87
+ entity: extracted[idx],
88
+ candidates: ambiguousCandidates[k],
89
+ })), opts.anthropicKey);
90
+ for (let k = 0; k < ambiguousIdxs.length; k++) {
91
+ const decision = decisions[k];
92
+ const idx = ambiguousIdxs[k];
93
+ if (decision && decision !== 'new') {
94
+ const matched = ambiguousCandidates[k].find((c) => c.entity.id === decision);
95
+ if (matched) {
96
+ resolutions[idx] = {
97
+ canonical_id: matched.entity.id,
98
+ confidence: matched.similarity,
99
+ created: false,
100
+ };
101
+ }
102
+ }
103
+ }
104
+ }
105
+ // Stage 5 — create new canonicals for anything still null.
106
+ for (let i = 0; i < extracted.length; i++) {
107
+ if (resolutions[i] !== null)
108
+ continue;
109
+ if (!extracted[i].name)
110
+ continue;
111
+ try {
112
+ const created = await createCanonicalEntity(db, extracted[i], vecAvailable);
113
+ resolutions[i] = { canonical_id: created.id, confidence: 1.0, created: true };
114
+ }
115
+ catch (e) {
116
+ console.warn('[mnueron/entity-resolver] createCanonical failed for', extracted[i].name, ':', e instanceof Error ? e.message : e);
117
+ }
118
+ }
119
+ // Stage 6 — bookkeeping: bump mention_count, last_seen_at, aliases.
120
+ bumpReusedEntities(db, extracted, resolutions);
121
+ // Stage 7 — insert memory_entities edges in one batch.
122
+ linkMemoryToEntities(db, memoryId, extracted, resolutions);
123
+ return resolutions;
124
+ }
125
+ // ── Match strategies ────────────────────────────────────────────────────────
126
+ function findExactMatch(db, name, type) {
127
+ const row = db
128
+ .prepare(`SELECT id, display_name, entity_type, aliases_json,
129
+ mention_count, first_seen_at, last_seen_at
130
+ FROM entities
131
+ WHERE lower(display_name) = lower(?)
132
+ AND entity_type = ?
133
+ LIMIT 1`)
134
+ .get(name, type);
135
+ return row ?? null;
136
+ }
137
+ async function findEmbeddingCandidates(db, entity) {
138
+ const probe = `${entity.name}${entity.context ? ' :: ' + entity.context : ''}`;
139
+ const vec = await embed(probe);
140
+ if (!vec)
141
+ return [];
142
+ const rows = db
143
+ .prepare(`SELECT entities_vec.entity_id AS id,
144
+ entities_vec.distance AS distance,
145
+ e.display_name, e.entity_type, e.aliases_json,
146
+ e.mention_count, e.first_seen_at, e.last_seen_at
147
+ FROM entities_vec
148
+ JOIN entities e ON e.id = entities_vec.entity_id
149
+ WHERE embedding MATCH ?
150
+ AND k = ?
151
+ ORDER BY distance ASC`)
152
+ .all(Buffer.from(vec.buffer), 10);
153
+ const matches = rows
154
+ .filter((r) => r.entity_type === entity.type)
155
+ .map((r) => ({
156
+ entity: {
157
+ id: r.id,
158
+ display_name: r.display_name,
159
+ entity_type: r.entity_type,
160
+ aliases_json: r.aliases_json,
161
+ mention_count: r.mention_count,
162
+ first_seen_at: r.first_seen_at,
163
+ last_seen_at: r.last_seen_at,
164
+ },
165
+ similarity: clamp(1 - (r.distance * r.distance) / 2, 0, 1),
166
+ }));
167
+ return matches.slice(0, TIEBREAK_MAX_CANDIDATES);
168
+ }
169
+ // ── Mutations ───────────────────────────────────────────────────────────────
170
+ async function createCanonicalEntity(db, entity, vecAvailable) {
171
+ const id = randomUUID();
172
+ const now = Date.now();
173
+ db.prepare(`INSERT INTO entities
174
+ (id, display_name, entity_type, aliases_json, mention_count, first_seen_at, last_seen_at)
175
+ VALUES (?, ?, ?, ?, 1, ?, ?)`).run(id, entity.name, entity.type, JSON.stringify([entity.name]), now, now);
176
+ if (vecAvailable) {
177
+ const probe = `${entity.name}${entity.context ? ' :: ' + entity.context : ''}`;
178
+ const vec = await embed(probe);
179
+ if (vec) {
180
+ db.prepare(`INSERT INTO entities_vec (entity_id, embedding) VALUES (?, ?)`).run(id, Buffer.from(vec.buffer));
181
+ }
182
+ }
183
+ return { id };
184
+ }
185
+ function bumpReusedEntities(db, extracted, resolutions) {
186
+ const now = Date.now();
187
+ const update = db.prepare(`UPDATE entities
188
+ SET mention_count = mention_count + 1,
189
+ last_seen_at = ?,
190
+ aliases_json = (
191
+ SELECT json_group_array(DISTINCT value)
192
+ FROM (
193
+ SELECT value FROM json_each(aliases_json)
194
+ UNION ALL
195
+ SELECT ?
196
+ )
197
+ )
198
+ WHERE id = ?
199
+ AND entity_type = ?`);
200
+ const tx = db.transaction(() => {
201
+ for (let i = 0; i < extracted.length; i++) {
202
+ const r = resolutions[i];
203
+ if (!r || r.created)
204
+ continue;
205
+ update.run(now, extracted[i].name, r.canonical_id, extracted[i].type);
206
+ }
207
+ });
208
+ tx();
209
+ }
210
+ function linkMemoryToEntities(db, memoryId, extracted, resolutions) {
211
+ const stmt = db.prepare(`INSERT INTO memory_entities (memory_id, entity_id, surface_form, confidence)
212
+ VALUES (?, ?, ?, ?)
213
+ ON CONFLICT(memory_id, entity_id) DO UPDATE SET
214
+ confidence = MAX(memory_entities.confidence, excluded.confidence)`);
215
+ const tx = db.transaction(() => {
216
+ for (let i = 0; i < extracted.length; i++) {
217
+ const r = resolutions[i];
218
+ if (!r)
219
+ continue;
220
+ stmt.run(memoryId, r.canonical_id, extracted[i].name, r.confidence);
221
+ }
222
+ });
223
+ tx();
224
+ }
225
+ /**
226
+ * Batch tiebreak. Provider precedence:
227
+ * 1. BYOK anthropicKey → Haiku
228
+ * 2. env ANTHROPIC_API_KEY → Haiku
229
+ * 3. env OPENAI_API_KEY → gpt-4o-mini
230
+ * 4. none → all "new" (graceful degradation)
231
+ */
232
+ async function tiebreakWithLLM(cases, byokKey) {
233
+ const anthropicKey = byokKey || process.env.ANTHROPIC_API_KEY;
234
+ const openaiKey = process.env.OPENAI_API_KEY;
235
+ if (!anthropicKey && !openaiKey)
236
+ return cases.map(() => 'new');
237
+ const numbered = cases
238
+ .map((c, i) => {
239
+ const cands = c.candidates
240
+ .map((cand, j) => {
241
+ let aliases = [];
242
+ try {
243
+ aliases = JSON.parse(cand.entity.aliases_json);
244
+ }
245
+ catch { /* */ }
246
+ return ` [${j}] ${cand.entity.display_name} (${cand.entity.entity_type}, aliases: ${aliases.slice(0, 4).join(', ')})`;
247
+ })
248
+ .join('\n');
249
+ const ctx = c.entity.context ? `\n context: ${c.entity.context}` : '';
250
+ return `Case ${i}:\n New mention: "${c.entity.name}" (${c.entity.type})${ctx}\n Candidates:\n${cands}`;
251
+ })
252
+ .join('\n\n');
253
+ const system = 'You disambiguate entity mentions for a memory store. For each Case, ' +
254
+ 'decide whether the new mention refers to one of the listed Candidates ' +
255
+ 'or is a brand new entity. Reply with strict JSON.\n\n' +
256
+ 'Schema: { "decisions": [{"case": <int>, "match": <int|"new">}, ...] }\n' +
257
+ 'For each case, set "match" to the candidate index (0, 1, 2) if same entity, ' +
258
+ 'or "new" if none match. Be conservative — only merge when confident.';
259
+ if (anthropicKey) {
260
+ const result = await tiebreakViaAnthropic(numbered, system, anthropicKey, cases);
261
+ if (result)
262
+ return result;
263
+ }
264
+ if (openaiKey) {
265
+ const result = await tiebreakViaOpenAI(numbered, system, openaiKey, cases);
266
+ if (result)
267
+ return result;
268
+ }
269
+ return cases.map(() => 'new');
270
+ }
271
+ async function tiebreakViaAnthropic(numbered, system, apiKey, cases) {
272
+ const ctrl = new AbortController();
273
+ const timer = setTimeout(() => ctrl.abort(), TIMEOUT_MS);
274
+ try {
275
+ const resp = await fetch('https://api.anthropic.com/v1/messages', {
276
+ method: 'POST',
277
+ headers: {
278
+ 'x-api-key': apiKey,
279
+ 'anthropic-version': '2023-06-01',
280
+ 'Content-Type': 'application/json',
281
+ },
282
+ body: JSON.stringify({
283
+ model: ANTHROPIC_MODEL,
284
+ max_tokens: 800,
285
+ temperature: 0.0,
286
+ system,
287
+ messages: [{ role: 'user', content: numbered }],
288
+ }),
289
+ signal: ctrl.signal,
290
+ });
291
+ if (!resp.ok)
292
+ return null;
293
+ const data = (await resp.json());
294
+ const text = (data.content ?? [])
295
+ .filter((b) => b.type === 'text')
296
+ .map((b) => b.text ?? '')
297
+ .join('');
298
+ return parseDecisions(text, cases);
299
+ }
300
+ catch (e) {
301
+ console.warn('[mnueron/entity-resolver/anthropic] tiebreak failed:', e instanceof Error ? e.message : e);
302
+ return null;
303
+ }
304
+ finally {
305
+ clearTimeout(timer);
306
+ }
307
+ }
308
+ async function tiebreakViaOpenAI(numbered, system, apiKey, cases) {
309
+ const ctrl = new AbortController();
310
+ const timer = setTimeout(() => ctrl.abort(), TIMEOUT_MS);
311
+ try {
312
+ const resp = await fetch('https://api.openai.com/v1/chat/completions', {
313
+ method: 'POST',
314
+ headers: {
315
+ Authorization: 'Bearer ' + apiKey,
316
+ 'Content-Type': 'application/json',
317
+ },
318
+ body: JSON.stringify({
319
+ model: OPENAI_MODEL,
320
+ max_tokens: 800,
321
+ temperature: 0.0,
322
+ response_format: { type: 'json_object' },
323
+ messages: [
324
+ { role: 'system', content: system },
325
+ { role: 'user', content: numbered },
326
+ ],
327
+ }),
328
+ signal: ctrl.signal,
329
+ });
330
+ if (!resp.ok)
331
+ return null;
332
+ const data = (await resp.json());
333
+ return parseDecisions(data.choices?.[0]?.message?.content ?? '', cases);
334
+ }
335
+ catch (e) {
336
+ console.warn('[mnueron/entity-resolver/openai] tiebreak failed:', e instanceof Error ? e.message : e);
337
+ return null;
338
+ }
339
+ finally {
340
+ clearTimeout(timer);
341
+ }
342
+ }
343
+ function parseDecisions(raw, cases) {
344
+ const out = cases.map(() => 'new');
345
+ let s = raw.trim();
346
+ if (s.startsWith('```'))
347
+ s = s.replace(/^```(?:json)?\s*/i, '').replace(/\s*```$/i, '');
348
+ const start = s.search(/[\[{]/);
349
+ if (start > 0)
350
+ s = s.slice(start);
351
+ try {
352
+ const parsed = JSON.parse(s);
353
+ for (const d of parsed.decisions ?? []) {
354
+ if (typeof d.case !== 'number')
355
+ continue;
356
+ if (d.case < 0 || d.case >= cases.length)
357
+ continue;
358
+ const m = d.match;
359
+ if (m === 'new' || m == null) {
360
+ out[d.case] = 'new';
361
+ }
362
+ else if (typeof m === 'number' &&
363
+ m >= 0 &&
364
+ m < cases[d.case].candidates.length) {
365
+ out[d.case] = cases[d.case].candidates[m].entity.id;
366
+ }
367
+ }
368
+ }
369
+ catch {
370
+ // Stay on default — all "new".
371
+ }
372
+ return out;
373
+ }
374
+ // ── Utility ─────────────────────────────────────────────────────────────────
375
+ function clamp(n, lo, hi) {
376
+ return n < lo ? lo : n > hi ? hi : n;
377
+ }
378
+ //# sourceMappingURL=entity-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-resolver.js","sourceRoot":"","sources":["../../src/store/entity-resolver.ts"],"names":[],"mappings":"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"}