feat(ai-assistant): odt support, document-to-lesson attach, upload UX fixes

- Add .odt (application/vnd.oasis.opendocument.text) as a supported upload
  format; extract text via JSZip + content.xml parsing
- Add attach_document_to_lesson agent tool so the AI can attach an uploaded
  document to a lesson as a downloadable material
- Instruct the agent to create a "Course Materials" lesson (first lesson of
  the first section) and attach the uploaded document to it on implementation
- Suppress hallucinated references: uploaded documents do not count as fetched
  URLs — omit the References section when no fetch_documentation_url calls
  were made
- Surface specific upload error snackbars (file_too_large, unsupported_file_type)
  instead of silently logging; fix generic fallback message
- Allow typing in the chat textarea while a document is uploading; only block
  Enter/send, not the whole input
- Fix retry endpoint to return the current run instead of erroring when the run
  is already active (queued/running/waiting_for_input/paused)
- Connect @cio/core Redis singleton in the jobs bootstrap so course-generation
  workers no longer fail with "The client is closed"
- Expose documentAssets (assetId + fileName) alongside documentText in
  AgentContext and pass it through both the chat route and course runner
This commit is contained in:
Rotimi Best
2026-06-29 12:29:47 +01:00
parent 773fc873c2
commit 65420320e7
24 changed files with 235 additions and 27 deletions
@@ -4316,7 +4316,10 @@
"ask_ai": "Fragen Sie die KI",
"content_input_placeholder": "Fragen Sie nach diesem Inhalt…",
"ask_ai_expand_aria": "Öffnen Sie „Ask AI Input“.",
"ask_ai_input_aria": "Fragen Sie AI nach diesem Inhalt"
"ask_ai_input_aria": "Fragen Sie AI nach diesem Inhalt",
"upload_error_file_too_large": "Die Datei ist zu groß. Die maximale Größe beträgt 5 MB.",
"upload_error_unsupported_type": "Dateityp wird nicht unterstützt. Bitte laden Sie eine PDF-, DOCX-, PPTX- oder ODT-Datei hoch.",
"upload_error_generic": "Das Hochladen des Dokuments ist fehlgeschlagen. Bitte versuchen Sie es erneut."
},
"widgets": {
"heading": "Widgets",