import type { ClassRef } from "./roster.js"; export type SkillCategory = "positive" | "needs_work"; export type SkillRule = { category: SkillCategory; name: string; points: number; iconId: number; }; export type SkillRuleInput = Omit & { iconId?: number; }; export declare const DEFAULT_SKILL_PRESET_ID = "traditional_chinese_classroom_v1"; export declare const DEFAULT_SKILL_PRESET: SkillRule[]; export declare function normalizeSkillRules(rules: SkillRuleInput[]): SkillRule[]; export type SkillDiff = { matches: boolean; added: SkillRule[]; updated: Array<{ before: SkillRule; after: SkillRule; }>; removed: SkillRule[]; }; export type SkillSource = { type: "preset"; presetId: string; } | { type: "class"; className: string; } | { type: "inline"; }; export type SkillSyncPreview = { source: SkillSource; desiredSkills: SkillRule[]; classes: Array; }; export interface SkillRulesAdapter { getSkills(classId: string): Promise; replaceSkills(classId: string, expectedSkills: SkillRule[], desiredSkills: SkillRule[]): Promise; } export declare class SkillConfirmationRequiredError extends Error { constructor(); } export declare function diffSkills(current: SkillRule[], desired: SkillRule[]): SkillDiff; export declare function createSkillSyncPreview(classes: ClassRef[], desiredSkills: SkillRule[], existingByClassId: Record, source: SkillSource): SkillSyncPreview; export type SkillSyncClassResult = (ClassRef & { status: "unchanged" | "updated"; verifiedSkills: SkillRule[]; }) | (ClassRef & { status: "failed"; error: string; actualSkills?: SkillRule[]; actualState?: "unknown"; }); export declare function applySkillSync(adapter: SkillRulesAdapter, preview: SkillSyncPreview, confirmed: boolean): Promise<{ status: "completed" | "failed"; classes: SkillSyncClassResult[]; verifiedClassNames: string[]; safelyRetryableClassNames: string[]; retryRequiresNewPreview: boolean; }>;