Data-layer foundation for the app. Pure TypeScript, no React code — consumed later by TanStack Query hooks (per AGENTS.md architecture conventions). ## Tasks - [x] `src/types.ts`: `Book` domain type (title, author, first publish year, cover id, subjects, OpenLibrary work key) and types for the OpenLibrary search response - [x] `src/api/openLibrary.ts`: fetch function for `GET https://openlibrary.org/search.json?subject=<subject>&limit=<n>` and a cover URL helper (`https://covers.openlibrary.org/b/id/<id>-L.jpg`) - [x] Normalize the raw API response into the `Book` type in the api layer (hooks/components should never see raw API shapes) - [x] Handle missing fields defensively (books without covers/authors must not break) ## Acceptance criteria - [x] `npm run build`, `npm run lint`, `npm test` pass with zero warnings - [x] No React imports anywhere under `src/api/` Part of milestone M1 — Setup. Blocks the `useBooks` hook (#6).