/** * Timeback Config Schemas * * Zod schemas for timeback.config.json validation. * * Source of truth: * - These Zod schemas are the canonical runtime contract for `timeback.config.json`. * - TypeScript types in other packages should mirror these constraints, but should * not be treated as a substitute for runtime validation at the config boundary. * - JSON Schema is generated from these schemas via `bun run generate:schema`. */ import { z } from 'zod/v4'; export declare const CourseIds: z.ZodObject<{ staging: z.ZodOptional; production: z.ZodOptional; }, z.core.$strip>; export declare const CourseType: z.ZodEnum<{ base: "base"; "hole-filling": "hole-filling"; optional: "optional"; }>; export declare const PublishStatus: z.ZodEnum<{ deactivated: "deactivated"; draft: "draft"; published: "published"; testing: "testing"; }>; export declare const CourseGoals: z.ZodObject<{ dailyXp: z.ZodOptional; dailyLessons: z.ZodOptional; dailyActiveMinutes: z.ZodOptional; dailyAccuracy: z.ZodOptional; dailyMasteredUnits: z.ZodOptional; }, z.core.$strip>; export declare const CourseMetrics: z.ZodObject<{ totalXp: z.ZodOptional; totalLessons: z.ZodOptional; totalGrades: z.ZodOptional; }, z.core.$strip>; export declare const CourseMetadata: z.ZodObject<{ courseType: z.ZodOptional>; isSupplemental: z.ZodOptional; isCustom: z.ZodOptional; publishStatus: z.ZodOptional>; contactEmail: z.ZodOptional; primaryApp: z.ZodOptional; goals: z.ZodOptional; dailyLessons: z.ZodOptional; dailyActiveMinutes: z.ZodOptional; dailyAccuracy: z.ZodOptional; dailyMasteredUnits: z.ZodOptional; }, z.core.$strip>>; metrics: z.ZodOptional; totalLessons: z.ZodOptional; totalGrades: z.ZodOptional; }, z.core.$strip>>; }, z.core.$strip>; export declare const CourseDefaults: z.ZodObject<{ courseCode: z.ZodOptional; level: z.ZodOptional; metadata: z.ZodOptional>; isSupplemental: z.ZodOptional; isCustom: z.ZodOptional; publishStatus: z.ZodOptional>; contactEmail: z.ZodOptional; primaryApp: z.ZodOptional; goals: z.ZodOptional; dailyLessons: z.ZodOptional; dailyActiveMinutes: z.ZodOptional; dailyAccuracy: z.ZodOptional; dailyMasteredUnits: z.ZodOptional; }, z.core.$strip>>; metrics: z.ZodOptional; totalLessons: z.ZodOptional; totalGrades: z.ZodOptional; }, z.core.$strip>>; }, z.core.$strip>>; }, z.core.$strip>; /** * Environment-specific course overrides schema. * * Non-identity fields that can differ per environment. * Excludes identity fields (subject, grade, courseCode) and ids (already env-scoped). */ export declare const CourseEnvOverrides: z.ZodObject<{ level: z.ZodOptional; sensor: z.ZodOptional; launchUrl: z.ZodOptional; metadata: z.ZodOptional>; isSupplemental: z.ZodOptional; isCustom: z.ZodOptional; publishStatus: z.ZodOptional>; contactEmail: z.ZodOptional; primaryApp: z.ZodOptional; goals: z.ZodOptional; dailyLessons: z.ZodOptional; dailyActiveMinutes: z.ZodOptional; dailyAccuracy: z.ZodOptional; dailyMasteredUnits: z.ZodOptional; }, z.core.$strip>>; metrics: z.ZodOptional; totalLessons: z.ZodOptional; totalGrades: z.ZodOptional; }, z.core.$strip>>; }, z.core.$strip>>; }, z.core.$strip>; /** * Per-environment course overrides schema. */ export declare const CourseOverrides: z.ZodObject<{ staging: z.ZodOptional; sensor: z.ZodOptional; launchUrl: z.ZodOptional; metadata: z.ZodOptional>; isSupplemental: z.ZodOptional; isCustom: z.ZodOptional; publishStatus: z.ZodOptional>; contactEmail: z.ZodOptional; primaryApp: z.ZodOptional; goals: z.ZodOptional; dailyLessons: z.ZodOptional; dailyActiveMinutes: z.ZodOptional; dailyAccuracy: z.ZodOptional; dailyMasteredUnits: z.ZodOptional; }, z.core.$strip>>; metrics: z.ZodOptional; totalLessons: z.ZodOptional; totalGrades: z.ZodOptional; }, z.core.$strip>>; }, z.core.$strip>>; }, z.core.$strip>>; production: z.ZodOptional; sensor: z.ZodOptional; launchUrl: z.ZodOptional; metadata: z.ZodOptional>; isSupplemental: z.ZodOptional; isCustom: z.ZodOptional; publishStatus: z.ZodOptional>; contactEmail: z.ZodOptional; primaryApp: z.ZodOptional; goals: z.ZodOptional; dailyLessons: z.ZodOptional; dailyActiveMinutes: z.ZodOptional; dailyAccuracy: z.ZodOptional; dailyMasteredUnits: z.ZodOptional; }, z.core.$strip>>; metrics: z.ZodOptional; totalLessons: z.ZodOptional; totalGrades: z.ZodOptional; }, z.core.$strip>>; }, z.core.$strip>>; }, z.core.$strip>>; }, z.core.$strip>; /** * Single course config schema. * * Identity rules (enforced at TimebackConfig level): * - If `grade` is provided, identity is `(subject, grade)`. * - If `grade` is omitted, `courseCode` is required as identity. * * Sensor resolution (enforced at TimebackConfig level): * - Default sensor is derived from the origin of the effective launchUrl. * - Override precedence: env override sensor > course.sensor > config.sensor > derived from launchUrl. * - If no sensor is set and no launchUrl is derivable, validation fails. * * Overrides: * - Use `overrides.staging` or `overrides.production` to vary non-identity fields per env. */ export declare const CourseConfig: z.ZodObject<{ courseCode: z.ZodOptional; level: z.ZodOptional; metadata: z.ZodOptional>; isSupplemental: z.ZodOptional; isCustom: z.ZodOptional; publishStatus: z.ZodOptional>; contactEmail: z.ZodOptional; primaryApp: z.ZodOptional; goals: z.ZodOptional; dailyLessons: z.ZodOptional; dailyActiveMinutes: z.ZodOptional; dailyAccuracy: z.ZodOptional; dailyMasteredUnits: z.ZodOptional; }, z.core.$strip>>; metrics: z.ZodOptional; totalLessons: z.ZodOptional; totalGrades: z.ZodOptional; }, z.core.$strip>>; }, z.core.$strip>>; subject: z.ZodEnum<{ FastMath: "FastMath"; Language: "Language"; Math: "Math"; None: "None"; Other: "Other"; Reading: "Reading"; Science: "Science"; "Social Studies": "Social Studies"; Vocabulary: "Vocabulary"; Writing: "Writing"; }>; grade: z.ZodOptional>]>, z.ZodUnion, z.ZodLiteral<0>, z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>, z.ZodLiteral<5>, z.ZodLiteral<6>, z.ZodLiteral<7>, z.ZodLiteral<8>, z.ZodLiteral<9>, z.ZodLiteral<10>, z.ZodLiteral<11>, z.ZodLiteral<12>, z.ZodLiteral<13>]>>>; ids: z.ZodOptional; production: z.ZodOptional; }, z.core.$strip>>>; sensor: z.ZodOptional; launchUrl: z.ZodOptional; overrides: z.ZodOptional; sensor: z.ZodOptional; launchUrl: z.ZodOptional; metadata: z.ZodOptional>; isSupplemental: z.ZodOptional; isCustom: z.ZodOptional; publishStatus: z.ZodOptional>; contactEmail: z.ZodOptional; primaryApp: z.ZodOptional; goals: z.ZodOptional; dailyLessons: z.ZodOptional; dailyActiveMinutes: z.ZodOptional; dailyAccuracy: z.ZodOptional; dailyMasteredUnits: z.ZodOptional; }, z.core.$strip>>; metrics: z.ZodOptional; totalLessons: z.ZodOptional; totalGrades: z.ZodOptional; }, z.core.$strip>>; }, z.core.$strip>>; }, z.core.$strip>>; production: z.ZodOptional; sensor: z.ZodOptional; launchUrl: z.ZodOptional; metadata: z.ZodOptional>; isSupplemental: z.ZodOptional; isCustom: z.ZodOptional; publishStatus: z.ZodOptional>; contactEmail: z.ZodOptional; primaryApp: z.ZodOptional; goals: z.ZodOptional; dailyLessons: z.ZodOptional; dailyActiveMinutes: z.ZodOptional; dailyAccuracy: z.ZodOptional; dailyMasteredUnits: z.ZodOptional; }, z.core.$strip>>; metrics: z.ZodOptional; totalLessons: z.ZodOptional; totalGrades: z.ZodOptional; }, z.core.$strip>>; }, z.core.$strip>>; }, z.core.$strip>>; }, z.core.$strip>>; }, z.core.$strip>; /** * Timeback app config schema with course identity and sensor validation. * * Enforces: * 1. Each course must have either `grade` or `courseCode` (or both). * 2. All `(subject, grade)` pairs are unique among courses with grade. * 3. All `courseCode` values are unique among courses with courseCode. * 4. Each course must have an effective sensor, either: * - Explicitly set (`course.sensor` or `config.sensor`), or * - Derivable from a launchUrl (`course.launchUrl`, `config.launchUrl`, or env overrides). */ export declare const TimebackConfig: z.ZodObject<{ $schema: z.ZodOptional; name: z.ZodString; defaults: z.ZodOptional; level: z.ZodOptional; metadata: z.ZodOptional>; isSupplemental: z.ZodOptional; isCustom: z.ZodOptional; publishStatus: z.ZodOptional>; contactEmail: z.ZodOptional; primaryApp: z.ZodOptional; goals: z.ZodOptional; dailyLessons: z.ZodOptional; dailyActiveMinutes: z.ZodOptional; dailyAccuracy: z.ZodOptional; dailyMasteredUnits: z.ZodOptional; }, z.core.$strip>>; metrics: z.ZodOptional; totalLessons: z.ZodOptional; totalGrades: z.ZodOptional; }, z.core.$strip>>; }, z.core.$strip>>; }, z.core.$strip>>; courses: z.ZodArray; level: z.ZodOptional; metadata: z.ZodOptional>; isSupplemental: z.ZodOptional; isCustom: z.ZodOptional; publishStatus: z.ZodOptional>; contactEmail: z.ZodOptional; primaryApp: z.ZodOptional; goals: z.ZodOptional; dailyLessons: z.ZodOptional; dailyActiveMinutes: z.ZodOptional; dailyAccuracy: z.ZodOptional; dailyMasteredUnits: z.ZodOptional; }, z.core.$strip>>; metrics: z.ZodOptional; totalLessons: z.ZodOptional; totalGrades: z.ZodOptional; }, z.core.$strip>>; }, z.core.$strip>>; subject: z.ZodEnum<{ FastMath: "FastMath"; Language: "Language"; Math: "Math"; None: "None"; Other: "Other"; Reading: "Reading"; Science: "Science"; "Social Studies": "Social Studies"; Vocabulary: "Vocabulary"; Writing: "Writing"; }>; grade: z.ZodOptional>]>, z.ZodUnion, z.ZodLiteral<0>, z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>, z.ZodLiteral<5>, z.ZodLiteral<6>, z.ZodLiteral<7>, z.ZodLiteral<8>, z.ZodLiteral<9>, z.ZodLiteral<10>, z.ZodLiteral<11>, z.ZodLiteral<12>, z.ZodLiteral<13>]>>>; ids: z.ZodOptional; production: z.ZodOptional; }, z.core.$strip>>>; sensor: z.ZodOptional; launchUrl: z.ZodOptional; overrides: z.ZodOptional; sensor: z.ZodOptional; launchUrl: z.ZodOptional; metadata: z.ZodOptional>; isSupplemental: z.ZodOptional; isCustom: z.ZodOptional; publishStatus: z.ZodOptional>; contactEmail: z.ZodOptional; primaryApp: z.ZodOptional; goals: z.ZodOptional; dailyLessons: z.ZodOptional; dailyActiveMinutes: z.ZodOptional; dailyAccuracy: z.ZodOptional; dailyMasteredUnits: z.ZodOptional; }, z.core.$strip>>; metrics: z.ZodOptional; totalLessons: z.ZodOptional; totalGrades: z.ZodOptional; }, z.core.$strip>>; }, z.core.$strip>>; }, z.core.$strip>>; production: z.ZodOptional; sensor: z.ZodOptional; launchUrl: z.ZodOptional; metadata: z.ZodOptional>; isSupplemental: z.ZodOptional; isCustom: z.ZodOptional; publishStatus: z.ZodOptional>; contactEmail: z.ZodOptional; primaryApp: z.ZodOptional; goals: z.ZodOptional; dailyLessons: z.ZodOptional; dailyActiveMinutes: z.ZodOptional; dailyAccuracy: z.ZodOptional; dailyMasteredUnits: z.ZodOptional; }, z.core.$strip>>; metrics: z.ZodOptional; totalLessons: z.ZodOptional; totalGrades: z.ZodOptional; }, z.core.$strip>>; }, z.core.$strip>>; }, z.core.$strip>>; }, z.core.$strip>>; }, z.core.$strip>>; sensor: z.ZodOptional; launchUrl: z.ZodOptional; studio: z.ZodOptional>; }, z.core.$strip>>; }, z.core.$strip>; //# sourceMappingURL=config.d.ts.map