import type { FsrsState, PageLearningRecord, PagePrerequisiteRecord, PageReviewRecord, ReviewRating } from "./contracts.js"; import type { ScholarDatabase } from "./database.js"; export interface SqlDatabase { exec(sql: string): void; run(sql: string, ...parameters: unknown[]): unknown; get>(sql: string, ...parameters: unknown[]): T | undefined; all>(sql: string, ...parameters: unknown[]): T[]; } export type SqlDatabaseSource = Pick; export interface Clock { now(): Date; } export interface VaultPathsLike { readonly root?: string; readonly vaultRoot?: string; readonly quizzes?: string; readonly quizzesRoot?: string; readonly wiki?: string; } export interface CoveragePage { readonly pageId: string; readonly status?: "active" | "drifted" | "retired"; readonly quizWorthiness?: "eligible" | "skip" | "unknown"; } export interface CoverageReport { readonly ok: boolean; readonly coveredPageIds: readonly string[]; readonly skippedPageIds: readonly string[]; readonly missingPageIds: readonly string[]; } export interface PrerequisiteResult { readonly pageId: string; readonly prerequisites: readonly string[]; } export declare class RevisionConflictError extends Error { readonly code = "revision-conflict"; constructor(message?: string); } export declare class ValidationError extends Error { readonly code = "validation-error"; constructor(message: string); } export declare const SYSTEM_CLOCK: Clock; declare const FSRS_STATES: readonly FsrsState[]; declare const RATINGS: readonly ReviewRating[]; export declare function persistedTimezone(source: SqlDatabaseSource): string; export declare function localDate(value: string | Date, timezone?: string): string; export declare function localNoon(date: string, timezone?: string): Date; export declare const SEALED_QUIZ_REVIEW: unique symbol; export interface ReviewTransitionContext { readonly quizId: string; readonly submissionId: string; readonly revision: number; readonly settlementId?: string; readonly authorization?: typeof SEALED_QUIZ_REVIEW; } export declare class SchedulerService { readonly db: SqlDatabase; readonly paths?: VaultPathsLike; readonly clock: Clock; private readonly source; private readonly engine; constructor(source: SqlDatabaseSource, paths?: VaultPathsLike, clock?: Clock); ensurePageLearning(pageId: string, initialDueAt?: string | Date): PageLearningRecord; getPageLearning(pageId: string): PageLearningRecord; listPageLearning(activeOnly?: boolean): PageLearningRecord[]; listPrerequisites(pageId: string): PagePrerequisiteRecord[]; setPrerequisites(pageId: string, prerequisitePageIds: readonly string[], expectedRevision?: number): PrerequisiteResult; validateCoverage(pages?: readonly CoveragePage[]): CoverageReport; eligiblePages(date: string | Date, initializeMissing?: boolean): PageLearningRecord[]; pageHistory(pageId: string): PageReviewRecord[]; transitionPage(pageId: string, rating: ReviewRating, reviewedAt: string | Date, context: ReviewTransitionContext): PageReviewRecord; transitionPageInTransaction(pageId: string, rating: ReviewRating, reviewedAt: string | Date, context: ReviewTransitionContext): PageReviewRecord; private toFsrsInput; private hasCycle; } export { FSRS_STATES, RATINGS }; //# sourceMappingURL=scheduler.d.ts.map