@hazeljs/rag 0.2.0-beta.60 → 0.2.0-beta.61
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/__tests__/graph/community-detector.test.d.ts +2 -0
- package/dist/__tests__/graph/community-detector.test.d.ts.map +1 -0
- package/dist/__tests__/graph/community-detector.test.js +87 -0
- package/dist/__tests__/graph/community-detector.test.js.map +1 -0
- package/dist/__tests__/graph/community-summarizer.test.d.ts +2 -0
- package/dist/__tests__/graph/community-summarizer.test.d.ts.map +1 -0
- package/dist/__tests__/graph/community-summarizer.test.js +131 -0
- package/dist/__tests__/graph/community-summarizer.test.js.map +1 -0
- package/dist/__tests__/graph/entity-extractor.test.d.ts +2 -0
- package/dist/__tests__/graph/entity-extractor.test.d.ts.map +1 -0
- package/dist/__tests__/graph/entity-extractor.test.js +129 -0
- package/dist/__tests__/graph/entity-extractor.test.js.map +1 -0
- package/dist/__tests__/graph/graph-rag-pipeline.test.d.ts +2 -0
- package/dist/__tests__/graph/graph-rag-pipeline.test.d.ts.map +1 -0
- package/dist/__tests__/graph/graph-rag-pipeline.test.js +158 -0
- package/dist/__tests__/graph/graph-rag-pipeline.test.js.map +1 -0
- package/dist/__tests__/graph/knowledge-graph.test.d.ts +2 -0
- package/dist/__tests__/graph/knowledge-graph.test.d.ts.map +1 -0
- package/dist/__tests__/graph/knowledge-graph.test.js +208 -0
- package/dist/__tests__/graph/knowledge-graph.test.js.map +1 -0
- package/dist/__tests__/loaders/base.loader.test.d.ts +2 -0
- package/dist/__tests__/loaders/base.loader.test.d.ts.map +1 -0
- package/dist/__tests__/loaders/base.loader.test.js +114 -0
- package/dist/__tests__/loaders/base.loader.test.js.map +1 -0
- package/dist/__tests__/loaders/csv-file.loader.test.d.ts +2 -0
- package/dist/__tests__/loaders/csv-file.loader.test.d.ts.map +1 -0
- package/dist/__tests__/loaders/csv-file.loader.test.js +98 -0
- package/dist/__tests__/loaders/csv-file.loader.test.js.map +1 -0
- package/dist/__tests__/loaders/directory.loader.test.d.ts +2 -0
- package/dist/__tests__/loaders/directory.loader.test.d.ts.map +1 -0
- package/dist/__tests__/loaders/directory.loader.test.js +154 -0
- package/dist/__tests__/loaders/directory.loader.test.js.map +1 -0
- package/dist/__tests__/loaders/html-file.loader.test.d.ts +2 -0
- package/dist/__tests__/loaders/html-file.loader.test.d.ts.map +1 -0
- package/dist/__tests__/loaders/html-file.loader.test.js +93 -0
- package/dist/__tests__/loaders/html-file.loader.test.js.map +1 -0
- package/dist/__tests__/loaders/json-file.loader.test.d.ts +2 -0
- package/dist/__tests__/loaders/json-file.loader.test.d.ts.map +1 -0
- package/dist/__tests__/loaders/json-file.loader.test.js +84 -0
- package/dist/__tests__/loaders/json-file.loader.test.js.map +1 -0
- package/dist/__tests__/loaders/markdown-file.loader.test.d.ts +2 -0
- package/dist/__tests__/loaders/markdown-file.loader.test.d.ts.map +1 -0
- package/dist/__tests__/loaders/markdown-file.loader.test.js +83 -0
- package/dist/__tests__/loaders/markdown-file.loader.test.js.map +1 -0
- package/dist/__tests__/loaders/text-file.loader.test.d.ts +2 -0
- package/dist/__tests__/loaders/text-file.loader.test.d.ts.map +1 -0
- package/dist/__tests__/loaders/text-file.loader.test.js +50 -0
- package/dist/__tests__/loaders/text-file.loader.test.js.map +1 -0
- package/dist/__tests__/rag-pipeline.test.d.ts +2 -0
- package/dist/__tests__/rag-pipeline.test.d.ts.map +1 -0
- package/dist/__tests__/rag-pipeline.test.js +210 -0
- package/dist/__tests__/rag-pipeline.test.js.map +1 -0
- package/dist/__tests__/retrieval/bm25.test.d.ts +2 -0
- package/dist/__tests__/retrieval/bm25.test.d.ts.map +1 -0
- package/dist/__tests__/retrieval/bm25.test.js +86 -0
- package/dist/__tests__/retrieval/bm25.test.js.map +1 -0
- package/dist/__tests__/retrieval/hybrid-search.test.d.ts +2 -0
- package/dist/__tests__/retrieval/hybrid-search.test.d.ts.map +1 -0
- package/dist/__tests__/retrieval/hybrid-search.test.js +85 -0
- package/dist/__tests__/retrieval/hybrid-search.test.js.map +1 -0
- package/dist/__tests__/retrieval/multi-query.test.d.ts +2 -0
- package/dist/__tests__/retrieval/multi-query.test.d.ts.map +1 -0
- package/dist/__tests__/retrieval/multi-query.test.js +90 -0
- package/dist/__tests__/retrieval/multi-query.test.js.map +1 -0
- package/dist/__tests__/text-splitters/recursive-text-splitter.test.d.ts +2 -0
- package/dist/__tests__/text-splitters/recursive-text-splitter.test.d.ts.map +1 -0
- package/dist/__tests__/text-splitters/recursive-text-splitter.test.js +97 -0
- package/dist/__tests__/text-splitters/recursive-text-splitter.test.js.map +1 -0
- package/dist/__tests__/utils/similarity.test.d.ts +2 -0
- package/dist/__tests__/utils/similarity.test.d.ts.map +1 -0
- package/dist/__tests__/utils/similarity.test.js +47 -0
- package/dist/__tests__/utils/similarity.test.js.map +1 -0
- package/dist/agentic/index.d.ts +1 -1
- package/dist/agentic/index.d.ts.map +1 -1
- package/dist/agentic/types.d.ts +3 -2
- package/dist/agentic/types.d.ts.map +1 -1
- package/dist/graph/community-detector.d.ts +45 -0
- package/dist/graph/community-detector.d.ts.map +1 -0
- package/dist/graph/community-detector.js +153 -0
- package/dist/graph/community-detector.js.map +1 -0
- package/dist/graph/community-summarizer.d.ts +40 -0
- package/dist/graph/community-summarizer.d.ts.map +1 -0
- package/dist/graph/community-summarizer.js +127 -0
- package/dist/graph/community-summarizer.js.map +1 -0
- package/dist/graph/entity-extractor.d.ts +46 -0
- package/dist/graph/entity-extractor.d.ts.map +1 -0
- package/dist/graph/entity-extractor.js +243 -0
- package/dist/graph/entity-extractor.js.map +1 -0
- package/dist/graph/graph-rag-pipeline.d.ts +82 -0
- package/dist/graph/graph-rag-pipeline.d.ts.map +1 -0
- package/dist/graph/graph-rag-pipeline.js +397 -0
- package/dist/graph/graph-rag-pipeline.js.map +1 -0
- package/dist/graph/graph.types.d.ts +186 -0
- package/dist/graph/graph.types.d.ts.map +1 -0
- package/dist/graph/graph.types.js +20 -0
- package/dist/graph/graph.types.js.map +1 -0
- package/dist/graph/index.d.ts +15 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +31 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/knowledge-graph.d.ts +57 -0
- package/dist/graph/knowledge-graph.d.ts.map +1 -0
- package/dist/graph/knowledge-graph.js +198 -0
- package/dist/graph/knowledge-graph.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/loaders/base.loader.d.ts +108 -0
- package/dist/loaders/base.loader.d.ts.map +1 -0
- package/dist/loaders/base.loader.js +123 -0
- package/dist/loaders/base.loader.js.map +1 -0
- package/dist/loaders/csv-file.loader.d.ts +61 -0
- package/dist/loaders/csv-file.loader.d.ts.map +1 -0
- package/dist/loaders/csv-file.loader.js +162 -0
- package/dist/loaders/csv-file.loader.js.map +1 -0
- package/dist/loaders/directory.loader.d.ts +67 -0
- package/dist/loaders/directory.loader.d.ts.map +1 -0
- package/dist/loaders/directory.loader.js +163 -0
- package/dist/loaders/directory.loader.js.map +1 -0
- package/dist/loaders/docx.loader.d.ts +52 -0
- package/dist/loaders/docx.loader.d.ts.map +1 -0
- package/dist/loaders/docx.loader.js +110 -0
- package/dist/loaders/docx.loader.js.map +1 -0
- package/dist/loaders/github.loader.d.ts +114 -0
- package/dist/loaders/github.loader.d.ts.map +1 -0
- package/dist/loaders/github.loader.js +217 -0
- package/dist/loaders/github.loader.js.map +1 -0
- package/dist/loaders/html-file.loader.d.ts +55 -0
- package/dist/loaders/html-file.loader.d.ts.map +1 -0
- package/dist/loaders/html-file.loader.js +170 -0
- package/dist/loaders/html-file.loader.js.map +1 -0
- package/dist/loaders/index.d.ts +52 -0
- package/dist/loaders/index.d.ts.map +1 -0
- package/dist/loaders/index.js +61 -0
- package/dist/loaders/index.js.map +1 -0
- package/dist/loaders/json-file.loader.d.ts +51 -0
- package/dist/loaders/json-file.loader.d.ts.map +1 -0
- package/dist/loaders/json-file.loader.js +100 -0
- package/dist/loaders/json-file.loader.js.map +1 -0
- package/dist/loaders/markdown-file.loader.d.ts +61 -0
- package/dist/loaders/markdown-file.loader.d.ts.map +1 -0
- package/dist/loaders/markdown-file.loader.js +148 -0
- package/dist/loaders/markdown-file.loader.js.map +1 -0
- package/dist/loaders/pdf.loader.d.ts +64 -0
- package/dist/loaders/pdf.loader.d.ts.map +1 -0
- package/dist/loaders/pdf.loader.js +163 -0
- package/dist/loaders/pdf.loader.js.map +1 -0
- package/dist/loaders/text-file.loader.d.ts +39 -0
- package/dist/loaders/text-file.loader.d.ts.map +1 -0
- package/dist/loaders/text-file.loader.js +69 -0
- package/dist/loaders/text-file.loader.js.map +1 -0
- package/dist/loaders/web.loader.d.ts +87 -0
- package/dist/loaders/web.loader.d.ts.map +1 -0
- package/dist/loaders/web.loader.js +194 -0
- package/dist/loaders/web.loader.js.map +1 -0
- package/dist/loaders/youtube-transcript.loader.d.ts +92 -0
- package/dist/loaders/youtube-transcript.loader.d.ts.map +1 -0
- package/dist/loaders/youtube-transcript.loader.js +254 -0
- package/dist/loaders/youtube-transcript.loader.js.map +1 -0
- package/package.json +50 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"community-detector.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/graph/community-detector.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const community_detector_1 = require("../../graph/community-detector");
|
|
4
|
+
const knowledge_graph_1 = require("../../graph/knowledge-graph");
|
|
5
|
+
function addEntity(store, id) {
|
|
6
|
+
store.addEntity({ id, name: id, type: 'CONCEPT', description: '', sourceDocIds: [] });
|
|
7
|
+
}
|
|
8
|
+
function addRel(store, id, src, tgt, weight = 5) {
|
|
9
|
+
store.addRelationship({
|
|
10
|
+
id,
|
|
11
|
+
sourceId: src,
|
|
12
|
+
targetId: tgt,
|
|
13
|
+
type: 'RELATED_TO',
|
|
14
|
+
description: '',
|
|
15
|
+
weight,
|
|
16
|
+
sourceDocIds: [],
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
describe('CommunityDetector', () => {
|
|
20
|
+
it('returns empty for an empty graph', () => {
|
|
21
|
+
const detector = new community_detector_1.CommunityDetector();
|
|
22
|
+
const result = detector.detect(new knowledge_graph_1.GraphStore());
|
|
23
|
+
expect(result).toEqual([]);
|
|
24
|
+
});
|
|
25
|
+
it('assigns a community to every entity', () => {
|
|
26
|
+
const store = new knowledge_graph_1.GraphStore();
|
|
27
|
+
for (const id of ['e1', 'e2', 'e3', 'e4'])
|
|
28
|
+
addEntity(store, id);
|
|
29
|
+
addRel(store, 'r1', 'e1', 'e2', 8);
|
|
30
|
+
addRel(store, 'r2', 'e2', 'e3', 8);
|
|
31
|
+
addRel(store, 'r3', 'e3', 'e4', 8);
|
|
32
|
+
const detector = new community_detector_1.CommunityDetector();
|
|
33
|
+
const communities = detector.detect(store);
|
|
34
|
+
const allEntityIds = communities.flatMap((c) => c.entityIds);
|
|
35
|
+
expect(allEntityIds.sort()).toEqual(['e1', 'e2', 'e3', 'e4'].sort());
|
|
36
|
+
});
|
|
37
|
+
it('produces valid community objects with id and level', () => {
|
|
38
|
+
const store = new knowledge_graph_1.GraphStore();
|
|
39
|
+
for (const id of ['a', 'b', 'c'])
|
|
40
|
+
addEntity(store, id);
|
|
41
|
+
addRel(store, 'r1', 'a', 'b');
|
|
42
|
+
addRel(store, 'r2', 'b', 'c');
|
|
43
|
+
const detector = new community_detector_1.CommunityDetector();
|
|
44
|
+
const communities = detector.detect(store);
|
|
45
|
+
for (const c of communities) {
|
|
46
|
+
expect(c.id).toMatch(/^community_\d+$/);
|
|
47
|
+
expect(c.level).toBe(0);
|
|
48
|
+
expect(c.entityIds.length).toBeGreaterThan(0);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
it('splits communities exceeding maxCommunitySize', () => {
|
|
52
|
+
const store = new knowledge_graph_1.GraphStore();
|
|
53
|
+
const ids = Array.from({ length: 20 }, (_, i) => `n${i}`);
|
|
54
|
+
for (const id of ids)
|
|
55
|
+
addEntity(store, id);
|
|
56
|
+
// Create a dense community by connecting all to a hub
|
|
57
|
+
for (let i = 1; i < 20; i++) {
|
|
58
|
+
addRel(store, `r${i}`, 'n0', `n${i}`, 10);
|
|
59
|
+
}
|
|
60
|
+
const detector = new community_detector_1.CommunityDetector({ maxCommunitySize: 5 });
|
|
61
|
+
const communities = detector.detect(store);
|
|
62
|
+
// At least some communities should be smaller than 20
|
|
63
|
+
expect(communities.some((c) => c.entityIds.length <= 20)).toBe(true);
|
|
64
|
+
// All entities should be covered
|
|
65
|
+
const total = communities.flatMap((c) => c.entityIds).length;
|
|
66
|
+
expect(total).toBe(20);
|
|
67
|
+
});
|
|
68
|
+
it('handles isolated nodes (no relationships)', () => {
|
|
69
|
+
const store = new knowledge_graph_1.GraphStore();
|
|
70
|
+
for (const id of ['x', 'y', 'z'])
|
|
71
|
+
addEntity(store, id);
|
|
72
|
+
// No relationships at all
|
|
73
|
+
const detector = new community_detector_1.CommunityDetector();
|
|
74
|
+
const communities = detector.detect(store);
|
|
75
|
+
const total = communities.flatMap((c) => c.entityIds).length;
|
|
76
|
+
expect(total).toBe(3);
|
|
77
|
+
});
|
|
78
|
+
it('uses custom maxIterations without error', () => {
|
|
79
|
+
const store = new knowledge_graph_1.GraphStore();
|
|
80
|
+
addEntity(store, 'p');
|
|
81
|
+
addEntity(store, 'q');
|
|
82
|
+
addRel(store, 'r1', 'p', 'q', 3);
|
|
83
|
+
const detector = new community_detector_1.CommunityDetector({ maxIterations: 2 });
|
|
84
|
+
expect(() => detector.detect(store)).not.toThrow();
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=community-detector.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"community-detector.test.js","sourceRoot":"","sources":["../../../src/__tests__/graph/community-detector.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"community-summarizer.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/graph/community-summarizer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const community_summarizer_1 = require("../../graph/community-summarizer");
|
|
4
|
+
const knowledge_graph_1 = require("../../graph/knowledge-graph");
|
|
5
|
+
function makeStore() {
|
|
6
|
+
const store = new knowledge_graph_1.GraphStore();
|
|
7
|
+
store.addEntity({
|
|
8
|
+
id: 'e1',
|
|
9
|
+
name: 'TypeScript',
|
|
10
|
+
type: 'TECHNOLOGY',
|
|
11
|
+
description: 'Typed JS.',
|
|
12
|
+
sourceDocIds: [],
|
|
13
|
+
});
|
|
14
|
+
store.addEntity({
|
|
15
|
+
id: 'e2',
|
|
16
|
+
name: 'JavaScript',
|
|
17
|
+
type: 'TECHNOLOGY',
|
|
18
|
+
description: 'Web scripting language.',
|
|
19
|
+
sourceDocIds: [],
|
|
20
|
+
});
|
|
21
|
+
store.addRelationship({
|
|
22
|
+
id: 'r1',
|
|
23
|
+
sourceId: 'e1',
|
|
24
|
+
targetId: 'e2',
|
|
25
|
+
type: 'EXTENDS',
|
|
26
|
+
description: 'TS extends JS.',
|
|
27
|
+
weight: 9,
|
|
28
|
+
sourceDocIds: [],
|
|
29
|
+
});
|
|
30
|
+
return store;
|
|
31
|
+
}
|
|
32
|
+
const VALID_REPORT = JSON.stringify({
|
|
33
|
+
title: 'TypeScript Ecosystem',
|
|
34
|
+
summary: 'This community covers TypeScript and JavaScript.',
|
|
35
|
+
findings: ['TypeScript is statically typed.', 'JavaScript is dynamic.'],
|
|
36
|
+
rating: 8,
|
|
37
|
+
});
|
|
38
|
+
describe('CommunitySummarizer', () => {
|
|
39
|
+
const community = { id: 'c1', entityIds: ['e1', 'e2'], level: 0 };
|
|
40
|
+
it('returns empty array for no communities', async () => {
|
|
41
|
+
const llm = jest.fn();
|
|
42
|
+
const summarizer = new community_summarizer_1.CommunitySummarizer({ llm });
|
|
43
|
+
const result = await summarizer.summarizeAll([], makeStore());
|
|
44
|
+
expect(result).toHaveLength(0);
|
|
45
|
+
expect(llm).not.toHaveBeenCalled();
|
|
46
|
+
});
|
|
47
|
+
it('generates a report for a community', async () => {
|
|
48
|
+
const llm = jest.fn().mockResolvedValue(VALID_REPORT);
|
|
49
|
+
const summarizer = new community_summarizer_1.CommunitySummarizer({ llm });
|
|
50
|
+
const reports = await summarizer.summarizeAll([community], makeStore());
|
|
51
|
+
expect(reports).toHaveLength(1);
|
|
52
|
+
expect(reports[0].communityId).toBe('c1');
|
|
53
|
+
expect(reports[0].title).toBe('TypeScript Ecosystem');
|
|
54
|
+
expect(reports[0].rating).toBe(8);
|
|
55
|
+
expect(reports[0].findings).toHaveLength(2);
|
|
56
|
+
});
|
|
57
|
+
it('strips markdown fences from LLM response', async () => {
|
|
58
|
+
const withFences = `\`\`\`json\n${VALID_REPORT}\n\`\`\``;
|
|
59
|
+
const llm = jest.fn().mockResolvedValue(withFences);
|
|
60
|
+
const summarizer = new community_summarizer_1.CommunitySummarizer({ llm });
|
|
61
|
+
const reports = await summarizer.summarizeAll([community], makeStore());
|
|
62
|
+
expect(reports[0].title).toBe('TypeScript Ecosystem');
|
|
63
|
+
});
|
|
64
|
+
it('falls back to regex extraction when JSON has prefix text', async () => {
|
|
65
|
+
const messy = `Here is the JSON: ${VALID_REPORT}`;
|
|
66
|
+
const llm = jest.fn().mockResolvedValue(messy);
|
|
67
|
+
const summarizer = new community_summarizer_1.CommunitySummarizer({ llm });
|
|
68
|
+
const reports = await summarizer.summarizeAll([community], makeStore());
|
|
69
|
+
expect(reports[0].title).toBe('TypeScript Ecosystem');
|
|
70
|
+
});
|
|
71
|
+
it('uses fallback report when LLM fails', async () => {
|
|
72
|
+
const llm = jest.fn().mockRejectedValue(new Error('LLM unavailable'));
|
|
73
|
+
const summarizer = new community_summarizer_1.CommunitySummarizer({ llm });
|
|
74
|
+
const reports = await summarizer.summarizeAll([community], makeStore());
|
|
75
|
+
expect(reports).toHaveLength(1);
|
|
76
|
+
expect(reports[0].communityId).toBe('c1');
|
|
77
|
+
expect(reports[0].rating).toBe(5); // fallback default
|
|
78
|
+
expect(reports[0].title).toContain('Community:');
|
|
79
|
+
});
|
|
80
|
+
it('uses fallback when LLM returns invalid JSON', async () => {
|
|
81
|
+
const llm = jest.fn().mockResolvedValue('not valid json');
|
|
82
|
+
const summarizer = new community_summarizer_1.CommunitySummarizer({ llm });
|
|
83
|
+
const reports = await summarizer.summarizeAll([community], makeStore());
|
|
84
|
+
expect(reports[0].title).toContain('Community:');
|
|
85
|
+
});
|
|
86
|
+
it('clamps rating to 1-10', async () => {
|
|
87
|
+
const resp = JSON.stringify({ title: 'T', summary: 'S', findings: [], rating: 999 });
|
|
88
|
+
const llm = jest.fn().mockResolvedValue(resp);
|
|
89
|
+
const summarizer = new community_summarizer_1.CommunitySummarizer({ llm });
|
|
90
|
+
const reports = await summarizer.summarizeAll([community], makeStore());
|
|
91
|
+
expect(reports[0].rating).toBe(10);
|
|
92
|
+
});
|
|
93
|
+
it('respects concurrency limit when processing multiple communities', async () => {
|
|
94
|
+
const communities = [
|
|
95
|
+
{ id: 'c1', entityIds: ['e1'], level: 0 },
|
|
96
|
+
{ id: 'c2', entityIds: ['e2'], level: 0 },
|
|
97
|
+
{ id: 'c3', entityIds: ['e1', 'e2'], level: 0 },
|
|
98
|
+
];
|
|
99
|
+
let callCount = 0;
|
|
100
|
+
const llm = jest.fn().mockImplementation(async () => {
|
|
101
|
+
callCount++;
|
|
102
|
+
return VALID_REPORT;
|
|
103
|
+
});
|
|
104
|
+
const summarizer = new community_summarizer_1.CommunitySummarizer({ llm, concurrency: 2 });
|
|
105
|
+
const reports = await summarizer.summarizeAll(communities, makeStore());
|
|
106
|
+
expect(reports).toHaveLength(3);
|
|
107
|
+
expect(callCount).toBe(3);
|
|
108
|
+
});
|
|
109
|
+
it('handles community with missing entities gracefully', async () => {
|
|
110
|
+
const communityWithMissing = {
|
|
111
|
+
id: 'cx',
|
|
112
|
+
entityIds: ['nonexistent1', 'nonexistent2'],
|
|
113
|
+
level: 0,
|
|
114
|
+
};
|
|
115
|
+
const llm = jest.fn().mockResolvedValue(VALID_REPORT);
|
|
116
|
+
const summarizer = new community_summarizer_1.CommunitySummarizer({ llm });
|
|
117
|
+
const reports = await summarizer.summarizeAll([communityWithMissing], makeStore());
|
|
118
|
+
expect(reports).toHaveLength(1);
|
|
119
|
+
});
|
|
120
|
+
it('includes relationship descriptions in the prompt', async () => {
|
|
121
|
+
let capturedPrompt = '';
|
|
122
|
+
const llm = jest.fn().mockImplementation(async (prompt) => {
|
|
123
|
+
capturedPrompt = prompt;
|
|
124
|
+
return VALID_REPORT;
|
|
125
|
+
});
|
|
126
|
+
const summarizer = new community_summarizer_1.CommunitySummarizer({ llm });
|
|
127
|
+
await summarizer.summarizeAll([community], makeStore());
|
|
128
|
+
expect(capturedPrompt).toContain('EXTENDS');
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=community-summarizer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"community-summarizer.test.js","sourceRoot":"","sources":["../../../src/__tests__/graph/community-summarizer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-extractor.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/graph/entity-extractor.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const entity_extractor_1 = require("../../graph/entity-extractor");
|
|
4
|
+
const VALID_RESPONSE = JSON.stringify({
|
|
5
|
+
entities: [
|
|
6
|
+
{ name: 'TypeScript', type: 'TECHNOLOGY', description: 'A typed superset of JavaScript.' },
|
|
7
|
+
{ name: 'JavaScript', type: 'TECHNOLOGY', description: 'A scripting language for the web.' },
|
|
8
|
+
],
|
|
9
|
+
relationships: [
|
|
10
|
+
{
|
|
11
|
+
source: 'TypeScript',
|
|
12
|
+
target: 'JavaScript',
|
|
13
|
+
type: 'EXTENDS',
|
|
14
|
+
description: 'TS extends JS.',
|
|
15
|
+
weight: 9,
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
});
|
|
19
|
+
describe('EntityExtractor', () => {
|
|
20
|
+
it('extracts entities and relationships from valid LLM response', async () => {
|
|
21
|
+
const llm = jest.fn().mockResolvedValue(VALID_RESPONSE);
|
|
22
|
+
const extractor = new entity_extractor_1.EntityExtractor({ llm });
|
|
23
|
+
const result = await extractor.extract(['TypeScript extends JavaScript.'], 'doc1');
|
|
24
|
+
expect(result.entities.some((e) => e.name === 'TypeScript')).toBe(true);
|
|
25
|
+
expect(result.relationships.some((r) => r.type === 'EXTENDS')).toBe(true);
|
|
26
|
+
});
|
|
27
|
+
it('strips markdown fences from LLM response', async () => {
|
|
28
|
+
const withFences = `\`\`\`json\n${VALID_RESPONSE}\n\`\`\``;
|
|
29
|
+
const llm = jest.fn().mockResolvedValue(withFences);
|
|
30
|
+
const extractor = new entity_extractor_1.EntityExtractor({ llm });
|
|
31
|
+
const result = await extractor.extract(['text'], 'doc1');
|
|
32
|
+
expect(result.entities.length).toBeGreaterThan(0);
|
|
33
|
+
});
|
|
34
|
+
it('falls back to regex extraction when JSON has prefix text', async () => {
|
|
35
|
+
const messy = `Here is the result: ${VALID_RESPONSE}`;
|
|
36
|
+
const llm = jest.fn().mockResolvedValue(messy);
|
|
37
|
+
const extractor = new entity_extractor_1.EntityExtractor({ llm });
|
|
38
|
+
const result = await extractor.extract(['text'], 'doc1');
|
|
39
|
+
expect(result.entities.length).toBeGreaterThan(0);
|
|
40
|
+
});
|
|
41
|
+
it('silently skips unparseable LLM responses', async () => {
|
|
42
|
+
const llm = jest.fn().mockResolvedValue('not valid json at all!');
|
|
43
|
+
const extractor = new entity_extractor_1.EntityExtractor({ llm });
|
|
44
|
+
const result = await extractor.extract(['text'], 'doc1');
|
|
45
|
+
expect(result.entities).toHaveLength(0);
|
|
46
|
+
expect(result.relationships).toHaveLength(0);
|
|
47
|
+
});
|
|
48
|
+
it('normalizes unknown EntityType to OTHER', async () => {
|
|
49
|
+
const response = JSON.stringify({
|
|
50
|
+
entities: [{ name: 'Widget', type: 'UNKNOWN_TYPE', description: 'A widget.' }],
|
|
51
|
+
relationships: [],
|
|
52
|
+
});
|
|
53
|
+
const llm = jest.fn().mockResolvedValue(response);
|
|
54
|
+
const extractor = new entity_extractor_1.EntityExtractor({ llm });
|
|
55
|
+
const result = await extractor.extract(['text'], 'doc1');
|
|
56
|
+
expect(result.entities[0].type).toBe('OTHER');
|
|
57
|
+
});
|
|
58
|
+
it('normalizes unknown RelationshipType to OTHER', async () => {
|
|
59
|
+
const response = JSON.stringify({
|
|
60
|
+
entities: [
|
|
61
|
+
{ name: 'A', type: 'CONCEPT', description: 'Entity A.' },
|
|
62
|
+
{ name: 'B', type: 'CONCEPT', description: 'Entity B.' },
|
|
63
|
+
],
|
|
64
|
+
relationships: [
|
|
65
|
+
{ source: 'A', target: 'B', type: 'MYSTERY_TYPE', description: 'A to B.', weight: 5 },
|
|
66
|
+
],
|
|
67
|
+
});
|
|
68
|
+
const llm = jest.fn().mockResolvedValue(response);
|
|
69
|
+
const extractor = new entity_extractor_1.EntityExtractor({ llm });
|
|
70
|
+
const result = await extractor.extract(['text'], 'doc1');
|
|
71
|
+
expect(result.relationships[0].type).toBe('OTHER');
|
|
72
|
+
});
|
|
73
|
+
it('deduplicates entities by normalized name across chunks', async () => {
|
|
74
|
+
const chunk1 = JSON.stringify({
|
|
75
|
+
entities: [{ name: 'TypeScript', type: 'TECHNOLOGY', description: 'TS chunk 1.' }],
|
|
76
|
+
relationships: [],
|
|
77
|
+
});
|
|
78
|
+
const chunk2 = JSON.stringify({
|
|
79
|
+
entities: [{ name: 'typescript', type: 'TECHNOLOGY', description: 'TS chunk 2.' }],
|
|
80
|
+
relationships: [],
|
|
81
|
+
});
|
|
82
|
+
const llm = jest.fn().mockResolvedValueOnce(chunk1).mockResolvedValueOnce(chunk2);
|
|
83
|
+
const extractor = new entity_extractor_1.EntityExtractor({ llm, chunkSize: 5 }); // force two chunks
|
|
84
|
+
const longText = 'a'.repeat(10);
|
|
85
|
+
const result = await extractor.extract([longText], 'doc1');
|
|
86
|
+
// Both chunks produce "typescript" — should be merged to one entity
|
|
87
|
+
const tsCount = result.entities.filter((e) => e.name.toLowerCase() === 'typescript').length;
|
|
88
|
+
expect(tsCount).toBe(1);
|
|
89
|
+
// Description should be merged
|
|
90
|
+
expect(result.entities[0].description).toContain('chunk 1');
|
|
91
|
+
expect(result.entities[0].description).toContain('chunk 2');
|
|
92
|
+
});
|
|
93
|
+
it('clamps relationship weight to 1-10 range', async () => {
|
|
94
|
+
const response = JSON.stringify({
|
|
95
|
+
entities: [
|
|
96
|
+
{ name: 'A', type: 'CONCEPT', description: 'A.' },
|
|
97
|
+
{ name: 'B', type: 'CONCEPT', description: 'B.' },
|
|
98
|
+
],
|
|
99
|
+
relationships: [
|
|
100
|
+
{ source: 'A', target: 'B', type: 'USES', description: 'A uses B.', weight: 999 },
|
|
101
|
+
],
|
|
102
|
+
});
|
|
103
|
+
const llm = jest.fn().mockResolvedValue(response);
|
|
104
|
+
const extractor = new entity_extractor_1.EntityExtractor({ llm });
|
|
105
|
+
const result = await extractor.extract(['text'], 'doc1');
|
|
106
|
+
expect(result.relationships[0].weight).toBe(10);
|
|
107
|
+
});
|
|
108
|
+
it('filters out relationships whose entities were not extracted', async () => {
|
|
109
|
+
const response = JSON.stringify({
|
|
110
|
+
entities: [{ name: 'A', type: 'CONCEPT', description: 'A.' }],
|
|
111
|
+
relationships: [
|
|
112
|
+
{ source: 'A', target: 'MissingEntity', type: 'USES', description: 'desc.', weight: 5 },
|
|
113
|
+
],
|
|
114
|
+
});
|
|
115
|
+
const llm = jest.fn().mockResolvedValue(response);
|
|
116
|
+
const extractor = new entity_extractor_1.EntityExtractor({ llm });
|
|
117
|
+
const result = await extractor.extract(['text'], 'doc1');
|
|
118
|
+
expect(result.relationships).toHaveLength(0);
|
|
119
|
+
});
|
|
120
|
+
it('throws on response with invalid shape', async () => {
|
|
121
|
+
const response = JSON.stringify({ notEntities: [] });
|
|
122
|
+
const llm = jest.fn().mockResolvedValue(response);
|
|
123
|
+
const extractor = new entity_extractor_1.EntityExtractor({ llm });
|
|
124
|
+
// The error is caught silently — returns empty
|
|
125
|
+
const result = await extractor.extract(['text'], 'doc1');
|
|
126
|
+
expect(result.entities).toHaveLength(0);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
//# sourceMappingURL=entity-extractor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-extractor.test.js","sourceRoot":"","sources":["../../../src/__tests__/graph/entity-extractor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-rag-pipeline.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/graph/graph-rag-pipeline.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const graph_rag_pipeline_1 = require("../../graph/graph-rag-pipeline");
|
|
4
|
+
const EXTRACTION_RESPONSE = JSON.stringify({
|
|
5
|
+
entities: [
|
|
6
|
+
{ name: 'TypeScript', type: 'TECHNOLOGY', description: 'A typed language.' },
|
|
7
|
+
{ name: 'JavaScript', type: 'TECHNOLOGY', description: 'A dynamic language.' },
|
|
8
|
+
],
|
|
9
|
+
relationships: [
|
|
10
|
+
{
|
|
11
|
+
source: 'TypeScript',
|
|
12
|
+
target: 'JavaScript',
|
|
13
|
+
type: 'EXTENDS',
|
|
14
|
+
description: 'TS extends JS.',
|
|
15
|
+
weight: 9,
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
});
|
|
19
|
+
const COMMUNITY_REPORT = JSON.stringify({
|
|
20
|
+
title: 'Web Languages',
|
|
21
|
+
summary: 'TypeScript and JavaScript are related web technologies.',
|
|
22
|
+
findings: ['TypeScript extends JavaScript.'],
|
|
23
|
+
rating: 8,
|
|
24
|
+
});
|
|
25
|
+
const LLM_ANSWER = 'TypeScript is a typed superset of JavaScript.';
|
|
26
|
+
function makeLlm() {
|
|
27
|
+
return jest.fn().mockImplementation(async (prompt) => {
|
|
28
|
+
// Entity extraction prompts contain "entities" keyword
|
|
29
|
+
if (prompt.includes('Extract ALL entities'))
|
|
30
|
+
return EXTRACTION_RESPONSE;
|
|
31
|
+
// Community summary prompts
|
|
32
|
+
if (prompt.includes('community report'))
|
|
33
|
+
return COMMUNITY_REPORT;
|
|
34
|
+
// Search synthesis
|
|
35
|
+
return LLM_ANSWER;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const DOC = {
|
|
39
|
+
id: 'doc1',
|
|
40
|
+
content: 'TypeScript extends JavaScript with types.',
|
|
41
|
+
metadata: {},
|
|
42
|
+
};
|
|
43
|
+
describe('GraphRAGPipeline.build', () => {
|
|
44
|
+
it('processes documents and returns build stats', async () => {
|
|
45
|
+
const pipeline = new graph_rag_pipeline_1.GraphRAGPipeline({ llm: makeLlm() });
|
|
46
|
+
const stats = await pipeline.build([DOC]);
|
|
47
|
+
expect(stats.documentsProcessed).toBe(1);
|
|
48
|
+
expect(stats.entitiesExtracted).toBeGreaterThanOrEqual(0);
|
|
49
|
+
expect(stats.duration).toBeGreaterThanOrEqual(0);
|
|
50
|
+
});
|
|
51
|
+
it('clears previous graph state on build', async () => {
|
|
52
|
+
const llm = makeLlm();
|
|
53
|
+
const pipeline = new graph_rag_pipeline_1.GraphRAGPipeline({ llm });
|
|
54
|
+
await pipeline.build([DOC]);
|
|
55
|
+
const firstCount = pipeline.getGraph().entities.size;
|
|
56
|
+
await pipeline.build([DOC]);
|
|
57
|
+
expect(pipeline.getGraph().entities.size).toBe(firstCount);
|
|
58
|
+
});
|
|
59
|
+
it('populates the graph with entities', async () => {
|
|
60
|
+
const pipeline = new graph_rag_pipeline_1.GraphRAGPipeline({ llm: makeLlm() });
|
|
61
|
+
await pipeline.build([DOC]);
|
|
62
|
+
expect(pipeline.getGraph().entities.size).toBeGreaterThan(0);
|
|
63
|
+
});
|
|
64
|
+
it('skips community reports when generateCommunityReports is false', async () => {
|
|
65
|
+
const llm = jest.fn().mockResolvedValue(EXTRACTION_RESPONSE);
|
|
66
|
+
const pipeline = new graph_rag_pipeline_1.GraphRAGPipeline({ llm, generateCommunityReports: false });
|
|
67
|
+
const stats = await pipeline.build([DOC]);
|
|
68
|
+
expect(stats.communityReportsGenerated).toBe(0);
|
|
69
|
+
});
|
|
70
|
+
it('handles documents without id', async () => {
|
|
71
|
+
const pipeline = new graph_rag_pipeline_1.GraphRAGPipeline({ llm: makeLlm() });
|
|
72
|
+
const docWithoutId = { content: 'Some content', metadata: {} };
|
|
73
|
+
await expect(pipeline.build([docWithoutId])).resolves.toBeDefined();
|
|
74
|
+
});
|
|
75
|
+
it('merges duplicate entities across documents', async () => {
|
|
76
|
+
const pipeline = new graph_rag_pipeline_1.GraphRAGPipeline({ llm: makeLlm() });
|
|
77
|
+
const docs = [
|
|
78
|
+
{ id: 'd1', content: 'TypeScript is typed.', metadata: {} },
|
|
79
|
+
{ id: 'd2', content: 'TypeScript is compiled.', metadata: {} },
|
|
80
|
+
];
|
|
81
|
+
await pipeline.build(docs);
|
|
82
|
+
const ts = pipeline.getGraph().findEntityByName('TypeScript');
|
|
83
|
+
// TypeScript entity should exist and be merged
|
|
84
|
+
expect(ts).toBeDefined();
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe('GraphRAGPipeline.search', () => {
|
|
88
|
+
let pipeline;
|
|
89
|
+
beforeEach(async () => {
|
|
90
|
+
pipeline = new graph_rag_pipeline_1.GraphRAGPipeline({ llm: makeLlm() });
|
|
91
|
+
await pipeline.build([DOC]);
|
|
92
|
+
});
|
|
93
|
+
it('localSearch returns a result', async () => {
|
|
94
|
+
const result = await pipeline.search('TypeScript', { mode: 'local' });
|
|
95
|
+
expect(result.mode).toBe('local');
|
|
96
|
+
expect(result.query).toBe('TypeScript');
|
|
97
|
+
expect(typeof result.answer).toBe('string');
|
|
98
|
+
expect(result.duration).toBeGreaterThanOrEqual(0);
|
|
99
|
+
});
|
|
100
|
+
it('globalSearch returns a result', async () => {
|
|
101
|
+
const result = await pipeline.search('JavaScript', { mode: 'global' });
|
|
102
|
+
expect(result.mode).toBe('global');
|
|
103
|
+
expect(typeof result.answer).toBe('string');
|
|
104
|
+
});
|
|
105
|
+
it('hybridSearch is the default mode', async () => {
|
|
106
|
+
const result = await pipeline.search('TypeScript');
|
|
107
|
+
expect(result.mode).toBe('hybrid');
|
|
108
|
+
});
|
|
109
|
+
it('hybridSearch merges local and global contexts', async () => {
|
|
110
|
+
const result = await pipeline.search('TypeScript', { mode: 'hybrid' });
|
|
111
|
+
expect(result.context).toContain('LOCAL');
|
|
112
|
+
expect(result.context).toContain('GLOBAL');
|
|
113
|
+
});
|
|
114
|
+
it('local search with includeGraph false returns empty entity list', async () => {
|
|
115
|
+
const result = await pipeline.localSearch('TypeScript', { includeGraph: false });
|
|
116
|
+
expect(result.entities).toHaveLength(0);
|
|
117
|
+
expect(result.relationships).toHaveLength(0);
|
|
118
|
+
});
|
|
119
|
+
it('global search with includeCommunities false returns empty community list', async () => {
|
|
120
|
+
const result = await pipeline.globalSearch('TypeScript', { includeCommunities: false });
|
|
121
|
+
expect(result.communities).toHaveLength(0);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('GraphRAGPipeline.getStats & clear', () => {
|
|
125
|
+
it('getStats reflects graph content', async () => {
|
|
126
|
+
const pipeline = new graph_rag_pipeline_1.GraphRAGPipeline({ llm: makeLlm() });
|
|
127
|
+
await pipeline.build([DOC]);
|
|
128
|
+
const stats = pipeline.getStats();
|
|
129
|
+
expect(stats.totalEntities).toBeGreaterThanOrEqual(0);
|
|
130
|
+
});
|
|
131
|
+
it('clear resets the graph', async () => {
|
|
132
|
+
const pipeline = new graph_rag_pipeline_1.GraphRAGPipeline({ llm: makeLlm() });
|
|
133
|
+
await pipeline.build([DOC]);
|
|
134
|
+
pipeline.clear();
|
|
135
|
+
expect(pipeline.getGraph().entities.size).toBe(0);
|
|
136
|
+
});
|
|
137
|
+
it('getGraph returns the internal GraphStore', async () => {
|
|
138
|
+
const pipeline = new graph_rag_pipeline_1.GraphRAGPipeline({ llm: makeLlm() });
|
|
139
|
+
const graph = pipeline.getGraph();
|
|
140
|
+
expect(graph).toBeDefined();
|
|
141
|
+
expect(typeof graph.entities).toBe('object');
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe('GraphRAGPipeline with empty graph', () => {
|
|
145
|
+
it('localSearch on empty graph returns answer', async () => {
|
|
146
|
+
const llm = jest.fn().mockResolvedValue(LLM_ANSWER);
|
|
147
|
+
const pipeline = new graph_rag_pipeline_1.GraphRAGPipeline({ llm });
|
|
148
|
+
const result = await pipeline.localSearch('anything');
|
|
149
|
+
expect(result.entities).toHaveLength(0);
|
|
150
|
+
});
|
|
151
|
+
it('globalSearch on empty graph returns answer', async () => {
|
|
152
|
+
const llm = jest.fn().mockResolvedValue(LLM_ANSWER);
|
|
153
|
+
const pipeline = new graph_rag_pipeline_1.GraphRAGPipeline({ llm });
|
|
154
|
+
const result = await pipeline.globalSearch('anything');
|
|
155
|
+
expect(result.communities).toHaveLength(0);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
//# sourceMappingURL=graph-rag-pipeline.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-rag-pipeline.test.js","sourceRoot":"","sources":["../../../src/__tests__/graph/graph-rag-pipeline.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-graph.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/graph/knowledge-graph.test.ts"],"names":[],"mappings":""}
|