@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.
- package/dist/core/code/code-types.d.ts +3 -3
- package/dist/core/integrations/integration-orchestrator.d.ts.map +1 -1
- package/dist/core/integrations/integration-orchestrator.js +2 -0
- package/dist/core/integrations/integration-orchestrator.js.map +1 -1
- package/dist/core/rag/entity-extractor.d.ts +30 -0
- package/dist/core/rag/entity-extractor.d.ts.map +1 -0
- package/dist/core/rag/entity-extractor.js +224 -0
- package/dist/core/rag/entity-extractor.js.map +1 -0
- package/dist/core/rag/entity-index-hook.d.ts +25 -0
- package/dist/core/rag/entity-index-hook.d.ts.map +1 -0
- package/dist/core/rag/entity-index-hook.js +75 -0
- package/dist/core/rag/entity-index-hook.js.map +1 -0
- package/dist/core/rag/entity-indexer.d.ts +33 -0
- package/dist/core/rag/entity-indexer.d.ts.map +1 -0
- package/dist/core/rag/entity-indexer.js +91 -0
- package/dist/core/rag/entity-indexer.js.map +1 -0
- package/dist/core/rag/entity-store.d.ts +91 -0
- package/dist/core/rag/entity-store.d.ts.map +1 -0
- package/dist/core/rag/entity-store.js +395 -0
- package/dist/core/rag/entity-store.js.map +1 -0
- package/dist/core/rag/multi-strategy-retrieval.d.ts.map +1 -1
- package/dist/core/rag/multi-strategy-retrieval.js +49 -3
- package/dist/core/rag/multi-strategy-retrieval.js.map +1 -1
- package/dist/core/rag/node-indexer.d.ts +26 -0
- package/dist/core/rag/node-indexer.d.ts.map +1 -0
- package/dist/core/rag/node-indexer.js +120 -0
- package/dist/core/rag/node-indexer.js.map +1 -0
- package/dist/core/rag/query-understanding.d.ts +23 -0
- package/dist/core/rag/query-understanding.d.ts.map +1 -1
- package/dist/core/rag/query-understanding.js +85 -0
- package/dist/core/rag/query-understanding.js.map +1 -1
- package/dist/core/store/migrations.d.ts.map +1 -1
- package/dist/core/store/migrations.js +51 -0
- package/dist/core/store/migrations.js.map +1 -1
- package/dist/mcp/tools/clone-node.d.ts.map +1 -1
- package/dist/mcp/tools/clone-node.js +5 -0
- package/dist/mcp/tools/clone-node.js.map +1 -1
- package/dist/mcp/tools/import-graph.d.ts.map +1 -1
- package/dist/mcp/tools/import-graph.js +23 -1
- package/dist/mcp/tools/import-graph.js.map +1 -1
- package/dist/mcp/tools/import-prd.d.ts.map +1 -1
- package/dist/mcp/tools/import-prd.js +2 -0
- package/dist/mcp/tools/import-prd.js.map +1 -1
- package/dist/mcp/tools/journey.d.ts.map +1 -1
- package/dist/mcp/tools/journey.js +2 -0
- package/dist/mcp/tools/journey.js.map +1 -1
- package/dist/mcp/tools/manage-skill.d.ts.map +1 -1
- package/dist/mcp/tools/manage-skill.js +3 -0
- package/dist/mcp/tools/manage-skill.js.map +1 -1
- package/dist/mcp/tools/memory.d.ts.map +1 -1
- package/dist/mcp/tools/memory.js +2 -0
- package/dist/mcp/tools/memory.js.map +1 -1
- package/dist/mcp/tools/node.d.ts.map +1 -1
- package/dist/mcp/tools/node.js +5 -0
- package/dist/mcp/tools/node.js.map +1 -1
- package/dist/mcp/tools/plan-sprint.d.ts.map +1 -1
- package/dist/mcp/tools/plan-sprint.js +3 -1
- package/dist/mcp/tools/plan-sprint.js.map +1 -1
- package/dist/mcp/tools/reindex-knowledge.d.ts.map +1 -1
- package/dist/mcp/tools/reindex-knowledge.js +43 -1
- package/dist/mcp/tools/reindex-knowledge.js.map +1 -1
- package/dist/mcp/tools/siebel-import-docs.d.ts.map +1 -1
- package/dist/mcp/tools/siebel-import-docs.js +3 -0
- package/dist/mcp/tools/siebel-import-docs.js.map +1 -1
- package/dist/mcp/tools/siebel-import-sif.d.ts.map +1 -1
- package/dist/mcp/tools/siebel-import-sif.js +2 -0
- package/dist/mcp/tools/siebel-import-sif.js.map +1 -1
- package/dist/mcp/tools/sync-stack-docs.d.ts.map +1 -1
- package/dist/mcp/tools/sync-stack-docs.js +2 -0
- package/dist/mcp/tools/sync-stack-docs.js.map +1 -1
- package/dist/mcp/tools/update-status.d.ts.map +1 -1
- package/dist/mcp/tools/update-status.js +2 -0
- package/dist/mcp/tools/update-status.js.map +1 -1
- package/dist/mcp/tools/validate.d.ts.map +1 -1
- package/dist/mcp/tools/validate.js +3 -0
- package/dist/mcp/tools/validate.js.map +1 -1
- package/dist/schemas/entity.schema.d.ts +80 -0
- package/dist/schemas/entity.schema.d.ts.map +1 -0
- package/dist/schemas/entity.schema.js +56 -0
- package/dist/schemas/entity.schema.js.map +1 -0
- package/dist/schemas/knowledge.schema.d.ts +2 -0
- package/dist/schemas/knowledge.schema.d.ts.map +1 -1
- package/dist/schemas/knowledge.schema.js +1 -1
- package/dist/schemas/knowledge.schema.js.map +1 -1
- package/dist/schemas/siebel.schema.d.ts +3 -3
- 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;
|
|
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
|
-
|
|
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
|
|
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"}
|