evidence-source/README.md

77 lines
2.8 KiB
Markdown
Raw Normal View History

# evidence-source
2026-05-24 13:49:33 +00:00
Headless document ingest for the citation-evidence ecosystem. Turns raw PDF,
HTML, and Markdown bytes into engine-owned evidence contracts — a `Document`
(media type, SHA-256 fingerprint, optional title/uri/metadata) and a
`DocumentRepresentation` (canonical text, page/offset maps where applicable).
Ingest is pure over bytes: no persistence, no viewer state, no React.
## Status
**Implemented:** PDF ingest (ESRC-WP-0001), HTML/Markdown ingest
(ESRC-WP-0002), PDF metadata enrichment (ESRC-WP-0003), and citation recovery
primitives (ESRC-WP-0004). See `workplans/` for history.
## Install
Requires a sibling checkout of `citation-engine` (domain contracts) and, for
tests, `citation-evidence` (fixture corpus — see `docs/ADR-0002-fixture-ownership.md`).
```bash
pnpm install # resolves @citation-evidence/engine via link:../citation-engine
```
## Usage
```ts
import {
ingestPdf,
ingestHtml,
ingestMarkdown,
} from "@citation-evidence/evidence-source";
const pdf = await ingestPdf(pdfBytes, { filename: "contract.pdf" });
const html = await ingestHtml(htmlBytes, { filename: "brief.html" });
const md = await ingestMarkdown("# Title\n\nBody text.", { filename: "notes.md" });
// document.fingerprint -> SHA-256 hex
// representation.canonicalText / pageMap / offsetMap (format-dependent)
```
Browser upload helpers (in-memory `blob:` byte store + `ingestPdfFromFile`)
live behind a separate, clearly-isolated entry point so headless consumers do
not pull in browser machinery:
```ts
import { createPdfByteStore, ingestPdfFromFile }
from "@citation-evidence/evidence-source/browser";
```
Extraction requires the host to configure the PDF.js worker
(`GlobalWorkerOptions.workerSrc`) before calling `extractPdf`/`ingestPdf`; the
module itself does no worker setup so it loads cleanly in Node and browsers.
## Dev commands
```bash
pnpm test # vitest (fixture suites skip if the corpus is absent)
pnpm typecheck # tsc --noEmit
pnpm lint # eslint
```
Point `EVIDENCE_SOURCE_FIXTURE_DIR` at the PDF corpus when the sibling
`citation-evidence` checkout is not at `../citation-evidence`.
## Architecture
- `src/pdf/` — PDF ingest, extraction, fingerprinting, metadata enrichment.
- `src/html/`, `src/markdown/` — reflowable-format ingest (ADR-0003).
- `src/recovery/` — re-ingest/reconcile, local quote search, discovery hooks (ADR-0004).
- `src/browser/` — browser upload surface: `byte-store`, `upload`. Separated by
an ESLint boundary so the core never imports it.
- Domain contracts come from `@citation-evidence/engine/shared`; none are
copied locally.
- Boundary and fixture decisions: `docs/ADR-0001` through `docs/ADR-0004`.
`viewer-url` resolution stays in the consuming app (`citation-evidence`), which
imports this package's ingest core through a thin façade.