A fast, high-performance exam scheduling system backed by Z3, with a SvelteKit frontend. Designed for small-medium sized schools. kemisolve.wobbl.in
schools school z3 scheduling exam-scheduling solver
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152// This file has been generated by TauRPC. Do not edit this file manually.
import { createTauRPCProxy as createProxy, type InferCommandOutput, type TauRpcResult, type UnlistenFn } from 'taurpc'/** Identifier for an exam. */export type ExamId = number;
/** AI-generated (GPT-5.3-codex). */export type InitSolverError = /** AI-generated (GPT-5.3-codex). */({ LockPoison: string }) & { Recv?: never; Solver?: never } | /** AI-generated (GPT-5.3-codex). */({ Solver: string }) & { LockPoison?: never; Recv?: never } | /** AI-generated (GPT-5.3-codex). */({ Recv: string }) & { LockPoison?: never; Solver?: never };
/** AI-generated (GPT-5.3-codex). */export type LockedTimetableSlot = { session_id: SessionId, timeslot_id: TimeslotId,};
export type NewTimetableUpdate = /** * Key: session ID * Value: timeslot ID * * (Specta doesn't like non-number/string keys) */{ Timetable: { [key in number]: TimeslotId } } | "Done";
export type Result<T, E> = { ok: T, err: E,};
/** Identifier for a session. */export type SessionId = number;
/** AI-generated (GPT-5.3-codex). */export type SolveSessionControlError = /** AI-generated (GPT-5.3-codex). */({ LockPoison: string }) & { InvalidSessionId?: never; Send?: never } | /** AI-generated (GPT-5.3-codex). */({ Send: string }) & { InvalidSessionId?: never; LockPoison?: never } | /** AI-generated (GPT-5.3-codex). */({ InvalidSessionId: number }) & { LockPoison?: never; Send?: never };
/** AI-generated (GPT-5.3-codex). */export type SolveSessionStart = { session_id: number,};
export type SqlBatchQuery = { sql: string, params: SqlParam[], method: string,};
/** AI-generated (GPT-5.3-codex). */export type SqlError = /** AI-generated (GPT-5.3-codex). */({ SqlProxy: string }) & { LockPoison?: never } | /** AI-generated (GPT-5.3-codex). */({ LockPoison: string }) & { SqlProxy?: never };
export type SqlParam = "Null" | ({ Bool: boolean }) & { Float?: never; Int?: never; Text?: never } | ({ Int: number }) & { Bool?: never; Float?: never; Text?: never } | ({ Float: number | null }) & { Bool?: never; Int?: never; Text?: never } | ({ Text: string }) & { Bool?: never; Float?: never; Int?: never };
export type SqlQueryResult = { rows: SqlValue[][],};
export type SqlValue = "Null" | ({ Bool: boolean }) & { Blob?: never; Float?: never; Int?: never; Text?: never } | ({ Int: number }) & { Blob?: never; Bool?: never; Float?: never; Text?: never } | ({ Float: number | null }) & { Blob?: never; Bool?: never; Int?: never; Text?: never } | ({ Text: string }) & { Blob?: never; Bool?: never; Float?: never; Int?: never } | ({ Blob: number[] }) & { Bool?: never; Float?: never; Int?: never; Text?: never };
/** Identifier for a timeslot. */export type TimeslotId = number;
/** Data to generate a timetable PDF */export type TimetableData = { /** The name of the school */ schoolName: string, /** The title of the timetable */ title: string, /** The grades to include in the timetable */ grades: number[], /** The days that make up the timetable */ days: TimetableDay[],};
/** A day in the timetable */export type TimetableDay = { /** The date of the day, in ISO 8601 format */ date: string, /** The sessions that occur on this day */ sessions: TimetableSession[],};
/** An exam entry in the timetable session */export type TimetableExamEntry = { /** The session ID of the exam */ sessionId: number, /** The exam ID of the exam */ examId: ExamId, /** The grade of the exam */ grade: number, /** The subject of the exam */ subject: string, /** Custom name for the exam. Replaces <Paper number> in the display */ examName: string | null, /** The start of the exam, formatted as "hh:mm" */ startTime: string, /** The end of the exam, formatted as "hh:mm" */ endTime: string, /** The exam paper number */ paperNumber: number, locked: boolean,};
/** A session in the timetable */export type TimetableSession = { /** The session number (currently either 1 or 2) */ sessionNumber: number, /** The timeslot ID of the session */ timeslotId: TimeslotId, /** The exams that occur in this session */ exams: TimetableExamEntry[],};const ARGS_MAP = {"":{"generate_timetable_pdf":["data"],"pause_solve_session":["session_id"],"solve_single":["locked_slots"],"sql":["sql","params","method"],"sql_batch":["queries"],"start_solve_session":["on_new_timetable","locked_slots"],"stop_solve_session":["session_id"]}};
const RESULT_MAP = {"":{"generate_timetable_pdf":true,"pause_solve_session":true,"solve_single":true,"sql":true,"sql_batch":true,"start_solve_session":true,"stop_solve_session":true}};
export type Router = { "": { generate_timetable_pdf: (data: TimetableData) => Promise<TauRpcResult<null, string>>, pause_solve_session: (sessionId: number) => Promise<TauRpcResult<null, SolveSessionControlError>>, solve_single: (lockedSlots: LockedTimetableSlot[]) => Promise<TauRpcResult<{ [key in number]: TimeslotId }, InitSolverError>>, sql: (sql: string, params: SqlParam[], method: string) => Promise<TauRpcResult<SqlQueryResult, SqlError>>, sql_batch: (queries: SqlBatchQuery[]) => Promise<TauRpcResult<SqlQueryResult[], SqlError>>, start_solve_session: (onNewTimetable: (response: NewTimetableUpdate) => void, lockedSlots: LockedTimetableSlot[]) => Promise<TauRpcResult<SolveSessionStart, InitSolverError>>, stop_solve_session: (sessionId: number) => Promise<TauRpcResult<null, SolveSessionControlError>>, },};export const createTauRPCProxy = () => createProxy<Router>({ argsMap: ARGS_MAP, resultMap: RESULT_MAP, errorHandling: "result",})
// export const createTauRPCProxy = () => createProxy<Router>(ARGS_MAP)export type { InferCommandOutput, TauRpcResult }