Pulls the trigger/poll/check-status state out of documents/[id]/+page.svelte into a pure factory in lib/ocr/useOcrJob.svelte.ts that takes documentId, fetchImpl, and onJobFinished callback as injected dependencies. The page now delegates to ocrJob.triggerOcr / ocrJob.checkStatus / ocrJob.destroy and reads ocrJob.running / .progressMessage / .errorMessage / .skippedPages reactively. Test discipline reset: 22 unit tests cover initial state, triggerOcr 200/ 4xx-with-code/4xx-without-code/5xx/network-error paths, useExistingAnnotations flag round-trip, checkStatus PENDING/RUNNING/DONE/no-jobId/empty-id/5xx/network paths, polling progressMessage / skippedPages updates, DONE/FAILED → onJobFinished callback, polling-error swallow, and destroy mid-poll cleanup. Refs #496. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sv
Everything you need to build a Svelte project, powered by sv.
Creating a project
If you're seeing this, you've probably already done this step. Congrats!
# create a new project in the current directory
npx sv create
# create a new project in my-app
npx sv create my-app
Developing
Once you've created a project and installed dependencies with npm install (or pnpm install or yarn), start a development server:
npm run dev
# or start the server and open the app in a new browser tab
npm run dev -- --open
Building
To create a production version of your app:
npm run build
You can preview the production build with npm run preview.
To deploy your app, you may need to install an adapter for your target environment.