learngraph 0.3.0 → 0.5.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 (60) hide show
  1. package/dist/cjs/index.js +1 -1
  2. package/dist/cjs/llm/adapters/gemini.js +156 -0
  3. package/dist/cjs/llm/adapters/gemini.js.map +1 -0
  4. package/dist/cjs/llm/adapters/index.js +12 -1
  5. package/dist/cjs/llm/adapters/index.js.map +1 -1
  6. package/dist/cjs/llm/adapters/mediapipe.js +290 -0
  7. package/dist/cjs/llm/adapters/mediapipe.js.map +1 -0
  8. package/dist/cjs/llm/adapters/openrouter.js +190 -0
  9. package/dist/cjs/llm/adapters/openrouter.js.map +1 -0
  10. package/dist/cjs/llm/index.js +9 -1
  11. package/dist/cjs/llm/index.js.map +1 -1
  12. package/dist/cjs/query/index.js +23 -4
  13. package/dist/cjs/query/index.js.map +1 -1
  14. package/dist/cjs/query/path.js +313 -0
  15. package/dist/cjs/query/path.js.map +1 -0
  16. package/dist/cjs/query/spaced-repetition.js +298 -0
  17. package/dist/cjs/query/spaced-repetition.js.map +1 -0
  18. package/dist/cjs/query/zpd.js +216 -0
  19. package/dist/cjs/query/zpd.js.map +1 -0
  20. package/dist/esm/index.js +1 -1
  21. package/dist/esm/llm/adapters/gemini.js +151 -0
  22. package/dist/esm/llm/adapters/gemini.js.map +1 -0
  23. package/dist/esm/llm/adapters/index.js +3 -0
  24. package/dist/esm/llm/adapters/index.js.map +1 -1
  25. package/dist/esm/llm/adapters/mediapipe.js +252 -0
  26. package/dist/esm/llm/adapters/mediapipe.js.map +1 -0
  27. package/dist/esm/llm/adapters/openrouter.js +185 -0
  28. package/dist/esm/llm/adapters/openrouter.js.map +1 -0
  29. package/dist/esm/llm/index.js +1 -1
  30. package/dist/esm/llm/index.js.map +1 -1
  31. package/dist/esm/query/index.js +11 -5
  32. package/dist/esm/query/index.js.map +1 -1
  33. package/dist/esm/query/path.js +308 -0
  34. package/dist/esm/query/path.js.map +1 -0
  35. package/dist/esm/query/spaced-repetition.js +292 -0
  36. package/dist/esm/query/spaced-repetition.js.map +1 -0
  37. package/dist/esm/query/zpd.js +211 -0
  38. package/dist/esm/query/zpd.js.map +1 -0
  39. package/dist/types/index.d.ts +1 -1
  40. package/dist/types/llm/adapters/gemini.d.ts +30 -0
  41. package/dist/types/llm/adapters/gemini.d.ts.map +1 -0
  42. package/dist/types/llm/adapters/index.d.ts +3 -0
  43. package/dist/types/llm/adapters/index.d.ts.map +1 -1
  44. package/dist/types/llm/adapters/mediapipe.d.ts +113 -0
  45. package/dist/types/llm/adapters/mediapipe.d.ts.map +1 -0
  46. package/dist/types/llm/adapters/openrouter.d.ts +58 -0
  47. package/dist/types/llm/adapters/openrouter.d.ts.map +1 -0
  48. package/dist/types/llm/index.d.ts +2 -2
  49. package/dist/types/llm/index.d.ts.map +1 -1
  50. package/dist/types/query/index.d.ts +8 -0
  51. package/dist/types/query/index.d.ts.map +1 -1
  52. package/dist/types/query/path.d.ts +102 -0
  53. package/dist/types/query/path.d.ts.map +1 -0
  54. package/dist/types/query/spaced-repetition.d.ts +135 -0
  55. package/dist/types/query/spaced-repetition.d.ts.map +1 -0
  56. package/dist/types/query/zpd.d.ts +97 -0
  57. package/dist/types/query/zpd.d.ts.map +1 -0
  58. package/dist/types/types/llm.d.ts +40 -1
  59. package/dist/types/types/llm.d.ts.map +1 -1
  60. package/package.json +6 -2
