import { C as CourseId, L as LessonId, a as CheckId, B as BlockId, I as IdentityIdPath, b as IdentityValidationResult, c as LessonkitUrn, M as McqAssessmentProps, A as AssessmentResumeState, S as StoragePort, T as TelemetryEventName, d as TelemetrySink, e as TelemetryBatchSink, f as TrackingClient, g as TelemetryEvent, h as TelemetryUser, i as LessonkitPlugin, P as PluginRegistry, j as ProgressController, k as PluginHost, l as ProgressState, m as TelemetryDataFor, n as AssessmentScoreInput, o as AssessmentScoreResult, p as ClockPort, q as AssessmentPlugin, r as LifecyclePlugin, s as TelemetryPlugin, t as LessonkitPluginContext } from './testing-CQ-ZsT7D.cjs'; export { u as AccordionSectionToggledData, v as AssessmentAnsweredData, w as AssessmentBaseProps, x as AssessmentBehaviour, y as AssessmentCompletedData, z as AssessmentHandle, D as AssessmentInteractionType, E as AssessmentXAPIData, F as BookPageViewedData, G as BranchNodeViewedData, H as BranchSelectedData, J as BuildTelemetryEventInput, K as CompoundPageViewedData, N as CourseLifecycleContext, O as CourseLifecycleDeps, Q as FlashcardFlippedData, R as HotspotOpenedData, U as ID_MAX_LENGTH, V as ID_PATTERN, W as IdentityValidationIssue, X as ImageSliderChangedData, Y as InformationWallSearchData, Z as InteractionBlockRegistration, _ as InteractionData, $ as InteractionPlugin, a0 as InvalidSessionIdContext, a1 as LessonCompletionEmitter, a2 as LessonLifecycleData, a3 as LessonkitPluginKind, a4 as MemoryCardFlippedData, a5 as ParallaxSlideViewedData, a6 as PluginIdentity, a7 as QuestionnaireSubmittedData, a8 as QuizAnsweredData, a9 as QuizCompletedData, aa as ResolveSessionIdOptions, ab as SESSION_STORAGE_KEY, ac as SlideViewedData, ad as TelemetryEventBase, ae as TimerPort, af as VideoCueReachedData, ag as VideoSegmentCompletedData, ah as buildCourseStartedTelemetryEvent, ai as buildTelemetryEvent, aj as completeCourseWithTelemetry, ak as completeLessonWithTelemetry, al as createDefaultClock, am as createGlobalTimer, an as createNoopStorage, ao as createProgressController, ap as createSessionStoragePort, aq as getTabSessionId, ar as hasCourseStarted, as as hasCourseStartedEmittedToTracking, at as hasCourseStartedPipelineDelivered, au as hasCourseStartedXapiSent, av as markCourseStarted, aw as markCourseStartedEmittedToTracking, ax as markCourseStartedPipelineDelivered, ay as markCourseStartedXapiSent, az as migrateCourseStartedMark, aA as resetSharedVolatileSessionIdForTests, aB as resetStoragePortForTests, aC as resetTelemetryBuilderWarningsForTests, aD as resolveSessionId, aE as tryBuildTelemetryEvent, aF as tryEmitCourseStarted } from './testing-CQ-ZsT7D.cjs'; /** * Exhaustiveness helper for switch/default branches. * @throws when called at runtime with an unexpected value. */ declare function assertNever(value: never, message?: string): never; declare function validateId(input: unknown, path?: IdentityIdPath | string): IdentityValidationResult; declare function parseCourseId(input: unknown): CourseId | null; declare function parseLessonId(input: unknown): LessonId | null; declare function parseCheckId(input: unknown): CheckId | null; declare function parseBlockId(input: unknown): BlockId | null; declare function assertValidId(input: unknown, path: "courseId"): CourseId; declare function assertValidId(input: unknown, path: "lessonId"): LessonId; declare function assertValidId(input: unknown, path: "checkId"): CheckId; declare function assertValidId(input: unknown, path: "blockId"): BlockId; declare function assertValidId(input: unknown, path?: IdentityIdPath | string): string; /** Convert human-readable text to a candidate LessonKit id (may still need collision handling via deriveId). */ declare function slugifyId(input: string): string; /** Pick a unique id from a title, suffixing -2, -3, … on collision. */ declare function deriveId(title: string, usedIds?: ReadonlySet): string; type LessonkitUrnParts = { courseId: CourseId; lessonId?: LessonId; checkId?: CheckId; blockId?: BlockId; nodeId?: string; }; /** * Build a stable LessonKit URN for courses, lessons, checks, and blocks. * Segments are validated and encoded in path order. */ declare function buildLessonkitUrn(parts: LessonkitUrnParts): LessonkitUrn; type McqScoreResult = { score: number; maxScore: number; exactMatch: boolean; hasWrongSelection: boolean; passedThreshold: boolean; }; /** Correct answer labels for scoring (multi-select uses `answers` when length > 1). */ declare function resolveMcqCorrectAnswers(props: Pick): Set; declare function isMultiSelectMcq(props: Pick): boolean; declare function scoreMcqSelection(selected: string | string[] | null | undefined, correct: Set, multi: boolean, passingScore?: number): McqScoreResult; /** Deterministic Fisher–Yates shuffle; returns display order indices. */ declare function shuffleChoiceIndices(length: number, seed: string | number): number[]; declare function resolveMcqShuffleSeed(props: Pick): string | number; declare function orderChoicesByIndices(choices: string[], orderIndices: number[]): string[]; /** LMS parent-bridge forwarding mode for packaged course runtimes. */ type LmsBridgeMode = "auto" | "off"; declare const COMPOUND_RESUME_SCHEMA_VERSION: 1; /** Serializable resume blob for a compound container (InteractiveBook, AssessmentSequence, …). */ type CompoundResumeState = { schemaVersion: typeof COMPOUND_RESUME_SCHEMA_VERSION; activePageIndex: number; /** Optional chapter index when nested inside InteractiveBook. */ activeChapterIndex?: number; childStates: Record; }; type CompoundResumeInput = { activePageIndex?: number; activeChapterIndex?: number; childStates?: Record; }; declare function createCompoundResumeState(input?: CompoundResumeInput): CompoundResumeState; /** Clamp page index to valid range for a compound with `pageCount` pages. */ declare function clampCompoundPageIndex(index: number, pageCount: number): number; type ParseCompoundResumeStateOptions = { onDroppedChildKeys?: (keys: string[]) => void; /** When set, clamps `activePageIndex` to `[0, pageCount - 1]`. */ pageCount?: number; }; declare function parseCompoundResumeState(raw: unknown, opts?: ParseCompoundResumeStateOptions): CompoundResumeState | null; /** * Imperative handle for compound containers (H5P compound analogue). * Parents aggregate child AssessmentHandle scores and persist navigation state. */ type CompoundHandle = { getScore: () => number; getMaxScore: () => number; getAnswerGiven: () => boolean; resetTask: () => void; showSolutions: () => void; getCurrentState: () => CompoundResumeState; resume: (state: CompoundResumeState) => void; }; type CompoundBaseProps = { blockId: BlockId; }; declare function compoundStateStorageKey(courseId: CourseId, compoundId: BlockId): string; type LoadCompoundStateOptions = ParseCompoundResumeStateOptions & { onCorrupt?: () => void; }; declare function loadCompoundState(storage: StoragePort, courseId: CourseId, compoundId: BlockId, opts?: LoadCompoundStateOptions): CompoundResumeState | null; declare function saveCompoundState(storage: StoragePort, courseId: CourseId, compoundId: BlockId, state: CompoundResumeState): boolean; declare function clearCompoundState(storage: StoragePort, courseId: CourseId, compoundId: BlockId): void; /** Canonical compound child allowlists (H5P sub-content curation). */ /** Tier B P1 assessments shipped in framework 1.7.0. */ declare const ASSESSMENT_17_CHILD_TYPES: readonly ["SortParagraphs", "GuessTheAnswer", "MultimediaChoice"]; declare const PAGE_ALLOWED_CHILD_TYPES: readonly ["Text", "Heading", "Image", "Video", "Scenario", "Reflection", "Quiz", "KnowledgeCheck", "TrueFalse", "FillInTheBlanks", "DragAndDrop", "DragTheWords", "MarkTheWords", "Summary", "ImagePairing", "ImageSequencing", "MemoryGame", "InformationWall", "ParallaxSlideshow", "Questionnaire", "Essay", "ArithmeticQuiz", "Accordion", "DialogCards", "Flashcards", "ImageHotspots", "FindHotspot", "FindMultipleHotspots", "ImageSlider", "Embed", "Chart", "Table", "ImageJuxtaposition", "Timeline", "ImageSequence", "Collage", "AudioRecorder", "CombinationLock", "QrContent", "Crossword", "AdventCalendar", "ProgressTracker", "SortParagraphs", "GuessTheAnswer", "MultimediaChoice"]; /** Branch node content (Page-like minus ProgressTracker). */ declare const BRANCH_NODE_ALLOWED_CHILD_TYPES: readonly ["Text", "Heading", "Image", "Video", "Scenario", "Reflection", "Quiz", "KnowledgeCheck", "TrueFalse", "FillInTheBlanks", "DragAndDrop", "DragTheWords", "MarkTheWords", "Summary", "ImagePairing", "ImageSequencing", "MemoryGame", "InformationWall", "ParallaxSlideshow", "Questionnaire", "Essay", "ArithmeticQuiz", "Accordion", "DialogCards", "Flashcards", "ImageHotspots", "FindHotspot", "FindMultipleHotspots", "ImageSlider", "Embed", "Chart", "Table", "ImageJuxtaposition", "Timeline", "ImageSequence", "Collage", "AudioRecorder", "CombinationLock", "QrContent", "Crossword", "AdventCalendar", "BranchChoice", "SortParagraphs", "GuessTheAnswer", "MultimediaChoice"]; declare const BRANCHING_SCENARIO_ALLOWED_CHILD_TYPES: readonly ["BranchNode"]; declare const GAME_MAP_ALLOWED_CHILD_TYPES: readonly ["MapStage"]; /** Map stage content (BranchNode parity; WordSearch excluded from compounds). */ declare const MAP_STAGE_ALLOWED_CHILD_TYPES: readonly ["Text", "Heading", "Image", "Video", "Scenario", "Reflection", "Quiz", "KnowledgeCheck", "TrueFalse", "FillInTheBlanks", "DragAndDrop", "DragTheWords", "MarkTheWords", "Summary", "ImagePairing", "ImageSequencing", "MemoryGame", "InformationWall", "ParallaxSlideshow", "Questionnaire", "Essay", "ArithmeticQuiz", "Accordion", "DialogCards", "Flashcards", "ImageHotspots", "FindHotspot", "FindMultipleHotspots", "ImageSlider", "Embed", "Chart", "Table", "ImageJuxtaposition", "Timeline", "ImageSequence", "Collage", "AudioRecorder", "CombinationLock", "QrContent", "Crossword", "AdventCalendar", "MapExit", "SortParagraphs", "GuessTheAnswer", "MultimediaChoice"]; declare const INTERACTIVE_BOOK_ALLOWED_CHILD_TYPES: readonly ["Page"]; /** Per-slide content (H5P Course Presentation slide row). Excludes ProgressTracker. */ declare const SLIDE_ALLOWED_CHILD_TYPES: readonly ["Text", "Heading", "Image", "Video", "Scenario", "Reflection", "Quiz", "KnowledgeCheck", "TrueFalse", "FillInTheBlanks", "DragAndDrop", "DragTheWords", "MarkTheWords", "Summary", "ImagePairing", "ImageSequencing", "MemoryGame", "InformationWall", "ParallaxSlideshow", "Questionnaire", "Essay", "ArithmeticQuiz", "Accordion", "DialogCards", "Flashcards", "ImageHotspots", "FindHotspot", "FindMultipleHotspots", "ImageSlider", "Embed", "Chart", "Table", "ImageJuxtaposition", "Timeline", "ImageSequence", "Collage", "AudioRecorder", "CombinationLock", "QrContent", "Crossword", "AdventCalendar", "SortParagraphs", "GuessTheAnswer", "MultimediaChoice"]; declare const SLIDE_DECK_ALLOWED_CHILD_TYPES: readonly ["Slide"]; declare const TIMED_CUE_ALLOWED_CHILD_TYPES: readonly ["Text", "Heading", "Image", "Quiz", "TrueFalse", "FillInTheBlanks", "Summary", "ImagePairing", "ImageSequencing", "MemoryGame", "Questionnaire", "Essay", "ArithmeticQuiz", "MultimediaChoice", "GuessTheAnswer"]; declare const INTERACTIVE_VIDEO_ALLOWED_CHILD_TYPES: readonly ["TimedCue"]; declare const ASSESSMENT_SEQUENCE_ALLOWED_CHILD_TYPES: readonly ["TrueFalse", "FillInTheBlanks", "DragAndDrop", "DragTheWords", "MarkTheWords", "Quiz", "KnowledgeCheck", "FindHotspot", "FindMultipleHotspots", "Summary", "ImagePairing", "ImageSequencing", "ArithmeticQuiz", "Essay", "SortParagraphs", "GuessTheAnswer", "MultimediaChoice"]; declare const SINGLE_CHOICE_SET_ALLOWED_CHILD_TYPES: readonly ["Quiz", "KnowledgeCheck"]; type CompoundParentType = "Page" | "InteractiveBook" | "Slide" | "SlideDeck" | "TimedCue" | "InteractiveVideo" | "AssessmentSequence" | "BranchingScenario" | "BranchNode" | "GameMap" | "MapStage" | "SingleChoiceSet"; declare const COMPOUND_MAX_NESTING_DEPTH: Record; declare function getAllowedChildTypes(parent: CompoundParentType): readonly string[]; declare function isChildTypeAllowed(parent: CompoundParentType, childType: string): boolean; /** Blocks that must not nest inside Accordion (policy: no accordion-in-accordion). */ declare const ACCORDION_FORBIDDEN_CHILD_TYPES: readonly ["Accordion"]; /** New 1.4 blocks added to Page and Slide allowlists (for docs/tests). */ declare const BLOCKS_14_PAGE_SLIDE: readonly ["Video", "Summary", "ImagePairing", "ImageSequencing", "MemoryGame", "InformationWall", "ParallaxSlideshow", "Questionnaire", "Essay", "ArithmeticQuiz"]; type BranchGraphNodeInput = { nodeId: string; choices: readonly { targetNodeId: string; }[]; }; type BranchGraphValidationIssue = { code: "duplicate_node_id" | "start_not_found" | "start_no_choices" | "unknown_target" | "unreachable_node" | "empty_graph"; message: string; nodeId?: string; }; type BranchGraphValidationResult = { ok: boolean; issues: BranchGraphValidationIssue[]; reachableNodeIds: string[]; }; declare function validateBranchGraph(startNodeId: string, nodes: readonly BranchGraphNodeInput[]): BranchGraphValidationResult; declare const telemetryCatalogVersion: 1; type TelemetryCatalogEntry = { name: TelemetryEventName; description: string; requiredFields: string[]; dataFields: string[]; xapiVerb: string; urnPattern: string; }; declare const TELEMETRY_EVENT_CATALOG: TelemetryCatalogEntry[]; declare function buildTelemetryCatalog(): TelemetryCatalogEntry[]; declare const telemetryCatalogV2Version: 2; type TelemetryCatalogV2Entry = { name: Extract; description: string; requiredFields: string[]; dataFields: string[]; xapiVerb: string; urnPattern: string; }; declare const TELEMETRY_EVENT_CATALOG_V2: TelemetryCatalogV2Entry[]; declare function buildTelemetryCatalogV2(): TelemetryCatalogV2Entry[]; declare const telemetryCatalogV3Version: 3; type TelemetryCatalogV3EventName = Extract; type TelemetryCatalogV3Entry = { name: TelemetryCatalogV3EventName; description: string; requiredFields: string[]; dataFields: string[]; xapiVerb: string; urnPattern: string; }; declare const TELEMETRY_EVENT_CATALOG_V3: TelemetryCatalogV3Entry[]; declare function buildTelemetryCatalogV3(): TelemetryCatalogV3Entry[]; /** * Creates a client that buffers telemetry and flushes in batches. * * **Delivery semantics:** batch mode is at-least-once. A failed flush re-queues the batch for * retry; `flushOnExit` and periodic flushes may deliver the same events more than once unless * the sink deduplicates. Events currently owned by an in-flight `batchSink` call are not included * in `flushOnExit` to avoid duplicate delivery on page unload. * * @example * ```ts * import { createTrackingClient } from "@lessonkit/core"; * * const tracking = createTrackingClient({ * sink: (event) => console.log(event.name, event), * batch: { enabled: true, flushIntervalMs: 5000 }, * }); * tracking.track({ name: "course_started", courseId: "c1", sessionId: "s1" }); * ``` */ declare function createTrackingClient(opts?: { sink?: TelemetrySink; batch?: { enabled?: boolean; flushIntervalMs?: number; maxBatchSize?: number; }; batchSink?: TelemetryBatchSink; /** Called when an event is dropped because the batch buffer is at cap (including in production). */ onBufferDrop?: () => void; /** Keepalive batch delivery for pagehide (e.g. from createFetchBatchSink). */ exitBatchSink?: TelemetryBatchSink; }): TrackingClient; declare function createSessionId(): string; declare function nowIso(): string; type EmitContext = { courseId: CourseId; sessionId?: string; attemptId?: string; }; /** Pluggable telemetry output (OCP). Distinct from the legacy `TelemetrySink` function type. */ type TelemetryPipelineSink = { readonly id: string; emit(event: TelemetryEvent, ctx: EmitContext): void | Promise; }; type TelemetryPipeline = { readonly sinks: readonly TelemetryPipelineSink[]; emit(event: TelemetryEvent, ctx?: EmitContext): void | Promise; }; declare function isLifecycleTelemetryEvent(name: TelemetryEventName): boolean; /** * Compose multiple telemetry sinks behind a single `emit` call. * * @example * ```ts * import { createTelemetryPipeline, createTrackingPipelineSink } from "@lessonkit/core"; * * const pipeline = createTelemetryPipeline([ * createTrackingPipelineSink("console", (e) => console.log(e.name)), * ]); * await pipeline.emit(event, { courseId: "c1", sessionId: "s1" }); * ``` */ declare function createTelemetryPipeline(sinks: TelemetryPipelineSink[]): TelemetryPipeline; declare function createTrackingPipelineSink(id: string, track: (event: TelemetryEvent) => void): TelemetryPipelineSink; type LessonkitRuntimeVersion = "v1" | "v2"; type HeadlessLessonkitPlugins = readonly LessonkitPlugin[] | PluginRegistry | null | undefined; type HeadlessLessonkitConfig = { courseId: CourseId; runtimeVersion?: LessonkitRuntimeVersion; session?: { sessionId?: string; attemptId?: string; user?: TelemetryUser; }; /** When true (default), switching lessons auto-completes the previous in-progress lesson. */ autoCompleteOnLessonSwitch?: boolean; /** Plugin list or registry; hooks run on {@link HeadlessLessonkitRuntime.track} and lifecycle emits. */ plugins?: HeadlessLessonkitPlugins; /** When true, skip initial {@link PluginHost.setupAll}; host caller runs setup (React v2 provider). */ deferPluginSetup?: boolean; }; type HeadlessRuntimePorts = { storage?: StoragePort; clock?: ClockPort; }; /** Delivers a fully-built lifecycle telemetry event (plugins already applied). */ type TelemetryEmitFn = (event: TelemetryEvent) => void; type HeadlessLessonkitRuntime = { readonly config: HeadlessLessonkitConfig; readonly progress: ProgressController; readonly pluginHost: PluginHost | null; getProgressState: () => ProgressState; getSession: () => { sessionId: string; attemptId?: string; user?: TelemetryUser; }; updateConfig: (next: Partial) => void; /** Move course-started dedupe marks between session ids (e.g. LMS anonymous → authenticated handoff). */ migrateSessionMarks: (fromSessionId: string, toSessionId: string) => void; setActiveLesson: (lessonId: LessonId, emit: TelemetryEmitFn) => void; completeLesson: (lessonId: LessonId, emit: TelemetryEmitFn) => void; completeCourse: (emit: TelemetryEmitFn) => void; track: (name: N, data: TelemetryDataFor | undefined, emit: (event: TelemetryEvent) => void, lessonId?: LessonId) => void; scoreAssessment: (input: AssessmentScoreInput, lessonId?: LessonId) => AssessmentScoreResult | null; resetForCourseChange: (courseId: CourseId) => void; dispose: () => void; }; /** * Create a headless LessonKit runtime for non-React tooling and tests. * Powers `LessonkitProvider` from `@lessonkit/react` when `runtimeVersion` is `"v2"` (default). * * @example * ```ts * import { createLessonkitRuntime } from "@lessonkit/core"; * * const runtime = createLessonkitRuntime({ courseId: "demo-course" }); * runtime.setActiveLesson("lesson-1"); * runtime.track("interaction", { label: "opened" }, { lessonId: "lesson-1" }); * ``` * * @throws When plugin registry setup fails or tracking batch config is invalid (same rules as React provider). */ declare function createLessonkitRuntime(config: HeadlessLessonkitConfig, ports?: HeadlessRuntimePorts): HeadlessLessonkitRuntime; /** * Register framework plugins (telemetry, assessment scoring, lifecycle hooks). * * @example * ```ts * import { createPluginRegistry, defineTelemetryPlugin } from "@lessonkit/core"; * * const plugins = createPluginRegistry([ * defineTelemetryPlugin({ id: "analytics-bridge", setup: () => {} }), * ]); * ``` */ declare function createPluginRegistry(plugins?: readonly LessonkitPlugin[]): PluginRegistry; /** * Identity helper for telemetry plugins; does not validate or register at import time. * * @example * ```ts * import { defineTelemetryPlugin } from "@lessonkit/core"; * * const analytics = defineTelemetryPlugin({ * id: "console-analytics", * kind: "telemetry", * onEvent(event) { * console.log(event.name); * }, * }); * ``` */ declare function defineTelemetryPlugin(plugin: TelemetryPlugin): LessonkitPlugin; /** * Identity helper for assessment plugins; does not validate or register at import time. * * @example * ```ts * import { defineAssessmentPlugin } from "@lessonkit/core"; * * const grader = defineAssessmentPlugin({ * id: "essay-grader", * kind: "assessment", * score(input) { * return { score: input.rawScore ?? 0, maxScore: 1, passed: true }; * }, * }); * ``` */ declare function defineAssessmentPlugin(plugin: AssessmentPlugin): LessonkitPlugin; /** * Identity helper for lifecycle plugins; does not validate or register at import time. * * @example * ```ts * import { defineLifecyclePlugin } from "@lessonkit/core"; * * const onComplete = defineLifecyclePlugin({ * id: "completion-hook", * kind: "lifecycle", * onCourseCompleted() { * window.parent.postMessage({ type: "course-done" }, "*"); * }, * }); * ``` */ declare function defineLifecyclePlugin(plugin: LifecyclePlugin): LessonkitPlugin; declare function buildPluginContext(opts: { courseId: CourseId; sessionId?: string; attemptId?: string; user?: TelemetryUser; }): LessonkitPluginContext; export { ACCORDION_FORBIDDEN_CHILD_TYPES, ASSESSMENT_17_CHILD_TYPES, ASSESSMENT_SEQUENCE_ALLOWED_CHILD_TYPES, AssessmentPlugin, AssessmentResumeState, AssessmentScoreInput, AssessmentScoreResult, BLOCKS_14_PAGE_SLIDE, BRANCHING_SCENARIO_ALLOWED_CHILD_TYPES, BRANCH_NODE_ALLOWED_CHILD_TYPES, BlockId, type BranchGraphNodeInput, type BranchGraphValidationIssue, type BranchGraphValidationResult, COMPOUND_MAX_NESTING_DEPTH, COMPOUND_RESUME_SCHEMA_VERSION, CheckId, ClockPort, type CompoundBaseProps, type CompoundHandle, type CompoundParentType, type CompoundResumeInput, type CompoundResumeState, CourseId, type EmitContext, GAME_MAP_ALLOWED_CHILD_TYPES, type HeadlessLessonkitConfig, type HeadlessLessonkitRuntime, type HeadlessRuntimePorts, INTERACTIVE_BOOK_ALLOWED_CHILD_TYPES, INTERACTIVE_VIDEO_ALLOWED_CHILD_TYPES, IdentityIdPath, IdentityValidationResult, LessonId, LessonkitPlugin, LessonkitPluginContext, type LessonkitRuntimeVersion, LessonkitUrn, type LessonkitUrnParts, LifecyclePlugin, type LmsBridgeMode, type LoadCompoundStateOptions, MAP_STAGE_ALLOWED_CHILD_TYPES, McqAssessmentProps, type McqScoreResult, PAGE_ALLOWED_CHILD_TYPES, type ParseCompoundResumeStateOptions, PluginHost, PluginRegistry, ProgressController, ProgressState, SINGLE_CHOICE_SET_ALLOWED_CHILD_TYPES, SLIDE_ALLOWED_CHILD_TYPES, SLIDE_DECK_ALLOWED_CHILD_TYPES, StoragePort, TELEMETRY_EVENT_CATALOG, TELEMETRY_EVENT_CATALOG_V2, TELEMETRY_EVENT_CATALOG_V3, TIMED_CUE_ALLOWED_CHILD_TYPES, TelemetryBatchSink, type TelemetryCatalogEntry, type TelemetryCatalogV2Entry, type TelemetryCatalogV3Entry, TelemetryDataFor, type TelemetryEmitFn, TelemetryEvent, TelemetryEventName, type TelemetryPipeline, type TelemetryPipelineSink, TelemetryPlugin, TelemetrySink, TelemetryUser, TrackingClient, assertNever, assertValidId, buildLessonkitUrn, buildPluginContext, buildTelemetryCatalog, buildTelemetryCatalogV2, buildTelemetryCatalogV3, clampCompoundPageIndex, clearCompoundState, compoundStateStorageKey, createCompoundResumeState, createLessonkitRuntime, createPluginRegistry, createSessionId, createTelemetryPipeline, createTrackingClient, createTrackingPipelineSink, defineAssessmentPlugin, defineLifecyclePlugin, defineTelemetryPlugin, deriveId, getAllowedChildTypes, isChildTypeAllowed, isLifecycleTelemetryEvent, isMultiSelectMcq, loadCompoundState, nowIso, orderChoicesByIndices, parseBlockId, parseCheckId, parseCompoundResumeState, parseCourseId, parseLessonId, resolveMcqCorrectAnswers, resolveMcqShuffleSeed, saveCompoundState, scoreMcqSelection, shuffleChoiceIndices, slugifyId, telemetryCatalogV2Version, telemetryCatalogV3Version, telemetryCatalogVersion, validateBranchGraph, validateId };