@mcp-graph-workflow/mcp-graph 5.7.0 → 5.9.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/dist/core/code/code-types.d.ts +3 -3
- package/dist/core/context/rag-context.d.ts.map +1 -1
- package/dist/core/context/rag-context.js +9 -5
- package/dist/core/context/rag-context.js.map +1 -1
- 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 +108 -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 +14 -0
- 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 +4 -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/rag-context.d.ts +2 -0
- package/dist/mcp/tools/rag-context.d.ts.map +1 -1
- package/dist/mcp/tools/rag-context.js +127 -9
- package/dist/mcp/tools/rag-context.js.map +1 -1
- package/dist/mcp/tools/reindex-knowledge.d.ts.map +1 -1
- package/dist/mcp/tools/reindex-knowledge.js +44 -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 +5 -5
- package/package.json +2 -2
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entity Indexer — orchestrates entity extraction from knowledge documents
|
|
3
|
+
* and populates the EntityStore (Knowledge Graph).
|
|
4
|
+
*
|
|
5
|
+
* Processes knowledge documents to extract entities and relations,
|
|
6
|
+
* storing them in the KG tables for graph-based retrieval.
|
|
7
|
+
*/
|
|
8
|
+
import { EntityStore } from "./entity-store.js";
|
|
9
|
+
import { extractEntitiesFromText, extractRelationsFromText } from "./entity-extractor.js";
|
|
10
|
+
import { logger } from "../utils/logger.js";
|
|
11
|
+
// ── Core functions ───────────────────────────────────────
|
|
12
|
+
/**
|
|
13
|
+
* Index a single knowledge document — extract entities and relations,
|
|
14
|
+
* store in the KG.
|
|
15
|
+
*/
|
|
16
|
+
export function indexDocument(db, docId) {
|
|
17
|
+
const store = new EntityStore(db);
|
|
18
|
+
// Fetch the document content
|
|
19
|
+
const doc = db
|
|
20
|
+
.prepare("SELECT id, title, content FROM knowledge_documents WHERE id = ?")
|
|
21
|
+
.get(docId);
|
|
22
|
+
if (!doc) {
|
|
23
|
+
logger.debug("entity-indexer:doc-not-found", { docId });
|
|
24
|
+
return { docId, entitiesCreated: 0, relationsCreated: 0 };
|
|
25
|
+
}
|
|
26
|
+
// Combine title + content for richer extraction
|
|
27
|
+
const fullText = `${doc.title}\n${doc.content}`;
|
|
28
|
+
// Extract entities
|
|
29
|
+
const extractedEntities = extractEntitiesFromText(fullText);
|
|
30
|
+
let entitiesCreated = 0;
|
|
31
|
+
// Map entity names to their store IDs for relation linking
|
|
32
|
+
const entityNameToId = new Map();
|
|
33
|
+
for (const extracted of extractedEntities) {
|
|
34
|
+
const entity = store.upsertEntity(extracted.name, extracted.type, docId);
|
|
35
|
+
entityNameToId.set(extracted.name, entity.id);
|
|
36
|
+
entitiesCreated++;
|
|
37
|
+
}
|
|
38
|
+
// Extract relations
|
|
39
|
+
const extractedRelations = extractRelationsFromText(fullText, extractedEntities);
|
|
40
|
+
let relationsCreated = 0;
|
|
41
|
+
for (const rel of extractedRelations) {
|
|
42
|
+
const fromId = entityNameToId.get(rel.fromName);
|
|
43
|
+
const toId = entityNameToId.get(rel.toName);
|
|
44
|
+
if (fromId && toId) {
|
|
45
|
+
const result = store.addRelation(fromId, toId, rel.relationType, rel.weight, docId);
|
|
46
|
+
if (result)
|
|
47
|
+
relationsCreated++;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
logger.debug("entity-indexer:indexed", {
|
|
51
|
+
docId,
|
|
52
|
+
entities: entitiesCreated,
|
|
53
|
+
relations: relationsCreated,
|
|
54
|
+
});
|
|
55
|
+
return { docId, entitiesCreated, relationsCreated };
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Reindex all knowledge documents — clear KG and rebuild from scratch.
|
|
59
|
+
*/
|
|
60
|
+
export function reindexAll(db) {
|
|
61
|
+
const store = new EntityStore(db);
|
|
62
|
+
// Clear existing KG data
|
|
63
|
+
store.clear();
|
|
64
|
+
// Fetch all knowledge documents
|
|
65
|
+
const docs = db
|
|
66
|
+
.prepare("SELECT id FROM knowledge_documents")
|
|
67
|
+
.all();
|
|
68
|
+
let documentsProcessed = 0;
|
|
69
|
+
for (const doc of docs) {
|
|
70
|
+
indexDocument(db, doc.id);
|
|
71
|
+
documentsProcessed++;
|
|
72
|
+
}
|
|
73
|
+
const stats = store.stats();
|
|
74
|
+
logger.info("entity-indexer:reindex-complete", {
|
|
75
|
+
documentsProcessed,
|
|
76
|
+
...stats,
|
|
77
|
+
});
|
|
78
|
+
return {
|
|
79
|
+
documentsProcessed,
|
|
80
|
+
totalEntities: stats.entities,
|
|
81
|
+
totalRelations: stats.relations,
|
|
82
|
+
totalMentions: stats.mentions,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Index a batch of documents by their IDs.
|
|
87
|
+
*/
|
|
88
|
+
export function indexBatch(db, docIds) {
|
|
89
|
+
return docIds.map((docId) => indexDocument(db, docId));
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=entity-indexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-indexer.js","sourceRoot":"","sources":["../../../src/core/rag/entity-indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|