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.
Files changed (289) hide show
  1. package/dist/cjs/api/routes/analytics.js +288 -0
  2. package/dist/cjs/api/routes/analytics.js.map +1 -0
  3. package/dist/cjs/api/routes/assessments.js +269 -0
  4. package/dist/cjs/api/routes/assessments.js.map +1 -0
  5. package/dist/cjs/api/routes/curriculum.js +345 -0
  6. package/dist/cjs/api/routes/curriculum.js.map +1 -0
  7. package/dist/cjs/api/routes/edges.js +162 -0
  8. package/dist/cjs/api/routes/edges.js.map +1 -0
  9. package/dist/cjs/api/routes/explore.js +224 -0
  10. package/dist/cjs/api/routes/explore.js.map +1 -0
  11. package/dist/cjs/api/routes/learners.js +324 -0
  12. package/dist/cjs/api/routes/learners.js.map +1 -0
  13. package/dist/cjs/api/routes/me.js +404 -0
  14. package/dist/cjs/api/routes/me.js.map +1 -0
  15. package/dist/cjs/api/routes/skills.js +319 -0
  16. package/dist/cjs/api/routes/skills.js.map +1 -0
  17. package/dist/cjs/api/server.js +185 -0
  18. package/dist/cjs/api/server.js.map +1 -0
  19. package/dist/cjs/api/types.js +10 -0
  20. package/dist/cjs/api/types.js.map +1 -0
  21. package/dist/cjs/assessment/adaptive.js +390 -0
  22. package/dist/cjs/assessment/adaptive.js.map +1 -0
  23. package/dist/cjs/assessment/bkt.js +362 -0
  24. package/dist/cjs/assessment/bkt.js.map +1 -0
  25. package/dist/cjs/assessment/index.js +54 -0
  26. package/dist/cjs/assessment/index.js.map +1 -0
  27. package/dist/cjs/assessment/irt.js +420 -0
  28. package/dist/cjs/assessment/irt.js.map +1 -0
  29. package/dist/cjs/assessment/mastery-engine.js +411 -0
  30. package/dist/cjs/assessment/mastery-engine.js.map +1 -0
  31. package/dist/cjs/components/LearningPathView.js +320 -0
  32. package/dist/cjs/components/LearningPathView.js.map +1 -0
  33. package/dist/cjs/components/ProgressDashboard.js +308 -0
  34. package/dist/cjs/components/ProgressDashboard.js.map +1 -0
  35. package/dist/cjs/components/SkillCard.js +264 -0
  36. package/dist/cjs/components/SkillCard.js.map +1 -0
  37. package/dist/cjs/components/SkillExplorer.js +401 -0
  38. package/dist/cjs/components/SkillExplorer.js.map +1 -0
  39. package/dist/cjs/components/SkillGraph.js +636 -0
  40. package/dist/cjs/components/SkillGraph.js.map +1 -0
  41. package/dist/cjs/components/hooks.js +520 -0
  42. package/dist/cjs/components/hooks.js.map +1 -0
  43. package/dist/cjs/components/index.js +77 -0
  44. package/dist/cjs/components/index.js.map +1 -0
  45. package/dist/cjs/components/types.js +34 -0
  46. package/dist/cjs/components/types.js.map +1 -0
  47. package/dist/cjs/embeddings/base.js +104 -0
  48. package/dist/cjs/embeddings/base.js.map +1 -0
  49. package/dist/cjs/embeddings/index.js +91 -0
  50. package/dist/cjs/embeddings/index.js.map +1 -0
  51. package/dist/cjs/embeddings/local.js +224 -0
  52. package/dist/cjs/embeddings/local.js.map +1 -0
  53. package/dist/cjs/embeddings/openai.js +169 -0
  54. package/dist/cjs/embeddings/openai.js.map +1 -0
  55. package/dist/cjs/index.js +59 -1
  56. package/dist/cjs/index.js.map +1 -1
  57. package/dist/cjs/llm/adapters/anthropic.js +91 -3
  58. package/dist/cjs/llm/adapters/anthropic.js.map +1 -1
  59. package/dist/cjs/llm/adapters/gemini.js +101 -8
  60. package/dist/cjs/llm/adapters/gemini.js.map +1 -1
  61. package/dist/cjs/llm/adapters/index.js +42 -1
  62. package/dist/cjs/llm/adapters/index.js.map +1 -1
  63. package/dist/cjs/llm/adapters/ollama.js +120 -3
  64. package/dist/cjs/llm/adapters/ollama.js.map +1 -1
  65. package/dist/cjs/llm/adapters/openai.js +108 -2
  66. package/dist/cjs/llm/adapters/openai.js.map +1 -1
  67. package/dist/cjs/llm/graphrag-orchestrator.js +1004 -0
  68. package/dist/cjs/llm/graphrag-orchestrator.js.map +1 -0
  69. package/dist/cjs/llm/index.js +7 -1
  70. package/dist/cjs/llm/index.js.map +1 -1
  71. package/dist/cjs/mcp/cli.js +302 -0
  72. package/dist/cjs/mcp/cli.js.map +1 -0
  73. package/dist/cjs/mcp/index.js +79 -0
  74. package/dist/cjs/mcp/index.js.map +1 -0
  75. package/dist/cjs/mcp/prompts.js +425 -0
  76. package/dist/cjs/mcp/prompts.js.map +1 -0
  77. package/dist/cjs/mcp/resources.js +371 -0
  78. package/dist/cjs/mcp/resources.js.map +1 -0
  79. package/dist/cjs/mcp/server.js +410 -0
  80. package/dist/cjs/mcp/server.js.map +1 -0
  81. package/dist/cjs/mcp/tools.js +612 -0
  82. package/dist/cjs/mcp/tools.js.map +1 -0
  83. package/dist/cjs/mcp/types.js +10 -0
  84. package/dist/cjs/mcp/types.js.map +1 -0
  85. package/dist/cjs/storage/index.js +15 -1
  86. package/dist/cjs/storage/index.js.map +1 -1
  87. package/dist/cjs/storage/neo4j-graphrag.js +596 -0
  88. package/dist/cjs/storage/neo4j-graphrag.js.map +1 -0
  89. package/dist/cjs/types/assessment.js +46 -0
  90. package/dist/cjs/types/assessment.js.map +1 -0
  91. package/dist/cjs/types/bloom.js +12 -1
  92. package/dist/cjs/types/bloom.js.map +1 -1
  93. package/dist/cjs/types/graphrag.js +11 -0
  94. package/dist/cjs/types/graphrag.js.map +1 -0
  95. package/dist/cjs/types/index.js +7 -1
  96. package/dist/cjs/types/index.js.map +1 -1
  97. package/dist/esm/api/routes/analytics.js +285 -0
  98. package/dist/esm/api/routes/analytics.js.map +1 -0
  99. package/dist/esm/api/routes/assessments.js +266 -0
  100. package/dist/esm/api/routes/assessments.js.map +1 -0
  101. package/dist/esm/api/routes/curriculum.js +342 -0
  102. package/dist/esm/api/routes/curriculum.js.map +1 -0
  103. package/dist/esm/api/routes/edges.js +159 -0
  104. package/dist/esm/api/routes/edges.js.map +1 -0
  105. package/dist/esm/api/routes/explore.js +221 -0
  106. package/dist/esm/api/routes/explore.js.map +1 -0
  107. package/dist/esm/api/routes/learners.js +321 -0
  108. package/dist/esm/api/routes/learners.js.map +1 -0
  109. package/dist/esm/api/routes/me.js +401 -0
  110. package/dist/esm/api/routes/me.js.map +1 -0
  111. package/dist/esm/api/routes/skills.js +316 -0
  112. package/dist/esm/api/routes/skills.js.map +1 -0
  113. package/dist/esm/api/server.js +179 -0
  114. package/dist/esm/api/server.js.map +1 -0
  115. package/dist/esm/api/types.js +9 -0
  116. package/dist/esm/api/types.js.map +1 -0
  117. package/dist/esm/assessment/adaptive.js +384 -0
  118. package/dist/esm/assessment/adaptive.js.map +1 -0
  119. package/dist/esm/assessment/bkt.js +354 -0
  120. package/dist/esm/assessment/bkt.js.map +1 -0
  121. package/dist/esm/assessment/index.js +21 -0
  122. package/dist/esm/assessment/index.js.map +1 -0
  123. package/dist/esm/assessment/irt.js +406 -0
  124. package/dist/esm/assessment/irt.js.map +1 -0
  125. package/dist/esm/assessment/mastery-engine.js +406 -0
  126. package/dist/esm/assessment/mastery-engine.js.map +1 -0
  127. package/dist/esm/components/LearningPathView.js +316 -0
  128. package/dist/esm/components/LearningPathView.js.map +1 -0
  129. package/dist/esm/components/ProgressDashboard.js +304 -0
  130. package/dist/esm/components/ProgressDashboard.js.map +1 -0
  131. package/dist/esm/components/SkillCard.js +260 -0
  132. package/dist/esm/components/SkillCard.js.map +1 -0
  133. package/dist/esm/components/SkillExplorer.js +397 -0
  134. package/dist/esm/components/SkillExplorer.js.map +1 -0
  135. package/dist/esm/components/SkillGraph.js +599 -0
  136. package/dist/esm/components/SkillGraph.js.map +1 -0
  137. package/dist/esm/components/hooks.js +512 -0
  138. package/dist/esm/components/hooks.js.map +1 -0
  139. package/dist/esm/components/index.js +61 -0
  140. package/dist/esm/components/index.js.map +1 -0
  141. package/dist/esm/components/types.js +31 -0
  142. package/dist/esm/components/types.js.map +1 -0
  143. package/dist/esm/embeddings/base.js +99 -0
  144. package/dist/esm/embeddings/base.js.map +1 -0
  145. package/dist/esm/embeddings/index.js +79 -0
  146. package/dist/esm/embeddings/index.js.map +1 -0
  147. package/dist/esm/embeddings/local.js +219 -0
  148. package/dist/esm/embeddings/local.js.map +1 -0
  149. package/dist/esm/embeddings/openai.js +164 -0
  150. package/dist/esm/embeddings/openai.js.map +1 -0
  151. package/dist/esm/index.js +28 -0
  152. package/dist/esm/index.js.map +1 -1
  153. package/dist/esm/llm/adapters/anthropic.js +88 -2
  154. package/dist/esm/llm/adapters/anthropic.js.map +1 -1
  155. package/dist/esm/llm/adapters/gemini.js +98 -7
  156. package/dist/esm/llm/adapters/gemini.js.map +1 -1
  157. package/dist/esm/llm/adapters/index.js +15 -4
  158. package/dist/esm/llm/adapters/index.js.map +1 -1
  159. package/dist/esm/llm/adapters/ollama.js +117 -2
  160. package/dist/esm/llm/adapters/ollama.js.map +1 -1
  161. package/dist/esm/llm/adapters/openai.js +105 -1
  162. package/dist/esm/llm/adapters/openai.js.map +1 -1
  163. package/dist/esm/llm/graphrag-orchestrator.js +999 -0
  164. package/dist/esm/llm/graphrag-orchestrator.js.map +1 -0
  165. package/dist/esm/llm/index.js +4 -0
  166. package/dist/esm/llm/index.js.map +1 -1
  167. package/dist/esm/mcp/cli.js +267 -0
  168. package/dist/esm/mcp/cli.js.map +1 -0
  169. package/dist/esm/mcp/index.js +39 -0
  170. package/dist/esm/mcp/index.js.map +1 -0
  171. package/dist/esm/mcp/prompts.js +419 -0
  172. package/dist/esm/mcp/prompts.js.map +1 -0
  173. package/dist/esm/mcp/resources.js +359 -0
  174. package/dist/esm/mcp/resources.js.map +1 -0
  175. package/dist/esm/mcp/server.js +372 -0
  176. package/dist/esm/mcp/server.js.map +1 -0
  177. package/dist/esm/mcp/tools.js +598 -0
  178. package/dist/esm/mcp/tools.js.map +1 -0
  179. package/dist/esm/mcp/types.js +9 -0
  180. package/dist/esm/mcp/types.js.map +1 -0
  181. package/dist/esm/storage/index.js +8 -0
  182. package/dist/esm/storage/index.js.map +1 -1
  183. package/dist/esm/storage/neo4j-graphrag.js +591 -0
  184. package/dist/esm/storage/neo4j-graphrag.js.map +1 -0
  185. package/dist/esm/types/assessment.js +40 -0
  186. package/dist/esm/types/assessment.js.map +1 -0
  187. package/dist/esm/types/bloom.js +11 -0
  188. package/dist/esm/types/bloom.js.map +1 -1
  189. package/dist/esm/types/graphrag.js +10 -0
  190. package/dist/esm/types/graphrag.js.map +1 -0
  191. package/dist/esm/types/index.js +2 -1
  192. package/dist/esm/types/index.js.map +1 -1
  193. package/dist/types/api/routes/analytics.d.ts +14 -0
  194. package/dist/types/api/routes/analytics.d.ts.map +1 -0
  195. package/dist/types/api/routes/assessments.d.ts +14 -0
  196. package/dist/types/api/routes/assessments.d.ts.map +1 -0
  197. package/dist/types/api/routes/curriculum.d.ts +14 -0
  198. package/dist/types/api/routes/curriculum.d.ts.map +1 -0
  199. package/dist/types/api/routes/edges.d.ts +14 -0
  200. package/dist/types/api/routes/edges.d.ts.map +1 -0
  201. package/dist/types/api/routes/explore.d.ts +14 -0
  202. package/dist/types/api/routes/explore.d.ts.map +1 -0
  203. package/dist/types/api/routes/learners.d.ts +14 -0
  204. package/dist/types/api/routes/learners.d.ts.map +1 -0
  205. package/dist/types/api/routes/me.d.ts +14 -0
  206. package/dist/types/api/routes/me.d.ts.map +1 -0
  207. package/dist/types/api/routes/skills.d.ts +14 -0
  208. package/dist/types/api/routes/skills.d.ts.map +1 -0
  209. package/dist/types/api/server.d.ts +147 -0
  210. package/dist/types/api/server.d.ts.map +1 -0
  211. package/dist/types/api/types.d.ts +443 -0
  212. package/dist/types/api/types.d.ts.map +1 -0
  213. package/dist/types/assessment/adaptive.d.ts +155 -0
  214. package/dist/types/assessment/adaptive.d.ts.map +1 -0
  215. package/dist/types/assessment/bkt.d.ts +185 -0
  216. package/dist/types/assessment/bkt.d.ts.map +1 -0
  217. package/dist/types/assessment/index.d.ts +18 -0
  218. package/dist/types/assessment/index.d.ts.map +1 -0
  219. package/dist/types/assessment/irt.d.ts +159 -0
  220. package/dist/types/assessment/irt.d.ts.map +1 -0
  221. package/dist/types/assessment/mastery-engine.d.ts +178 -0
  222. package/dist/types/assessment/mastery-engine.d.ts.map +1 -0
  223. package/dist/types/components/LearningPathView.d.ts +40 -0
  224. package/dist/types/components/LearningPathView.d.ts.map +1 -0
  225. package/dist/types/components/ProgressDashboard.d.ts +49 -0
  226. package/dist/types/components/ProgressDashboard.d.ts.map +1 -0
  227. package/dist/types/components/SkillCard.d.ts +34 -0
  228. package/dist/types/components/SkillCard.d.ts.map +1 -0
  229. package/dist/types/components/SkillExplorer.d.ts +39 -0
  230. package/dist/types/components/SkillExplorer.d.ts.map +1 -0
  231. package/dist/types/components/SkillGraph.d.ts +38 -0
  232. package/dist/types/components/SkillGraph.d.ts.map +1 -0
  233. package/dist/types/components/hooks.d.ts +187 -0
  234. package/dist/types/components/hooks.d.ts.map +1 -0
  235. package/dist/types/components/index.d.ts +59 -0
  236. package/dist/types/components/index.d.ts.map +1 -0
  237. package/dist/types/components/types.d.ts +410 -0
  238. package/dist/types/components/types.d.ts.map +1 -0
  239. package/dist/types/embeddings/base.d.ts +51 -0
  240. package/dist/types/embeddings/base.d.ts.map +1 -0
  241. package/dist/types/embeddings/index.d.ts +48 -0
  242. package/dist/types/embeddings/index.d.ts.map +1 -0
  243. package/dist/types/embeddings/local.d.ts +82 -0
  244. package/dist/types/embeddings/local.d.ts.map +1 -0
  245. package/dist/types/embeddings/openai.d.ts +48 -0
  246. package/dist/types/embeddings/openai.d.ts.map +1 -0
  247. package/dist/types/index.d.ts +3 -0
  248. package/dist/types/index.d.ts.map +1 -1
  249. package/dist/types/llm/adapters/anthropic.d.ts +84 -1
  250. package/dist/types/llm/adapters/anthropic.d.ts.map +1 -1
  251. package/dist/types/llm/adapters/gemini.d.ts +93 -6
  252. package/dist/types/llm/adapters/gemini.d.ts.map +1 -1
  253. package/dist/types/llm/adapters/index.d.ts +13 -4
  254. package/dist/types/llm/adapters/index.d.ts.map +1 -1
  255. package/dist/types/llm/adapters/ollama.d.ts +126 -1
  256. package/dist/types/llm/adapters/ollama.d.ts.map +1 -1
  257. package/dist/types/llm/adapters/openai.d.ts +104 -1
  258. package/dist/types/llm/adapters/openai.d.ts.map +1 -1
  259. package/dist/types/llm/graphrag-orchestrator.d.ts +280 -0
  260. package/dist/types/llm/graphrag-orchestrator.d.ts.map +1 -0
  261. package/dist/types/llm/index.d.ts +2 -0
  262. package/dist/types/llm/index.d.ts.map +1 -1
  263. package/dist/types/mcp/cli.d.ts +15 -0
  264. package/dist/types/mcp/cli.d.ts.map +1 -0
  265. package/dist/types/mcp/index.d.ts +32 -0
  266. package/dist/types/mcp/index.d.ts.map +1 -0
  267. package/dist/types/mcp/prompts.d.ts +27 -0
  268. package/dist/types/mcp/prompts.d.ts.map +1 -0
  269. package/dist/types/mcp/resources.d.ts +59 -0
  270. package/dist/types/mcp/resources.d.ts.map +1 -0
  271. package/dist/types/mcp/server.d.ts +136 -0
  272. package/dist/types/mcp/server.d.ts.map +1 -0
  273. package/dist/types/mcp/tools.d.ts +344 -0
  274. package/dist/types/mcp/tools.d.ts.map +1 -0
  275. package/dist/types/mcp/types.d.ts +137 -0
  276. package/dist/types/mcp/types.d.ts.map +1 -0
  277. package/dist/types/storage/index.d.ts +2 -0
  278. package/dist/types/storage/index.d.ts.map +1 -1
  279. package/dist/types/storage/neo4j-graphrag.d.ts +106 -0
  280. package/dist/types/storage/neo4j-graphrag.d.ts.map +1 -0
  281. package/dist/types/types/assessment.d.ts +512 -0
  282. package/dist/types/types/assessment.d.ts.map +1 -0
  283. package/dist/types/types/bloom.d.ts +4 -0
  284. package/dist/types/types/bloom.d.ts.map +1 -1
  285. package/dist/types/types/graphrag.d.ts +335 -0
  286. package/dist/types/types/graphrag.d.ts.map +1 -0
  287. package/dist/types/types/index.d.ts +4 -1
  288. package/dist/types/types/index.d.ts.map +1 -1
  289. 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"}