learngraph 0.4.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) 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 +435 -0
  40. package/dist/cjs/components/SkillGraph.js.map +1 -0
  41. package/dist/cjs/components/hooks.js +510 -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/index.js +36 -2
  48. package/dist/cjs/index.js.map +1 -1
  49. package/dist/cjs/llm/adapters/anthropic.js +91 -3
  50. package/dist/cjs/llm/adapters/anthropic.js.map +1 -1
  51. package/dist/cjs/llm/adapters/gemini.js +101 -8
  52. package/dist/cjs/llm/adapters/gemini.js.map +1 -1
  53. package/dist/cjs/llm/adapters/index.js +42 -1
  54. package/dist/cjs/llm/adapters/index.js.map +1 -1
  55. package/dist/cjs/llm/adapters/ollama.js +120 -3
  56. package/dist/cjs/llm/adapters/ollama.js.map +1 -1
  57. package/dist/cjs/llm/adapters/openai.js +108 -2
  58. package/dist/cjs/llm/adapters/openai.js.map +1 -1
  59. package/dist/cjs/mcp/cli.js +302 -0
  60. package/dist/cjs/mcp/cli.js.map +1 -0
  61. package/dist/cjs/mcp/index.js +79 -0
  62. package/dist/cjs/mcp/index.js.map +1 -0
  63. package/dist/cjs/mcp/prompts.js +425 -0
  64. package/dist/cjs/mcp/prompts.js.map +1 -0
  65. package/dist/cjs/mcp/resources.js +371 -0
  66. package/dist/cjs/mcp/resources.js.map +1 -0
  67. package/dist/cjs/mcp/server.js +410 -0
  68. package/dist/cjs/mcp/server.js.map +1 -0
  69. package/dist/cjs/mcp/tools.js +612 -0
  70. package/dist/cjs/mcp/tools.js.map +1 -0
  71. package/dist/cjs/mcp/types.js +10 -0
  72. package/dist/cjs/mcp/types.js.map +1 -0
  73. package/dist/cjs/query/index.js +23 -4
  74. package/dist/cjs/query/index.js.map +1 -1
  75. package/dist/cjs/query/path.js +313 -0
  76. package/dist/cjs/query/path.js.map +1 -0
  77. package/dist/cjs/query/spaced-repetition.js +298 -0
  78. package/dist/cjs/query/spaced-repetition.js.map +1 -0
  79. package/dist/cjs/query/zpd.js +216 -0
  80. package/dist/cjs/query/zpd.js.map +1 -0
  81. package/dist/cjs/types/assessment.js +46 -0
  82. package/dist/cjs/types/assessment.js.map +1 -0
  83. package/dist/cjs/types/bloom.js +12 -1
  84. package/dist/cjs/types/bloom.js.map +1 -1
  85. package/dist/cjs/types/index.js +7 -1
  86. package/dist/cjs/types/index.js.map +1 -1
  87. package/dist/esm/api/routes/analytics.js +285 -0
  88. package/dist/esm/api/routes/analytics.js.map +1 -0
  89. package/dist/esm/api/routes/assessments.js +266 -0
  90. package/dist/esm/api/routes/assessments.js.map +1 -0
  91. package/dist/esm/api/routes/curriculum.js +342 -0
  92. package/dist/esm/api/routes/curriculum.js.map +1 -0
  93. package/dist/esm/api/routes/edges.js +159 -0
  94. package/dist/esm/api/routes/edges.js.map +1 -0
  95. package/dist/esm/api/routes/explore.js +221 -0
  96. package/dist/esm/api/routes/explore.js.map +1 -0
  97. package/dist/esm/api/routes/learners.js +321 -0
  98. package/dist/esm/api/routes/learners.js.map +1 -0
  99. package/dist/esm/api/routes/me.js +401 -0
  100. package/dist/esm/api/routes/me.js.map +1 -0
  101. package/dist/esm/api/routes/skills.js +316 -0
  102. package/dist/esm/api/routes/skills.js.map +1 -0
  103. package/dist/esm/api/server.js +179 -0
  104. package/dist/esm/api/server.js.map +1 -0
  105. package/dist/esm/api/types.js +9 -0
  106. package/dist/esm/api/types.js.map +1 -0
  107. package/dist/esm/assessment/adaptive.js +384 -0
  108. package/dist/esm/assessment/adaptive.js.map +1 -0
  109. package/dist/esm/assessment/bkt.js +354 -0
  110. package/dist/esm/assessment/bkt.js.map +1 -0
  111. package/dist/esm/assessment/index.js +21 -0
  112. package/dist/esm/assessment/index.js.map +1 -0
  113. package/dist/esm/assessment/irt.js +406 -0
  114. package/dist/esm/assessment/irt.js.map +1 -0
  115. package/dist/esm/assessment/mastery-engine.js +406 -0
  116. package/dist/esm/assessment/mastery-engine.js.map +1 -0
  117. package/dist/esm/components/LearningPathView.js +316 -0
  118. package/dist/esm/components/LearningPathView.js.map +1 -0
  119. package/dist/esm/components/ProgressDashboard.js +304 -0
  120. package/dist/esm/components/ProgressDashboard.js.map +1 -0
  121. package/dist/esm/components/SkillCard.js +260 -0
  122. package/dist/esm/components/SkillCard.js.map +1 -0
  123. package/dist/esm/components/SkillExplorer.js +397 -0
  124. package/dist/esm/components/SkillExplorer.js.map +1 -0
  125. package/dist/esm/components/SkillGraph.js +398 -0
  126. package/dist/esm/components/SkillGraph.js.map +1 -0
  127. package/dist/esm/components/hooks.js +502 -0
  128. package/dist/esm/components/hooks.js.map +1 -0
  129. package/dist/esm/components/index.js +61 -0
  130. package/dist/esm/components/index.js.map +1 -0
  131. package/dist/esm/components/types.js +31 -0
  132. package/dist/esm/components/types.js.map +1 -0
  133. package/dist/esm/index.js +13 -1
  134. package/dist/esm/index.js.map +1 -1
  135. package/dist/esm/llm/adapters/anthropic.js +88 -2
  136. package/dist/esm/llm/adapters/anthropic.js.map +1 -1
  137. package/dist/esm/llm/adapters/gemini.js +98 -7
  138. package/dist/esm/llm/adapters/gemini.js.map +1 -1
  139. package/dist/esm/llm/adapters/index.js +15 -4
  140. package/dist/esm/llm/adapters/index.js.map +1 -1
  141. package/dist/esm/llm/adapters/ollama.js +117 -2
  142. package/dist/esm/llm/adapters/ollama.js.map +1 -1
  143. package/dist/esm/llm/adapters/openai.js +105 -1
  144. package/dist/esm/llm/adapters/openai.js.map +1 -1
  145. package/dist/esm/mcp/cli.js +267 -0
  146. package/dist/esm/mcp/cli.js.map +1 -0
  147. package/dist/esm/mcp/index.js +39 -0
  148. package/dist/esm/mcp/index.js.map +1 -0
  149. package/dist/esm/mcp/prompts.js +419 -0
  150. package/dist/esm/mcp/prompts.js.map +1 -0
  151. package/dist/esm/mcp/resources.js +359 -0
  152. package/dist/esm/mcp/resources.js.map +1 -0
  153. package/dist/esm/mcp/server.js +372 -0
  154. package/dist/esm/mcp/server.js.map +1 -0
  155. package/dist/esm/mcp/tools.js +598 -0
  156. package/dist/esm/mcp/tools.js.map +1 -0
  157. package/dist/esm/mcp/types.js +9 -0
  158. package/dist/esm/mcp/types.js.map +1 -0
  159. package/dist/esm/query/index.js +11 -5
  160. package/dist/esm/query/index.js.map +1 -1
  161. package/dist/esm/query/path.js +308 -0
  162. package/dist/esm/query/path.js.map +1 -0
  163. package/dist/esm/query/spaced-repetition.js +292 -0
  164. package/dist/esm/query/spaced-repetition.js.map +1 -0
  165. package/dist/esm/query/zpd.js +211 -0
  166. package/dist/esm/query/zpd.js.map +1 -0
  167. package/dist/esm/types/assessment.js +40 -0
  168. package/dist/esm/types/assessment.js.map +1 -0
  169. package/dist/esm/types/bloom.js +11 -0
  170. package/dist/esm/types/bloom.js.map +1 -1
  171. package/dist/esm/types/index.js +2 -1
  172. package/dist/esm/types/index.js.map +1 -1
  173. package/dist/types/api/routes/analytics.d.ts +14 -0
  174. package/dist/types/api/routes/analytics.d.ts.map +1 -0
  175. package/dist/types/api/routes/assessments.d.ts +14 -0
  176. package/dist/types/api/routes/assessments.d.ts.map +1 -0
  177. package/dist/types/api/routes/curriculum.d.ts +14 -0
  178. package/dist/types/api/routes/curriculum.d.ts.map +1 -0
  179. package/dist/types/api/routes/edges.d.ts +14 -0
  180. package/dist/types/api/routes/edges.d.ts.map +1 -0
  181. package/dist/types/api/routes/explore.d.ts +14 -0
  182. package/dist/types/api/routes/explore.d.ts.map +1 -0
  183. package/dist/types/api/routes/learners.d.ts +14 -0
  184. package/dist/types/api/routes/learners.d.ts.map +1 -0
  185. package/dist/types/api/routes/me.d.ts +14 -0
  186. package/dist/types/api/routes/me.d.ts.map +1 -0
  187. package/dist/types/api/routes/skills.d.ts +14 -0
  188. package/dist/types/api/routes/skills.d.ts.map +1 -0
  189. package/dist/types/api/server.d.ts +147 -0
  190. package/dist/types/api/server.d.ts.map +1 -0
  191. package/dist/types/api/types.d.ts +443 -0
  192. package/dist/types/api/types.d.ts.map +1 -0
  193. package/dist/types/assessment/adaptive.d.ts +155 -0
  194. package/dist/types/assessment/adaptive.d.ts.map +1 -0
  195. package/dist/types/assessment/bkt.d.ts +185 -0
  196. package/dist/types/assessment/bkt.d.ts.map +1 -0
  197. package/dist/types/assessment/index.d.ts +18 -0
  198. package/dist/types/assessment/index.d.ts.map +1 -0
  199. package/dist/types/assessment/irt.d.ts +159 -0
  200. package/dist/types/assessment/irt.d.ts.map +1 -0
  201. package/dist/types/assessment/mastery-engine.d.ts +178 -0
  202. package/dist/types/assessment/mastery-engine.d.ts.map +1 -0
  203. package/dist/types/components/LearningPathView.d.ts +40 -0
  204. package/dist/types/components/LearningPathView.d.ts.map +1 -0
  205. package/dist/types/components/ProgressDashboard.d.ts +49 -0
  206. package/dist/types/components/ProgressDashboard.d.ts.map +1 -0
  207. package/dist/types/components/SkillCard.d.ts +34 -0
  208. package/dist/types/components/SkillCard.d.ts.map +1 -0
  209. package/dist/types/components/SkillExplorer.d.ts +39 -0
  210. package/dist/types/components/SkillExplorer.d.ts.map +1 -0
  211. package/dist/types/components/SkillGraph.d.ts +38 -0
  212. package/dist/types/components/SkillGraph.d.ts.map +1 -0
  213. package/dist/types/components/hooks.d.ts +187 -0
  214. package/dist/types/components/hooks.d.ts.map +1 -0
  215. package/dist/types/components/index.d.ts +59 -0
  216. package/dist/types/components/index.d.ts.map +1 -0
  217. package/dist/types/components/types.d.ts +410 -0
  218. package/dist/types/components/types.d.ts.map +1 -0
  219. package/dist/types/index.d.ts +2 -1
  220. package/dist/types/index.d.ts.map +1 -1
  221. package/dist/types/llm/adapters/anthropic.d.ts +84 -1
  222. package/dist/types/llm/adapters/anthropic.d.ts.map +1 -1
  223. package/dist/types/llm/adapters/gemini.d.ts +93 -6
  224. package/dist/types/llm/adapters/gemini.d.ts.map +1 -1
  225. package/dist/types/llm/adapters/index.d.ts +13 -4
  226. package/dist/types/llm/adapters/index.d.ts.map +1 -1
  227. package/dist/types/llm/adapters/ollama.d.ts +126 -1
  228. package/dist/types/llm/adapters/ollama.d.ts.map +1 -1
  229. package/dist/types/llm/adapters/openai.d.ts +104 -1
  230. package/dist/types/llm/adapters/openai.d.ts.map +1 -1
  231. package/dist/types/mcp/cli.d.ts +15 -0
  232. package/dist/types/mcp/cli.d.ts.map +1 -0
  233. package/dist/types/mcp/index.d.ts +32 -0
  234. package/dist/types/mcp/index.d.ts.map +1 -0
  235. package/dist/types/mcp/prompts.d.ts +27 -0
  236. package/dist/types/mcp/prompts.d.ts.map +1 -0
  237. package/dist/types/mcp/resources.d.ts +59 -0
  238. package/dist/types/mcp/resources.d.ts.map +1 -0
  239. package/dist/types/mcp/server.d.ts +136 -0
  240. package/dist/types/mcp/server.d.ts.map +1 -0
  241. package/dist/types/mcp/tools.d.ts +344 -0
  242. package/dist/types/mcp/tools.d.ts.map +1 -0
  243. package/dist/types/mcp/types.d.ts +137 -0
  244. package/dist/types/mcp/types.d.ts.map +1 -0
  245. package/dist/types/query/index.d.ts +8 -0
  246. package/dist/types/query/index.d.ts.map +1 -1
  247. package/dist/types/query/path.d.ts +102 -0
  248. package/dist/types/query/path.d.ts.map +1 -0
  249. package/dist/types/query/spaced-repetition.d.ts +135 -0
  250. package/dist/types/query/spaced-repetition.d.ts.map +1 -0
  251. package/dist/types/query/zpd.d.ts +97 -0
  252. package/dist/types/query/zpd.d.ts.map +1 -0
  253. package/dist/types/types/assessment.d.ts +512 -0
  254. package/dist/types/types/assessment.d.ts.map +1 -0
  255. package/dist/types/types/bloom.d.ts +4 -0
  256. package/dist/types/types/bloom.d.ts.map +1 -1
  257. package/dist/types/types/index.d.ts +3 -1
  258. package/dist/types/types/index.d.ts.map +1 -1
  259. package/package.json +48 -3
