import type { QuizEvidenceRecord, QuizGradeRecord, QuizQuestionKind, QuizQuestionPageRecord, QuizRecord, ReviewRating, WorkflowRecord } from "./contracts.js"; import type { Clock, SqlDatabase, SqlDatabaseSource, VaultPathsLike } from "./scheduler.js"; import { SchedulerService } from "./scheduler.js"; export interface QuestionSpecInput { readonly kind: QuizQuestionKind; readonly prompt: string; readonly choices?: readonly string[]; readonly pages: readonly QuizQuestionPageRecord[]; readonly sourceRefs?: readonly string[]; readonly answerKey?: unknown; } export interface QuizDraftInput { readonly date: string | Date; readonly revision: number; readonly answers: Readonly>; } export interface ReadingLink { readonly pageId: string; readonly anchor: string; readonly heading?: string; } export interface QuizSubmissionInput { readonly date: string | Date; readonly revision: number; readonly answers?: Readonly>; } export interface PageGradeInput { readonly pageId: string; readonly rating: ReviewRating; readonly feedback?: string; readonly evidence: readonly string[]; readonly readings?: readonly ReadingLink[]; } export interface QuestionGradeInput { readonly questionId: string; readonly feedback?: string; } export interface GradeSubmissionInput { readonly date: string | Date; readonly revision?: number; readonly submissionId?: string; readonly requestId?: string; readonly questions: readonly QuestionGradeInput[]; readonly pages: readonly PageGradeInput[]; } export interface QuizGenerationInput { readonly date: string | Date; readonly questionSpecs?: readonly QuestionSpecInput[]; readonly selectedPageIds?: readonly string[]; } export interface SettledQuestionResult { readonly questionId: string; readonly feedback: string; } export interface SettledPageResult extends QuizGradeRecord { readonly reviewId: string; readonly evidence: readonly string[]; readonly readings: readonly ReadingLink[]; } export interface SettledQuizResult { readonly quiz: QuizRecord; readonly questions: readonly SettledQuestionResult[]; readonly pages: readonly SettledPageResult[]; } export declare class QuizConflictError extends Error { readonly code = "quiz-conflict"; constructor(message: string); } export interface QuizVisibleTextToken { readonly value: string; readonly match: "boundary" | "substring"; } export declare function validateQuizVisibleText(value: string, hiddenTokens: readonly QuizVisibleTextToken[]): void; export declare function evidenceReference(pageId: string, anchor: string, pageDigest: string, pageRevision: number, textDigest: string): string; export declare class QuizService { readonly db: SqlDatabase; readonly paths?: VaultPathsLike; readonly scheduler: SchedulerService; readonly clock: Clock; private readonly source; constructor(source: SqlDatabaseSource, paths?: VaultPathsLike, scheduler?: SchedulerService, clock?: Clock); get(dateOrQuizId: string | Date): QuizRecord | undefined; list(): QuizRecord[]; /** Snapshot the sealed page evidence; this is internal and never part of browser DTOs. */ gradingEvidence(quizOrDate: QuizRecord | string | Date): QuizEvidenceRecord[]; private selectedPagesFor; createDailyQuiz(input: QuizGenerationInput | string | Date, questionSpecs?: readonly QuestionSpecInput[]): QuizRecord; saveDraft(input: QuizDraftInput): QuizRecord; saveDraft(date: string | Date, revision: number, answers: Readonly>): QuizRecord; sealSubmission(input: QuizDraftInput): QuizRecord; sealSubmission(date: string | Date, revision: number, answers?: Readonly>): QuizRecord; sealSubmissionAndQueue(input: QuizSubmissionInput, requestId: string, enqueue: (requestId: string, quiz: QuizRecord) => WorkflowRecord): { readonly quiz: QuizRecord; readonly workflow: WorkflowRecord; }; expirePrior(date: string | Date): number; expireOpenQuizIds(quizIds: readonly string[]): number; settleGrade(input: GradeSubmissionInput, afterPersist?: (result: SettledQuizResult) => void): SettledQuizResult; settleGrade(date: string | Date, submission: Omit, afterPersist?: (result: SettledQuizResult) => void): SettledQuizResult; readingHref(reading: ReadingLink): string; renderSheet(quiz: QuizRecord, answers?: Readonly>, results?: readonly SettledQuestionResult[], pageResults?: readonly SettledPageResult[]): string; parseSheet(markdown: string): QuizRecord; private requireQuiz; private hiddenTokensForQuiz; private mapQuiz; private prepareSeal; private sealInTransaction; private snapshotEvidence; private evidenceForPage; private uniqueEvidence; private validateQuestionSpecs; private prepareGradeSubmission; private revalidatePreparedGrades; private validateAnswerText; private validateFeedback; private validateCompleteAnswers; private answerMap; private validateReadings; private uniqueReadings; private readSettlementIdentity; readSettledResult(quiz: QuizRecord): SettledQuizResult | undefined; private readSettledResults; private validateRenderedSheet; private replaceSheet; private writeSheet; } //# sourceMappingURL=quiz.d.ts.map