/** * Spaced Repetition Scheduler (SM-2 Algorithm) * * Implements the SuperMemo SM-2 algorithm for optimal review scheduling. * Schedules reviews at increasing intervals based on performance. * * @packageDocumentation */ import type { SkillId } from '../types/skill.js'; import type { MasteryState } from '../types/mastery.js'; import type { GraphStorage } from '../types/storage.js'; import type { ReviewSchedule, ReviewOptions } from '../types/query.js'; /** * Default options for review scheduling */ export declare const REVIEW_DEFAULTS: Required; /** * SM-2 algorithm constants */ export declare const SM2_CONSTANTS: { /** Minimum easiness factor */ readonly MIN_EASINESS: 1.3; /** Default easiness factor */ readonly DEFAULT_EASINESS: 2.5; /** Maximum easiness factor */ readonly MAX_EASINESS: 3.5; /** Initial interval (days) after first review */ readonly INITIAL_INTERVAL: 1; /** Second interval (days) after second review */ readonly SECOND_INTERVAL: 6; }; /** * Review quality rating (0-5 scale) */ export type ReviewQuality = 0 | 1 | 2 | 3 | 4 | 5; /** * Learner review state */ export interface ReviewState { /** Mastery states for skills (keyed by skill ID) */ masteryStates: Map; } /** * SM-2 update result */ export interface SM2Result { /** New easiness factor */ easinessFactor: number; /** New interval in days */ intervalDays: number; /** Next review date */ nextReview: Date; /** Number of successful repetitions */ repetitions: number; } /** * Spaced Repetition Scheduler * * Uses the SM-2 algorithm to schedule optimal review times. * The algorithm adjusts intervals based on recall quality: * - Quality 5: Perfect response * - Quality 4: Correct with hesitation * - Quality 3: Correct with difficulty * - Quality 2: Incorrect but easily recalled * - Quality 1: Incorrect, remembered when shown * - Quality 0: Complete blackout * * @example * ```typescript * const scheduler = new SpacedRepetitionScheduler(storage); * * // Get review schedule * const schedule = await scheduler.getSchedule(learnerState); * console.log(`${schedule.dueNow.length} reviews due now`); * * // Update after a review * const result = scheduler.calculateNextReview(masteryState, 4); // quality 4 * console.log(`Next review in ${result.intervalDays} days`); * ``` */ export declare class SpacedRepetitionScheduler { private readonly storage; constructor(storage: GraphStorage); /** * Get the review schedule for a learner * * @param learner - Current learner state * @param options - Schedule options * @returns Review schedule with due and upcoming items */ getSchedule(learner: ReviewState, options?: ReviewOptions): Promise; /** * Calculate the next review interval using SM-2 algorithm * * @param currentState - Current mastery state * @param quality - Review quality (0-5) * @returns Updated SM-2 parameters */ calculateNextReview(currentState: MasteryState, quality: ReviewQuality): SM2Result; /** * Convert review quality to mastery update * * @param quality - Review quality (0-5) * @returns Mastery level adjustment */ qualityToMasteryAdjustment(quality: ReviewQuality): number; /** * Calculate next review date based on current mastery state */ private calculateNextReviewDate; /** * Estimate previous interval from mastery state */ private estimatePreviousInterval; /** * Calculate review priority * Higher priority = more urgent to review */ private calculatePriority; } /** * Create a spaced repetition scheduler */ export declare function createSpacedRepetitionScheduler(storage: GraphStorage): SpacedRepetitionScheduler; /** * Standalone SM-2 calculation (for use without storage) * * @param quality - Review quality (0-5) * @param previousEasiness - Previous easiness factor * @param previousInterval - Previous interval in days * @param repetitions - Number of previous successful repetitions * @returns Updated SM-2 parameters */ export declare function calculateSM2(quality: ReviewQuality, previousEasiness?: number, previousInterval?: number, repetitions?: number): SM2Result; //# sourceMappingURL=spaced-repetition.d.ts.map