When report generation in Step 4 fails mid-way (e.g. AI credits exhausted,
network error), users previously had to restart from scratch, losing the
outline and any already-completed sections.
This change preserves partial progress and lets users continue from where
generation stopped:
- Backend: `generate_report(resume=True)` reloads the saved outline and
per-section markdown files, skips the planning phase, and only generates
the missing sections. The `/api/report/generate` endpoint accepts a
`resume` flag and reuses the failed report's `report_id`.
- Frontend: Step4Report polls `/progress` and, when `status === 'failed'`,
shows a "Resume Generation" banner with the failure message and a button
that calls `generateReport({ simulation_id, resume: true })` and
restarts log polling.
- Adds `resumeStart` / `sectionResumed` / `reportFailedTitle` /
`resumeGeneration` locale keys in en and zh.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>