learngraph 0.5.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/api/routes/analytics.js +288 -0
- package/dist/cjs/api/routes/analytics.js.map +1 -0
- package/dist/cjs/api/routes/assessments.js +269 -0
- package/dist/cjs/api/routes/assessments.js.map +1 -0
- package/dist/cjs/api/routes/curriculum.js +345 -0
- package/dist/cjs/api/routes/curriculum.js.map +1 -0
- package/dist/cjs/api/routes/edges.js +162 -0
- package/dist/cjs/api/routes/edges.js.map +1 -0
- package/dist/cjs/api/routes/explore.js +224 -0
- package/dist/cjs/api/routes/explore.js.map +1 -0
- package/dist/cjs/api/routes/learners.js +324 -0
- package/dist/cjs/api/routes/learners.js.map +1 -0
- package/dist/cjs/api/routes/me.js +404 -0
- package/dist/cjs/api/routes/me.js.map +1 -0
- package/dist/cjs/api/routes/skills.js +319 -0
- package/dist/cjs/api/routes/skills.js.map +1 -0
- package/dist/cjs/api/server.js +185 -0
- package/dist/cjs/api/server.js.map +1 -0
- package/dist/cjs/api/types.js +10 -0
- package/dist/cjs/api/types.js.map +1 -0
- package/dist/cjs/assessment/adaptive.js +390 -0
- package/dist/cjs/assessment/adaptive.js.map +1 -0
- package/dist/cjs/assessment/bkt.js +362 -0
- package/dist/cjs/assessment/bkt.js.map +1 -0
- package/dist/cjs/assessment/index.js +54 -0
- package/dist/cjs/assessment/index.js.map +1 -0
- package/dist/cjs/assessment/irt.js +420 -0
- package/dist/cjs/assessment/irt.js.map +1 -0
- package/dist/cjs/assessment/mastery-engine.js +411 -0
- package/dist/cjs/assessment/mastery-engine.js.map +1 -0
- package/dist/cjs/components/LearningPathView.js +320 -0
- package/dist/cjs/components/LearningPathView.js.map +1 -0
- package/dist/cjs/components/ProgressDashboard.js +308 -0
- package/dist/cjs/components/ProgressDashboard.js.map +1 -0
- package/dist/cjs/components/SkillCard.js +264 -0
- package/dist/cjs/components/SkillCard.js.map +1 -0
- package/dist/cjs/components/SkillExplorer.js +401 -0
- package/dist/cjs/components/SkillExplorer.js.map +1 -0
- package/dist/cjs/components/SkillGraph.js +636 -0
- package/dist/cjs/components/SkillGraph.js.map +1 -0
- package/dist/cjs/components/hooks.js +520 -0
- package/dist/cjs/components/hooks.js.map +1 -0
- package/dist/cjs/components/index.js +77 -0
- package/dist/cjs/components/index.js.map +1 -0
- package/dist/cjs/components/types.js +34 -0
- package/dist/cjs/components/types.js.map +1 -0
- 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 +59 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/llm/adapters/anthropic.js +91 -3
- package/dist/cjs/llm/adapters/anthropic.js.map +1 -1
- package/dist/cjs/llm/adapters/gemini.js +101 -8
- package/dist/cjs/llm/adapters/gemini.js.map +1 -1
- package/dist/cjs/llm/adapters/index.js +42 -1
- package/dist/cjs/llm/adapters/index.js.map +1 -1
- package/dist/cjs/llm/adapters/ollama.js +120 -3
- package/dist/cjs/llm/adapters/ollama.js.map +1 -1
- package/dist/cjs/llm/adapters/openai.js +108 -2
- package/dist/cjs/llm/adapters/openai.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/mcp/cli.js +302 -0
- package/dist/cjs/mcp/cli.js.map +1 -0
- package/dist/cjs/mcp/index.js +79 -0
- package/dist/cjs/mcp/index.js.map +1 -0
- package/dist/cjs/mcp/prompts.js +425 -0
- package/dist/cjs/mcp/prompts.js.map +1 -0
- package/dist/cjs/mcp/resources.js +371 -0
- package/dist/cjs/mcp/resources.js.map +1 -0
- package/dist/cjs/mcp/server.js +410 -0
- package/dist/cjs/mcp/server.js.map +1 -0
- package/dist/cjs/mcp/tools.js +612 -0
- package/dist/cjs/mcp/tools.js.map +1 -0
- package/dist/cjs/mcp/types.js +10 -0
- package/dist/cjs/mcp/types.js.map +1 -0
- 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/assessment.js +46 -0
- package/dist/cjs/types/assessment.js.map +1 -0
- package/dist/cjs/types/bloom.js +12 -1
- package/dist/cjs/types/bloom.js.map +1 -1
- package/dist/cjs/types/graphrag.js +11 -0
- package/dist/cjs/types/graphrag.js.map +1 -0
- package/dist/cjs/types/index.js +7 -1
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/esm/api/routes/analytics.js +285 -0
- package/dist/esm/api/routes/analytics.js.map +1 -0
- package/dist/esm/api/routes/assessments.js +266 -0
- package/dist/esm/api/routes/assessments.js.map +1 -0
- package/dist/esm/api/routes/curriculum.js +342 -0
- package/dist/esm/api/routes/curriculum.js.map +1 -0
- package/dist/esm/api/routes/edges.js +159 -0
- package/dist/esm/api/routes/edges.js.map +1 -0
- package/dist/esm/api/routes/explore.js +221 -0
- package/dist/esm/api/routes/explore.js.map +1 -0
- package/dist/esm/api/routes/learners.js +321 -0
- package/dist/esm/api/routes/learners.js.map +1 -0
- package/dist/esm/api/routes/me.js +401 -0
- package/dist/esm/api/routes/me.js.map +1 -0
- package/dist/esm/api/routes/skills.js +316 -0
- package/dist/esm/api/routes/skills.js.map +1 -0
- package/dist/esm/api/server.js +179 -0
- package/dist/esm/api/server.js.map +1 -0
- package/dist/esm/api/types.js +9 -0
- package/dist/esm/api/types.js.map +1 -0
- package/dist/esm/assessment/adaptive.js +384 -0
- package/dist/esm/assessment/adaptive.js.map +1 -0
- package/dist/esm/assessment/bkt.js +354 -0
- package/dist/esm/assessment/bkt.js.map +1 -0
- package/dist/esm/assessment/index.js +21 -0
- package/dist/esm/assessment/index.js.map +1 -0
- package/dist/esm/assessment/irt.js +406 -0
- package/dist/esm/assessment/irt.js.map +1 -0
- package/dist/esm/assessment/mastery-engine.js +406 -0
- package/dist/esm/assessment/mastery-engine.js.map +1 -0
- package/dist/esm/components/LearningPathView.js +316 -0
- package/dist/esm/components/LearningPathView.js.map +1 -0
- package/dist/esm/components/ProgressDashboard.js +304 -0
- package/dist/esm/components/ProgressDashboard.js.map +1 -0
- package/dist/esm/components/SkillCard.js +260 -0
- package/dist/esm/components/SkillCard.js.map +1 -0
- package/dist/esm/components/SkillExplorer.js +397 -0
- package/dist/esm/components/SkillExplorer.js.map +1 -0
- package/dist/esm/components/SkillGraph.js +599 -0
- package/dist/esm/components/SkillGraph.js.map +1 -0
- package/dist/esm/components/hooks.js +512 -0
- package/dist/esm/components/hooks.js.map +1 -0
- package/dist/esm/components/index.js +61 -0
- package/dist/esm/components/index.js.map +1 -0
- package/dist/esm/components/types.js +31 -0
- package/dist/esm/components/types.js.map +1 -0
- 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 +28 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/llm/adapters/anthropic.js +88 -2
- package/dist/esm/llm/adapters/anthropic.js.map +1 -1
- package/dist/esm/llm/adapters/gemini.js +98 -7
- package/dist/esm/llm/adapters/gemini.js.map +1 -1
- package/dist/esm/llm/adapters/index.js +15 -4
- package/dist/esm/llm/adapters/index.js.map +1 -1
- package/dist/esm/llm/adapters/ollama.js +117 -2
- package/dist/esm/llm/adapters/ollama.js.map +1 -1
- package/dist/esm/llm/adapters/openai.js +105 -1
- package/dist/esm/llm/adapters/openai.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/mcp/cli.js +267 -0
- package/dist/esm/mcp/cli.js.map +1 -0
- package/dist/esm/mcp/index.js +39 -0
- package/dist/esm/mcp/index.js.map +1 -0
- package/dist/esm/mcp/prompts.js +419 -0
- package/dist/esm/mcp/prompts.js.map +1 -0
- package/dist/esm/mcp/resources.js +359 -0
- package/dist/esm/mcp/resources.js.map +1 -0
- package/dist/esm/mcp/server.js +372 -0
- package/dist/esm/mcp/server.js.map +1 -0
- package/dist/esm/mcp/tools.js +598 -0
- package/dist/esm/mcp/tools.js.map +1 -0
- package/dist/esm/mcp/types.js +9 -0
- package/dist/esm/mcp/types.js.map +1 -0
- 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/assessment.js +40 -0
- package/dist/esm/types/assessment.js.map +1 -0
- package/dist/esm/types/bloom.js +11 -0
- package/dist/esm/types/bloom.js.map +1 -1
- package/dist/esm/types/graphrag.js +10 -0
- package/dist/esm/types/graphrag.js.map +1 -0
- package/dist/esm/types/index.js +2 -1
- package/dist/esm/types/index.js.map +1 -1
- package/dist/types/api/routes/analytics.d.ts +14 -0
- package/dist/types/api/routes/analytics.d.ts.map +1 -0
- package/dist/types/api/routes/assessments.d.ts +14 -0
- package/dist/types/api/routes/assessments.d.ts.map +1 -0
- package/dist/types/api/routes/curriculum.d.ts +14 -0
- package/dist/types/api/routes/curriculum.d.ts.map +1 -0
- package/dist/types/api/routes/edges.d.ts +14 -0
- package/dist/types/api/routes/edges.d.ts.map +1 -0
- package/dist/types/api/routes/explore.d.ts +14 -0
- package/dist/types/api/routes/explore.d.ts.map +1 -0
- package/dist/types/api/routes/learners.d.ts +14 -0
- package/dist/types/api/routes/learners.d.ts.map +1 -0
- package/dist/types/api/routes/me.d.ts +14 -0
- package/dist/types/api/routes/me.d.ts.map +1 -0
- package/dist/types/api/routes/skills.d.ts +14 -0
- package/dist/types/api/routes/skills.d.ts.map +1 -0
- package/dist/types/api/server.d.ts +147 -0
- package/dist/types/api/server.d.ts.map +1 -0
- package/dist/types/api/types.d.ts +443 -0
- package/dist/types/api/types.d.ts.map +1 -0
- package/dist/types/assessment/adaptive.d.ts +155 -0
- package/dist/types/assessment/adaptive.d.ts.map +1 -0
- package/dist/types/assessment/bkt.d.ts +185 -0
- package/dist/types/assessment/bkt.d.ts.map +1 -0
- package/dist/types/assessment/index.d.ts +18 -0
- package/dist/types/assessment/index.d.ts.map +1 -0
- package/dist/types/assessment/irt.d.ts +159 -0
- package/dist/types/assessment/irt.d.ts.map +1 -0
- package/dist/types/assessment/mastery-engine.d.ts +178 -0
- package/dist/types/assessment/mastery-engine.d.ts.map +1 -0
- package/dist/types/components/LearningPathView.d.ts +40 -0
- package/dist/types/components/LearningPathView.d.ts.map +1 -0
- package/dist/types/components/ProgressDashboard.d.ts +49 -0
- package/dist/types/components/ProgressDashboard.d.ts.map +1 -0
- package/dist/types/components/SkillCard.d.ts +34 -0
- package/dist/types/components/SkillCard.d.ts.map +1 -0
- package/dist/types/components/SkillExplorer.d.ts +39 -0
- package/dist/types/components/SkillExplorer.d.ts.map +1 -0
- package/dist/types/components/SkillGraph.d.ts +38 -0
- package/dist/types/components/SkillGraph.d.ts.map +1 -0
- package/dist/types/components/hooks.d.ts +187 -0
- package/dist/types/components/hooks.d.ts.map +1 -0
- package/dist/types/components/index.d.ts +59 -0
- package/dist/types/components/index.d.ts.map +1 -0
- package/dist/types/components/types.d.ts +410 -0
- package/dist/types/components/types.d.ts.map +1 -0
- 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 +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/llm/adapters/anthropic.d.ts +84 -1
- package/dist/types/llm/adapters/anthropic.d.ts.map +1 -1
- package/dist/types/llm/adapters/gemini.d.ts +93 -6
- package/dist/types/llm/adapters/gemini.d.ts.map +1 -1
- package/dist/types/llm/adapters/index.d.ts +13 -4
- package/dist/types/llm/adapters/index.d.ts.map +1 -1
- package/dist/types/llm/adapters/ollama.d.ts +126 -1
- package/dist/types/llm/adapters/ollama.d.ts.map +1 -1
- package/dist/types/llm/adapters/openai.d.ts +104 -1
- package/dist/types/llm/adapters/openai.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/cli.d.ts +15 -0
- package/dist/types/mcp/cli.d.ts.map +1 -0
- package/dist/types/mcp/index.d.ts +32 -0
- package/dist/types/mcp/index.d.ts.map +1 -0
- package/dist/types/mcp/prompts.d.ts +27 -0
- package/dist/types/mcp/prompts.d.ts.map +1 -0
- package/dist/types/mcp/resources.d.ts +59 -0
- package/dist/types/mcp/resources.d.ts.map +1 -0
- package/dist/types/mcp/server.d.ts +136 -0
- package/dist/types/mcp/server.d.ts.map +1 -0
- package/dist/types/mcp/tools.d.ts +344 -0
- package/dist/types/mcp/tools.d.ts.map +1 -0
- package/dist/types/mcp/types.d.ts +137 -0
- package/dist/types/mcp/types.d.ts.map +1 -0
- 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/assessment.d.ts +512 -0
- package/dist/types/types/assessment.d.ts.map +1 -0
- package/dist/types/types/bloom.d.ts +4 -0
- package/dist/types/types/bloom.d.ts.map +1 -1
- 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 +4 -1
- package/dist/types/types/index.d.ts.map +1 -1
- package/package.json +48 -3
|
@@ -0,0 +1,591 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Neo4j GraphRAG Storage
|
|
3
|
+
*
|
|
4
|
+
* Extends Neo4jStorage with vector embedding and semantic search capabilities
|
|
5
|
+
* using Neo4j 5.x's native vector index support.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import { Neo4jStorage } from './neo4j.js';
|
|
10
|
+
import { ConnectionError } from './errors.js';
|
|
11
|
+
/**
|
|
12
|
+
* Default GraphRAG configuration
|
|
13
|
+
*/
|
|
14
|
+
export const GRAPHRAG_DEFAULTS = {
|
|
15
|
+
/** Default limit for vector search results */
|
|
16
|
+
searchLimit: 10,
|
|
17
|
+
/** Default minimum similarity score */
|
|
18
|
+
minScore: 0.5,
|
|
19
|
+
/** Default graph traversal depth */
|
|
20
|
+
graphDepth: 2,
|
|
21
|
+
/** Default weight for vector similarity in combined score */
|
|
22
|
+
vectorWeight: 0.7,
|
|
23
|
+
/** Default similarity metric */
|
|
24
|
+
metric: 'cosine',
|
|
25
|
+
/** Batch size for embedding operations */
|
|
26
|
+
embeddingBatchSize: 50,
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Neo4j GraphRAG Storage
|
|
30
|
+
*
|
|
31
|
+
* Provides vector embedding storage and semantic search using Neo4j 5.x
|
|
32
|
+
* native vector indexes combined with graph traversal for enhanced context.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* import { Neo4jGraphRAGStorage, createOpenAIEmbeddingAdapter } from 'learngraph';
|
|
37
|
+
*
|
|
38
|
+
* const storage = new Neo4jGraphRAGStorage();
|
|
39
|
+
* await storage.connect({
|
|
40
|
+
* backend: 'neo4j',
|
|
41
|
+
* uri: 'bolt://localhost:7687',
|
|
42
|
+
* username: 'neo4j',
|
|
43
|
+
* password: 'password',
|
|
44
|
+
* });
|
|
45
|
+
*
|
|
46
|
+
* // Set embedding adapter
|
|
47
|
+
* const embedding = createOpenAIEmbeddingAdapter();
|
|
48
|
+
* storage.setEmbeddingAdapter(embedding);
|
|
49
|
+
*
|
|
50
|
+
* // Create vector index
|
|
51
|
+
* await storage.createVectorIndex({ dimensions: 1536 });
|
|
52
|
+
*
|
|
53
|
+
* // Embed all skills
|
|
54
|
+
* await storage.embedAllSkills();
|
|
55
|
+
*
|
|
56
|
+
* // Semantic search with graph context
|
|
57
|
+
* const results = await storage.searchWithGraphContext('learn JavaScript functions');
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export class Neo4jGraphRAGStorage extends Neo4jStorage {
|
|
61
|
+
embeddingAdapter = null;
|
|
62
|
+
vectorIndexName = 'skill_embedding_index';
|
|
63
|
+
vectorIndexDimensions = null;
|
|
64
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
65
|
+
// Embedding Adapter Management
|
|
66
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
67
|
+
setEmbeddingAdapter(adapter) {
|
|
68
|
+
this.embeddingAdapter = adapter;
|
|
69
|
+
this.vectorIndexDimensions = adapter.dimensions;
|
|
70
|
+
}
|
|
71
|
+
getEmbeddingAdapter() {
|
|
72
|
+
return this.embeddingAdapter;
|
|
73
|
+
}
|
|
74
|
+
requireEmbeddingAdapter() {
|
|
75
|
+
if (!this.embeddingAdapter) {
|
|
76
|
+
throw new Error('Embedding adapter not set. Call setEmbeddingAdapter() first.');
|
|
77
|
+
}
|
|
78
|
+
return this.embeddingAdapter;
|
|
79
|
+
}
|
|
80
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
81
|
+
// Skill Embedding
|
|
82
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
83
|
+
/**
|
|
84
|
+
* Generate text representation for embedding
|
|
85
|
+
*/
|
|
86
|
+
getEmbeddingText(skill) {
|
|
87
|
+
const parts = [skill.name, skill.description];
|
|
88
|
+
if (skill.tags.length > 0) {
|
|
89
|
+
parts.push(`Tags: ${skill.tags.join(', ')}`);
|
|
90
|
+
}
|
|
91
|
+
if (skill.domain) {
|
|
92
|
+
parts.push(`Domain: ${skill.domain}`);
|
|
93
|
+
}
|
|
94
|
+
if (skill.bloomLevel) {
|
|
95
|
+
parts.push(`Bloom level: ${skill.bloomLevel}`);
|
|
96
|
+
}
|
|
97
|
+
return parts.join('. ');
|
|
98
|
+
}
|
|
99
|
+
async embedSkill(skillId) {
|
|
100
|
+
const adapter = this.requireEmbeddingAdapter();
|
|
101
|
+
const skill = await this.getSkill(skillId);
|
|
102
|
+
if (!skill) {
|
|
103
|
+
throw new Error(`Skill not found: ${skillId}`);
|
|
104
|
+
}
|
|
105
|
+
const text = this.getEmbeddingText(skill);
|
|
106
|
+
const result = await adapter.embed(text);
|
|
107
|
+
// Store embedding in Neo4j
|
|
108
|
+
const session = this.getSession();
|
|
109
|
+
try {
|
|
110
|
+
await session.run(`
|
|
111
|
+
MATCH (s:Skill {id: $id})
|
|
112
|
+
SET s.embedding = $embedding,
|
|
113
|
+
s.embeddedText = $embeddedText,
|
|
114
|
+
s.embeddedAt = datetime()
|
|
115
|
+
`, {
|
|
116
|
+
id: skillId,
|
|
117
|
+
embedding: result.vector,
|
|
118
|
+
embeddedText: text,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
await session.close();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async embedAllSkills(options) {
|
|
126
|
+
const adapter = this.requireEmbeddingAdapter();
|
|
127
|
+
const batchSize = options?.batchSize ?? GRAPHRAG_DEFAULTS.embeddingBatchSize;
|
|
128
|
+
// Get all skills
|
|
129
|
+
const skills = await this.findSkills({});
|
|
130
|
+
const total = skills.length;
|
|
131
|
+
let embedded = 0;
|
|
132
|
+
let failed = 0;
|
|
133
|
+
// Process in batches
|
|
134
|
+
for (let i = 0; i < skills.length; i += batchSize) {
|
|
135
|
+
const batch = skills.slice(i, i + batchSize);
|
|
136
|
+
const texts = batch.map((skill) => this.getEmbeddingText(skill));
|
|
137
|
+
try {
|
|
138
|
+
const result = await adapter.embedBatch(texts);
|
|
139
|
+
// Store embeddings
|
|
140
|
+
const session = this.getSession();
|
|
141
|
+
try {
|
|
142
|
+
for (let j = 0; j < batch.length; j++) {
|
|
143
|
+
const skill = batch[j];
|
|
144
|
+
const embedding = result.embeddings[j];
|
|
145
|
+
if (embedding) {
|
|
146
|
+
await session.run(`
|
|
147
|
+
MATCH (s:Skill {id: $id})
|
|
148
|
+
SET s.embedding = $embedding,
|
|
149
|
+
s.embeddedText = $embeddedText,
|
|
150
|
+
s.embeddedAt = datetime()
|
|
151
|
+
`, {
|
|
152
|
+
id: skill.id,
|
|
153
|
+
embedding: embedding.vector,
|
|
154
|
+
embeddedText: texts[j],
|
|
155
|
+
});
|
|
156
|
+
embedded++;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
await session.close();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.error(`Failed to embed batch starting at ${i}:`, error);
|
|
166
|
+
failed += batch.length;
|
|
167
|
+
}
|
|
168
|
+
if (options?.onProgress) {
|
|
169
|
+
options.onProgress(Math.min(i + batchSize, total), total);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return { embedded, failed };
|
|
173
|
+
}
|
|
174
|
+
async hasEmbedding(skillId) {
|
|
175
|
+
const session = this.getSession();
|
|
176
|
+
try {
|
|
177
|
+
const result = await session.run(`
|
|
178
|
+
MATCH (s:Skill {id: $id})
|
|
179
|
+
RETURN s.embedding IS NOT NULL as hasEmbedding
|
|
180
|
+
`, { id: skillId });
|
|
181
|
+
const record = result.records[0];
|
|
182
|
+
return record ? record.get('hasEmbedding') : false;
|
|
183
|
+
}
|
|
184
|
+
finally {
|
|
185
|
+
await session.close();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
async getSkillWithEmbedding(skillId) {
|
|
189
|
+
const session = this.getSession();
|
|
190
|
+
try {
|
|
191
|
+
const result = await session.run(`
|
|
192
|
+
MATCH (s:Skill {id: $id})
|
|
193
|
+
RETURN s {.*} as skill
|
|
194
|
+
`, { id: skillId });
|
|
195
|
+
const record = result.records[0];
|
|
196
|
+
if (!record)
|
|
197
|
+
return null;
|
|
198
|
+
const data = record.get('skill');
|
|
199
|
+
const skill = this.recordToSkill(data);
|
|
200
|
+
return {
|
|
201
|
+
...skill,
|
|
202
|
+
embedding: data.embedding,
|
|
203
|
+
embeddedText: data.embeddedText,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
await session.close();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
211
|
+
// Vector Search
|
|
212
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
213
|
+
async searchByVector(query, options) {
|
|
214
|
+
const adapter = this.requireEmbeddingAdapter();
|
|
215
|
+
// Generate query embedding
|
|
216
|
+
const result = await adapter.embed(query);
|
|
217
|
+
return this.searchByEmbedding(result.vector, options);
|
|
218
|
+
}
|
|
219
|
+
async searchByEmbedding(embedding, options) {
|
|
220
|
+
const limit = options?.limit ?? GRAPHRAG_DEFAULTS.searchLimit;
|
|
221
|
+
const minScore = options?.minScore ?? GRAPHRAG_DEFAULTS.minScore;
|
|
222
|
+
const metric = options?.metric ?? GRAPHRAG_DEFAULTS.metric;
|
|
223
|
+
const session = this.getSession();
|
|
224
|
+
try {
|
|
225
|
+
// Build filter conditions
|
|
226
|
+
const filters = [];
|
|
227
|
+
const params = {
|
|
228
|
+
embedding,
|
|
229
|
+
limit,
|
|
230
|
+
minScore,
|
|
231
|
+
};
|
|
232
|
+
if (options?.tags && options.tags.length > 0) {
|
|
233
|
+
filters.push('any(tag IN s.tags WHERE tag IN $filterTags)');
|
|
234
|
+
params.filterTags = options.tags;
|
|
235
|
+
}
|
|
236
|
+
if (options?.domain) {
|
|
237
|
+
filters.push('s.domain = $filterDomain');
|
|
238
|
+
params.filterDomain = options.domain;
|
|
239
|
+
}
|
|
240
|
+
if (options?.bloomLevel) {
|
|
241
|
+
filters.push('s.bloomLevel = $filterBloomLevel');
|
|
242
|
+
params.filterBloomLevel = options.bloomLevel;
|
|
243
|
+
}
|
|
244
|
+
const filterClause = filters.length > 0 ? `AND ${filters.join(' AND ')}` : '';
|
|
245
|
+
// Use Neo4j vector index if available, otherwise fallback to brute force
|
|
246
|
+
const hasIndex = await this.hasVectorIndex();
|
|
247
|
+
let query;
|
|
248
|
+
if (hasIndex) {
|
|
249
|
+
// Use vector index
|
|
250
|
+
query = `
|
|
251
|
+
CALL db.index.vector.queryNodes($indexName, $limit, $embedding)
|
|
252
|
+
YIELD node as s, score
|
|
253
|
+
WHERE score >= $minScore ${filterClause}
|
|
254
|
+
RETURN s {.*} as skill, score
|
|
255
|
+
ORDER BY score DESC
|
|
256
|
+
LIMIT $limit
|
|
257
|
+
`;
|
|
258
|
+
params.indexName = this.vectorIndexName;
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
// Brute force cosine similarity
|
|
262
|
+
query = `
|
|
263
|
+
MATCH (s:Skill)
|
|
264
|
+
WHERE s.embedding IS NOT NULL ${filterClause}
|
|
265
|
+
WITH s, gds.similarity.cosine(s.embedding, $embedding) as score
|
|
266
|
+
WHERE score >= $minScore
|
|
267
|
+
RETURN s {.*} as skill, score
|
|
268
|
+
ORDER BY score DESC
|
|
269
|
+
LIMIT $limit
|
|
270
|
+
`;
|
|
271
|
+
}
|
|
272
|
+
const result = await session.run(query, params);
|
|
273
|
+
return result.records.map((record) => {
|
|
274
|
+
const data = record.get('skill');
|
|
275
|
+
const skill = this.recordToSkill(data);
|
|
276
|
+
return {
|
|
277
|
+
skill,
|
|
278
|
+
score: record.get('score'),
|
|
279
|
+
metric,
|
|
280
|
+
};
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
finally {
|
|
284
|
+
await session.close();
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
async findSimilarSkills(skillId, options) {
|
|
288
|
+
const skill = await this.getSkillWithEmbedding(skillId);
|
|
289
|
+
if (!skill || !skill.embedding) {
|
|
290
|
+
throw new Error(`Skill ${skillId} not found or has no embedding`);
|
|
291
|
+
}
|
|
292
|
+
// Search excluding the source skill
|
|
293
|
+
const results = await this.searchByEmbedding(skill.embedding, {
|
|
294
|
+
...options,
|
|
295
|
+
limit: (options?.limit ?? GRAPHRAG_DEFAULTS.searchLimit) + 1,
|
|
296
|
+
});
|
|
297
|
+
return results.filter((r) => r.skill.id !== skillId);
|
|
298
|
+
}
|
|
299
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
300
|
+
// GraphRAG Operations
|
|
301
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
302
|
+
async searchWithGraphContext(query, options) {
|
|
303
|
+
const vectorResults = await this.searchByVector(query, options);
|
|
304
|
+
const graphDepth = options?.graphDepth ?? GRAPHRAG_DEFAULTS.graphDepth;
|
|
305
|
+
const vectorWeight = options?.vectorWeight ?? GRAPHRAG_DEFAULTS.vectorWeight;
|
|
306
|
+
const results = [];
|
|
307
|
+
for (const vectorResult of vectorResults) {
|
|
308
|
+
const skillId = vectorResult.skill.id;
|
|
309
|
+
// Get graph context
|
|
310
|
+
const [prerequisites, dependents] = await Promise.all([
|
|
311
|
+
options?.includePrerequisites !== false
|
|
312
|
+
? this.getPrerequisitesOf(skillId)
|
|
313
|
+
: Promise.resolve([]),
|
|
314
|
+
options?.includeDependents !== false
|
|
315
|
+
? this.getDependentsOf(skillId)
|
|
316
|
+
: Promise.resolve([]),
|
|
317
|
+
]);
|
|
318
|
+
// Get related skills via graph traversal
|
|
319
|
+
let relatedSkills = [];
|
|
320
|
+
if (options?.includeRelated !== false) {
|
|
321
|
+
const subgraph = await this.getSubgraph(skillId, graphDepth);
|
|
322
|
+
relatedSkills = subgraph.nodes.filter((n) => n.id !== skillId &&
|
|
323
|
+
!prerequisites.some((p) => p.id === n.id) &&
|
|
324
|
+
!dependents.some((d) => d.id === n.id));
|
|
325
|
+
}
|
|
326
|
+
// Calculate graph relevance based on connectivity
|
|
327
|
+
const totalConnections = prerequisites.length + dependents.length + relatedSkills.length;
|
|
328
|
+
const graphRelevance = Math.min(totalConnections / 10, 1); // Normalize to 0-1
|
|
329
|
+
// Calculate combined score
|
|
330
|
+
const graphWeight = 1 - vectorWeight;
|
|
331
|
+
const combinedScore = vectorResult.score * vectorWeight + graphRelevance * graphWeight;
|
|
332
|
+
results.push({
|
|
333
|
+
...vectorResult,
|
|
334
|
+
prerequisites,
|
|
335
|
+
dependents,
|
|
336
|
+
relatedSkills,
|
|
337
|
+
graphRelevance,
|
|
338
|
+
combinedScore,
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
// Sort by combined score
|
|
342
|
+
return results.sort((a, b) => b.combinedScore - a.combinedScore);
|
|
343
|
+
}
|
|
344
|
+
async buildRAGContext(query, options) {
|
|
345
|
+
const results = await this.searchWithGraphContext(query, options);
|
|
346
|
+
// Collect all unique skills
|
|
347
|
+
const allPrereqs = new Map();
|
|
348
|
+
const allDeps = new Map();
|
|
349
|
+
const allRelated = new Map();
|
|
350
|
+
for (const result of results) {
|
|
351
|
+
for (const prereq of result.prerequisites) {
|
|
352
|
+
allPrereqs.set(prereq.id, prereq);
|
|
353
|
+
}
|
|
354
|
+
for (const dep of result.dependents) {
|
|
355
|
+
allDeps.set(dep.id, dep);
|
|
356
|
+
}
|
|
357
|
+
for (const rel of result.relatedSkills) {
|
|
358
|
+
allRelated.set(rel.id, rel);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
// Get edges between context skills
|
|
362
|
+
const skillIds = [
|
|
363
|
+
...results.map((r) => r.skill.id),
|
|
364
|
+
...Array.from(allPrereqs.keys()),
|
|
365
|
+
...Array.from(allDeps.keys()),
|
|
366
|
+
...Array.from(allRelated.keys()),
|
|
367
|
+
];
|
|
368
|
+
const edges = await this.findPrerequisites({});
|
|
369
|
+
const contextEdges = edges.filter((e) => skillIds.includes(e.sourceId) &&
|
|
370
|
+
skillIds.includes(e.targetId));
|
|
371
|
+
// Build formatted context string for LLM
|
|
372
|
+
const formattedContext = this.formatContextForLLM(results, contextEdges);
|
|
373
|
+
return {
|
|
374
|
+
primaryMatches: results.map((r) => ({
|
|
375
|
+
skill: r.skill,
|
|
376
|
+
score: r.score,
|
|
377
|
+
metric: r.metric,
|
|
378
|
+
})),
|
|
379
|
+
prerequisites: Array.from(allPrereqs.values()),
|
|
380
|
+
dependents: Array.from(allDeps.values()),
|
|
381
|
+
related: Array.from(allRelated.values()),
|
|
382
|
+
edges: contextEdges,
|
|
383
|
+
formattedContext,
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
formatContextForLLM(results, edges) {
|
|
387
|
+
const lines = ['## Relevant Skills'];
|
|
388
|
+
for (const result of results) {
|
|
389
|
+
lines.push(`\n### ${result.skill.name}`);
|
|
390
|
+
lines.push(`- **Description**: ${result.skill.description}`);
|
|
391
|
+
lines.push(`- **Bloom Level**: ${result.skill.bloomLevel}`);
|
|
392
|
+
lines.push(`- **Difficulty**: ${(result.skill.difficulty * 100).toFixed(0)}%`);
|
|
393
|
+
lines.push(`- **Relevance Score**: ${(result.combinedScore * 100).toFixed(1)}%`);
|
|
394
|
+
if (result.prerequisites.length > 0) {
|
|
395
|
+
lines.push(`- **Prerequisites**: ${result.prerequisites.map((p) => p.name).join(', ')}`);
|
|
396
|
+
}
|
|
397
|
+
if (result.dependents.length > 0) {
|
|
398
|
+
lines.push(`- **Leads to**: ${result.dependents.map((d) => d.name).join(', ')}`);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
if (edges.length > 0) {
|
|
402
|
+
lines.push('\n## Prerequisite Relationships');
|
|
403
|
+
for (const edge of edges.slice(0, 20)) {
|
|
404
|
+
const source = results.find((r) => r.skill.id === edge.sourceId)?.skill;
|
|
405
|
+
const target = results.find((r) => r.skill.id === edge.targetId)?.skill;
|
|
406
|
+
if (source && target) {
|
|
407
|
+
lines.push(`- ${source.name} → ${target.name} (${edge.type}, strength: ${edge.strength})`);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return lines.join('\n');
|
|
412
|
+
}
|
|
413
|
+
async generateLearningPathRAG(request) {
|
|
414
|
+
// Search for skills matching the goal
|
|
415
|
+
const searchResults = await this.searchWithGraphContext(request.goal, {
|
|
416
|
+
limit: 10,
|
|
417
|
+
includePrerequisites: true,
|
|
418
|
+
includeDependents: true,
|
|
419
|
+
includeRelated: true,
|
|
420
|
+
});
|
|
421
|
+
if (searchResults.length === 0) {
|
|
422
|
+
return {
|
|
423
|
+
path: [],
|
|
424
|
+
edges: [],
|
|
425
|
+
estimatedMinutes: 0,
|
|
426
|
+
reasoning: 'No matching skills found for the learning goal.',
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
// Build learning path using topological sort
|
|
430
|
+
const targetSkill = searchResults[0].skill;
|
|
431
|
+
const allPrereqs = new Map();
|
|
432
|
+
const skillOrder = [];
|
|
433
|
+
// Recursively gather prerequisites
|
|
434
|
+
const gatherPrereqs = async (skillId) => {
|
|
435
|
+
const prereqs = await this.getPrerequisitesOf(skillId);
|
|
436
|
+
for (const prereq of prereqs) {
|
|
437
|
+
if (!allPrereqs.has(prereq.id)) {
|
|
438
|
+
allPrereqs.set(prereq.id, prereq);
|
|
439
|
+
await gatherPrereqs(prereq.id);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
};
|
|
443
|
+
await gatherPrereqs(targetSkill.id);
|
|
444
|
+
// Filter by mastery if provided
|
|
445
|
+
let unmastered = Array.from(allPrereqs.values());
|
|
446
|
+
if (request.currentMastery) {
|
|
447
|
+
unmastered = unmastered.filter((skill) => {
|
|
448
|
+
const mastery = request.currentMastery.get(skill.id);
|
|
449
|
+
return mastery === undefined || mastery < skill.masteryThreshold;
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
// Sort by difficulty (simpler topological ordering)
|
|
453
|
+
unmastered.sort((a, b) => a.difficulty - b.difficulty);
|
|
454
|
+
// Apply preferences
|
|
455
|
+
if (request.preferences?.style === 'practical') {
|
|
456
|
+
unmastered.sort((a, b) => (a.bloomLevel >= 'apply' ? -1 : 1) - (b.bloomLevel >= 'apply' ? -1 : 1));
|
|
457
|
+
}
|
|
458
|
+
else if (request.preferences?.style === 'theoretical') {
|
|
459
|
+
unmastered.sort((a, b) => (a.bloomLevel <= 'understand' ? -1 : 1) -
|
|
460
|
+
(b.bloomLevel <= 'understand' ? -1 : 1));
|
|
461
|
+
}
|
|
462
|
+
// Limit path length
|
|
463
|
+
const maxSteps = request.maxSteps ?? 20;
|
|
464
|
+
skillOrder.push(...unmastered.slice(0, maxSteps - 1), targetSkill);
|
|
465
|
+
// Get edges for the path
|
|
466
|
+
const pathIds = skillOrder.map((s) => s.id);
|
|
467
|
+
const allEdges = await this.findPrerequisites({});
|
|
468
|
+
const pathEdges = allEdges.filter((e) => pathIds.includes(e.sourceId) &&
|
|
469
|
+
pathIds.includes(e.targetId));
|
|
470
|
+
// Calculate estimated time
|
|
471
|
+
const estimatedMinutes = skillOrder.reduce((sum, s) => sum + s.estimatedMinutes, 0);
|
|
472
|
+
// Generate reasoning
|
|
473
|
+
const reasoning = [
|
|
474
|
+
`Found "${targetSkill.name}" as the best match for your goal.`,
|
|
475
|
+
unmastered.length > 0
|
|
476
|
+
? `Identified ${unmastered.length} prerequisite skills to learn first.`
|
|
477
|
+
: 'No prerequisites needed.',
|
|
478
|
+
`Total learning path: ${skillOrder.length} skills, approximately ${Math.round(estimatedMinutes / 60)} hours.`,
|
|
479
|
+
].join(' ');
|
|
480
|
+
return {
|
|
481
|
+
path: skillOrder,
|
|
482
|
+
edges: pathEdges,
|
|
483
|
+
estimatedMinutes,
|
|
484
|
+
reasoning,
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
488
|
+
// Vector Index Management
|
|
489
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
490
|
+
async createVectorIndex(options) {
|
|
491
|
+
if (!this.isConnected()) {
|
|
492
|
+
throw new ConnectionError('Not connected to Neo4j');
|
|
493
|
+
}
|
|
494
|
+
const dimensions = options?.dimensions ??
|
|
495
|
+
this.vectorIndexDimensions ??
|
|
496
|
+
this.embeddingAdapter?.dimensions ??
|
|
497
|
+
1536;
|
|
498
|
+
const metric = options?.metric ?? GRAPHRAG_DEFAULTS.metric;
|
|
499
|
+
const similarityFunction = metric === 'cosine' ? 'cosine' : 'euclidean';
|
|
500
|
+
const session = this.getSession();
|
|
501
|
+
try {
|
|
502
|
+
// Create vector index using Neo4j 5.x syntax
|
|
503
|
+
await session.run(`
|
|
504
|
+
CREATE VECTOR INDEX ${this.vectorIndexName} IF NOT EXISTS
|
|
505
|
+
FOR (s:Skill)
|
|
506
|
+
ON (s.embedding)
|
|
507
|
+
OPTIONS {
|
|
508
|
+
indexConfig: {
|
|
509
|
+
\`vector.dimensions\`: $dimensions,
|
|
510
|
+
\`vector.similarity_function\`: $similarityFunction
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
`, { dimensions, similarityFunction });
|
|
514
|
+
this.vectorIndexDimensions = dimensions;
|
|
515
|
+
}
|
|
516
|
+
finally {
|
|
517
|
+
await session.close();
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
async dropVectorIndex() {
|
|
521
|
+
if (!this.isConnected()) {
|
|
522
|
+
throw new ConnectionError('Not connected to Neo4j');
|
|
523
|
+
}
|
|
524
|
+
const session = this.getSession();
|
|
525
|
+
try {
|
|
526
|
+
await session.run(`DROP INDEX ${this.vectorIndexName} IF EXISTS`);
|
|
527
|
+
this.vectorIndexDimensions = null;
|
|
528
|
+
}
|
|
529
|
+
finally {
|
|
530
|
+
await session.close();
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
async hasVectorIndex() {
|
|
534
|
+
if (!this.isConnected()) {
|
|
535
|
+
return false;
|
|
536
|
+
}
|
|
537
|
+
const session = this.getSession();
|
|
538
|
+
try {
|
|
539
|
+
const result = await session.run(`
|
|
540
|
+
SHOW INDEXES
|
|
541
|
+
WHERE name = $indexName
|
|
542
|
+
RETURN count(*) as count
|
|
543
|
+
`, { indexName: this.vectorIndexName });
|
|
544
|
+
const record = result.records[0];
|
|
545
|
+
const count = record?.get('count');
|
|
546
|
+
if (!count)
|
|
547
|
+
return false;
|
|
548
|
+
return typeof count === 'number' ? count > 0 : count.low > 0;
|
|
549
|
+
}
|
|
550
|
+
finally {
|
|
551
|
+
await session.close();
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
async getVectorIndexStats() {
|
|
555
|
+
const exists = await this.hasVectorIndex();
|
|
556
|
+
const stats = await this.getStats();
|
|
557
|
+
// Count skills with embeddings
|
|
558
|
+
const session = this.getSession();
|
|
559
|
+
let indexedCount = 0;
|
|
560
|
+
try {
|
|
561
|
+
const result = await session.run(`
|
|
562
|
+
MATCH (s:Skill)
|
|
563
|
+
WHERE s.embedding IS NOT NULL
|
|
564
|
+
RETURN count(s) as count
|
|
565
|
+
`);
|
|
566
|
+
const record = result.records[0];
|
|
567
|
+
indexedCount = record
|
|
568
|
+
? typeof record.get('count') === 'number'
|
|
569
|
+
? record.get('count')
|
|
570
|
+
: record.get('count').low
|
|
571
|
+
: 0;
|
|
572
|
+
}
|
|
573
|
+
finally {
|
|
574
|
+
await session.close();
|
|
575
|
+
}
|
|
576
|
+
return {
|
|
577
|
+
exists,
|
|
578
|
+
dimensions: this.vectorIndexDimensions ?? undefined,
|
|
579
|
+
metric: exists ? GRAPHRAG_DEFAULTS.metric : undefined,
|
|
580
|
+
indexedCount,
|
|
581
|
+
totalSkills: stats.nodeCount,
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
/**
|
|
586
|
+
* Create a Neo4j GraphRAG storage instance
|
|
587
|
+
*/
|
|
588
|
+
export function createNeo4jGraphRAGStorage() {
|
|
589
|
+
return new Neo4jGraphRAGStorage();
|
|
590
|
+
}
|
|
591
|
+
//# sourceMappingURL=neo4j-graphrag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neo4j-graphrag.js","sourceRoot":"","sources":["../../../src/storage/neo4j-graphrag.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assessment Types
|
|
3
|
+
*
|
|
4
|
+
* Comprehensive type definitions for the assessment framework including:
|
|
5
|
+
* - Question types (multiple choice, free response, etc.)
|
|
6
|
+
* - Assessment structures
|
|
7
|
+
* - Item Response Theory (IRT) parameters
|
|
8
|
+
* - Bayesian Knowledge Tracing (BKT) parameters
|
|
9
|
+
* - Evidence of learning
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Create a typed QuestionId from a string
|
|
15
|
+
*/
|
|
16
|
+
export function createQuestionId(id) {
|
|
17
|
+
return id;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a typed AssessmentId from a string
|
|
21
|
+
*/
|
|
22
|
+
export function createAssessmentId(id) {
|
|
23
|
+
return id;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create a typed ResponseId from a string
|
|
27
|
+
*/
|
|
28
|
+
export function createResponseId(id) {
|
|
29
|
+
return id;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Default BKT parameters (empirically derived)
|
|
33
|
+
*/
|
|
34
|
+
export const BKT_DEFAULTS = {
|
|
35
|
+
pInit: 0.3, // 30% prior mastery
|
|
36
|
+
pLearn: 0.1, // 10% chance to learn per opportunity
|
|
37
|
+
pSlip: 0.1, // 10% slip rate
|
|
38
|
+
pGuess: 0.2, // 20% guess rate
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=assessment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assessment.js","sourceRoot":"","sources":["../../../src/types/assessment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAcH;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAU;IACzC,OAAO,EAAgB,CAAC;AAC1B,CAAC;AAmGD;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAU;IAC3C,OAAO,EAAkB,CAAC;AAC5B,CAAC;AA+FD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAU;IACzC,OAAO,EAAgB,CAAC;AAC1B,CAAC;AAwJD;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAkB;IACzC,KAAK,EAAE,GAAG,EAAK,oBAAoB;IACnC,MAAM,EAAE,GAAG,EAAI,sCAAsC;IACrD,KAAK,EAAE,GAAG,EAAK,gBAAgB;IAC/B,MAAM,EAAE,GAAG,EAAI,iBAAiB;CACjC,CAAC"}
|