Commit Graph
850 Commits
Author SHA1 Message Date
Rotimi Best 64571dd5ec docs: add stage and commit skill, format 2026-06-14 09:24:15 +01:00
Rotimi Best 0975f82c8b fix(widget): powered toggle persistence, copy buttons, version dates, showLessonsCount, color pickers, and loading spinner 2026-06-13 11:24:20 +01:00
Rotimi Best 094683b551 fix: pull user from locals and theme picker default 2026-06-13 09:55:34 +01:00
Rotimi Best 977176dbe2 fix: remove dependency from tenant router 2026-06-12 10:06:06 +01:00
Rotimi Best cd3b252ea2 fix(tenant-router): build @cio/utils before wrangler bundle
Wrangler resolves @cio/utils/constants/* from dist/. Run utils build in
predeploy, predev, and pretypecheck so Cloudflare deploy does not fail with
a missing embeds module.
2026-06-12 02:27:49 +01:00
Rotimi Best ec6d97c482 chore: remove unused log 2026-06-12 02:25:02 +01:00
Rotimi Best 0b5fc27d1c refactor(tenant-router): import embed routes from @cio/utils
Replace the cross-package relative source import with the workspace
package subpath so embed routing uses the canonical constants module.
2026-06-12 02:23:48 +01:00
Rotimi Best 367ddcddd7 feat(embeds): add embed.classroomio.com public widget host
Serve widgets from short public URLs via tenant-router with R2-backed
assets and runtime API_URL injection, so copy-paste snippets hide infra
paths. Update widget payloads, CSP, upload purge URLs, and dev-only API
inject; document format/stage workflow in AGENTS.md and fix ui-prefix-check
YAML syntax.
2026-06-12 02:06:37 +01:00
Rotimi Best c868b2f23f perf: edge-cache static assets and shrink org-route bundle
The /org/[slug] routes loaded 250+ JS chunks and, after a deploy, every
chunk missed Cloudflare's edge cache and stampeded the single origin (up
to 48s to serve one static file) — the "keeps loading" lockout.

- tenant-router: opt /_app/immutable/* into the edge cache via
  cf.cacheEverything; setting Cache-Control alone never populated it
- course/api: mark the 14 API singletons /* @__PURE__ */ so the barrel
  tree-shakes instead of dragging every API into each importer
- courses page: import directly instead of via the feature barrels

Cuts the courses route from 257 to 225 static chunks and keeps static
assets off the origin after the first edge fill.
2026-06-12 01:51:05 +01:00
Rotimi Best 8fd80e9dc5 fix: ui prefix breaking sidebar 2026-06-12 01:03:17 +01:00
Rotimi Best 899a9f2b51 fix: apply ui: prefix to all packages/ui components and automate it 2026-06-11 23:18:40 +01:00
Rotimi Best 89e44d4fab fix(newsfeed): load saved content when reopening the edit modal
Sync modal editor state from the updated feed on open, clear editFeed
on reset, and remount TextEditor so a second edit shows the latest HTML
instead of stale content.
2026-06-11 20:32:39 +01:00
Rotimi Best bbd243d214 fix: render newsfeed content as html 2026-06-11 16:01:10 +01:00
Rotimi Best 52d9bf18c3 feat: add sequential progression and video watch lesson completion
Gate student content by completion order, track per-video watch progress
with seek enforcement, and auto-complete lessons at the configured
threshold. Show ring progress in the lesson header, keep watch progress
on rewatch, and sync progression locks client-side so the next item
unlocks after completion.
2026-06-11 14:48:34 +01:00
Rotimi Best c8154409f5 feat: improve LMS course discovery and enrollment UX
- Add paginated recommended courses to LMS dashboard (top 3, list
    view)
    and explore page (12 per page); exclude courses blocking new
    students
  - Polish course preview modal: remove padding, render requirements as
    HTML, round banner image, secondary close button
  - Redirect to course start page after successful enrollment instead of
    /lms;
    keep spinner active until navigation completes
  - Auto-enable "allow new students" when a course is published
  - Move Explore after My Learning in LMS sidebar nav
  - Move Certificates after Content in course sidebar
  - Add hiddenColumns prop to CourseListRow; show "Learn more" button
    instead of actions menu in LMS explore context
