feat(pitch-deck): add AI Presenter mode with LiteLLM migration and FAQ system
All checks were successful
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-consent (push) Successful in 27s
CI / test-python-voice (push) Successful in 25s
CI / test-bqas (push) Successful in 25s
CI / Deploy (push) Successful in 4s

- Migrate chat API from Ollama to LiteLLM (OpenAI-compatible SSE)
- Add 15-min presenter storyline with bilingual scripts for all 20 slides
- Add FAQ system (30 entries) with keyword matching for instant answers
- Add IntroPresenterSlide with avatar placeholder and start button
- Add PresenterOverlay (progress bar, subtitle text, play/pause/stop)
- Add AvatarPlaceholder with pulse animation during speaking
- Add usePresenterMode hook (state machine: idle→presenting→paused→answering→resuming)
- Add 'P' keyboard shortcut to toggle presenter mode
- Support [GOTO:slide-id] markers in chat responses
- Dynamic slide count (was hardcoded 13, now from SLIDE_ORDER)
- TTS stub prepared for future Piper integration

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-03-20 11:45:55 +01:00
parent df0a9d6cf0
commit 3a2567b44d
20 changed files with 2434 additions and 164 deletions

View File

@@ -11,6 +11,7 @@ interface UseKeyboardProps {
onFullscreen: () => void
onLanguageToggle: () => void
onMenuToggle: () => void
onPresenterToggle?: () => void
onGoToSlide: (index: number) => void
enabled?: boolean
}
@@ -24,6 +25,7 @@ export function useKeyboard({
onFullscreen,
onLanguageToggle,
onMenuToggle,
onPresenterToggle,
onGoToSlide,
enabled = true,
}: UseKeyboardProps) {
@@ -74,6 +76,11 @@ export function useKeyboard({
e.preventDefault()
onMenuToggle()
break
case 'p':
case 'P':
e.preventDefault()
onPresenterToggle?.()
break
case '1':
case '2':
case '3':
@@ -88,7 +95,7 @@ export function useKeyboard({
break
}
},
[enabled, onNext, onPrev, onFirst, onLast, onOverview, onFullscreen, onLanguageToggle, onMenuToggle, onGoToSlide]
[enabled, onNext, onPrev, onFirst, onLast, onOverview, onFullscreen, onLanguageToggle, onMenuToggle, onPresenterToggle, onGoToSlide]
)
useEffect(() => {