learngraph 0.7.0 → 0.8.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/cjs/components/SkillGraph.js +224 -23
- package/dist/cjs/components/SkillGraph.js.map +1 -1
- package/dist/cjs/components/hooks.js +10 -0
- package/dist/cjs/components/hooks.js.map +1 -1
- package/dist/cjs/embeddings/base.js +104 -0
- package/dist/cjs/embeddings/base.js.map +1 -0
- package/dist/cjs/embeddings/index.js +91 -0
- package/dist/cjs/embeddings/index.js.map +1 -0
- package/dist/cjs/embeddings/local.js +224 -0
- package/dist/cjs/embeddings/local.js.map +1 -0
- package/dist/cjs/embeddings/openai.js +169 -0
- package/dist/cjs/embeddings/openai.js.map +1 -0
- package/dist/cjs/index.js +25 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/llm/graphrag-orchestrator.js +1004 -0
- package/dist/cjs/llm/graphrag-orchestrator.js.map +1 -0
- package/dist/cjs/llm/index.js +7 -1
- package/dist/cjs/llm/index.js.map +1 -1
- package/dist/cjs/storage/index.js +15 -1
- package/dist/cjs/storage/index.js.map +1 -1
- package/dist/cjs/storage/neo4j-graphrag.js +596 -0
- package/dist/cjs/storage/neo4j-graphrag.js.map +1 -0
- package/dist/cjs/types/graphrag.js +11 -0
- package/dist/cjs/types/graphrag.js.map +1 -0
- package/dist/esm/components/SkillGraph.js +226 -25
- package/dist/esm/components/SkillGraph.js.map +1 -1
- package/dist/esm/components/hooks.js +10 -0
- package/dist/esm/components/hooks.js.map +1 -1
- package/dist/esm/embeddings/base.js +99 -0
- package/dist/esm/embeddings/base.js.map +1 -0
- package/dist/esm/embeddings/index.js +79 -0
- package/dist/esm/embeddings/index.js.map +1 -0
- package/dist/esm/embeddings/local.js +219 -0
- package/dist/esm/embeddings/local.js.map +1 -0
- package/dist/esm/embeddings/openai.js +164 -0
- package/dist/esm/embeddings/openai.js.map +1 -0
- package/dist/esm/index.js +16 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/llm/graphrag-orchestrator.js +999 -0
- package/dist/esm/llm/graphrag-orchestrator.js.map +1 -0
- package/dist/esm/llm/index.js +4 -0
- package/dist/esm/llm/index.js.map +1 -1
- package/dist/esm/storage/index.js +8 -0
- package/dist/esm/storage/index.js.map +1 -1
- package/dist/esm/storage/neo4j-graphrag.js +591 -0
- package/dist/esm/storage/neo4j-graphrag.js.map +1 -0
- package/dist/esm/types/graphrag.js +10 -0
- package/dist/esm/types/graphrag.js.map +1 -0
- package/dist/types/components/SkillGraph.d.ts.map +1 -1
- package/dist/types/components/hooks.d.ts.map +1 -1
- package/dist/types/embeddings/base.d.ts +51 -0
- package/dist/types/embeddings/base.d.ts.map +1 -0
- package/dist/types/embeddings/index.d.ts +48 -0
- package/dist/types/embeddings/index.d.ts.map +1 -0
- package/dist/types/embeddings/local.d.ts +82 -0
- package/dist/types/embeddings/local.d.ts.map +1 -0
- package/dist/types/embeddings/openai.d.ts +48 -0
- package/dist/types/embeddings/openai.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/llm/graphrag-orchestrator.d.ts +280 -0
- package/dist/types/llm/graphrag-orchestrator.d.ts.map +1 -0
- package/dist/types/llm/index.d.ts +2 -0
- package/dist/types/llm/index.d.ts.map +1 -1
- package/dist/types/mcp/tools.d.ts +6 -6
- package/dist/types/storage/index.d.ts +2 -0
- package/dist/types/storage/index.d.ts.map +1 -1
- package/dist/types/storage/neo4j-graphrag.d.ts +106 -0
- package/dist/types/storage/neo4j-graphrag.d.ts.map +1 -0
- package/dist/types/types/graphrag.d.ts +335 -0
- package/dist/types/types/graphrag.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +1 -0
- package/dist/types/types/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,596 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Neo4j GraphRAG Storage
|
|
4
|
+
*
|
|
5
|
+
* Extends Neo4jStorage with vector embedding and semantic search capabilities
|
|
6
|
+
* using Neo4j 5.x's native vector index support.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.Neo4jGraphRAGStorage = exports.GRAPHRAG_DEFAULTS = void 0;
|
|
12
|
+
exports.createNeo4jGraphRAGStorage = createNeo4jGraphRAGStorage;
|
|
13
|
+
const neo4j_js_1 = require("./neo4j.js");
|
|
14
|
+
const errors_js_1 = require("./errors.js");
|
|
15
|
+
/**
|
|
16
|
+
* Default GraphRAG configuration
|
|
17
|
+
*/
|
|
18
|
+
exports.GRAPHRAG_DEFAULTS = {
|
|
19
|
+
/** Default limit for vector search results */
|
|
20
|
+
searchLimit: 10,
|
|
21
|
+
/** Default minimum similarity score */
|
|
22
|
+
minScore: 0.5,
|
|
23
|
+
/** Default graph traversal depth */
|
|
24
|
+
graphDepth: 2,
|
|
25
|
+
/** Default weight for vector similarity in combined score */
|
|
26
|
+
vectorWeight: 0.7,
|
|
27
|
+
/** Default similarity metric */
|
|
28
|
+
metric: 'cosine',
|
|
29
|
+
/** Batch size for embedding operations */
|
|
30
|
+
embeddingBatchSize: 50,
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Neo4j GraphRAG Storage
|
|
34
|
+
*
|
|
35
|
+
* Provides vector embedding storage and semantic search using Neo4j 5.x
|
|
36
|
+
* native vector indexes combined with graph traversal for enhanced context.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* import { Neo4jGraphRAGStorage, createOpenAIEmbeddingAdapter } from 'learngraph';
|
|
41
|
+
*
|
|
42
|
+
* const storage = new Neo4jGraphRAGStorage();
|
|
43
|
+
* await storage.connect({
|
|
44
|
+
* backend: 'neo4j',
|
|
45
|
+
* uri: 'bolt://localhost:7687',
|
|
46
|
+
* username: 'neo4j',
|
|
47
|
+
* password: 'password',
|
|
48
|
+
* });
|
|
49
|
+
*
|
|
50
|
+
* // Set embedding adapter
|
|
51
|
+
* const embedding = createOpenAIEmbeddingAdapter();
|
|
52
|
+
* storage.setEmbeddingAdapter(embedding);
|
|
53
|
+
*
|
|
54
|
+
* // Create vector index
|
|
55
|
+
* await storage.createVectorIndex({ dimensions: 1536 });
|
|
56
|
+
*
|
|
57
|
+
* // Embed all skills
|
|
58
|
+
* await storage.embedAllSkills();
|
|
59
|
+
*
|
|
60
|
+
* // Semantic search with graph context
|
|
61
|
+
* const results = await storage.searchWithGraphContext('learn JavaScript functions');
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
class Neo4jGraphRAGStorage extends neo4j_js_1.Neo4jStorage {
|
|
65
|
+
embeddingAdapter = null;
|
|
66
|
+
vectorIndexName = 'skill_embedding_index';
|
|
67
|
+
vectorIndexDimensions = null;
|
|
68
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
69
|
+
// Embedding Adapter Management
|
|
70
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
71
|
+
setEmbeddingAdapter(adapter) {
|
|
72
|
+
this.embeddingAdapter = adapter;
|
|
73
|
+
this.vectorIndexDimensions = adapter.dimensions;
|
|
74
|
+
}
|
|
75
|
+
getEmbeddingAdapter() {
|
|
76
|
+
return this.embeddingAdapter;
|
|
77
|
+
}
|
|
78
|
+
requireEmbeddingAdapter() {
|
|
79
|
+
if (!this.embeddingAdapter) {
|
|
80
|
+
throw new Error('Embedding adapter not set. Call setEmbeddingAdapter() first.');
|
|
81
|
+
}
|
|
82
|
+
return this.embeddingAdapter;
|
|
83
|
+
}
|
|
84
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
85
|
+
// Skill Embedding
|
|
86
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
87
|
+
/**
|
|
88
|
+
* Generate text representation for embedding
|
|
89
|
+
*/
|
|
90
|
+
getEmbeddingText(skill) {
|
|
91
|
+
const parts = [skill.name, skill.description];
|
|
92
|
+
if (skill.tags.length > 0) {
|
|
93
|
+
parts.push(`Tags: ${skill.tags.join(', ')}`);
|
|
94
|
+
}
|
|
95
|
+
if (skill.domain) {
|
|
96
|
+
parts.push(`Domain: ${skill.domain}`);
|
|
97
|
+
}
|
|
98
|
+
if (skill.bloomLevel) {
|
|
99
|
+
parts.push(`Bloom level: ${skill.bloomLevel}`);
|
|
100
|
+
}
|
|
101
|
+
return parts.join('. ');
|
|
102
|
+
}
|
|
103
|
+
async embedSkill(skillId) {
|
|
104
|
+
const adapter = this.requireEmbeddingAdapter();
|
|
105
|
+
const skill = await this.getSkill(skillId);
|
|
106
|
+
if (!skill) {
|
|
107
|
+
throw new Error(`Skill not found: ${skillId}`);
|
|
108
|
+
}
|
|
109
|
+
const text = this.getEmbeddingText(skill);
|
|
110
|
+
const result = await adapter.embed(text);
|
|
111
|
+
// Store embedding in Neo4j
|
|
112
|
+
const session = this.getSession();
|
|
113
|
+
try {
|
|
114
|
+
await session.run(`
|
|
115
|
+
MATCH (s:Skill {id: $id})
|
|
116
|
+
SET s.embedding = $embedding,
|
|
117
|
+
s.embeddedText = $embeddedText,
|
|
118
|
+
s.embeddedAt = datetime()
|
|
119
|
+
`, {
|
|
120
|
+
id: skillId,
|
|
121
|
+
embedding: result.vector,
|
|
122
|
+
embeddedText: text,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
await session.close();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async embedAllSkills(options) {
|
|
130
|
+
const adapter = this.requireEmbeddingAdapter();
|
|
131
|
+
const batchSize = options?.batchSize ?? exports.GRAPHRAG_DEFAULTS.embeddingBatchSize;
|
|
132
|
+
// Get all skills
|
|
133
|
+
const skills = await this.findSkills({});
|
|
134
|
+
const total = skills.length;
|
|
135
|
+
let embedded = 0;
|
|
136
|
+
let failed = 0;
|
|
137
|
+
// Process in batches
|
|
138
|
+
for (let i = 0; i < skills.length; i += batchSize) {
|
|
139
|
+
const batch = skills.slice(i, i + batchSize);
|
|
140
|
+
const texts = batch.map((skill) => this.getEmbeddingText(skill));
|
|
141
|
+
try {
|
|
142
|
+
const result = await adapter.embedBatch(texts);
|
|
143
|
+
// Store embeddings
|
|
144
|
+
const session = this.getSession();
|
|
145
|
+
try {
|
|
146
|
+
for (let j = 0; j < batch.length; j++) {
|
|
147
|
+
const skill = batch[j];
|
|
148
|
+
const embedding = result.embeddings[j];
|
|
149
|
+
if (embedding) {
|
|
150
|
+
await session.run(`
|
|
151
|
+
MATCH (s:Skill {id: $id})
|
|
152
|
+
SET s.embedding = $embedding,
|
|
153
|
+
s.embeddedText = $embeddedText,
|
|
154
|
+
s.embeddedAt = datetime()
|
|
155
|
+
`, {
|
|
156
|
+
id: skill.id,
|
|
157
|
+
embedding: embedding.vector,
|
|
158
|
+
embeddedText: texts[j],
|
|
159
|
+
});
|
|
160
|
+
embedded++;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
await session.close();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
console.error(`Failed to embed batch starting at ${i}:`, error);
|
|
170
|
+
failed += batch.length;
|
|
171
|
+
}
|
|
172
|
+
if (options?.onProgress) {
|
|
173
|
+
options.onProgress(Math.min(i + batchSize, total), total);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return { embedded, failed };
|
|
177
|
+
}
|
|
178
|
+
async hasEmbedding(skillId) {
|
|
179
|
+
const session = this.getSession();
|
|
180
|
+
try {
|
|
181
|
+
const result = await session.run(`
|
|
182
|
+
MATCH (s:Skill {id: $id})
|
|
183
|
+
RETURN s.embedding IS NOT NULL as hasEmbedding
|
|
184
|
+
`, { id: skillId });
|
|
185
|
+
const record = result.records[0];
|
|
186
|
+
return record ? record.get('hasEmbedding') : false;
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
await session.close();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async getSkillWithEmbedding(skillId) {
|
|
193
|
+
const session = this.getSession();
|
|
194
|
+
try {
|
|
195
|
+
const result = await session.run(`
|
|
196
|
+
MATCH (s:Skill {id: $id})
|
|
197
|
+
RETURN s {.*} as skill
|
|
198
|
+
`, { id: skillId });
|
|
199
|
+
const record = result.records[0];
|
|
200
|
+
if (!record)
|
|
201
|
+
return null;
|
|
202
|
+
const data = record.get('skill');
|
|
203
|
+
const skill = this.recordToSkill(data);
|
|
204
|
+
return {
|
|
205
|
+
...skill,
|
|
206
|
+
embedding: data.embedding,
|
|
207
|
+
embeddedText: data.embeddedText,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
await session.close();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
215
|
+
// Vector Search
|
|
216
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
217
|
+
async searchByVector(query, options) {
|
|
218
|
+
const adapter = this.requireEmbeddingAdapter();
|
|
219
|
+
// Generate query embedding
|
|
220
|
+
const result = await adapter.embed(query);
|
|
221
|
+
return this.searchByEmbedding(result.vector, options);
|
|
222
|
+
}
|
|
223
|
+
async searchByEmbedding(embedding, options) {
|
|
224
|
+
const limit = options?.limit ?? exports.GRAPHRAG_DEFAULTS.searchLimit;
|
|
225
|
+
const minScore = options?.minScore ?? exports.GRAPHRAG_DEFAULTS.minScore;
|
|
226
|
+
const metric = options?.metric ?? exports.GRAPHRAG_DEFAULTS.metric;
|
|
227
|
+
const session = this.getSession();
|
|
228
|
+
try {
|
|
229
|
+
// Build filter conditions
|
|
230
|
+
const filters = [];
|
|
231
|
+
const params = {
|
|
232
|
+
embedding,
|
|
233
|
+
limit,
|
|
234
|
+
minScore,
|
|
235
|
+
};
|
|
236
|
+
if (options?.tags && options.tags.length > 0) {
|
|
237
|
+
filters.push('any(tag IN s.tags WHERE tag IN $filterTags)');
|
|
238
|
+
params.filterTags = options.tags;
|
|
239
|
+
}
|
|
240
|
+
if (options?.domain) {
|
|
241
|
+
filters.push('s.domain = $filterDomain');
|
|
242
|
+
params.filterDomain = options.domain;
|
|
243
|
+
}
|
|
244
|
+
if (options?.bloomLevel) {
|
|
245
|
+
filters.push('s.bloomLevel = $filterBloomLevel');
|
|
246
|
+
params.filterBloomLevel = options.bloomLevel;
|
|
247
|
+
}
|
|
248
|
+
const filterClause = filters.length > 0 ? `AND ${filters.join(' AND ')}` : '';
|
|
249
|
+
// Use Neo4j vector index if available, otherwise fallback to brute force
|
|
250
|
+
const hasIndex = await this.hasVectorIndex();
|
|
251
|
+
let query;
|
|
252
|
+
if (hasIndex) {
|
|
253
|
+
// Use vector index
|
|
254
|
+
query = `
|
|
255
|
+
CALL db.index.vector.queryNodes($indexName, $limit, $embedding)
|
|
256
|
+
YIELD node as s, score
|
|
257
|
+
WHERE score >= $minScore ${filterClause}
|
|
258
|
+
RETURN s {.*} as skill, score
|
|
259
|
+
ORDER BY score DESC
|
|
260
|
+
LIMIT $limit
|
|
261
|
+
`;
|
|
262
|
+
params.indexName = this.vectorIndexName;
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
// Brute force cosine similarity
|
|
266
|
+
query = `
|
|
267
|
+
MATCH (s:Skill)
|
|
268
|
+
WHERE s.embedding IS NOT NULL ${filterClause}
|
|
269
|
+
WITH s, gds.similarity.cosine(s.embedding, $embedding) as score
|
|
270
|
+
WHERE score >= $minScore
|
|
271
|
+
RETURN s {.*} as skill, score
|
|
272
|
+
ORDER BY score DESC
|
|
273
|
+
LIMIT $limit
|
|
274
|
+
`;
|
|
275
|
+
}
|
|
276
|
+
const result = await session.run(query, params);
|
|
277
|
+
return result.records.map((record) => {
|
|
278
|
+
const data = record.get('skill');
|
|
279
|
+
const skill = this.recordToSkill(data);
|
|
280
|
+
return {
|
|
281
|
+
skill,
|
|
282
|
+
score: record.get('score'),
|
|
283
|
+
metric,
|
|
284
|
+
};
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
finally {
|
|
288
|
+
await session.close();
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
async findSimilarSkills(skillId, options) {
|
|
292
|
+
const skill = await this.getSkillWithEmbedding(skillId);
|
|
293
|
+
if (!skill || !skill.embedding) {
|
|
294
|
+
throw new Error(`Skill ${skillId} not found or has no embedding`);
|
|
295
|
+
}
|
|
296
|
+
// Search excluding the source skill
|
|
297
|
+
const results = await this.searchByEmbedding(skill.embedding, {
|
|
298
|
+
...options,
|
|
299
|
+
limit: (options?.limit ?? exports.GRAPHRAG_DEFAULTS.searchLimit) + 1,
|
|
300
|
+
});
|
|
301
|
+
return results.filter((r) => r.skill.id !== skillId);
|
|
302
|
+
}
|
|
303
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
304
|
+
// GraphRAG Operations
|
|
305
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
306
|
+
async searchWithGraphContext(query, options) {
|
|
307
|
+
const vectorResults = await this.searchByVector(query, options);
|
|
308
|
+
const graphDepth = options?.graphDepth ?? exports.GRAPHRAG_DEFAULTS.graphDepth;
|
|
309
|
+
const vectorWeight = options?.vectorWeight ?? exports.GRAPHRAG_DEFAULTS.vectorWeight;
|
|
310
|
+
const results = [];
|
|
311
|
+
for (const vectorResult of vectorResults) {
|
|
312
|
+
const skillId = vectorResult.skill.id;
|
|
313
|
+
// Get graph context
|
|
314
|
+
const [prerequisites, dependents] = await Promise.all([
|
|
315
|
+
options?.includePrerequisites !== false
|
|
316
|
+
? this.getPrerequisitesOf(skillId)
|
|
317
|
+
: Promise.resolve([]),
|
|
318
|
+
options?.includeDependents !== false
|
|
319
|
+
? this.getDependentsOf(skillId)
|
|
320
|
+
: Promise.resolve([]),
|
|
321
|
+
]);
|
|
322
|
+
// Get related skills via graph traversal
|
|
323
|
+
let relatedSkills = [];
|
|
324
|
+
if (options?.includeRelated !== false) {
|
|
325
|
+
const subgraph = await this.getSubgraph(skillId, graphDepth);
|
|
326
|
+
relatedSkills = subgraph.nodes.filter((n) => n.id !== skillId &&
|
|
327
|
+
!prerequisites.some((p) => p.id === n.id) &&
|
|
328
|
+
!dependents.some((d) => d.id === n.id));
|
|
329
|
+
}
|
|
330
|
+
// Calculate graph relevance based on connectivity
|
|
331
|
+
const totalConnections = prerequisites.length + dependents.length + relatedSkills.length;
|
|
332
|
+
const graphRelevance = Math.min(totalConnections / 10, 1); // Normalize to 0-1
|
|
333
|
+
// Calculate combined score
|
|
334
|
+
const graphWeight = 1 - vectorWeight;
|
|
335
|
+
const combinedScore = vectorResult.score * vectorWeight + graphRelevance * graphWeight;
|
|
336
|
+
results.push({
|
|
337
|
+
...vectorResult,
|
|
338
|
+
prerequisites,
|
|
339
|
+
dependents,
|
|
340
|
+
relatedSkills,
|
|
341
|
+
graphRelevance,
|
|
342
|
+
combinedScore,
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
// Sort by combined score
|
|
346
|
+
return results.sort((a, b) => b.combinedScore - a.combinedScore);
|
|
347
|
+
}
|
|
348
|
+
async buildRAGContext(query, options) {
|
|
349
|
+
const results = await this.searchWithGraphContext(query, options);
|
|
350
|
+
// Collect all unique skills
|
|
351
|
+
const allPrereqs = new Map();
|
|
352
|
+
const allDeps = new Map();
|
|
353
|
+
const allRelated = new Map();
|
|
354
|
+
for (const result of results) {
|
|
355
|
+
for (const prereq of result.prerequisites) {
|
|
356
|
+
allPrereqs.set(prereq.id, prereq);
|
|
357
|
+
}
|
|
358
|
+
for (const dep of result.dependents) {
|
|
359
|
+
allDeps.set(dep.id, dep);
|
|
360
|
+
}
|
|
361
|
+
for (const rel of result.relatedSkills) {
|
|
362
|
+
allRelated.set(rel.id, rel);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
// Get edges between context skills
|
|
366
|
+
const skillIds = [
|
|
367
|
+
...results.map((r) => r.skill.id),
|
|
368
|
+
...Array.from(allPrereqs.keys()),
|
|
369
|
+
...Array.from(allDeps.keys()),
|
|
370
|
+
...Array.from(allRelated.keys()),
|
|
371
|
+
];
|
|
372
|
+
const edges = await this.findPrerequisites({});
|
|
373
|
+
const contextEdges = edges.filter((e) => skillIds.includes(e.sourceId) &&
|
|
374
|
+
skillIds.includes(e.targetId));
|
|
375
|
+
// Build formatted context string for LLM
|
|
376
|
+
const formattedContext = this.formatContextForLLM(results, contextEdges);
|
|
377
|
+
return {
|
|
378
|
+
primaryMatches: results.map((r) => ({
|
|
379
|
+
skill: r.skill,
|
|
380
|
+
score: r.score,
|
|
381
|
+
metric: r.metric,
|
|
382
|
+
})),
|
|
383
|
+
prerequisites: Array.from(allPrereqs.values()),
|
|
384
|
+
dependents: Array.from(allDeps.values()),
|
|
385
|
+
related: Array.from(allRelated.values()),
|
|
386
|
+
edges: contextEdges,
|
|
387
|
+
formattedContext,
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
formatContextForLLM(results, edges) {
|
|
391
|
+
const lines = ['## Relevant Skills'];
|
|
392
|
+
for (const result of results) {
|
|
393
|
+
lines.push(`\n### ${result.skill.name}`);
|
|
394
|
+
lines.push(`- **Description**: ${result.skill.description}`);
|
|
395
|
+
lines.push(`- **Bloom Level**: ${result.skill.bloomLevel}`);
|
|
396
|
+
lines.push(`- **Difficulty**: ${(result.skill.difficulty * 100).toFixed(0)}%`);
|
|
397
|
+
lines.push(`- **Relevance Score**: ${(result.combinedScore * 100).toFixed(1)}%`);
|
|
398
|
+
if (result.prerequisites.length > 0) {
|
|
399
|
+
lines.push(`- **Prerequisites**: ${result.prerequisites.map((p) => p.name).join(', ')}`);
|
|
400
|
+
}
|
|
401
|
+
if (result.dependents.length > 0) {
|
|
402
|
+
lines.push(`- **Leads to**: ${result.dependents.map((d) => d.name).join(', ')}`);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
if (edges.length > 0) {
|
|
406
|
+
lines.push('\n## Prerequisite Relationships');
|
|
407
|
+
for (const edge of edges.slice(0, 20)) {
|
|
408
|
+
const source = results.find((r) => r.skill.id === edge.sourceId)?.skill;
|
|
409
|
+
const target = results.find((r) => r.skill.id === edge.targetId)?.skill;
|
|
410
|
+
if (source && target) {
|
|
411
|
+
lines.push(`- ${source.name} → ${target.name} (${edge.type}, strength: ${edge.strength})`);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return lines.join('\n');
|
|
416
|
+
}
|
|
417
|
+
async generateLearningPathRAG(request) {
|
|
418
|
+
// Search for skills matching the goal
|
|
419
|
+
const searchResults = await this.searchWithGraphContext(request.goal, {
|
|
420
|
+
limit: 10,
|
|
421
|
+
includePrerequisites: true,
|
|
422
|
+
includeDependents: true,
|
|
423
|
+
includeRelated: true,
|
|
424
|
+
});
|
|
425
|
+
if (searchResults.length === 0) {
|
|
426
|
+
return {
|
|
427
|
+
path: [],
|
|
428
|
+
edges: [],
|
|
429
|
+
estimatedMinutes: 0,
|
|
430
|
+
reasoning: 'No matching skills found for the learning goal.',
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
// Build learning path using topological sort
|
|
434
|
+
const targetSkill = searchResults[0].skill;
|
|
435
|
+
const allPrereqs = new Map();
|
|
436
|
+
const skillOrder = [];
|
|
437
|
+
// Recursively gather prerequisites
|
|
438
|
+
const gatherPrereqs = async (skillId) => {
|
|
439
|
+
const prereqs = await this.getPrerequisitesOf(skillId);
|
|
440
|
+
for (const prereq of prereqs) {
|
|
441
|
+
if (!allPrereqs.has(prereq.id)) {
|
|
442
|
+
allPrereqs.set(prereq.id, prereq);
|
|
443
|
+
await gatherPrereqs(prereq.id);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
};
|
|
447
|
+
await gatherPrereqs(targetSkill.id);
|
|
448
|
+
// Filter by mastery if provided
|
|
449
|
+
let unmastered = Array.from(allPrereqs.values());
|
|
450
|
+
if (request.currentMastery) {
|
|
451
|
+
unmastered = unmastered.filter((skill) => {
|
|
452
|
+
const mastery = request.currentMastery.get(skill.id);
|
|
453
|
+
return mastery === undefined || mastery < skill.masteryThreshold;
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
// Sort by difficulty (simpler topological ordering)
|
|
457
|
+
unmastered.sort((a, b) => a.difficulty - b.difficulty);
|
|
458
|
+
// Apply preferences
|
|
459
|
+
if (request.preferences?.style === 'practical') {
|
|
460
|
+
unmastered.sort((a, b) => (a.bloomLevel >= 'apply' ? -1 : 1) - (b.bloomLevel >= 'apply' ? -1 : 1));
|
|
461
|
+
}
|
|
462
|
+
else if (request.preferences?.style === 'theoretical') {
|
|
463
|
+
unmastered.sort((a, b) => (a.bloomLevel <= 'understand' ? -1 : 1) -
|
|
464
|
+
(b.bloomLevel <= 'understand' ? -1 : 1));
|
|
465
|
+
}
|
|
466
|
+
// Limit path length
|
|
467
|
+
const maxSteps = request.maxSteps ?? 20;
|
|
468
|
+
skillOrder.push(...unmastered.slice(0, maxSteps - 1), targetSkill);
|
|
469
|
+
// Get edges for the path
|
|
470
|
+
const pathIds = skillOrder.map((s) => s.id);
|
|
471
|
+
const allEdges = await this.findPrerequisites({});
|
|
472
|
+
const pathEdges = allEdges.filter((e) => pathIds.includes(e.sourceId) &&
|
|
473
|
+
pathIds.includes(e.targetId));
|
|
474
|
+
// Calculate estimated time
|
|
475
|
+
const estimatedMinutes = skillOrder.reduce((sum, s) => sum + s.estimatedMinutes, 0);
|
|
476
|
+
// Generate reasoning
|
|
477
|
+
const reasoning = [
|
|
478
|
+
`Found "${targetSkill.name}" as the best match for your goal.`,
|
|
479
|
+
unmastered.length > 0
|
|
480
|
+
? `Identified ${unmastered.length} prerequisite skills to learn first.`
|
|
481
|
+
: 'No prerequisites needed.',
|
|
482
|
+
`Total learning path: ${skillOrder.length} skills, approximately ${Math.round(estimatedMinutes / 60)} hours.`,
|
|
483
|
+
].join(' ');
|
|
484
|
+
return {
|
|
485
|
+
path: skillOrder,
|
|
486
|
+
edges: pathEdges,
|
|
487
|
+
estimatedMinutes,
|
|
488
|
+
reasoning,
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
492
|
+
// Vector Index Management
|
|
493
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
494
|
+
async createVectorIndex(options) {
|
|
495
|
+
if (!this.isConnected()) {
|
|
496
|
+
throw new errors_js_1.ConnectionError('Not connected to Neo4j');
|
|
497
|
+
}
|
|
498
|
+
const dimensions = options?.dimensions ??
|
|
499
|
+
this.vectorIndexDimensions ??
|
|
500
|
+
this.embeddingAdapter?.dimensions ??
|
|
501
|
+
1536;
|
|
502
|
+
const metric = options?.metric ?? exports.GRAPHRAG_DEFAULTS.metric;
|
|
503
|
+
const similarityFunction = metric === 'cosine' ? 'cosine' : 'euclidean';
|
|
504
|
+
const session = this.getSession();
|
|
505
|
+
try {
|
|
506
|
+
// Create vector index using Neo4j 5.x syntax
|
|
507
|
+
await session.run(`
|
|
508
|
+
CREATE VECTOR INDEX ${this.vectorIndexName} IF NOT EXISTS
|
|
509
|
+
FOR (s:Skill)
|
|
510
|
+
ON (s.embedding)
|
|
511
|
+
OPTIONS {
|
|
512
|
+
indexConfig: {
|
|
513
|
+
\`vector.dimensions\`: $dimensions,
|
|
514
|
+
\`vector.similarity_function\`: $similarityFunction
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
`, { dimensions, similarityFunction });
|
|
518
|
+
this.vectorIndexDimensions = dimensions;
|
|
519
|
+
}
|
|
520
|
+
finally {
|
|
521
|
+
await session.close();
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
async dropVectorIndex() {
|
|
525
|
+
if (!this.isConnected()) {
|
|
526
|
+
throw new errors_js_1.ConnectionError('Not connected to Neo4j');
|
|
527
|
+
}
|
|
528
|
+
const session = this.getSession();
|
|
529
|
+
try {
|
|
530
|
+
await session.run(`DROP INDEX ${this.vectorIndexName} IF EXISTS`);
|
|
531
|
+
this.vectorIndexDimensions = null;
|
|
532
|
+
}
|
|
533
|
+
finally {
|
|
534
|
+
await session.close();
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
async hasVectorIndex() {
|
|
538
|
+
if (!this.isConnected()) {
|
|
539
|
+
return false;
|
|
540
|
+
}
|
|
541
|
+
const session = this.getSession();
|
|
542
|
+
try {
|
|
543
|
+
const result = await session.run(`
|
|
544
|
+
SHOW INDEXES
|
|
545
|
+
WHERE name = $indexName
|
|
546
|
+
RETURN count(*) as count
|
|
547
|
+
`, { indexName: this.vectorIndexName });
|
|
548
|
+
const record = result.records[0];
|
|
549
|
+
const count = record?.get('count');
|
|
550
|
+
if (!count)
|
|
551
|
+
return false;
|
|
552
|
+
return typeof count === 'number' ? count > 0 : count.low > 0;
|
|
553
|
+
}
|
|
554
|
+
finally {
|
|
555
|
+
await session.close();
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
async getVectorIndexStats() {
|
|
559
|
+
const exists = await this.hasVectorIndex();
|
|
560
|
+
const stats = await this.getStats();
|
|
561
|
+
// Count skills with embeddings
|
|
562
|
+
const session = this.getSession();
|
|
563
|
+
let indexedCount = 0;
|
|
564
|
+
try {
|
|
565
|
+
const result = await session.run(`
|
|
566
|
+
MATCH (s:Skill)
|
|
567
|
+
WHERE s.embedding IS NOT NULL
|
|
568
|
+
RETURN count(s) as count
|
|
569
|
+
`);
|
|
570
|
+
const record = result.records[0];
|
|
571
|
+
indexedCount = record
|
|
572
|
+
? typeof record.get('count') === 'number'
|
|
573
|
+
? record.get('count')
|
|
574
|
+
: record.get('count').low
|
|
575
|
+
: 0;
|
|
576
|
+
}
|
|
577
|
+
finally {
|
|
578
|
+
await session.close();
|
|
579
|
+
}
|
|
580
|
+
return {
|
|
581
|
+
exists,
|
|
582
|
+
dimensions: this.vectorIndexDimensions ?? undefined,
|
|
583
|
+
metric: exists ? exports.GRAPHRAG_DEFAULTS.metric : undefined,
|
|
584
|
+
indexedCount,
|
|
585
|
+
totalSkills: stats.nodeCount,
|
|
586
|
+
};
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
exports.Neo4jGraphRAGStorage = Neo4jGraphRAGStorage;
|
|
590
|
+
/**
|
|
591
|
+
* Create a Neo4j GraphRAG storage instance
|
|
592
|
+
*/
|
|
593
|
+
function createNeo4jGraphRAGStorage() {
|
|
594
|
+
return new Neo4jGraphRAGStorage();
|
|
595
|
+
}
|
|
596
|
+
//# sourceMappingURL=neo4j-graphrag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neo4j-graphrag.js","sourceRoot":"","sources":["../../../src/storage/neo4j-graphrag.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAwwBH,gEAEC;AAxvBD,yCAA0C;AAC1C,2CAA8C;AAE9C;;GAEG;AACU,QAAA,iBAAiB,GAAG;IAC/B,8CAA8C;IAC9C,WAAW,EAAE,EAAE;IACf,uCAAuC;IACvC,QAAQ,EAAE,GAAG;IACb,oCAAoC;IACpC,UAAU,EAAE,CAAC;IACb,6DAA6D;IAC7D,YAAY,EAAE,GAAG;IACjB,gCAAgC;IAChC,MAAM,EAAE,QAA4B;IACpC,0CAA0C;IAC1C,kBAAkB,EAAE,EAAE;CACvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAa,oBAAqB,SAAQ,uBAAY;IAC5C,gBAAgB,GAA4B,IAAI,CAAC;IACjD,eAAe,GAAG,uBAAuB,CAAC;IAC1C,qBAAqB,GAAkB,IAAI,CAAC;IAEpD,gFAAgF;IAChF,+BAA+B;IAC/B,gFAAgF;IAEhF,mBAAmB,CAAC,OAAyB;QAC3C,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;QAChC,IAAI,CAAC,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC;IAClD,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAEO,uBAAuB;QAC7B,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED,gFAAgF;IAChF,kBAAkB;IAClB,gFAAgF;IAEhF;;OAEG;IACK,gBAAgB,CAAC,KAAgB;QACvC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAgB;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAE/C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEzC,2BAA2B;QAC3B,MAAM,OAAO,GAAI,IAAsD,CAAC,UAAU,EAAE,CAAC;QACrF,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,GAAG,CACf;;;;;SAKC,EACD;gBACE,EAAE,EAAE,OAAiB;gBACrB,SAAS,EAAE,MAAM,CAAC,MAAM;gBACxB,YAAY,EAAE,IAAI;aACnB,CACF,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAGpB;QACC,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,yBAAiB,CAAC,kBAAkB,CAAC;QAE7E,iBAAiB;QACjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,qBAAqB;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;YAEjE,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAE/C,mBAAmB;gBACnB,MAAM,OAAO,GAAI,IAAsD,CAAC,UAAU,EAAE,CAAC;gBACrF,IAAI,CAAC;oBACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBACtC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;wBACxB,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;wBACvC,IAAI,SAAS,EAAE,CAAC;4BACd,MAAM,OAAO,CAAC,GAAG,CACf;;;;;iBAKC,EACD;gCACE,EAAE,EAAE,KAAK,CAAC,EAAY;gCACtB,SAAS,EAAE,SAAS,CAAC,MAAM;gCAC3B,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;6BACvB,CACF,CAAC;4BACF,QAAQ,EAAE,CAAC;wBACb,CAAC;oBACH,CAAC;gBACH,CAAC;wBAAS,CAAC;oBACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;gBACxB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAChE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;YACzB,CAAC;YAED,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;gBACxB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAgB;QACjC,MAAM,OAAO,GAAI,IAAsD,CAAC,UAAU,EAAE,CAAC;QACrF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B;;;SAGC,EACD,EAAE,EAAE,EAAE,OAAiB,EAAE,CAC1B,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjC,OAAO,MAAM,CAAC,CAAC,CAAE,MAAM,CAAC,GAAG,CAAC,cAAc,CAAa,CAAC,CAAC,CAAC,KAAK,CAAC;QAClE,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,OAAgB;QAC1C,MAAM,OAAO,GAAI,IAAsD,CAAC,UAAU,EAAE,CAAC;QACrF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B;;;SAGC,EACD,EAAE,EAAE,EAAE,OAAiB,EAAE,CAC1B,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YAEzB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAA4B,CAAC;YAC5D,MAAM,KAAK,GAAI,IAEb,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAEvB,OAAO;gBACL,GAAG,KAAK;gBACR,SAAS,EAAE,IAAI,CAAC,SAAiC;gBACjD,YAAY,EAAE,IAAI,CAAC,YAAkC;aACtD,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,gBAAgB;IAChB,gFAAgF;IAEhF,KAAK,CAAC,cAAc,CAClB,KAAa,EACb,OAA6B;QAE7B,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAE/C,2BAA2B;QAC3B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAE1C,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,SAAmB,EACnB,OAA6B;QAE7B,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,yBAAiB,CAAC,WAAW,CAAC;QAC9D,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,yBAAiB,CAAC,QAAQ,CAAC;QACjE,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,yBAAiB,CAAC,MAAM,CAAC;QAE3D,MAAM,OAAO,GAAI,IAAsD,CAAC,UAAU,EAAE,CAAC;QACrF,IAAI,CAAC;YACH,0BAA0B;YAC1B,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,MAAM,MAAM,GAA4B;gBACtC,SAAS;gBACT,KAAK;gBACL,QAAQ;aACT,CAAC;YAEF,IAAI,OAAO,EAAE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7C,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;gBAC5D,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;YACnC,CAAC;YACD,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBACzC,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;YACvC,CAAC;YACD,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;gBACjD,MAAM,CAAC,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;YAC/C,CAAC;YAED,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAE9E,yEAAyE;YACzE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAE7C,IAAI,KAAa,CAAC;YAClB,IAAI,QAAQ,EAAE,CAAC;gBACb,mBAAmB;gBACnB,KAAK,GAAG;;;qCAGqB,YAAY;;;;SAIxC,CAAC;gBACF,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,gCAAgC;gBAChC,KAAK,GAAG;;0CAE0B,YAAY;;;;;;SAM7C,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAEhD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBACnC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAA4B,CAAC;gBAC5D,MAAM,KAAK,GAAI,IAEb,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAEvB,OAAO;oBACL,KAAK;oBACL,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAW;oBACpC,MAAM;iBACP,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,OAAgB,EAChB,OAA6B;QAE7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,gCAAgC,CAAC,CAAC;QACpE,CAAC;QAED,oCAAoC;QACpC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,EAAE;YAC5D,GAAG,OAAO;YACV,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,yBAAiB,CAAC,WAAW,CAAC,GAAG,CAAC;SAC7D,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,gFAAgF;IAChF,sBAAsB;IACtB,gFAAgF;IAEhF,KAAK,CAAC,sBAAsB,CAC1B,KAAa,EACb,OAA+B;QAE/B,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,yBAAiB,CAAC,UAAU,CAAC;QACvE,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,yBAAiB,CAAC,YAAY,CAAC;QAE7E,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YAEtC,oBAAoB;YACpB,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACpD,OAAO,EAAE,oBAAoB,KAAK,KAAK;oBACrC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;oBAClC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvB,OAAO,EAAE,iBAAiB,KAAK,KAAK;oBAClC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;oBAC/B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;aACxB,CAAC,CAAC;YAEH,yCAAyC;YACzC,IAAI,aAAa,GAAgB,EAAE,CAAC;YACpC,IAAI,OAAO,EAAE,cAAc,KAAK,KAAK,EAAE,CAAC;gBACtC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBAC7D,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CACnC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,EAAE,KAAK,OAAO;oBAChB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;oBACzC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CACzC,CAAC;YACJ,CAAC;YAED,kDAAkD;YAClD,MAAM,gBAAgB,GAAG,aAAa,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;YACzF,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB;YAE9E,2BAA2B;YAC3B,MAAM,WAAW,GAAG,CAAC,GAAG,YAAY,CAAC;YACrC,MAAM,aAAa,GACjB,YAAY,CAAC,KAAK,GAAG,YAAY,GAAG,cAAc,GAAG,WAAW,CAAC;YAEnE,OAAO,CAAC,IAAI,CAAC;gBACX,GAAG,YAAY;gBACf,aAAa;gBACb,UAAU;gBACV,aAAa;gBACb,cAAc;gBACd,aAAa;aACd,CAAC,CAAC;QACL,CAAC;QAED,yBAAyB;QACzB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,KAAa,EACb,OAA+B;QAE/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAElE,4BAA4B;QAC5B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAqB,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAqB,CAAC;QAEhD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;gBAC1C,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAY,EAAE,MAAM,CAAC,CAAC;YAC9C,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAY,EAAE,GAAG,CAAC,CAAC;YACrC,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;gBACvC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAY,EAAE,GAAG,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,MAAM,QAAQ,GAAG;YACf,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YAChC,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC7B,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;SACjC,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAC/B,CAAC,CAAC,EAAE,EAAE,CACJ,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAkB,CAAC;YACvC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAkB,CAAC,CAC1C,CAAC;QAEF,yCAAyC;QACzC,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAEzE,OAAO;YACL,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClC,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,MAAM,EAAE,CAAC,CAAC,MAAM;aACjB,CAAC,CAAC;YACH,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YAC9C,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACxC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACxC,KAAK,EAAE,YAAY;YACnB,gBAAgB;SACjB,CAAC;IACJ,CAAC;IAEO,mBAAmB,CACzB,OAA+B,EAC/B,KAAyB;QAEzB,MAAM,KAAK,GAAa,CAAC,oBAAoB,CAAC,CAAC;QAE/C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YAC7D,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;YAC5D,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/E,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAEjF,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,KAAK,CAAC,IAAI,CACR,wBAAwB,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7E,CAAC;YACJ,CAAC;YACD,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,KAAK,CAAC,IAAI,CACR,mBAAmB,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrE,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;gBACxE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;gBACxE,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;oBACrB,KAAK,CAAC,IAAI,CACR,KAAK,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,QAAQ,GAAG,CAC/E,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,uBAAuB,CAC3B,OAA+B;QAE/B,sCAAsC;QACtC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE;YACpE,KAAK,EAAE,EAAE;YACT,oBAAoB,EAAE,IAAI;YAC1B,iBAAiB,EAAE,IAAI;YACvB,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;QAEH,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO;gBACL,IAAI,EAAE,EAAE;gBACR,KAAK,EAAE,EAAE;gBACT,gBAAgB,EAAE,CAAC;gBACnB,SAAS,EAAE,iDAAiD;aAC7D,CAAC;QACJ,CAAC;QAED,6CAA6C;QAC7C,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAqB,CAAC;QAChD,MAAM,UAAU,GAAgB,EAAE,CAAC;QAEnC,mCAAmC;QACnC,MAAM,aAAa,GAAG,KAAK,EAAE,OAAgB,EAAiB,EAAE;YAC9D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;YACvD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAY,CAAC,EAAE,CAAC;oBACzC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAY,EAAE,MAAM,CAAC,CAAC;oBAC5C,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAEpC,gCAAgC;QAChC,IAAI,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACjD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACvC,MAAM,OAAO,GAAG,OAAO,CAAC,cAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACtD,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,GAAG,KAAK,CAAC,gBAAgB,CAAC;YACnE,CAAC,CAAC,CAAC;QACL,CAAC;QAED,oDAAoD;QACpD,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QAEvD,oBAAoB;QACpB,IAAI,OAAO,CAAC,WAAW,EAAE,KAAK,KAAK,WAAW,EAAE,CAAC;YAC/C,UAAU,CAAC,IAAI,CACb,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,CAAC,CAAC,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC1E,CAAC;QACJ,CAAC;aAAM,IAAI,OAAO,CAAC,WAAW,EAAE,KAAK,KAAK,aAAa,EAAE,CAAC;YACxD,UAAU,CAAC,IAAI,CACb,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,CAAC,CAAC,UAAU,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvC,CAAC,CAAC,CAAC,UAAU,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC1C,CAAC;QACJ,CAAC;QAED,oBAAoB;QACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;QACxC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAEnE,yBAAyB;QACzB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAY,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAC/B,CAAC,CAAC,EAAE,EAAE,CACJ,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAkB,CAAC;YACtC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAkB,CAAC,CACzC,CAAC;QAEF,2BAA2B;QAC3B,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CACxC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,gBAAgB,EACpC,CAAC,CACF,CAAC;QAEF,qBAAqB;QACrB,MAAM,SAAS,GAAG;YAChB,UAAU,WAAW,CAAC,IAAI,oCAAoC;YAC9D,UAAU,CAAC,MAAM,GAAG,CAAC;gBACnB,CAAC,CAAC,cAAc,UAAU,CAAC,MAAM,sCAAsC;gBACvE,CAAC,CAAC,0BAA0B;YAC9B,wBAAwB,UAAU,CAAC,MAAM,0BAA0B,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAC,SAAS;SAC9G,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEZ,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,SAAS;YAChB,gBAAgB;YAChB,SAAS;SACV,CAAC;IACJ,CAAC;IAED,gFAAgF;IAChF,0BAA0B;IAC1B,gFAAgF;IAEhF,KAAK,CAAC,iBAAiB,CAAC,OAGvB;QACC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,2BAAe,CAAC,wBAAwB,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,UAAU,GACd,OAAO,EAAE,UAAU;YACnB,IAAI,CAAC,qBAAqB;YAC1B,IAAI,CAAC,gBAAgB,EAAE,UAAU;YACjC,IAAI,CAAC;QAEP,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,yBAAiB,CAAC,MAAM,CAAC;QAC3D,MAAM,kBAAkB,GAAG,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;QAExE,MAAM,OAAO,GAAI,IAAsD,CAAC,UAAU,EAAE,CAAC;QACrF,IAAI,CAAC;YACH,6CAA6C;YAC7C,MAAM,OAAO,CAAC,GAAG,CACf;8BACsB,IAAI,CAAC,eAAe;;;;;;;;;SASzC,EACD,EAAE,UAAU,EAAE,kBAAkB,EAAE,CACnC,CAAC;YAEF,IAAI,CAAC,qBAAqB,GAAG,UAAU,CAAC;QAC1C,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,2BAAe,CAAC,wBAAwB,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,OAAO,GAAI,IAAsD,CAAC,UAAU,EAAE,CAAC;QACrF,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,eAAe,YAAY,CAAC,CAAC;YAClE,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,OAAO,GAAI,IAAsD,CAAC,UAAU,EAAE,CAAC;QACrF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B;;;;SAIC,EACD,EAAE,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,CACpC,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,MAAM,EAAE,GAAG,CAAC,OAAO,CAAyC,CAAC;YAC3E,IAAI,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAC;YACzB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;QAC/D,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,mBAAmB;QAOvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEpC,+BAA+B;QAC/B,MAAM,OAAO,GAAI,IAAsD,CAAC,UAAU,EAAE,CAAC;QACrF,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;;;;OAIhC,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjC,YAAY,GAAG,MAAM;gBACnB,CAAC,CAAC,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,QAAQ;oBACvC,CAAC,CAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAY;oBACjC,CAAC,CAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAqB,CAAC,GAAG;gBAChD,CAAC,CAAC,CAAC,CAAC;QACR,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAED,OAAO;YACL,MAAM;YACN,UAAU,EAAE,IAAI,CAAC,qBAAqB,IAAI,SAAS;YACnD,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,yBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACrD,YAAY;YACZ,WAAW,EAAE,KAAK,CAAC,SAAS;SAC7B,CAAC;IACJ,CAAC;CACF;AApqBD,oDAoqBC;AA0BD;;GAEG;AACH,SAAgB,0BAA0B;IACxC,OAAO,IAAI,oBAAoB,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GraphRAG Types
|
|
4
|
+
*
|
|
5
|
+
* Types for Graph-based Retrieval-Augmented Generation.
|
|
6
|
+
* Combines vector embeddings with graph traversal for semantic search.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
//# sourceMappingURL=graphrag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphrag.js","sourceRoot":"","sources":["../../../src/types/graphrag.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG"}
|