/**
 * Pure projection functions: `RawDelta` / `SpecSnapshot` (L2) → MCP-friendly
 * self-contained shapes (`MCPReleaseDiff` / `MCPSpecSnapshot`). No I/O,
 * no DB access — caller hands raw inputs in.
 */
import type { LineDiffLite, PageXmlRefLite, RawDelta, SpecSnapshot } from '../../../shared/entities.js';
import type { EntitySnapshot, MCPReleaseDiff, MCPSpecSnapshot, ProjectionOpts } from './types.js';
export declare function projectReleaseDiff(raw: RawDelta, fromSnap: SpecSnapshot | null, toSnap: SpecSnapshot, opts: ProjectionOpts): MCPReleaseDiff;
export declare function projectSpecSnapshot(raw: SpecSnapshot, opts: ProjectionOpts): MCPSpecSnapshot;
export declare function escapeInlineTags(s: string): string;
/**
 * Project structural `LineDiffLite` (M02 `m02pvdif1`) into a single markdown
 * string with inline `<before_change>` / `<after_change>` tags.
 *
 * Adjacency rules:
 * - Sąsiednie linijki tej samej operacji łączymy w jeden tag.
 * - Sąsiedni blok `removed` bezpośrednio przed blokiem `added` daje
 *   `<before_change>…</before_change><after_change>…</after_change>`
 *   (before pierwszy, oba tagi sąsiadują, brak `keep` między nimi).
 *   Replace bloku N→M linii w wire-format z `diffLines` to właśnie taki układ.
 * - `keep` linie emitowane bez tagów.
 * - Literalne `<before_change>` / `<after_change>` w treści sekcji są
 *   escape'owane do encji XML we wszystkich liniach (keep/add/remove),
 *   safety-net na kolizję z markerami.
 *
 * `LineDiff` jest już noise-stripped przez `computeLineDiff` (orphan M06
 * anchory + puste linie w `added`/`removed` odfiltrowane), więc emitowany
 * string nie jest byte-exact rekonstrukcją snapshotu — to intencjonalne.
 */
export declare function projectLineDiffToInlineTags(diff: LineDiffLite): string;
export declare function renderXmlRef(r: PageXmlRefLite): string;
export declare function extractEntityName(s: EntitySnapshot | undefined, slug: string): string;
