ai-mind-map 1.1.3 → 1.4.1

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.
Files changed (61) hide show
  1. package/README.md +74 -41
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +52 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js +3 -0
  7. package/dist/config.js.map +1 -1
  8. package/dist/index.js +273 -23
  9. package/dist/index.js.map +1 -1
  10. package/dist/install.d.ts.map +1 -1
  11. package/dist/install.js +80 -66
  12. package/dist/install.js.map +1 -1
  13. package/dist/knowledge-graph/changelog.d.ts +175 -0
  14. package/dist/knowledge-graph/changelog.d.ts.map +1 -0
  15. package/dist/knowledge-graph/changelog.js +509 -0
  16. package/dist/knowledge-graph/changelog.js.map +1 -0
  17. package/dist/knowledge-graph/graph.d.ts +40 -0
  18. package/dist/knowledge-graph/graph.d.ts.map +1 -1
  19. package/dist/knowledge-graph/graph.js +73 -10
  20. package/dist/knowledge-graph/graph.js.map +1 -1
  21. package/dist/knowledge-graph/indexer.d.ts +15 -0
  22. package/dist/knowledge-graph/indexer.d.ts.map +1 -1
  23. package/dist/knowledge-graph/indexer.js +155 -34
  24. package/dist/knowledge-graph/indexer.js.map +1 -1
  25. package/dist/knowledge-graph/parser.d.ts +11 -0
  26. package/dist/knowledge-graph/parser.d.ts.map +1 -1
  27. package/dist/knowledge-graph/parser.js +70 -11
  28. package/dist/knowledge-graph/parser.js.map +1 -1
  29. package/dist/knowledge-graph/semantic-search.d.ts +166 -0
  30. package/dist/knowledge-graph/semantic-search.d.ts.map +1 -0
  31. package/dist/knowledge-graph/semantic-search.js +601 -0
  32. package/dist/knowledge-graph/semantic-search.js.map +1 -0
  33. package/dist/memory/shared-sync.d.ts +47 -0
  34. package/dist/memory/shared-sync.d.ts.map +1 -0
  35. package/dist/memory/shared-sync.js +219 -0
  36. package/dist/memory/shared-sync.js.map +1 -0
  37. package/dist/tools/advanced-tools.d.ts +2 -1
  38. package/dist/tools/advanced-tools.d.ts.map +1 -1
  39. package/dist/tools/advanced-tools.js +38 -1
  40. package/dist/tools/advanced-tools.js.map +1 -1
  41. package/dist/tools/digest-tools.d.ts +15 -0
  42. package/dist/tools/digest-tools.d.ts.map +1 -0
  43. package/dist/tools/digest-tools.js +332 -0
  44. package/dist/tools/digest-tools.js.map +1 -0
  45. package/dist/tools/semantic-tools.d.ts +20 -0
  46. package/dist/tools/semantic-tools.d.ts.map +1 -0
  47. package/dist/tools/semantic-tools.js +141 -0
  48. package/dist/tools/semantic-tools.js.map +1 -0
  49. package/dist/tools/session-tools.d.ts +17 -0
  50. package/dist/tools/session-tools.d.ts.map +1 -0
  51. package/dist/tools/session-tools.js +233 -0
  52. package/dist/tools/session-tools.js.map +1 -0
  53. package/dist/tools/smart-tools.d.ts +2 -1
  54. package/dist/tools/smart-tools.d.ts.map +1 -1
  55. package/dist/tools/smart-tools.js +55 -3
  56. package/dist/tools/smart-tools.js.map +1 -1
  57. package/dist/types.d.ts +6 -0
  58. package/dist/types.d.ts.map +1 -1
  59. package/dist/types.js +3 -0
  60. package/dist/types.js.map +1 -1
  61. package/package.json +9 -3
