Implements issue #1674: a new authenticated POST /export/batch endpoint
that accepts a list of company names and an optional format (csv or pdf),
compiles per-company exports into a ZIP archive using Python's zipfile
module, and returns it as a streaming download.
Key changes:
- Extract `_fetch_company_rows`, `_build_company_csv`, `_build_company_pdf`
helpers to eliminate duplication between the single-company endpoints and
the new batch endpoint
- Refactor `export_company_csv` and `export_company_pdf` to delegate to the
new helpers
- Add `BatchExportRequest` Pydantic model (companies list + format field)
- Add `POST /export/batch` which iterates over companies, skips those with
no data, writes per-company files into the ZIP, and always includes a
`manifest.json` listing exported and skipped companies
- Response header: `Content-Disposition: attachment; filename=sparc-export-<date>.zip`
- 17 new tests covering: single company (CSV + PDF), multiple companies,
all-missing, unauthenticated, invalid-token, manifest structure, input
validation
Closesleeworks-agents/SPARC#1674
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>