@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
|
@@ -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): {
|
|
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,CAUnF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CA+BxE"}
|
|
@@ -0,0 +1,108 @@
|
|
|
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 { KnowledgeStore } from "../store/knowledge-store.js";
|
|
9
|
+
import { indexEntitiesForDoc } from "./entity-index-hook.js";
|
|
10
|
+
import { logger } from "../utils/logger.js";
|
|
11
|
+
/**
|
|
12
|
+
* Index a single graph node as a knowledge document.
|
|
13
|
+
* If a doc already exists for this node (same sourceId), it is replaced.
|
|
14
|
+
*/
|
|
15
|
+
export function indexNodeAsKnowledge(db, node) {
|
|
16
|
+
try {
|
|
17
|
+
const ks = new KnowledgeStore(db);
|
|
18
|
+
// Build rich content from node fields
|
|
19
|
+
const parts = [];
|
|
20
|
+
parts.push(`# ${node.title}`);
|
|
21
|
+
parts.push(`Type: ${node.type} | Status: ${node.status} | Priority: ${node.priority}`);
|
|
22
|
+
if (node.description) {
|
|
23
|
+
parts.push("", node.description);
|
|
24
|
+
}
|
|
25
|
+
if (node.acceptanceCriteria && node.acceptanceCriteria.length > 0) {
|
|
26
|
+
parts.push("", "## Acceptance Criteria");
|
|
27
|
+
for (const ac of node.acceptanceCriteria) {
|
|
28
|
+
parts.push(`- ${ac}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (node.tags && node.tags.length > 0) {
|
|
32
|
+
parts.push("", `Tags: ${node.tags.join(", ")}`);
|
|
33
|
+
}
|
|
34
|
+
const content = parts.join("\n");
|
|
35
|
+
// Remove existing doc for this node (update = delete + insert)
|
|
36
|
+
removeNodeFromKnowledge(db, node.id);
|
|
37
|
+
// Insert as knowledge document
|
|
38
|
+
const doc = ks.insert({
|
|
39
|
+
sourceType: "graph_node",
|
|
40
|
+
sourceId: node.id,
|
|
41
|
+
title: node.title,
|
|
42
|
+
content,
|
|
43
|
+
chunkIndex: 0,
|
|
44
|
+
metadata: {
|
|
45
|
+
nodeType: node.type,
|
|
46
|
+
status: node.status,
|
|
47
|
+
priority: node.priority,
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
// Extract entities from the node content
|
|
51
|
+
indexEntitiesForDoc(db, doc.id);
|
|
52
|
+
logger.debug("node-indexer:indexed", { nodeId: node.id, docId: doc.id });
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
logger.warn("node-indexer:index-failed", { nodeId: node.id, error: String(err) });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Remove a node's knowledge document.
|
|
60
|
+
*/
|
|
61
|
+
export function removeNodeFromKnowledge(db, nodeId) {
|
|
62
|
+
try {
|
|
63
|
+
const ks = new KnowledgeStore(db);
|
|
64
|
+
const docs = ks.getBySourceId(nodeId);
|
|
65
|
+
for (const doc of docs) {
|
|
66
|
+
ks.delete(doc.id);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
logger.warn("node-indexer:remove-failed", { nodeId, error: String(err) });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Index all existing graph nodes into the Knowledge Store.
|
|
75
|
+
* Used by reindex_knowledge with source "graph".
|
|
76
|
+
*/
|
|
77
|
+
export function indexAllNodes(db) {
|
|
78
|
+
try {
|
|
79
|
+
const rows = db
|
|
80
|
+
.prepare("SELECT * FROM nodes")
|
|
81
|
+
.all();
|
|
82
|
+
let indexed = 0;
|
|
83
|
+
for (const row of rows) {
|
|
84
|
+
const node = {
|
|
85
|
+
id: row.id,
|
|
86
|
+
type: row.type,
|
|
87
|
+
title: row.title,
|
|
88
|
+
description: row.description,
|
|
89
|
+
status: row.status,
|
|
90
|
+
priority: row.priority,
|
|
91
|
+
tags: row.tags ? JSON.parse(row.tags) : undefined,
|
|
92
|
+
acceptanceCriteria: row.acceptance_criteria ? JSON.parse(row.acceptance_criteria) : undefined,
|
|
93
|
+
parentId: row.parent_id,
|
|
94
|
+
createdAt: row.created_at,
|
|
95
|
+
updatedAt: row.updated_at,
|
|
96
|
+
};
|
|
97
|
+
indexNodeAsKnowledge(db, node);
|
|
98
|
+
indexed++;
|
|
99
|
+
}
|
|
100
|
+
logger.info("node-indexer:all-indexed", { indexed });
|
|
101
|
+
return { indexed };
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
logger.warn("node-indexer:index-all-failed", { error: String(err) });
|
|
105
|
+
return { indexed: 0 };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=node-indexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-indexer.js","sourceRoot":"","sources":["../../../src/core/rag/node-indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* - Query expansion with related terms
|
|
9
9
|
* - Query rewriting for FTS5 optimization
|
|
10
10
|
*/
|
|
11
|
+
import type Database from "better-sqlite3";
|
|
11
12
|
export type QueryIntent = "search" | "how_to" | "status" | "debug" | "compare" | "history";
|
|
12
13
|
export interface UnderstandingResult {
|
|
13
14
|
originalQuery: string;
|
|
@@ -34,4 +35,26 @@ export declare function expandQuery(query: string): string[];
|
|
|
34
35
|
* Analyzes a natural language query and returns structured understanding.
|
|
35
36
|
*/
|
|
36
37
|
export declare function understandQuery(query: string): UnderstandingResult;
|
|
38
|
+
export interface EntityMatch {
|
|
39
|
+
entityId: string;
|
|
40
|
+
name: string;
|
|
41
|
+
type: string;
|
|
42
|
+
score: number;
|
|
43
|
+
}
|
|
44
|
+
export interface DecomposedQuery extends UnderstandingResult {
|
|
45
|
+
/** High-level keys: intent + abstract concepts (expanded terms) */
|
|
46
|
+
highLevelKeys: string[];
|
|
47
|
+
/** Low-level keys: specific entities and technical terms */
|
|
48
|
+
lowLevelKeys: string[];
|
|
49
|
+
/** Entities matched from the Knowledge Graph */
|
|
50
|
+
entityMatches: EntityMatch[];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Decompose query into high/low level keys with KG entity matching.
|
|
54
|
+
* Extends understandQuery() — the original function is NOT modified.
|
|
55
|
+
*
|
|
56
|
+
* If the KG tables don't exist or are empty, entityMatches will be [].
|
|
57
|
+
* This ensures graceful degradation when KG is not populated.
|
|
58
|
+
*/
|
|
59
|
+
export declare function decomposeQuery(query: string, db: Database.Database): DecomposedQuery;
|
|
37
60
|
//# sourceMappingURL=query-understanding.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-understanding.d.ts","sourceRoot":"","sources":["../../../src/core/rag/query-understanding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"query-understanding.d.ts","sourceRoot":"","sources":["../../../src/core/rag/query-understanding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAO3C,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAE3F,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAYD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAKvD;AAiBD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ1D;AAmBD;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAYnD;AAUD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAuBlE;AAID,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAgB,SAAQ,mBAAmB;IAC1D,mEAAmE;IACnE,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gDAAgD;IAChD,aAAa,EAAE,WAAW,EAAE,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,eAAe,CAkFpF"}
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { tokenize } from "../search/tokenizer.js";
|
|
12
12
|
import { extractEntities } from "./enrichment-pipeline.js";
|
|
13
|
+
import { extractEntitiesFromText } from "./entity-extractor.js";
|
|
14
|
+
import { EntityStore } from "./entity-store.js";
|
|
13
15
|
import { logger } from "../utils/logger.js";
|
|
14
16
|
// ── Intent detection patterns ────────────────────────────
|
|
15
17
|
const INTENT_PATTERNS = [
|
|
@@ -120,4 +122,87 @@ export function understandQuery(query) {
|
|
|
120
122
|
sourceTypeFilter,
|
|
121
123
|
};
|
|
122
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* Decompose query into high/low level keys with KG entity matching.
|
|
127
|
+
* Extends understandQuery() — the original function is NOT modified.
|
|
128
|
+
*
|
|
129
|
+
* If the KG tables don't exist or are empty, entityMatches will be [].
|
|
130
|
+
* This ensures graceful degradation when KG is not populated.
|
|
131
|
+
*/
|
|
132
|
+
export function decomposeQuery(query, db) {
|
|
133
|
+
const base = understandQuery(query);
|
|
134
|
+
// High-level keys: intent + expanded terms (abstract concepts)
|
|
135
|
+
const highLevelKeys = [base.intent, ...base.expandedTerms];
|
|
136
|
+
// Low-level keys: extracted entities from the query text (specific terms)
|
|
137
|
+
const queryEntities = extractEntitiesFromText(query);
|
|
138
|
+
const lowLevelKeys = [
|
|
139
|
+
...base.entities,
|
|
140
|
+
...queryEntities.map((e) => e.name),
|
|
141
|
+
];
|
|
142
|
+
// Deduplicate
|
|
143
|
+
const uniqueLowKeys = [...new Set(lowLevelKeys)];
|
|
144
|
+
// Match against Knowledge Graph entities
|
|
145
|
+
const entityMatches = [];
|
|
146
|
+
try {
|
|
147
|
+
const entityStore = new EntityStore(db);
|
|
148
|
+
if (entityStore.hasKgTables()) {
|
|
149
|
+
// Search KG for each extracted entity name
|
|
150
|
+
const searched = new Set();
|
|
151
|
+
for (const key of uniqueLowKeys) {
|
|
152
|
+
if (searched.has(key.toLowerCase()))
|
|
153
|
+
continue;
|
|
154
|
+
searched.add(key.toLowerCase());
|
|
155
|
+
const matches = entityStore.findByName(key, 3);
|
|
156
|
+
for (const match of matches) {
|
|
157
|
+
// Score: exact match = 1.0, partial = 0.6
|
|
158
|
+
const score = match.normalizedName === key.toLowerCase() ? 1.0 : 0.6;
|
|
159
|
+
entityMatches.push({
|
|
160
|
+
entityId: match.id,
|
|
161
|
+
name: match.name,
|
|
162
|
+
type: match.type,
|
|
163
|
+
score,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Also try expanded terms against KG
|
|
168
|
+
for (const term of base.expandedTerms) {
|
|
169
|
+
if (searched.has(term.toLowerCase()))
|
|
170
|
+
continue;
|
|
171
|
+
searched.add(term.toLowerCase());
|
|
172
|
+
const matches = entityStore.findByName(term, 2);
|
|
173
|
+
for (const match of matches) {
|
|
174
|
+
entityMatches.push({
|
|
175
|
+
entityId: match.id,
|
|
176
|
+
name: match.name,
|
|
177
|
+
type: match.type,
|
|
178
|
+
score: 0.4, // Lower score for expanded term matches
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// KG not available — graceful degradation
|
|
186
|
+
logger.debug("decomposeQuery: KG tables not available, skipping entity matching");
|
|
187
|
+
}
|
|
188
|
+
// Deduplicate entity matches by entityId, keeping highest score
|
|
189
|
+
const entityMap = new Map();
|
|
190
|
+
for (const em of entityMatches) {
|
|
191
|
+
const existing = entityMap.get(em.entityId);
|
|
192
|
+
if (!existing || em.score > existing.score) {
|
|
193
|
+
entityMap.set(em.entityId, em);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
logger.debug("Query decomposed", {
|
|
197
|
+
highLevelKeys: highLevelKeys.length,
|
|
198
|
+
lowLevelKeys: uniqueLowKeys.length,
|
|
199
|
+
entityMatches: entityMap.size,
|
|
200
|
+
});
|
|
201
|
+
return {
|
|
202
|
+
...base,
|
|
203
|
+
highLevelKeys,
|
|
204
|
+
lowLevelKeys: uniqueLowKeys,
|
|
205
|
+
entityMatches: Array.from(entityMap.values()).sort((a, b) => b.score - a.score),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
123
208
|
//# sourceMappingURL=query-understanding.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-understanding.js","sourceRoot":"","sources":["../../../src/core/rag/query-understanding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"query-understanding.js","sourceRoot":"","sources":["../../../src/core/rag/query-understanding.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../src/core/store/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../src/core/store/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAsf3C,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CA6BzD;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAGvD"}
|
|
@@ -439,6 +439,57 @@ const migrations = [
|
|
|
439
439
|
CREATE INDEX IF NOT EXISTS idx_kusage_action ON knowledge_usage_log(action);
|
|
440
440
|
`,
|
|
441
441
|
},
|
|
442
|
+
{
|
|
443
|
+
version: 12,
|
|
444
|
+
description: "Knowledge Graph — entities, relations, mentions with FTS5 index",
|
|
445
|
+
sql: `
|
|
446
|
+
CREATE TABLE IF NOT EXISTS kg_entities (
|
|
447
|
+
id TEXT PRIMARY KEY,
|
|
448
|
+
name TEXT NOT NULL,
|
|
449
|
+
type TEXT NOT NULL,
|
|
450
|
+
normalized_name TEXT NOT NULL,
|
|
451
|
+
aliases TEXT DEFAULT '[]',
|
|
452
|
+
description TEXT,
|
|
453
|
+
metadata TEXT DEFAULT '{}',
|
|
454
|
+
mention_count INTEGER DEFAULT 0,
|
|
455
|
+
created_at TEXT NOT NULL,
|
|
456
|
+
updated_at TEXT NOT NULL
|
|
457
|
+
);
|
|
458
|
+
|
|
459
|
+
CREATE INDEX IF NOT EXISTS idx_kg_entities_type ON kg_entities(type);
|
|
460
|
+
CREATE INDEX IF NOT EXISTS idx_kg_entities_normalized ON kg_entities(normalized_name);
|
|
461
|
+
|
|
462
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS kg_entities_fts USING fts5(
|
|
463
|
+
name, aliases, description
|
|
464
|
+
);
|
|
465
|
+
|
|
466
|
+
CREATE TABLE IF NOT EXISTS kg_relations (
|
|
467
|
+
id TEXT PRIMARY KEY,
|
|
468
|
+
from_entity_id TEXT NOT NULL REFERENCES kg_entities(id),
|
|
469
|
+
to_entity_id TEXT NOT NULL REFERENCES kg_entities(id),
|
|
470
|
+
relation_type TEXT NOT NULL,
|
|
471
|
+
weight REAL DEFAULT 1.0,
|
|
472
|
+
source_doc_id TEXT,
|
|
473
|
+
created_at TEXT NOT NULL,
|
|
474
|
+
UNIQUE(from_entity_id, to_entity_id, relation_type)
|
|
475
|
+
);
|
|
476
|
+
|
|
477
|
+
CREATE INDEX IF NOT EXISTS idx_kg_relations_from ON kg_relations(from_entity_id);
|
|
478
|
+
CREATE INDEX IF NOT EXISTS idx_kg_relations_to ON kg_relations(to_entity_id);
|
|
479
|
+
|
|
480
|
+
CREATE TABLE IF NOT EXISTS kg_mentions (
|
|
481
|
+
id TEXT PRIMARY KEY,
|
|
482
|
+
entity_id TEXT NOT NULL REFERENCES kg_entities(id),
|
|
483
|
+
doc_id TEXT NOT NULL,
|
|
484
|
+
context TEXT,
|
|
485
|
+
position INTEGER DEFAULT 0,
|
|
486
|
+
created_at TEXT NOT NULL
|
|
487
|
+
);
|
|
488
|
+
|
|
489
|
+
CREATE INDEX IF NOT EXISTS idx_kg_mentions_entity ON kg_mentions(entity_id);
|
|
490
|
+
CREATE INDEX IF NOT EXISTS idx_kg_mentions_doc ON kg_mentions(doc_id);
|
|
491
|
+
`,
|
|
492
|
+
},
|
|
442
493
|
];
|
|
443
494
|
export function runMigrations(db) {
|
|
444
495
|
// Create migrations tracking table
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../src/core/store/migrations.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../src/core/store/migrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clone-node.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/clone-node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"clone-node.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/clone-node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AA2EpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CA4C7E"}
|
|
@@ -4,6 +4,7 @@ import { generateId } from "../../core/utils/id.js";
|
|
|
4
4
|
import { now } from "../../core/utils/time.js";
|
|
5
5
|
import { logger } from "../../core/utils/logger.js";
|
|
6
6
|
import { mcpText, mcpError } from "../response-helpers.js";
|
|
7
|
+
import { indexNodeAsKnowledge } from "../../core/rag/node-indexer.js";
|
|
7
8
|
function cloneSingle(store, source, parentId, timestamp) {
|
|
8
9
|
const clone = {
|
|
9
10
|
id: generateId("node"),
|
|
@@ -77,10 +78,14 @@ export function registerCloneNode(server, store) {
|
|
|
77
78
|
if (deep) {
|
|
78
79
|
const cloned = [];
|
|
79
80
|
cloneDeep(store, id, parentForClone, timestamp, cloned);
|
|
81
|
+
for (const c of cloned) {
|
|
82
|
+
indexNodeAsKnowledge(store.getDb(), c);
|
|
83
|
+
}
|
|
80
84
|
logger.info("tool:clone_node:ok", { sourceId: id, deep: true, clonedCount: cloned.length });
|
|
81
85
|
return mcpText({ ok: true, clonedCount: cloned.length, nodes: cloned });
|
|
82
86
|
}
|
|
83
87
|
const clone = cloneSingle(store, source, parentForClone, timestamp);
|
|
88
|
+
indexNodeAsKnowledge(store.getDb(), clone);
|
|
84
89
|
logger.info("tool:clone_node:ok", { sourceId: id, deep: false, cloneId: clone.id });
|
|
85
90
|
return mcpText({ ok: true, node: clone });
|
|
86
91
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clone-node.js","sourceRoot":"","sources":["../../../src/mcp/tools/clone-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAI3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"clone-node.js","sourceRoot":"","sources":["../../../src/mcp/tools/clone-node.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-graph.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/import-graph.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"import-graph.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/import-graph.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAQpE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CA2F/E"}
|
|
@@ -3,6 +3,8 @@ import { readFileSync } from "node:fs";
|
|
|
3
3
|
import { mergeGraph } from "../../core/importer/import-graph.js";
|
|
4
4
|
import { logger } from "../../core/utils/logger.js";
|
|
5
5
|
import { mcpText, mcpError } from "../response-helpers.js";
|
|
6
|
+
import { indexEntitiesForSource } from "../../core/rag/entity-index-hook.js";
|
|
7
|
+
import { indexNodeAsKnowledge } from "../../core/rag/node-indexer.js";
|
|
6
8
|
export function registerImportGraph(server, store) {
|
|
7
9
|
server.tool("import_graph", "Import and merge an exported graph JSON into the local graph without overriding existing data. " +
|
|
8
10
|
"Nodes that already exist locally are kept (local wins). New nodes and edges are added. " +
|
|
@@ -50,6 +52,18 @@ export function registerImportGraph(server, store) {
|
|
|
50
52
|
// 3. Merge
|
|
51
53
|
try {
|
|
52
54
|
const result = mergeGraph(store, parsed, { dryRun: dry_run });
|
|
55
|
+
// Index merged nodes into Knowledge Store + KG (skip on dry_run)
|
|
56
|
+
if (!dry_run && result.nodesInserted > 0) {
|
|
57
|
+
try {
|
|
58
|
+
for (const node of parsed.nodes) {
|
|
59
|
+
indexNodeAsKnowledge(store.getDb(), node);
|
|
60
|
+
}
|
|
61
|
+
indexEntitiesForSource(store.getDb(), "graph_node");
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
logger.warn("import_graph:indexing-failed");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
53
67
|
logger.info("tool:import_graph:ok", {
|
|
54
68
|
sourceProject: result.sourceProject,
|
|
55
69
|
nodesInserted: result.nodesInserted,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-graph.js","sourceRoot":"","sources":["../../../src/mcp/tools/import-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAEjE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"import-graph.js","sourceRoot":"","sources":["../../../src/mcp/tools/import-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAEjE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAEtE,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,KAAkB;IACvE,MAAM,CAAC,IAAI,CACT,cAAc,EACd,iGAAiG;QACjG,yFAAyF;QACzF,oDAAoD;QACpD,sFAAsF,EACtF;QACE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,0EAA0E,CAAC;QACvF,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,2DAA2D,CAAC;QACxE,OAAO,EAAE,CAAC;aACP,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CAAC,kFAAkF,CAAC;KAChG,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;QACrC,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAEnF,qDAAqD;QACrD,IAAI,UAAkB,CAAC;QACvB,IAAI,KAAK,EAAE,CAAC;YACV,UAAU,GAAG,KAAK,CAAC;QACrB,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,UAAU,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC/C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,QAAQ,CAAC,wBAAwB,QAAQ,MAAM,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5G,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,QAAQ,CAAC,kFAAkF,CAAC,CAAC;QACtG,CAAC;QAED,gBAAgB;QAChB,IAAI,MAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAkB,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,QAAQ,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QAED,WAAW;QACX,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAE9D,iEAAiE;YACjE,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;gBACzC,IAAI,CAAC;oBACH,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;wBAChC,oBAAoB,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;oBAC5C,CAAC;oBACD,sBAAsB,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,YAAY,CAAC,CAAC;gBACtD,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;gBAClC,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,MAAM,EAAE,OAAO;aAChB,CAAC,CAAC;YAEH,OAAO,OAAO,CAAC;gBACb,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,OAAO;gBACf,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,OAAO,EAAE,OAAO;oBACd,CAAC,CAAC,0BAA0B,MAAM,CAAC,aAAa,cAAc,MAAM,CAAC,aAAa,gBAAgB,MAAM,CAAC,aAAa,MAAM,MAAM,CAAC,YAAY,cAAc,MAAM,CAAC,YAAY,+BAA+B;oBAC/M,CAAC,CAAC,UAAU,MAAM,CAAC,aAAa,cAAc,MAAM,CAAC,aAAa,gBAAgB,MAAM,CAAC,aAAa,MAAM,MAAM,CAAC,YAAY,cAAc,MAAM,CAAC,YAAY,sDAAsD;aACzN,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-prd.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/import-prd.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"import-prd.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/import-prd.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAUpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAiF7E"}
|
|
@@ -5,6 +5,7 @@ import { extractEntities } from "../../core/parser/extract.js";
|
|
|
5
5
|
import { convertToGraph } from "../../core/importer/prd-to-graph.js";
|
|
6
6
|
import { KnowledgeStore } from "../../core/store/knowledge-store.js";
|
|
7
7
|
import { indexPrdContent } from "../../core/rag/prd-indexer.js";
|
|
8
|
+
import { indexEntitiesForSource } from "../../core/rag/entity-index-hook.js";
|
|
8
9
|
import { logger } from "../../core/utils/logger.js";
|
|
9
10
|
import { mcpText, mcpError } from "../response-helpers.js";
|
|
10
11
|
export function registerImportPrd(server, store) {
|
|
@@ -46,6 +47,7 @@ export function registerImportPrd(server, store) {
|
|
|
46
47
|
const knowledgeStore = new KnowledgeStore(store.getDb());
|
|
47
48
|
const indexResult = indexPrdContent(knowledgeStore, content, sourceFileName, "ANALYZE");
|
|
48
49
|
knowledgeDocsIndexed = indexResult.documentsIndexed;
|
|
50
|
+
indexEntitiesForSource(store.getDb(), "prd");
|
|
49
51
|
}
|
|
50
52
|
catch (err) {
|
|
51
53
|
logger.warn("tool:import_prd:knowledge_index_failed", { error: String(err) });
|