@@ -0,0 +1,601 @@
1
+ /**
2
+ * AI Mind Map — Semantic Search Engine
3
+ *
4
+ * Provides TF-IDF-based semantic search with synonym expansion for
5
+ * concept-level code search. Enables queries like "save user preferences"
6
+ * to find `persistSettings()`.
7
+ *
8
+ * Architecture:
9
+ * 1. Tokenizer: CamelCase/snake_case-aware word splitting
10
+ * 2. Synonym Dictionary: 35 programming concept synonym groups
11
+ * 3. TF-IDF Vectorizer: Term frequency × Inverse document frequency
12
+ * 4. Cosine Similarity: Ranked semantic search results
13
+ *
14
+ * All data stored in SQLite (same DB as the knowledge graph).
15
+ * Zero additional dependencies required.
16
+ */
17
+ // ============================================================
18
+ // Programming Synonym Dictionary (35 Groups)
19
+ // ============================================================
20
+ /**
21
+ * Bidirectional synonym lookup for programming concepts.
22
+ * Each group represents a common programming concept where
23
+ * any term should match the others during search.
24
+ */
25
+ const SYNONYM_GROUPS = [
26
+ // 1. Save/Persist
27
+ ['save', 'persist', 'store', 'write', 'commit', 'flush', 'dump', 'serialize'],
28
+ // 2. Read/Load
29
+ ['read', 'load', 'fetch', 'get', 'retrieve', 'pull', 'obtain', 'acquire'],
30
+ // 3. Auth/Login
31
+ ['auth', 'login', 'authenticate', 'signin', 'logon', 'sso', 'credentials'],
32
+ // 4. Permission/Access
33
+ ['authorize', 'permission', 'access', 'acl', 'rbac', 'role', 'privilege', 'grant'],
34
+ // 5. Delete/Remove
35
+ ['delete', 'remove', 'destroy', 'drop', 'erase', 'purge', 'unlink', 'discard'],
36
+ // 6. Create/New
37
+ ['create', 'add', 'insert', 'register', 'init', 'initialize', 'instantiate', 'make', 'build'],
38
+ // 7. Update/Modify
39
+ ['update', 'modify', 'edit', 'patch', 'change', 'alter', 'mutate', 'set'],
40
+ // 8. Search/Find
41
+ ['search', 'find', 'query', 'lookup', 'filter', 'scan', 'match', 'grep', 'locate'],
42
+ // 9. List/Enumerate
43
+ ['list', 'enumerate', 'index', 'catalog', 'browse', 'getall', 'fetchall'],
44
+ // 10. Send/Emit
45
+ ['send', 'emit', 'dispatch', 'broadcast', 'publish', 'push', 'notify', 'fire', 'trigger'],
46
+ // 11. Receive/Listen
47
+ ['receive', 'listen', 'subscribe', 'handle', 'consume', 'observe', 'watch'],
48
+ // 12. Error/Exception
49
+ ['error', 'exception', 'fault', 'failure', 'issue', 'problem', 'crash'],
50
+ // 13. Config/Settings
51
+ ['config', 'configuration', 'settings', 'preferences', 'options', 'params', 'env', 'properties'],
52
+ // 14. Log/Trace
53
+ ['log', 'trace', 'debug', 'print', 'console', 'output', 'record', 'audit'],
54
+ // 15. Cache/Buffer
55
+ ['cache', 'buffer', 'memo', 'memoize', 'preload', 'prefetch', 'pool'],
56
+ // 16. Validate/Check
57
+ ['validate', 'check', 'verify', 'assert', 'ensure', 'sanitize', 'lint'],
58
+ // 17. Parse/Decode
59
+ ['parse', 'decode', 'deserialize', 'unmarshal', 'extract', 'interpret', 'tokenize'],
60
+ // 18. Format/Encode
61
+ ['format', 'encode', 'marshal', 'stringify', 'render', 'transform'],
62
+ // 19. Connect/Open
63
+ ['connect', 'open', 'establish', 'attach', 'bind', 'mount', 'join', 'link'],
64
+ // 20. Disconnect/Close
65
+ ['disconnect', 'close', 'detach', 'unbind', 'unmount', 'shutdown', 'teardown', 'release'],
66
+ // 21. Encrypt/Secure
67
+ ['encrypt', 'secure', 'hash', 'sign', 'cipher', 'protect', 'obfuscate', 'seal'],
68
+ // 22. Decrypt/Unseal
69
+ ['decrypt', 'unseal', 'decipher'],
70
+ // 23. Async/Concurrent
71
+ ['async', 'await', 'promise', 'concurrent', 'parallel', 'thread', 'worker', 'coroutine'],
72
+ // 24. Route/Endpoint
73
+ ['route', 'endpoint', 'path', 'url', 'uri', 'handler', 'controller', 'middleware'],
74
+ // 25. Database/Repository
75
+ ['database', 'db', 'repository', 'repo', 'datastore', 'collection', 'table'],
76
+ // 26. User/Account
77
+ ['user', 'account', 'profile', 'member', 'identity', 'principal', 'subject'],
78
+ // 27. Deploy/Release
79
+ ['deploy', 'release', 'ship', 'rollout', 'launch', 'stage'],
80
+ // 28. Test/Spec
81
+ ['test', 'spec', 'suite', 'describe', 'expect', 'mock', 'stub'],
82
+ // 29. Import/Include
83
+ ['import', 'include', 'require', 'use', 'depend', 'inject'],
84
+ // 30. Export/Expose
85
+ ['export', 'expose', 'provide', 'declare'],
86
+ // 31. Iterate/Loop
87
+ ['iterate', 'loop', 'foreach', 'map', 'each', 'traverse', 'walk', 'cursor'],
88
+ // 32. Sort/Order
89
+ ['sort', 'order', 'rank', 'arrange', 'sequence', 'prioritize', 'compare'],
90
+ // 33. Merge/Combine
91
+ ['merge', 'combine', 'concat', 'union', 'aggregate', 'compose', 'mix'],
92
+ // 34. Split/Divide
93
+ ['split', 'divide', 'separate', 'partition', 'chunk', 'slice', 'segment', 'decompose'],
94
+ // 35. Retry/Backoff
95
+ ['retry', 'backoff', 'reconnect', 'recover', 'failover', 'fallback', 'resilience'],
96
+ ];
97
+ /**
98
+ * Build bidirectional synonym lookup from synonym groups.
99
+ * Each term maps to its full synonym set (excluding itself).
100
+ */
101
+ function buildSynonymMap() {
102
+ const map = new Map();
103
+ for (const group of SYNONYM_GROUPS) {
104
+ for (const term of group) {
105
+ const lowerTerm = term.toLowerCase();
106
+ const synonyms = group
107
+ .filter(t => t.toLowerCase() !== lowerTerm)
108
+ .map(t => t.toLowerCase());
109
+ const existing = map.get(lowerTerm) ?? [];
110
+ // Merge with any existing synonyms (a term may appear in multiple groups)
111
+ const merged = [...new Set([...existing, ...synonyms])];
112
+ map.set(lowerTerm, merged);
113
+ }
114
+ }
115
+ return map;
116
+ }
117
+ const SYNONYM_MAP = buildSynonymMap();
118
+ // ============================================================
119
+ // Tokenizer
120
+ // ============================================================
121
+ /**
122
+ * Tokenize text into normalized terms.
123
+ *
124
+ * Handles:
125
+ * - CamelCase splitting: "handleUserAuth" → ["handle", "user", "auth"]
126
+ * - snake_case splitting: "handle_user_auth" → ["handle", "user", "auth"]
127
+ * - kebab-case splitting: "handle-user-auth" → ["handle", "user", "auth"]
128
+ * - Path splitting: "src/utils/auth.ts" → ["src", "utils", "auth", "ts"]
129
+ * - Lowercasing
130
+ * - Short token filtering (< 2 chars removed)
131
+ */
132
+ export function tokenize(text) {
133
+ if (!text)
134
+ return [];
135
+ // Split CamelCase and PascalCase
136
+ const withSpaces = text
137
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2') // camelCase → camel Case
138
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2') // HTMLParser → HTML Parser
139
+ .replace(/[_\-.\/\\:@#$%^&*(){}[\]<>,;=+!?'"~`|]/g, ' '); // symbols → spaces
140
+ // Split on whitespace, lowercase, filter short tokens
141
+ return withSpaces
142
+ .split(/\s+/)
143
+ .map(t => t.toLowerCase().trim())
144
+ .filter(t => t.length >= 2);
145
+ }
146
+ /**
147
+ * Expand query terms with synonyms.
148
+ *
149
+ * @returns Object with expanded terms and which synonyms were activated
150
+ */
151
+ export function expandWithSynonyms(terms) {
152
+ const expanded = new Set(terms);
153
+ const activatedSynonyms = [];
154
+ for (const term of terms) {
155
+ const synonyms = SYNONYM_MAP.get(term.toLowerCase());
156
+ if (synonyms) {
157
+ for (const syn of synonyms) {
158
+ if (!expanded.has(syn)) {
159
+ expanded.add(syn);
160
+ activatedSynonyms.push(syn);
161
+ }
162
+ }
163
+ }
164
+ }
165
+ return {
166
+ expanded: [...expanded],
167
+ activatedSynonyms,
168
+ };
169
+ }
170
+ // ============================================================
171
+ // TF-IDF Engine
172
+ // ============================================================
173
+ /**
174
+ * Compute term frequency for a token list.
175
+ * TF(t, d) = count(t in d) / |d|
176
+ */
177
+ function computeTF(tokens) {
178
+ if (tokens.length === 0)
179
+ return {};
180
+ const tf = {};
181
+ for (const token of tokens) {
182
+ tf[token] = (tf[token] || 0) + 1;
183
+ }
184
+ // Normalize by document length
185
+ const len = tokens.length;
186
+ for (const term in tf) {
187
+ tf[term] /= len;
188
+ }
189
+ return tf;
190
+ }
191
+ /**
192
+ * Compute the L2 magnitude of a sparse vector.
193
+ */
194
+ function magnitude(vec) {
195
+ let sumSq = 0;
196
+ for (const key in vec) {
197
+ sumSq += vec[key] * vec[key];
198
+ }
199
+ return Math.sqrt(sumSq);
200
+ }
201
+ /**
202
+ * Compute cosine similarity between two sparse vectors.
203
+ */
204
+ function cosineSimilarity(vecA, vecB, magB) {
205
+ const magA = magnitude(vecA);
206
+ if (magA === 0 || magB === 0)
207
+ return 0;
208
+ let dot = 0;
209
+ // Iterate over the smaller vector for efficiency
210
+ const [smaller, larger] = Object.keys(vecA).length <= Object.keys(vecB).length
211
+ ? [vecA, vecB]
212
+ : [vecB, vecA];
213
+ for (const key in smaller) {
214
+ if (key in larger) {
215
+ dot += smaller[key] * larger[key];
216
+ }
217
+ }
218
+ return dot / (magA * magB);
219
+ }
220
+ // ============================================================
221
+ // Semantic Search Engine
222
+ // ============================================================
223
+ /** Schema for semantic search tables */
224
+ const SEMANTIC_SCHEMA = `
225
+ -- TF-IDF vectors for each indexed node
226
+ CREATE TABLE IF NOT EXISTS tfidf_vectors (
227
+ node_id TEXT PRIMARY KEY,
228
+ terms TEXT NOT NULL,
229
+ magnitude REAL NOT NULL,
230
+ updated_at INTEGER NOT NULL
231
+ );
232
+
233
+ -- Inverse document frequency stats
234
+ CREATE TABLE IF NOT EXISTS corpus_stats (
235
+ term TEXT PRIMARY KEY,
236
+ doc_frequency INTEGER NOT NULL
237
+ );
238
+
239
+ -- Metadata for the semantic index
240
+ CREATE TABLE IF NOT EXISTS search_metadata (
241
+ key TEXT PRIMARY KEY,
242
+ value TEXT NOT NULL
243
+ );
244
+
245
+ -- Index for fast lookups
246
+ CREATE INDEX IF NOT EXISTS idx_tfidf_updated ON tfidf_vectors(updated_at);
247
+ `;
248
+ /**
249
+ * SemanticSearchEngine — TF-IDF cosine similarity search with synonym expansion.
250
+ *
251
+ * Usage:
252
+ * const engine = new SemanticSearchEngine(db);
253
+ * engine.indexNode(nodeId, "handleUserAuth", "Handles user authentication...");
254
+ * const results = engine.search("login verification", 10);
255
+ */
256
+ export class SemanticSearchEngine {
257
+ db;
258
+ idfCache = new Map();
259
+ totalDocs = 0;
260
+ idfStale = true;
261
+ // Prepared statements (lazy-initialized)
262
+ stmtUpsertVector = null;
263
+ stmtDeleteVector = null;
264
+ stmtUpsertCorpusStat = null;
265
+ stmtGetVector = null;
266
+ stmtGetAllVectors = null;
267
+ stmtGetCorpusStats = null;
268
+ stmtSetMetadata = null;
269
+ stmtGetMetadata = null;
270
+ stmtCountVectors = null;
271
+ stmtCountTerms = null;
272
+ stmtDeleteCorpusStats = null;
273
+ constructor(db) {
274
+ this.db = db;
275
+ this.initSchema();
276
+ this.prepareStatements();
277
+ this.loadCorpusStats();
278
+ }
279
+ /** Initialize semantic search tables */
280
+ initSchema() {
281
+ this.db.exec(SEMANTIC_SCHEMA);
282
+ }
283
+ /** Prepare reusable SQL statements */
284
+ prepareStatements() {
285
+ this.stmtUpsertVector = this.db.prepare(`
286
+ INSERT OR REPLACE INTO tfidf_vectors (node_id, terms, magnitude, updated_at)
287
+ VALUES (?, ?, ?, ?)
288
+ `);
289
+ this.stmtDeleteVector = this.db.prepare(`
290
+ DELETE FROM tfidf_vectors WHERE node_id = ?
291
+ `);
292
+ this.stmtUpsertCorpusStat = this.db.prepare(`
293
+ INSERT OR REPLACE INTO corpus_stats (term, doc_frequency)
294
+ VALUES (?, ?)
295
+ `);
296
+ this.stmtGetVector = this.db.prepare(`
297
+ SELECT terms, magnitude FROM tfidf_vectors WHERE node_id = ?
298
+ `);
299
+ this.stmtGetAllVectors = this.db.prepare(`
300
+ SELECT node_id, terms, magnitude FROM tfidf_vectors
301
+ `);
302
+ this.stmtGetCorpusStats = this.db.prepare(`
303
+ SELECT term, doc_frequency FROM corpus_stats
304
+ `);
305
+ this.stmtSetMetadata = this.db.prepare(`
306
+ INSERT OR REPLACE INTO search_metadata (key, value) VALUES (?, ?)
307
+ `);
308
+ this.stmtGetMetadata = this.db.prepare(`
309
+ SELECT value FROM search_metadata WHERE key = ?
310
+ `);
311
+ this.stmtCountVectors = this.db.prepare(`
312
+ SELECT COUNT(*) as count FROM tfidf_vectors
313
+ `);
314
+ this.stmtCountTerms = this.db.prepare(`
315
+ SELECT COUNT(*) as count FROM corpus_stats
316
+ `);
317
+ this.stmtDeleteCorpusStats = this.db.prepare(`
318
+ DELETE FROM corpus_stats
319
+ `);
320
+ }
321
+ /** Load corpus statistics from SQLite */
322
+ loadCorpusStats() {
323
+ const rows = this.stmtGetCorpusStats.all();
324
+ this.idfCache.clear();
325
+ for (const row of rows) {
326
+ this.idfCache.set(row.term, row.doc_frequency);
327
+ }
328
+ this.totalDocs = this.stmtCountVectors.get()?.count ?? 0;
329
+ const lastRebuilt = this.stmtGetMetadata.get('last_idf_rebuild');
330
+ this.idfStale = !lastRebuilt;
331
+ }
332
+ // ── Indexing ────────────────────────────────────────────────
333
+ /**
334
+ * Build a composite text for a node from its components.
335
+ * Weights different fields by repeating important ones.
336
+ */
337
+ buildNodeText(name, qualifiedName, signature, docComment, filePath) {
338
+ // Weight by repetition: name is most important (3x), then qualifiedName (2x),
339
+ // then signature and docComment (1x each)
340
+ const parts = [
341
+ name, name, name, // 3× weight
342
+ qualifiedName, qualifiedName, // 2× weight
343
+ signature, // 1× weight
344
+ docComment ?? '', // 1× weight
345
+ filePath.replace(/[/\\]/g, ' '), // 1× weight (path words)
346
+ ];
347
+ return parts.join(' ');
348
+ }
349
+ /**
350
+ * Index a single node for semantic search.
351
+ *
352
+ * Computes TF vector and stores it. IDF is lazily recalculated
353
+ * when search is invoked after indexing changes.
354
+ */
355
+ indexNode(nodeId, name, qualifiedName, signature, docComment, filePath) {
356
+ const text = this.buildNodeText(name, qualifiedName, signature, docComment, filePath);
357
+ const tokens = tokenize(text);
358
+ if (tokens.length === 0) {
359
+ // Nothing to index (e.g., empty signature)
360
+ this.stmtDeleteVector.run(nodeId);
361
+ return;
362
+ }
363
+ const tf = computeTF(tokens);
364
+ const mag = magnitude(tf);
365
+ // Store TF vector as JSON (IDF will be applied at search time)
366
+ this.stmtUpsertVector.run(nodeId, JSON.stringify(tf), mag, Date.now());
367
+ this.idfStale = true;
368
+ }
369
+ /**
370
+ * Batch-index multiple nodes in a single transaction.
371
+ */
372
+ indexNodes(nodes) {
373
+ const indexInTransaction = this.db.transaction(() => {
374
+ for (const node of nodes) {
375
+ this.indexNode(node.id, node.name, node.qualifiedName, node.signature, node.docComment, node.filePath);
376
+ }
377
+ });
378
+ indexInTransaction();
379
+ this.idfStale = true;
380
+ }
381
+ /**
382
+ * Remove a node from the semantic index.
383
+ */
384
+ removeNode(nodeId) {
385
+ this.stmtDeleteVector.run(nodeId);
386
+ this.idfStale = true;
387
+ }
388
+ /**
389
+ * Remove all nodes for a file path from the semantic index.
390
+ */
391
+ removeFileNodes(filePath) {
392
+ this.db.prepare(`
393
+ DELETE FROM tfidf_vectors
394
+ WHERE node_id IN (SELECT id FROM nodes WHERE filePath = ?)
395
+ `).run(filePath);
396
+ this.idfStale = true;
397
+ }
398
+ // ── IDF Computation ─────────────────────────────────────────
399
+ /**
400
+ * Rebuild the IDF (Inverse Document Frequency) index.
401
+ * Called lazily before search if the index is stale.
402
+ *
403
+ * IDF(t) = log(N / (1 + df(t))) + 1
404
+ * where N = total documents, df(t) = documents containing term t
405
+ */
406
+ rebuildIDF() {
407
+ // Count total documents
408
+ this.totalDocs = this.stmtCountVectors.get()?.count ?? 0;
409
+ if (this.totalDocs === 0) {
410
+ this.idfStale = false;
411
+ return;
412
+ }
413
+ // Aggregate document frequencies from all TF vectors
414
+ const termDf = new Map();
415
+ const rows = this.stmtGetAllVectors.all();
416
+ for (const row of rows) {
417
+ try {
418
+ const tf = JSON.parse(row.terms);
419
+ for (const term of Object.keys(tf)) {
420
+ termDf.set(term, (termDf.get(term) ?? 0) + 1);
421
+ }
422
+ }
423
+ catch {
424
+ // Skip malformed vectors
425
+ }
426
+ }
427
+ // Persist to SQLite
428
+ const updateCorpus = this.db.transaction(() => {
429
+ this.stmtDeleteCorpusStats.run();
430
+ for (const [term, df] of termDf) {
431
+ this.stmtUpsertCorpusStat.run(term, df);
432
+ }
433
+ });
434
+ updateCorpus();
435
+ // Update in-memory cache
436
+ this.idfCache = termDf;
437
+ this.idfStale = false;
438
+ // Record rebuild timestamp
439
+ this.stmtSetMetadata.run('last_idf_rebuild', String(Date.now()));
440
+ }
441
+ /**
442
+ * Get the IDF weight for a term.
443
+ */
444
+ getIDF(term) {
445
+ const df = this.idfCache.get(term) ?? 0;
446
+ return Math.log(this.totalDocs / (1 + df)) + 1;
447
+ }
448
+ /**
449
+ * Apply IDF weights to a TF vector to produce a TF-IDF vector.
450
+ */
451
+ applyIDF(tf) {
452
+ const tfidf = {};
453
+ for (const term in tf) {
454
+ tfidf[term] = tf[term] * this.getIDF(term);
455
+ }
456
+ return tfidf;
457
+ }
458
+ // ── Search ──────────────────────────────────────────────────
459
+ /**
460
+ * Perform semantic search using TF-IDF cosine similarity.
461
+ *
462
+ * @param query - Natural language query (e.g., "save user preferences")
463
+ * @param limit - Maximum results to return
464
+ * @param threshold - Minimum similarity score (0–1, default 0.01)
465
+ * @param useSynonyms - Whether to expand query with synonyms (default true)
466
+ * @returns Ranked search results with similarity scores
467
+ */
468
+ search(query, limit = 10, threshold = 0.01, useSynonyms = true) {
469
+ // Ensure IDF is up to date
470
+ if (this.idfStale) {
471
+ this.rebuildIDF();
472
+ }
473
+ if (this.totalDocs === 0)
474
+ return [];
475
+ // Tokenize and expand query
476
+ const queryTokens = tokenize(query);
477
+ if (queryTokens.length === 0)
478
+ return [];
479
+ let searchTerms;
480
+ let activatedSynonyms = [];
481
+ if (useSynonyms) {
482
+ const expanded = expandWithSynonyms(queryTokens);
483
+ searchTerms = expanded.expanded;
484
+ activatedSynonyms = expanded.activatedSynonyms;
485
+ }
486
+ else {
487
+ searchTerms = queryTokens;
488
+ }
489
+ // Build query TF-IDF vector
490
+ const queryTF = computeTF(searchTerms);
491
+ const queryTFIDF = this.applyIDF(queryTF);
492
+ const queryMag = magnitude(queryTFIDF);
493
+ if (queryMag === 0)
494
+ return [];
495
+ // Scan all document vectors and compute cosine similarity
496
+ const allVectors = this.stmtGetAllVectors.all();
497
+ const results = [];
498
+ for (const row of allVectors) {
499
+ try {
500
+ const docTF = JSON.parse(row.terms);
501
+ const docTFIDF = this.applyIDF(docTF);
502
+ const docMag = magnitude(docTFIDF);
503
+ const score = cosineSimilarity(queryTFIDF, docTFIDF, docMag);
504
+ if (score >= threshold) {
505
+ // Find which query terms actually matched
506
+ const matchedTerms = searchTerms.filter(t => t in docTF);
507
+ results.push({
508
+ nodeId: row.node_id,
509
+ score,
510
+ matchedTerms,
511
+ expandedSynonyms: activatedSynonyms,
512
+ });
513
+ }
514
+ }
515
+ catch {
516
+ // Skip malformed vectors
517
+ }
518
+ }
519
+ // Sort by score descending and limit
520
+ results.sort((a, b) => b.score - a.score);
521
+ return results.slice(0, limit);
522
+ }
523
+ /**
524
+ * Build an FTS5-compatible query string with synonym expansion.
525
+ * Used to enhance the existing keyword search with synonym awareness.
526
+ *
527
+ * Example: "save user data" → '("save" OR "persist" OR "store" OR "write") AND "user" AND "data"'
528
+ */
529
+ buildSynonymExpandedFtsQuery(query) {
530
+ const tokens = tokenize(query);
531
+ if (tokens.length === 0)
532
+ return '""';
533
+ const parts = [];
534
+ for (const token of tokens) {
535
+ const synonyms = SYNONYM_MAP.get(token.toLowerCase());
536
+ if (synonyms && synonyms.length > 0) {
537
+ // Build OR group for this term + its synonyms
538
+ const allTerms = [token, ...synonyms.slice(0, 5)]; // Limit to 5 synonyms to avoid query explosion
539
+ const orGroup = allTerms.map(t => `"${t}"`).join(' OR ');
540
+ parts.push(`(${orGroup})`);
541
+ }
542
+ else {
543
+ parts.push(`"${token}"`);
544
+ }
545
+ }
546
+ return parts.join(' AND ');
547
+ }
548
+ // ── Diagnostics ─────────────────────────────────────────────
549
+ /**
550
+ * Get statistics about the semantic index.
551
+ */
552
+ getStats() {
553
+ const totalDocs = this.stmtCountVectors.get()?.count ?? 0;
554
+ const vocabSize = this.stmtCountTerms.get()?.count ?? 0;
555
+ const lastRebuilt = this.stmtGetMetadata.get('last_idf_rebuild');
556
+ // Calculate average doc length
557
+ let avgDocLen = 0;
558
+ if (totalDocs > 0) {
559
+ const allVecs = this.stmtGetAllVectors.all();
560
+ let totalTerms = 0;
561
+ for (const row of allVecs) {
562
+ try {
563
+ totalTerms += Object.keys(JSON.parse(row.terms)).length;
564
+ }
565
+ catch { /* skip */ }
566
+ }
567
+ avgDocLen = totalTerms / totalDocs;
568
+ }
569
+ return {
570
+ totalDocuments: totalDocs,
571
+ vocabularySize: vocabSize,
572
+ averageDocLength: Math.round(avgDocLen * 10) / 10,
573
+ lastRebuiltAt: lastRebuilt ? parseInt(lastRebuilt.value, 10) : 0,
574
+ idfStale: this.idfStale,
575
+ };
576
+ }
577
+ /**
578
+ * Get the synonym dictionary for diagnostics or external use.
579
+ */
580
+ getSynonymGroups() {
581
+ return SYNONYM_GROUPS;
582
+ }
583
+ /**
584
+ * Look up synonyms for a specific term.
585
+ */
586
+ getSynonyms(term) {
587
+ return SYNONYM_MAP.get(term.toLowerCase()) ?? [];
588
+ }
589
+ /**
590
+ * Clear the entire semantic index.
591
+ */
592
+ clear() {
593
+ this.db.exec('DELETE FROM tfidf_vectors');
594
+ this.db.exec('DELETE FROM corpus_stats');
595
+ this.db.exec('DELETE FROM search_metadata');
596
+ this.idfCache.clear();
597
+ this.totalDocs = 0;
598
+ this.idfStale = true;
599
+ }
600
+ }
601
+ //# sourceMappingURL=semantic-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-search.js","sourceRoot":"","sources":["../../src/knowledge-graph/semantic-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { MindMapConfig, MemoryCategory } from '../types.js';
2
+ import type { KnowledgeGraph } from '../knowledge-graph/graph.js';
3
+ import type { PersistentMemory } from './persistent-memory.js';
4
+ import type { DecisionLog } from './decision-log.js';
5
+ export interface SharedMemory {
6
+ category: MemoryCategory;
7
+ content: string;
8
+ tags: string[];
9
+ relatedFiles: string[];
10
+ importance: number;
11
+ }
12
+ export interface SharedDecision {
13
+ title: string;
14
+ description: string;
15
+ rationale: string;
16
+ alternatives: string[];
17
+ consequences: string[];
18
+ relatedFiles: string[];
19
+ tags: string[];
20
+ status: 'active' | 'superseded' | 'reversed';
21
+ }
22
+ export interface SharedRule {
23
+ type: 'classification' | 'search_alias' | 'code_pattern' | 'convention';
24
+ name: string;
25
+ description: string;
26
+ rule: Record<string, any>;
27
+ }
28
+ export interface SharedContext {
29
+ version: string;
30
+ memories?: SharedMemory[];
31
+ decisions?: SharedDecision[];
32
+ rules?: SharedRule[];
33
+ }
34
+ export interface SyncStats {
35
+ memoriesImported: number;
36
+ memoriesExported: number;
37
+ decisionsImported: number;
38
+ decisionsExported: number;
39
+ rulesImported: number;
40
+ rulesExported: number;
41
+ }
42
+ /**
43
+ * Synchronise local SQLite database with team-shared JSON file.
44
+ * Performs a bidirectional merge.
45
+ */
46
+ export declare function syncSharedContext(config: MindMapConfig, graph: KnowledgeGraph, memoryStore: PersistentMemory, decisionLog: DecisionLog): Promise<SyncStats>;
47
+ //# sourceMappingURL=shared-sync.d.ts.map