2026-06-11 14:22:18 +01:00
Rotimi Best 4e24e3cb63 docs: add content to stubbed pages 2026-06-10 09:32:45 +01:00
Rotimi Best dcb5cfbc7b feat: make explore more visible in lms 2026-06-10 09:18:20 +01:00
Rotimi Best 02ae9b81b8 fix: get the type of settings 2026-06-10 09:08:57 +01:00
Rotimi Best ab25b8e5d7 chore: improve enrollment documentation 2026-06-10 02:56:00 +01:00
Rotimi Best bb88847570 chore: performance tracking on root routes 2026-06-09 22:43:07 +01:00
Rotimi Best 201cda75ca fix: make Ask AI button opaque in dark mode 2026-06-09 22:40:24 +01:00
Rotimi Best cde7b501d1 docs: invite students guide 2026-06-08 00:47:33 +01:00
Rotimi Best 82d2ba4014 chore: increase the cache for mutable manifest 2026-06-08 00:47:08 +01:00
Rotimi Best e1e56a70be fix: courseNo vs coursesNo mismatch on course save 2026-06-08 00:45:00 +01:00
Rotimi Best 5f07184b29 fix: NoSuchKey, The specified key does not exist. 2026-06-07 23:47:14 +01:00
Rotimi Best d7225a77b2 chore: move templates images to cdn 2026-06-07 23:23:27 +01:00
Rotimi Best 03dcf812a5 feat: fit ai chat trigger to center of page
- Updated the CSS classes for the AI assistant bar to adjust positioning based on the new side panel width variable.
- Introduced a new `onWidthPreview` prop in the SidePanelRail component to handle live resizing and update the side panel width dynamically.
- Added width state management in the SidePanelStore to ensure proper width handling during panel interactions.
- Improved layout handling in the course layout component to accommodate the new side panel width adjustments.
2026-06-07 23:21:19 +01:00
Rotimi Best 4eee866e85 feat: make video uploads faster
- Implemented a new endpoint to delete failed manual p1080 renditions, restoring the master manifest and updating metadata.
- Enhanced the HLS upload process with better error handling and cleanup for aborted uploads.
- Introduced tests for HLS encoder functionality to ensure correct selection of rungs based on video source properties.
- Updated video upload component to manage reserved asset IDs and perform cleanup on abo
2026-06-07 23:20:42 +01:00
Rotimi Best 27a612e92f feat: let AI chat read lesson video transcripts on demand
Add get_lesson_transcript (teacher) and read_lesson_transcript (student)
tools that fetch a lesson's uploaded-video transcript from media_transcript
by the video assetIds. The agents call them only when a question is about
the video's spoken content, so text-only chats keep a cacheable prefix.
2026-06-07 22:30:12 +01:00
Rotimi Best 4221f93584 feat: enhance HLS upload process with concurrency control and presign batching
- Introduced a concurrency gate to limit parallel uploads, preventing R2 overload.
- Implemented batching for presign requests, allowing up to 1500 paths per request.
- Added content type mapping for HLS uploads to ensure correct MIME types.
- Refactored upload logic to utilize the new concurrency and presign features, improving reliability and performance.
2026-06-07 21:17:47 +01:00
Rotimi Best 48ce4d4d64 chore: update queue dashboard authentication and improve course component handling
- Replaced email/token-based authentication with HTTP Basic Auth for the queue dashboard in production.
- Updated course components to use courseId instead of courseSlug for better consistency.
- Adjusted role-based security checks to utilize isStudentExperience for conditional rendering.
- Enhanced view-as-student functionality to redirect correctly based on courseId.
2026-06-07 20:32:37 +01:00
Rotimi Best 3561dc0fda fix: undo org search from tenant-router 2026-06-07 19:35:24 +01:00
Rotimi Best fa6ca75f67 fix(core): declare moved deps (redis, pdf-parse, mammoth, jszip) in @cio/core
These were used by the redis client and document-parsing services that moved
from apps/api into packages/core, but the dependencies stayed in apps/api,
breaking the @cio/core build with TS2307 module-not-found errors. Move them
(and @types/pdf-parse) to where the code now lives.
2026-06-07 18:50:06 +01:00
Rotimi Best d5b07d356e 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
2026-06-07 18:43:05 +01:00
Rotimi Best 7ee544230f fix(dashboard): proxy API auth on custom domains 2026-05-28 08:57:28 +01:00
Rotimi Best 730bcee553 fix: send memberid on checkout 2026-05-27 20:44:56 +01:00
Rotimi Best 607377f191 fix: broken upgrade 2026-05-27 18:35:32 +01:00
Rotimi Best 591a56af2d fix: keep english terms in other translations 2026-05-27 15:28:19 +01:00
Rotimi Best a6331f0d6a fix: update translations 2026-05-27 15:17:05 +01:00
Rotimi Best d855b45eda fix: placeholder names inside {…} were translated 2026-05-27 14:57:21 +01:00
Rotimi Best 9082cbebf4 chore: add more agent upcoming features 2026-05-27 11:55:40 +01:00
Rotimi BestandCursor f0ef45fd67 fix(api): stop SSR org lookups from hitting the global rate limit
Resolve sessions before rate limiting so keys are per-user, exempt trusted server API key calls and get-session, and raise the GET /organization budget for layout loads.

Co-authored-by: Cursor <[email protected]>
2026-05-27 11:44:57 +01:00
Rotimi Best 78ab13f54b feat: preview templates, thumbnail features, 2 new org templates 2026-05-23 12:24:57 +01:00
Rotimi Best 4fdd4115b9 chore: marketing updates and video player improvement 2026-05-22 01:28:18 +01:00
Rotimi Best 594bb615d8 debug: reorder comment 2026-05-21 22:34:11 +01:00
Rotimi Best e7bb0f2f26 debug: trigger ci 2026-05-21 22:30:51 +01:00
Rotimi Best 30e5f9cd54 chore: auto compact chat 2026-05-21 19:46:17 +01:00
Rotimi Best 4e4119d597 fix(agent): base64-envelope /agent/* bodies to bypass Render CF WAF 2026-05-21 19:43:23 +01:00
Rotimi Best a4d86dc3c2 debug: update proxy logs 2026-05-21 18:06:25 +01:00
Rotimi Best fbbce6b7c0 fix: ci fixes, tenant router debug, select width improvement 2026-05-21 17:52:28 +01:00