File size: 1,954 Bytes
f56a29b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | /**
* Playback Types - Types for lecture playback and live discussion engine
*/
import type { PlaybackSnapshot } from '@/lib/utils/playback-storage';
export type { PlaybackSnapshot };
/** Visual effects (for onEffectFire callback) */
export type Effect =
| { kind: 'spotlight'; targetId: string; dimOpacity?: number }
| { kind: 'laser'; targetId: string; color?: string };
/** Engine mode state machine */
export type EngineMode = 'idle' | 'playing' | 'paused' | 'live';
/** Discussion topic state */
export type TopicState = 'active' | 'pending' | 'closed';
/** Trigger event (for proactive discussion card) */
export interface TriggerEvent {
id: string;
question: string;
prompt?: string;
agentId?: string;
}
/** Playback engine callbacks */
export interface PlaybackEngineCallbacks {
onModeChange?: (mode: EngineMode) => void;
onSceneChange?: (sceneId: string) => void;
onSpeechStart?: (text: string) => void;
onSpeechEnd?: () => void;
onTextDelta?: (content: string) => void;
onSpeakerChange?: (role: string) => void;
onEffectFire?: (effect: Effect) => void;
// Proactive discussion
onProactiveShow?: (trigger: TriggerEvent) => void;
onProactiveHide?: () => void;
// Discussion lifecycle
onDiscussionConfirmed?: (topic: string, prompt?: string, agentId?: string) => void;
onDiscussionEnd?: () => void;
onUserInterrupt?: (text: string) => void;
// Topic / Transcript
onTopicStart?: (type: 'lecture' | 'discussion', title: string) => void;
onTopicAppend?: (role: string, text: string) => void;
onTopicEnd?: () => void;
// Progress tracking (for persistence)
onProgress?: (snapshot: PlaybackSnapshot) => void;
/** Check if a given agent is in the user's selected list (for skipping discussion actions) */
isAgentSelected?: (agentId: string) => boolean;
/** Get current playback speed multiplier (e.g. 1, 1.5, 2) */
getPlaybackSpeed?: () => number;
onComplete?: () => void;
}
|