@@ -0,0 +1,298 @@
1
+ "use strict";
2
+ /**
3
+ * Spaced Repetition Scheduler (SM-2 Algorithm)
4
+ *
5
+ * Implements the SuperMemo SM-2 algorithm for optimal review scheduling.
6
+ * Schedules reviews at increasing intervals based on performance.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.SpacedRepetitionScheduler = exports.SM2_CONSTANTS = exports.REVIEW_DEFAULTS = void 0;
12
+ exports.createSpacedRepetitionScheduler = createSpacedRepetitionScheduler;
13
+ exports.calculateSM2 = calculateSM2;
14
+ /**
15
+ * Default options for review scheduling
16
+ */
17
+ exports.REVIEW_DEFAULTS = {
18
+ includeUpcoming: true,
19
+ upcomingDays: 7,
20
+ maxReviews: 50,
21
+ };
22
+ /**
23
+ * SM-2 algorithm constants
24
+ */
25
+ exports.SM2_CONSTANTS = {
26
+ /** Minimum easiness factor */
27
+ MIN_EASINESS: 1.3,
28
+ /** Default easiness factor */
29
+ DEFAULT_EASINESS: 2.5,
30
+ /** Maximum easiness factor */
31
+ MAX_EASINESS: 3.5,
32
+ /** Initial interval (days) after first review */
33
+ INITIAL_INTERVAL: 1,
34
+ /** Second interval (days) after second review */
35
+ SECOND_INTERVAL: 6,
36
+ };
37
+ /**
38
+ * Spaced Repetition Scheduler
39
+ *
40
+ * Uses the SM-2 algorithm to schedule optimal review times.
41
+ * The algorithm adjusts intervals based on recall quality:
42
+ * - Quality 5: Perfect response
43
+ * - Quality 4: Correct with hesitation
44
+ * - Quality 3: Correct with difficulty
45
+ * - Quality 2: Incorrect but easily recalled
46
+ * - Quality 1: Incorrect, remembered when shown
47
+ * - Quality 0: Complete blackout
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * const scheduler = new SpacedRepetitionScheduler(storage);
52
+ *
53
+ * // Get review schedule
54
+ * const schedule = await scheduler.getSchedule(learnerState);
55
+ * console.log(`${schedule.dueNow.length} reviews due now`);
56
+ *
57
+ * // Update after a review
58
+ * const result = scheduler.calculateNextReview(masteryState, 4); // quality 4
59
+ * console.log(`Next review in ${result.intervalDays} days`);
60
+ * ```
61
+ */
62
+ class SpacedRepetitionScheduler {
63
+ storage;
64
+ constructor(storage) {
65
+ this.storage = storage;
66
+ }
67
+ /**
68
+ * Get the review schedule for a learner
69
+ *
70
+ * @param learner - Current learner state
71
+ * @param options - Schedule options
72
+ * @returns Review schedule with due and upcoming items
73
+ */
74
+ async getSchedule(learner, options = {}) {
75
+ const opts = { ...exports.REVIEW_DEFAULTS, ...options };
76
+ const now = new Date();
77
+ const upcomingCutoff = new Date(now.getTime() + opts.upcomingDays * 24 * 60 * 60 * 1000);
78
+ // Get all skills that have been practiced
79
+ const allSkills = await this.storage.findSkills({});
80
+ const dueNow = [];
81
+ const upcoming = [];
82
+ for (const skill of allSkills) {
83
+ const mastery = learner.masteryStates.get(skill.id);
84
+ if (!mastery) {
85
+ continue; // Never practiced
86
+ }
87
+ // Only schedule reviews for skills with some mastery
88
+ if (mastery.mastery < 0.1) {
89
+ continue;
90
+ }
91
+ const nextReview = this.calculateNextReviewDate(mastery);
92
+ const priority = this.calculatePriority(mastery, nextReview, now);
93
+ const reviewItem = {
94
+ skill,
95
+ state: {
96
+ mastery: mastery.mastery,
97
+ lastAttempt: mastery.lastAttempt,
98
+ streak: mastery.streak,
99
+ },
100
+ nextReview,
101
+ priority,
102
+ };
103
+ if (nextReview <= now) {
104
+ dueNow.push(reviewItem);
105
+ }
106
+ else if (opts.includeUpcoming && nextReview <= upcomingCutoff) {
107
+ upcoming.push(reviewItem);
108
+ }
109
+ }
110
+ // Sort by priority (highest first)
111
+ dueNow.sort((a, b) => b.priority - a.priority);
112
+ upcoming.sort((a, b) => a.nextReview.getTime() - b.nextReview.getTime());
113
+ // Apply limits
114
+ const limitedDue = opts.maxReviews ? dueNow.slice(0, opts.maxReviews) : dueNow;
115
+ const remainingLimit = opts.maxReviews
116
+ ? Math.max(0, opts.maxReviews - limitedDue.length)
117
+ : undefined;
118
+ const limitedUpcoming = remainingLimit !== undefined
119
+ ? upcoming.slice(0, remainingLimit)
120
+ : upcoming;
121
+ // Calculate total review time
122
+ const totalReviewMinutes = [...limitedDue, ...limitedUpcoming].reduce((sum, item) => sum + Math.ceil(item.skill.estimatedMinutes * 0.3), // Reviews are ~30% of initial learning time
123
+ 0);
124
+ return {
125
+ dueNow: limitedDue,
126
+ upcoming: limitedUpcoming,
127
+ totalReviewMinutes,
128
+ };
129
+ }
130
+ /**
131
+ * Calculate the next review interval using SM-2 algorithm
132
+ *
133
+ * @param currentState - Current mastery state
134
+ * @param quality - Review quality (0-5)
135
+ * @returns Updated SM-2 parameters
136
+ */
137
+ calculateNextReview(currentState, quality) {
138
+ const now = new Date();
139
+ // Get current SM-2 state
140
+ let easiness = currentState.easinessFactor ?? exports.SM2_CONSTANTS.DEFAULT_EASINESS;
141
+ let repetitions = currentState.streak;
142
+ let interval;
143
+ // Quality must be >= 3 for successful recall
144
+ if (quality >= 3) {
145
+ // Successful recall
146
+ if (repetitions === 0) {
147
+ interval = exports.SM2_CONSTANTS.INITIAL_INTERVAL;
148
+ }
149
+ else if (repetitions === 1) {
150
+ interval = exports.SM2_CONSTANTS.SECOND_INTERVAL;
151
+ }
152
+ else {
153
+ // Get previous interval from last attempt
154
+ const lastInterval = this.estimatePreviousInterval(currentState);
155
+ interval = Math.round(lastInterval * easiness);
156
+ }
157
+ repetitions++;
158
+ }
159
+ else {
160
+ // Failed recall - reset to beginning
161
+ repetitions = 0;
162
+ interval = exports.SM2_CONSTANTS.INITIAL_INTERVAL;
163
+ }
164
+ // Update easiness factor
165
+ // EF = EF + (0.1 - (5 - q) * (0.08 + (5 - q) * 0.02))
166
+ const easinessChange = 0.1 - (5 - quality) * (0.08 + (5 - quality) * 0.02);
167
+ easiness = Math.max(exports.SM2_CONSTANTS.MIN_EASINESS, Math.min(exports.SM2_CONSTANTS.MAX_EASINESS, easiness + easinessChange));
168
+ // Calculate next review date
169
+ const nextReview = new Date(now.getTime() + interval * 24 * 60 * 60 * 1000);
170
+ return {
171
+ easinessFactor: easiness,
172
+ intervalDays: interval,
173
+ nextReview,
174
+ repetitions,
175
+ };
176
+ }
177
+ /**
178
+ * Convert review quality to mastery update
179
+ *
180
+ * @param quality - Review quality (0-5)
181
+ * @returns Mastery level adjustment
182
+ */
183
+ qualityToMasteryAdjustment(quality) {
184
+ // Map quality to mastery change
185
+ switch (quality) {
186
+ case 5: return 0.1; // Perfect - increase mastery
187
+ case 4: return 0.05; // Correct with hesitation
188
+ case 3: return 0.0; // Correct with difficulty - maintain
189
+ case 2: return -0.1; // Incorrect but close
190
+ case 1: return -0.2; // Poor recall
191
+ case 0: return -0.3; // Complete failure
192
+ }
193
+ }
194
+ /**
195
+ * Calculate next review date based on current mastery state
196
+ */
197
+ calculateNextReviewDate(mastery) {
198
+ if (!mastery.lastAttempt) {
199
+ return new Date(); // Due immediately
200
+ }
201
+ const easiness = mastery.easinessFactor ?? exports.SM2_CONSTANTS.DEFAULT_EASINESS;
202
+ const streak = mastery.streak;
203
+ // Calculate interval based on streak
204
+ let interval;
205
+ if (streak === 0) {
206
+ interval = exports.SM2_CONSTANTS.INITIAL_INTERVAL;
207
+ }
208
+ else if (streak === 1) {
209
+ interval = exports.SM2_CONSTANTS.SECOND_INTERVAL;
210
+ }
211
+ else {
212
+ // Exponential growth based on streak and easiness
213
+ interval = Math.round(exports.SM2_CONSTANTS.SECOND_INTERVAL * Math.pow(easiness, streak - 1));
214
+ }
215
+ // Clamp to reasonable bounds (1 day to 1 year)
216
+ interval = Math.max(1, Math.min(365, interval));
217
+ return new Date(mastery.lastAttempt.getTime() + interval * 24 * 60 * 60 * 1000);
218
+ }
219
+ /**
220
+ * Estimate previous interval from mastery state
221
+ */
222
+ estimatePreviousInterval(mastery) {
223
+ const streak = mastery.streak;
224
+ const easiness = mastery.easinessFactor ?? exports.SM2_CONSTANTS.DEFAULT_EASINESS;
225
+ if (streak <= 1) {
226
+ return exports.SM2_CONSTANTS.INITIAL_INTERVAL;
227
+ }
228
+ else if (streak === 2) {
229
+ return exports.SM2_CONSTANTS.SECOND_INTERVAL;
230
+ }
231
+ else {
232
+ return Math.round(exports.SM2_CONSTANTS.SECOND_INTERVAL * Math.pow(easiness, streak - 2));
233
+ }
234
+ }
235
+ /**
236
+ * Calculate review priority
237
+ * Higher priority = more urgent to review
238
+ */
239
+ calculatePriority(mastery, nextReview, now) {
240
+ // Base priority on how overdue the review is
241
+ const overdueDays = (now.getTime() - nextReview.getTime()) / (24 * 60 * 60 * 1000);
242
+ // Higher mastery items get slightly lower priority (we want to maintain them)
243
+ const masteryFactor = 1 - mastery.mastery * 0.3;
244
+ // Combine factors
245
+ // Overdue items get positive priority, upcoming items get negative
246
+ return overdueDays * masteryFactor * 10;
247
+ }
248
+ }
249
+ exports.SpacedRepetitionScheduler = SpacedRepetitionScheduler;
250
+ /**
251
+ * Create a spaced repetition scheduler
252
+ */
253
+ function createSpacedRepetitionScheduler(storage) {
254
+ return new SpacedRepetitionScheduler(storage);
255
+ }
256
+ /**
257
+ * Standalone SM-2 calculation (for use without storage)
258
+ *
259
+ * @param quality - Review quality (0-5)
260
+ * @param previousEasiness - Previous easiness factor
261
+ * @param previousInterval - Previous interval in days
262
+ * @param repetitions - Number of previous successful repetitions
263
+ * @returns Updated SM-2 parameters
264
+ */
265
+ function calculateSM2(quality, previousEasiness = exports.SM2_CONSTANTS.DEFAULT_EASINESS, previousInterval = 0, repetitions = 0) {
266
+ const now = new Date();
267
+ let easiness = previousEasiness;
268
+ let interval;
269
+ let newRepetitions = repetitions;
270
+ if (quality >= 3) {
271
+ // Successful recall
272
+ if (newRepetitions === 0) {
273
+ interval = exports.SM2_CONSTANTS.INITIAL_INTERVAL;
274
+ }
275
+ else if (newRepetitions === 1) {
276
+ interval = exports.SM2_CONSTANTS.SECOND_INTERVAL;
277
+ }
278
+ else {
279
+ interval = Math.round(previousInterval * easiness);
280
+ }
281
+ newRepetitions++;
282
+ }
283
+ else {
284
+ // Failed - reset
285
+ interval = exports.SM2_CONSTANTS.INITIAL_INTERVAL;
286
+ newRepetitions = 0;
287
+ }
288
+ // Update easiness
289
+ const easinessChange = 0.1 - (5 - quality) * (0.08 + (5 - quality) * 0.02);
290
+ easiness = Math.max(exports.SM2_CONSTANTS.MIN_EASINESS, Math.min(exports.SM2_CONSTANTS.MAX_EASINESS, easiness + easinessChange));
291
+ return {
292
+ easinessFactor: easiness,
293
+ intervalDays: interval,
294
+ nextReview: new Date(now.getTime() + interval * 24 * 60 * 60 * 1000),
295
+ repetitions: newRepetitions,
296
+ };
297
+ }
298
+ //# sourceMappingURL=spaced-repetition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spaced-repetition.js","sourceRoot":"","sources":["../../../src/query/spaced-repetition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ /**
3
+ * Zone of Proximal Development (ZPD) Calculator
4
+ *
5
+ * Implements Vygotsky's Zone of Proximal Development theory to identify
6
+ * skills that are "just right" for a learner - challenging but achievable.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.ZPDCalculator = exports.ZPD_DEFAULTS = void 0;
12
+ exports.createZPDCalculator = createZPDCalculator;
13
+ /**
14
+ * Default options for ZPD calculation
15
+ */
16
+ exports.ZPD_DEFAULTS = {
17
+ difficultyTolerance: 0.2,
18
+ prioritizeThresholdConcepts: true,
19
+ maxResults: 50,
20
+ };
21
+ /**
22
+ * ZPD Calculator
23
+ *
24
+ * Calculates the Zone of Proximal Development for a learner based on:
25
+ * 1. Current mastery states
26
+ * 2. Prerequisite graph structure
27
+ * 3. Skill difficulty levels
28
+ *
29
+ * A skill is in the ZPD if:
30
+ * - All prerequisites are mastered
31
+ * - The skill is not yet mastered
32
+ * - The skill difficulty is within tolerance of learner ability
33
+ */
34
+ class ZPDCalculator {
35
+ storage;
36
+ constructor(storage) {
37
+ this.storage = storage;
38
+ }
39
+ /**
40
+ * Calculate ZPD for a learner
41
+ *
42
+ * @param learner - Learner profile with mastery states
43
+ * @param options - Calculation options
44
+ * @returns ZPD result with ready skills and blocked skills
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * const calculator = new ZPDCalculator(storage);
49
+ *
50
+ * const learner = {
51
+ * masteryStates: new Map([
52
+ * ['skill-1', { skillId: 'skill-1', mastery: 0.9, ... }],
53
+ * ['skill-2', { skillId: 'skill-2', mastery: 0.3, ... }],
54
+ * ])
55
+ * };
56
+ *
57
+ * const zpd = await calculator.calculate(learner);
58
+ * console.log('Ready to learn:', zpd.ready.map(s => s.name));
59
+ * ```
60
+ */
61
+ async calculate(learner, options = {}) {
62
+ const opts = { ...exports.ZPD_DEFAULTS, ...options };
63
+ // Get all skills from storage
64
+ let allSkills = await this.storage.findSkills({});
65
+ // Apply filters
66
+ if (opts.filterTags && opts.filterTags.length > 0) {
67
+ allSkills = allSkills.filter((skill) => opts.filterTags.some((tag) => skill.tags.includes(tag)));
68
+ }
69
+ if (opts.filterDomain) {
70
+ allSkills = allSkills.filter((skill) => skill.metadata?.domain === opts.filterDomain);
71
+ }
72
+ // Calculate learner ability level if not provided
73
+ const abilityLevel = learner.abilityLevel ?? this.calculateAbilityLevel(learner);
74
+ // Categorize skills
75
+ const zpd = [];
76
+ const ready = [];
77
+ const blocked = new Map();
78
+ let masteredCount = 0;
79
+ for (const skill of allSkills) {
80
+ const mastery = learner.masteryStates.get(skill.id);
81
+ const masteryLevel = mastery?.mastery ?? 0;
82
+ // Check if already mastered
83
+ if (masteryLevel >= skill.masteryThreshold) {
84
+ masteredCount++;
85
+ continue;
86
+ }
87
+ // Get prerequisites
88
+ const prerequisites = await this.storage.getPrerequisitesOf(skill.id);
89
+ const unmetPrereqs = [];
90
+ for (const prereq of prerequisites) {
91
+ const prereqMastery = learner.masteryStates.get(prereq.id);
92
+ const prereqLevel = prereqMastery?.mastery ?? 0;
93
+ if (prereqLevel < prereq.masteryThreshold) {
94
+ unmetPrereqs.push(prereq.name);
95
+ }
96
+ }
97
+ if (unmetPrereqs.length > 0) {
98
+ // Skill is blocked
99
+ blocked.set(skill.id, unmetPrereqs);
100
+ }
101
+ else {
102
+ // Skill is in ZPD (prerequisites met, not yet mastered)
103
+ zpd.push(skill);
104
+ // Check if within difficulty tolerance
105
+ const difficultyDelta = skill.difficulty - abilityLevel;
106
+ if (difficultyDelta <= opts.difficultyTolerance) {
107
+ ready.push(skill);
108
+ }
109
+ }
110
+ }
111
+ // Sort ready skills by priority
112
+ this.sortByPriority(ready, opts.prioritizeThresholdConcepts);
113
+ // Limit results
114
+ const limitedReady = opts.maxResults ? ready.slice(0, opts.maxResults) : ready;
115
+ const limitedZpd = opts.maxResults ? zpd.slice(0, opts.maxResults) : zpd;
116
+ return {
117
+ zpd: limitedZpd,
118
+ ready: limitedReady,
119
+ blocked,
120
+ stats: {
121
+ totalSkills: allSkills.length,
122
+ mastered: masteredCount,
123
+ inZPD: zpd.length,
124
+ blocked: blocked.size,
125
+ },
126
+ };
127
+ }
128
+ /**
129
+ * Get the next recommended skill to learn
130
+ *
131
+ * @param learner - Learner profile
132
+ * @param options - ZPD options
133
+ * @returns The highest priority skill to learn next, or null if none available
134
+ */
135
+ async getNextSkill(learner, options = {}) {
136
+ const zpd = await this.calculate(learner, { ...options, maxResults: 1 });
137
+ return zpd.ready[0] ?? zpd.zpd[0] ?? null;
138
+ }
139
+ /**
140
+ * Check if a specific skill is in the learner's ZPD
141
+ *
142
+ * @param skillId - Skill to check
143
+ * @param learner - Learner profile
144
+ * @returns Object with inZPD status and blocking prerequisites if any
145
+ */
146
+ async isInZPD(skillId, learner) {
147
+ const skill = await this.storage.getSkill(skillId);
148
+ if (!skill) {
149
+ return { inZPD: false, blocking: ['Skill not found'] };
150
+ }
151
+ // Check if already mastered
152
+ const mastery = learner.masteryStates.get(skillId);
153
+ if (mastery && mastery.mastery >= skill.masteryThreshold) {
154
+ return { inZPD: false, blocking: [] };
155
+ }
156
+ // Check prerequisites
157
+ const prerequisites = await this.storage.getPrerequisitesOf(skillId);
158
+ const blocking = [];
159
+ for (const prereq of prerequisites) {
160
+ const prereqMastery = learner.masteryStates.get(prereq.id);
161
+ const prereqLevel = prereqMastery?.mastery ?? 0;
162
+ if (prereqLevel < prereq.masteryThreshold) {
163
+ blocking.push(prereq.name);
164
+ }
165
+ }
166
+ return {
167
+ inZPD: blocking.length === 0,
168
+ blocking,
169
+ };
170
+ }
171
+ /**
172
+ * Calculate learner ability level from mastery states
173
+ */
174
+ calculateAbilityLevel(learner) {
175
+ if (learner.masteryStates.size === 0) {
176
+ return 0.3; // Default starting ability
177
+ }
178
+ let totalWeighted = 0;
179
+ let totalWeight = 0;
180
+ for (const state of learner.masteryStates.values()) {
181
+ // Weight by mastery level (higher mastery = more confident estimate)
182
+ const weight = state.mastery;
183
+ totalWeighted += state.mastery * weight;
184
+ totalWeight += weight;
185
+ }
186
+ return totalWeight > 0 ? totalWeighted / totalWeight : 0.3;
187
+ }
188
+ /**
189
+ * Sort skills by learning priority
190
+ */
191
+ sortByPriority(skills, prioritizeThreshold) {
192
+ skills.sort((a, b) => {
193
+ // Threshold concepts first (if enabled)
194
+ if (prioritizeThreshold) {
195
+ if (a.isThresholdConcept && !b.isThresholdConcept)
196
+ return -1;
197
+ if (!a.isThresholdConcept && b.isThresholdConcept)
198
+ return 1;
199
+ }
200
+ // Then by difficulty (easier first for progressive learning)
201
+ if (a.difficulty !== b.difficulty) {
202
+ return a.difficulty - b.difficulty;
203
+ }
204
+ // Finally by estimated time (shorter first)
205
+ return a.estimatedMinutes - b.estimatedMinutes;
206
+ });
207
+ }
208
+ }
209
+ exports.ZPDCalculator = ZPDCalculator;
210
+ /**
211
+ * Create a ZPD calculator
212
+ */
213
+ function createZPDCalculator(storage) {
214
+ return new ZPDCalculator(storage);
215
+ }
216
+ //# sourceMappingURL=zpd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zpd.js","sourceRoot":"","sources":["../../../src/query/zpd.ts"],"names":[],"mappings":"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"}
package/dist/esm/index.js CHANGED
@@ -36,7 +36,7 @@ export * from './types/index.js';
36
36
  /**
37
37
  * Package version
38
38
  */
39
- export const VERSION = '0.1.1';
39
+ export const VERSION = '0.5.0';
40
40
  /**
41
41
  * Package name
42
42
  */