ENGLISH·COURSE API
    Preparing search index...

    Driven adapter: ResourceRepository backed by declared manifest rows whose content keys are resolved through a BlobStore on every read.

    Mirrors InMemoryResourceRepository's query semantics exactly — same methods, same listByModule / listByCourse "return everything" behaviour because Resource does not currently carry moduleId / courseId fields. The difference is the storage shape: rows hold opaque content KEYS in url, and resolution happens here at read time rather than when the manifest is written, so the storage backend can change without touching the course manifests.

    Implements