feat: HLS streaming, transcripts, agent course generation & landing-page course previews (#663)

New features:
- HLS video encoding/streaming (hls routes, hls-encoder) and a media
  transcripts pipeline (transcripts route + media-transcript queries)
- AI assistant chat vs. run model: agent-course-generation worker/queue,
  run-monitor pane, chat-changes card, content ask-ai bar
- Per-theme course-page previews across org landing-page themes (bold,
  classic, corporate, editorial, etc.) with a shared course token/component set
- View-as-student mode and login-link / link-invite invite flows

Refactor:
- Extract packages/core consolidating config (env, storage, dashboard-url),
  services and utils previously duplicated under apps/api/src/config
- Remove legacy agent service modules (chat-tools, chat-context,
  context-window, document, fetch-url, lesson-content)
- Relax Cross-Origin-Resource-Policy to allow cross-origin media embedding
- Add format script to tenant-router so turbo run format covers it
This commit is contained in:
Rotimi Best
2026-06-07 18:43:05 +01:00
committed by GitHub
parent a2e70779a0
commit d5b07d356e
496 changed files with 19050 additions and 8312 deletions
@@ -386,7 +386,9 @@
"tic_tac": "Tictac toe",
"see_more": "See more",
"whats_new": "What's new",
"launch_week": "Launch week"
"feedback": "Feedback",
"documentation": "Documentation",
"need_help": "Need help?"
},
"settings": {
"heading": "Settings",
@@ -670,6 +672,11 @@
"preview": "Preview",
"card_menu_label": "Theme options"
},
"preview_tabs": {
"label": "Preview page",
"home": "Home",
"course": "Course"
},
"editor": {
"save": "Save",
"close": "Close",
@@ -986,8 +993,8 @@
"hls_upload": {
"stage": {
"probing": "Reading video…",
"encoding": "Encoding {rung} ({percent}%)",
"uploading": "Uploading segments ({uploaded}/{total})",
"encoding": "Encoding video…",
"uploading": "Uploading…",
"thumbnail": "Generating thumbnail…",
"finalizing": "Saving…",
"done": "Ready",
@@ -2125,7 +2132,14 @@
},
"header": {
"preview": "Preview course",
"preview_missing_slug": "Generate and save a course slug before previewing."
"preview_missing_slug": "Generate and save a course slug before previewing.",
"view_as_student": "View as student"
},
"view_as_student": {
"title": "This will redirect you to the Student LMS.",
"description": "You are about to see what a student will see when they enroll in this course",
"copy_link": "Copy link",
"go_to_lms": "Go to LMS"
},
"navItem": {
"news_feed": {
@@ -2336,6 +2350,12 @@
"generate_transcript": "Generate transcription",
"generate_transcript_in_progress": "Transcribing…",
"view_transcript": "View transcription",
"generate_1080": "Generate 1080p",
"generate_1080_in_progress": "Generating 1080p…",
"generate_1080_ready": "1080p available",
"generate_1080_unavailable": "1080p unavailable for this source video",
"playback_error": "Loading this video failed.",
"playback_reload": "Reload video",
"simple_card": {
"kind_youtube": "YouTube",
"kind_upload": "Upload",
@@ -2350,7 +2370,11 @@
"captions_label": "Captions",
"language": "Language: {language}",
"empty": "No transcript yet. You can generate one from this card’s menu after the video is uploaded.",
"loading": "Loading transcript…"
"loading": "Loading transcript…",
"edit": "Edit transcript",
"save": "Save",
"cancel": "Cancel",
"segment_label": "Segment at {timestamp}"
}
},
"document": {
@@ -3195,7 +3219,17 @@
"members": "Members",
"invite_sent": "Invite Sent",
"you": "You",
"remove": "Remove"
"remove": "Remove",
"link_invite": {
"heading": "Link Invite",
"description": "Anyone with this link can join your organization.",
"generate": "Generate Link",
"copy": "Copy",
"copied": "Copied!",
"toggle_label": "Link invite active",
"disabled_notice": "This link is disabled. Enable it to allow new members to join via link.",
"select_role": "Select a role"
}
}
},
"certificates": {
@@ -3307,8 +3341,10 @@
"title": "Title",
"description": "Description",
"short_video": "Short Video",
"replace_cover": "Replace cover image",
"replace_cover": "Cover image",
"replace": "Replace",
"remove": "Remove",
"no_cover": "No cover image set",
"helper": "Enter a link to a youtube video"
},
"reviews_form": {
@@ -3915,6 +3951,9 @@
"url_copied": "Course URL copied",
"url_copy_failed": "Could not copy URL"
},
"view_as_student": {
"failed": "Couldn't open the student view. Please try again."
},
"something": "Something went wrong - Please try later",
"update": "Update",
"update_failed": "Update failed",
@@ -3940,7 +3979,13 @@
"transcription_started": "Transcription started",
"transcription_start_failed": "Could not start transcription",
"transcription_completed": "Transcription finished",
"transcript_fetch_failed": "Could not load transcript"
"transcript_fetch_failed": "Could not load transcript",
"transcript_saved": "Transcript updated",
"transcript_save_failed": "Could not save transcript"
},
"lesson_video": {
"generate_1080_completed": "1080p rendition added",
"generate_1080_failed": "Could not generate 1080p rendition"
},
"poll": {
"error": {
@@ -4032,6 +4077,11 @@
"remove_fail": "Failed to remove user, please try again",
"remove_success": "Member removed successfully"
},
"link_invite": {
"generated": "Link invite generated",
"enabled": "Link invite enabled",
"disabled": "Link invite disabled"
},
"tags": {
"group_created": "Tag group created",
"group_updated": "Tag group updated",
@@ -4177,6 +4227,18 @@
"joined": "Joined organization",
"join_failed": "Failed to join organization"
}
},
"link": {
"page_title": "Join {orgName} on ClassroomIO",
"invitation_student": "You've been invited to join {orgName} as a student.",
"invitation_teacher": "You've been invited to join {orgName} as a teacher.",
"invitation_admin": "You've been invited to join {orgName} as an admin.",
"invitation_fallback": "You've been invited to join {orgName} as {role}.",
"accept_button": "Join organization",
"go_to_dashboard": "Go to Dashboard",
"disabled": "This invite link has been disabled by the organization.",
"join_failed": "Failed to join organization",
"joined": "Joined organization"
}
},
"content": {
@@ -4339,7 +4401,7 @@
"run_completed": "Course generation complete",
"run_failed": "Course generation failed",
"run_canceled": "Course generation canceled",
"run_waiting_for_worker": "Waiting for the background worker",
"run_waiting_for_worker": "Getting things ready…",
"run_checkpoint": "Saving progress checkpoint",
"plan_implement": "Implement Plan",
"plan_ask_changes_placeholder": "Tell me what to change about the plan…",
@@ -4350,6 +4412,10 @@
"resize_panel_aria_label": "Resize AI assistant panel",
"generic_working": "Working",
"input_placeholder": "Ask the AI assistant...",
"ask_ai": "Ask AI",
"content_input_placeholder": "Ask about this content…",
"ask_ai_expand_aria": "Open Ask AI input",
"ask_ai_input_aria": "Ask AI about this content",
"quote_lesson_note": "Quote in assistant",
"attach_document": "Attach a document (PDF, DOCX, PPTX)",
"upgrade_to_upload": "Upgrade to upload documents",