learn-content-engine - v0.13.1
    Preparing search index...

    Interface Exercise

    One exercise step. Type-tagged via type.

    The fields are kept in a single flat shape per type rather than per-type discriminated unions because the JSON manifests are author-edited; flat shapes are easier to read and to diff in PRs. The validator enforces type-specific requirements via model_validator instead.

    interface Exercise {
        accept?: Accept;
        accept_orderings?: AcceptOrderings;
        blanks?: Blanks;
        card_ids?: CardIds;
        cloze_mode?: ClozeMode;
        direction?: Direction;
        distractors?: Distractors;
        examples?: Examples1;
        ext_payload?: { [k: string]: unknown };
        from_cards?: boolean;
        hint?: Hint2;
        id: string;
        images?: Images;
        multiple?: boolean;
        options?: Options;
        pairs?: Pairs;
        prompt: string;
        sentence?: Sentence;
        tiles?: Tiles;
        type: string;
    }
    Index
    accept?: Accept
    accept_orderings?: AcceptOrderings
    blanks?: Blanks
    card_ids?: CardIds
    cloze_mode?: ClozeMode
    direction?: Direction
    distractors?: Distractors
    examples?: Examples1
    ext_payload?: { [k: string]: unknown }

    Opaque per-exercise payload for an ext: extension type. The core engine does not interpret it; the registered extension validator does. Absent on core exercises.

    from_cards?: boolean
    hint?: Hint2
    id: string
    images?: Images
    multiple?: boolean
    options?: Options
    pairs?: Pairs
    prompt: string
    sentence?: Sentence
    tiles?: Tiles
    type: string

    Which exercise renderer handles this step. A core ExerciseType value, or an ext:<vendor>-<name> extension type (ExtExerciseType) that the lesson declares in requires_extensions.