ai-mind-map 1.1.3 → 1.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 +66 -33
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +52 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -0
- package/dist/config.js.map +1 -1
- package/dist/index.js +273 -23
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +69 -56
- package/dist/install.js.map +1 -1
- package/dist/knowledge-graph/changelog.d.ts +175 -0
- package/dist/knowledge-graph/changelog.d.ts.map +1 -0
- package/dist/knowledge-graph/changelog.js +509 -0
- package/dist/knowledge-graph/changelog.js.map +1 -0
- package/dist/knowledge-graph/graph.d.ts +40 -0
- package/dist/knowledge-graph/graph.d.ts.map +1 -1
- package/dist/knowledge-graph/graph.js +73 -10
- package/dist/knowledge-graph/graph.js.map +1 -1
- package/dist/knowledge-graph/indexer.d.ts +15 -0
- package/dist/knowledge-graph/indexer.d.ts.map +1 -1
- package/dist/knowledge-graph/indexer.js +155 -34
- package/dist/knowledge-graph/indexer.js.map +1 -1
- package/dist/knowledge-graph/parser.d.ts +11 -0
- package/dist/knowledge-graph/parser.d.ts.map +1 -1
- package/dist/knowledge-graph/parser.js +70 -11
- package/dist/knowledge-graph/parser.js.map +1 -1
- package/dist/knowledge-graph/semantic-search.d.ts +166 -0
- package/dist/knowledge-graph/semantic-search.d.ts.map +1 -0
- package/dist/knowledge-graph/semantic-search.js +601 -0
- package/dist/knowledge-graph/semantic-search.js.map +1 -0
- package/dist/memory/shared-sync.d.ts +47 -0
- package/dist/memory/shared-sync.d.ts.map +1 -0
- package/dist/memory/shared-sync.js +219 -0
- package/dist/memory/shared-sync.js.map +1 -0
- package/dist/tools/advanced-tools.d.ts +2 -1
- package/dist/tools/advanced-tools.d.ts.map +1 -1
- package/dist/tools/advanced-tools.js +38 -1
- package/dist/tools/advanced-tools.js.map +1 -1
- package/dist/tools/digest-tools.d.ts +15 -0
- package/dist/tools/digest-tools.d.ts.map +1 -0
- package/dist/tools/digest-tools.js +332 -0
- package/dist/tools/digest-tools.js.map +1 -0
- package/dist/tools/semantic-tools.d.ts +20 -0
- package/dist/tools/semantic-tools.d.ts.map +1 -0
- package/dist/tools/semantic-tools.js +141 -0
- package/dist/tools/semantic-tools.js.map +1 -0
- package/dist/tools/session-tools.d.ts +17 -0
- package/dist/tools/session-tools.d.ts.map +1 -0
- package/dist/tools/session-tools.js +233 -0
- package/dist/tools/session-tools.js.map +1 -0
- package/dist/tools/smart-tools.d.ts +2 -1
- package/dist/tools/smart-tools.d.ts.map +1 -1
- package/dist/tools/smart-tools.js +55 -3
- package/dist/tools/smart-tools.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -1
- 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
|