@@ -0,0 +1,316 @@
1
+ /**
2
+ * Skill routes
3
+ *
4
+ * CRUD operations and graph traversal for skills.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ import { Hono } from 'hono';
9
+ import { success, error, ErrorCodes } from '../server.js';
10
+ import { createSkillId } from '../../types/index.js';
11
+ /**
12
+ * Create skill routes
13
+ */
14
+ export function createSkillRoutes(ctx) {
15
+ const app = new Hono();
16
+ // ─────────────────────────────────────────────────────────────────────────
17
+ // List Skills
18
+ // ─────────────────────────────────────────────────────────────────────────
19
+ app.get('/', async (c) => {
20
+ try {
21
+ const page = Number(c.req.query('page')) || 1;
22
+ const pageSize = Number(c.req.query('pageSize')) || 50;
23
+ const search = c.req.query('search');
24
+ const bloomLevel = c.req.query('bloomLevel');
25
+ const sortBy = c.req.query('sortBy');
26
+ const sortOrder = c.req.query('sortOrder');
27
+ // Get tags as array
28
+ const tagsParam = c.req.query('tags');
29
+ const tags = tagsParam ? tagsParam.split(',') : undefined;
30
+ const skills = await ctx.storage.findSkills({});
31
+ // Apply filters
32
+ let filtered = skills;
33
+ if (search) {
34
+ const searchLower = search.toLowerCase();
35
+ filtered = filtered.filter((s) => s.name.toLowerCase().includes(searchLower) ||
36
+ s.description.toLowerCase().includes(searchLower));
37
+ }
38
+ if (bloomLevel) {
39
+ filtered = filtered.filter((s) => s.bloomLevel === bloomLevel);
40
+ }
41
+ if (tags && tags.length > 0) {
42
+ filtered = filtered.filter((s) => tags.some((tag) => s.tags.includes(tag)));
43
+ }
44
+ // Sort
45
+ if (sortBy) {
46
+ filtered.sort((a, b) => {
47
+ const order = sortOrder === 'desc' ? -1 : 1;
48
+ switch (sortBy) {
49
+ case 'name':
50
+ return order * a.name.localeCompare(b.name);
51
+ case 'difficulty':
52
+ return order * (a.difficulty - b.difficulty);
53
+ case 'createdAt':
54
+ return order * (new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());
55
+ case 'updatedAt':
56
+ return order * (new Date(a.updatedAt).getTime() - new Date(b.updatedAt).getTime());
57
+ default:
58
+ return 0;
59
+ }
60
+ });
61
+ }
62
+ // Paginate
63
+ const start = (page - 1) * pageSize;
64
+ const paginated = filtered.slice(start, start + pageSize);
65
+ return c.json(success(paginated, {
66
+ total: filtered.length,
67
+ page,
68
+ pageSize,
69
+ hasMore: start + paginated.length < filtered.length,
70
+ }));
71
+ }
72
+ catch (err) {
73
+ console.error('List skills error:', err);
74
+ return c.json(error(ErrorCodes.INTERNAL_ERROR, 'Failed to list skills'), 500);
75
+ }
76
+ });
77
+ // ─────────────────────────────────────────────────────────────────────────
78
+ // Get Skill by ID
79
+ // ─────────────────────────────────────────────────────────────────────────
80
+ app.get('/:id', async (c) => {
81
+ try {
82
+ const idParam = c.req.param('id');
83
+ const skillId = createSkillId(idParam);
84
+ const skill = await ctx.storage.getSkill(skillId);
85
+ if (!skill) {
86
+ return c.json(error(ErrorCodes.NOT_FOUND, `Skill not found: ${idParam}`), 404);
87
+ }
88
+ // Check for expansions
89
+ const expand = c.req.query('expand')?.split(',') || [];
90
+ const result = { ...skill };
91
+ if (expand.includes('prerequisites')) {
92
+ const edges = await ctx.storage.findPrerequisites({ targetId: skillId });
93
+ result.prerequisites = await Promise.all(edges.map(async (e) => {
94
+ const prereq = await ctx.storage.getSkill(e.sourceId);
95
+ return {
96
+ id: e.sourceId,
97
+ name: prereq?.name || 'Unknown',
98
+ strength: e.strength,
99
+ };
100
+ }));
101
+ }
102
+ if (expand.includes('dependents')) {
103
+ const edges = await ctx.storage.findPrerequisites({ sourceId: skillId });
104
+ result.dependents = await Promise.all(edges.map(async (e) => {
105
+ const dep = await ctx.storage.getSkill(e.targetId);
106
+ return {
107
+ id: e.targetId,
108
+ name: dep?.name || 'Unknown',
109
+ strength: e.strength,
110
+ };
111
+ }));
112
+ }
113
+ return c.json(success(result));
114
+ }
115
+ catch (err) {
116
+ console.error('Get skill error:', err);
117
+ return c.json(error(ErrorCodes.INTERNAL_ERROR, 'Failed to get skill'), 500);
118
+ }
119
+ });
120
+ // ─────────────────────────────────────────────────────────────────────────
121
+ // Create Skill
122
+ // ─────────────────────────────────────────────────────────────────────────
123
+ app.post('/', async (c) => {
124
+ try {
125
+ const body = await c.req.json();
126
+ if (!body.name || !body.description || !body.bloomLevel) {
127
+ return c.json(error(ErrorCodes.VALIDATION_ERROR, 'name, description, and bloomLevel are required'), 400);
128
+ }
129
+ const skill = await ctx.storage.createSkill({
130
+ name: body.name,
131
+ description: body.description,
132
+ bloomLevel: body.bloomLevel,
133
+ difficulty: body.difficulty ?? 0.5,
134
+ isThresholdConcept: body.isThresholdConcept ?? false,
135
+ masteryThreshold: body.masteryThreshold ?? 0.8,
136
+ estimatedMinutes: body.estimatedMinutes ?? 30,
137
+ tags: body.tags ?? [],
138
+ metadata: body.metadata ?? {},
139
+ });
140
+ return c.json(success(skill), 201);
141
+ }
142
+ catch (err) {
143
+ console.error('Create skill error:', err);
144
+ if (err instanceof Error && err.message.includes('already exists')) {
145
+ return c.json(error(ErrorCodes.CONFLICT, err.message), 409);
146
+ }
147
+ return c.json(error(ErrorCodes.INTERNAL_ERROR, 'Failed to create skill'), 500);
148
+ }
149
+ });
150
+ // ─────────────────────────────────────────────────────────────────────────
151
+ // Update Skill
152
+ // ─────────────────────────────────────────────────────────────────────────
153
+ app.put('/:id', async (c) => {
154
+ try {
155
+ const idParam = c.req.param('id');
156
+ const skillId = createSkillId(idParam);
157
+ const body = await c.req.json();
158
+ const existing = await ctx.storage.getSkill(skillId);
159
+ if (!existing) {
160
+ return c.json(error(ErrorCodes.NOT_FOUND, `Skill not found: ${idParam}`), 404);
161
+ }
162
+ const updated = await ctx.storage.updateSkill(skillId, body);
163
+ return c.json(success(updated));
164
+ }
165
+ catch (err) {
166
+ console.error('Update skill error:', err);
167
+ return c.json(error(ErrorCodes.INTERNAL_ERROR, 'Failed to update skill'), 500);
168
+ }
169
+ });
170
+ app.patch('/:id', async (c) => {
171
+ try {
172
+ const idParam = c.req.param('id');
173
+ const skillId = createSkillId(idParam);
174
+ const body = await c.req.json();
175
+ const existing = await ctx.storage.getSkill(skillId);
176
+ if (!existing) {
177
+ return c.json(error(ErrorCodes.NOT_FOUND, `Skill not found: ${idParam}`), 404);
178
+ }
179
+ const updated = await ctx.storage.updateSkill(skillId, body);
180
+ return c.json(success(updated));
181
+ }
182
+ catch (err) {
183
+ console.error('Update skill error:', err);
184
+ return c.json(error(ErrorCodes.INTERNAL_ERROR, 'Failed to update skill'), 500);
185
+ }
186
+ });
187
+ // ─────────────────────────────────────────────────────────────────────────
188
+ // Delete Skill
189
+ // ─────────────────────────────────────────────────────────────────────────
190
+ app.delete('/:id', async (c) => {
191
+ try {
192
+ const idParam = c.req.param('id');
193
+ const skillId = createSkillId(idParam);
194
+ const existing = await ctx.storage.getSkill(skillId);
195
+ if (!existing) {
196
+ return c.json(error(ErrorCodes.NOT_FOUND, `Skill not found: ${idParam}`), 404);
197
+ }
198
+ await ctx.storage.deleteSkill(skillId);
199
+ return c.json(success({ deleted: true }));
200
+ }
201
+ catch (err) {
202
+ console.error('Delete skill error:', err);
203
+ return c.json(error(ErrorCodes.INTERNAL_ERROR, 'Failed to delete skill'), 500);
204
+ }
205
+ });
206
+ // ─────────────────────────────────────────────────────────────────────────
207
+ // Get All Prerequisites (Recursive)
208
+ // ─────────────────────────────────────────────────────────────────────────
209
+ app.get('/:id/prerequisites', async (c) => {
210
+ try {
211
+ const idParam = c.req.param('id');
212
+ const skillId = createSkillId(idParam);
213
+ const maxDepth = Number(c.req.query('depth')) || 10;
214
+ const skill = await ctx.storage.getSkill(skillId);
215
+ if (!skill) {
216
+ return c.json(error(ErrorCodes.NOT_FOUND, `Skill not found: ${idParam}`), 404);
217
+ }
218
+ // BFS to get all prerequisites
219
+ const prerequisites = [];
220
+ const visited = new Set();
221
+ const queue = [{ skillId, depth: 0 }];
222
+ while (queue.length > 0) {
223
+ const current = queue.shift();
224
+ if (current.depth >= maxDepth)
225
+ continue;
226
+ const edges = await ctx.storage.findPrerequisites({ targetId: current.skillId });
227
+ for (const edge of edges) {
228
+ const sourceIdStr = String(edge.sourceId);
229
+ if (!visited.has(sourceIdStr)) {
230
+ visited.add(sourceIdStr);
231
+ const prereqSkill = await ctx.storage.getSkill(edge.sourceId);
232
+ if (prereqSkill) {
233
+ prerequisites.push({
234
+ id: edge.sourceId,
235
+ name: prereqSkill.name,
236
+ bloomLevel: prereqSkill.bloomLevel,
237
+ strength: edge.strength,
238
+ depth: current.depth + 1,
239
+ });
240
+ queue.push({ skillId: edge.sourceId, depth: current.depth + 1 });
241
+ }
242
+ }
243
+ }
244
+ }
245
+ // Sort by depth
246
+ prerequisites.sort((a, b) => a.depth - b.depth);
247
+ const response = {
248
+ skillId,
249
+ skillName: skill.name,
250
+ prerequisites,
251
+ depth: maxDepth,
252
+ };
253
+ return c.json(success(response));
254
+ }
255
+ catch (err) {
256
+ console.error('Get prerequisites error:', err);
257
+ return c.json(error(ErrorCodes.INTERNAL_ERROR, 'Failed to get prerequisites'), 500);
258
+ }
259
+ });
260
+ // ─────────────────────────────────────────────────────────────────────────
261
+ // Get All Dependents (Recursive)
262
+ // ─────────────────────────────────────────────────────────────────────────
263
+ app.get('/:id/dependents', async (c) => {
264
+ try {
265
+ const idParam = c.req.param('id');
266
+ const skillId = createSkillId(idParam);
267
+ const maxDepth = Number(c.req.query('depth')) || 10;
268
+ const skill = await ctx.storage.getSkill(skillId);
269
+ if (!skill) {
270
+ return c.json(error(ErrorCodes.NOT_FOUND, `Skill not found: ${idParam}`), 404);
271
+ }
272
+ // BFS to get all dependents
273
+ const dependents = [];
274
+ const visited = new Set();
275
+ const queue = [{ skillId, depth: 0 }];
276
+ while (queue.length > 0) {
277
+ const current = queue.shift();
278
+ if (current.depth >= maxDepth)
279
+ continue;
280
+ const edges = await ctx.storage.findPrerequisites({ sourceId: current.skillId });
281
+ for (const edge of edges) {
282
+ const targetIdStr = String(edge.targetId);
283
+ if (!visited.has(targetIdStr)) {
284
+ visited.add(targetIdStr);
285
+ const depSkill = await ctx.storage.getSkill(edge.targetId);
286
+ if (depSkill) {
287
+ dependents.push({
288
+ id: edge.targetId,
289
+ name: depSkill.name,
290
+ bloomLevel: depSkill.bloomLevel,
291
+ strength: edge.strength,
292
+ depth: current.depth + 1,
293
+ });
294
+ queue.push({ skillId: edge.targetId, depth: current.depth + 1 });
295
+ }
296
+ }
297
+ }
298
+ }
299
+ // Sort by depth
300
+ dependents.sort((a, b) => a.depth - b.depth);
301
+ const response = {
302
+ skillId,
303
+ skillName: skill.name,
304
+ dependents,
305
+ depth: maxDepth,
306
+ };
307
+ return c.json(success(response));
308
+ }
309
+ catch (err) {
310
+ console.error('Get dependents error:', err);
311
+ return c.json(error(ErrorCodes.INTERNAL_ERROR, 'Failed to get dependents'), 500);
312
+ }
313
+ });
314
+ return app;
315
+ }
316
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../../src/api/routes/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * LearnGraph REST API Server
3
+ *
4
+ * Hono-based REST API for skill graphs, learners, and assessments.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ import { Hono } from 'hono';
9
+ import { cors } from 'hono/cors';
10
+ import { logger } from 'hono/logger';
11
+ import { prettyJSON } from 'hono/pretty-json';
12
+ import { timing } from 'hono/timing';
13
+ import { createSkillRoutes } from './routes/skills.js';
14
+ import { createEdgeRoutes } from './routes/edges.js';
15
+ import { createLearnerRoutes } from './routes/learners.js';
16
+ import { createMeRoutes } from './routes/me.js';
17
+ import { createExploreRoutes } from './routes/explore.js';
18
+ import { createAssessmentRoutes } from './routes/assessments.js';
19
+ import { createAnalyticsRoutes } from './routes/analytics.js';
20
+ import { createCurriculumRoutes } from './routes/curriculum.js';
21
+ // ─────────────────────────────────────────────────────────────────────────────
22
+ // Response Helpers
23
+ // ─────────────────────────────────────────────────────────────────────────────
24
+ /**
25
+ * Create success response
26
+ */
27
+ export function success(data, meta) {
28
+ const response = {
29
+ success: true,
30
+ data,
31
+ };
32
+ if (meta) {
33
+ response.meta = meta;
34
+ }
35
+ return response;
36
+ }
37
+ /**
38
+ * Create error response
39
+ */
40
+ export function error(code, message, details) {
41
+ const errorObj = {
42
+ code,
43
+ message,
44
+ };
45
+ if (details) {
46
+ errorObj.details = details;
47
+ }
48
+ return {
49
+ success: false,
50
+ error: errorObj,
51
+ };
52
+ }
53
+ /**
54
+ * Common error codes
55
+ */
56
+ export const ErrorCodes = {
57
+ NOT_FOUND: 'NOT_FOUND',
58
+ BAD_REQUEST: 'BAD_REQUEST',
59
+ UNAUTHORIZED: 'UNAUTHORIZED',
60
+ FORBIDDEN: 'FORBIDDEN',
61
+ CONFLICT: 'CONFLICT',
62
+ INTERNAL_ERROR: 'INTERNAL_ERROR',
63
+ VALIDATION_ERROR: 'VALIDATION_ERROR',
64
+ };
65
+ // ─────────────────────────────────────────────────────────────────────────────
66
+ // Server Factory
67
+ // ─────────────────────────────────────────────────────────────────────────────
68
+ /**
69
+ * Create the LearnGraph API server
70
+ *
71
+ * @example
72
+ * ```typescript
73
+ * import { createApiServer } from 'learngraph/api';
74
+ * import { MemoryStorage } from 'learngraph/storage';
75
+ *
76
+ * const storage = new MemoryStorage();
77
+ * await storage.connect({ backend: 'memory' });
78
+ *
79
+ * const app = createApiServer({ storage });
80
+ *
81
+ * // Start with Bun
82
+ * export default app;
83
+ *
84
+ * // Or with Node.js
85
+ * import { serve } from '@hono/node-server';
86
+ * serve({ fetch: app.fetch, port: 3000 });
87
+ * ```
88
+ */
89
+ export function createApiServer(config) {
90
+ const app = new Hono();
91
+ const basePath = config.basePath ?? '/api';
92
+ const ctx = {
93
+ storage: config.storage,
94
+ };
95
+ if (config.getCurrentUserId) {
96
+ ctx.getCurrentUserId = config.getCurrentUserId;
97
+ }
98
+ // ─────────────────────────────────────────────────────────────────────────
99
+ // Middleware
100
+ // ─────────────────────────────────────────────────────────────────────────
101
+ // CORS
102
+ if (config.cors !== false) {
103
+ app.use('*', cors({
104
+ origin: config.corsOrigins ?? '*',
105
+ allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],
106
+ allowHeaders: ['Content-Type', 'Authorization'],
107
+ }));
108
+ }
109
+ // Logging
110
+ if (config.logging !== false) {
111
+ app.use('*', logger());
112
+ }
113
+ // Timing headers
114
+ if (config.timing !== false) {
115
+ app.use('*', timing());
116
+ }
117
+ // Pretty JSON (dev mode)
118
+ if (config.prettyJson) {
119
+ app.use('*', prettyJSON());
120
+ }
121
+ // Custom auth middleware
122
+ if (config.authMiddleware) {
123
+ app.use('*', config.authMiddleware);
124
+ }
125
+ // ─────────────────────────────────────────────────────────────────────────
126
+ // Health Check
127
+ // ─────────────────────────────────────────────────────────────────────────
128
+ app.get('/health', (c) => c.json({
129
+ status: 'healthy',
130
+ timestamp: new Date().toISOString(),
131
+ version: '0.5.0',
132
+ }));
133
+ // ─────────────────────────────────────────────────────────────────────────
134
+ // Mount Routes
135
+ // ─────────────────────────────────────────────────────────────────────────
136
+ const api = new Hono();
137
+ // Skills CRUD + Graph Traversal
138
+ api.route('/skills', createSkillRoutes(ctx));
139
+ // Edges CRUD
140
+ api.route('/edges', createEdgeRoutes(ctx));
141
+ // Learners CRUD + Mastery
142
+ api.route('/learners', createLearnerRoutes(ctx));
143
+ // Student self-service (/me)
144
+ api.route('/me', createMeRoutes(ctx));
145
+ // Public skill exploration
146
+ api.route('/explore', createExploreRoutes(ctx));
147
+ // Assessments & Sessions
148
+ api.route('/assessments', createAssessmentRoutes(ctx));
149
+ api.route('/questions', createAssessmentRoutes(ctx)); // Alias
150
+ // Curriculum management
151
+ api.route('/curriculum', createCurriculumRoutes(ctx));
152
+ // Analytics
153
+ api.route('/analytics', createAnalyticsRoutes(ctx));
154
+ // Mount API routes at base path
155
+ app.route(basePath, api);
156
+ // ─────────────────────────────────────────────────────────────────────────
157
+ // Error Handling
158
+ // ─────────────────────────────────────────────────────────────────────────
159
+ app.onError((err, c) => {
160
+ console.error('API Error:', err);
161
+ // Handle known error types
162
+ if (err.message.includes('not found')) {
163
+ return c.json(error(ErrorCodes.NOT_FOUND, err.message), 404);
164
+ }
165
+ if (err.message.includes('already exists')) {
166
+ return c.json(error(ErrorCodes.CONFLICT, err.message), 409);
167
+ }
168
+ if (err.message.includes('validation') || err.message.includes('invalid')) {
169
+ return c.json(error(ErrorCodes.VALIDATION_ERROR, err.message), 400);
170
+ }
171
+ // Generic internal error
172
+ return c.json(error(ErrorCodes.INTERNAL_ERROR, 'An unexpected error occurred'), 500);
173
+ });
174
+ app.notFound((c) => {
175
+ return c.json(error(ErrorCodes.NOT_FOUND, `Route not found: ${c.req.path}`), 404);
176
+ });
177
+ return app;
178
+ }
179
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/api/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * REST API Types
3
+ *
4
+ * Type definitions for the LearnGraph REST API.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/api/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}