@mcp-graph-workflow/mcp-graph 5.6.1 → 5.7.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.
Files changed (53) hide show
  1. package/README.md +2 -2
  2. package/dist/core/importer/import-graph.d.ts +23 -0
  3. package/dist/core/importer/import-graph.d.ts.map +1 -0
  4. package/dist/core/importer/import-graph.js +127 -0
  5. package/dist/core/importer/import-graph.js.map +1 -0
  6. package/dist/core/rag/benchmark-indexer.d.ts +32 -0
  7. package/dist/core/rag/benchmark-indexer.d.ts.map +1 -0
  8. package/dist/core/rag/benchmark-indexer.js +85 -0
  9. package/dist/core/rag/benchmark-indexer.js.map +1 -0
  10. package/dist/core/rag/citation-mapper.d.ts +32 -0
  11. package/dist/core/rag/citation-mapper.d.ts.map +1 -0
  12. package/dist/core/rag/citation-mapper.js +45 -0
  13. package/dist/core/rag/citation-mapper.js.map +1 -0
  14. package/dist/core/rag/enrichment-pipeline.d.ts +48 -0
  15. package/dist/core/rag/enrichment-pipeline.d.ts.map +1 -0
  16. package/dist/core/rag/enrichment-pipeline.js +127 -0
  17. package/dist/core/rag/enrichment-pipeline.js.map +1 -0
  18. package/dist/core/rag/post-retrieval.d.ts +40 -0
  19. package/dist/core/rag/post-retrieval.d.ts.map +1 -0
  20. package/dist/core/rag/post-retrieval.js +119 -0
  21. package/dist/core/rag/post-retrieval.js.map +1 -0
  22. package/dist/core/rag/query-cache.d.ts +54 -0
  23. package/dist/core/rag/query-cache.d.ts.map +1 -0
  24. package/dist/core/rag/query-cache.js +104 -0
  25. package/dist/core/rag/query-cache.js.map +1 -0
  26. package/dist/core/rag/query-understanding.d.ts +37 -0
  27. package/dist/core/rag/query-understanding.d.ts.map +1 -0
  28. package/dist/core/rag/query-understanding.js +123 -0
  29. package/dist/core/rag/query-understanding.js.map +1 -0
  30. package/dist/core/rag/rag-trace.d.ts +67 -0
  31. package/dist/core/rag/rag-trace.d.ts.map +1 -0
  32. package/dist/core/rag/rag-trace.js +82 -0
  33. package/dist/core/rag/rag-trace.js.map +1 -0
  34. package/dist/core/rag/source-contribution.d.ts +37 -0
  35. package/dist/core/rag/source-contribution.d.ts.map +1 -0
  36. package/dist/core/rag/source-contribution.js +54 -0
  37. package/dist/core/rag/source-contribution.js.map +1 -0
  38. package/dist/core/store/sqlite-store.d.ts +9 -0
  39. package/dist/core/store/sqlite-store.d.ts.map +1 -1
  40. package/dist/core/store/sqlite-store.js +42 -0
  41. package/dist/core/store/sqlite-store.js.map +1 -1
  42. package/dist/mcp/tools/import-graph.d.ts +4 -0
  43. package/dist/mcp/tools/import-graph.d.ts.map +1 -0
  44. package/dist/mcp/tools/import-graph.js +81 -0
  45. package/dist/mcp/tools/import-graph.js.map +1 -0
  46. package/dist/mcp/tools/index.d.ts.map +1 -1
  47. package/dist/mcp/tools/index.js +2 -0
  48. package/dist/mcp/tools/index.js.map +1 -1
  49. package/dist/schemas/knowledge.schema.d.ts +2 -0
  50. package/dist/schemas/knowledge.schema.d.ts.map +1 -1
  51. package/dist/schemas/knowledge.schema.js +1 -0
  52. package/dist/schemas/knowledge.schema.js.map +1 -1
  53. package/package.json +1 -1
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Post-Retrieval Pipeline — processes search results after initial retrieval.
3
+ *
4
+ * Pipeline stages:
5
+ * 1. Deduplication — remove results with identical content
6
+ * 2. Reranking — boost results with higher query keyword overlap
7
+ * 3. Chunk stitching — merge adjacent chunks from the same source
8
+ * 4. Limit — enforce maxResults
9
+ */
10
+ import { tokenize } from "../search/tokenizer.js";
11
+ import { logger } from "../utils/logger.js";
12
+ /**
13
+ * Remove results with identical content, keeping the highest-scored one.
14
+ */
15
+ export function deduplicateResults(results) {
16
+ const seen = new Map();
17
+ for (const result of results) {
18
+ const key = result.content.trim().toLowerCase();
19
+ const existing = seen.get(key);
20
+ if (!existing || result.score > existing.score) {
21
+ seen.set(key, result);
22
+ }
23
+ }
24
+ return Array.from(seen.values()).sort((a, b) => b.score - a.score);
25
+ }
26
+ /**
27
+ * Rerank results by keyword overlap with the query.
28
+ * Combines original score with keyword overlap boost.
29
+ */
30
+ export function rerankByKeywordOverlap(results, query) {
31
+ const queryTokens = new Set(tokenize(query));
32
+ if (queryTokens.size === 0)
33
+ return results;
34
+ const scored = results.map((r) => {
35
+ const contentTokens = tokenize(r.content);
36
+ const overlap = contentTokens.filter((t) => queryTokens.has(t)).length;
37
+ const overlapRatio = contentTokens.length > 0 ? overlap / queryTokens.size : 0;
38
+ // Combine: 70% original score + 30% keyword overlap
39
+ const combinedScore = r.score * 0.7 + overlapRatio * 0.3;
40
+ return { ...r, score: Math.round(combinedScore * 10000) / 10000 };
41
+ });
42
+ return scored.sort((a, b) => b.score - a.score);
43
+ }
44
+ /**
45
+ * Merge adjacent chunks from the same source document.
46
+ * Chunks are considered adjacent if their chunk indices differ by 1.
47
+ */
48
+ export function stitchAdjacentChunks(results, chunkMeta) {
49
+ if (results.length <= 1 || chunkMeta.size === 0)
50
+ return results;
51
+ // Group by sourceId
52
+ const groups = new Map();
53
+ const ungrouped = [];
54
+ for (const r of results) {
55
+ const chunkIdx = chunkMeta.get(r.id);
56
+ if (chunkIdx === undefined) {
57
+ ungrouped.push(r);
58
+ continue;
59
+ }
60
+ const group = groups.get(r.sourceId) ?? [];
61
+ group.push(r);
62
+ groups.set(r.sourceId, group);
63
+ }
64
+ const stitched = [];
65
+ for (const [_sourceId, group] of groups) {
66
+ // Sort by chunk index
67
+ group.sort((a, b) => (chunkMeta.get(a.id) ?? 0) - (chunkMeta.get(b.id) ?? 0));
68
+ let current = group[0];
69
+ let currentIdx = chunkMeta.get(current.id) ?? 0;
70
+ for (let i = 1; i < group.length; i++) {
71
+ const next = group[i];
72
+ const nextIdx = chunkMeta.get(next.id) ?? 0;
73
+ if (nextIdx === currentIdx + 1) {
74
+ // Stitch: merge content, keep higher score
75
+ current = {
76
+ ...current,
77
+ content: current.content + "\n\n" + next.content,
78
+ score: Math.max(current.score, next.score),
79
+ strategies: [...new Set([...current.strategies, ...next.strategies])],
80
+ };
81
+ currentIdx = nextIdx;
82
+ }
83
+ else {
84
+ stitched.push(current);
85
+ current = next;
86
+ currentIdx = nextIdx;
87
+ }
88
+ }
89
+ stitched.push(current);
90
+ }
91
+ const final = [...stitched, ...ungrouped].sort((a, b) => b.score - a.score);
92
+ return final;
93
+ }
94
+ /**
95
+ * Full post-retrieval pipeline.
96
+ */
97
+ export function postRetrievalPipeline(options) {
98
+ const { query, results, maxResults, chunkMeta } = options;
99
+ // Stage 1: Deduplication
100
+ const deduped = deduplicateResults(results);
101
+ const deduplicated = results.length - deduped.length;
102
+ // Stage 2: Reranking
103
+ const reranked = rerankByKeywordOverlap(deduped, query);
104
+ // Stage 3: Chunk stitching (if metadata available)
105
+ const stitched = chunkMeta
106
+ ? stitchAdjacentChunks(reranked, chunkMeta)
107
+ : reranked;
108
+ const stitchedChunks = reranked.length - stitched.length;
109
+ // Stage 4: Limit
110
+ const limited = stitched.slice(0, maxResults);
111
+ logger.debug("Post-retrieval pipeline complete", {
112
+ input: results.length,
113
+ deduplicated,
114
+ stitchedChunks,
115
+ output: limited.length,
116
+ });
117
+ return { results: limited, deduplicated, stitchedChunks };
118
+ }
119
+ //# sourceMappingURL=post-retrieval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-retrieval.js","sourceRoot":"","sources":["../../../src/core/rag/post-retrieval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Query Cache — in-memory cache for RAG search results.
3
+ *
4
+ * Features:
5
+ * - TTL-based expiration
6
+ * - LRU eviction when maxSize exceeded
7
+ * - Query normalization (case-insensitive, trimmed)
8
+ * - Hit/miss statistics
9
+ * - Bulk invalidation (e.g., when knowledge store changes)
10
+ */
11
+ import type { RankedResult } from "./multi-strategy-retrieval.js";
12
+ export interface CacheOptions {
13
+ ttlMs: number;
14
+ maxSize: number;
15
+ }
16
+ export interface CacheStats {
17
+ size: number;
18
+ hits: number;
19
+ misses: number;
20
+ evictions: number;
21
+ }
22
+ /**
23
+ * In-memory query cache with TTL and LRU eviction.
24
+ */
25
+ export declare class QueryCache {
26
+ private entries;
27
+ private ttlMs;
28
+ private maxSize;
29
+ private hits;
30
+ private misses;
31
+ private evictions;
32
+ constructor(options: CacheOptions);
33
+ /**
34
+ * Retrieve cached results for a query, or undefined if miss/expired.
35
+ */
36
+ get(query: string): RankedResult[] | undefined;
37
+ /**
38
+ * Store results for a query.
39
+ */
40
+ set(query: string, results: RankedResult[]): void;
41
+ /**
42
+ * Invalidate all cached entries.
43
+ */
44
+ invalidateAll(): void;
45
+ /**
46
+ * Get cache statistics.
47
+ */
48
+ getStats(): CacheStats;
49
+ /**
50
+ * Evict the oldest (by creation time) entry.
51
+ */
52
+ private evictOldest;
53
+ }
54
+ //# sourceMappingURL=query-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-cache.d.ts","sourceRoot":"","sources":["../../../src/core/rag/query-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGlE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAQD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AASD;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,SAAS,CAAa;gBAElB,OAAO,EAAE,YAAY;IAKjC;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE,GAAG,SAAS;IAqB9C;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI;IAejD;;OAEG;IACH,aAAa,IAAI,IAAI;IAMrB;;OAEG;IACH,QAAQ,IAAI,UAAU;IAStB;;OAEG;IACH,OAAO,CAAC,WAAW;CAgBpB"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Query Cache — in-memory cache for RAG search results.
3
+ *
4
+ * Features:
5
+ * - TTL-based expiration
6
+ * - LRU eviction when maxSize exceeded
7
+ * - Query normalization (case-insensitive, trimmed)
8
+ * - Hit/miss statistics
9
+ * - Bulk invalidation (e.g., when knowledge store changes)
10
+ */
11
+ import { logger } from "../utils/logger.js";
12
+ /**
13
+ * Normalize query for consistent cache keys.
14
+ */
15
+ function normalizeKey(query) {
16
+ return query.trim().toLowerCase();
17
+ }
18
+ /**
19
+ * In-memory query cache with TTL and LRU eviction.
20
+ */
21
+ export class QueryCache {
22
+ entries = new Map();
23
+ ttlMs;
24
+ maxSize;
25
+ hits = 0;
26
+ misses = 0;
27
+ evictions = 0;
28
+ constructor(options) {
29
+ this.ttlMs = options.ttlMs;
30
+ this.maxSize = options.maxSize;
31
+ }
32
+ /**
33
+ * Retrieve cached results for a query, or undefined if miss/expired.
34
+ */
35
+ get(query) {
36
+ const key = normalizeKey(query);
37
+ const entry = this.entries.get(key);
38
+ if (!entry) {
39
+ this.misses++;
40
+ return undefined;
41
+ }
42
+ // Check TTL
43
+ if (Date.now() - entry.createdAt > this.ttlMs) {
44
+ this.entries.delete(key);
45
+ this.misses++;
46
+ return undefined;
47
+ }
48
+ entry.lastAccessedAt = Date.now();
49
+ this.hits++;
50
+ return entry.results;
51
+ }
52
+ /**
53
+ * Store results for a query.
54
+ */
55
+ set(query, results) {
56
+ const key = normalizeKey(query);
57
+ // Evict if at capacity
58
+ if (this.entries.size >= this.maxSize && !this.entries.has(key)) {
59
+ this.evictOldest();
60
+ }
61
+ this.entries.set(key, {
62
+ results,
63
+ createdAt: Date.now(),
64
+ lastAccessedAt: Date.now(),
65
+ });
66
+ }
67
+ /**
68
+ * Invalidate all cached entries.
69
+ */
70
+ invalidateAll() {
71
+ const count = this.entries.size;
72
+ this.entries.clear();
73
+ logger.debug("Query cache invalidated", { entriesCleared: count });
74
+ }
75
+ /**
76
+ * Get cache statistics.
77
+ */
78
+ getStats() {
79
+ return {
80
+ size: this.entries.size,
81
+ hits: this.hits,
82
+ misses: this.misses,
83
+ evictions: this.evictions,
84
+ };
85
+ }
86
+ /**
87
+ * Evict the oldest (by creation time) entry.
88
+ */
89
+ evictOldest() {
90
+ let oldestKey;
91
+ let oldestTime = Infinity;
92
+ for (const [key, entry] of this.entries) {
93
+ if (entry.createdAt < oldestTime) {
94
+ oldestTime = entry.createdAt;
95
+ oldestKey = key;
96
+ }
97
+ }
98
+ if (oldestKey) {
99
+ this.entries.delete(oldestKey);
100
+ this.evictions++;
101
+ }
102
+ }
103
+ }
104
+ //# sourceMappingURL=query-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-cache.js","sourceRoot":"","sources":["../../../src/core/rag/query-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Query Understanding — preprocesses user queries before retrieval.
3
+ *
4
+ * Provides:
5
+ * - Intent detection (search, how_to, status, debug, compare, history)
6
+ * - Entity extraction (PascalCase, camelCase from query)
7
+ * - Source type filtering (detect "in the PRD", "in code", etc.)
8
+ * - Query expansion with related terms
9
+ * - Query rewriting for FTS5 optimization
10
+ */
11
+ export type QueryIntent = "search" | "how_to" | "status" | "debug" | "compare" | "history";
12
+ export interface UnderstandingResult {
13
+ originalQuery: string;
14
+ rewrittenQuery: string;
15
+ entities: string[];
16
+ intent: QueryIntent;
17
+ expandedTerms: string[];
18
+ sourceTypeFilter: string[];
19
+ }
20
+ /**
21
+ * Detect the intent of a query from keyword patterns.
22
+ */
23
+ export declare function detectIntent(query: string): QueryIntent;
24
+ /**
25
+ * Detect source type filters from query content.
26
+ */
27
+ export declare function detectSourceFilter(query: string): string[];
28
+ /**
29
+ * Expand query tokens with related technical terms.
30
+ */
31
+ export declare function expandQuery(query: string): string[];
32
+ /**
33
+ * Full query understanding pipeline.
34
+ * Analyzes a natural language query and returns structured understanding.
35
+ */
36
+ export declare function understandQuery(query: string): UnderstandingResult;
37
+ //# sourceMappingURL=query-understanding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-understanding.d.ts","sourceRoot":"","sources":["../../../src/core/rag/query-understanding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,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"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Query Understanding — preprocesses user queries before retrieval.
3
+ *
4
+ * Provides:
5
+ * - Intent detection (search, how_to, status, debug, compare, history)
6
+ * - Entity extraction (PascalCase, camelCase from query)
7
+ * - Source type filtering (detect "in the PRD", "in code", etc.)
8
+ * - Query expansion with related terms
9
+ * - Query rewriting for FTS5 optimization
10
+ */
11
+ import { tokenize } from "../search/tokenizer.js";
12
+ import { extractEntities } from "./enrichment-pipeline.js";
13
+ import { logger } from "../utils/logger.js";
14
+ // ── Intent detection patterns ────────────────────────────
15
+ const INTENT_PATTERNS = [
16
+ { pattern: /^how\b|como\s+(fazer|funciona|implementar)/i, intent: "how_to" },
17
+ { pattern: /\b(status|progress|progresso|sprint|burndown|velocity)\b/i, intent: "status" },
18
+ { pattern: /\b(error|erro|bug|fail|falha|why\s+does|por\s*que)\b/i, intent: "debug" },
19
+ { pattern: /\b(compare|compar|vs\.?|versus|difference|diferença|diferenca)\b/i, intent: "compare" },
20
+ { pattern: /\b(history|histórico|historico|changelog|when\s+was|quando)\b/i, intent: "history" },
21
+ ];
22
+ /**
23
+ * Detect the intent of a query from keyword patterns.
24
+ */
25
+ export function detectIntent(query) {
26
+ for (const { pattern, intent } of INTENT_PATTERNS) {
27
+ if (pattern.test(query))
28
+ return intent;
29
+ }
30
+ return "search";
31
+ }
32
+ // ── Source type detection patterns ────────────────────────
33
+ const SOURCE_PATTERNS = [
34
+ { pattern: /\b(code|código|codigo|symbol|function|class|módulo|modulo)\b/i, sourceTypes: ["code_context"] },
35
+ { pattern: /\b(prd|requisito|requirement|user\s+stor)/i, sourceTypes: ["prd"] },
36
+ { pattern: /\b(journey|jornada|screen|tela|fluxo|flow)\b/i, sourceTypes: ["journey"] },
37
+ { pattern: /\b(skills?|habilidade)\b/i, sourceTypes: ["skill"] },
38
+ { pattern: /\b(doc|docs|documentation|documentação|documentacao|library|lib)\b/i, sourceTypes: ["docs"] },
39
+ { pattern: /\b(memory|memória|memoria|decision|decisão|decisao)\b/i, sourceTypes: ["memory", "ai_decision"] },
40
+ { pattern: /\b(siebel|sif|composer)\b/i, sourceTypes: ["siebel_sif", "siebel_composer", "siebel_docs"] },
41
+ { pattern: /\b(benchmark|performance|latency|latência|token\s+economy)\b/i, sourceTypes: ["benchmark"] },
42
+ { pattern: /\b(capture|screenshot|web\s+page|página|pagina)\b/i, sourceTypes: ["web_capture"] },
43
+ { pattern: /\b(swagger|api\s+spec|openapi|endpoint)\b/i, sourceTypes: ["swagger"] },
44
+ ];
45
+ /**
46
+ * Detect source type filters from query content.
47
+ */
48
+ export function detectSourceFilter(query) {
49
+ const filters = new Set();
50
+ for (const { pattern, sourceTypes } of SOURCE_PATTERNS) {
51
+ if (pattern.test(query)) {
52
+ for (const st of sourceTypes)
53
+ filters.add(st);
54
+ }
55
+ }
56
+ return Array.from(filters);
57
+ }
58
+ // ── Query expansion ──────────────────────────────────────
59
+ const EXPANSION_MAP = {
60
+ database: ["sqlite", "store", "migration", "schema"],
61
+ migration: ["database", "schema", "version", "upgrade"],
62
+ search: ["fts5", "bm25", "query", "ranking"],
63
+ context: ["rag", "token", "budget", "tiered"],
64
+ graph: ["node", "edge", "dependency", "traversal"],
65
+ parser: ["segment", "classify", "extract", "normalize"],
66
+ chunk: ["split", "overlap", "token", "sentence"],
67
+ embedding: ["tfidf", "vector", "cosine", "similarity"],
68
+ knowledge: ["store", "document", "index", "rag"],
69
+ node: ["task", "epic", "status", "dependency"],
70
+ test: ["vitest", "tdd", "assertion", "mock"],
71
+ skill: ["phase", "lifecycle", "recommend"],
72
+ };
73
+ /**
74
+ * Expand query tokens with related technical terms.
75
+ */
76
+ export function expandQuery(query) {
77
+ const tokens = tokenize(query);
78
+ if (tokens.length === 0)
79
+ return [];
80
+ const expanded = new Set(tokens);
81
+ for (const token of tokens) {
82
+ const related = EXPANSION_MAP[token];
83
+ if (related) {
84
+ for (const term of related)
85
+ expanded.add(term);
86
+ }
87
+ }
88
+ return Array.from(expanded);
89
+ }
90
+ /**
91
+ * Rewrite query for FTS5 — clean, tokenize, rejoin.
92
+ */
93
+ function rewriteQuery(query) {
94
+ const tokens = tokenize(query);
95
+ return tokens.join(" ");
96
+ }
97
+ /**
98
+ * Full query understanding pipeline.
99
+ * Analyzes a natural language query and returns structured understanding.
100
+ */
101
+ export function understandQuery(query) {
102
+ const originalQuery = query;
103
+ const intent = detectIntent(query);
104
+ const entities = extractEntities(query);
105
+ const sourceTypeFilter = detectSourceFilter(query);
106
+ const expandedTerms = expandQuery(query);
107
+ const rewrittenQuery = rewriteQuery(query);
108
+ logger.debug("Query understood", {
109
+ intent,
110
+ entityCount: entities.length,
111
+ sourceFilters: sourceTypeFilter.length,
112
+ expandedTermCount: expandedTerms.length,
113
+ });
114
+ return {
115
+ originalQuery,
116
+ rewrittenQuery,
117
+ entities,
118
+ intent,
119
+ expandedTerms,
120
+ sourceTypeFilter,
121
+ };
122
+ }
123
+ //# sourceMappingURL=query-understanding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-understanding.js","sourceRoot":"","sources":["../../../src/core/rag/query-understanding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * RAG Trace — observability for the RAG pipeline.
3
+ *
4
+ * Instruments each stage (query understanding, retrieval, post-retrieval,
5
+ * assembly, citation) with timing, input/output counts, and source contributions.
6
+ */
7
+ export type RagStageName = "query_understanding" | "retrieval" | "post_retrieval" | "assembly" | "citation";
8
+ export interface RagStageTrace {
9
+ stage: RagStageName;
10
+ latencyMs: number;
11
+ inputCount: number;
12
+ outputCount: number;
13
+ details: Record<string, unknown>;
14
+ }
15
+ export interface RagTrace {
16
+ traceId: string;
17
+ query: string;
18
+ timestamp: string;
19
+ stages: RagStageTrace[];
20
+ totalLatencyMs: number;
21
+ totalTokensUsed: number;
22
+ sourcesContributed: Record<string, number>;
23
+ citationCount: number;
24
+ }
25
+ /**
26
+ * Tracer instance — tracks stages during a single RAG pipeline execution.
27
+ */
28
+ export declare class RagTracer {
29
+ private traceId;
30
+ private query;
31
+ private timestamp;
32
+ private stages;
33
+ private stageStartTimes;
34
+ private sourcesContributed;
35
+ private citationCount;
36
+ private totalTokensUsed;
37
+ constructor(query: string);
38
+ /**
39
+ * Mark the start of a pipeline stage.
40
+ */
41
+ startStage(stage: RagStageName): void;
42
+ /**
43
+ * Mark the end of a pipeline stage with input/output counts.
44
+ */
45
+ endStage(stage: RagStageName, counts: {
46
+ inputCount: number;
47
+ outputCount: number;
48
+ details?: Record<string, unknown>;
49
+ }): void;
50
+ /**
51
+ * Record how many results came from a specific source type.
52
+ */
53
+ recordSourceContribution(sourceType: string, count: number): void;
54
+ /**
55
+ * Set the number of citations produced.
56
+ */
57
+ setCitationCount(count: number): void;
58
+ /**
59
+ * Set total tokens consumed by the assembled context.
60
+ */
61
+ setTokensUsed(tokens: number): void;
62
+ /**
63
+ * Finalize the trace and return the complete record.
64
+ */
65
+ finalize(): RagTrace;
66
+ }
67
+ //# sourceMappingURL=rag-trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rag-trace.d.ts","sourceRoot":"","sources":["../../../src/core/rag/rag-trace.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,MAAM,YAAY,GACpB,qBAAqB,GACrB,WAAW,GACX,gBAAgB,GAChB,UAAU,GACV,UAAU,CAAC;AAEf,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,kBAAkB,CAA8B;IACxD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,eAAe,CAAa;gBAExB,KAAK,EAAE,MAAM;IAMzB;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAIrC;;OAEG;IACH,QAAQ,CACN,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GACrF,IAAI;IAeP;;OAEG;IACH,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIjE;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAInC;;OAEG;IACH,QAAQ,IAAI,QAAQ;CAcrB"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * RAG Trace — observability for the RAG pipeline.
3
+ *
4
+ * Instruments each stage (query understanding, retrieval, post-retrieval,
5
+ * assembly, citation) with timing, input/output counts, and source contributions.
6
+ */
7
+ import { generateId } from "../utils/id.js";
8
+ import { now } from "../utils/time.js";
9
+ /**
10
+ * Tracer instance — tracks stages during a single RAG pipeline execution.
11
+ */
12
+ export class RagTracer {
13
+ traceId;
14
+ query;
15
+ timestamp;
16
+ stages = [];
17
+ stageStartTimes = new Map();
18
+ sourcesContributed = {};
19
+ citationCount = 0;
20
+ totalTokensUsed = 0;
21
+ constructor(query) {
22
+ this.traceId = generateId("trace");
23
+ this.query = query;
24
+ this.timestamp = now();
25
+ }
26
+ /**
27
+ * Mark the start of a pipeline stage.
28
+ */
29
+ startStage(stage) {
30
+ this.stageStartTimes.set(stage, performance.now());
31
+ }
32
+ /**
33
+ * Mark the end of a pipeline stage with input/output counts.
34
+ */
35
+ endStage(stage, counts) {
36
+ const startTime = this.stageStartTimes.get(stage) ?? performance.now();
37
+ const latencyMs = Math.round(performance.now() - startTime);
38
+ this.stages.push({
39
+ stage,
40
+ latencyMs,
41
+ inputCount: counts.inputCount,
42
+ outputCount: counts.outputCount,
43
+ details: counts.details ?? {},
44
+ });
45
+ this.stageStartTimes.delete(stage);
46
+ }
47
+ /**
48
+ * Record how many results came from a specific source type.
49
+ */
50
+ recordSourceContribution(sourceType, count) {
51
+ this.sourcesContributed[sourceType] = (this.sourcesContributed[sourceType] ?? 0) + count;
52
+ }
53
+ /**
54
+ * Set the number of citations produced.
55
+ */
56
+ setCitationCount(count) {
57
+ this.citationCount = count;
58
+ }
59
+ /**
60
+ * Set total tokens consumed by the assembled context.
61
+ */
62
+ setTokensUsed(tokens) {
63
+ this.totalTokensUsed = tokens;
64
+ }
65
+ /**
66
+ * Finalize the trace and return the complete record.
67
+ */
68
+ finalize() {
69
+ const totalLatencyMs = this.stages.reduce((sum, s) => sum + s.latencyMs, 0);
70
+ return {
71
+ traceId: this.traceId,
72
+ query: this.query,
73
+ timestamp: this.timestamp,
74
+ stages: [...this.stages],
75
+ totalLatencyMs,
76
+ totalTokensUsed: this.totalTokensUsed,
77
+ sourcesContributed: { ...this.sourcesContributed },
78
+ citationCount: this.citationCount,
79
+ };
80
+ }
81
+ }
82
+ //# sourceMappingURL=rag-trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rag-trace.js","sourceRoot":"","sources":["../../../src/core/rag/rag-trace.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AA4BvC;;GAEG;AACH,MAAM,OAAO,SAAS;IACZ,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,SAAS,CAAS;IAClB,MAAM,GAAoB,EAAE,CAAC;IAC7B,eAAe,GAAwB,IAAI,GAAG,EAAE,CAAC;IACjD,kBAAkB,GAA2B,EAAE,CAAC;IAChD,aAAa,GAAW,CAAC,CAAC;IAC1B,eAAe,GAAW,CAAC,CAAC;IAEpC,YAAY,KAAa;QACvB,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,KAAmB;QAC5B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,QAAQ,CACN,KAAmB,EACnB,MAAsF;QAEtF,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,GAAG,EAAE,CAAC;QACvE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;QAE5D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,KAAK;YACL,SAAS;YACT,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;SAC9B,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,wBAAwB,CAAC,UAAkB,EAAE,KAAa;QACxD,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;IAC3F,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,KAAa;QAC5B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,MAAc;QAC1B,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAE5E,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YACxB,cAAc;YACd,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,kBAAkB,EAAE,EAAE,GAAG,IAAI,CAAC,kBAAkB,EAAE;YAClD,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Source Contribution — measures how much each knowledge source
3
+ * contributes to RAG quality.
4
+ *
5
+ * Aggregates data from traces and usage logs to compute per-source metrics.
6
+ */
7
+ export interface TraceAggregation {
8
+ sourceType: string;
9
+ retrievalCount: number;
10
+ totalRelevanceScore: number;
11
+ helpfulCount: number;
12
+ unhelpfulCount: number;
13
+ totalTokens: number;
14
+ }
15
+ export interface SourceContribution {
16
+ sourceType: string;
17
+ documentCount: number;
18
+ retrievalHitRate: number;
19
+ avgRelevanceScore: number;
20
+ helpfulFeedbackRate: number;
21
+ tokenContribution: number;
22
+ }
23
+ export interface UnderutilizedSource {
24
+ sourceType: string;
25
+ reason: string;
26
+ documentCount: number;
27
+ retrievalHitRate: number;
28
+ }
29
+ /**
30
+ * Calculate contribution metrics for each source type.
31
+ */
32
+ export declare function calculateSourceContributions(traces: TraceAggregation[], totalQueries: number): SourceContribution[];
33
+ /**
34
+ * Identify sources that are indexed but rarely retrieved.
35
+ */
36
+ export declare function identifyUnderutilizedSources(contributions: SourceContribution[]): UnderutilizedSource[];
37
+ //# sourceMappingURL=source-contribution.d.ts.map