@mcp-graph-workflow/mcp-graph 5.8.0 → 5.9.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 (86) hide show
  1. package/dist/core/code/code-types.d.ts +3 -3
  2. package/dist/core/integrations/integration-orchestrator.d.ts.map +1 -1
  3. package/dist/core/integrations/integration-orchestrator.js +2 -0
  4. package/dist/core/integrations/integration-orchestrator.js.map +1 -1
  5. package/dist/core/rag/entity-extractor.d.ts +30 -0
  6. package/dist/core/rag/entity-extractor.d.ts.map +1 -0
  7. package/dist/core/rag/entity-extractor.js +224 -0
  8. package/dist/core/rag/entity-extractor.js.map +1 -0
  9. package/dist/core/rag/entity-index-hook.d.ts +25 -0
  10. package/dist/core/rag/entity-index-hook.d.ts.map +1 -0
  11. package/dist/core/rag/entity-index-hook.js +75 -0
  12. package/dist/core/rag/entity-index-hook.js.map +1 -0
  13. package/dist/core/rag/entity-indexer.d.ts +33 -0
  14. package/dist/core/rag/entity-indexer.d.ts.map +1 -0
  15. package/dist/core/rag/entity-indexer.js +91 -0
  16. package/dist/core/rag/entity-indexer.js.map +1 -0
  17. package/dist/core/rag/entity-store.d.ts +91 -0
  18. package/dist/core/rag/entity-store.d.ts.map +1 -0
  19. package/dist/core/rag/entity-store.js +395 -0
  20. package/dist/core/rag/entity-store.js.map +1 -0
  21. package/dist/core/rag/multi-strategy-retrieval.d.ts.map +1 -1
  22. package/dist/core/rag/multi-strategy-retrieval.js +49 -3
  23. package/dist/core/rag/multi-strategy-retrieval.js.map +1 -1
  24. package/dist/core/rag/node-indexer.d.ts +26 -0
  25. package/dist/core/rag/node-indexer.d.ts.map +1 -0
  26. package/dist/core/rag/node-indexer.js +120 -0
  27. package/dist/core/rag/node-indexer.js.map +1 -0
  28. package/dist/core/rag/query-understanding.d.ts +23 -0
  29. package/dist/core/rag/query-understanding.d.ts.map +1 -1
  30. package/dist/core/rag/query-understanding.js +85 -0
  31. package/dist/core/rag/query-understanding.js.map +1 -1
  32. package/dist/core/store/migrations.d.ts.map +1 -1
  33. package/dist/core/store/migrations.js +51 -0
  34. package/dist/core/store/migrations.js.map +1 -1
  35. package/dist/mcp/tools/clone-node.d.ts.map +1 -1
  36. package/dist/mcp/tools/clone-node.js +5 -0
  37. package/dist/mcp/tools/clone-node.js.map +1 -1
  38. package/dist/mcp/tools/import-graph.d.ts.map +1 -1
  39. package/dist/mcp/tools/import-graph.js +23 -1
  40. package/dist/mcp/tools/import-graph.js.map +1 -1
  41. package/dist/mcp/tools/import-prd.d.ts.map +1 -1
  42. package/dist/mcp/tools/import-prd.js +2 -0
  43. package/dist/mcp/tools/import-prd.js.map +1 -1
  44. package/dist/mcp/tools/journey.d.ts.map +1 -1
  45. package/dist/mcp/tools/journey.js +2 -0
  46. package/dist/mcp/tools/journey.js.map +1 -1
  47. package/dist/mcp/tools/manage-skill.d.ts.map +1 -1
  48. package/dist/mcp/tools/manage-skill.js +3 -0
  49. package/dist/mcp/tools/manage-skill.js.map +1 -1
  50. package/dist/mcp/tools/memory.d.ts.map +1 -1
  51. package/dist/mcp/tools/memory.js +2 -0
  52. package/dist/mcp/tools/memory.js.map +1 -1
  53. package/dist/mcp/tools/node.d.ts.map +1 -1
  54. package/dist/mcp/tools/node.js +5 -0
  55. package/dist/mcp/tools/node.js.map +1 -1
  56. package/dist/mcp/tools/plan-sprint.d.ts.map +1 -1
  57. package/dist/mcp/tools/plan-sprint.js +3 -1
  58. package/dist/mcp/tools/plan-sprint.js.map +1 -1
  59. package/dist/mcp/tools/reindex-knowledge.d.ts.map +1 -1
  60. package/dist/mcp/tools/reindex-knowledge.js +43 -1
  61. package/dist/mcp/tools/reindex-knowledge.js.map +1 -1
  62. package/dist/mcp/tools/siebel-import-docs.d.ts.map +1 -1
  63. package/dist/mcp/tools/siebel-import-docs.js +3 -0
  64. package/dist/mcp/tools/siebel-import-docs.js.map +1 -1
  65. package/dist/mcp/tools/siebel-import-sif.d.ts.map +1 -1
  66. package/dist/mcp/tools/siebel-import-sif.js +2 -0
  67. package/dist/mcp/tools/siebel-import-sif.js.map +1 -1
  68. package/dist/mcp/tools/sync-stack-docs.d.ts.map +1 -1
  69. package/dist/mcp/tools/sync-stack-docs.js +2 -0
  70. package/dist/mcp/tools/sync-stack-docs.js.map +1 -1
  71. package/dist/mcp/tools/update-status.d.ts.map +1 -1
  72. package/dist/mcp/tools/update-status.js +2 -0
  73. package/dist/mcp/tools/update-status.js.map +1 -1
  74. package/dist/mcp/tools/validate.d.ts.map +1 -1
  75. package/dist/mcp/tools/validate.js +3 -0
  76. package/dist/mcp/tools/validate.js.map +1 -1
  77. package/dist/schemas/entity.schema.d.ts +80 -0
  78. package/dist/schemas/entity.schema.d.ts.map +1 -0
  79. package/dist/schemas/entity.schema.js +56 -0
  80. package/dist/schemas/entity.schema.js.map +1 -0
  81. package/dist/schemas/knowledge.schema.d.ts +2 -0
  82. package/dist/schemas/knowledge.schema.d.ts.map +1 -1
  83. package/dist/schemas/knowledge.schema.js +1 -1
  84. package/dist/schemas/knowledge.schema.js.map +1 -1
  85. package/dist/schemas/siebel.schema.d.ts +3 -3
  86. package/package.json +2 -2
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Entity Store — SQLite CRUD and graph traversal for the Knowledge Graph.
3
+ *
4
+ * Stores entities, relations between entities, and mentions linking
5
+ * entities to knowledge documents. Provides FTS5 search and BFS
6
+ * traversal for subgraph extraction.
7
+ */
8
+ import type Database from "better-sqlite3";
9
+ import type { Entity, EntityType, EntityRelationType, EntityRelation, EntityMention } from "../../schemas/entity.schema.js";
10
+ export interface EntitySubgraph {
11
+ entities: Entity[];
12
+ relations: EntityRelation[];
13
+ docIds: string[];
14
+ }
15
+ export declare class EntityStore {
16
+ private readonly db;
17
+ constructor(db: Database.Database);
18
+ /**
19
+ * Check if the kg_entities table exists (graceful degradation).
20
+ */
21
+ hasKgTables(): boolean;
22
+ /**
23
+ * Upsert entity — insert if new, increment mention_count if existing.
24
+ * Deduplication key: normalized_name + type.
25
+ */
26
+ upsertEntity(name: string, type: EntityType, docId?: string): Entity;
27
+ /**
28
+ * Add a relation between two entities.
29
+ */
30
+ addRelation(fromEntityId: string, toEntityId: string, relationType: EntityRelationType, weight?: number, sourceDocId?: string | null): EntityRelation | null;
31
+ /**
32
+ * Add a mention linking an entity to a knowledge document.
33
+ */
34
+ addMention(entityId: string, docId: string, context: string | null, position: number): EntityMention;
35
+ /**
36
+ * Get entity by ID.
37
+ */
38
+ getById(id: string): Entity | undefined;
39
+ /**
40
+ * Find entities by FTS5 search on name, aliases, description.
41
+ */
42
+ findByName(query: string, limit?: number): Entity[];
43
+ /**
44
+ * Get all relations from/to an entity.
45
+ */
46
+ getRelations(entityId: string): EntityRelation[];
47
+ /**
48
+ * Get relations originating from an entity.
49
+ */
50
+ getRelationsFrom(entityId: string): EntityRelation[];
51
+ /**
52
+ * Get relations pointing to an entity.
53
+ */
54
+ getRelationsTo(entityId: string): EntityRelation[];
55
+ /**
56
+ * Get all entities mentioned in a specific document.
57
+ */
58
+ getEntitiesForDoc(docId: string): Entity[];
59
+ /**
60
+ * Get all document IDs that mention an entity.
61
+ */
62
+ getDocIdsForEntity(entityId: string): string[];
63
+ /**
64
+ * Get mentions for an entity.
65
+ */
66
+ getMentions(entityId: string): EntityMention[];
67
+ /**
68
+ * BFS traversal from seed entities — extract subgraph up to maxDepth hops.
69
+ * Returns entities, relations, and associated document IDs.
70
+ * Caps at maxEntities to prevent unbounded growth.
71
+ */
72
+ extractSubgraph(seedEntityIds: string[], maxDepth?: number, maxEntities?: number): EntitySubgraph;
73
+ /**
74
+ * Merge two entities — move all mentions and relations from mergeId to keepId,
75
+ * then delete the merged entity.
76
+ */
77
+ mergeEntities(keepId: string, mergeId: string): void;
78
+ /**
79
+ * Get stats for the knowledge graph.
80
+ */
81
+ stats(): {
82
+ entities: number;
83
+ relations: number;
84
+ mentions: number;
85
+ };
86
+ /**
87
+ * Clear all KG data (for reindexing).
88
+ */
89
+ clear(): void;
90
+ }
91
+ //# sourceMappingURL=entity-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-store.d.ts","sourceRoot":"","sources":["../../../src/core/rag/entity-store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,aAAa,EACd,MAAM,gCAAgC,CAAC;AAuFxC,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAID,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAElD;;OAEG;IACH,WAAW,IAAI,OAAO;IAOtB;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IA8DpE;;OAEG;IACH,WAAW,CACT,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,kBAAkB,EAChC,MAAM,GAAE,MAAY,EACpB,WAAW,GAAE,MAAM,GAAG,IAAW,GAChC,cAAc,GAAG,IAAI;IA2BxB;;OAEG;IACH,UAAU,CACR,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,QAAQ,EAAE,MAAM,GACf,aAAa;IAqBhB;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAOvC;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,MAAM,EAAE;IA6BvD;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE;IAShD;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE;IAOpD;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE;IAOlD;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAW1C;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAO9C;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE;IAO9C;;;;OAIG;IACH,eAAe,CACb,aAAa,EAAE,MAAM,EAAE,EACvB,QAAQ,GAAE,MAAU,EACpB,WAAW,GAAE,MAAW,GACvB,cAAc;IAoEjB;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAwDpD;;OAEG;IACH,KAAK,IAAI;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAalE;;OAEG;IACH,KAAK,IAAI,IAAI;CAQd"}
@@ -0,0 +1,395 @@
1
+ /**
2
+ * Entity Store — SQLite CRUD and graph traversal for the Knowledge Graph.
3
+ *
4
+ * Stores entities, relations between entities, and mentions linking
5
+ * entities to knowledge documents. Provides FTS5 search and BFS
6
+ * traversal for subgraph extraction.
7
+ */
8
+ import { generateId } from "../utils/id.js";
9
+ import { now } from "../utils/time.js";
10
+ import { logger } from "../utils/logger.js";
11
+ // ── Mappers ──────────────────────────────────────────────
12
+ function rowToEntity(row) {
13
+ return {
14
+ id: row.id,
15
+ name: row.name,
16
+ type: row.type,
17
+ normalizedName: row.normalized_name,
18
+ aliases: JSON.parse(row.aliases),
19
+ description: row.description,
20
+ metadata: JSON.parse(row.metadata),
21
+ mentionCount: row.mention_count,
22
+ createdAt: row.created_at,
23
+ updatedAt: row.updated_at,
24
+ };
25
+ }
26
+ function rowToRelation(row) {
27
+ return {
28
+ id: row.id,
29
+ fromEntityId: row.from_entity_id,
30
+ toEntityId: row.to_entity_id,
31
+ relationType: row.relation_type,
32
+ weight: row.weight,
33
+ sourceDocId: row.source_doc_id,
34
+ createdAt: row.created_at,
35
+ };
36
+ }
37
+ function rowToMention(row) {
38
+ return {
39
+ id: row.id,
40
+ entityId: row.entity_id,
41
+ docId: row.doc_id,
42
+ context: row.context,
43
+ position: row.position,
44
+ createdAt: row.created_at,
45
+ };
46
+ }
47
+ // ── Normalize ────────────────────────────────────────────
48
+ function normalizeName(name) {
49
+ return name.toLowerCase().trim();
50
+ }
51
+ // ── Entity Store ─────────────────────────────────────────
52
+ export class EntityStore {
53
+ db;
54
+ constructor(db) {
55
+ this.db = db;
56
+ }
57
+ /**
58
+ * Check if the kg_entities table exists (graceful degradation).
59
+ */
60
+ hasKgTables() {
61
+ const row = this.db
62
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='kg_entities'")
63
+ .get();
64
+ return row !== undefined;
65
+ }
66
+ /**
67
+ * Upsert entity — insert if new, increment mention_count if existing.
68
+ * Deduplication key: normalized_name + type.
69
+ */
70
+ upsertEntity(name, type, docId) {
71
+ const normalized = normalizeName(name);
72
+ const timestamp = now();
73
+ const existing = this.db
74
+ .prepare("SELECT * FROM kg_entities WHERE normalized_name = ? AND type = ?")
75
+ .get(normalized, type);
76
+ if (existing) {
77
+ this.db
78
+ .prepare("UPDATE kg_entities SET mention_count = mention_count + 1, updated_at = ? WHERE id = ?")
79
+ .run(timestamp, existing.id);
80
+ if (docId) {
81
+ this.addMention(existing.id, docId, null, 0);
82
+ }
83
+ return rowToEntity({
84
+ ...existing,
85
+ mention_count: existing.mention_count + 1,
86
+ updated_at: timestamp,
87
+ });
88
+ }
89
+ const id = generateId("ent");
90
+ this.db
91
+ .prepare(`INSERT INTO kg_entities (id, name, type, normalized_name, aliases, description, metadata, mention_count, created_at, updated_at)
92
+ VALUES (?, ?, ?, ?, '[]', NULL, '{}', 1, ?, ?)`)
93
+ .run(id, name, type, normalized, timestamp, timestamp);
94
+ // Sync FTS — standalone FTS table, use auto-generated rowid
95
+ const entityRowid = this.db
96
+ .prepare("SELECT rowid FROM kg_entities WHERE id = ?")
97
+ .get(id);
98
+ if (entityRowid) {
99
+ this.db
100
+ .prepare("INSERT INTO kg_entities_fts (rowid, name, aliases, description) VALUES (?, ?, '[]', '')")
101
+ .run(entityRowid.rowid, name);
102
+ }
103
+ if (docId) {
104
+ this.addMention(id, docId, null, 0);
105
+ }
106
+ logger.debug("entity-store:upsert", { id, name, type });
107
+ return {
108
+ id,
109
+ name,
110
+ type,
111
+ normalizedName: normalized,
112
+ aliases: [],
113
+ description: null,
114
+ metadata: {},
115
+ mentionCount: 1,
116
+ createdAt: timestamp,
117
+ updatedAt: timestamp,
118
+ };
119
+ }
120
+ /**
121
+ * Add a relation between two entities.
122
+ */
123
+ addRelation(fromEntityId, toEntityId, relationType, weight = 1.0, sourceDocId = null) {
124
+ const id = generateId("kgrel");
125
+ const timestamp = now();
126
+ try {
127
+ this.db
128
+ .prepare(`INSERT OR IGNORE INTO kg_relations (id, from_entity_id, to_entity_id, relation_type, weight, source_doc_id, created_at)
129
+ VALUES (?, ?, ?, ?, ?, ?, ?)`)
130
+ .run(id, fromEntityId, toEntityId, relationType, weight, sourceDocId, timestamp);
131
+ return {
132
+ id,
133
+ fromEntityId,
134
+ toEntityId,
135
+ relationType,
136
+ weight,
137
+ sourceDocId,
138
+ createdAt: timestamp,
139
+ };
140
+ }
141
+ catch {
142
+ logger.debug("entity-store:relation-exists", { fromEntityId, toEntityId, relationType });
143
+ return null;
144
+ }
145
+ }
146
+ /**
147
+ * Add a mention linking an entity to a knowledge document.
148
+ */
149
+ addMention(entityId, docId, context, position) {
150
+ const id = generateId("kgm");
151
+ const timestamp = now();
152
+ this.db
153
+ .prepare(`INSERT INTO kg_mentions (id, entity_id, doc_id, context, position, created_at)
154
+ VALUES (?, ?, ?, ?, ?, ?)`)
155
+ .run(id, entityId, docId, context, position, timestamp);
156
+ return {
157
+ id,
158
+ entityId,
159
+ docId,
160
+ context,
161
+ position,
162
+ createdAt: timestamp,
163
+ };
164
+ }
165
+ /**
166
+ * Get entity by ID.
167
+ */
168
+ getById(id) {
169
+ const row = this.db
170
+ .prepare("SELECT * FROM kg_entities WHERE id = ?")
171
+ .get(id);
172
+ return row ? rowToEntity(row) : undefined;
173
+ }
174
+ /**
175
+ * Find entities by FTS5 search on name, aliases, description.
176
+ */
177
+ findByName(query, limit = 10) {
178
+ if (!query.trim())
179
+ return [];
180
+ try {
181
+ // Try FTS5 prefix match first (append *)
182
+ const ftsQuery = query.trim().replace(/[^a-zA-Z0-9\s]/g, "") + "*";
183
+ const ftsRows = this.db
184
+ .prepare(`SELECT e.* FROM kg_entities e
185
+ JOIN kg_entities_fts fts ON e.rowid = fts.rowid
186
+ WHERE kg_entities_fts MATCH ?
187
+ LIMIT ?`)
188
+ .all(ftsQuery, limit);
189
+ if (ftsRows.length > 0) {
190
+ return ftsRows.map(rowToEntity);
191
+ }
192
+ }
193
+ catch {
194
+ // FTS query syntax error — fall through to LIKE
195
+ }
196
+ // Fallback to LIKE for substring matching
197
+ const likeRows = this.db
198
+ .prepare("SELECT * FROM kg_entities WHERE normalized_name LIKE ? OR name LIKE ? LIMIT ?")
199
+ .all(`%${normalizeName(query)}%`, `%${query}%`, limit);
200
+ return likeRows.map(rowToEntity);
201
+ }
202
+ /**
203
+ * Get all relations from/to an entity.
204
+ */
205
+ getRelations(entityId) {
206
+ const rows = this.db
207
+ .prepare("SELECT * FROM kg_relations WHERE from_entity_id = ? OR to_entity_id = ?")
208
+ .all(entityId, entityId);
209
+ return rows.map(rowToRelation);
210
+ }
211
+ /**
212
+ * Get relations originating from an entity.
213
+ */
214
+ getRelationsFrom(entityId) {
215
+ const rows = this.db
216
+ .prepare("SELECT * FROM kg_relations WHERE from_entity_id = ?")
217
+ .all(entityId);
218
+ return rows.map(rowToRelation);
219
+ }
220
+ /**
221
+ * Get relations pointing to an entity.
222
+ */
223
+ getRelationsTo(entityId) {
224
+ const rows = this.db
225
+ .prepare("SELECT * FROM kg_relations WHERE to_entity_id = ?")
226
+ .all(entityId);
227
+ return rows.map(rowToRelation);
228
+ }
229
+ /**
230
+ * Get all entities mentioned in a specific document.
231
+ */
232
+ getEntitiesForDoc(docId) {
233
+ const rows = this.db
234
+ .prepare(`SELECT DISTINCT e.* FROM kg_entities e
235
+ JOIN kg_mentions m ON e.id = m.entity_id
236
+ WHERE m.doc_id = ?`)
237
+ .all(docId);
238
+ return rows.map(rowToEntity);
239
+ }
240
+ /**
241
+ * Get all document IDs that mention an entity.
242
+ */
243
+ getDocIdsForEntity(entityId) {
244
+ const rows = this.db
245
+ .prepare("SELECT DISTINCT doc_id FROM kg_mentions WHERE entity_id = ?")
246
+ .all(entityId);
247
+ return rows.map((r) => r.doc_id);
248
+ }
249
+ /**
250
+ * Get mentions for an entity.
251
+ */
252
+ getMentions(entityId) {
253
+ const rows = this.db
254
+ .prepare("SELECT * FROM kg_mentions WHERE entity_id = ?")
255
+ .all(entityId);
256
+ return rows.map(rowToMention);
257
+ }
258
+ /**
259
+ * BFS traversal from seed entities — extract subgraph up to maxDepth hops.
260
+ * Returns entities, relations, and associated document IDs.
261
+ * Caps at maxEntities to prevent unbounded growth.
262
+ */
263
+ extractSubgraph(seedEntityIds, maxDepth = 2, maxEntities = 50) {
264
+ const visited = new Set();
265
+ const collectedRelations = new Map();
266
+ const docIdSet = new Set();
267
+ let frontier = seedEntityIds.filter((id) => {
268
+ if (visited.has(id))
269
+ return false;
270
+ visited.add(id);
271
+ return true;
272
+ });
273
+ // Collect doc IDs for seeds
274
+ for (const id of frontier) {
275
+ for (const docId of this.getDocIdsForEntity(id)) {
276
+ docIdSet.add(docId);
277
+ }
278
+ }
279
+ for (let depth = 0; depth < maxDepth && frontier.length > 0; depth++) {
280
+ if (visited.size >= maxEntities)
281
+ break;
282
+ const nextFrontier = [];
283
+ for (const entityId of frontier) {
284
+ const relations = this.getRelations(entityId);
285
+ for (const rel of relations) {
286
+ collectedRelations.set(rel.id, rel);
287
+ const neighborId = rel.fromEntityId === entityId
288
+ ? rel.toEntityId
289
+ : rel.fromEntityId;
290
+ if (!visited.has(neighborId) && visited.size < maxEntities) {
291
+ visited.add(neighborId);
292
+ nextFrontier.push(neighborId);
293
+ for (const docId of this.getDocIdsForEntity(neighborId)) {
294
+ docIdSet.add(docId);
295
+ }
296
+ }
297
+ }
298
+ }
299
+ frontier = nextFrontier;
300
+ }
301
+ // Fetch full entity objects
302
+ const entities = [];
303
+ for (const id of visited) {
304
+ const entity = this.getById(id);
305
+ if (entity)
306
+ entities.push(entity);
307
+ }
308
+ logger.debug("entity-store:subgraph", {
309
+ seeds: seedEntityIds.length,
310
+ entities: entities.length,
311
+ relations: collectedRelations.size,
312
+ docs: docIdSet.size,
313
+ });
314
+ return {
315
+ entities,
316
+ relations: Array.from(collectedRelations.values()),
317
+ docIds: Array.from(docIdSet),
318
+ };
319
+ }
320
+ /**
321
+ * Merge two entities — move all mentions and relations from mergeId to keepId,
322
+ * then delete the merged entity.
323
+ */
324
+ mergeEntities(keepId, mergeId) {
325
+ this.db.transaction(() => {
326
+ // Move mentions
327
+ this.db
328
+ .prepare("UPDATE kg_mentions SET entity_id = ? WHERE entity_id = ?")
329
+ .run(keepId, mergeId);
330
+ // Move outgoing relations (ignore duplicates)
331
+ this.db
332
+ .prepare(`UPDATE OR IGNORE kg_relations SET from_entity_id = ? WHERE from_entity_id = ?`)
333
+ .run(keepId, mergeId);
334
+ // Move incoming relations (ignore duplicates)
335
+ this.db
336
+ .prepare(`UPDATE OR IGNORE kg_relations SET to_entity_id = ? WHERE to_entity_id = ?`)
337
+ .run(keepId, mergeId);
338
+ // Delete orphaned relations that couldn't be moved (duplicates)
339
+ this.db
340
+ .prepare("DELETE FROM kg_relations WHERE from_entity_id = ? OR to_entity_id = ?")
341
+ .run(mergeId, mergeId);
342
+ // Update mention count on keeper
343
+ const mentionCount = this.db
344
+ .prepare("SELECT COUNT(*) as cnt FROM kg_mentions WHERE entity_id = ?")
345
+ .get(keepId).cnt;
346
+ this.db
347
+ .prepare("UPDATE kg_entities SET mention_count = ?, updated_at = ? WHERE id = ?")
348
+ .run(mentionCount, now(), keepId);
349
+ // Delete FTS entry for merged entity
350
+ const mergedRowid = this.db
351
+ .prepare("SELECT rowid FROM kg_entities WHERE id = ?")
352
+ .get(mergeId);
353
+ if (mergedRowid) {
354
+ const merged = this.db
355
+ .prepare("SELECT * FROM kg_entities WHERE id = ?")
356
+ .get(mergeId);
357
+ if (merged) {
358
+ this.db
359
+ .prepare("DELETE FROM kg_entities_fts WHERE rowid = ?")
360
+ .run(mergedRowid.rowid);
361
+ }
362
+ }
363
+ // Delete merged entity
364
+ this.db.prepare("DELETE FROM kg_entities WHERE id = ?").run(mergeId);
365
+ logger.debug("entity-store:merge", { keepId, mergeId, mentionCount });
366
+ })();
367
+ }
368
+ /**
369
+ * Get stats for the knowledge graph.
370
+ */
371
+ stats() {
372
+ const entities = this.db
373
+ .prepare("SELECT COUNT(*) as cnt FROM kg_entities")
374
+ .get().cnt;
375
+ const relations = this.db
376
+ .prepare("SELECT COUNT(*) as cnt FROM kg_relations")
377
+ .get().cnt;
378
+ const mentions = this.db
379
+ .prepare("SELECT COUNT(*) as cnt FROM kg_mentions")
380
+ .get().cnt;
381
+ return { entities, relations, mentions };
382
+ }
383
+ /**
384
+ * Clear all KG data (for reindexing).
385
+ */
386
+ clear() {
387
+ this.db.transaction(() => {
388
+ this.db.exec("DELETE FROM kg_mentions");
389
+ this.db.exec("DELETE FROM kg_relations");
390
+ this.db.exec("DELETE FROM kg_entities_fts");
391
+ this.db.exec("DELETE FROM kg_entities");
392
+ })();
393
+ }
394
+ }
395
+ //# sourceMappingURL=entity-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-store.js","sourceRoot":"","sources":["../../../src/core/rag/entity-store.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"multi-strategy-retrieval.d.ts","sourceRoot":"","sources":["../../../src/core/rag/multi-strategy-retrieval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,GACvD,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAczC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,aAAa,GACtB,YAAY,EAAE,CAmHhB"}
1
+ {"version":3,"file":"multi-strategy-retrieval.d.ts","sourceRoot":"","sources":["../../../src/core/rag/multi-strategy-retrieval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAO3C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,GACvD,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAczC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,aAAa,GACtB,YAAY,EAAE,CAoKhB"}
@@ -12,6 +12,8 @@
12
12
  */
13
13
  import { KnowledgeStore } from "../store/knowledge-store.js";
14
14
  import { findCrossSourceContext } from "./knowledge-linker.js";
15
+ import { EntityStore } from "./entity-store.js";
16
+ import { decomposeQuery } from "./query-understanding.js";
15
17
  import { logger } from "../utils/logger.js";
16
18
  const RRF_K = 60;
17
19
  /**
@@ -77,11 +79,49 @@ export function multiStrategySearch(db, query, options) {
77
79
  return { id, score: recencyScore };
78
80
  });
79
81
  }
80
- if (ftsResults.length === 0 && graphResults.length === 0) {
82
+ // Strategy 4: Entity Graph Traversal find docs via KG entities
83
+ const entityGraphResults = [];
84
+ try {
85
+ const entityStore = new EntityStore(db);
86
+ if (entityStore.hasKgTables() && entityStore.stats().entities > 0) {
87
+ const decomposed = decomposeQuery(query, db);
88
+ if (decomposed.entityMatches.length > 0) {
89
+ // Extract subgraph around matched entities (2 hops)
90
+ const seedIds = decomposed.entityMatches.slice(0, 5).map((m) => m.entityId);
91
+ const subgraph = entityStore.extractSubgraph(seedIds, 2, 50);
92
+ // Convert doc IDs to scored results
93
+ const docScoreMap = new Map();
94
+ for (const docId of subgraph.docIds) {
95
+ docScoreMap.set(docId, 0.5);
96
+ }
97
+ // Boost docs that contain directly matched entities
98
+ for (const match of decomposed.entityMatches) {
99
+ const docIds = entityStore.getDocIdsForEntity(match.entityId);
100
+ for (const docId of docIds) {
101
+ const current = docScoreMap.get(docId) ?? 0;
102
+ docScoreMap.set(docId, Math.min(current + match.score * 0.3, 1.0));
103
+ }
104
+ }
105
+ for (const [id, score] of docScoreMap) {
106
+ entityGraphResults.push({ id, score });
107
+ }
108
+ // Sort by score descending for RRF
109
+ entityGraphResults.sort((a, b) => b.score - a.score);
110
+ }
111
+ }
112
+ }
113
+ catch {
114
+ logger.debug("Entity graph strategy skipped — KG not available");
115
+ }
116
+ if (ftsResults.length === 0 && graphResults.length === 0 && entityGraphResults.length === 0) {
81
117
  return [];
82
118
  }
83
- // Merge via RRF
84
- const merged = reciprocalRankFusion([ftsResults, graphResults, recencyResults]);
119
+ // Merge via RRF — add entity graph results as 4th list
120
+ const rankedLists = [ftsResults, graphResults, recencyResults];
121
+ if (entityGraphResults.length > 0) {
122
+ rankedLists.push(entityGraphResults);
123
+ }
124
+ const merged = reciprocalRankFusion(rankedLists);
85
125
  // Fetch full docs and apply quality multiplier
86
126
  const results = [];
87
127
  const strategyMap = new Map();
@@ -95,6 +135,11 @@ export function multiStrategySearch(db, query, options) {
95
135
  strategies.push("graph");
96
136
  strategyMap.set(gr.id, strategies);
97
137
  }
138
+ for (const eg of entityGraphResults) {
139
+ const strategies = strategyMap.get(eg.id) ?? [];
140
+ strategies.push("entity_graph");
141
+ strategyMap.set(eg.id, strategies);
142
+ }
98
143
  for (const item of merged.slice(0, limit)) {
99
144
  const doc = knowledgeStore.getById(item.id);
100
145
  if (!doc)
@@ -133,6 +178,7 @@ export function multiStrategySearch(db, query, options) {
133
178
  query,
134
179
  ftsCount: ftsResults.length,
135
180
  graphCount: graphResults.length,
181
+ entityGraphCount: entityGraphResults.length,
136
182
  resultCount: results.length,
137
183
  });
138
184
  return results;
@@ -1 +1 @@
1
- {"version":3,"file":"multi-strategy-retrieval.js","sourceRoot":"","sources":["../../../src/core/rag/multi-strategy-retrieval.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"multi-strategy-retrieval.js","sourceRoot":"","sources":["../../../src/core/rag/multi-strategy-retrieval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Node Indexer — indexes graph nodes into the Knowledge Store
3
+ * so they become discoverable via RAG search.
4
+ *
5
+ * Converts node content (title, description, AC, tags) into
6
+ * knowledge documents with sourceType "graph_node".
7
+ */
8
+ import type Database from "better-sqlite3";
9
+ import type { GraphNode } from "../graph/graph-types.js";
10
+ /**
11
+ * Index a single graph node as a knowledge document.
12
+ * If a doc already exists for this node (same sourceId), it is replaced.
13
+ */
14
+ export declare function indexNodeAsKnowledge(db: Database.Database, node: GraphNode): void;
15
+ /**
16
+ * Remove a node's knowledge document.
17
+ */
18
+ export declare function removeNodeFromKnowledge(db: Database.Database, nodeId: string): void;
19
+ /**
20
+ * Index all existing graph nodes into the Knowledge Store.
21
+ * Used by reindex_knowledge with source "graph".
22
+ */
23
+ export declare function indexAllNodes(db: Database.Database, projectId?: string): {
24
+ indexed: number;
25
+ };
26
+ //# sourceMappingURL=node-indexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-indexer.d.ts","sourceRoot":"","sources":["../../../src/core/rag/node-indexer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAwB,MAAM,yBAAyB,CAAC;AAK/E;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAkDjF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAgBnF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAmC5F"}