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.
- package/README.md +123 -1
- package/dashboard/index.html +38 -0
- package/dist/cli.js +1187 -1
- package/dist/cli.js.map +1 -1
- package/dist/dashboard/server.js +186 -2
- package/dist/dashboard/server.js.map +1 -1
- package/dist/detectors/claude_desktop.js +79 -22
- package/dist/detectors/claude_desktop.js.map +1 -1
- package/dist/import/claude_cowork.js +359 -0
- package/dist/import/claude_cowork.js.map +1 -0
- package/dist/import/claude_desktop.js +196 -0
- package/dist/import/claude_desktop.js.map +1 -0
- package/dist/store/consolidator.js +168 -0
- package/dist/store/consolidator.js.map +1 -0
- package/dist/store/entity-extractor.js +283 -0
- package/dist/store/entity-extractor.js.map +1 -0
- package/dist/store/entity-resolver.js +378 -0
- package/dist/store/entity-resolver.js.map +1 -0
- package/dist/store/local.js +666 -17
- package/dist/store/local.js.map +1 -1
- package/dist/store/procedural.js +328 -0
- package/dist/store/procedural.js.map +1 -0
- package/dist/store/relation-extractor.js +292 -0
- package/dist/store/relation-extractor.js.map +1 -0
- package/dist/store/remote.js +182 -20
- package/dist/store/remote.js.map +1 -1
- package/dist/tools.js +84 -0
- package/dist/tools.js.map +1 -1
- package/dist/watch/cowork.js +137 -0
- package/dist/watch/cowork.js.map +1 -0
- package/package.json +1 -1
|
@@ -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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"}
|