* feat: inline language inference in outline generation
Replace manual language selection with automatic inference from user
requirement text. The outline generator now produces a languageDirective
that propagates through the entire generation pipeline.
Key changes:
- Rewrite Language Inference section in outline prompt with decision
rules for foreign language learning, cross-language PDF, proxy
requests, and terminology handling
- Reorder pipeline: outlines before agents, so agent profiles can
use the inferred languageDirective
- Pass languageDirective through scene content/actions generation
- Add SSE streaming of languageDirective from outline generation
- Remove manual language selection UI
Eval test suite:
- 50 test cases covering 9 scenario types: single-language, language
learning, immersive, explicit instruction, code-switching, minimal
input, user profiles, cross-language PDF, locale mismatch
- LLM-as-judge evaluation with configurable inference/judge models
- 50/50 pass rate with gemini-3-flash-preview + gpt-4o judge
- Excluded from CI (requires LLM API keys)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* chore: remove useless attributes in test case
* feat: pass languageDirective to PBL, remove hardcoded zh-CN/en-US
- Remove pblConfig.language field, use languageDirective from outline
inference instead
- Delete all Chinese prompt duplicates in pbl-system-prompt.ts,
agent-templates.ts; keep English templates with languageDirective
injection
- Remove zh-CN/en-US branches in generate-pbl.ts (initial prompt,
post-process context, welcome message)
- Pipe languageDirective through scene-generator → generatePBLContent
→ IssueboardMCP → agent templates
- Remove i18n template wrapping from PBL welcome messages in
pbl-renderer.tsx and use-pbl-chat.ts; use LLM-generated content
directly to avoid language mismatch when UI locale ≠ course language
- Update pblConfig schema in outline prompt (remove language field)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* refactor: clean up legacy language fields, pass languageDirective through buildSceneFromOutline
- Add languageDirective param to buildSceneFromOutline, combining with
outline.languageNote via buildLanguageText
- Remove dead types: AudienceProfile, StylePreferences, LegacyUserRequirements,
SceneOutline.language
- Remove Stage.language and all its propagation (storage, stageInfo, prompt-builder fallback)
- Remove GenerateClassroomInput.language and job store inputSummary.language
- Remove unused pdfLanguageSample from outline SSE route
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: persist languageDirective to IndexedDB, fix TTS preview and dead refs
- Add languageDirective to StageRecord and stage-storage write path
- Add DB v9 migration: convert legacy language locale codes to directives
- Use voice.language for TTS preview text instead of dead localStorage key
- Omit empty ## Language section in PBL agent prompts
- Use JSON.parse for extractLanguageDirective unescape (\uXXXX support)
- Remove dead i18n keys: toolbar.languageHint, pbl.chat.welcomeMessage
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>