{"owner":"run-llama","repo":"liteparse","hasSkills":true,"totalSkillsCount":8,"totalTokensCount":29343,"categories":["anthropic-skill","plugin-manifest","root-instruction"],"hasMcp":false,"mcpConfig":null,"found":["packages/node/package.json","packages/wasm/README.md","packages/wasm/package.json","AGENTS.md","packages/python/README.md","packages/node/tsconfig.json","packages/node/package-lock.json","packages/node/README.md"],"skills":{"packages/node/package.json":"{\n  \"name\": \"@llamaindex/liteparse\",\n  \"version\": \"2.17.0\",\n  \"description\": \"Fast, lightweight PDF and document parsing with spatial text extraction\",\n  \"type\": \"module\",\n  \"main\": \"./dist/lib.cjs\",\n  \"module\": \"./dist/lib.js\",\n  \"types\": \"./dist/lib.d.ts\",\n  \"sideEffects\": false,\n  \"bin\": {\n    \"lit\": \"./dist/cli.js\",\n    \"liteparse\": \"./dist/cli.js\"\n  },\n  \"exports\": {\n    \".\": {\n      \"import\": {\n        \"types\": \"./dist/lib.d.ts\",\n        \"default\": \"./dist/lib.js\"\n      },\n      \"require\": {\n        \"types\": \"./dist/lib.d.cts\",\n        \"default\": \"./dist/lib.cjs\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"napi\": {\n    \"name\": \"liteparse\",\n    \"triples\": {\n      \"defaults\": true,\n      \"additional\": [\n        \"aarch64-apple-darwin\",\n        \"aarch64-unknown-linux-gnu\",\n        \"aarch64-pc-windows-msvc\",\n        \"x86_64-unknown-linux-musl\"\n      ]\n    }\n  },\n  \"files\": [\n    \"dist\",\n    \"*.node\",\n    \"*.dylib\",\n    \"*.so\",\n    \"*.so.*\",\n    \"*.dll\",\n    \"README.md\",\n    \"LICENSE\"\n  ],\n  \"scripts\": {\n    \"build:rs\": \"napi build --cargo-cwd ../../crates/liteparse-napi --platform --release --js false --dts native.d.ts .\",\n    \"build:pdfium\": \"bash scripts/copy-pdfium.sh .\",\n    \"build:ts\": \"node scripts/clean-dist.mjs && tsc --noEmit && tsup\",\n    \"build\": \"npm run build:rs && npm run build:pdfium && npm run build:ts\",\n    \"test\": \"npm run build:ts && node --test tests/\",\n    \"prepublishOnly\": \"npm run build\"\n  },\n  \"dependencies\": {\n    \"commander\": \"^12.0.0\"\n  },\n  \"devDependencies\": {\n    \"@napi-rs/cli\": \"^2.18.4\",\n    \"@types/node\": \"^22.0.0\",\n    \"tsup\": \"^8.5.0\",\n    \"typescript\": \"~5.9.2\"\n  },\n  \"optionalDependencies\": {\n    \"@llamaindex/liteparse-darwin-arm64\": \"2.17.0\",\n    \"@llamaindex/liteparse-darwin-x64\": \"2.17.0\",\n    \"@llamaindex/liteparse-linux-arm64-gnu\": \"2.17.0\",\n    \"@llamaindex/liteparse-linux-x64-gnu\": \"2.17.0\",\n    \"@llamaindex/liteparse-win32-arm64-msvc\": \"2.17.0\",\n    \"@llamaindex/liteparse-win32-x64-msvc\": \"2.17.0\",\n    \"@llamaindex/liteparse-linux-x64-musl\": \"2.17.0\"\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  },\n  \"keywords\": [\n    \"pdf\",\n    \"parser\",\n    \"ocr\",\n    \"text-extraction\",\n    \"pdf-to-text\",\n    \"document-parsing\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/run-llama/liteparse.git\"\n  },\n  \"author\": \"LlamaIndex\",\n  \"license\": \"Apache-2.0\",\n  \"overrides\": {\n    \"esbuild\": \"^0.28.2\"\n  }\n}\n","packages/wasm/README.md":"# @llamaindex/liteparse-wasm\n\nBrowser/WebAssembly build of [LiteParse](https://github.com/run-llama/liteparse) — a fast, lightweight PDF parser with spatial text extraction.\n\nThis package runs entirely in the browser. No server, no cloud calls.\n\n## Install\n\n```sh\nnpm install @llamaindex/liteparse-wasm\n```\n\n## Quick start\n\n```ts\nimport init, { LiteParse } from \"@llamaindex/liteparse-wasm\";\n\n// Load the wasm module (point at the file shipped with the package).\nawait init();\n\nconst parser = new LiteParse({\n  ocrEnabled: false, // OCR requires a JS-side engine (see below)\n  outputFormat: \"json\",\n});\n\n// `data` is a Uint8Array (e.g. from fetch / File / drag-drop).\nconst bytes = new Uint8Array(await file.arrayBuffer());\nconst result = await parser.parse(bytes);\n\nconsole.log(result.text);          // full document text\nconsole.log(result.pages[0]);      // per-page items with bboxes\n```\n\n## Document complexity\n\nBefore committing to a full parse, check whether a document needs OCR or heavier\nprocessing. `isComplex` is a cheap, text-layer-only pass that returns one entry per page\nwith a `needsOcr` verdict and the signals behind it — useful for routing documents or\ndeciding whether the JS-side OCR engine is worth wiring up.\n\n```ts\nconst parser = new LiteParse({ ocrEnabled: false });\nconst bytes = new Uint8Array(await file.arrayBuffer());\nconst pages = await parser.isComplex(bytes);\n\nif (pages.some((p) => p.needsOcr)) {\n  // This document would benefit from OCR — see \"OCR in the browser\" below\n  for (const page of pages.filter((p) => p.needsOcr)) {\n    console.log(`Page ${page.pageNumber}: ${page.reasons.join(\", \")}`);\n  }\n}\n```\n\n`reasons` is one of `\"scanned\"`, `\"no-text\"`, `\"sparse-text\"`, `\"embedded-images\"`,\n`\"garbled\"`, `\"vector-text\"`, or `\"annotation-text\"`.\n\n## Config options\n\nAll optional, camelCase:\n\n| Option | Type | Default | Description |\n|---|---|---|---|\n| `ocrLanguage` | `string` | `\"eng\"` | Language code passed to the OCR engine |\n| `ocrEnabled` | `boolean` | `false` | Run OCR on text-sparse pages |\n| `maxPages` | `number` | `1000` | Stop after this many pages |\n| `targetPages` | `string` | — | e.g. `\"1-5,10,15-20\"` |\n| `extractScreenshots` | `boolean` | `false` | Return parsed pages as PNG bytes on `result.screenshots` |\n| `dpi` | `number` | `150` | Render DPI for OCR / screenshots |\n| `outputFormat` | `\"json\" \\| \"text\" \\| \"markdown\"` | `\"json\"` | Output format; `\"markdown\"` returns rendered Markdown on `result.text` |\n| `imageMode` | `\"off\" \\| \"placeholder\" \\| \"embed\"` | `\"placeholder\"` | How raster images are surfaced in markdown output |\n| `extractLinks` | `boolean` | `true` | Render hyperlink annotations as `[text](url)` in markdown output |\n| `extractVectorGraphics` | `boolean` | `false` | Include page-scoped shapes and merged horizontal/vertical lines |\n| `extractAnnotations` | `boolean` | `false` | Include page annotations and their metadata/geometry in structured output |\n| `extractStructureTree` | `boolean` | `false` | Include the tagged-PDF logical structure tree |\n| `preserveVerySmallText` | `boolean` | `false` | Keep tiny text that's normally filtered |\n| `password` | `string` | — | Password for protected PDFs |\n| `quiet` | `boolean` | `false` | Suppress progress logging |\n| `numWorkers` | `number` | `1` | Maximum concurrent OCR calls |\n| `ocrEngine` | `object` | — | JS-side OCR engine (see below) |\n\n## OCR in the browser\n\nThe native HTTP-OCR and Tesseract backends are not available in the browser.\nTo use OCR, set `ocrEnabled: true` and supply an `ocrEngine` object with a\n`recognize` method. Supplying `ocrEngine` alone does not enable OCR.\n\n```ts\nconst parser = new LiteParse({\n  ocrEnabled: true,\n  ocrLanguage: \"eng\",\n  // Use more than 1 only if the engine supports concurrent jobs.\n  numWorkers: 2,\n  ocrEngine: {\n    /**\n     * @param imageData PNG-encoded image bytes\n     * @param width  rendered page width  in pixels\n     * @param height rendered page height in pixels\n     * @param language e.g. \"eng\"\n     * @returns array of { text, bbox: [x1,y1,x2,y2], confidence }\n     */\n    async recognize(imageData, width, height, language) {\n      // e.g. call a worker that wraps tesseract.js, or a remote OCR service\n      return [\n        { text: \"Hello\", bbox: [10, 20, 80, 40], confidence: 0.98 },\n      ];\n    },\n  },\n});\n```\n\nLiteParse keeps at most `numWorkers` calls to `recognize` active. When one call\nfinishes, LiteParse prepares and starts the next page without waiting for the\nother calls. An OCR engine can send the calls to a Web Worker pool or to\nconcurrent HTTP requests. Results stay assigned to their source pages when\njobs finish out of order. Active calls can keep up to `numWorkers` rendered\npage rasters in memory, so use a small value for high-DPI documents.\n\nA failed `recognize` call only affects its own page. With `ocrFailureFatal:\ntrue` (the default), `parse()` rejects only when every OCR call failed and at\nleast one failed page had little native text. If parsing fails, OCR calls that\nhave already started can continue.\n\n## Building from source\n\nRequires Rust + [`wasm-pack`](https://rustwasm.github.io/wasm-pack/):\n\n```sh\n# from packages/wasm\nnpm run build           # web target (default)\nnpm run build:bundler   # for webpack/rollup/vite\nnpm run build:nodejs    # for node.js\n```\n\nOutput goes to `pkg/`.\n\n## License\n\nApache-2.0\n","packages/wasm/package.json":"{\n  \"name\": \"@llamaindex/liteparse-wasm\",\n  \"version\": \"2.17.0\",\n  \"description\": \"Fast, lightweight PDF parsing with spatial text extraction — WebAssembly build for browsers\",\n  \"type\": \"module\",\n  \"main\": \"./pkg/liteparse_wasm.js\",\n  \"types\": \"./pkg/liteparse_wasm.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./pkg/liteparse_wasm.d.ts\",\n      \"import\": \"./pkg/liteparse_wasm.js\"\n    },\n    \"./liteparse_wasm_bg.wasm\": \"./pkg/liteparse_wasm_bg.wasm\",\n    \"./package.json\": \"./package.json\"\n  },\n  \"files\": [\n    \"pkg\",\n    \"README.md\",\n    \"LICENSE\"\n  ],\n  \"scripts\": {\n    \"build\": \"wasm-pack build ../../crates/liteparse-wasm --release --target web --out-dir ../../packages/wasm/pkg --out-name liteparse_wasm && node scripts/patch-wasi-imports.js\",\n    \"build:bundler\": \"wasm-pack build ../../crates/liteparse-wasm --release --target bundler --out-dir ../../packages/wasm/pkg --out-name liteparse_wasm && node scripts/patch-wasi-imports.js\",\n    \"build:nodejs\": \"wasm-pack build ../../crates/liteparse-wasm --release --target nodejs --out-dir ../../packages/wasm/pkg --out-name liteparse_wasm && node scripts/patch-wasi-imports.js\",\n    \"clean\": \"rm -rf pkg\",\n    \"prepublishOnly\": \"npm run build\"\n  },\n  \"keywords\": [\n    \"pdf\",\n    \"parser\",\n    \"ocr\",\n    \"text-extraction\",\n    \"pdf-to-text\",\n    \"wasm\",\n    \"webassembly\",\n    \"browser\",\n    \"document-parsing\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/run-llama/liteparse.git\"\n  },\n  \"author\": \"LlamaIndex\",\n  \"license\": \"Apache-2.0\",\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n","AGENTS.md":"# LiteParse - Agent Documentation\n\n> This file provides comprehensive context for AI coding agents working on this codebase.\n\n## Project Overview\n\n**LiteParse** is an open-source PDF parsing library written in **Rust**, focused on fast, lightweight document processing with spatial text extraction. It runs entirely locally with zero cloud dependencies by default.\n\nLanguage bindings are provided for **Node.js/TypeScript** (via napi-rs), **Python** (via PyO3), and **WebAssembly** (via wasm-bindgen).\n\n### Key Capabilities\n- **Spatial text extraction** with precise bounding boxes\n- **Flexible OCR** (built-in Tesseract or pluggable HTTP servers)\n- **Multi-format support** (PDFs, DOCX, XLSX, PPTX, images via conversion)\n- **Multi-language bindings**: Rust, Node.js/TypeScript, Python, Browser (WASM)\n- **CLI** available from all installation methods (`cargo`, `npm`, `pip`)\n\n## Directory Structure\n\n```\nliteparse/\n├── crates/\n│   ├── liteparse/          # Core Rust library + CLI binary\n│   │   └── src/\n│   │       ├── main.rs         # CLI entry point (clap)\n│   │       ├── lib.rs          # Library root\n│   │       ├── parser.rs       # LiteParse orchestrator\n│   │       ├── config.rs       # Configuration types and defaults\n│   │       ├── types.rs        # Core data types (ParseResult, TextItem, etc.)\n│   │       ├── projection.rs   # Spatial grid projection (layout reconstruction)\n│   │       ├── extract.rs      # Raw text extraction from PDFium\n│   │       ├── render.rs       # Page rendering / screenshots\n│   │       ├── conversion.rs   # Non-PDF format conversion (LibreOffice, image/resvg/usvg rust crates)\n│   │       ├── ocr_merge.rs    # Merging OCR results with native text\n│   │       ├── error.rs        # Error types\n│   │       ├── ocr/            # OCR engine implementations\n│   │       │   ├── mod.rs          # OcrEngine trait\n│   │       │   ├── tesseract.rs    # Built-in Tesseract OCR\n│   │       │   └── http_simple.rs  # HTTP OCR server client\n│   │       └── output/         # Output formatters\n│   │           ├── mod.rs\n│   │           ├── json.rs\n│   │           └── text.rs\n│   ├── liteparse-napi/     # Node.js bindings (napi-rs)\n│   ├── liteparse-python/   # Python bindings (PyO3 / maturin)\n│   ├── liteparse-wasm/     # WASM bindings (wasm-bindgen)\n│   ├── pdfium/             # Rust wrapper around PDFium C API\n│   └── pdfium-sys/         # PDFium FFI (C → Rust) bindings\n├── packages/\n│   ├── node/               # npm package: TS wrapper + CLI around native binary\n│   │   └── src/\n│   │       ├── lib.ts          # Public LiteParse class for Node.js\n│   │       ├── cli.ts          # CLI entry point (commander)\n│   │       └── native.ts       # Native binary loader\n│   ├── python/             # PyPI package: Python wrapper around native binary\n│   │   └── liteparse/\n│   │       ├── __init__.py\n│   │       ├── parser.py       # Public LiteParse class for Python\n│   │       ├── types.py        # Python dataclass types\n│   │       └── cli.py          # CLI entry point\n│   └── wasm/               # WASM npm package\n├── ocr/                    # Example OCR server implementations\n│   ├── easyocr/            # EasyOCR wrapper server\n│   └── paddleocr/          # PaddleOCR wrapper server\n└── Cargo.toml              # Workspace root\n```\n\n## Data Flow\n\n1. **Input**: File path or raw bytes received (any supported format)\n2. **Conversion** (if needed): Non-PDF formats converted to PDF via LibreOffice and image/resvg/usvg rust crates\n3. **PDF Loading**: PDFium extracts text items, images, metadata\n4. **OCR** (if enabled): Pages rendered and OCR'd for text-sparse areas\n5. **Grid Projection**: Spatial reconstruction of text layout using anchor system\n6. **Post-processing**: Bounding boxes, text cleanup\n7. **Output**: Formatted as JSON or plain text\n\n## Key Design Decisions\n\n### 1. Rust Core with Language Bindings\nThe core parsing logic is written in Rust for performance and safety. Language-specific crates expose the same API surface:\n- `liteparse-napi` → Node.js via napi-rs\n- `liteparse-python` → Python via PyO3/maturin\n- `liteparse-wasm` → Browser via wasm-bindgen\n\nEach binding crate is thin — it wraps the core `liteparse` crate's types and async API.\n\n### 2. OCR Engine Trait\nOCR functionality uses a trait-based abstraction (`OcrEngine`). This allows:\n- Built-in Tesseract (default, compiled in via `tesseract-rs`)\n- HTTP OCR server client for remote engines\n- Custom JS-side OCR in the WASM build via a callback interface\n\n### 3. Spatial Grid Projection\nThe most complex (and important!) part of the codebase (`crates/liteparse/src/projection.rs`). Uses:\n- **Anchor-based layout**: Tracks text alignment (left, right, center, floating)\n- **Forward anchors**: Carry alignment information between lines\n- **Column detection**: Identifies multi-column layouts\n- **Rotation handling**: Transforms 90°, 180°, 270° rotated text to correct reading order\n- **OCR merging**: Combines native PDF text with OCR results, preserving confidence scores and source flags in output\n\n### 4. Selective OCR\nOCR only runs on embedded images where text extraction failed, not the entire document. This balances accuracy with performance.\n\n### 5. Configuration\nUses a default-first approach where users only override what they need. See `crates/liteparse/src/config.rs` for defaults.\n\n### 6. Format Conversion via External Tools\nRather than implementing format parsers, LiteParse converts office file formats using system tools (LibreOffice) into PDF. This provides broad format support with minimal code.\n\n## Common Tasks\n\n### Adding a New Output Format\n1. Create new file in `crates/liteparse/src/output/`\n2. Add variant to `OutputFormat` enum in `config.rs`\n3. Wire it up in `main.rs` and binding crates\n\n### Adding a New OCR Engine\n1. Implement `OcrEngine` trait in `crates/liteparse/src/ocr/`\n2. Add initialization logic in `parser.rs`\n3. Add configuration options in `config.rs`\n\n### Modifying Text Extraction Logic\nKey files in `crates/liteparse/src/`:\n- `projection.rs` — Layout reconstruction (most complex)\n- `extract.rs` — Raw text item extraction from PDFium\n- `text_clip.rs` — Shared glyph visibility: PDFium clip points already include the object matrix; compose only ancestor form matrices and inherit ancestor clips.\n- `ocr_merge.rs` — Merging OCR and native text\n\n### Adding CLI Options\n1. Add field to `LiteParseConfig` in `config.rs`\n2. Add clap arg in `main.rs`\n3. Wire through `parser.rs`\n4. Expose in binding crates (`liteparse-napi`, `liteparse-python`, `liteparse-wasm`)\n\n### Adding / Modifying Node.js Wrapper\n- Edit `packages/node/src/lib.ts` for library API changes\n- Edit `packages/node/src/cli.ts` for CLI changes\n- The native binary interface is defined in `packages/node/src/native.ts`\n\n### Adding / Modifying Python Wrapper\n- Edit `packages/python/liteparse/parser.py` for library API changes\n- Types are in `packages/python/liteparse/types.py`\n- CLI entry point is `packages/python/liteparse/cli.py`\n\n## Key Dependencies\n\n| Dependency | Purpose |\n|------------|---------|\n| `pdfium` (C library) | PDF text extraction and rendering |\n| `tesseract-rs` | Built-in OCR engine (optional, via `tesseract` feature) |\n| `clap` | CLI framework |\n| `serde` / `serde_json` | Serialization |\n| `tokio` | Async runtime |\n| `reqwest` | HTTP client (for OCR server) |\n| `image` | Image processing (PNG encoding) |\n| `napi-rs` | Node.js native bindings |\n| `pyo3` / `maturin` | Python native bindings |\n| `wasm-bindgen` | WASM bindings |\n\n## Entry Points\n\n- **Rust CLI**: `crates/liteparse/src/main.rs`\n- **Rust Library**: `crates/liteparse/src/lib.rs` → `parser.rs` contains `LiteParse` struct\n- **Node.js**: `packages/node/src/lib.ts` exports `LiteParse` class\n- **Python**: `packages/python/liteparse/parser.py` exports `LiteParse` class\n- **WASM**: `crates/liteparse-wasm/` exposes `LiteParse` via wasm-bindgen\n\n## Related Documentation\n\n- [User-facing documentation](README.md)\n- [OCR API Specification](OCR_API_SPEC.md)\n- [WASM package README](packages/wasm/README.md)\n- [Python package README](packages/python/README.md)\n- [OCR server examples](ocr/README.md)\n","packages/python/README.md":"# LiteParse Python\n\nPython bindings for [LiteParse](https://github.com/run-llama/liteparse) — fast, lightweight PDF and document parsing with spatial text extraction.\n\n## Installation\n\n```bash\npip install liteparse\n```\n\nThis also installs the `lit` CLI command.\n\n## Quick Start\n\n```python\nfrom liteparse import LiteParse\n\nparser = LiteParse()\nresult = parser.parse(\"document.pdf\")\nprint(result.text)\nprint(f\"Source document pages: {result.total_pages}\")\n\n# Access structured data\nfor page in result.pages:\n    print(f\"Page {page.page_num}: {len(page.text_items)} text items\")\n```\n\n## Markdown Output\n\nLiteParse can render documents directly to Markdown including headings, tables, lists,\nimages, and links reconstructed from the spatial layout. Great for feeding LLMs\nand RAG pipelines. The rendered Markdown is returned on `result.text`:\n\n```python\nparser = LiteParse(\n    output_format=\"markdown\",   # \"json\" | \"text\" | \"markdown\"\n    image_mode=\"placeholder\",   # \"placeholder\" | \"off\" | \"embed\"\n    extract_links=True,         # render [text](url) link syntax (default: True)\n)\nresult = parser.parse(\"document.pdf\")\nprint(result.text)  # rendered Markdown\n```\n\n> Reconstruction quality varies with document complexity.\n\n## Configuration\n\nAll options are passed to the constructor:\n\n```python\nparser = LiteParse(\n    ocr_enabled=True,              # Enable OCR (default: True)\n    ocr_language=\"eng\",            # Tesseract language code\n    ocr_server_url=None,           # HTTP OCR server URL (optional)\n    tessdata_path=None,            # Path to tessdata directory (optional)\n    max_pages=1000,                # Max pages to parse\n    target_pages=\"1-5,10\",         # Specific pages (optional)\n    extract_screenshots=False,      # Return parsed pages as PNG bytes\n    continue_on_page_error=False,   # Skip broken pages and return page_errors\n    dpi=150,                       # Rendering DPI\n    output_format=\"json\",          # \"json\" | \"text\" | \"markdown\"\n    image_mode=\"placeholder\",      # Markdown image handling: \"placeholder\" | \"off\" | \"embed\"\n    extract_images=True,           # Extract image bytes + metadata (default: False)\n    image_output_dir=\"./images\",   # Write images and return name/path metadata (optional)\n    extract_links=True,            # Render [text](url) links in markdown output\n    keep_headers_footers=False,    # Keep running headers/footers in markdown output\n    extract_vector_graphics=False, # Opt-in shapes + merged H/V lines per page\n    extract_annotations=False,     # Include page annotations in structured output\n    extract_form_fields=False,      # Include AcroForm widget fields and values\n    extract_structure_tree=False,   # Include tagged-PDF logical structure\n    preserve_very_small_text=False, # Keep tiny text\n    extract_text_metadata=False,    # Opt in to MCID, font metrics, colors, char codes, and trailing_space_generated\n    password=None,                 # Password for protected documents\n    quiet=False,                   # Suppress progress output\n    num_workers=4,                 # Concurrent OCR workers\n)\n```\n\nWhen ``extract_images=True``, image extraction is enabled. ``image_output_dir``\nrequires that explicit opt-in and writes the extracted bytes to disk. Each\n``result.images`` entry includes its page bbox, intrinsic pixel dimensions, rotation,\nformat, ``name``, and ``path``. Valid source JPEGs are preserved, exact duplicates\nreuse one file, and JSON CLI output contains metadata only (no base64 image data).\n``image_mode`` controls Markdown presentation only and does not imply extraction.\nWith ``extract_images=False``, lightweight Markdown placement refs are still collected\nand ``result.images`` stays empty.\n\nWhen `extract_annotations` is enabled, each parsed page has an `annotations`\nlist containing the subtype, contents, author/title, PDF date strings,\nviewport-space rectangle and quadpoint rectangles, and URI for external link\nannotations. It is independent of `extract_links`, which controls Markdown\nlink rendering. The field is `None` when extraction is disabled.\n\nWhen ``extract_structure_tree=True``, each page has a ``structure_tree`` containing\nall tagged-PDF roots and recursive elements with type, ID, actual/alternate text,\ntitle, typed attributes, MCIDs, children, and referenced link annotations. Untagged\npages have an empty ``roots`` list; the field is ``None`` when disabled.\n\nEvery result also carries ``creator``/``producer`` from the PDF ``/Info``\ndictionary. With ``extract_document_metadata=True``, ``result.doc_meta`` adds a\nprovenance object with dates, PDF version/security, signature state,\nincremental-save markers, trailer ID comparison, the catalog's XMP packet\n(capped at 64 KiB; skipped for sources over 16 MiB), and source size. It is off by default because it streams the whole source file,\nand it is ``None`` for inputs converted from a non-PDF format. These document\nfields are API-only and do not alter default CLI JSON.\n\n## Parsing from Bytes\n\nPass raw PDF bytes directly — useful for web uploads or downloaded files:\n\n```python\nwith open(\"document.pdf\", \"rb\") as f:\n    result = parser.parse(f.read())\nprint(result.text)\n```\n\n## Worker Pool and Hard Timeouts\n\nPDFium is not thread-safe, so in-process parses serialize on a process-global\nlock. For high-throughput services, or cases where you need to enforce a timeout,\nrun parses in a pool of persistent worker processes instead:\n\n```python\nfrom liteparse import LiteParse, ParseTimeoutError\n\nparser = LiteParse(pool_size=4, parse_timeout=15)\nparser.warm_up()  # optional: pre-initialize workers (~60ms total)\n\ntry:\n    result = parser.parse(\"document.pdf\")\nexcept ParseTimeoutError as e:\n    print(f\"killed rogue document: {e.source} (deadline {e.timeout}s)\")\n\nparser.close()  # or use `with LiteParse(...) as parser:`\n```\n\n## Screenshots\n\nGenerate PNG screenshots of document pages:\n\n```python\nscreenshots = parser.screenshot(\"document.pdf\", page_numbers=[1, 2, 3])\nfor s in screenshots:\n    print(f\"Page {s.page_num}: {s.width}x{s.height}\")\n    with open(f\"page_{s.page_num}.png\", \"wb\") as f:\n        f.write(s.image_bytes)\n```\n\n## Document Complexity\n\nBefore committing to a full parse, check whether a document needs OCR or heavier\nprocessing. `is_complex` is a cheap, text-layer-only pass that returns one entry per page\nwith a `needs_ocr` verdict and the signals behind it — useful for routing documents to\ndifferent pipelines, rejecting ones you can't handle, or estimating cost.\n\n```python\nparser = LiteParse()\npages = parser.is_complex(\"document.pdf\")\n\nif any(p.needs_ocr for p in pages):\n    # Route to the OCR-enabled pipeline\n    result = parser.parse(\"document.pdf\")\nelse:\n    # Cheap path — skip OCR entirely\n    result = LiteParse(ocr_enabled=False).parse(\"document.pdf\")\n\n# Inspect why specific pages were flagged\nfor page in pages:\n    if page.needs_ocr:\n        print(f\"Page {page.page_number}: {', '.join(page.reasons)}\")\n```\n\n`reasons` is one of `\"scanned\"`, `\"no-text\"`, `\"sparse-text\"`, `\"embedded-images\"`,\n`\"garbled\"`, `\"vector-text\"`, or `\"annotation-text\"`. Raw bytes work here too.\n\n## Supported Formats\n\n- PDF (`.pdf`)\n- Microsoft Office (`.docx`, `.xlsx`, `.pptx`, etc.) — requires LibreOffice\n- OpenDocument (`.odt`, `.ods`, `.odp`) — requires LibreOffice\n- Images (`.png`, `.jpg`, `.tiff`, etc.)\n- And more!\n\n## CLI\n\nThe Python package includes the `lit` CLI:\n\n```bash\nlit parse document.pdf\nlit parse document.pdf --format json -o output.json\nlit parse document.pdf --format json --extract-annotations\nlit parse document.pdf --format json --extract-form-fields\nlit screenshot document.pdf -o ./screenshots\nlit batch-parse ./input ./output\nlit is-complex document.pdf\n```\n","packages/node/tsconfig.json":"{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"NodeNext\",\n    \"moduleResolution\": \"NodeNext\",\n    \"rootDir\": \"./src\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    // Type checking only — tsup owns emit (see tsup.config.ts). Keeping this\n    // noEmit prevents a bare `tsc` from producing an ESM-only dist/.\n    \"noEmit\": true\n  },\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n","packages/node/package-lock.json":"{\n  \"name\": \"@llamaindex/liteparse\",\n  \"version\": \"2.17.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"@llamaindex/liteparse\",\n      \"version\": \"2.17.0\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"commander\": \"^12.0.0\"\n      },\n      \"bin\": {\n        \"lit\": \"dist/cli.js\",\n        \"liteparse\": \"dist/cli.js\"\n      },\n      \"devDependencies\": {\n        \"@napi-rs/cli\": \"^2.18.4\",\n        \"@types/node\": \"^22.0.0\",\n        \"tsup\": \"^8.5.0\",\n        \"typescript\": \"~5.9.2\"\n      },\n      \"engines\": {\n        \"node\": \">=18.0.0\"\n      },\n      \"optionalDependencies\": {\n        \"@llamaindex/liteparse-darwin-arm64\": \"2.17.0\",\n        \"@llamaindex/liteparse-darwin-x64\": \"2.17.0\",\n        \"@llamaindex/liteparse-linux-arm64-gnu\": \"2.17.0\",\n        \"@llamaindex/liteparse-linux-x64-gnu\": \"2.17.0\",\n        \"@llamaindex/liteparse-linux-x64-musl\": \"2.17.0\",\n        \"@llamaindex/liteparse-win32-arm64-msvc\": \"2.17.0\",\n        \"@llamaindex/liteparse-win32-x64-msvc\": \"2.17.0\"\n      }\n    },\n    \"node_modules/@esbuild/aix-ppc64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz\",\n      \"integrity\": \"sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"aix\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz\",\n      \"integrity\": \"sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/freebsd-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/freebsd-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-arm\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz\",\n      \"integrity\": \"sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-ia32\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz\",\n      \"integrity\": \"sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-loong64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz\",\n      \"integrity\": \"sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-mips64el\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz\",\n      \"integrity\": \"sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==\",\n      \"cpu\": [\n        \"mips64el\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-ppc64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz\",\n      \"integrity\": \"sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-riscv64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz\",\n      \"integrity\": \"sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-s390x\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz\",\n      \"integrity\": \"sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/netbsd-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"netbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/netbsd-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"netbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openbsd-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openbsd-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openharmony-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openharmony\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/sunos-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"sunos\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-ia32\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz\",\n      \"integrity\": \"sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@jridgewell/gen-mapping\": {\n      \"version\": \"0.3.13\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz\",\n      \"integrity\": \"sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/sourcemap-codec\": \"^1.5.0\",\n        \"@jridgewell/trace-mapping\": \"^0.3.24\"\n      }\n    },\n    \"node_modules/@jridgewell/resolve-uri\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n      \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/sourcemap-codec\": {\n      \"version\": \"1.5.5\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz\",\n      \"integrity\": \"sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==\",\n      \"dev\": true\n    },\n    \"node_modules/@jridgewell/trace-mapping\": {\n      \"version\": \"0.3.31\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz\",\n      \"integrity\": \"sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/resolve-uri\": \"^3.1.0\",\n        \"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n      }\n    },\n    \"node_modules/@llamaindex/liteparse-darwin-arm64\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-darwin-arm64/-/liteparse-darwin-arm64-2.17.0.tgz\",\n      \"integrity\": \"sha512-ha3yTgVXVi3zucs28MnZ7Sb9jiX8Pw2SX04kuPbjUDpXh6xw+kBZ+5kZhnt5ok2SMYcHYOMJJv6ptbXBzmtg8A==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-darwin-x64\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-darwin-x64/-/liteparse-darwin-x64-2.17.0.tgz\",\n      \"integrity\": \"sha512-VsV2hzKMfHqJyW4j0FERGkaOulFSRYT9pvNH5S+oaSM8wns/5Vc1ayrtx0AcC297jL4ud1at3VVO4tqgVyALTg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-linux-arm64-gnu\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-linux-arm64-gnu/-/liteparse-linux-arm64-gnu-2.17.0.tgz\",\n      \"integrity\": \"sha512-XkMD8y5latC1klMWRvhWX6w71u6n6kCUHZtdgpY2hm4B+EfqyiBCTci6uxH+k1Bv1GjoE502U74/34YtbanrRQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-linux-x64-gnu\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-linux-x64-gnu/-/liteparse-linux-x64-gnu-2.17.0.tgz\",\n      \"integrity\": \"sha512-XFpDIDV/TX+8iHSVyClAWvTqY+NfZQld1Bfrg/vo/7FD7+uYzgkjrYxkrHXcBeqr2d8NkQ5j2Smv0TmrZ6ZzFQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-linux-x64-musl\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-linux-x64-musl/-/liteparse-linux-x64-musl-2.17.0.tgz\",\n      \"integrity\": \"sha512-tZWV2LMqHxA0jQObNjylKfJdx9289TrpG0aC5QWulsr5PfhIEWEG58aD20KWSY9ZFNkl7M/nD87X6UWil30VYw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-win32-arm64-msvc\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-win32-arm64-msvc/-/liteparse-win32-arm64-msvc-2.17.0.tgz\",\n      \"integrity\": \"sha512-vk+v3lncSUG/jG+bUZA6bHCp+FAJpUggRYvVCNuAR2PYW9bEWoNrC/PamaKKdKYCQWHoMXpl6biZ+t6NTq0l9Q==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-win32-x64-msvc\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-win32-x64-msvc/-/liteparse-win32-x64-msvc-2.17.0.tgz\",\n      \"integrity\": \"sha512-BKTY0nOrRwq11Jc8WL6Isv52b8EaRDmzZbEWevaPQCaJneh5WEntFbrm/GSYilkFS3qL086HR+9A9VN4ghtAcg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@napi-rs/cli\": {\n      \"version\": \"2.18.4\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/cli/-/cli-2.18.4.tgz\",\n      \"integrity\": \"sha512-SgJeA4df9DE2iAEpr3M2H0OKl/yjtg1BnRI5/JyowS71tUWhrfSu2LT0V3vlHET+g1hBVlrO60PmEXwUEKp8Mg==\",\n      \"dev\": true,\n      \"bin\": {\n        \"napi\": \"scripts/index.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 10\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/Brooooooklyn\"\n      }\n    },\n    \"node_modules/@napi-rs/lzma-linux-x64-gnu\": {\n      \"version\": \"1.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz\",\n      \"integrity\": \"sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^22.20 || ^24.12 || >=25\"\n      }\n    },\n    \"node_modules/@rollup/rollup-android-arm-eabi\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz\",\n      \"integrity\": \"sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-android-arm64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz\",\n      \"integrity\": \"sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-darwin-arm64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz\",\n      \"integrity\": \"sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-darwin-x64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz\",\n      \"integrity\": \"sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-freebsd-arm64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz\",\n      \"integrity\": \"sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-freebsd-x64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz\",\n      \"integrity\": \"sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm-gnueabihf\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz\",\n      \"integrity\": \"sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm-musleabihf\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz\",\n      \"integrity\": \"sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-loong64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-loong64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-ppc64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-ppc64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-riscv64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-riscv64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-s390x-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-x64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-x64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-openbsd-x64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz\",\n      \"integrity\": \"sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-openharmony-arm64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz\",\n      \"integrity\": \"sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openharmony\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-arm64-msvc\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz\",\n      \"integrity\": \"sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-ia32-msvc\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz\",\n      \"integrity\": \"sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-x64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-x64-msvc\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz\",\n      \"integrity\": \"sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@types/estree\": {\n      \"version\": \"1.0.9\",\n      \"resolved\": \"https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz\",\n      \"integrity\": \"sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"22.19.19\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-22.19.19.tgz\",\n      \"integrity\": \"sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"undici-types\": \"~6.21.0\"\n      }\n    },\n    \"node_modules/acorn\": {\n      \"version\": \"8.18.0\",\n      \"resolved\": \"https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz\",\n      \"integrity\": \"sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==\",\n      \"dev\": true,\n      \"bin\": {\n        \"acorn\": \"bin/acorn\"\n      },\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/any-promise\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz\",\n      \"integrity\": \"sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==\",\n      \"dev\": true\n    },\n    \"node_modules/bundle-require\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz\",\n      \"integrity\": \"sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"load-tsconfig\": \"^0.2.3\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"peerDependencies\": {\n        \"esbuild\": \">=0.18\"\n      }\n    },\n    \"node_modules/cac\": {\n      \"version\": \"6.7.14\",\n      \"resolved\": \"https://registry.npmjs.org/cac/-/cac-6.7.14.tgz\",\n      \"integrity\": \"sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/chokidar\": {\n      \"version\": \"4.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz\",\n      \"integrity\": \"sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"readdirp\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 14.16.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/commander\": {\n      \"version\": \"12.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-12.1.0.tgz\",\n      \"integrity\": \"sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==\",\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/confbox\": {\n      \"version\": \"0.1.8\",\n      \"resolved\": \"https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz\",\n      \"integrity\": \"sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==\",\n      \"dev\": true\n    },\n    \"node_modules/consola\": {\n      \"version\": \"3.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/consola/-/consola-3.4.2.tgz\",\n      \"integrity\": \"sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^14.18.0 || >=16.10.0\"\n      }\n    },\n    \"node_modules/debug\": {\n      \"version\": \"4.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.3.tgz\",\n      \"integrity\": \"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ms\": \"^2.1.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"supports-color\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/esbuild\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz\",\n      \"integrity\": \"sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==\",\n      \"dev\": true,\n      \"hasInstallScript\": true,\n      \"bin\": {\n        \"esbuild\": \"bin/esbuild\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"optionalDependencies\": {\n        \"@esbuild/aix-ppc64\": \"0.28.2\",\n        \"@esbuild/android-arm\": \"0.28.2\",\n        \"@esbuild/android-arm64\": \"0.28.2\",\n        \"@esbuild/android-x64\": \"0.28.2\",\n        \"@esbuild/darwin-arm64\": \"0.28.2\",\n        \"@esbuild/darwin-x64\": \"0.28.2\",\n        \"@esbuild/freebsd-arm64\": \"0.28.2\",\n        \"@esbuild/freebsd-x64\": \"0.28.2\",\n        \"@esbuild/linux-arm\": \"0.28.2\",\n        \"@esbuild/linux-arm64\": \"0.28.2\",\n        \"@esbuild/linux-ia32\": \"0.28.2\",\n        \"@esbuild/linux-loong64\": \"0.28.2\",\n        \"@esbuild/linux-mips64el\": \"0.28.2\",\n        \"@esbuild/linux-ppc64\": \"0.28.2\",\n        \"@esbuild/linux-riscv64\": \"0.28.2\",\n        \"@esbuild/linux-s390x\": \"0.28.2\",\n        \"@esbuild/linux-x64\": \"0.28.2\",\n        \"@esbuild/netbsd-arm64\": \"0.28.2\",\n        \"@esbuild/netbsd-x64\": \"0.28.2\",\n        \"@esbuild/openbsd-arm64\": \"0.28.2\",\n        \"@esbuild/openbsd-x64\": \"0.28.2\",\n        \"@esbuild/openharmony-arm64\": \"0.28.2\",\n        \"@esbuild/sunos-x64\": \"0.28.2\",\n        \"@esbuild/win32-arm64\": \"0.28.2\",\n        \"@esbuild/win32-ia32\": \"0.28.2\",\n        \"@esbuild/win32-x64\": \"0.28.2\"\n      }\n    },\n    \"node_modules/fdir\": {\n      \"version\": \"6.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz\",\n      \"integrity\": \"sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      },\n      \"peerDependencies\": {\n        \"picomatch\": \"^3 || ^4\"\n      },\n      \"peerDependenciesMeta\": {\n        \"picomatch\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/fix-dts-default-cjs-exports\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz\",\n      \"integrity\": \"sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"magic-string\": \"^0.30.17\",\n        \"mlly\": \"^1.7.4\",\n        \"rollup\": \"^4.34.8\"\n      }\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz\",\n      \"integrity\": \"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==\",\n      \"dev\": true,\n      \"hasInstallScript\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/joycon\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz\",\n      \"integrity\": \"sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/lilconfig\": {\n      \"version\": \"3.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz\",\n      \"integrity\": \"sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/antonk52\"\n      }\n    },\n    \"node_modules/lines-and-columns\": {\n      \"version\": \"1.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz\",\n      \"integrity\": \"sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==\",\n      \"dev\": true\n    },\n    \"node_modules/load-tsconfig\": {\n      \"version\": \"0.2.5\",\n      \"resolved\": \"https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz\",\n      \"integrity\": \"sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      }\n    },\n    \"node_modules/magic-string\": {\n      \"version\": \"0.30.21\",\n      \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz\",\n      \"integrity\": \"sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/sourcemap-codec\": \"^1.5.5\"\n      }\n    },\n    \"node_modules/mlly\": {\n      \"version\": \"1.8.2\",\n      \"resolved\": \"https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz\",\n      \"integrity\": \"sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"acorn\": \"^8.16.0\",\n        \"pathe\": \"^2.0.3\",\n        \"pkg-types\": \"^1.3.1\",\n        \"ufo\": \"^1.6.3\"\n      }\n    },\n    \"node_modules/ms\": {\n      \"version\": \"2.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n      \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n      \"dev\": true\n    },\n    \"node_modules/mz\": {\n      \"version\": \"2.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/mz/-/mz-2.7.0.tgz\",\n      \"integrity\": \"sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"any-promise\": \"^1.0.0\",\n        \"object-assign\": \"^4.0.1\",\n        \"thenify-all\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/object-assign\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz\",\n      \"integrity\": \"sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/pathe\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz\",\n      \"integrity\": \"sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==\",\n      \"dev\": true\n    },\n    \"node_modules/picocolors\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz\",\n      \"integrity\": \"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==\",\n      \"dev\": true\n    },\n    \"node_modules/picomatch\": {\n      \"version\": \"4.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz\",\n      \"integrity\": \"sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/jonschlinkert\"\n      }\n    },\n    \"node_modules/pirates\": {\n      \"version\": \"4.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz\",\n      \"integrity\": \"sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/pkg-types\": {\n      \"version\": \"1.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz\",\n      \"integrity\": \"sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"confbox\": \"^0.1.8\",\n        \"mlly\": \"^1.7.4\",\n        \"pathe\": \"^2.0.1\"\n      }\n    },\n    \"node_modules/postcss-load-config\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz\",\n      \"integrity\": \"sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"opencollective\",\n          \"url\": \"https://opencollective.com/postcss/\"\n        },\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/ai\"\n        }\n      ],\n      \"dependencies\": {\n        \"lilconfig\": \"^3.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 18\"\n      },\n      \"peerDependencies\": {\n        \"jiti\": \">=1.21.0\",\n        \"postcss\": \">=8.0.9\",\n        \"tsx\": \"^4.8.1\",\n        \"yaml\": \"^2.4.2\"\n      },\n      \"peerDependenciesMeta\": {\n        \"jiti\": {\n          \"optional\": true\n        },\n        \"postcss\": {\n          \"optional\": true\n        },\n        \"tsx\": {\n          \"optional\": true\n        },\n        \"yaml\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/readdirp\": {\n      \"version\": \"4.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz\",\n      \"integrity\": \"sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 14.18.0\"\n      },\n      \"funding\": {\n        \"type\": \"individual\",\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/resolve-from\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz\",\n      \"integrity\": \"sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/rollup\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz\",\n      \"integrity\": \"sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/estree\": \"1.0.9\"\n      },\n      \"bin\": {\n        \"rollup\": \"dist/bin/rollup\"\n      },\n      \"engines\": {\n        \"node\": \">=18.0.0\",\n        \"npm\": \">=8.0.0\"\n      },\n      \"optionalDependencies\": {\n        \"@napi-rs/lzma-linux-x64-gnu\": \"1.5.1\",\n        \"@rollup/rollup-android-arm-eabi\": \"4.62.4\",\n        \"@rollup/rollup-android-arm64\": \"4.62.4\",\n        \"@rollup/rollup-darwin-arm64\": \"4.62.4\",\n        \"@rollup/rollup-darwin-x64\": \"4.62.4\",\n        \"@rollup/rollup-freebsd-arm64\": \"4.62.4\",\n        \"@rollup/rollup-freebsd-x64\": \"4.62.4\",\n        \"@rollup/rollup-linux-arm-gnueabihf\": \"4.62.4\",\n        \"@rollup/rollup-linux-arm-musleabihf\": \"4.62.4\",\n        \"@rollup/rollup-linux-arm64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-arm64-musl\": \"4.62.4\",\n        \"@rollup/rollup-linux-loong64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-loong64-musl\": \"4.62.4\",\n        \"@rollup/rollup-linux-ppc64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-ppc64-musl\": \"4.62.4\",\n        \"@rollup/rollup-linux-riscv64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-riscv64-musl\": \"4.62.4\",\n        \"@rollup/rollup-linux-s390x-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-x64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-x64-musl\": \"4.62.4\",\n        \"@rollup/rollup-openbsd-x64\": \"4.62.4\",\n        \"@rollup/rollup-openharmony-arm64\": \"4.62.4\",\n        \"@rollup/rollup-win32-arm64-msvc\": \"4.62.4\",\n        \"@rollup/rollup-win32-ia32-msvc\": \"4.62.4\",\n        \"@rollup/rollup-win32-x64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-win32-x64-msvc\": \"4.62.4\",\n        \"fsevents\": \"~2.3.2\"\n      }\n    },\n    \"node_modules/source-map\": {\n      \"version\": \"0.7.6\",\n      \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz\",\n      \"integrity\": \"sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 12\"\n      }\n    },\n    \"node_modules/sucrase\": {\n      \"version\": \"3.35.1\",\n      \"resolved\": \"https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz\",\n      \"integrity\": \"sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/gen-mapping\": \"^0.3.2\",\n        \"commander\": \"^4.0.0\",\n        \"lines-and-columns\": \"^1.1.6\",\n        \"mz\": \"^2.7.0\",\n        \"pirates\": \"^4.0.1\",\n        \"tinyglobby\": \"^0.2.11\",\n        \"ts-interface-checker\": \"^0.1.9\"\n      },\n      \"bin\": {\n        \"sucrase\": \"bin/sucrase\",\n        \"sucrase-node\": \"bin/sucrase-node\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      }\n    },\n    \"node_modules/sucrase/node_modules/commander\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-4.1.1.tgz\",\n      \"integrity\": \"sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/thenify\": {\n      \"version\": \"3.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz\",\n      \"integrity\": \"sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"any-promise\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/thenify-all\": {\n      \"version\": \"1.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz\",\n      \"integrity\": \"sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"thenify\": \">= 3.1.0 < 4\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8\"\n      }\n    },\n    \"node_modules/tinyexec\": {\n      \"version\": \"0.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz\",\n      \"integrity\": \"sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==\",\n      \"dev\": true\n    },\n    \"node_modules/tinyglobby\": {\n      \"version\": \"0.2.17\",\n      \"resolved\": \"https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz\",\n      \"integrity\": \"sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fdir\": \"^6.5.0\",\n        \"picomatch\": \"^4.0.4\"\n      },\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/SuperchupuDev\"\n      }\n    },\n    \"node_modules/tree-kill\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz\",\n      \"integrity\": \"sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==\",\n      \"dev\": true,\n      \"bin\": {\n        \"tree-kill\": \"cli.js\"\n      }\n    },\n    \"node_modules/ts-interface-checker\": {\n      \"version\": \"0.1.13\",\n      \"resolved\": \"https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz\",\n      \"integrity\": \"sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==\",\n      \"dev\": true\n    },\n    \"node_modules/tsup\": {\n      \"version\": \"8.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz\",\n      \"integrity\": \"sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"bundle-require\": \"^5.1.0\",\n        \"cac\": \"^6.7.14\",\n        \"chokidar\": \"^4.0.3\",\n        \"consola\": \"^3.4.0\",\n        \"debug\": \"^4.4.0\",\n        \"esbuild\": \"^0.27.0\",\n        \"fix-dts-default-cjs-exports\": \"^1.0.0\",\n        \"joycon\": \"^3.1.1\",\n        \"picocolors\": \"^1.1.1\",\n        \"postcss-load-config\": \"^6.0.1\",\n        \"resolve-from\": \"^5.0.0\",\n        \"rollup\": \"^4.34.8\",\n        \"source-map\": \"^0.7.6\",\n        \"sucrase\": \"^3.35.0\",\n        \"tinyexec\": \"^0.3.2\",\n        \"tinyglobby\": \"^0.2.11\",\n        \"tree-kill\": \"^1.2.2\"\n      },\n      \"bin\": {\n        \"tsup\": \"dist/cli-default.js\",\n        \"tsup-node\": \"dist/cli-node.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"peerDependencies\": {\n        \"@microsoft/api-extractor\": \"^7.36.0\",\n        \"@swc/co","packages/node/README.md":"# LiteParse Node.js\n\nNode.js/TypeScript bindings for [LiteParse](https://github.com/run-llama/liteparse) — fast, lightweight PDF and document parsing with spatial text extraction.\n\n## Installation\n\n```bash\nnpm i @llamaindex/liteparse\n```\n\nThis also installs the `lit` CLI command (use `npm i -g` for global access).\n\n## Quick Start\n\n```typescript\nimport { LiteParse } from '@llamaindex/liteparse';\n\nconst parser = new LiteParse();\nconst result = await parser.parse('document.pdf');\nconsole.log(result.text);\nconsole.log(`Source document pages: ${result.totalPages}`);\n\n// Access structured data\nfor (const page of result.pages) {\n  console.log(`Page ${page.pageNum}: ${page.textItems.length} text items`);\n}\n```\n\nCommonJS is supported as well:\n\n```javascript\nconst { LiteParse } = require('@llamaindex/liteparse');\n\n(async () => {\n  const parser = new LiteParse();\n  const result = await parser.parse('document.pdf');\n  console.log(result.text);\n})();\n```\n\n### Bounded-memory parsing\n\nFor documents with many text items, consume page batches without retaining\nearlier results:\n\n```typescript\nconst parser = new LiteParse();\nfor await (const batch of parser.parseBatches('large.pdf', { batchSize: 20 })) {\n  await processPages(batch.result.pages);\n}\n```\n\nEach batch is an ordinary parse result covering `batch.startPage` through\n`batch.endPage`, and becomes collectible as soon as you advance the iterator.\nA non-PDF source is converted once, not once per batch.\n\nCross-page passes only see the pages in their own batch, so repeated\nheader/footer removal and image deduplication are batch-local and the output\ncan differ from `parse()`. Prefer `parse()` unless the size of the\nmaterialized result is the problem.\n\n## Markdown Output\n\nLiteParse can render documents directly to Markdown including headings, tables, lists,\nimages, and links reconstructed from the spatial layout. Great for feeding LLMs\nand RAG pipelines. The rendered Markdown is returned on `result.text`:\n\n```typescript\nconst parser = new LiteParse({\n  outputFormat: 'markdown',     // \"json\" | \"text\" | \"markdown\"\n  imageMode: 'placeholder',     // \"placeholder\" | \"off\" | \"embed\"\n  extractLinks: true,           // render [text](url) link syntax (default: true)\n});\nconst result = await parser.parse('document.pdf');\nconsole.log(result.text); // rendered Markdown\n```\n\n> Reconstruction quality varies with document complexity.\n\n## Configuration\n\nAll options are passed to the constructor:\n\n```typescript\nconst parser = new LiteParse({\n  ocrEnabled: true,              // Enable OCR (default: true)\n  ocrLanguage: 'eng',           // Tesseract language code\n  ocrServerUrl: undefined,       // HTTP OCR server URL (optional)\n  tessdataPath: undefined,       // Path to tessdata directory (optional)\n  maxPages: 1000,                // Max pages to parse\n  targetPages: '1-5,10',        // Specific pages (optional)\n  extractScreenshots: false,    // Return parsed pages as PNG buffers\n  continueOnPageError: false,   // Skip broken pages and return pageErrors\n  dpi: 150,                      // Rendering DPI\n  outputFormat: 'json',          // \"json\" | \"text\" | \"markdown\"\n  imageMode: 'placeholder',      // Markdown image handling: \"placeholder\" | \"off\" | \"embed\"\n  extractImages: true,           // Extract image bytes + metadata (default: false)\n  imageOutputDir: './images',    // Write images and return name/path metadata (optional)\n  extractLinks: true,            // Render [text](url) links in markdown output\n  keepHeadersFooters: false,     // Keep running headers/footers in markdown output\n  extractVectorGraphics: false,  // Opt-in shapes + merged H/V lines per page\n  extractAnnotations: false,     // Include page annotations in structured output\n  extractFormFields: false,      // Include AcroForm widget fields and values\n  extractStructureTree: false,   // Include tagged-PDF logical structure\n  extractXfaPackets: false,      // Include raw XFA packets (name + XML content)\n  extractContentBounds: false,   // Include per-page contentBounds union bbox\n  detectScreenshotRects: false,  // Detect solid rects/lines in screenshots\n  preserveVerySmallText: false,  // Keep tiny text\n  extractTextMetadata: false,    // Opt in to MCID, font metrics, colors, char codes, and trailingSpaceGenerated\n  password: undefined,           // Password for protected documents\n  quiet: false,                  // Suppress progress output\n  numWorkers: 4,                 // Concurrent OCR workers\n});\n```\n\nWhen `extractImages` is true, image extraction is enabled. `imageOutputDir` requires\nthat explicit opt-in and writes the extracted bytes to disk. Each\n`result.images` entry includes its page bbox, intrinsic pixel dimensions, rotation,\nformat, `name`, and `path`. Valid source JPEGs are preserved, exact duplicates reuse\none file, and JSON CLI output contains metadata only (no base64 image data).\n`imageMode` controls Markdown presentation only and does not imply extraction. With\n`extractImages: false`, lightweight Markdown placement refs are still collected and\n`result.images` stays empty.\n\nThe Node CLI uses the same snake_case JSON schema as the Rust CLI; camelCase is\nreserved for the programmatic Node API.\n\nWhen `extractAnnotations` is enabled, each parsed page has an `annotations`\narray containing the subtype, contents, author/title, PDF date strings,\nviewport-space rectangle and quadpoint rectangles, and URI for external link\nannotations. It is independent of `extractLinks`, which controls Markdown link\nrendering. The field is omitted when extraction is disabled.\n\nWhen `extractStructureTree` is enabled, each page has a `structureTree` containing\nall tagged-PDF roots and recursive elements with type, ID, actual/alternate text,\ntitle, typed attributes, MCIDs, children, and referenced link annotations. Untagged\npages have an empty `roots` array; the field is omitted when disabled.\n\nEvery result also carries the document's `/Info` `creator`/`producer` when\npresent. With `extractDocumentMetadata`, `result.docMeta` adds a provenance\nobject with dates, PDF version/security, signature state, incremental-save\nmarkers, trailer ID comparison, the catalog's XMP packet (capped at 64 KiB;\nskipped for sources over 16 MiB), and source size — off by default since it\nstreams the whole file, and absent for inputs converted from a non-PDF\nformat. These are API-level only, not in CLI JSON. With `extractContentBounds`\neach page carries a `contentBounds` union bbox of its top-level content\nobjects. With `extractXfaPackets`, `result.xfaPackets` lists each raw XFA\npacket (index, name, content length, XML content); non-XFA documents yield an\nempty array. Screenshots draw form-field appearances into the raster and\nreport `isSolidFill` per page, plus detected solid `rects` when\n`detectScreenshotRects` is enabled.\n\n## Parsing from Bytes\n\nPass a `Buffer` or `Uint8Array` directly — useful for HTTP responses or in-memory data:\n\n```typescript\nimport { readFile } from 'fs/promises';\n\nconst pdfBytes = await readFile('document.pdf');\nconst result = await parser.parse(pdfBytes);\nconsole.log(result.text);\n```\n\n## Worker Pool and Hard Timeouts\n\nPDFium is not thread-safe, so all parses inside one process serialize on a\nprocess-global lock — even `Promise.all` over multiple `parse()` calls runs\nthem one at a time.\n\nFor high-throughput services, or for cases when you need to enforce a\nruntime timeout, run parses in a pool of persistent worker processes instead:\n\n```typescript\nimport { LiteParse, ParseTimeoutError } from '@llamaindex/liteparse';\n\nconst parser = new LiteParse({ poolSize: 4, parseTimeoutMs: 15_000 });\nawait parser.warmUp(); // optional: pre-initialize workers (~45ms total)\n\ntry {\n  const result = await parser.parse('document.pdf');\n} catch (e) {\n  if (e instanceof ParseTimeoutError) {\n    console.warn(`killed rogue document: ${e.source} (deadline ${e.timeoutMs}ms)`);\n  }\n}\n\nparser.close(); // frees workers immediately; an idle pool never blocks exit\n```\n\n## Screenshots\n\nGenerate PNG screenshots of document pages:\n\n```typescript\nconst screenshots = parser.screenshot('document.pdf', [1, 2, 3]);\nfor (const s of screenshots) {\n  console.log(`Page ${s.pageNum}: ${s.width}x${s.height}`);\n  // s.imageBuffer contains PNG bytes\n}\n```\n\n## Document Complexity\n\nBefore committing to a full parse, check whether a document needs OCR or heavier\nprocessing. `isComplex` is a cheap, text-layer-only pass that returns one entry per page\nwith a `needsOcr` verdict and the signals behind it — useful for routing documents to\ndifferent pipelines, rejecting ones you can't handle, or estimating cost.\n\n```typescript\nconst parser = new LiteParse();\nconst pages = await parser.isComplex('document.pdf');\n\nif (pages.some((p) => p.needsOcr)) {\n  // Route to the OCR-enabled pipeline\n  const result = await parser.parse('document.pdf');\n} else {\n  // Cheap path — skip OCR entirely\n  const result = await new LiteParse({ ocrEnabled: false }).parse('document.pdf');\n}\n\n// Inspect why specific pages were flagged\nfor (const page of pages.filter((p) => p.needsOcr)) {\n  console.log(`Page ${page.pageNumber}: ${page.reasons.join(', ')}`);\n}\n```\n\n`reasons` is one of `\"scanned\"`, `\"no-text\"`, `\"sparse-text\"`, `\"embedded-images\"`,\n`\"garbled\"`, `\"vector-text\"`, or `\"annotation-text\"`. Raw bytes work here too.\n\n## Supported Formats\n\n- PDF (`.pdf`)\n- Microsoft Office (`.docx`, `.xlsx`, `.pptx`, etc.) — requires LibreOffice\n- OpenDocument (`.odt`, `.ods`, `.odp`) — requires LibreOffice\n- Images (`.png`, `.jpg`, `.tiff`, etc.)\n- And more!\n\n## CLI\n\nThe npm package includes the `lit` CLI:\n\n```bash\nlit parse document.pdf\nlit parse document.pdf --format json -o output.json\nlit parse document.pdf --format json --extract-annotations\nlit parse document.pdf --format json --extract-form-fields\nlit screenshot document.pdf -o ./screenshots\nlit batch-parse ./input ./output\nlit is-complex document.pdf\n```\n"},"files":{"packages/node/package.json":"{\n  \"name\": \"@llamaindex/liteparse\",\n  \"version\": \"2.17.0\",\n  \"description\": \"Fast, lightweight PDF and document parsing with spatial text extraction\",\n  \"type\": \"module\",\n  \"main\": \"./dist/lib.cjs\",\n  \"module\": \"./dist/lib.js\",\n  \"types\": \"./dist/lib.d.ts\",\n  \"sideEffects\": false,\n  \"bin\": {\n    \"lit\": \"./dist/cli.js\",\n    \"liteparse\": \"./dist/cli.js\"\n  },\n  \"exports\": {\n    \".\": {\n      \"import\": {\n        \"types\": \"./dist/lib.d.ts\",\n        \"default\": \"./dist/lib.js\"\n      },\n      \"require\": {\n        \"types\": \"./dist/lib.d.cts\",\n        \"default\": \"./dist/lib.cjs\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"napi\": {\n    \"name\": \"liteparse\",\n    \"triples\": {\n      \"defaults\": true,\n      \"additional\": [\n        \"aarch64-apple-darwin\",\n        \"aarch64-unknown-linux-gnu\",\n        \"aarch64-pc-windows-msvc\",\n        \"x86_64-unknown-linux-musl\"\n      ]\n    }\n  },\n  \"files\": [\n    \"dist\",\n    \"*.node\",\n    \"*.dylib\",\n    \"*.so\",\n    \"*.so.*\",\n    \"*.dll\",\n    \"README.md\",\n    \"LICENSE\"\n  ],\n  \"scripts\": {\n    \"build:rs\": \"napi build --cargo-cwd ../../crates/liteparse-napi --platform --release --js false --dts native.d.ts .\",\n    \"build:pdfium\": \"bash scripts/copy-pdfium.sh .\",\n    \"build:ts\": \"node scripts/clean-dist.mjs && tsc --noEmit && tsup\",\n    \"build\": \"npm run build:rs && npm run build:pdfium && npm run build:ts\",\n    \"test\": \"npm run build:ts && node --test tests/\",\n    \"prepublishOnly\": \"npm run build\"\n  },\n  \"dependencies\": {\n    \"commander\": \"^12.0.0\"\n  },\n  \"devDependencies\": {\n    \"@napi-rs/cli\": \"^2.18.4\",\n    \"@types/node\": \"^22.0.0\",\n    \"tsup\": \"^8.5.0\",\n    \"typescript\": \"~5.9.2\"\n  },\n  \"optionalDependencies\": {\n    \"@llamaindex/liteparse-darwin-arm64\": \"2.17.0\",\n    \"@llamaindex/liteparse-darwin-x64\": \"2.17.0\",\n    \"@llamaindex/liteparse-linux-arm64-gnu\": \"2.17.0\",\n    \"@llamaindex/liteparse-linux-x64-gnu\": \"2.17.0\",\n    \"@llamaindex/liteparse-win32-arm64-msvc\": \"2.17.0\",\n    \"@llamaindex/liteparse-win32-x64-msvc\": \"2.17.0\",\n    \"@llamaindex/liteparse-linux-x64-musl\": \"2.17.0\"\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  },\n  \"keywords\": [\n    \"pdf\",\n    \"parser\",\n    \"ocr\",\n    \"text-extraction\",\n    \"pdf-to-text\",\n    \"document-parsing\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/run-llama/liteparse.git\"\n  },\n  \"author\": \"LlamaIndex\",\n  \"license\": \"Apache-2.0\",\n  \"overrides\": {\n    \"esbuild\": \"^0.28.2\"\n  }\n}\n","packages/wasm/README.md":"# @llamaindex/liteparse-wasm\n\nBrowser/WebAssembly build of [LiteParse](https://github.com/run-llama/liteparse) — a fast, lightweight PDF parser with spatial text extraction.\n\nThis package runs entirely in the browser. No server, no cloud calls.\n\n## Install\n\n```sh\nnpm install @llamaindex/liteparse-wasm\n```\n\n## Quick start\n\n```ts\nimport init, { LiteParse } from \"@llamaindex/liteparse-wasm\";\n\n// Load the wasm module (point at the file shipped with the package).\nawait init();\n\nconst parser = new LiteParse({\n  ocrEnabled: false, // OCR requires a JS-side engine (see below)\n  outputFormat: \"json\",\n});\n\n// `data` is a Uint8Array (e.g. from fetch / File / drag-drop).\nconst bytes = new Uint8Array(await file.arrayBuffer());\nconst result = await parser.parse(bytes);\n\nconsole.log(result.text);          // full document text\nconsole.log(result.pages[0]);      // per-page items with bboxes\n```\n\n## Document complexity\n\nBefore committing to a full parse, check whether a document needs OCR or heavier\nprocessing. `isComplex` is a cheap, text-layer-only pass that returns one entry per page\nwith a `needsOcr` verdict and the signals behind it — useful for routing documents or\ndeciding whether the JS-side OCR engine is worth wiring up.\n\n```ts\nconst parser = new LiteParse({ ocrEnabled: false });\nconst bytes = new Uint8Array(await file.arrayBuffer());\nconst pages = await parser.isComplex(bytes);\n\nif (pages.some((p) => p.needsOcr)) {\n  // This document would benefit from OCR — see \"OCR in the browser\" below\n  for (const page of pages.filter((p) => p.needsOcr)) {\n    console.log(`Page ${page.pageNumber}: ${page.reasons.join(\", \")}`);\n  }\n}\n```\n\n`reasons` is one of `\"scanned\"`, `\"no-text\"`, `\"sparse-text\"`, `\"embedded-images\"`,\n`\"garbled\"`, `\"vector-text\"`, or `\"annotation-text\"`.\n\n## Config options\n\nAll optional, camelCase:\n\n| Option | Type | Default | Description |\n|---|---|---|---|\n| `ocrLanguage` | `string` | `\"eng\"` | Language code passed to the OCR engine |\n| `ocrEnabled` | `boolean` | `false` | Run OCR on text-sparse pages |\n| `maxPages` | `number` | `1000` | Stop after this many pages |\n| `targetPages` | `string` | — | e.g. `\"1-5,10,15-20\"` |\n| `extractScreenshots` | `boolean` | `false` | Return parsed pages as PNG bytes on `result.screenshots` |\n| `dpi` | `number` | `150` | Render DPI for OCR / screenshots |\n| `outputFormat` | `\"json\" \\| \"text\" \\| \"markdown\"` | `\"json\"` | Output format; `\"markdown\"` returns rendered Markdown on `result.text` |\n| `imageMode` | `\"off\" \\| \"placeholder\" \\| \"embed\"` | `\"placeholder\"` | How raster images are surfaced in markdown output |\n| `extractLinks` | `boolean` | `true` | Render hyperlink annotations as `[text](url)` in markdown output |\n| `extractVectorGraphics` | `boolean` | `false` | Include page-scoped shapes and merged horizontal/vertical lines |\n| `extractAnnotations` | `boolean` | `false` | Include page annotations and their metadata/geometry in structured output |\n| `extractStructureTree` | `boolean` | `false` | Include the tagged-PDF logical structure tree |\n| `preserveVerySmallText` | `boolean` | `false` | Keep tiny text that's normally filtered |\n| `password` | `string` | — | Password for protected PDFs |\n| `quiet` | `boolean` | `false` | Suppress progress logging |\n| `numWorkers` | `number` | `1` | Maximum concurrent OCR calls |\n| `ocrEngine` | `object` | — | JS-side OCR engine (see below) |\n\n## OCR in the browser\n\nThe native HTTP-OCR and Tesseract backends are not available in the browser.\nTo use OCR, set `ocrEnabled: true` and supply an `ocrEngine` object with a\n`recognize` method. Supplying `ocrEngine` alone does not enable OCR.\n\n```ts\nconst parser = new LiteParse({\n  ocrEnabled: true,\n  ocrLanguage: \"eng\",\n  // Use more than 1 only if the engine supports concurrent jobs.\n  numWorkers: 2,\n  ocrEngine: {\n    /**\n     * @param imageData PNG-encoded image bytes\n     * @param width  rendered page width  in pixels\n     * @param height rendered page height in pixels\n     * @param language e.g. \"eng\"\n     * @returns array of { text, bbox: [x1,y1,x2,y2], confidence }\n     */\n    async recognize(imageData, width, height, language) {\n      // e.g. call a worker that wraps tesseract.js, or a remote OCR service\n      return [\n        { text: \"Hello\", bbox: [10, 20, 80, 40], confidence: 0.98 },\n      ];\n    },\n  },\n});\n```\n\nLiteParse keeps at most `numWorkers` calls to `recognize` active. When one call\nfinishes, LiteParse prepares and starts the next page without waiting for the\nother calls. An OCR engine can send the calls to a Web Worker pool or to\nconcurrent HTTP requests. Results stay assigned to their source pages when\njobs finish out of order. Active calls can keep up to `numWorkers` rendered\npage rasters in memory, so use a small value for high-DPI documents.\n\nA failed `recognize` call only affects its own page. With `ocrFailureFatal:\ntrue` (the default), `parse()` rejects only when every OCR call failed and at\nleast one failed page had little native text. If parsing fails, OCR calls that\nhave already started can continue.\n\n## Building from source\n\nRequires Rust + [`wasm-pack`](https://rustwasm.github.io/wasm-pack/):\n\n```sh\n# from packages/wasm\nnpm run build           # web target (default)\nnpm run build:bundler   # for webpack/rollup/vite\nnpm run build:nodejs    # for node.js\n```\n\nOutput goes to `pkg/`.\n\n## License\n\nApache-2.0\n","packages/wasm/package.json":"{\n  \"name\": \"@llamaindex/liteparse-wasm\",\n  \"version\": \"2.17.0\",\n  \"description\": \"Fast, lightweight PDF parsing with spatial text extraction — WebAssembly build for browsers\",\n  \"type\": \"module\",\n  \"main\": \"./pkg/liteparse_wasm.js\",\n  \"types\": \"./pkg/liteparse_wasm.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./pkg/liteparse_wasm.d.ts\",\n      \"import\": \"./pkg/liteparse_wasm.js\"\n    },\n    \"./liteparse_wasm_bg.wasm\": \"./pkg/liteparse_wasm_bg.wasm\",\n    \"./package.json\": \"./package.json\"\n  },\n  \"files\": [\n    \"pkg\",\n    \"README.md\",\n    \"LICENSE\"\n  ],\n  \"scripts\": {\n    \"build\": \"wasm-pack build ../../crates/liteparse-wasm --release --target web --out-dir ../../packages/wasm/pkg --out-name liteparse_wasm && node scripts/patch-wasi-imports.js\",\n    \"build:bundler\": \"wasm-pack build ../../crates/liteparse-wasm --release --target bundler --out-dir ../../packages/wasm/pkg --out-name liteparse_wasm && node scripts/patch-wasi-imports.js\",\n    \"build:nodejs\": \"wasm-pack build ../../crates/liteparse-wasm --release --target nodejs --out-dir ../../packages/wasm/pkg --out-name liteparse_wasm && node scripts/patch-wasi-imports.js\",\n    \"clean\": \"rm -rf pkg\",\n    \"prepublishOnly\": \"npm run build\"\n  },\n  \"keywords\": [\n    \"pdf\",\n    \"parser\",\n    \"ocr\",\n    \"text-extraction\",\n    \"pdf-to-text\",\n    \"wasm\",\n    \"webassembly\",\n    \"browser\",\n    \"document-parsing\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/run-llama/liteparse.git\"\n  },\n  \"author\": \"LlamaIndex\",\n  \"license\": \"Apache-2.0\",\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n","AGENTS.md":"# LiteParse - Agent Documentation\n\n> This file provides comprehensive context for AI coding agents working on this codebase.\n\n## Project Overview\n\n**LiteParse** is an open-source PDF parsing library written in **Rust**, focused on fast, lightweight document processing with spatial text extraction. It runs entirely locally with zero cloud dependencies by default.\n\nLanguage bindings are provided for **Node.js/TypeScript** (via napi-rs), **Python** (via PyO3), and **WebAssembly** (via wasm-bindgen).\n\n### Key Capabilities\n- **Spatial text extraction** with precise bounding boxes\n- **Flexible OCR** (built-in Tesseract or pluggable HTTP servers)\n- **Multi-format support** (PDFs, DOCX, XLSX, PPTX, images via conversion)\n- **Multi-language bindings**: Rust, Node.js/TypeScript, Python, Browser (WASM)\n- **CLI** available from all installation methods (`cargo`, `npm`, `pip`)\n\n## Directory Structure\n\n```\nliteparse/\n├── crates/\n│   ├── liteparse/          # Core Rust library + CLI binary\n│   │   └── src/\n│   │       ├── main.rs         # CLI entry point (clap)\n│   │       ├── lib.rs          # Library root\n│   │       ├── parser.rs       # LiteParse orchestrator\n│   │       ├── config.rs       # Configuration types and defaults\n│   │       ├── types.rs        # Core data types (ParseResult, TextItem, etc.)\n│   │       ├── projection.rs   # Spatial grid projection (layout reconstruction)\n│   │       ├── extract.rs      # Raw text extraction from PDFium\n│   │       ├── render.rs       # Page rendering / screenshots\n│   │       ├── conversion.rs   # Non-PDF format conversion (LibreOffice, image/resvg/usvg rust crates)\n│   │       ├── ocr_merge.rs    # Merging OCR results with native text\n│   │       ├── error.rs        # Error types\n│   │       ├── ocr/            # OCR engine implementations\n│   │       │   ├── mod.rs          # OcrEngine trait\n│   │       │   ├── tesseract.rs    # Built-in Tesseract OCR\n│   │       │   └── http_simple.rs  # HTTP OCR server client\n│   │       └── output/         # Output formatters\n│   │           ├── mod.rs\n│   │           ├── json.rs\n│   │           └── text.rs\n│   ├── liteparse-napi/     # Node.js bindings (napi-rs)\n│   ├── liteparse-python/   # Python bindings (PyO3 / maturin)\n│   ├── liteparse-wasm/     # WASM bindings (wasm-bindgen)\n│   ├── pdfium/             # Rust wrapper around PDFium C API\n│   └── pdfium-sys/         # PDFium FFI (C → Rust) bindings\n├── packages/\n│   ├── node/               # npm package: TS wrapper + CLI around native binary\n│   │   └── src/\n│   │       ├── lib.ts          # Public LiteParse class for Node.js\n│   │       ├── cli.ts          # CLI entry point (commander)\n│   │       └── native.ts       # Native binary loader\n│   ├── python/             # PyPI package: Python wrapper around native binary\n│   │   └── liteparse/\n│   │       ├── __init__.py\n│   │       ├── parser.py       # Public LiteParse class for Python\n│   │       ├── types.py        # Python dataclass types\n│   │       └── cli.py          # CLI entry point\n│   └── wasm/               # WASM npm package\n├── ocr/                    # Example OCR server implementations\n│   ├── easyocr/            # EasyOCR wrapper server\n│   └── paddleocr/          # PaddleOCR wrapper server\n└── Cargo.toml              # Workspace root\n```\n\n## Data Flow\n\n1. **Input**: File path or raw bytes received (any supported format)\n2. **Conversion** (if needed): Non-PDF formats converted to PDF via LibreOffice and image/resvg/usvg rust crates\n3. **PDF Loading**: PDFium extracts text items, images, metadata\n4. **OCR** (if enabled): Pages rendered and OCR'd for text-sparse areas\n5. **Grid Projection**: Spatial reconstruction of text layout using anchor system\n6. **Post-processing**: Bounding boxes, text cleanup\n7. **Output**: Formatted as JSON or plain text\n\n## Key Design Decisions\n\n### 1. Rust Core with Language Bindings\nThe core parsing logic is written in Rust for performance and safety. Language-specific crates expose the same API surface:\n- `liteparse-napi` → Node.js via napi-rs\n- `liteparse-python` → Python via PyO3/maturin\n- `liteparse-wasm` → Browser via wasm-bindgen\n\nEach binding crate is thin — it wraps the core `liteparse` crate's types and async API.\n\n### 2. OCR Engine Trait\nOCR functionality uses a trait-based abstraction (`OcrEngine`). This allows:\n- Built-in Tesseract (default, compiled in via `tesseract-rs`)\n- HTTP OCR server client for remote engines\n- Custom JS-side OCR in the WASM build via a callback interface\n\n### 3. Spatial Grid Projection\nThe most complex (and important!) part of the codebase (`crates/liteparse/src/projection.rs`). Uses:\n- **Anchor-based layout**: Tracks text alignment (left, right, center, floating)\n- **Forward anchors**: Carry alignment information between lines\n- **Column detection**: Identifies multi-column layouts\n- **Rotation handling**: Transforms 90°, 180°, 270° rotated text to correct reading order\n- **OCR merging**: Combines native PDF text with OCR results, preserving confidence scores and source flags in output\n\n### 4. Selective OCR\nOCR only runs on embedded images where text extraction failed, not the entire document. This balances accuracy with performance.\n\n### 5. Configuration\nUses a default-first approach where users only override what they need. See `crates/liteparse/src/config.rs` for defaults.\n\n### 6. Format Conversion via External Tools\nRather than implementing format parsers, LiteParse converts office file formats using system tools (LibreOffice) into PDF. This provides broad format support with minimal code.\n\n## Common Tasks\n\n### Adding a New Output Format\n1. Create new file in `crates/liteparse/src/output/`\n2. Add variant to `OutputFormat` enum in `config.rs`\n3. Wire it up in `main.rs` and binding crates\n\n### Adding a New OCR Engine\n1. Implement `OcrEngine` trait in `crates/liteparse/src/ocr/`\n2. Add initialization logic in `parser.rs`\n3. Add configuration options in `config.rs`\n\n### Modifying Text Extraction Logic\nKey files in `crates/liteparse/src/`:\n- `projection.rs` — Layout reconstruction (most complex)\n- `extract.rs` — Raw text item extraction from PDFium\n- `text_clip.rs` — Shared glyph visibility: PDFium clip points already include the object matrix; compose only ancestor form matrices and inherit ancestor clips.\n- `ocr_merge.rs` — Merging OCR and native text\n\n### Adding CLI Options\n1. Add field to `LiteParseConfig` in `config.rs`\n2. Add clap arg in `main.rs`\n3. Wire through `parser.rs`\n4. Expose in binding crates (`liteparse-napi`, `liteparse-python`, `liteparse-wasm`)\n\n### Adding / Modifying Node.js Wrapper\n- Edit `packages/node/src/lib.ts` for library API changes\n- Edit `packages/node/src/cli.ts` for CLI changes\n- The native binary interface is defined in `packages/node/src/native.ts`\n\n### Adding / Modifying Python Wrapper\n- Edit `packages/python/liteparse/parser.py` for library API changes\n- Types are in `packages/python/liteparse/types.py`\n- CLI entry point is `packages/python/liteparse/cli.py`\n\n## Key Dependencies\n\n| Dependency | Purpose |\n|------------|---------|\n| `pdfium` (C library) | PDF text extraction and rendering |\n| `tesseract-rs` | Built-in OCR engine (optional, via `tesseract` feature) |\n| `clap` | CLI framework |\n| `serde` / `serde_json` | Serialization |\n| `tokio` | Async runtime |\n| `reqwest` | HTTP client (for OCR server) |\n| `image` | Image processing (PNG encoding) |\n| `napi-rs` | Node.js native bindings |\n| `pyo3` / `maturin` | Python native bindings |\n| `wasm-bindgen` | WASM bindings |\n\n## Entry Points\n\n- **Rust CLI**: `crates/liteparse/src/main.rs`\n- **Rust Library**: `crates/liteparse/src/lib.rs` → `parser.rs` contains `LiteParse` struct\n- **Node.js**: `packages/node/src/lib.ts` exports `LiteParse` class\n- **Python**: `packages/python/liteparse/parser.py` exports `LiteParse` class\n- **WASM**: `crates/liteparse-wasm/` exposes `LiteParse` via wasm-bindgen\n\n## Related Documentation\n\n- [User-facing documentation](README.md)\n- [OCR API Specification](OCR_API_SPEC.md)\n- [WASM package README](packages/wasm/README.md)\n- [Python package README](packages/python/README.md)\n- [OCR server examples](ocr/README.md)\n","packages/python/README.md":"# LiteParse Python\n\nPython bindings for [LiteParse](https://github.com/run-llama/liteparse) — fast, lightweight PDF and document parsing with spatial text extraction.\n\n## Installation\n\n```bash\npip install liteparse\n```\n\nThis also installs the `lit` CLI command.\n\n## Quick Start\n\n```python\nfrom liteparse import LiteParse\n\nparser = LiteParse()\nresult = parser.parse(\"document.pdf\")\nprint(result.text)\nprint(f\"Source document pages: {result.total_pages}\")\n\n# Access structured data\nfor page in result.pages:\n    print(f\"Page {page.page_num}: {len(page.text_items)} text items\")\n```\n\n## Markdown Output\n\nLiteParse can render documents directly to Markdown including headings, tables, lists,\nimages, and links reconstructed from the spatial layout. Great for feeding LLMs\nand RAG pipelines. The rendered Markdown is returned on `result.text`:\n\n```python\nparser = LiteParse(\n    output_format=\"markdown\",   # \"json\" | \"text\" | \"markdown\"\n    image_mode=\"placeholder\",   # \"placeholder\" | \"off\" | \"embed\"\n    extract_links=True,         # render [text](url) link syntax (default: True)\n)\nresult = parser.parse(\"document.pdf\")\nprint(result.text)  # rendered Markdown\n```\n\n> Reconstruction quality varies with document complexity.\n\n## Configuration\n\nAll options are passed to the constructor:\n\n```python\nparser = LiteParse(\n    ocr_enabled=True,              # Enable OCR (default: True)\n    ocr_language=\"eng\",            # Tesseract language code\n    ocr_server_url=None,           # HTTP OCR server URL (optional)\n    tessdata_path=None,            # Path to tessdata directory (optional)\n    max_pages=1000,                # Max pages to parse\n    target_pages=\"1-5,10\",         # Specific pages (optional)\n    extract_screenshots=False,      # Return parsed pages as PNG bytes\n    continue_on_page_error=False,   # Skip broken pages and return page_errors\n    dpi=150,                       # Rendering DPI\n    output_format=\"json\",          # \"json\" | \"text\" | \"markdown\"\n    image_mode=\"placeholder\",      # Markdown image handling: \"placeholder\" | \"off\" | \"embed\"\n    extract_images=True,           # Extract image bytes + metadata (default: False)\n    image_output_dir=\"./images\",   # Write images and return name/path metadata (optional)\n    extract_links=True,            # Render [text](url) links in markdown output\n    keep_headers_footers=False,    # Keep running headers/footers in markdown output\n    extract_vector_graphics=False, # Opt-in shapes + merged H/V lines per page\n    extract_annotations=False,     # Include page annotations in structured output\n    extract_form_fields=False,      # Include AcroForm widget fields and values\n    extract_structure_tree=False,   # Include tagged-PDF logical structure\n    preserve_very_small_text=False, # Keep tiny text\n    extract_text_metadata=False,    # Opt in to MCID, font metrics, colors, char codes, and trailing_space_generated\n    password=None,                 # Password for protected documents\n    quiet=False,                   # Suppress progress output\n    num_workers=4,                 # Concurrent OCR workers\n)\n```\n\nWhen ``extract_images=True``, image extraction is enabled. ``image_output_dir``\nrequires that explicit opt-in and writes the extracted bytes to disk. Each\n``result.images`` entry includes its page bbox, intrinsic pixel dimensions, rotation,\nformat, ``name``, and ``path``. Valid source JPEGs are preserved, exact duplicates\nreuse one file, and JSON CLI output contains metadata only (no base64 image data).\n``image_mode`` controls Markdown presentation only and does not imply extraction.\nWith ``extract_images=False``, lightweight Markdown placement refs are still collected\nand ``result.images`` stays empty.\n\nWhen `extract_annotations` is enabled, each parsed page has an `annotations`\nlist containing the subtype, contents, author/title, PDF date strings,\nviewport-space rectangle and quadpoint rectangles, and URI for external link\nannotations. It is independent of `extract_links`, which controls Markdown\nlink rendering. The field is `None` when extraction is disabled.\n\nWhen ``extract_structure_tree=True``, each page has a ``structure_tree`` containing\nall tagged-PDF roots and recursive elements with type, ID, actual/alternate text,\ntitle, typed attributes, MCIDs, children, and referenced link annotations. Untagged\npages have an empty ``roots`` list; the field is ``None`` when disabled.\n\nEvery result also carries ``creator``/``producer`` from the PDF ``/Info``\ndictionary. With ``extract_document_metadata=True``, ``result.doc_meta`` adds a\nprovenance object with dates, PDF version/security, signature state,\nincremental-save markers, trailer ID comparison, the catalog's XMP packet\n(capped at 64 KiB; skipped for sources over 16 MiB), and source size. It is off by default because it streams the whole source file,\nand it is ``None`` for inputs converted from a non-PDF format. These document\nfields are API-only and do not alter default CLI JSON.\n\n## Parsing from Bytes\n\nPass raw PDF bytes directly — useful for web uploads or downloaded files:\n\n```python\nwith open(\"document.pdf\", \"rb\") as f:\n    result = parser.parse(f.read())\nprint(result.text)\n```\n\n## Worker Pool and Hard Timeouts\n\nPDFium is not thread-safe, so in-process parses serialize on a process-global\nlock. For high-throughput services, or cases where you need to enforce a timeout,\nrun parses in a pool of persistent worker processes instead:\n\n```python\nfrom liteparse import LiteParse, ParseTimeoutError\n\nparser = LiteParse(pool_size=4, parse_timeout=15)\nparser.warm_up()  # optional: pre-initialize workers (~60ms total)\n\ntry:\n    result = parser.parse(\"document.pdf\")\nexcept ParseTimeoutError as e:\n    print(f\"killed rogue document: {e.source} (deadline {e.timeout}s)\")\n\nparser.close()  # or use `with LiteParse(...) as parser:`\n```\n\n## Screenshots\n\nGenerate PNG screenshots of document pages:\n\n```python\nscreenshots = parser.screenshot(\"document.pdf\", page_numbers=[1, 2, 3])\nfor s in screenshots:\n    print(f\"Page {s.page_num}: {s.width}x{s.height}\")\n    with open(f\"page_{s.page_num}.png\", \"wb\") as f:\n        f.write(s.image_bytes)\n```\n\n## Document Complexity\n\nBefore committing to a full parse, check whether a document needs OCR or heavier\nprocessing. `is_complex` is a cheap, text-layer-only pass that returns one entry per page\nwith a `needs_ocr` verdict and the signals behind it — useful for routing documents to\ndifferent pipelines, rejecting ones you can't handle, or estimating cost.\n\n```python\nparser = LiteParse()\npages = parser.is_complex(\"document.pdf\")\n\nif any(p.needs_ocr for p in pages):\n    # Route to the OCR-enabled pipeline\n    result = parser.parse(\"document.pdf\")\nelse:\n    # Cheap path — skip OCR entirely\n    result = LiteParse(ocr_enabled=False).parse(\"document.pdf\")\n\n# Inspect why specific pages were flagged\nfor page in pages:\n    if page.needs_ocr:\n        print(f\"Page {page.page_number}: {', '.join(page.reasons)}\")\n```\n\n`reasons` is one of `\"scanned\"`, `\"no-text\"`, `\"sparse-text\"`, `\"embedded-images\"`,\n`\"garbled\"`, `\"vector-text\"`, or `\"annotation-text\"`. Raw bytes work here too.\n\n## Supported Formats\n\n- PDF (`.pdf`)\n- Microsoft Office (`.docx`, `.xlsx`, `.pptx`, etc.) — requires LibreOffice\n- OpenDocument (`.odt`, `.ods`, `.odp`) — requires LibreOffice\n- Images (`.png`, `.jpg`, `.tiff`, etc.)\n- And more!\n\n## CLI\n\nThe Python package includes the `lit` CLI:\n\n```bash\nlit parse document.pdf\nlit parse document.pdf --format json -o output.json\nlit parse document.pdf --format json --extract-annotations\nlit parse document.pdf --format json --extract-form-fields\nlit screenshot document.pdf -o ./screenshots\nlit batch-parse ./input ./output\nlit is-complex document.pdf\n```\n","packages/node/tsconfig.json":"{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"NodeNext\",\n    \"moduleResolution\": \"NodeNext\",\n    \"rootDir\": \"./src\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    // Type checking only — tsup owns emit (see tsup.config.ts). Keeping this\n    // noEmit prevents a bare `tsc` from producing an ESM-only dist/.\n    \"noEmit\": true\n  },\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n","packages/node/package-lock.json":"{\n  \"name\": \"@llamaindex/liteparse\",\n  \"version\": \"2.17.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"@llamaindex/liteparse\",\n      \"version\": \"2.17.0\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"commander\": \"^12.0.0\"\n      },\n      \"bin\": {\n        \"lit\": \"dist/cli.js\",\n        \"liteparse\": \"dist/cli.js\"\n      },\n      \"devDependencies\": {\n        \"@napi-rs/cli\": \"^2.18.4\",\n        \"@types/node\": \"^22.0.0\",\n        \"tsup\": \"^8.5.0\",\n        \"typescript\": \"~5.9.2\"\n      },\n      \"engines\": {\n        \"node\": \">=18.0.0\"\n      },\n      \"optionalDependencies\": {\n        \"@llamaindex/liteparse-darwin-arm64\": \"2.17.0\",\n        \"@llamaindex/liteparse-darwin-x64\": \"2.17.0\",\n        \"@llamaindex/liteparse-linux-arm64-gnu\": \"2.17.0\",\n        \"@llamaindex/liteparse-linux-x64-gnu\": \"2.17.0\",\n        \"@llamaindex/liteparse-linux-x64-musl\": \"2.17.0\",\n        \"@llamaindex/liteparse-win32-arm64-msvc\": \"2.17.0\",\n        \"@llamaindex/liteparse-win32-x64-msvc\": \"2.17.0\"\n      }\n    },\n    \"node_modules/@esbuild/aix-ppc64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz\",\n      \"integrity\": \"sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"aix\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz\",\n      \"integrity\": \"sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/freebsd-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/freebsd-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-arm\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz\",\n      \"integrity\": \"sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-ia32\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz\",\n      \"integrity\": \"sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-loong64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz\",\n      \"integrity\": \"sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-mips64el\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz\",\n      \"integrity\": \"sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==\",\n      \"cpu\": [\n        \"mips64el\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-ppc64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz\",\n      \"integrity\": \"sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-riscv64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz\",\n      \"integrity\": \"sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-s390x\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz\",\n      \"integrity\": \"sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/netbsd-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"netbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/netbsd-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"netbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openbsd-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openbsd-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openharmony-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openharmony\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/sunos-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"sunos\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-ia32\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz\",\n      \"integrity\": \"sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@jridgewell/gen-mapping\": {\n      \"version\": \"0.3.13\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz\",\n      \"integrity\": \"sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/sourcemap-codec\": \"^1.5.0\",\n        \"@jridgewell/trace-mapping\": \"^0.3.24\"\n      }\n    },\n    \"node_modules/@jridgewell/resolve-uri\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n      \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/sourcemap-codec\": {\n      \"version\": \"1.5.5\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz\",\n      \"integrity\": \"sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==\",\n      \"dev\": true\n    },\n    \"node_modules/@jridgewell/trace-mapping\": {\n      \"version\": \"0.3.31\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz\",\n      \"integrity\": \"sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/resolve-uri\": \"^3.1.0\",\n        \"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n      }\n    },\n    \"node_modules/@llamaindex/liteparse-darwin-arm64\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-darwin-arm64/-/liteparse-darwin-arm64-2.17.0.tgz\",\n      \"integrity\": \"sha512-ha3yTgVXVi3zucs28MnZ7Sb9jiX8Pw2SX04kuPbjUDpXh6xw+kBZ+5kZhnt5ok2SMYcHYOMJJv6ptbXBzmtg8A==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-darwin-x64\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-darwin-x64/-/liteparse-darwin-x64-2.17.0.tgz\",\n      \"integrity\": \"sha512-VsV2hzKMfHqJyW4j0FERGkaOulFSRYT9pvNH5S+oaSM8wns/5Vc1ayrtx0AcC297jL4ud1at3VVO4tqgVyALTg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-linux-arm64-gnu\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-linux-arm64-gnu/-/liteparse-linux-arm64-gnu-2.17.0.tgz\",\n      \"integrity\": \"sha512-XkMD8y5latC1klMWRvhWX6w71u6n6kCUHZtdgpY2hm4B+EfqyiBCTci6uxH+k1Bv1GjoE502U74/34YtbanrRQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-linux-x64-gnu\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-linux-x64-gnu/-/liteparse-linux-x64-gnu-2.17.0.tgz\",\n      \"integrity\": \"sha512-XFpDIDV/TX+8iHSVyClAWvTqY+NfZQld1Bfrg/vo/7FD7+uYzgkjrYxkrHXcBeqr2d8NkQ5j2Smv0TmrZ6ZzFQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-linux-x64-musl\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-linux-x64-musl/-/liteparse-linux-x64-musl-2.17.0.tgz\",\n      \"integrity\": \"sha512-tZWV2LMqHxA0jQObNjylKfJdx9289TrpG0aC5QWulsr5PfhIEWEG58aD20KWSY9ZFNkl7M/nD87X6UWil30VYw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-win32-arm64-msvc\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-win32-arm64-msvc/-/liteparse-win32-arm64-msvc-2.17.0.tgz\",\n      \"integrity\": \"sha512-vk+v3lncSUG/jG+bUZA6bHCp+FAJpUggRYvVCNuAR2PYW9bEWoNrC/PamaKKdKYCQWHoMXpl6biZ+t6NTq0l9Q==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-win32-x64-msvc\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-win32-x64-msvc/-/liteparse-win32-x64-msvc-2.17.0.tgz\",\n      \"integrity\": \"sha512-BKTY0nOrRwq11Jc8WL6Isv52b8EaRDmzZbEWevaPQCaJneh5WEntFbrm/GSYilkFS3qL086HR+9A9VN4ghtAcg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@napi-rs/cli\": {\n      \"version\": \"2.18.4\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/cli/-/cli-2.18.4.tgz\",\n      \"integrity\": \"sha512-SgJeA4df9DE2iAEpr3M2H0OKl/yjtg1BnRI5/JyowS71tUWhrfSu2LT0V3vlHET+g1hBVlrO60PmEXwUEKp8Mg==\",\n      \"dev\": true,\n      \"bin\": {\n        \"napi\": \"scripts/index.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 10\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/Brooooooklyn\"\n      }\n    },\n    \"node_modules/@napi-rs/lzma-linux-x64-gnu\": {\n      \"version\": \"1.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz\",\n      \"integrity\": \"sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^22.20 || ^24.12 || >=25\"\n      }\n    },\n    \"node_modules/@rollup/rollup-android-arm-eabi\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz\",\n      \"integrity\": \"sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-android-arm64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz\",\n      \"integrity\": \"sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-darwin-arm64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz\",\n      \"integrity\": \"sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-darwin-x64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz\",\n      \"integrity\": \"sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-freebsd-arm64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz\",\n      \"integrity\": \"sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-freebsd-x64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz\",\n      \"integrity\": \"sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm-gnueabihf\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz\",\n      \"integrity\": \"sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm-musleabihf\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz\",\n      \"integrity\": \"sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-loong64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-loong64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-ppc64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-ppc64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-riscv64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-riscv64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-s390x-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-x64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-x64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-openbsd-x64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz\",\n      \"integrity\": \"sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-openharmony-arm64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz\",\n      \"integrity\": \"sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openharmony\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-arm64-msvc\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz\",\n      \"integrity\": \"sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-ia32-msvc\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz\",\n      \"integrity\": \"sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-x64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-x64-msvc\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz\",\n      \"integrity\": \"sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@types/estree\": {\n      \"version\": \"1.0.9\",\n      \"resolved\": \"https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz\",\n      \"integrity\": \"sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"22.19.19\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-22.19.19.tgz\",\n      \"integrity\": \"sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"undici-types\": \"~6.21.0\"\n      }\n    },\n    \"node_modules/acorn\": {\n      \"version\": \"8.18.0\",\n      \"resolved\": \"https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz\",\n      \"integrity\": \"sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==\",\n      \"dev\": true,\n      \"bin\": {\n        \"acorn\": \"bin/acorn\"\n      },\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/any-promise\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz\",\n      \"integrity\": \"sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==\",\n      \"dev\": true\n    },\n    \"node_modules/bundle-require\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz\",\n      \"integrity\": \"sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"load-tsconfig\": \"^0.2.3\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"peerDependencies\": {\n        \"esbuild\": \">=0.18\"\n      }\n    },\n    \"node_modules/cac\": {\n      \"version\": \"6.7.14\",\n      \"resolved\": \"https://registry.npmjs.org/cac/-/cac-6.7.14.tgz\",\n      \"integrity\": \"sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/chokidar\": {\n      \"version\": \"4.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz\",\n      \"integrity\": \"sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"readdirp\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 14.16.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/commander\": {\n      \"version\": \"12.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-12.1.0.tgz\",\n      \"integrity\": \"sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==\",\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/confbox\": {\n      \"version\": \"0.1.8\",\n      \"resolved\": \"https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz\",\n      \"integrity\": \"sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==\",\n      \"dev\": true\n    },\n    \"node_modules/consola\": {\n      \"version\": \"3.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/consola/-/consola-3.4.2.tgz\",\n      \"integrity\": \"sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^14.18.0 || >=16.10.0\"\n      }\n    },\n    \"node_modules/debug\": {\n      \"version\": \"4.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.3.tgz\",\n      \"integrity\": \"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ms\": \"^2.1.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"supports-color\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/esbuild\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz\",\n      \"integrity\": \"sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==\",\n      \"dev\": true,\n      \"hasInstallScript\": true,\n      \"bin\": {\n        \"esbuild\": \"bin/esbuild\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"optionalDependencies\": {\n        \"@esbuild/aix-ppc64\": \"0.28.2\",\n        \"@esbuild/android-arm\": \"0.28.2\",\n        \"@esbuild/android-arm64\": \"0.28.2\",\n        \"@esbuild/android-x64\": \"0.28.2\",\n        \"@esbuild/darwin-arm64\": \"0.28.2\",\n        \"@esbuild/darwin-x64\": \"0.28.2\",\n        \"@esbuild/freebsd-arm64\": \"0.28.2\",\n        \"@esbuild/freebsd-x64\": \"0.28.2\",\n        \"@esbuild/linux-arm\": \"0.28.2\",\n        \"@esbuild/linux-arm64\": \"0.28.2\",\n        \"@esbuild/linux-ia32\": \"0.28.2\",\n        \"@esbuild/linux-loong64\": \"0.28.2\",\n        \"@esbuild/linux-mips64el\": \"0.28.2\",\n        \"@esbuild/linux-ppc64\": \"0.28.2\",\n        \"@esbuild/linux-riscv64\": \"0.28.2\",\n        \"@esbuild/linux-s390x\": \"0.28.2\",\n        \"@esbuild/linux-x64\": \"0.28.2\",\n        \"@esbuild/netbsd-arm64\": \"0.28.2\",\n        \"@esbuild/netbsd-x64\": \"0.28.2\",\n        \"@esbuild/openbsd-arm64\": \"0.28.2\",\n        \"@esbuild/openbsd-x64\": \"0.28.2\",\n        \"@esbuild/openharmony-arm64\": \"0.28.2\",\n        \"@esbuild/sunos-x64\": \"0.28.2\",\n        \"@esbuild/win32-arm64\": \"0.28.2\",\n        \"@esbuild/win32-ia32\": \"0.28.2\",\n        \"@esbuild/win32-x64\": \"0.28.2\"\n      }\n    },\n    \"node_modules/fdir\": {\n      \"version\": \"6.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz\",\n      \"integrity\": \"sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      },\n      \"peerDependencies\": {\n        \"picomatch\": \"^3 || ^4\"\n      },\n      \"peerDependenciesMeta\": {\n        \"picomatch\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/fix-dts-default-cjs-exports\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz\",\n      \"integrity\": \"sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"magic-string\": \"^0.30.17\",\n        \"mlly\": \"^1.7.4\",\n        \"rollup\": \"^4.34.8\"\n      }\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz\",\n      \"integrity\": \"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==\",\n      \"dev\": true,\n      \"hasInstallScript\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/joycon\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz\",\n      \"integrity\": \"sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/lilconfig\": {\n      \"version\": \"3.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz\",\n      \"integrity\": \"sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/antonk52\"\n      }\n    },\n    \"node_modules/lines-and-columns\": {\n      \"version\": \"1.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz\",\n      \"integrity\": \"sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==\",\n      \"dev\": true\n    },\n    \"node_modules/load-tsconfig\": {\n      \"version\": \"0.2.5\",\n      \"resolved\": \"https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz\",\n      \"integrity\": \"sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      }\n    },\n    \"node_modules/magic-string\": {\n      \"version\": \"0.30.21\",\n      \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz\",\n      \"integrity\": \"sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/sourcemap-codec\": \"^1.5.5\"\n      }\n    },\n    \"node_modules/mlly\": {\n      \"version\": \"1.8.2\",\n      \"resolved\": \"https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz\",\n      \"integrity\": \"sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"acorn\": \"^8.16.0\",\n        \"pathe\": \"^2.0.3\",\n        \"pkg-types\": \"^1.3.1\",\n        \"ufo\": \"^1.6.3\"\n      }\n    },\n    \"node_modules/ms\": {\n      \"version\": \"2.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n      \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n      \"dev\": true\n    },\n    \"node_modules/mz\": {\n      \"version\": \"2.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/mz/-/mz-2.7.0.tgz\",\n      \"integrity\": \"sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"any-promise\": \"^1.0.0\",\n        \"object-assign\": \"^4.0.1\",\n        \"thenify-all\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/object-assign\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz\",\n      \"integrity\": \"sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/pathe\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz\",\n      \"integrity\": \"sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==\",\n      \"dev\": true\n    },\n    \"node_modules/picocolors\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz\",\n      \"integrity\": \"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==\",\n      \"dev\": true\n    },\n    \"node_modules/picomatch\": {\n      \"version\": \"4.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz\",\n      \"integrity\": \"sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/jonschlinkert\"\n      }\n    },\n    \"node_modules/pirates\": {\n      \"version\": \"4.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz\",\n      \"integrity\": \"sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/pkg-types\": {\n      \"version\": \"1.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz\",\n      \"integrity\": \"sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"confbox\": \"^0.1.8\",\n        \"mlly\": \"^1.7.4\",\n        \"pathe\": \"^2.0.1\"\n      }\n    },\n    \"node_modules/postcss-load-config\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz\",\n      \"integrity\": \"sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"opencollective\",\n          \"url\": \"https://opencollective.com/postcss/\"\n        },\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/ai\"\n        }\n      ],\n      \"dependencies\": {\n        \"lilconfig\": \"^3.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 18\"\n      },\n      \"peerDependencies\": {\n        \"jiti\": \">=1.21.0\",\n        \"postcss\": \">=8.0.9\",\n        \"tsx\": \"^4.8.1\",\n        \"yaml\": \"^2.4.2\"\n      },\n      \"peerDependenciesMeta\": {\n        \"jiti\": {\n          \"optional\": true\n        },\n        \"postcss\": {\n          \"optional\": true\n        },\n        \"tsx\": {\n          \"optional\": true\n        },\n        \"yaml\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/readdirp\": {\n      \"version\": \"4.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz\",\n      \"integrity\": \"sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 14.18.0\"\n      },\n      \"funding\": {\n        \"type\": \"individual\",\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/resolve-from\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz\",\n      \"integrity\": \"sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/rollup\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz\",\n      \"integrity\": \"sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/estree\": \"1.0.9\"\n      },\n      \"bin\": {\n        \"rollup\": \"dist/bin/rollup\"\n      },\n      \"engines\": {\n        \"node\": \">=18.0.0\",\n        \"npm\": \">=8.0.0\"\n      },\n      \"optionalDependencies\": {\n        \"@napi-rs/lzma-linux-x64-gnu\": \"1.5.1\",\n        \"@rollup/rollup-android-arm-eabi\": \"4.62.4\",\n        \"@rollup/rollup-android-arm64\": \"4.62.4\",\n        \"@rollup/rollup-darwin-arm64\": \"4.62.4\",\n        \"@rollup/rollup-darwin-x64\": \"4.62.4\",\n        \"@rollup/rollup-freebsd-arm64\": \"4.62.4\",\n        \"@rollup/rollup-freebsd-x64\": \"4.62.4\",\n        \"@rollup/rollup-linux-arm-gnueabihf\": \"4.62.4\",\n        \"@rollup/rollup-linux-arm-musleabihf\": \"4.62.4\",\n        \"@rollup/rollup-linux-arm64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-arm64-musl\": \"4.62.4\",\n        \"@rollup/rollup-linux-loong64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-loong64-musl\": \"4.62.4\",\n        \"@rollup/rollup-linux-ppc64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-ppc64-musl\": \"4.62.4\",\n        \"@rollup/rollup-linux-riscv64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-riscv64-musl\": \"4.62.4\",\n        \"@rollup/rollup-linux-s390x-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-x64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-x64-musl\": \"4.62.4\",\n        \"@rollup/rollup-openbsd-x64\": \"4.62.4\",\n        \"@rollup/rollup-openharmony-arm64\": \"4.62.4\",\n        \"@rollup/rollup-win32-arm64-msvc\": \"4.62.4\",\n        \"@rollup/rollup-win32-ia32-msvc\": \"4.62.4\",\n        \"@rollup/rollup-win32-x64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-win32-x64-msvc\": \"4.62.4\",\n        \"fsevents\": \"~2.3.2\"\n      }\n    },\n    \"node_modules/source-map\": {\n      \"version\": \"0.7.6\",\n      \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz\",\n      \"integrity\": \"sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 12\"\n      }\n    },\n    \"node_modules/sucrase\": {\n      \"version\": \"3.35.1\",\n      \"resolved\": \"https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz\",\n      \"integrity\": \"sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/gen-mapping\": \"^0.3.2\",\n        \"commander\": \"^4.0.0\",\n        \"lines-and-columns\": \"^1.1.6\",\n        \"mz\": \"^2.7.0\",\n        \"pirates\": \"^4.0.1\",\n        \"tinyglobby\": \"^0.2.11\",\n        \"ts-interface-checker\": \"^0.1.9\"\n      },\n      \"bin\": {\n        \"sucrase\": \"bin/sucrase\",\n        \"sucrase-node\": \"bin/sucrase-node\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      }\n    },\n    \"node_modules/sucrase/node_modules/commander\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-4.1.1.tgz\",\n      \"integrity\": \"sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/thenify\": {\n      \"version\": \"3.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz\",\n      \"integrity\": \"sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"any-promise\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/thenify-all\": {\n      \"version\": \"1.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz\",\n      \"integrity\": \"sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"thenify\": \">= 3.1.0 < 4\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8\"\n      }\n    },\n    \"node_modules/tinyexec\": {\n      \"version\": \"0.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz\",\n      \"integrity\": \"sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==\",\n      \"dev\": true\n    },\n    \"node_modules/tinyglobby\": {\n      \"version\": \"0.2.17\",\n      \"resolved\": \"https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz\",\n      \"integrity\": \"sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fdir\": \"^6.5.0\",\n        \"picomatch\": \"^4.0.4\"\n      },\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/SuperchupuDev\"\n      }\n    },\n    \"node_modules/tree-kill\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz\",\n      \"integrity\": \"sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==\",\n      \"dev\": true,\n      \"bin\": {\n        \"tree-kill\": \"cli.js\"\n      }\n    },\n    \"node_modules/ts-interface-checker\": {\n      \"version\": \"0.1.13\",\n      \"resolved\": \"https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz\",\n      \"integrity\": \"sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==\",\n      \"dev\": true\n    },\n    \"node_modules/tsup\": {\n      \"version\": \"8.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz\",\n      \"integrity\": \"sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"bundle-require\": \"^5.1.0\",\n        \"cac\": \"^6.7.14\",\n        \"chokidar\": \"^4.0.3\",\n        \"consola\": \"^3.4.0\",\n        \"debug\": \"^4.4.0\",\n        \"esbuild\": \"^0.27.0\",\n        \"fix-dts-default-cjs-exports\": \"^1.0.0\",\n        \"joycon\": \"^3.1.1\",\n        \"picocolors\": \"^1.1.1\",\n        \"postcss-load-config\": \"^6.0.1\",\n        \"resolve-from\": \"^5.0.0\",\n        \"rollup\": \"^4.34.8\",\n        \"source-map\": \"^0.7.6\",\n        \"sucrase\": \"^3.35.0\",\n        \"tinyexec\": \"^0.3.2\",\n        \"tinyglobby\": \"^0.2.11\",\n        \"tree-kill\": \"^1.2.2\"\n      },\n      \"bin\": {\n        \"tsup\": \"dist/cli-default.js\",\n        \"tsup-node\": \"dist/cli-node.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"peerDependencies\": {\n        \"@microsoft/api-extractor\": \"^7.36.0\",\n        \"@swc/co","packages/node/README.md":"# LiteParse Node.js\n\nNode.js/TypeScript bindings for [LiteParse](https://github.com/run-llama/liteparse) — fast, lightweight PDF and document parsing with spatial text extraction.\n\n## Installation\n\n```bash\nnpm i @llamaindex/liteparse\n```\n\nThis also installs the `lit` CLI command (use `npm i -g` for global access).\n\n## Quick Start\n\n```typescript\nimport { LiteParse } from '@llamaindex/liteparse';\n\nconst parser = new LiteParse();\nconst result = await parser.parse('document.pdf');\nconsole.log(result.text);\nconsole.log(`Source document pages: ${result.totalPages}`);\n\n// Access structured data\nfor (const page of result.pages) {\n  console.log(`Page ${page.pageNum}: ${page.textItems.length} text items`);\n}\n```\n\nCommonJS is supported as well:\n\n```javascript\nconst { LiteParse } = require('@llamaindex/liteparse');\n\n(async () => {\n  const parser = new LiteParse();\n  const result = await parser.parse('document.pdf');\n  console.log(result.text);\n})();\n```\n\n### Bounded-memory parsing\n\nFor documents with many text items, consume page batches without retaining\nearlier results:\n\n```typescript\nconst parser = new LiteParse();\nfor await (const batch of parser.parseBatches('large.pdf', { batchSize: 20 })) {\n  await processPages(batch.result.pages);\n}\n```\n\nEach batch is an ordinary parse result covering `batch.startPage` through\n`batch.endPage`, and becomes collectible as soon as you advance the iterator.\nA non-PDF source is converted once, not once per batch.\n\nCross-page passes only see the pages in their own batch, so repeated\nheader/footer removal and image deduplication are batch-local and the output\ncan differ from `parse()`. Prefer `parse()` unless the size of the\nmaterialized result is the problem.\n\n## Markdown Output\n\nLiteParse can render documents directly to Markdown including headings, tables, lists,\nimages, and links reconstructed from the spatial layout. Great for feeding LLMs\nand RAG pipelines. The rendered Markdown is returned on `result.text`:\n\n```typescript\nconst parser = new LiteParse({\n  outputFormat: 'markdown',     // \"json\" | \"text\" | \"markdown\"\n  imageMode: 'placeholder',     // \"placeholder\" | \"off\" | \"embed\"\n  extractLinks: true,           // render [text](url) link syntax (default: true)\n});\nconst result = await parser.parse('document.pdf');\nconsole.log(result.text); // rendered Markdown\n```\n\n> Reconstruction quality varies with document complexity.\n\n## Configuration\n\nAll options are passed to the constructor:\n\n```typescript\nconst parser = new LiteParse({\n  ocrEnabled: true,              // Enable OCR (default: true)\n  ocrLanguage: 'eng',           // Tesseract language code\n  ocrServerUrl: undefined,       // HTTP OCR server URL (optional)\n  tessdataPath: undefined,       // Path to tessdata directory (optional)\n  maxPages: 1000,                // Max pages to parse\n  targetPages: '1-5,10',        // Specific pages (optional)\n  extractScreenshots: false,    // Return parsed pages as PNG buffers\n  continueOnPageError: false,   // Skip broken pages and return pageErrors\n  dpi: 150,                      // Rendering DPI\n  outputFormat: 'json',          // \"json\" | \"text\" | \"markdown\"\n  imageMode: 'placeholder',      // Markdown image handling: \"placeholder\" | \"off\" | \"embed\"\n  extractImages: true,           // Extract image bytes + metadata (default: false)\n  imageOutputDir: './images',    // Write images and return name/path metadata (optional)\n  extractLinks: true,            // Render [text](url) links in markdown output\n  keepHeadersFooters: false,     // Keep running headers/footers in markdown output\n  extractVectorGraphics: false,  // Opt-in shapes + merged H/V lines per page\n  extractAnnotations: false,     // Include page annotations in structured output\n  extractFormFields: false,      // Include AcroForm widget fields and values\n  extractStructureTree: false,   // Include tagged-PDF logical structure\n  extractXfaPackets: false,      // Include raw XFA packets (name + XML content)\n  extractContentBounds: false,   // Include per-page contentBounds union bbox\n  detectScreenshotRects: false,  // Detect solid rects/lines in screenshots\n  preserveVerySmallText: false,  // Keep tiny text\n  extractTextMetadata: false,    // Opt in to MCID, font metrics, colors, char codes, and trailingSpaceGenerated\n  password: undefined,           // Password for protected documents\n  quiet: false,                  // Suppress progress output\n  numWorkers: 4,                 // Concurrent OCR workers\n});\n```\n\nWhen `extractImages` is true, image extraction is enabled. `imageOutputDir` requires\nthat explicit opt-in and writes the extracted bytes to disk. Each\n`result.images` entry includes its page bbox, intrinsic pixel dimensions, rotation,\nformat, `name`, and `path`. Valid source JPEGs are preserved, exact duplicates reuse\none file, and JSON CLI output contains metadata only (no base64 image data).\n`imageMode` controls Markdown presentation only and does not imply extraction. With\n`extractImages: false`, lightweight Markdown placement refs are still collected and\n`result.images` stays empty.\n\nThe Node CLI uses the same snake_case JSON schema as the Rust CLI; camelCase is\nreserved for the programmatic Node API.\n\nWhen `extractAnnotations` is enabled, each parsed page has an `annotations`\narray containing the subtype, contents, author/title, PDF date strings,\nviewport-space rectangle and quadpoint rectangles, and URI for external link\nannotations. It is independent of `extractLinks`, which controls Markdown link\nrendering. The field is omitted when extraction is disabled.\n\nWhen `extractStructureTree` is enabled, each page has a `structureTree` containing\nall tagged-PDF roots and recursive elements with type, ID, actual/alternate text,\ntitle, typed attributes, MCIDs, children, and referenced link annotations. Untagged\npages have an empty `roots` array; the field is omitted when disabled.\n\nEvery result also carries the document's `/Info` `creator`/`producer` when\npresent. With `extractDocumentMetadata`, `result.docMeta` adds a provenance\nobject with dates, PDF version/security, signature state, incremental-save\nmarkers, trailer ID comparison, the catalog's XMP packet (capped at 64 KiB;\nskipped for sources over 16 MiB), and source size — off by default since it\nstreams the whole file, and absent for inputs converted from a non-PDF\nformat. These are API-level only, not in CLI JSON. With `extractContentBounds`\neach page carries a `contentBounds` union bbox of its top-level content\nobjects. With `extractXfaPackets`, `result.xfaPackets` lists each raw XFA\npacket (index, name, content length, XML content); non-XFA documents yield an\nempty array. Screenshots draw form-field appearances into the raster and\nreport `isSolidFill` per page, plus detected solid `rects` when\n`detectScreenshotRects` is enabled.\n\n## Parsing from Bytes\n\nPass a `Buffer` or `Uint8Array` directly — useful for HTTP responses or in-memory data:\n\n```typescript\nimport { readFile } from 'fs/promises';\n\nconst pdfBytes = await readFile('document.pdf');\nconst result = await parser.parse(pdfBytes);\nconsole.log(result.text);\n```\n\n## Worker Pool and Hard Timeouts\n\nPDFium is not thread-safe, so all parses inside one process serialize on a\nprocess-global lock — even `Promise.all` over multiple `parse()` calls runs\nthem one at a time.\n\nFor high-throughput services, or for cases when you need to enforce a\nruntime timeout, run parses in a pool of persistent worker processes instead:\n\n```typescript\nimport { LiteParse, ParseTimeoutError } from '@llamaindex/liteparse';\n\nconst parser = new LiteParse({ poolSize: 4, parseTimeoutMs: 15_000 });\nawait parser.warmUp(); // optional: pre-initialize workers (~45ms total)\n\ntry {\n  const result = await parser.parse('document.pdf');\n} catch (e) {\n  if (e instanceof ParseTimeoutError) {\n    console.warn(`killed rogue document: ${e.source} (deadline ${e.timeoutMs}ms)`);\n  }\n}\n\nparser.close(); // frees workers immediately; an idle pool never blocks exit\n```\n\n## Screenshots\n\nGenerate PNG screenshots of document pages:\n\n```typescript\nconst screenshots = parser.screenshot('document.pdf', [1, 2, 3]);\nfor (const s of screenshots) {\n  console.log(`Page ${s.pageNum}: ${s.width}x${s.height}`);\n  // s.imageBuffer contains PNG bytes\n}\n```\n\n## Document Complexity\n\nBefore committing to a full parse, check whether a document needs OCR or heavier\nprocessing. `isComplex` is a cheap, text-layer-only pass that returns one entry per page\nwith a `needsOcr` verdict and the signals behind it — useful for routing documents to\ndifferent pipelines, rejecting ones you can't handle, or estimating cost.\n\n```typescript\nconst parser = new LiteParse();\nconst pages = await parser.isComplex('document.pdf');\n\nif (pages.some((p) => p.needsOcr)) {\n  // Route to the OCR-enabled pipeline\n  const result = await parser.parse('document.pdf');\n} else {\n  // Cheap path — skip OCR entirely\n  const result = await new LiteParse({ ocrEnabled: false }).parse('document.pdf');\n}\n\n// Inspect why specific pages were flagged\nfor (const page of pages.filter((p) => p.needsOcr)) {\n  console.log(`Page ${page.pageNumber}: ${page.reasons.join(', ')}`);\n}\n```\n\n`reasons` is one of `\"scanned\"`, `\"no-text\"`, `\"sparse-text\"`, `\"embedded-images\"`,\n`\"garbled\"`, `\"vector-text\"`, or `\"annotation-text\"`. Raw bytes work here too.\n\n## Supported Formats\n\n- PDF (`.pdf`)\n- Microsoft Office (`.docx`, `.xlsx`, `.pptx`, etc.) — requires LibreOffice\n- OpenDocument (`.odt`, `.ods`, `.odp`) — requires LibreOffice\n- Images (`.png`, `.jpg`, `.tiff`, etc.)\n- And more!\n\n## CLI\n\nThe npm package includes the `lit` CLI:\n\n```bash\nlit parse document.pdf\nlit parse document.pdf --format json -o output.json\nlit parse document.pdf --format json --extract-annotations\nlit parse document.pdf --format json --extract-form-fields\nlit screenshot document.pdf -o ./screenshots\nlit batch-parse ./input ./output\nlit is-complex document.pdf\n```\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/run-llama/liteparse/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# LiteParse - Agent Documentation\n\n> This file provides comprehensive context for AI coding agents working on this codebase.\n\n## Project Overview\n\n**LiteParse** is an open-source PDF parsing library written in **Rust**, focused on fast, lightweight document processing with spatial text extraction. It runs entirely locally with zero cloud dependencies by default.\n\nLanguage bindings are provided for **Node.js/TypeScript** (via napi-rs), **Python** (via PyO3), and **WebAssembly** (via wasm-bindgen).\n\n### Key Capabilities\n- **Spatial text extraction** with precise bounding boxes\n- **Flexible OCR** (built-in Tesseract or pluggable HTTP servers)\n- **Multi-format support** (PDFs, DOCX, XLSX, PPTX, images via conversion)\n- **Multi-language bindings**: Rust, Node.js/TypeScript, Python, Browser (WASM)\n- **CLI** available from all installation methods (`cargo`, `npm`, `pip`)\n\n## Directory Structure\n\n```\nliteparse/\n├── crates/\n│   ├── liteparse/          # Core Rust library + CLI binary\n│   │   └── src/\n│   │       ├── main.rs         # CLI entry point (clap)\n│   │       ├── lib.rs          # Library root\n│   │       ├── parser.rs       # LiteParse orchestrator\n│   │       ├── config.rs       # Configuration types and defaults\n│   │       ├── types.rs        # Core data types (ParseResult, TextItem, etc.)\n│   │       ├── projection.rs   # Spatial grid projection (layout reconstruction)\n│   │       ├── extract.rs      # Raw text extraction from PDFium\n│   │       ├── render.rs       # Page rendering / screenshots\n│   │       ├── conversion.rs   # Non-PDF format conversion (LibreOffice, image/resvg/usvg rust crates)\n│   │       ├── ocr_merge.rs    # Merging OCR results with native text\n│   │       ├── error.rs        # Error types\n│   │       ├── ocr/            # OCR engine implementations\n│   │       │   ├── mod.rs          # OcrEngine trait\n│   │       │   ├── tesseract.rs    # Built-in Tesseract OCR\n│   │       │   └── http_simple.rs  # HTTP OCR server client\n│   │       └── output/         # Output formatters\n│   │           ├── mod.rs\n│   │           ├── json.rs\n│   │           └── text.rs\n│   ├── liteparse-napi/     # Node.js bindings (napi-rs)\n│   ├── liteparse-python/   # Python bindings (PyO3 / maturin)\n│   ├── liteparse-wasm/     # WASM bindings (wasm-bindgen)\n│   ├── pdfium/             # Rust wrapper around PDFium C API\n│   └── pdfium-sys/         # PDFium FFI (C → Rust) bindings\n├── packages/\n│   ├── node/               # npm package: TS wrapper + CLI around native binary\n│   │   └── src/\n│   │       ├── lib.ts          # Public LiteParse class for Node.js\n│   │       ├── cli.ts          # CLI entry point (commander)\n│   │       └── native.ts       # Native binary loader\n│   ├── python/             # PyPI package: Python wrapper around native binary\n│   │   └── liteparse/\n│   │       ├── __init__.py\n│   │       ├── parser.py       # Public LiteParse class for Python\n│   │       ├── types.py        # Python dataclass types\n│   │       └── cli.py          # CLI entry point\n│   └── wasm/               # WASM npm package\n├── ocr/                    # Example OCR server implementations\n│   ├── easyocr/            # EasyOCR wrapper server\n│   └── paddleocr/          # PaddleOCR wrapper server\n└── Cargo.toml              # Workspace root\n```\n\n## Data Flow\n\n1. **Input**: File path or raw bytes received (any supported format)\n2. **Conversion** (if needed): Non-PDF formats converted to PDF via LibreOffice and image/resvg/usvg rust crates\n3. **PDF Loading**: PDFium extracts text items, images, metadata\n4. **OCR** (if enabled): Pages rendered and OCR'd for text-sparse areas\n5. **Grid Projection**: Spatial reconstruction of text layout using anchor system\n6. **Post-processing**: Bounding boxes, text cleanup\n7. **Output**: Formatted as JSON or plain text\n\n## Key Design Decisions\n\n### 1. Rust Core with Language Bindings\nThe core parsing logic is written in Rust for performance and safety. Language-specific crates expose the same API surface:\n- `liteparse-napi` → Node.js via napi-rs\n- `liteparse-python` → Python via PyO3/maturin\n- `liteparse-wasm` → Browser via wasm-bindgen\n\nEach binding crate is thin — it wraps the core `liteparse` crate's types and async API.\n\n### 2. OCR Engine Trait\nOCR functionality uses a trait-based abstraction (`OcrEngine`). This allows:\n- Built-in Tesseract (default, compiled in via `tesseract-rs`)\n- HTTP OCR server client for remote engines\n- Custom JS-side OCR in the WASM build via a callback interface\n\n### 3. Spatial Grid Projection\nThe most complex (and important!) part of the codebase (`crates/liteparse/src/projection.rs`). Uses:\n- **Anchor-based layout**: Tracks text alignment (left, right, center, floating)\n- **Forward anchors**: Carry alignment information between lines\n- **Column detection**: Identifies multi-column layouts\n- **Rotation handling**: Transforms 90°, 180°, 270° rotated text to correct reading order\n- **OCR merging**: Combines native PDF text with OCR results, preserving confidence scores and source flags in output\n\n### 4. Selective OCR\nOCR only runs on embedded images where text extraction failed, not the entire document. This balances accuracy with performance.\n\n### 5. Configuration\nUses a default-first approach where users only override what they need. See `crates/liteparse/src/config.rs` for defaults.\n\n### 6. Format Conversion via External Tools\nRather than implementing format parsers, LiteParse converts office file formats using system tools (LibreOffice) into PDF. This provides broad format support with minimal code.\n\n## Common Tasks\n\n### Adding a New Output Format\n1. Create new file in `crates/liteparse/src/output/`\n2. Add variant to `OutputFormat` enum in `config.rs`\n3. Wire it up in `main.rs` and binding crates\n\n### Adding a New OCR Engine\n1. Implement `OcrEngine` trait in `crates/liteparse/src/ocr/`\n2. Add initialization logic in `parser.rs`\n3. Add configuration options in `config.rs`\n\n### Modifying Text Extraction Logic\nKey files in `crates/liteparse/src/`:\n- `projection.rs` — Layout reconstruction (most complex)\n- `extract.rs` — Raw text item extraction from PDFium\n- `text_clip.rs` — Shared glyph visibility: PDFium clip points already include the object matrix; compose only ancestor form matrices and inherit ancestor clips.\n- `ocr_merge.rs` — Merging OCR and native text\n\n### Adding CLI Options\n1. Add field to `LiteParseConfig` in `config.rs`\n2. Add clap arg in `main.rs`\n3. Wire through `parser.rs`\n4. Expose in binding crates (`liteparse-napi`, `liteparse-python`, `liteparse-wasm`)\n\n### Adding / Modifying Node.js Wrapper\n- Edit `packages/node/src/lib.ts` for library API changes\n- Edit `packages/node/src/cli.ts` for CLI changes\n- The native binary interface is defined in `packages/node/src/native.ts`\n\n### Adding / Modifying Python Wrapper\n- Edit `packages/python/liteparse/parser.py` for library API changes\n- Types are in `packages/python/liteparse/types.py`\n- CLI entry point is `packages/python/liteparse/cli.py`\n\n## Key Dependencies\n\n| Dependency | Purpose |\n|------------|---------|\n| `pdfium` (C library) | PDF text extraction and rendering |\n| `tesseract-rs` | Built-in OCR engine (optional, via `tesseract` feature) |\n| `clap` | CLI framework |\n| `serde` / `serde_json` | Serialization |\n| `tokio` | Async runtime |\n| `reqwest` | HTTP client (for OCR server) |\n| `image` | Image processing (PNG encoding) |\n| `napi-rs` | Node.js native bindings |\n| `pyo3` / `maturin` | Python native bindings |\n| `wasm-bindgen` | WASM bindings |\n\n## Entry Points\n\n- **Rust CLI**: `crates/liteparse/src/main.rs`\n- **Rust Library**: `crates/liteparse/src/lib.rs` → `parser.rs` contains `LiteParse` struct\n- **Node.js**: `packages/node/src/lib.ts` exports `LiteParse` class\n- **Python**: `packages/python/liteparse/parser.py` exports `LiteParse` class\n- **WASM**: `crates/liteparse-wasm/` exposes `LiteParse` via wasm-bindgen\n\n## Related Documentation\n\n- [User-facing documentation](README.md)\n- [OCR API Specification](OCR_API_SPEC.md)\n- [WASM package README](packages/wasm/README.md)\n- [Python package README](packages/python/README.md)\n- [OCR server examples](ocr/README.md)\n","isInternal":false,"tokens":2064,"sizeBytes":8567},{"name":"package-lock.json","path":"packages/node/package-lock.json","rawUrl":"https://raw.githubusercontent.com/run-llama/liteparse/HEAD/packages/node/package-lock.json","title":"Node Skill","category":"anthropic-skill","format":"json","content":"{\n  \"name\": \"@llamaindex/liteparse\",\n  \"version\": \"2.17.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"@llamaindex/liteparse\",\n      \"version\": \"2.17.0\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"commander\": \"^12.0.0\"\n      },\n      \"bin\": {\n        \"lit\": \"dist/cli.js\",\n        \"liteparse\": \"dist/cli.js\"\n      },\n      \"devDependencies\": {\n        \"@napi-rs/cli\": \"^2.18.4\",\n        \"@types/node\": \"^22.0.0\",\n        \"tsup\": \"^8.5.0\",\n        \"typescript\": \"~5.9.2\"\n      },\n      \"engines\": {\n        \"node\": \">=18.0.0\"\n      },\n      \"optionalDependencies\": {\n        \"@llamaindex/liteparse-darwin-arm64\": \"2.17.0\",\n        \"@llamaindex/liteparse-darwin-x64\": \"2.17.0\",\n        \"@llamaindex/liteparse-linux-arm64-gnu\": \"2.17.0\",\n        \"@llamaindex/liteparse-linux-x64-gnu\": \"2.17.0\",\n        \"@llamaindex/liteparse-linux-x64-musl\": \"2.17.0\",\n        \"@llamaindex/liteparse-win32-arm64-msvc\": \"2.17.0\",\n        \"@llamaindex/liteparse-win32-x64-msvc\": \"2.17.0\"\n      }\n    },\n    \"node_modules/@esbuild/aix-ppc64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz\",\n      \"integrity\": \"sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"aix\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz\",\n      \"integrity\": \"sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/freebsd-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/freebsd-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-arm\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz\",\n      \"integrity\": \"sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-ia32\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz\",\n      \"integrity\": \"sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-loong64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz\",\n      \"integrity\": \"sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-mips64el\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz\",\n      \"integrity\": \"sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==\",\n      \"cpu\": [\n        \"mips64el\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-ppc64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz\",\n      \"integrity\": \"sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-riscv64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz\",\n      \"integrity\": \"sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-s390x\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz\",\n      \"integrity\": \"sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/netbsd-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"netbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/netbsd-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"netbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openbsd-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openbsd-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openharmony-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openharmony\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/sunos-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"sunos\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-ia32\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz\",\n      \"integrity\": \"sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@jridgewell/gen-mapping\": {\n      \"version\": \"0.3.13\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz\",\n      \"integrity\": \"sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/sourcemap-codec\": \"^1.5.0\",\n        \"@jridgewell/trace-mapping\": \"^0.3.24\"\n      }\n    },\n    \"node_modules/@jridgewell/resolve-uri\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n      \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/sourcemap-codec\": {\n      \"version\": \"1.5.5\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz\",\n      \"integrity\": \"sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==\",\n      \"dev\": true\n    },\n    \"node_modules/@jridgewell/trace-mapping\": {\n      \"version\": \"0.3.31\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz\",\n      \"integrity\": \"sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/resolve-uri\": \"^3.1.0\",\n        \"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n      }\n    },\n    \"node_modules/@llamaindex/liteparse-darwin-arm64\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-darwin-arm64/-/liteparse-darwin-arm64-2.17.0.tgz\",\n      \"integrity\": \"sha512-ha3yTgVXVi3zucs28MnZ7Sb9jiX8Pw2SX04kuPbjUDpXh6xw+kBZ+5kZhnt5ok2SMYcHYOMJJv6ptbXBzmtg8A==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-darwin-x64\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-darwin-x64/-/liteparse-darwin-x64-2.17.0.tgz\",\n      \"integrity\": \"sha512-VsV2hzKMfHqJyW4j0FERGkaOulFSRYT9pvNH5S+oaSM8wns/5Vc1ayrtx0AcC297jL4ud1at3VVO4tqgVyALTg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-linux-arm64-gnu\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-linux-arm64-gnu/-/liteparse-linux-arm64-gnu-2.17.0.tgz\",\n      \"integrity\": \"sha512-XkMD8y5latC1klMWRvhWX6w71u6n6kCUHZtdgpY2hm4B+EfqyiBCTci6uxH+k1Bv1GjoE502U74/34YtbanrRQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-linux-x64-gnu\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-linux-x64-gnu/-/liteparse-linux-x64-gnu-2.17.0.tgz\",\n      \"integrity\": \"sha512-XFpDIDV/TX+8iHSVyClAWvTqY+NfZQld1Bfrg/vo/7FD7+uYzgkjrYxkrHXcBeqr2d8NkQ5j2Smv0TmrZ6ZzFQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-linux-x64-musl\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-linux-x64-musl/-/liteparse-linux-x64-musl-2.17.0.tgz\",\n      \"integrity\": \"sha512-tZWV2LMqHxA0jQObNjylKfJdx9289TrpG0aC5QWulsr5PfhIEWEG58aD20KWSY9ZFNkl7M/nD87X6UWil30VYw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-win32-arm64-msvc\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-win32-arm64-msvc/-/liteparse-win32-arm64-msvc-2.17.0.tgz\",\n      \"integrity\": \"sha512-vk+v3lncSUG/jG+bUZA6bHCp+FAJpUggRYvVCNuAR2PYW9bEWoNrC/PamaKKdKYCQWHoMXpl6biZ+t6NTq0l9Q==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-win32-x64-msvc\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-win32-x64-msvc/-/liteparse-win32-x64-msvc-2.17.0.tgz\",\n      \"integrity\": \"sha512-BKTY0nOrRwq11Jc8WL6Isv52b8EaRDmzZbEWevaPQCaJneh5WEntFbrm/GSYilkFS3qL086HR+9A9VN4ghtAcg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@napi-rs/cli\": {\n      \"version\": \"2.18.4\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/cli/-/cli-2.18.4.tgz\",\n      \"integrity\": \"sha512-SgJeA4df9DE2iAEpr3M2H0OKl/yjtg1BnRI5/JyowS71tUWhrfSu2LT0V3vlHET+g1hBVlrO60PmEXwUEKp8Mg==\",\n      \"dev\": true,\n      \"bin\": {\n        \"napi\": \"scripts/index.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 10\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/Brooooooklyn\"\n      }\n    },\n    \"node_modules/@napi-rs/lzma-linux-x64-gnu\": {\n      \"version\": \"1.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz\",\n      \"integrity\": \"sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^22.20 || ^24.12 || >=25\"\n      }\n    },\n    \"node_modules/@rollup/rollup-android-arm-eabi\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz\",\n      \"integrity\": \"sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-android-arm64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz\",\n      \"integrity\": \"sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-darwin-arm64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz\",\n      \"integrity\": \"sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-darwin-x64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz\",\n      \"integrity\": \"sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-freebsd-arm64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz\",\n      \"integrity\": \"sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-freebsd-x64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz\",\n      \"integrity\": \"sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm-gnueabihf\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz\",\n      \"integrity\": \"sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm-musleabihf\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz\",\n      \"integrity\": \"sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-loong64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-loong64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-ppc64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-ppc64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-riscv64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-riscv64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-s390x-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-x64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-x64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-openbsd-x64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz\",\n      \"integrity\": \"sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-openharmony-arm64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz\",\n      \"integrity\": \"sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openharmony\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-arm64-msvc\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz\",\n      \"integrity\": \"sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-ia32-msvc\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz\",\n      \"integrity\": \"sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-x64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-x64-msvc\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz\",\n      \"integrity\": \"sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@types/estree\": {\n      \"version\": \"1.0.9\",\n      \"resolved\": \"https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz\",\n      \"integrity\": \"sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"22.19.19\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-22.19.19.tgz\",\n      \"integrity\": \"sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"undici-types\": \"~6.21.0\"\n      }\n    },\n    \"node_modules/acorn\": {\n      \"version\": \"8.18.0\",\n      \"resolved\": \"https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz\",\n      \"integrity\": \"sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==\",\n      \"dev\": true,\n      \"bin\": {\n        \"acorn\": \"bin/acorn\"\n      },\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/any-promise\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz\",\n      \"integrity\": \"sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==\",\n      \"dev\": true\n    },\n    \"node_modules/bundle-require\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz\",\n      \"integrity\": \"sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"load-tsconfig\": \"^0.2.3\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"peerDependencies\": {\n        \"esbuild\": \">=0.18\"\n      }\n    },\n    \"node_modules/cac\": {\n      \"version\": \"6.7.14\",\n      \"resolved\": \"https://registry.npmjs.org/cac/-/cac-6.7.14.tgz\",\n      \"integrity\": \"sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/chokidar\": {\n      \"version\": \"4.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz\",\n      \"integrity\": \"sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"readdirp\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 14.16.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/commander\": {\n      \"version\": \"12.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-12.1.0.tgz\",\n      \"integrity\": \"sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==\",\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/confbox\": {\n      \"version\": \"0.1.8\",\n      \"resolved\": \"https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz\",\n      \"integrity\": \"sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==\",\n      \"dev\": true\n    },\n    \"node_modules/consola\": {\n      \"version\": \"3.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/consola/-/consola-3.4.2.tgz\",\n      \"integrity\": \"sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^14.18.0 || >=16.10.0\"\n      }\n    },\n    \"node_modules/debug\": {\n      \"version\": \"4.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.3.tgz\",\n      \"integrity\": \"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ms\": \"^2.1.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"supports-color\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/esbuild\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz\",\n      \"integrity\": \"sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==\",\n      \"dev\": true,\n      \"hasInstallScript\": true,\n      \"bin\": {\n        \"esbuild\": \"bin/esbuild\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"optionalDependencies\": {\n        \"@esbuild/aix-ppc64\": \"0.28.2\",\n        \"@esbuild/android-arm\": \"0.28.2\",\n        \"@esbuild/android-arm64\": \"0.28.2\",\n        \"@esbuild/android-x64\": \"0.28.2\",\n        \"@esbuild/darwin-arm64\": \"0.28.2\",\n        \"@esbuild/darwin-x64\": \"0.28.2\",\n        \"@esbuild/freebsd-arm64\": \"0.28.2\",\n        \"@esbuild/freebsd-x64\": \"0.28.2\",\n        \"@esbuild/linux-arm\": \"0.28.2\",\n        \"@esbuild/linux-arm64\": \"0.28.2\",\n        \"@esbuild/linux-ia32\": \"0.28.2\",\n        \"@esbuild/linux-loong64\": \"0.28.2\",\n        \"@esbuild/linux-mips64el\": \"0.28.2\",\n        \"@esbuild/linux-ppc64\": \"0.28.2\",\n        \"@esbuild/linux-riscv64\": \"0.28.2\",\n        \"@esbuild/linux-s390x\": \"0.28.2\",\n        \"@esbuild/linux-x64\": \"0.28.2\",\n        \"@esbuild/netbsd-arm64\": \"0.28.2\",\n        \"@esbuild/netbsd-x64\": \"0.28.2\",\n        \"@esbuild/openbsd-arm64\": \"0.28.2\",\n        \"@esbuild/openbsd-x64\": \"0.28.2\",\n        \"@esbuild/openharmony-arm64\": \"0.28.2\",\n        \"@esbuild/sunos-x64\": \"0.28.2\",\n        \"@esbuild/win32-arm64\": \"0.28.2\",\n        \"@esbuild/win32-ia32\": \"0.28.2\",\n        \"@esbuild/win32-x64\": \"0.28.2\"\n      }\n    },\n    \"node_modules/fdir\": {\n      \"version\": \"6.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz\",\n      \"integrity\": \"sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      },\n      \"peerDependencies\": {\n        \"picomatch\": \"^3 || ^4\"\n      },\n      \"peerDependenciesMeta\": {\n        \"picomatch\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/fix-dts-default-cjs-exports\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz\",\n      \"integrity\": \"sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"magic-string\": \"^0.30.17\",\n        \"mlly\": \"^1.7.4\",\n        \"rollup\": \"^4.34.8\"\n      }\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz\",\n      \"integrity\": \"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==\",\n      \"dev\": true,\n      \"hasInstallScript\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/joycon\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz\",\n      \"integrity\": \"sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/lilconfig\": {\n      \"version\": \"3.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz\",\n      \"integrity\": \"sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/antonk52\"\n      }\n    },\n    \"node_modules/lines-and-columns\": {\n      \"version\": \"1.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz\",\n      \"integrity\": \"sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==\",\n      \"dev\": true\n    },\n    \"node_modules/load-tsconfig\": {\n      \"version\": \"0.2.5\",\n      \"resolved\": \"https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz\",\n      \"integrity\": \"sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      }\n    },\n    \"node_modules/magic-string\": {\n      \"version\": \"0.30.21\",\n      \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz\",\n      \"integrity\": \"sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/sourcemap-codec\": \"^1.5.5\"\n      }\n    },\n    \"node_modules/mlly\": {\n      \"version\": \"1.8.2\",\n      \"resolved\": \"https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz\",\n      \"integrity\": \"sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"acorn\": \"^8.16.0\",\n        \"pathe\": \"^2.0.3\",\n        \"pkg-types\": \"^1.3.1\",\n        \"ufo\": \"^1.6.3\"\n      }\n    },\n    \"node_modules/ms\": {\n      \"version\": \"2.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n      \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n      \"dev\": true\n    },\n    \"node_modules/mz\": {\n      \"version\": \"2.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/mz/-/mz-2.7.0.tgz\",\n      \"integrity\": \"sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"any-promise\": \"^1.0.0\",\n        \"object-assign\": \"^4.0.1\",\n        \"thenify-all\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/object-assign\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz\",\n      \"integrity\": \"sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/pathe\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz\",\n      \"integrity\": \"sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==\",\n      \"dev\": true\n    },\n    \"node_modules/picocolors\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz\",\n      \"integrity\": \"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==\",\n      \"dev\": true\n    },\n    \"node_modules/picomatch\": {\n      \"version\": \"4.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz\",\n      \"integrity\": \"sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/jonschlinkert\"\n      }\n    },\n    \"node_modules/pirates\": {\n      \"version\": \"4.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz\",\n      \"integrity\": \"sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/pkg-types\": {\n      \"version\": \"1.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz\",\n      \"integrity\": \"sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"confbox\": \"^0.1.8\",\n        \"mlly\": \"^1.7.4\",\n        \"pathe\": \"^2.0.1\"\n      }\n    },\n    \"node_modules/postcss-load-config\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz\",\n      \"integrity\": \"sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"opencollective\",\n          \"url\": \"https://opencollective.com/postcss/\"\n        },\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/ai\"\n        }\n      ],\n      \"dependencies\": {\n        \"lilconfig\": \"^3.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 18\"\n      },\n      \"peerDependencies\": {\n        \"jiti\": \">=1.21.0\",\n        \"postcss\": \">=8.0.9\",\n        \"tsx\": \"^4.8.1\",\n        \"yaml\": \"^2.4.2\"\n      },\n      \"peerDependenciesMeta\": {\n        \"jiti\": {\n          \"optional\": true\n        },\n        \"postcss\": {\n          \"optional\": true\n        },\n        \"tsx\": {\n          \"optional\": true\n        },\n        \"yaml\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/readdirp\": {\n      \"version\": \"4.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz\",\n      \"integrity\": \"sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 14.18.0\"\n      },\n      \"funding\": {\n        \"type\": \"individual\",\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/resolve-from\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz\",\n      \"integrity\": \"sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/rollup\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz\",\n      \"integrity\": \"sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/estree\": \"1.0.9\"\n      },\n      \"bin\": {\n        \"rollup\": \"dist/bin/rollup\"\n      },\n      \"engines\": {\n        \"node\": \">=18.0.0\",\n        \"npm\": \">=8.0.0\"\n      },\n      \"optionalDependencies\": {\n        \"@napi-rs/lzma-linux-x64-gnu\": \"1.5.1\",\n        \"@rollup/rollup-android-arm-eabi\": \"4.62.4\",\n        \"@rollup/rollup-android-arm64\": \"4.62.4\",\n        \"@rollup/rollup-darwin-arm64\": \"4.62.4\",\n        \"@rollup/rollup-darwin-x64\": \"4.62.4\",\n        \"@rollup/rollup-freebsd-arm64\": \"4.62.4\",\n        \"@rollup/rollup-freebsd-x64\": \"4.62.4\",\n        \"@rollup/rollup-linux-arm-gnueabihf\": \"4.62.4\",\n        \"@rollup/rollup-linux-arm-musleabihf\": \"4.62.4\",\n        \"@rollup/rollup-linux-arm64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-arm64-musl\": \"4.62.4\",\n        \"@rollup/rollup-linux-loong64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-loong64-musl\": \"4.62.4\",\n        \"@rollup/rollup-linux-ppc64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-ppc64-musl\": \"4.62.4\",\n        \"@rollup/rollup-linux-riscv64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-riscv64-musl\": \"4.62.4\",\n        \"@rollup/rollup-linux-s390x-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-x64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-x64-musl\": \"4.62.4\",\n        \"@rollup/rollup-openbsd-x64\": \"4.62.4\",\n        \"@rollup/rollup-openharmony-arm64\": \"4.62.4\",\n        \"@rollup/rollup-win32-arm64-msvc\": \"4.62.4\",\n        \"@rollup/rollup-win32-ia32-msvc\": \"4.62.4\",\n        \"@rollup/rollup-win32-x64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-win32-x64-msvc\": \"4.62.4\",\n        \"fsevents\": \"~2.3.2\"\n      }\n    },\n    \"node_modules/source-map\": {\n      \"version\": \"0.7.6\",\n      \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz\",\n      \"integrity\": \"sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 12\"\n      }\n    },\n    \"node_modules/sucrase\": {\n      \"version\": \"3.35.1\",\n      \"resolved\": \"https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz\",\n      \"integrity\": \"sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/gen-mapping\": \"^0.3.2\",\n        \"commander\": \"^4.0.0\",\n        \"lines-and-columns\": \"^1.1.6\",\n        \"mz\": \"^2.7.0\",\n        \"pirates\": \"^4.0.1\",\n        \"tinyglobby\": \"^0.2.11\",\n        \"ts-interface-checker\": \"^0.1.9\"\n      },\n      \"bin\": {\n        \"sucrase\": \"bin/sucrase\",\n        \"sucrase-node\": \"bin/sucrase-node\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      }\n    },\n    \"node_modules/sucrase/node_modules/commander\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-4.1.1.tgz\",\n      \"integrity\": \"sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/thenify\": {\n      \"version\": \"3.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz\",\n      \"integrity\": \"sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"any-promise\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/thenify-all\": {\n      \"version\": \"1.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz\",\n      \"integrity\": \"sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"thenify\": \">= 3.1.0 < 4\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8\"\n      }\n    },\n    \"node_modules/tinyexec\": {\n      \"version\": \"0.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz\",\n      \"integrity\": \"sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==\",\n      \"dev\": true\n    },\n    \"node_modules/tinyglobby\": {\n      \"version\": \"0.2.17\",\n      \"resolved\": \"https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz\",\n      \"integrity\": \"sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fdir\": \"^6.5.0\",\n        \"picomatch\": \"^4.0.4\"\n      },\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/SuperchupuDev\"\n      }\n    },\n    \"node_modules/tree-kill\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz\",\n      \"integrity\": \"sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==\",\n      \"dev\": true,\n      \"bin\": {\n        \"tree-kill\": \"cli.js\"\n      }\n    },\n    \"node_modules/ts-interface-checker\": {\n      \"version\": \"0.1.13\",\n      \"resolved\": \"https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz\",\n      \"integrity\": \"sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==\",\n      \"dev\": true\n    },\n    \"node_modules/tsup\": {\n      \"version\": \"8.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz\",\n      \"integrity\": \"sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"bundle-require\": \"^5.1.0\",\n        \"cac\": \"^6.7.14\",\n        \"chokidar\": \"^4.0.3\",\n        \"consola\": \"^3.4.0\",\n        \"debug\": \"^4.4.0\",\n        \"esbuild\": \"^0.27.0\",\n        \"fix-dts-default-cjs-exports\": \"^1.0.0\",\n        \"joycon\": \"^3.1.1\",\n        \"picocolors\": \"^1.1.1\",\n        \"postcss-load-config\": \"^6.0.1\",\n        \"resolve-from\": \"^5.0.0\",\n        \"rollup\": \"^4.34.8\",\n        \"source-map\": \"^0.7.6\",\n        \"sucrase\": \"^3.35.0\",\n        \"tinyexec\": \"^0.3.2\",\n        \"tinyglobby\": \"^0.2.11\",\n        \"tree-kill\": \"^1.2.2\"\n      },\n      \"bin\": {\n        \"tsup\": \"dist/cli-default.js\",\n        \"tsup-node\": \"dist/cli-node.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"peerDependencies\": {\n        \"@microsoft/api-extractor\": \"^7.36.0\",\n        \"@swc/co","isInternal":false,"tokens":20346,"sizeBytes":50000},{"name":"package.json","path":"packages/node/package.json","rawUrl":"https://raw.githubusercontent.com/run-llama/liteparse/HEAD/packages/node/package.json","title":"@llamaindex/liteparse","category":"anthropic-skill","format":"json","content":"{\n  \"name\": \"@llamaindex/liteparse\",\n  \"version\": \"2.17.0\",\n  \"description\": \"Fast, lightweight PDF and document parsing with spatial text extraction\",\n  \"type\": \"module\",\n  \"main\": \"./dist/lib.cjs\",\n  \"module\": \"./dist/lib.js\",\n  \"types\": \"./dist/lib.d.ts\",\n  \"sideEffects\": false,\n  \"bin\": {\n    \"lit\": \"./dist/cli.js\",\n    \"liteparse\": \"./dist/cli.js\"\n  },\n  \"exports\": {\n    \".\": {\n      \"import\": {\n        \"types\": \"./dist/lib.d.ts\",\n        \"default\": \"./dist/lib.js\"\n      },\n      \"require\": {\n        \"types\": \"./dist/lib.d.cts\",\n        \"default\": \"./dist/lib.cjs\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"napi\": {\n    \"name\": \"liteparse\",\n    \"triples\": {\n      \"defaults\": true,\n      \"additional\": [\n        \"aarch64-apple-darwin\",\n        \"aarch64-unknown-linux-gnu\",\n        \"aarch64-pc-windows-msvc\",\n        \"x86_64-unknown-linux-musl\"\n      ]\n    }\n  },\n  \"files\": [\n    \"dist\",\n    \"*.node\",\n    \"*.dylib\",\n    \"*.so\",\n    \"*.so.*\",\n    \"*.dll\",\n    \"README.md\",\n    \"LICENSE\"\n  ],\n  \"scripts\": {\n    \"build:rs\": \"napi build --cargo-cwd ../../crates/liteparse-napi --platform --release --js false --dts native.d.ts .\",\n    \"build:pdfium\": \"bash scripts/copy-pdfium.sh .\",\n    \"build:ts\": \"node scripts/clean-dist.mjs && tsc --noEmit && tsup\",\n    \"build\": \"npm run build:rs && npm run build:pdfium && npm run build:ts\",\n    \"test\": \"npm run build:ts && node --test tests/\",\n    \"prepublishOnly\": \"npm run build\"\n  },\n  \"dependencies\": {\n    \"commander\": \"^12.0.0\"\n  },\n  \"devDependencies\": {\n    \"@napi-rs/cli\": \"^2.18.4\",\n    \"@types/node\": \"^22.0.0\",\n    \"tsup\": \"^8.5.0\",\n    \"typescript\": \"~5.9.2\"\n  },\n  \"optionalDependencies\": {\n    \"@llamaindex/liteparse-darwin-arm64\": \"2.17.0\",\n    \"@llamaindex/liteparse-darwin-x64\": \"2.17.0\",\n    \"@llamaindex/liteparse-linux-arm64-gnu\": \"2.17.0\",\n    \"@llamaindex/liteparse-linux-x64-gnu\": \"2.17.0\",\n    \"@llamaindex/liteparse-win32-arm64-msvc\": \"2.17.0\",\n    \"@llamaindex/liteparse-win32-x64-msvc\": \"2.17.0\",\n    \"@llamaindex/liteparse-linux-x64-musl\": \"2.17.0\"\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  },\n  \"keywords\": [\n    \"pdf\",\n    \"parser\",\n    \"ocr\",\n    \"text-extraction\",\n    \"pdf-to-text\",\n    \"document-parsing\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/run-llama/liteparse.git\"\n  },\n  \"author\": \"LlamaIndex\",\n  \"license\": \"Apache-2.0\",\n  \"overrides\": {\n    \"esbuild\": \"^0.28.2\"\n  }\n}\n","frontmatter":{"name":"@llamaindex/liteparse","version":"2.17.0","description":"Fast, lightweight PDF and document parsing with spatial text extraction","type":"module","main":"./dist/lib.cjs","module":"./dist/lib.js","types":"./dist/lib.d.ts","sideEffects":false,"bin":{"lit":"./dist/cli.js","liteparse":"./dist/cli.js"},"exports":{".":{"import":{"types":"./dist/lib.d.ts","default":"./dist/lib.js"},"require":{"types":"./dist/lib.d.cts","default":"./dist/lib.cjs"}},"./package.json":"./package.json"},"napi":{"name":"liteparse","triples":{"defaults":true,"additional":["aarch64-apple-darwin","aarch64-unknown-linux-gnu","aarch64-pc-windows-msvc","x86_64-unknown-linux-musl"]}},"files":["dist","*.node","*.dylib","*.so","*.so.*","*.dll","README.md","LICENSE"],"scripts":{"build:rs":"napi build --cargo-cwd ../../crates/liteparse-napi --platform --release --js false --dts native.d.ts .","build:pdfium":"bash scripts/copy-pdfium.sh .","build:ts":"node scripts/clean-dist.mjs && tsc --noEmit && tsup","build":"npm run build:rs && npm run build:pdfium && npm run build:ts","test":"npm run build:ts && node --test tests/","prepublishOnly":"npm run build"},"dependencies":{"commander":"^12.0.0"},"devDependencies":{"@napi-rs/cli":"^2.18.4","@types/node":"^22.0.0","tsup":"^8.5.0","typescript":"~5.9.2"},"optionalDependencies":{"@llamaindex/liteparse-darwin-arm64":"2.17.0","@llamaindex/liteparse-darwin-x64":"2.17.0","@llamaindex/liteparse-linux-arm64-gnu":"2.17.0","@llamaindex/liteparse-linux-x64-gnu":"2.17.0","@llamaindex/liteparse-win32-arm64-msvc":"2.17.0","@llamaindex/liteparse-win32-x64-msvc":"2.17.0","@llamaindex/liteparse-linux-x64-musl":"2.17.0"},"engines":{"node":">=18.0.0"},"keywords":["pdf","parser","ocr","text-extraction","pdf-to-text","document-parsing"],"repository":{"type":"git","url":"https://github.com/run-llama/liteparse.git"},"author":"LlamaIndex","license":"Apache-2.0","overrides":{"esbuild":"^0.28.2"}},"isInternal":false,"tokens":817,"sizeBytes":2418},{"name":"tsconfig.json","path":"packages/node/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/run-llama/liteparse/HEAD/packages/node/tsconfig.json","title":"Node Skill","category":"anthropic-skill","format":"json","content":"{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"NodeNext\",\n    \"moduleResolution\": \"NodeNext\",\n    \"rootDir\": \"./src\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    // Type checking only — tsup owns emit (see tsup.config.ts). Keeping this\n    // noEmit prevents a bare `tsc` from producing an ESM-only dist/.\n    \"noEmit\": true\n  },\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n","isInternal":false,"tokens":131,"sizeBytes":446},{"name":"package.json","path":"packages/wasm/package.json","rawUrl":"https://raw.githubusercontent.com/run-llama/liteparse/HEAD/packages/wasm/package.json","title":"@llamaindex/liteparse-wasm","category":"anthropic-skill","format":"json","content":"{\n  \"name\": \"@llamaindex/liteparse-wasm\",\n  \"version\": \"2.17.0\",\n  \"description\": \"Fast, lightweight PDF parsing with spatial text extraction — WebAssembly build for browsers\",\n  \"type\": \"module\",\n  \"main\": \"./pkg/liteparse_wasm.js\",\n  \"types\": \"./pkg/liteparse_wasm.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./pkg/liteparse_wasm.d.ts\",\n      \"import\": \"./pkg/liteparse_wasm.js\"\n    },\n    \"./liteparse_wasm_bg.wasm\": \"./pkg/liteparse_wasm_bg.wasm\",\n    \"./package.json\": \"./package.json\"\n  },\n  \"files\": [\n    \"pkg\",\n    \"README.md\",\n    \"LICENSE\"\n  ],\n  \"scripts\": {\n    \"build\": \"wasm-pack build ../../crates/liteparse-wasm --release --target web --out-dir ../../packages/wasm/pkg --out-name liteparse_wasm && node scripts/patch-wasi-imports.js\",\n    \"build:bundler\": \"wasm-pack build ../../crates/liteparse-wasm --release --target bundler --out-dir ../../packages/wasm/pkg --out-name liteparse_wasm && node scripts/patch-wasi-imports.js\",\n    \"build:nodejs\": \"wasm-pack build ../../crates/liteparse-wasm --release --target nodejs --out-dir ../../packages/wasm/pkg --out-name liteparse_wasm && node scripts/patch-wasi-imports.js\",\n    \"clean\": \"rm -rf pkg\",\n    \"prepublishOnly\": \"npm run build\"\n  },\n  \"keywords\": [\n    \"pdf\",\n    \"parser\",\n    \"ocr\",\n    \"text-extraction\",\n    \"pdf-to-text\",\n    \"wasm\",\n    \"webassembly\",\n    \"browser\",\n    \"document-parsing\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/run-llama/liteparse.git\"\n  },\n  \"author\": \"LlamaIndex\",\n  \"license\": \"Apache-2.0\",\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n","frontmatter":{"name":"@llamaindex/liteparse-wasm","version":"2.17.0","description":"Fast, lightweight PDF parsing with spatial text extraction — WebAssembly build for browsers","type":"module","main":"./pkg/liteparse_wasm.js","types":"./pkg/liteparse_wasm.d.ts","exports":{".":{"types":"./pkg/liteparse_wasm.d.ts","import":"./pkg/liteparse_wasm.js"},"./liteparse_wasm_bg.wasm":"./pkg/liteparse_wasm_bg.wasm","./package.json":"./package.json"},"files":["pkg","README.md","LICENSE"],"scripts":{"build":"wasm-pack build ../../crates/liteparse-wasm --release --target web --out-dir ../../packages/wasm/pkg --out-name liteparse_wasm && node scripts/patch-wasi-imports.js","build:bundler":"wasm-pack build ../../crates/liteparse-wasm --release --target bundler --out-dir ../../packages/wasm/pkg --out-name liteparse_wasm && node scripts/patch-wasi-imports.js","build:nodejs":"wasm-pack build ../../crates/liteparse-wasm --release --target nodejs --out-dir ../../packages/wasm/pkg --out-name liteparse_wasm && node scripts/patch-wasi-imports.js","clean":"rm -rf pkg","prepublishOnly":"npm run build"},"keywords":["pdf","parser","ocr","text-extraction","pdf-to-text","wasm","webassembly","browser","document-parsing"],"repository":{"type":"git","url":"https://github.com/run-llama/liteparse.git"},"author":"LlamaIndex","license":"Apache-2.0","engines":{"node":">=18.0.0"}},"isInternal":false,"tokens":475,"sizeBytes":1576},{"name":"README.md","path":"packages/node/README.md","rawUrl":"https://raw.githubusercontent.com/run-llama/liteparse/HEAD/packages/node/README.md","title":"node Documentation","category":"plugin-manifest","format":"markdown","content":"# LiteParse Node.js\n\nNode.js/TypeScript bindings for [LiteParse](https://github.com/run-llama/liteparse) — fast, lightweight PDF and document parsing with spatial text extraction.\n\n## Installation\n\n```bash\nnpm i @llamaindex/liteparse\n```\n\nThis also installs the `lit` CLI command (use `npm i -g` for global access).\n\n## Quick Start\n\n```typescript\nimport { LiteParse } from '@llamaindex/liteparse';\n\nconst parser = new LiteParse();\nconst result = await parser.parse('document.pdf');\nconsole.log(result.text);\nconsole.log(`Source document pages: ${result.totalPages}`);\n\n// Access structured data\nfor (const page of result.pages) {\n  console.log(`Page ${page.pageNum}: ${page.textItems.length} text items`);\n}\n```\n\nCommonJS is supported as well:\n\n```javascript\nconst { LiteParse } = require('@llamaindex/liteparse');\n\n(async () => {\n  const parser = new LiteParse();\n  const result = await parser.parse('document.pdf');\n  console.log(result.text);\n})();\n```\n\n### Bounded-memory parsing\n\nFor documents with many text items, consume page batches without retaining\nearlier results:\n\n```typescript\nconst parser = new LiteParse();\nfor await (const batch of parser.parseBatches('large.pdf', { batchSize: 20 })) {\n  await processPages(batch.result.pages);\n}\n```\n\nEach batch is an ordinary parse result covering `batch.startPage` through\n`batch.endPage`, and becomes collectible as soon as you advance the iterator.\nA non-PDF source is converted once, not once per batch.\n\nCross-page passes only see the pages in their own batch, so repeated\nheader/footer removal and image deduplication are batch-local and the output\ncan differ from `parse()`. Prefer `parse()` unless the size of the\nmaterialized result is the problem.\n\n## Markdown Output\n\nLiteParse can render documents directly to Markdown including headings, tables, lists,\nimages, and links reconstructed from the spatial layout. Great for feeding LLMs\nand RAG pipelines. The rendered Markdown is returned on `result.text`:\n\n```typescript\nconst parser = new LiteParse({\n  outputFormat: 'markdown',     // \"json\" | \"text\" | \"markdown\"\n  imageMode: 'placeholder',     // \"placeholder\" | \"off\" | \"embed\"\n  extractLinks: true,           // render [text](url) link syntax (default: true)\n});\nconst result = await parser.parse('document.pdf');\nconsole.log(result.text); // rendered Markdown\n```\n\n> Reconstruction quality varies with document complexity.\n\n## Configuration\n\nAll options are passed to the constructor:\n\n```typescript\nconst parser = new LiteParse({\n  ocrEnabled: true,              // Enable OCR (default: true)\n  ocrLanguage: 'eng',           // Tesseract language code\n  ocrServerUrl: undefined,       // HTTP OCR server URL (optional)\n  tessdataPath: undefined,       // Path to tessdata directory (optional)\n  maxPages: 1000,                // Max pages to parse\n  targetPages: '1-5,10',        // Specific pages (optional)\n  extractScreenshots: false,    // Return parsed pages as PNG buffers\n  continueOnPageError: false,   // Skip broken pages and return pageErrors\n  dpi: 150,                      // Rendering DPI\n  outputFormat: 'json',          // \"json\" | \"text\" | \"markdown\"\n  imageMode: 'placeholder',      // Markdown image handling: \"placeholder\" | \"off\" | \"embed\"\n  extractImages: true,           // Extract image bytes + metadata (default: false)\n  imageOutputDir: './images',    // Write images and return name/path metadata (optional)\n  extractLinks: true,            // Render [text](url) links in markdown output\n  keepHeadersFooters: false,     // Keep running headers/footers in markdown output\n  extractVectorGraphics: false,  // Opt-in shapes + merged H/V lines per page\n  extractAnnotations: false,     // Include page annotations in structured output\n  extractFormFields: false,      // Include AcroForm widget fields and values\n  extractStructureTree: false,   // Include tagged-PDF logical structure\n  extractXfaPackets: false,      // Include raw XFA packets (name + XML content)\n  extractContentBounds: false,   // Include per-page contentBounds union bbox\n  detectScreenshotRects: false,  // Detect solid rects/lines in screenshots\n  preserveVerySmallText: false,  // Keep tiny text\n  extractTextMetadata: false,    // Opt in to MCID, font metrics, colors, char codes, and trailingSpaceGenerated\n  password: undefined,           // Password for protected documents\n  quiet: false,                  // Suppress progress output\n  numWorkers: 4,                 // Concurrent OCR workers\n});\n```\n\nWhen `extractImages` is true, image extraction is enabled. `imageOutputDir` requires\nthat explicit opt-in and writes the extracted bytes to disk. Each\n`result.images` entry includes its page bbox, intrinsic pixel dimensions, rotation,\nformat, `name`, and `path`. Valid source JPEGs are preserved, exact duplicates reuse\none file, and JSON CLI output contains metadata only (no base64 image data).\n`imageMode` controls Markdown presentation only and does not imply extraction. With\n`extractImages: false`, lightweight Markdown placement refs are still collected and\n`result.images` stays empty.\n\nThe Node CLI uses the same snake_case JSON schema as the Rust CLI; camelCase is\nreserved for the programmatic Node API.\n\nWhen `extractAnnotations` is enabled, each parsed page has an `annotations`\narray containing the subtype, contents, author/title, PDF date strings,\nviewport-space rectangle and quadpoint rectangles, and URI for external link\nannotations. It is independent of `extractLinks`, which controls Markdown link\nrendering. The field is omitted when extraction is disabled.\n\nWhen `extractStructureTree` is enabled, each page has a `structureTree` containing\nall tagged-PDF roots and recursive elements with type, ID, actual/alternate text,\ntitle, typed attributes, MCIDs, children, and referenced link annotations. Untagged\npages have an empty `roots` array; the field is omitted when disabled.\n\nEvery result also carries the document's `/Info` `creator`/`producer` when\npresent. With `extractDocumentMetadata`, `result.docMeta` adds a provenance\nobject with dates, PDF version/security, signature state, incremental-save\nmarkers, trailer ID comparison, the catalog's XMP packet (capped at 64 KiB;\nskipped for sources over 16 MiB), and source size — off by default since it\nstreams the whole file, and absent for inputs converted from a non-PDF\nformat. These are API-level only, not in CLI JSON. With `extractContentBounds`\neach page carries a `contentBounds` union bbox of its top-level content\nobjects. With `extractXfaPackets`, `result.xfaPackets` lists each raw XFA\npacket (index, name, content length, XML content); non-XFA documents yield an\nempty array. Screenshots draw form-field appearances into the raster and\nreport `isSolidFill` per page, plus detected solid `rects` when\n`detectScreenshotRects` is enabled.\n\n## Parsing from Bytes\n\nPass a `Buffer` or `Uint8Array` directly — useful for HTTP responses or in-memory data:\n\n```typescript\nimport { readFile } from 'fs/promises';\n\nconst pdfBytes = await readFile('document.pdf');\nconst result = await parser.parse(pdfBytes);\nconsole.log(result.text);\n```\n\n## Worker Pool and Hard Timeouts\n\nPDFium is not thread-safe, so all parses inside one process serialize on a\nprocess-global lock — even `Promise.all` over multiple `parse()` calls runs\nthem one at a time.\n\nFor high-throughput services, or for cases when you need to enforce a\nruntime timeout, run parses in a pool of persistent worker processes instead:\n\n```typescript\nimport { LiteParse, ParseTimeoutError } from '@llamaindex/liteparse';\n\nconst parser = new LiteParse({ poolSize: 4, parseTimeoutMs: 15_000 });\nawait parser.warmUp(); // optional: pre-initialize workers (~45ms total)\n\ntry {\n  const result = await parser.parse('document.pdf');\n} catch (e) {\n  if (e instanceof ParseTimeoutError) {\n    console.warn(`killed rogue document: ${e.source} (deadline ${e.timeoutMs}ms)`);\n  }\n}\n\nparser.close(); // frees workers immediately; an idle pool never blocks exit\n```\n\n## Screenshots\n\nGenerate PNG screenshots of document pages:\n\n```typescript\nconst screenshots = parser.screenshot('document.pdf', [1, 2, 3]);\nfor (const s of screenshots) {\n  console.log(`Page ${s.pageNum}: ${s.width}x${s.height}`);\n  // s.imageBuffer contains PNG bytes\n}\n```\n\n## Document Complexity\n\nBefore committing to a full parse, check whether a document needs OCR or heavier\nprocessing. `isComplex` is a cheap, text-layer-only pass that returns one entry per page\nwith a `needsOcr` verdict and the signals behind it — useful for routing documents to\ndifferent pipelines, rejecting ones you can't handle, or estimating cost.\n\n```typescript\nconst parser = new LiteParse();\nconst pages = await parser.isComplex('document.pdf');\n\nif (pages.some((p) => p.needsOcr)) {\n  // Route to the OCR-enabled pipeline\n  const result = await parser.parse('document.pdf');\n} else {\n  // Cheap path — skip OCR entirely\n  const result = await new LiteParse({ ocrEnabled: false }).parse('document.pdf');\n}\n\n// Inspect why specific pages were flagged\nfor (const page of pages.filter((p) => p.needsOcr)) {\n  console.log(`Page ${page.pageNumber}: ${page.reasons.join(', ')}`);\n}\n```\n\n`reasons` is one of `\"scanned\"`, `\"no-text\"`, `\"sparse-text\"`, `\"embedded-images\"`,\n`\"garbled\"`, `\"vector-text\"`, or `\"annotation-text\"`. Raw bytes work here too.\n\n## Supported Formats\n\n- PDF (`.pdf`)\n- Microsoft Office (`.docx`, `.xlsx`, `.pptx`, etc.) — requires LibreOffice\n- OpenDocument (`.odt`, `.ods`, `.odp`) — requires LibreOffice\n- Images (`.png`, `.jpg`, `.tiff`, etc.)\n- And more!\n\n## CLI\n\nThe npm package includes the `lit` CLI:\n\n```bash\nlit parse document.pdf\nlit parse document.pdf --format json -o output.json\nlit parse document.pdf --format json --extract-annotations\nlit parse document.pdf --format json --extract-form-fields\nlit screenshot document.pdf -o ./screenshots\nlit batch-parse ./input ./output\nlit is-complex document.pdf\n```\n","isInternal":false,"tokens":2329,"sizeBytes":9910},{"name":"README.md","path":"packages/python/README.md","rawUrl":"https://raw.githubusercontent.com/run-llama/liteparse/HEAD/packages/python/README.md","title":"python Documentation","category":"plugin-manifest","format":"markdown","content":"# LiteParse Python\n\nPython bindings for [LiteParse](https://github.com/run-llama/liteparse) — fast, lightweight PDF and document parsing with spatial text extraction.\n\n## Installation\n\n```bash\npip install liteparse\n```\n\nThis also installs the `lit` CLI command.\n\n## Quick Start\n\n```python\nfrom liteparse import LiteParse\n\nparser = LiteParse()\nresult = parser.parse(\"document.pdf\")\nprint(result.text)\nprint(f\"Source document pages: {result.total_pages}\")\n\n# Access structured data\nfor page in result.pages:\n    print(f\"Page {page.page_num}: {len(page.text_items)} text items\")\n```\n\n## Markdown Output\n\nLiteParse can render documents directly to Markdown including headings, tables, lists,\nimages, and links reconstructed from the spatial layout. Great for feeding LLMs\nand RAG pipelines. The rendered Markdown is returned on `result.text`:\n\n```python\nparser = LiteParse(\n    output_format=\"markdown\",   # \"json\" | \"text\" | \"markdown\"\n    image_mode=\"placeholder\",   # \"placeholder\" | \"off\" | \"embed\"\n    extract_links=True,         # render [text](url) link syntax (default: True)\n)\nresult = parser.parse(\"document.pdf\")\nprint(result.text)  # rendered Markdown\n```\n\n> Reconstruction quality varies with document complexity.\n\n## Configuration\n\nAll options are passed to the constructor:\n\n```python\nparser = LiteParse(\n    ocr_enabled=True,              # Enable OCR (default: True)\n    ocr_language=\"eng\",            # Tesseract language code\n    ocr_server_url=None,           # HTTP OCR server URL (optional)\n    tessdata_path=None,            # Path to tessdata directory (optional)\n    max_pages=1000,                # Max pages to parse\n    target_pages=\"1-5,10\",         # Specific pages (optional)\n    extract_screenshots=False,      # Return parsed pages as PNG bytes\n    continue_on_page_error=False,   # Skip broken pages and return page_errors\n    dpi=150,                       # Rendering DPI\n    output_format=\"json\",          # \"json\" | \"text\" | \"markdown\"\n    image_mode=\"placeholder\",      # Markdown image handling: \"placeholder\" | \"off\" | \"embed\"\n    extract_images=True,           # Extract image bytes + metadata (default: False)\n    image_output_dir=\"./images\",   # Write images and return name/path metadata (optional)\n    extract_links=True,            # Render [text](url) links in markdown output\n    keep_headers_footers=False,    # Keep running headers/footers in markdown output\n    extract_vector_graphics=False, # Opt-in shapes + merged H/V lines per page\n    extract_annotations=False,     # Include page annotations in structured output\n    extract_form_fields=False,      # Include AcroForm widget fields and values\n    extract_structure_tree=False,   # Include tagged-PDF logical structure\n    preserve_very_small_text=False, # Keep tiny text\n    extract_text_metadata=False,    # Opt in to MCID, font metrics, colors, char codes, and trailing_space_generated\n    password=None,                 # Password for protected documents\n    quiet=False,                   # Suppress progress output\n    num_workers=4,                 # Concurrent OCR workers\n)\n```\n\nWhen ``extract_images=True``, image extraction is enabled. ``image_output_dir``\nrequires that explicit opt-in and writes the extracted bytes to disk. Each\n``result.images`` entry includes its page bbox, intrinsic pixel dimensions, rotation,\nformat, ``name``, and ``path``. Valid source JPEGs are preserved, exact duplicates\nreuse one file, and JSON CLI output contains metadata only (no base64 image data).\n``image_mode`` controls Markdown presentation only and does not imply extraction.\nWith ``extract_images=False``, lightweight Markdown placement refs are still collected\nand ``result.images`` stays empty.\n\nWhen `extract_annotations` is enabled, each parsed page has an `annotations`\nlist containing the subtype, contents, author/title, PDF date strings,\nviewport-space rectangle and quadpoint rectangles, and URI for external link\nannotations. It is independent of `extract_links`, which controls Markdown\nlink rendering. The field is `None` when extraction is disabled.\n\nWhen ``extract_structure_tree=True``, each page has a ``structure_tree`` containing\nall tagged-PDF roots and recursive elements with type, ID, actual/alternate text,\ntitle, typed attributes, MCIDs, children, and referenced link annotations. Untagged\npages have an empty ``roots`` list; the field is ``None`` when disabled.\n\nEvery result also carries ``creator``/``producer`` from the PDF ``/Info``\ndictionary. With ``extract_document_metadata=True``, ``result.doc_meta`` adds a\nprovenance object with dates, PDF version/security, signature state,\nincremental-save markers, trailer ID comparison, the catalog's XMP packet\n(capped at 64 KiB; skipped for sources over 16 MiB), and source size. It is off by default because it streams the whole source file,\nand it is ``None`` for inputs converted from a non-PDF format. These document\nfields are API-only and do not alter default CLI JSON.\n\n## Parsing from Bytes\n\nPass raw PDF bytes directly — useful for web uploads or downloaded files:\n\n```python\nwith open(\"document.pdf\", \"rb\") as f:\n    result = parser.parse(f.read())\nprint(result.text)\n```\n\n## Worker Pool and Hard Timeouts\n\nPDFium is not thread-safe, so in-process parses serialize on a process-global\nlock. For high-throughput services, or cases where you need to enforce a timeout,\nrun parses in a pool of persistent worker processes instead:\n\n```python\nfrom liteparse import LiteParse, ParseTimeoutError\n\nparser = LiteParse(pool_size=4, parse_timeout=15)\nparser.warm_up()  # optional: pre-initialize workers (~60ms total)\n\ntry:\n    result = parser.parse(\"document.pdf\")\nexcept ParseTimeoutError as e:\n    print(f\"killed rogue document: {e.source} (deadline {e.timeout}s)\")\n\nparser.close()  # or use `with LiteParse(...) as parser:`\n```\n\n## Screenshots\n\nGenerate PNG screenshots of document pages:\n\n```python\nscreenshots = parser.screenshot(\"document.pdf\", page_numbers=[1, 2, 3])\nfor s in screenshots:\n    print(f\"Page {s.page_num}: {s.width}x{s.height}\")\n    with open(f\"page_{s.page_num}.png\", \"wb\") as f:\n        f.write(s.image_bytes)\n```\n\n## Document Complexity\n\nBefore committing to a full parse, check whether a document needs OCR or heavier\nprocessing. `is_complex` is a cheap, text-layer-only pass that returns one entry per page\nwith a `needs_ocr` verdict and the signals behind it — useful for routing documents to\ndifferent pipelines, rejecting ones you can't handle, or estimating cost.\n\n```python\nparser = LiteParse()\npages = parser.is_complex(\"document.pdf\")\n\nif any(p.needs_ocr for p in pages):\n    # Route to the OCR-enabled pipeline\n    result = parser.parse(\"document.pdf\")\nelse:\n    # Cheap path — skip OCR entirely\n    result = LiteParse(ocr_enabled=False).parse(\"document.pdf\")\n\n# Inspect why specific pages were flagged\nfor page in pages:\n    if page.needs_ocr:\n        print(f\"Page {page.page_number}: {', '.join(page.reasons)}\")\n```\n\n`reasons` is one of `\"scanned\"`, `\"no-text\"`, `\"sparse-text\"`, `\"embedded-images\"`,\n`\"garbled\"`, `\"vector-text\"`, or `\"annotation-text\"`. Raw bytes work here too.\n\n## Supported Formats\n\n- PDF (`.pdf`)\n- Microsoft Office (`.docx`, `.xlsx`, `.pptx`, etc.) — requires LibreOffice\n- OpenDocument (`.odt`, `.ods`, `.odp`) — requires LibreOffice\n- Images (`.png`, `.jpg`, `.tiff`, etc.)\n- And more!\n\n## CLI\n\nThe Python package includes the `lit` CLI:\n\n```bash\nlit parse document.pdf\nlit parse document.pdf --format json -o output.json\nlit parse document.pdf --format json --extract-annotations\nlit parse document.pdf --format json --extract-form-fields\nlit screenshot document.pdf -o ./screenshots\nlit batch-parse ./input ./output\nlit is-complex document.pdf\n```\n","isInternal":false,"tokens":1769,"sizeBytes":7705},{"name":"README.md","path":"packages/wasm/README.md","rawUrl":"https://raw.githubusercontent.com/run-llama/liteparse/HEAD/packages/wasm/README.md","title":"wasm Documentation","category":"plugin-manifest","format":"markdown","content":"# @llamaindex/liteparse-wasm\n\nBrowser/WebAssembly build of [LiteParse](https://github.com/run-llama/liteparse) — a fast, lightweight PDF parser with spatial text extraction.\n\nThis package runs entirely in the browser. No server, no cloud calls.\n\n## Install\n\n```sh\nnpm install @llamaindex/liteparse-wasm\n```\n\n## Quick start\n\n```ts\nimport init, { LiteParse } from \"@llamaindex/liteparse-wasm\";\n\n// Load the wasm module (point at the file shipped with the package).\nawait init();\n\nconst parser = new LiteParse({\n  ocrEnabled: false, // OCR requires a JS-side engine (see below)\n  outputFormat: \"json\",\n});\n\n// `data` is a Uint8Array (e.g. from fetch / File / drag-drop).\nconst bytes = new Uint8Array(await file.arrayBuffer());\nconst result = await parser.parse(bytes);\n\nconsole.log(result.text);          // full document text\nconsole.log(result.pages[0]);      // per-page items with bboxes\n```\n\n## Document complexity\n\nBefore committing to a full parse, check whether a document needs OCR or heavier\nprocessing. `isComplex` is a cheap, text-layer-only pass that returns one entry per page\nwith a `needsOcr` verdict and the signals behind it — useful for routing documents or\ndeciding whether the JS-side OCR engine is worth wiring up.\n\n```ts\nconst parser = new LiteParse({ ocrEnabled: false });\nconst bytes = new Uint8Array(await file.arrayBuffer());\nconst pages = await parser.isComplex(bytes);\n\nif (pages.some((p) => p.needsOcr)) {\n  // This document would benefit from OCR — see \"OCR in the browser\" below\n  for (const page of pages.filter((p) => p.needsOcr)) {\n    console.log(`Page ${page.pageNumber}: ${page.reasons.join(\", \")}`);\n  }\n}\n```\n\n`reasons` is one of `\"scanned\"`, `\"no-text\"`, `\"sparse-text\"`, `\"embedded-images\"`,\n`\"garbled\"`, `\"vector-text\"`, or `\"annotation-text\"`.\n\n## Config options\n\nAll optional, camelCase:\n\n| Option | Type | Default | Description |\n|---|---|---|---|\n| `ocrLanguage` | `string` | `\"eng\"` | Language code passed to the OCR engine |\n| `ocrEnabled` | `boolean` | `false` | Run OCR on text-sparse pages |\n| `maxPages` | `number` | `1000` | Stop after this many pages |\n| `targetPages` | `string` | — | e.g. `\"1-5,10,15-20\"` |\n| `extractScreenshots` | `boolean` | `false` | Return parsed pages as PNG bytes on `result.screenshots` |\n| `dpi` | `number` | `150` | Render DPI for OCR / screenshots |\n| `outputFormat` | `\"json\" \\| \"text\" \\| \"markdown\"` | `\"json\"` | Output format; `\"markdown\"` returns rendered Markdown on `result.text` |\n| `imageMode` | `\"off\" \\| \"placeholder\" \\| \"embed\"` | `\"placeholder\"` | How raster images are surfaced in markdown output |\n| `extractLinks` | `boolean` | `true` | Render hyperlink annotations as `[text](url)` in markdown output |\n| `extractVectorGraphics` | `boolean` | `false` | Include page-scoped shapes and merged horizontal/vertical lines |\n| `extractAnnotations` | `boolean` | `false` | Include page annotations and their metadata/geometry in structured output |\n| `extractStructureTree` | `boolean` | `false` | Include the tagged-PDF logical structure tree |\n| `preserveVerySmallText` | `boolean` | `false` | Keep tiny text that's normally filtered |\n| `password` | `string` | — | Password for protected PDFs |\n| `quiet` | `boolean` | `false` | Suppress progress logging |\n| `numWorkers` | `number` | `1` | Maximum concurrent OCR calls |\n| `ocrEngine` | `object` | — | JS-side OCR engine (see below) |\n\n## OCR in the browser\n\nThe native HTTP-OCR and Tesseract backends are not available in the browser.\nTo use OCR, set `ocrEnabled: true` and supply an `ocrEngine` object with a\n`recognize` method. Supplying `ocrEngine` alone does not enable OCR.\n\n```ts\nconst parser = new LiteParse({\n  ocrEnabled: true,\n  ocrLanguage: \"eng\",\n  // Use more than 1 only if the engine supports concurrent jobs.\n  numWorkers: 2,\n  ocrEngine: {\n    /**\n     * @param imageData PNG-encoded image bytes\n     * @param width  rendered page width  in pixels\n     * @param height rendered page height in pixels\n     * @param language e.g. \"eng\"\n     * @returns array of { text, bbox: [x1,y1,x2,y2], confidence }\n     */\n    async recognize(imageData, width, height, language) {\n      // e.g. call a worker that wraps tesseract.js, or a remote OCR service\n      return [\n        { text: \"Hello\", bbox: [10, 20, 80, 40], confidence: 0.98 },\n      ];\n    },\n  },\n});\n```\n\nLiteParse keeps at most `numWorkers` calls to `recognize` active. When one call\nfinishes, LiteParse prepares and starts the next page without waiting for the\nother calls. An OCR engine can send the calls to a Web Worker pool or to\nconcurrent HTTP requests. Results stay assigned to their source pages when\njobs finish out of order. Active calls can keep up to `numWorkers` rendered\npage rasters in memory, so use a small value for high-DPI documents.\n\nA failed `recognize` call only affects its own page. With `ocrFailureFatal:\ntrue` (the default), `parse()` rejects only when every OCR call failed and at\nleast one failed page had little native text. If parsing fails, OCR calls that\nhave already started can continue.\n\n## Building from source\n\nRequires Rust + [`wasm-pack`](https://rustwasm.github.io/wasm-pack/):\n\n```sh\n# from packages/wasm\nnpm run build           # web target (default)\nnpm run build:bundler   # for webpack/rollup/vite\nnpm run build:nodejs    # for node.js\n```\n\nOutput goes to `pkg/`.\n\n## License\n\nApache-2.0\n","isInternal":false,"tokens":1412,"sizeBytes":5364}],"systemPromptSnippet":"<yakaai_skills repo=\"run-llama/liteparse\">\n<!-- File: AGENTS.md (Tokens: ~2064 | Category: root-instruction) -->\n# LiteParse - Agent Documentation\n\n> This file provides comprehensive context for AI coding agents working on this codebase.\n\n## Project Overview\n\n**LiteParse** is an open-source PDF parsing library written in **Rust**, focused on fast, lightweight document processing with spatial text extraction. It runs entirely locally with zero cloud dependencies by default.\n\nLanguage bindings are provided for **Node.js/TypeScript** (via napi-rs), **Python** (via PyO3), and **WebAssembly** (via wasm-bindgen).\n\n### Key Capabilities\n- **Spatial text extraction** with precise bounding boxes\n- **Flexible OCR** (built-in Tesseract or pluggable HTTP servers)\n- **Multi-format support** (PDFs, DOCX, XLSX, PPTX, images via conversion)\n- **Multi-language bindings**: Rust, Node.js/TypeScript, Python, Browser (WASM)\n- **CLI** available from all installation methods (`cargo`, `npm`, `pip`)\n\n## Directory Structure\n\n```\nliteparse/\n├── crates/\n│   ├── liteparse/          # Core Rust library + CLI binary\n│   │   └── src/\n│   │       ├── main.rs         # CLI entry point (clap)\n│   │       ├── lib.rs          # Library root\n│   │       ├── parser.rs       # LiteParse orchestrator\n│   │       ├── config.rs       # Configuration types and defaults\n│   │       ├── types.rs        # Core data types (ParseResult, TextItem, etc.)\n│   │       ├── projection.rs   # Spatial grid projection (layout reconstruction)\n│   │       ├── extract.rs      # Raw text extraction from PDFium\n│   │       ├── render.rs       # Page rendering / screenshots\n│   │       ├── conversion.rs   # Non-PDF format conversion (LibreOffice, image/resvg/usvg rust crates)\n│   │       ├── ocr_merge.rs    # Merging OCR results with native text\n│   │       ├── error.rs        # Error types\n│   │       ├── ocr/            # OCR engine implementations\n│   │       │   ├── mod.rs          # OcrEngine trait\n│   │       │   ├── tesseract.rs    # Built-in Tesseract OCR\n│   │       │   └── http_simple.rs  # HTTP OCR server client\n│   │       └── output/         # Output formatters\n│   │           ├── mod.rs\n│   │           ├── json.rs\n│   │           └── text.rs\n│   ├── liteparse-napi/     # Node.js bindings (napi-rs)\n│   ├── liteparse-python/   # Python bindings (PyO3 / maturin)\n│   ├── liteparse-wasm/     # WASM bindings (wasm-bindgen)\n│   ├── pdfium/             # Rust wrapper around PDFium C API\n│   └── pdfium-sys/         # PDFium FFI (C → Rust) bindings\n├── packages/\n│   ├── node/               # npm package: TS wrapper + CLI around native binary\n│   │   └── src/\n│   │       ├── lib.ts          # Public LiteParse class for Node.js\n│   │       ├── cli.ts          # CLI entry point (commander)\n│   │       └── native.ts       # Native binary loader\n│   ├── python/             # PyPI package: Python wrapper around native binary\n│   │   └── liteparse/\n│   │       ├── __init__.py\n│   │       ├── parser.py       # Public LiteParse class for Python\n│   │       ├── types.py        # Python dataclass types\n│   │       └── cli.py          # CLI entry point\n│   └── wasm/               # WASM npm package\n├── ocr/                    # Example OCR server implementations\n│   ├── easyocr/            # EasyOCR wrapper server\n│   └── paddleocr/          # PaddleOCR wrapper server\n└── Cargo.toml              # Workspace root\n```\n\n## Data Flow\n\n1. **Input**: File path or raw bytes received (any supported format)\n2. **Conversion** (if needed): Non-PDF formats converted to PDF via LibreOffice and image/resvg/usvg rust crates\n3. **PDF Loading**: PDFium extracts text items, images, metadata\n4. **OCR** (if enabled): Pages rendered and OCR'd for text-sparse areas\n5. **Grid Projection**: Spatial reconstruction of text layout using anchor system\n6. **Post-processing**: Bounding boxes, text cleanup\n7. **Output**: Formatted as JSON or plain text\n\n## Key Design Decisions\n\n### 1. Rust Core with Language Bindings\nThe core parsing logic is written in Rust for performance and safety. Language-specific crates expose the same API surface:\n- `liteparse-napi` → Node.js via napi-rs\n- `liteparse-python` → Python via PyO3/maturin\n- `liteparse-wasm` → Browser via wasm-bindgen\n\nEach binding crate is thin — it wraps the core `liteparse` crate's types and async API.\n\n### 2. OCR Engine Trait\nOCR functionality uses a trait-based abstraction (`OcrEngine`). This allows:\n- Built-in Tesseract (default, compiled in via `tesseract-rs`)\n- HTTP OCR server client for remote engines\n- Custom JS-side OCR in the WASM build via a callback interface\n\n### 3. Spatial Grid Projection\nThe most complex (and important!) part of the codebase (`crates/liteparse/src/projection.rs`). Uses:\n- **Anchor-based layout**: Tracks text alignment (left, right, center, floating)\n- **Forward anchors**: Carry alignment information between lines\n- **Column detection**: Identifies multi-column layouts\n- **Rotation handling**: Transforms 90°, 180°, 270° rotated text to correct reading order\n- **OCR merging**: Combines native PDF text with OCR results, preserving confidence scores and source flags in output\n\n### 4. Selective OCR\nOCR only runs on embedded images where text extraction failed, not the entire document. This balances accuracy with performance.\n\n### 5. Configuration\nUses a default-first approach where users only override what they need. See `crates/liteparse/src/config.rs` for defaults.\n\n### 6. Format Conversion via External Tools\nRather than implementing format parsers, LiteParse converts office file formats using system tools (LibreOffice) into PDF. This provides broad format support with minimal code.\n\n## Common Tasks\n\n### Adding a New Output Format\n1. Create new file in `crates/liteparse/src/output/`\n2. Add variant to `OutputFormat` enum in `config.rs`\n3. Wire it up in `main.rs` and binding crates\n\n### Adding a New OCR Engine\n1. Implement `OcrEngine` trait in `crates/liteparse/src/ocr/`\n2. Add initialization logic in `parser.rs`\n3. Add configuration options in `config.rs`\n\n### Modifying Text Extraction Logic\nKey files in `crates/liteparse/src/`:\n- `projection.rs` — Layout reconstruction (most complex)\n- `extract.rs` — Raw text item extraction from PDFium\n- `text_clip.rs` — Shared glyph visibility: PDFium clip points already include the object matrix; compose only ancestor form matrices and inherit ancestor clips.\n- `ocr_merge.rs` — Merging OCR and native text\n\n### Adding CLI Options\n1. Add field to `LiteParseConfig` in `config.rs`\n2. Add clap arg in `main.rs`\n3. Wire through `parser.rs`\n4. Expose in binding crates (`liteparse-napi`, `liteparse-python`, `liteparse-wasm`)\n\n### Adding / Modifying Node.js Wrapper\n- Edit `packages/node/src/lib.ts` for library API changes\n- Edit `packages/node/src/cli.ts` for CLI changes\n- The native binary interface is defined in `packages/node/src/native.ts`\n\n### Adding / Modifying Python Wrapper\n- Edit `packages/python/liteparse/parser.py` for library API changes\n- Types are in `packages/python/liteparse/types.py`\n- CLI entry point is `packages/python/liteparse/cli.py`\n\n## Key Dependencies\n\n| Dependency | Purpose |\n|------------|---------|\n| `pdfium` (C library) | PDF text extraction and rendering |\n| `tesseract-rs` | Built-in OCR engine (optional, via `tesseract` feature) |\n| `clap` | CLI framework |\n| `serde` / `serde_json` | Serialization |\n| `tokio` | Async runtime |\n| `reqwest` | HTTP client (for OCR server) |\n| `image` | Image processing (PNG encoding) |\n| `napi-rs` | Node.js native bindings |\n| `pyo3` / `maturin` | Python native bindings |\n| `wasm-bindgen` | WASM bindings |\n\n## Entry Points\n\n- **Rust CLI**: `crates/liteparse/src/main.rs`\n- **Rust Library**: `crates/liteparse/src/lib.rs` → `parser.rs` contains `LiteParse` struct\n- **Node.js**: `packages/node/src/lib.ts` exports `LiteParse` class\n- **Python**: `packages/python/liteparse/parser.py` exports `LiteParse` class\n- **WASM**: `crates/liteparse-wasm/` exposes `LiteParse` via wasm-bindgen\n\n## Related Documentation\n\n- [User-facing documentation](README.md)\n- [OCR API Specification](OCR_API_SPEC.md)\n- [WASM package README](packages/wasm/README.md)\n- [Python package README](packages/python/README.md)\n- [OCR server examples](ocr/README.md)\n\n<!-- File: packages/node/package-lock.json (Tokens: ~20346 | Category: anthropic-skill) -->\n{\n  \"name\": \"@llamaindex/liteparse\",\n  \"version\": \"2.17.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"@llamaindex/liteparse\",\n      \"version\": \"2.17.0\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"commander\": \"^12.0.0\"\n      },\n      \"bin\": {\n        \"lit\": \"dist/cli.js\",\n        \"liteparse\": \"dist/cli.js\"\n      },\n      \"devDependencies\": {\n        \"@napi-rs/cli\": \"^2.18.4\",\n        \"@types/node\": \"^22.0.0\",\n        \"tsup\": \"^8.5.0\",\n        \"typescript\": \"~5.9.2\"\n      },\n      \"engines\": {\n        \"node\": \">=18.0.0\"\n      },\n      \"optionalDependencies\": {\n        \"@llamaindex/liteparse-darwin-arm64\": \"2.17.0\",\n        \"@llamaindex/liteparse-darwin-x64\": \"2.17.0\",\n        \"@llamaindex/liteparse-linux-arm64-gnu\": \"2.17.0\",\n        \"@llamaindex/liteparse-linux-x64-gnu\": \"2.17.0\",\n        \"@llamaindex/liteparse-linux-x64-musl\": \"2.17.0\",\n        \"@llamaindex/liteparse-win32-arm64-msvc\": \"2.17.0\",\n        \"@llamaindex/liteparse-win32-x64-msvc\": \"2.17.0\"\n      }\n    },\n    \"node_modules/@esbuild/aix-ppc64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz\",\n      \"integrity\": \"sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"aix\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz\",\n      \"integrity\": \"sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/android-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/darwin-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/freebsd-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/freebsd-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-arm\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz\",\n      \"integrity\": \"sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-ia32\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz\",\n      \"integrity\": \"sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-loong64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz\",\n      \"integrity\": \"sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-mips64el\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz\",\n      \"integrity\": \"sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==\",\n      \"cpu\": [\n        \"mips64el\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-ppc64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz\",\n      \"integrity\": \"sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-riscv64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz\",\n      \"integrity\": \"sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-s390x\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz\",\n      \"integrity\": \"sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/linux-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/netbsd-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"netbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/netbsd-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"netbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openbsd-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openbsd-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/openharmony-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openharmony\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/sunos-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"sunos\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-arm64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz\",\n      \"integrity\": \"sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-ia32\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz\",\n      \"integrity\": \"sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@esbuild/win32-x64\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz\",\n      \"integrity\": \"sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ],\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/@jridgewell/gen-mapping\": {\n      \"version\": \"0.3.13\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz\",\n      \"integrity\": \"sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/sourcemap-codec\": \"^1.5.0\",\n        \"@jridgewell/trace-mapping\": \"^0.3.24\"\n      }\n    },\n    \"node_modules/@jridgewell/resolve-uri\": {\n      \"version\": \"3.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz\",\n      \"integrity\": \"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=6.0.0\"\n      }\n    },\n    \"node_modules/@jridgewell/sourcemap-codec\": {\n      \"version\": \"1.5.5\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz\",\n      \"integrity\": \"sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==\",\n      \"dev\": true\n    },\n    \"node_modules/@jridgewell/trace-mapping\": {\n      \"version\": \"0.3.31\",\n      \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz\",\n      \"integrity\": \"sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/resolve-uri\": \"^3.1.0\",\n        \"@jridgewell/sourcemap-codec\": \"^1.4.14\"\n      }\n    },\n    \"node_modules/@llamaindex/liteparse-darwin-arm64\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-darwin-arm64/-/liteparse-darwin-arm64-2.17.0.tgz\",\n      \"integrity\": \"sha512-ha3yTgVXVi3zucs28MnZ7Sb9jiX8Pw2SX04kuPbjUDpXh6xw+kBZ+5kZhnt5ok2SMYcHYOMJJv6ptbXBzmtg8A==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-darwin-x64\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-darwin-x64/-/liteparse-darwin-x64-2.17.0.tgz\",\n      \"integrity\": \"sha512-VsV2hzKMfHqJyW4j0FERGkaOulFSRYT9pvNH5S+oaSM8wns/5Vc1ayrtx0AcC297jL4ud1at3VVO4tqgVyALTg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-linux-arm64-gnu\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-linux-arm64-gnu/-/liteparse-linux-arm64-gnu-2.17.0.tgz\",\n      \"integrity\": \"sha512-XkMD8y5latC1klMWRvhWX6w71u6n6kCUHZtdgpY2hm4B+EfqyiBCTci6uxH+k1Bv1GjoE502U74/34YtbanrRQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-linux-x64-gnu\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-linux-x64-gnu/-/liteparse-linux-x64-gnu-2.17.0.tgz\",\n      \"integrity\": \"sha512-XFpDIDV/TX+8iHSVyClAWvTqY+NfZQld1Bfrg/vo/7FD7+uYzgkjrYxkrHXcBeqr2d8NkQ5j2Smv0TmrZ6ZzFQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-linux-x64-musl\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-linux-x64-musl/-/liteparse-linux-x64-musl-2.17.0.tgz\",\n      \"integrity\": \"sha512-tZWV2LMqHxA0jQObNjylKfJdx9289TrpG0aC5QWulsr5PfhIEWEG58aD20KWSY9ZFNkl7M/nD87X6UWil30VYw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-win32-arm64-msvc\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-win32-arm64-msvc/-/liteparse-win32-arm64-msvc-2.17.0.tgz\",\n      \"integrity\": \"sha512-vk+v3lncSUG/jG+bUZA6bHCp+FAJpUggRYvVCNuAR2PYW9bEWoNrC/PamaKKdKYCQWHoMXpl6biZ+t6NTq0l9Q==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@llamaindex/liteparse-win32-x64-msvc\": {\n      \"version\": \"2.17.0\",\n      \"resolved\": \"https://registry.npmjs.org/@llamaindex/liteparse-win32-x64-msvc/-/liteparse-win32-x64-msvc-2.17.0.tgz\",\n      \"integrity\": \"sha512-BKTY0nOrRwq11Jc8WL6Isv52b8EaRDmzZbEWevaPQCaJneh5WEntFbrm/GSYilkFS3qL086HR+9A9VN4ghtAcg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@napi-rs/cli\": {\n      \"version\": \"2.18.4\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/cli/-/cli-2.18.4.tgz\",\n      \"integrity\": \"sha512-SgJeA4df9DE2iAEpr3M2H0OKl/yjtg1BnRI5/JyowS71tUWhrfSu2LT0V3vlHET+g1hBVlrO60PmEXwUEKp8Mg==\",\n      \"dev\": true,\n      \"bin\": {\n        \"napi\": \"scripts/index.js\"\n      },\n      \"engines\": {\n        \"node\": \">= 10\"\n      },\n      \"funding\": {\n        \"type\": \"github\",\n        \"url\": \"https://github.com/sponsors/Brooooooklyn\"\n      }\n    },\n    \"node_modules/@napi-rs/lzma-linux-x64-gnu\": {\n      \"version\": \"1.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz\",\n      \"integrity\": \"sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ],\n      \"engines\": {\n        \"node\": \"^22.20 || ^24.12 || >=25\"\n      }\n    },\n    \"node_modules/@rollup/rollup-android-arm-eabi\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz\",\n      \"integrity\": \"sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-android-arm64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz\",\n      \"integrity\": \"sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"android\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-darwin-arm64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz\",\n      \"integrity\": \"sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-darwin-x64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz\",\n      \"integrity\": \"sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-freebsd-arm64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz\",\n      \"integrity\": \"sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-freebsd-x64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz\",\n      \"integrity\": \"sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"freebsd\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm-gnueabihf\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz\",\n      \"integrity\": \"sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm-musleabihf\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz\",\n      \"integrity\": \"sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==\",\n      \"cpu\": [\n        \"arm\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-arm64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-loong64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-loong64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==\",\n      \"cpu\": [\n        \"loong64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-ppc64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-ppc64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==\",\n      \"cpu\": [\n        \"ppc64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-riscv64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-riscv64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==\",\n      \"cpu\": [\n        \"riscv64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-s390x-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==\",\n      \"cpu\": [\n        \"s390x\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-x64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-linux-x64-musl\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz\",\n      \"integrity\": \"sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"linux\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-openbsd-x64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz\",\n      \"integrity\": \"sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openbsd\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-openharmony-arm64\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz\",\n      \"integrity\": \"sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"openharmony\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-arm64-msvc\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz\",\n      \"integrity\": \"sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==\",\n      \"cpu\": [\n        \"arm64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-ia32-msvc\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz\",\n      \"integrity\": \"sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==\",\n      \"cpu\": [\n        \"ia32\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-x64-gnu\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz\",\n      \"integrity\": \"sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@rollup/rollup-win32-x64-msvc\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz\",\n      \"integrity\": \"sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==\",\n      \"cpu\": [\n        \"x64\"\n      ],\n      \"dev\": true,\n      \"optional\": true,\n      \"os\": [\n        \"win32\"\n      ]\n    },\n    \"node_modules/@types/estree\": {\n      \"version\": \"1.0.9\",\n      \"resolved\": \"https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz\",\n      \"integrity\": \"sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==\",\n      \"dev\": true\n    },\n    \"node_modules/@types/node\": {\n      \"version\": \"22.19.19\",\n      \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-22.19.19.tgz\",\n      \"integrity\": \"sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"undici-types\": \"~6.21.0\"\n      }\n    },\n    \"node_modules/acorn\": {\n      \"version\": \"8.18.0\",\n      \"resolved\": \"https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz\",\n      \"integrity\": \"sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==\",\n      \"dev\": true,\n      \"bin\": {\n        \"acorn\": \"bin/acorn\"\n      },\n      \"engines\": {\n        \"node\": \">=0.4.0\"\n      }\n    },\n    \"node_modules/any-promise\": {\n      \"version\": \"1.3.0\",\n      \"resolved\": \"https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz\",\n      \"integrity\": \"sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==\",\n      \"dev\": true\n    },\n    \"node_modules/bundle-require\": {\n      \"version\": \"5.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz\",\n      \"integrity\": \"sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"load-tsconfig\": \"^0.2.3\"\n      },\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      },\n      \"peerDependencies\": {\n        \"esbuild\": \">=0.18\"\n      }\n    },\n    \"node_modules/cac\": {\n      \"version\": \"6.7.14\",\n      \"resolved\": \"https://registry.npmjs.org/cac/-/cac-6.7.14.tgz\",\n      \"integrity\": \"sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/chokidar\": {\n      \"version\": \"4.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz\",\n      \"integrity\": \"sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"readdirp\": \"^4.0.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 14.16.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/commander\": {\n      \"version\": \"12.1.0\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-12.1.0.tgz\",\n      \"integrity\": \"sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==\",\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    },\n    \"node_modules/confbox\": {\n      \"version\": \"0.1.8\",\n      \"resolved\": \"https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz\",\n      \"integrity\": \"sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==\",\n      \"dev\": true\n    },\n    \"node_modules/consola\": {\n      \"version\": \"3.4.2\",\n      \"resolved\": \"https://registry.npmjs.org/consola/-/consola-3.4.2.tgz\",\n      \"integrity\": \"sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^14.18.0 || >=16.10.0\"\n      }\n    },\n    \"node_modules/debug\": {\n      \"version\": \"4.4.3\",\n      \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.4.3.tgz\",\n      \"integrity\": \"sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"ms\": \"^2.1.3\"\n      },\n      \"engines\": {\n        \"node\": \">=6.0\"\n      },\n      \"peerDependenciesMeta\": {\n        \"supports-color\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/esbuild\": {\n      \"version\": \"0.28.2\",\n      \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz\",\n      \"integrity\": \"sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==\",\n      \"dev\": true,\n      \"hasInstallScript\": true,\n      \"bin\": {\n        \"esbuild\": \"bin/esbuild\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"optionalDependencies\": {\n        \"@esbuild/aix-ppc64\": \"0.28.2\",\n        \"@esbuild/android-arm\": \"0.28.2\",\n        \"@esbuild/android-arm64\": \"0.28.2\",\n        \"@esbuild/android-x64\": \"0.28.2\",\n        \"@esbuild/darwin-arm64\": \"0.28.2\",\n        \"@esbuild/darwin-x64\": \"0.28.2\",\n        \"@esbuild/freebsd-arm64\": \"0.28.2\",\n        \"@esbuild/freebsd-x64\": \"0.28.2\",\n        \"@esbuild/linux-arm\": \"0.28.2\",\n        \"@esbuild/linux-arm64\": \"0.28.2\",\n        \"@esbuild/linux-ia32\": \"0.28.2\",\n        \"@esbuild/linux-loong64\": \"0.28.2\",\n        \"@esbuild/linux-mips64el\": \"0.28.2\",\n        \"@esbuild/linux-ppc64\": \"0.28.2\",\n        \"@esbuild/linux-riscv64\": \"0.28.2\",\n        \"@esbuild/linux-s390x\": \"0.28.2\",\n        \"@esbuild/linux-x64\": \"0.28.2\",\n        \"@esbuild/netbsd-arm64\": \"0.28.2\",\n        \"@esbuild/netbsd-x64\": \"0.28.2\",\n        \"@esbuild/openbsd-arm64\": \"0.28.2\",\n        \"@esbuild/openbsd-x64\": \"0.28.2\",\n        \"@esbuild/openharmony-arm64\": \"0.28.2\",\n        \"@esbuild/sunos-x64\": \"0.28.2\",\n        \"@esbuild/win32-arm64\": \"0.28.2\",\n        \"@esbuild/win32-ia32\": \"0.28.2\",\n        \"@esbuild/win32-x64\": \"0.28.2\"\n      }\n    },\n    \"node_modules/fdir\": {\n      \"version\": \"6.5.0\",\n      \"resolved\": \"https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz\",\n      \"integrity\": \"sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      },\n      \"peerDependencies\": {\n        \"picomatch\": \"^3 || ^4\"\n      },\n      \"peerDependenciesMeta\": {\n        \"picomatch\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/fix-dts-default-cjs-exports\": {\n      \"version\": \"1.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz\",\n      \"integrity\": \"sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"magic-string\": \"^0.30.17\",\n        \"mlly\": \"^1.7.4\",\n        \"rollup\": \"^4.34.8\"\n      }\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.3\",\n      \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz\",\n      \"integrity\": \"sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==\",\n      \"dev\": true,\n      \"hasInstallScript\": true,\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/joycon\": {\n      \"version\": \"3.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz\",\n      \"integrity\": \"sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=10\"\n      }\n    },\n    \"node_modules/lilconfig\": {\n      \"version\": \"3.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz\",\n      \"integrity\": \"sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=14\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/antonk52\"\n      }\n    },\n    \"node_modules/lines-and-columns\": {\n      \"version\": \"1.2.4\",\n      \"resolved\": \"https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz\",\n      \"integrity\": \"sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==\",\n      \"dev\": true\n    },\n    \"node_modules/load-tsconfig\": {\n      \"version\": \"0.2.5\",\n      \"resolved\": \"https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz\",\n      \"integrity\": \"sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \"^12.20.0 || ^14.13.1 || >=16.0.0\"\n      }\n    },\n    \"node_modules/magic-string\": {\n      \"version\": \"0.30.21\",\n      \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz\",\n      \"integrity\": \"sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/sourcemap-codec\": \"^1.5.5\"\n      }\n    },\n    \"node_modules/mlly\": {\n      \"version\": \"1.8.2\",\n      \"resolved\": \"https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz\",\n      \"integrity\": \"sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"acorn\": \"^8.16.0\",\n        \"pathe\": \"^2.0.3\",\n        \"pkg-types\": \"^1.3.1\",\n        \"ufo\": \"^1.6.3\"\n      }\n    },\n    \"node_modules/ms\": {\n      \"version\": \"2.1.3\",\n      \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.3.tgz\",\n      \"integrity\": \"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==\",\n      \"dev\": true\n    },\n    \"node_modules/mz\": {\n      \"version\": \"2.7.0\",\n      \"resolved\": \"https://registry.npmjs.org/mz/-/mz-2.7.0.tgz\",\n      \"integrity\": \"sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"any-promise\": \"^1.0.0\",\n        \"object-assign\": \"^4.0.1\",\n        \"thenify-all\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/object-assign\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz\",\n      \"integrity\": \"sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=0.10.0\"\n      }\n    },\n    \"node_modules/pathe\": {\n      \"version\": \"2.0.3\",\n      \"resolved\": \"https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz\",\n      \"integrity\": \"sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==\",\n      \"dev\": true\n    },\n    \"node_modules/picocolors\": {\n      \"version\": \"1.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz\",\n      \"integrity\": \"sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==\",\n      \"dev\": true\n    },\n    \"node_modules/picomatch\": {\n      \"version\": \"4.0.5\",\n      \"resolved\": \"https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz\",\n      \"integrity\": \"sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=12\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/jonschlinkert\"\n      }\n    },\n    \"node_modules/pirates\": {\n      \"version\": \"4.0.7\",\n      \"resolved\": \"https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz\",\n      \"integrity\": \"sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/pkg-types\": {\n      \"version\": \"1.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz\",\n      \"integrity\": \"sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"confbox\": \"^0.1.8\",\n        \"mlly\": \"^1.7.4\",\n        \"pathe\": \"^2.0.1\"\n      }\n    },\n    \"node_modules/postcss-load-config\": {\n      \"version\": \"6.0.1\",\n      \"resolved\": \"https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz\",\n      \"integrity\": \"sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==\",\n      \"dev\": true,\n      \"funding\": [\n        {\n          \"type\": \"opencollective\",\n          \"url\": \"https://opencollective.com/postcss/\"\n        },\n        {\n          \"type\": \"github\",\n          \"url\": \"https://github.com/sponsors/ai\"\n        }\n      ],\n      \"dependencies\": {\n        \"lilconfig\": \"^3.1.1\"\n      },\n      \"engines\": {\n        \"node\": \">= 18\"\n      },\n      \"peerDependencies\": {\n        \"jiti\": \">=1.21.0\",\n        \"postcss\": \">=8.0.9\",\n        \"tsx\": \"^4.8.1\",\n        \"yaml\": \"^2.4.2\"\n      },\n      \"peerDependenciesMeta\": {\n        \"jiti\": {\n          \"optional\": true\n        },\n        \"postcss\": {\n          \"optional\": true\n        },\n        \"tsx\": {\n          \"optional\": true\n        },\n        \"yaml\": {\n          \"optional\": true\n        }\n      }\n    },\n    \"node_modules/readdirp\": {\n      \"version\": \"4.1.2\",\n      \"resolved\": \"https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz\",\n      \"integrity\": \"sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 14.18.0\"\n      },\n      \"funding\": {\n        \"type\": \"individual\",\n        \"url\": \"https://paulmillr.com/funding/\"\n      }\n    },\n    \"node_modules/resolve-from\": {\n      \"version\": \"5.0.0\",\n      \"resolved\": \"https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz\",\n      \"integrity\": \"sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">=8\"\n      }\n    },\n    \"node_modules/rollup\": {\n      \"version\": \"4.62.4\",\n      \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz\",\n      \"integrity\": \"sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@types/estree\": \"1.0.9\"\n      },\n      \"bin\": {\n        \"rollup\": \"dist/bin/rollup\"\n      },\n      \"engines\": {\n        \"node\": \">=18.0.0\",\n        \"npm\": \">=8.0.0\"\n      },\n      \"optionalDependencies\": {\n        \"@napi-rs/lzma-linux-x64-gnu\": \"1.5.1\",\n        \"@rollup/rollup-android-arm-eabi\": \"4.62.4\",\n        \"@rollup/rollup-android-arm64\": \"4.62.4\",\n        \"@rollup/rollup-darwin-arm64\": \"4.62.4\",\n        \"@rollup/rollup-darwin-x64\": \"4.62.4\",\n        \"@rollup/rollup-freebsd-arm64\": \"4.62.4\",\n        \"@rollup/rollup-freebsd-x64\": \"4.62.4\",\n        \"@rollup/rollup-linux-arm-gnueabihf\": \"4.62.4\",\n        \"@rollup/rollup-linux-arm-musleabihf\": \"4.62.4\",\n        \"@rollup/rollup-linux-arm64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-arm64-musl\": \"4.62.4\",\n        \"@rollup/rollup-linux-loong64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-loong64-musl\": \"4.62.4\",\n        \"@rollup/rollup-linux-ppc64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-ppc64-musl\": \"4.62.4\",\n        \"@rollup/rollup-linux-riscv64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-riscv64-musl\": \"4.62.4\",\n        \"@rollup/rollup-linux-s390x-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-x64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-linux-x64-musl\": \"4.62.4\",\n        \"@rollup/rollup-openbsd-x64\": \"4.62.4\",\n        \"@rollup/rollup-openharmony-arm64\": \"4.62.4\",\n        \"@rollup/rollup-win32-arm64-msvc\": \"4.62.4\",\n        \"@rollup/rollup-win32-ia32-msvc\": \"4.62.4\",\n        \"@rollup/rollup-win32-x64-gnu\": \"4.62.4\",\n        \"@rollup/rollup-win32-x64-msvc\": \"4.62.4\",\n        \"fsevents\": \"~2.3.2\"\n      }\n    },\n    \"node_modules/source-map\": {\n      \"version\": \"0.7.6\",\n      \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz\",\n      \"integrity\": \"sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 12\"\n      }\n    },\n    \"node_modules/sucrase\": {\n      \"version\": \"3.35.1\",\n      \"resolved\": \"https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz\",\n      \"integrity\": \"sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"@jridgewell/gen-mapping\": \"^0.3.2\",\n        \"commander\": \"^4.0.0\",\n        \"lines-and-columns\": \"^1.1.6\",\n        \"mz\": \"^2.7.0\",\n        \"pirates\": \"^4.0.1\",\n        \"tinyglobby\": \"^0.2.11\",\n        \"ts-interface-checker\": \"^0.1.9\"\n      },\n      \"bin\": {\n        \"sucrase\": \"bin/sucrase\",\n        \"sucrase-node\": \"bin/sucrase-node\"\n      },\n      \"engines\": {\n        \"node\": \">=16 || 14 >=14.17\"\n      }\n    },\n    \"node_modules/sucrase/node_modules/commander\": {\n      \"version\": \"4.1.1\",\n      \"resolved\": \"https://registry.npmjs.org/commander/-/commander-4.1.1.tgz\",\n      \"integrity\": \"sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==\",\n      \"dev\": true,\n      \"engines\": {\n        \"node\": \">= 6\"\n      }\n    },\n    \"node_modules/thenify\": {\n      \"version\": \"3.3.1\",\n      \"resolved\": \"https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz\",\n      \"integrity\": \"sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"any-promise\": \"^1.0.0\"\n      }\n    },\n    \"node_modules/thenify-all\": {\n      \"version\": \"1.6.0\",\n      \"resolved\": \"https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz\",\n      \"integrity\": \"sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"thenify\": \">= 3.1.0 < 4\"\n      },\n      \"engines\": {\n        \"node\": \">=0.8\"\n      }\n    },\n    \"node_modules/tinyexec\": {\n      \"version\": \"0.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz\",\n      \"integrity\": \"sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==\",\n      \"dev\": true\n    },\n    \"node_modules/tinyglobby\": {\n      \"version\": \"0.2.17\",\n      \"resolved\": \"https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz\",\n      \"integrity\": \"sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"fdir\": \"^6.5.0\",\n        \"picomatch\": \"^4.0.4\"\n      },\n      \"engines\": {\n        \"node\": \">=12.0.0\"\n      },\n      \"funding\": {\n        \"url\": \"https://github.com/sponsors/SuperchupuDev\"\n      }\n    },\n    \"node_modules/tree-kill\": {\n      \"version\": \"1.2.2\",\n      \"resolved\": \"https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz\",\n      \"integrity\": \"sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==\",\n      \"dev\": true,\n      \"bin\": {\n        \"tree-kill\": \"cli.js\"\n      }\n    },\n    \"node_modules/ts-interface-checker\": {\n      \"version\": \"0.1.13\",\n      \"resolved\": \"https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz\",\n      \"integrity\": \"sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==\",\n      \"dev\": true\n    },\n    \"node_modules/tsup\": {\n      \"version\": \"8.5.1\",\n      \"resolved\": \"https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz\",\n      \"integrity\": \"sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==\",\n      \"dev\": true,\n      \"dependencies\": {\n        \"bundle-require\": \"^5.1.0\",\n        \"cac\": \"^6.7.14\",\n        \"chokidar\": \"^4.0.3\",\n        \"consola\": \"^3.4.0\",\n        \"debug\": \"^4.4.0\",\n        \"esbuild\": \"^0.27.0\",\n        \"fix-dts-default-cjs-exports\": \"^1.0.0\",\n        \"joycon\": \"^3.1.1\",\n        \"picocolors\": \"^1.1.1\",\n        \"postcss-load-config\": \"^6.0.1\",\n        \"resolve-from\": \"^5.0.0\",\n        \"rollup\": \"^4.34.8\",\n        \"source-map\": \"^0.7.6\",\n        \"sucrase\": \"^3.35.0\",\n        \"tinyexec\": \"^0.3.2\",\n        \"tinyglobby\": \"^0.2.11\",\n        \"tree-kill\": \"^1.2.2\"\n      },\n      \"bin\": {\n        \"tsup\": \"dist/cli-default.js\",\n        \"tsup-node\": \"dist/cli-node.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"peerDependencies\": {\n        \"@microsoft/api-extractor\": \"^7.36.0\",\n        \"@swc/co\n\n<!-- File: packages/node/package.json (Tokens: ~817 | Category: anthropic-skill) -->\n{\n  \"name\": \"@llamaindex/liteparse\",\n  \"version\": \"2.17.0\",\n  \"description\": \"Fast, lightweight PDF and document parsing with spatial text extraction\",\n  \"type\": \"module\",\n  \"main\": \"./dist/lib.cjs\",\n  \"module\": \"./dist/lib.js\",\n  \"types\": \"./dist/lib.d.ts\",\n  \"sideEffects\": false,\n  \"bin\": {\n    \"lit\": \"./dist/cli.js\",\n    \"liteparse\": \"./dist/cli.js\"\n  },\n  \"exports\": {\n    \".\": {\n      \"import\": {\n        \"types\": \"./dist/lib.d.ts\",\n        \"default\": \"./dist/lib.js\"\n      },\n      \"require\": {\n        \"types\": \"./dist/lib.d.cts\",\n        \"default\": \"./dist/lib.cjs\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"napi\": {\n    \"name\": \"liteparse\",\n    \"triples\": {\n      \"defaults\": true,\n      \"additional\": [\n        \"aarch64-apple-darwin\",\n        \"aarch64-unknown-linux-gnu\",\n        \"aarch64-pc-windows-msvc\",\n        \"x86_64-unknown-linux-musl\"\n      ]\n    }\n  },\n  \"files\": [\n    \"dist\",\n    \"*.node\",\n    \"*.dylib\",\n    \"*.so\",\n    \"*.so.*\",\n    \"*.dll\",\n    \"README.md\",\n    \"LICENSE\"\n  ],\n  \"scripts\": {\n    \"build:rs\": \"napi build --cargo-cwd ../../crates/liteparse-napi --platform --release --js false --dts native.d.ts .\",\n    \"build:pdfium\": \"bash scripts/copy-pdfium.sh .\",\n    \"build:ts\": \"node scripts/clean-dist.mjs && tsc --noEmit && tsup\",\n    \"build\": \"npm run build:rs && npm run build:pdfium && npm run build:ts\",\n    \"test\": \"npm run build:ts && node --test tests/\",\n    \"prepublishOnly\": \"npm run build\"\n  },\n  \"dependencies\": {\n    \"commander\": \"^12.0.0\"\n  },\n  \"devDependencies\": {\n    \"@napi-rs/cli\": \"^2.18.4\",\n    \"@types/node\": \"^22.0.0\",\n    \"tsup\": \"^8.5.0\",\n    \"typescript\": \"~5.9.2\"\n  },\n  \"optionalDependencies\": {\n    \"@llamaindex/liteparse-darwin-arm64\": \"2.17.0\",\n    \"@llamaindex/liteparse-darwin-x64\": \"2.17.0\",\n    \"@llamaindex/liteparse-linux-arm64-gnu\": \"2.17.0\",\n    \"@llamaindex/liteparse-linux-x64-gnu\": \"2.17.0\",\n    \"@llamaindex/liteparse-win32-arm64-msvc\": \"2.17.0\",\n    \"@llamaindex/liteparse-win32-x64-msvc\": \"2.17.0\",\n    \"@llamaindex/liteparse-linux-x64-musl\": \"2.17.0\"\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  },\n  \"keywords\": [\n    \"pdf\",\n    \"parser\",\n    \"ocr\",\n    \"text-extraction\",\n    \"pdf-to-text\",\n    \"document-parsing\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/run-llama/liteparse.git\"\n  },\n  \"author\": \"LlamaIndex\",\n  \"license\": \"Apache-2.0\",\n  \"overrides\": {\n    \"esbuild\": \"^0.28.2\"\n  }\n}\n\n<!-- File: packages/node/tsconfig.json (Tokens: ~131 | Category: anthropic-skill) -->\n{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"NodeNext\",\n    \"moduleResolution\": \"NodeNext\",\n    \"rootDir\": \"./src\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    // Type checking only — tsup owns emit (see tsup.config.ts). Keeping this\n    // noEmit prevents a bare `tsc` from producing an ESM-only dist/.\n    \"noEmit\": true\n  },\n  \"include\": [\"src\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n\n<!-- File: packages/wasm/package.json (Tokens: ~475 | Category: anthropic-skill) -->\n{\n  \"name\": \"@llamaindex/liteparse-wasm\",\n  \"version\": \"2.17.0\",\n  \"description\": \"Fast, lightweight PDF parsing with spatial text extraction — WebAssembly build for browsers\",\n  \"type\": \"module\",\n  \"main\": \"./pkg/liteparse_wasm.js\",\n  \"types\": \"./pkg/liteparse_wasm.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./pkg/liteparse_wasm.d.ts\",\n      \"import\": \"./pkg/liteparse_wasm.js\"\n    },\n    \"./liteparse_wasm_bg.wasm\": \"./pkg/liteparse_wasm_bg.wasm\",\n    \"./package.json\": \"./package.json\"\n  },\n  \"files\": [\n    \"pkg\",\n    \"README.md\",\n    \"LICENSE\"\n  ],\n  \"scripts\": {\n    \"build\": \"wasm-pack build ../../crates/liteparse-wasm --release --target web --out-dir ../../packages/wasm/pkg --out-name liteparse_wasm && node scripts/patch-wasi-imports.js\",\n    \"build:bundler\": \"wasm-pack build ../../crates/liteparse-wasm --release --target bundler --out-dir ../../packages/wasm/pkg --out-name liteparse_wasm && node scripts/patch-wasi-imports.js\",\n    \"build:nodejs\": \"wasm-pack build ../../crates/liteparse-wasm --release --target nodejs --out-dir ../../packages/wasm/pkg --out-name liteparse_wasm && node scripts/patch-wasi-imports.js\",\n    \"clean\": \"rm -rf pkg\",\n    \"prepublishOnly\": \"npm run build\"\n  },\n  \"keywords\": [\n    \"pdf\",\n    \"parser\",\n    \"ocr\",\n    \"text-extraction\",\n    \"pdf-to-text\",\n    \"wasm\",\n    \"webassembly\",\n    \"browser\",\n    \"document-parsing\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/run-llama/liteparse.git\"\n  },\n  \"author\": \"LlamaIndex\",\n  \"license\": \"Apache-2.0\",\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n\n<!-- File: packages/node/README.md (Tokens: ~2329 | Category: plugin-manifest) -->\n# LiteParse Node.js\n\nNode.js/TypeScript bindings for [LiteParse](https://github.com/run-llama/liteparse) — fast, lightweight PDF and document parsing with spatial text extraction.\n\n## Installation\n\n```bash\nnpm i @llamaindex/liteparse\n```\n\nThis also installs the `lit` CLI command (use `npm i -g` for global access).\n\n## Quick Start\n\n```typescript\nimport { LiteParse } from '@llamaindex/liteparse';\n\nconst parser = new LiteParse();\nconst result = await parser.parse('document.pdf');\nconsole.log(result.text);\nconsole.log(`Source document pages: ${result.totalPages}`);\n\n// Access structured data\nfor (const page of result.pages) {\n  console.log(`Page ${page.pageNum}: ${page.textItems.length} text items`);\n}\n```\n\nCommonJS is supported as well:\n\n```javascript\nconst { LiteParse } = require('@llamaindex/liteparse');\n\n(async () => {\n  const parser = new LiteParse();\n  const result = await parser.parse('document.pdf');\n  console.log(result.text);\n})();\n```\n\n### Bounded-memory parsing\n\nFor documents with many text items, consume page batches without retaining\nearlier results:\n\n```typescript\nconst parser = new LiteParse();\nfor await (const batch of parser.parseBatches('large.pdf', { batchSize: 20 })) {\n  await processPages(batch.result.pages);\n}\n```\n\nEach batch is an ordinary parse result covering `batch.startPage` through\n`batch.endPage`, and becomes collectible as soon as you advance the iterator.\nA non-PDF source is converted once, not once per batch.\n\nCross-page passes only see the pages in their own batch, so repeated\nheader/footer removal and image deduplication are batch-local and the output\ncan differ from `parse()`. Prefer `parse()` unless the size of the\nmaterialized result is the problem.\n\n## Markdown Output\n\nLiteParse can render documents directly to Markdown including headings, tables, lists,\nimages, and links reconstructed from the spatial layout. Great for feeding LLMs\nand RAG pipelines. The rendered Markdown is returned on `result.text`:\n\n```typescript\nconst parser = new LiteParse({\n  outputFormat: 'markdown',     // \"json\" | \"text\" | \"markdown\"\n  imageMode: 'placeholder',     // \"placeholder\" | \"off\" | \"embed\"\n  extractLinks: true,           // render [text](url) link syntax (default: true)\n});\nconst result = await parser.parse('document.pdf');\nconsole.log(result.text); // rendered Markdown\n```\n\n> Reconstruction quality varies with document complexity.\n\n## Configuration\n\nAll options are passed to the constructor:\n\n```typescript\nconst parser = new LiteParse({\n  ocrEnabled: true,              // Enable OCR (default: true)\n  ocrLanguage: 'eng',           // Tesseract language code\n  ocrServerUrl: undefined,       // HTTP OCR server URL (optional)\n  tessdataPath: undefined,       // Path to tessdata directory (optional)\n  maxPages: 1000,                // Max pages to parse\n  targetPages: '1-5,10',        // Specific pages (optional)\n  extractScreenshots: false,    // Return parsed pages as PNG buffers\n  continueOnPageError: false,   // Skip broken pages and return pageErrors\n  dpi: 150,                      // Rendering DPI\n  outputFormat: 'json',          // \"json\" | \"text\" | \"markdown\"\n  imageMode: 'placeholder',      // Markdown image handling: \"placeholder\" | \"off\" | \"embed\"\n  extractImages: true,           // Extract image bytes + metadata (default: false)\n  imageOutputDir: './images',    // Write images and return name/path metadata (optional)\n  extractLinks: true,            // Render [text](url) links in markdown output\n  keepHeadersFooters: false,     // Keep running headers/footers in markdown output\n  extractVectorGraphics: false,  // Opt-in shapes + merged H/V lines per page\n  extractAnnotations: false,     // Include page annotations in structured output\n  extractFormFields: false,      // Include AcroForm widget fields and values\n  extractStructureTree: false,   // Include tagged-PDF logical structure\n  extractXfaPackets: false,      // Include raw XFA packets (name + XML content)\n  extractContentBounds: false,   // Include per-page contentBounds union bbox\n  detectScreenshotRects: false,  // Detect solid rects/lines in screenshots\n  preserveVerySmallText: false,  // Keep tiny text\n  extractTextMetadata: false,    // Opt in to MCID, font metrics, colors, char codes, and trailingSpaceGenerated\n  password: undefined,           // Password for protected documents\n  quiet: false,                  // Suppress progress output\n  numWorkers: 4,                 // Concurrent OCR workers\n});\n```\n\nWhen `extractImages` is true, image extraction is enabled. `imageOutputDir` requires\nthat explicit opt-in and writes the extracted bytes to disk. Each\n`result.images` entry includes its page bbox, intrinsic pixel dimensions, rotation,\nformat, `name`, and `path`. Valid source JPEGs are preserved, exact duplicates reuse\none file, and JSON CLI output contains metadata only (no base64 image data).\n`imageMode` controls Markdown presentation only and does not imply extraction. With\n`extractImages: false`, lightweight Markdown placement refs are still collected and\n`result.images` stays empty.\n\nThe Node CLI uses the same snake_case JSON schema as the Rust CLI; camelCase is\nreserved for the programmatic Node API.\n\nWhen `extractAnnotations` is enabled, each parsed page has an `annotations`\narray containing the subtype, contents, author/title, PDF date strings,\nviewport-space rectangle and quadpoint rectangles, and URI for external link\nannotations. It is independent of `extractLinks`, which controls Markdown link\nrendering. The field is omitted when extraction is disabled.\n\nWhen `extractStructureTree` is enabled, each page has a `structureTree` containing\nall tagged-PDF roots and recursive elements with type, ID, actual/alternate text,\ntitle, typed attributes, MCIDs, children, and referenced link annotations. Untagged\npages have an empty `roots` array; the field is omitted when disabled.\n\nEvery result also carries the document's `/Info` `creator`/`producer` when\npresent. With `extractDocumentMetadata`, `result.docMeta` adds a provenance\nobject with dates, PDF version/security, signature state, incremental-save\nmarkers, trailer ID comparison, the catalog's XMP packet (capped at 64 KiB;\nskipped for sources over 16 MiB), and source size — off by default since it\nstreams the whole file, and absent for inputs converted from a non-PDF\nformat. These are API-level only, not in CLI JSON. With `extractContentBounds`\neach page carries a `contentBounds` union bbox of its top-level content\nobjects. With `extractXfaPackets`, `result.xfaPackets` lists each raw XFA\npacket (index, name, content length, XML content); non-XFA documents yield an\nempty array. Screenshots draw form-field appearances into the raster and\nreport `isSolidFill` per page, plus detected solid `rects` when\n`detectScreenshotRects` is enabled.\n\n## Parsing from Bytes\n\nPass a `Buffer` or `Uint8Array` directly — useful for HTTP responses or in-memory data:\n\n```typescript\nimport { readFile } from 'fs/promises';\n\nconst pdfBytes = await readFile('document.pdf');\nconst result = await parser.parse(pdfBytes);\nconsole.log(result.text);\n```\n\n## Worker Pool and Hard Timeouts\n\nPDFium is not thread-safe, so all parses inside one process serialize on a\nprocess-global lock — even `Promise.all` over multiple `parse()` calls runs\nthem one at a time.\n\nFor high-throughput services, or for cases when you need to enforce a\nruntime timeout, run parses in a pool of persistent worker processes instead:\n\n```typescript\nimport { LiteParse, ParseTimeoutError } from '@llamaindex/liteparse';\n\nconst parser = new LiteParse({ poolSize: 4, parseTimeoutMs: 15_000 });\nawait parser.warmUp(); // optional: pre-initialize workers (~45ms total)\n\ntry {\n  const result = await parser.parse('document.pdf');\n} catch (e) {\n  if (e instanceof ParseTimeoutError) {\n    console.warn(`killed rogue document: ${e.source} (deadline ${e.timeoutMs}ms)`);\n  }\n}\n\nparser.close(); // frees workers immediately; an idle pool never blocks exit\n```\n\n## Screenshots\n\nGenerate PNG screenshots of document pages:\n\n```typescript\nconst screenshots = parser.screenshot('document.pdf', [1, 2, 3]);\nfor (const s of screenshots) {\n  console.log(`Page ${s.pageNum}: ${s.width}x${s.height}`);\n  // s.imageBuffer contains PNG bytes\n}\n```\n\n## Document Complexity\n\nBefore committing to a full parse, check whether a document needs OCR or heavier\nprocessing. `isComplex` is a cheap, text-layer-only pass that returns one entry per page\nwith a `needsOcr` verdict and the signals behind it — useful for routing documents to\ndifferent pipelines, rejecting ones you can't handle, or estimating cost.\n\n```typescript\nconst parser = new LiteParse();\nconst pages = await parser.isComplex('document.pdf');\n\nif (pages.some((p) => p.needsOcr)) {\n  // Route to the OCR-enabled pipeline\n  const result = await parser.parse('document.pdf');\n} else {\n  // Cheap path — skip OCR entirely\n  const result = await new LiteParse({ ocrEnabled: false }).parse('document.pdf');\n}\n\n// Inspect why specific pages were flagged\nfor (const page of pages.filter((p) => p.needsOcr)) {\n  console.log(`Page ${page.pageNumber}: ${page.reasons.join(', ')}`);\n}\n```\n\n`reasons` is one of `\"scanned\"`, `\"no-text\"`, `\"sparse-text\"`, `\"embedded-images\"`,\n`\"garbled\"`, `\"vector-text\"`, or `\"annotation-text\"`. Raw bytes work here too.\n\n## Supported Formats\n\n- PDF (`.pdf`)\n- Microsoft Office (`.docx`, `.xlsx`, `.pptx`, etc.) — requires LibreOffice\n- OpenDocument (`.odt`, `.ods`, `.odp`) — requires LibreOffice\n- Images (`.png`, `.jpg`, `.tiff`, etc.)\n- And more!\n\n## CLI\n\nThe npm package includes the `lit` CLI:\n\n```bash\nlit parse document.pdf\nlit parse document.pdf --format json -o output.json\nlit parse document.pdf --format json --extract-annotations\nlit parse document.pdf --format json --extract-form-fields\nlit screenshot document.pdf -o ./screenshots\nlit batch-parse ./input ./output\nlit is-complex document.pdf\n```\n\n<!-- File: packages/python/README.md (Tokens: ~1769 | Category: plugin-manifest) -->\n# LiteParse Python\n\nPython bindings for [LiteParse](https://github.com/run-llama/liteparse) — fast, lightweight PDF and document parsing with spatial text extraction.\n\n## Installation\n\n```bash\npip install liteparse\n```\n\nThis also installs the `lit` CLI command.\n\n## Quick Start\n\n```python\nfrom liteparse import LiteParse\n\nparser = LiteParse()\nresult = parser.parse(\"document.pdf\")\nprint(result.text)\nprint(f\"Source document pages: {result.total_pages}\")\n\n# Access structured data\nfor page in result.pages:\n    print(f\"Page {page.page_num}: {len(page.text_items)} text items\")\n```\n\n## Markdown Output\n\nLiteParse can render documents directly to Markdown including headings, tables, lists,\nimages, and links reconstructed from the spatial layout. Great for feeding LLMs\nand RAG pipelines. The rendered Markdown is returned on `result.text`:\n\n```python\nparser = LiteParse(\n    output_format=\"markdown\",   # \"json\" | \"text\" | \"markdown\"\n    image_mode=\"placeholder\",   # \"placeholder\" | \"off\" | \"embed\"\n    extract_links=True,         # render [text](url) link syntax (default: True)\n)\nresult = parser.parse(\"document.pdf\")\nprint(result.text)  # rendered Markdown\n```\n\n> Reconstruction quality varies with document complexity.\n\n## Configuration\n\nAll options are passed to the constructor:\n\n```python\nparser = LiteParse(\n    ocr_enabled=True,              # Enable OCR (default: True)\n    ocr_language=\"eng\",            # Tesseract language code\n    ocr_server_url=None,           # HTTP OCR server URL (optional)\n    tessdata_path=None,            # Path to tessdata directory (optional)\n    max_pages=1000,                # Max pages to parse\n    target_pages=\"1-5,10\",         # Specific pages (optional)\n    extract_screenshots=False,      # Return parsed pages as PNG bytes\n    continue_on_page_error=False,   # Skip broken pages and return page_errors\n    dpi=150,                       # Rendering DPI\n    output_format=\"json\",          # \"json\" | \"text\" | \"markdown\"\n    image_mode=\"placeholder\",      # Markdown image handling: \"placeholder\" | \"off\" | \"embed\"\n    extract_images=True,           # Extract image bytes + metadata (default: False)\n    image_output_dir=\"./images\",   # Write images and return name/path metadata (optional)\n    extract_links=True,            # Render [text](url) links in markdown output\n    keep_headers_footers=False,    # Keep running headers/footers in markdown output\n    extract_vector_graphics=False, # Opt-in shapes + merged H/V lines per page\n    extract_annotations=False,     # Include page annotations in structured output\n    extract_form_fields=False,      # Include AcroForm widget fields and values\n    extract_structure_tree=False,   # Include tagged-PDF logical structure\n    preserve_very_small_text=False, # Keep tiny text\n    extract_text_metadata=False,    # Opt in to MCID, font metrics, colors, char codes, and trailing_space_generated\n    password=None,                 # Password for protected documents\n    quiet=False,                   # Suppress progress output\n    num_workers=4,                 # Concurrent OCR workers\n)\n```\n\nWhen ``extract_images=True``, image extraction is enabled. ``image_output_dir``\nrequires that explicit opt-in and writes the extracted bytes to disk. Each\n``result.images`` entry includes its page bbox, intrinsic pixel dimensions, rotation,\nformat, ``name``, and ``path``. Valid source JPEGs are preserved, exact duplicates\nreuse one file, and JSON CLI output contains metadata only (no base64 image data).\n``image_mode`` controls Markdown presentation only and does not imply extraction.\nWith ``extract_images=False``, lightweight Markdown placement refs are still collected\nand ``result.images`` stays empty.\n\nWhen `extract_annotations` is enabled, each parsed page has an `annotations`\nlist containing the subtype, contents, author/title, PDF date strings,\nviewport-space rectangle and quadpoint rectangles, and URI for external link\nannotations. It is independent of `extract_links`, which controls Markdown\nlink rendering. The field is `None` when extraction is disabled.\n\nWhen ``extract_structure_tree=True``, each page has a ``structure_tree`` containing\nall tagged-PDF roots and recursive elements with type, ID, actual/alternate text,\ntitle, typed attributes, MCIDs, children, and referenced link annotations. Untagged\npages have an empty ``roots`` list; the field is ``None`` when disabled.\n\nEvery result also carries ``creator``/``producer`` from the PDF ``/Info``\ndictionary. With ``extract_document_metadata=True``, ``result.doc_meta`` adds a\nprovenance object with dates, PDF version/security, signature state,\nincremental-save markers, trailer ID comparison, the catalog's XMP packet\n(capped at 64 KiB; skipped for sources over 16 MiB), and source size. It is off by default because it streams the whole source file,\nand it is ``None`` for inputs converted from a non-PDF format. These document\nfields are API-only and do not alter default CLI JSON.\n\n## Parsing from Bytes\n\nPass raw PDF bytes directly — useful for web uploads or downloaded files:\n\n```python\nwith open(\"document.pdf\", \"rb\") as f:\n    result = parser.parse(f.read())\nprint(result.text)\n```\n\n## Worker Pool and Hard Timeouts\n\nPDFium is not thread-safe, so in-process parses serialize on a process-global\nlock. For high-throughput services, or cases where you need to enforce a timeout,\nrun parses in a pool of persistent worker processes instead:\n\n```python\nfrom liteparse import LiteParse, ParseTimeoutError\n\nparser = LiteParse(pool_size=4, parse_timeout=15)\nparser.warm_up()  # optional: pre-initialize workers (~60ms total)\n\ntry:\n    result = parser.parse(\"document.pdf\")\nexcept ParseTimeoutError as e:\n    print(f\"killed rogue document: {e.source} (deadline {e.timeout}s)\")\n\nparser.close()  # or use `with LiteParse(...) as parser:`\n```\n\n## Screenshots\n\nGenerate PNG screenshots of document pages:\n\n```python\nscreenshots = parser.screenshot(\"document.pdf\", page_numbers=[1, 2, 3])\nfor s in screenshots:\n    print(f\"Page {s.page_num}: {s.width}x{s.height}\")\n    with open(f\"page_{s.page_num}.png\", \"wb\") as f:\n        f.write(s.image_bytes)\n```\n\n## Document Complexity\n\nBefore committing to a full parse, check whether a document needs OCR or heavier\nprocessing. `is_complex` is a cheap, text-layer-only pass that returns one entry per page\nwith a `needs_ocr` verdict and the signals behind it — useful for routing documents to\ndifferent pipelines, rejecting ones you can't handle, or estimating cost.\n\n```python\nparser = LiteParse()\npages = parser.is_complex(\"document.pdf\")\n\nif any(p.needs_ocr for p in pages):\n    # Route to the OCR-enabled pipeline\n    result = parser.parse(\"document.pdf\")\nelse:\n    # Cheap path — skip OCR entirely\n    result = LiteParse(ocr_enabled=False).parse(\"document.pdf\")\n\n# Inspect why specific pages were flagged\nfor page in pages:\n    if page.needs_ocr:\n        print(f\"Page {page.page_number}: {', '.join(page.reasons)}\")\n```\n\n`reasons` is one of `\"scanned\"`, `\"no-text\"`, `\"sparse-text\"`, `\"embedded-images\"`,\n`\"garbled\"`, `\"vector-text\"`, or `\"annotation-text\"`. Raw bytes work here too.\n\n## Supported Formats\n\n- PDF (`.pdf`)\n- Microsoft Office (`.docx`, `.xlsx`, `.pptx`, etc.) — requires LibreOffice\n- OpenDocument (`.odt`, `.ods`, `.odp`) — requires LibreOffice\n- Images (`.png`, `.jpg`, `.tiff`, etc.)\n- And more!\n\n## CLI\n\nThe Python package includes the `lit` CLI:\n\n```bash\nlit parse document.pdf\nlit parse document.pdf --format json -o output.json\nlit parse document.pdf --format json --extract-annotations\nlit parse document.pdf --format json --extract-form-fields\nlit screenshot document.pdf -o ./screenshots\nlit batch-parse ./input ./output\nlit is-complex document.pdf\n```\n\n<!-- File: packages/wasm/README.md (Tokens: ~1412 | Category: plugin-manifest) -->\n# @llamaindex/liteparse-wasm\n\nBrowser/WebAssembly build of [LiteParse](https://github.com/run-llama/liteparse) — a fast, lightweight PDF parser with spatial text extraction.\n\nThis package runs entirely in the browser. No server, no cloud calls.\n\n## Install\n\n```sh\nnpm install @llamaindex/liteparse-wasm\n```\n\n## Quick start\n\n```ts\nimport init, { LiteParse } from \"@llamaindex/liteparse-wasm\";\n\n// Load the wasm module (point at the file shipped with the package).\nawait init();\n\nconst parser = new LiteParse({\n  ocrEnabled: false, // OCR requires a JS-side engine (see below)\n  outputFormat: \"json\",\n});\n\n// `data` is a Uint8Array (e.g. from fetch / File / drag-drop).\nconst bytes = new Uint8Array(await file.arrayBuffer());\nconst result = await parser.parse(bytes);\n\nconsole.log(result.text);          // full document text\nconsole.log(result.pages[0]);      // per-page items with bboxes\n```\n\n## Document complexity\n\nBefore committing to a full parse, check whether a document needs OCR or heavier\nprocessing. `isComplex` is a cheap, text-layer-only pass that returns one entry per page\nwith a `needsOcr` verdict and the signals behind it — useful for routing documents or\ndeciding whether the JS-side OCR engine is worth wiring up.\n\n```ts\nconst parser = new LiteParse({ ocrEnabled: false });\nconst bytes = new Uint8Array(await file.arrayBuffer());\nconst pages = await parser.isComplex(bytes);\n\nif (pages.some((p) => p.needsOcr)) {\n  // This document would benefit from OCR — see \"OCR in the browser\" below\n  for (const page of pages.filter((p) => p.needsOcr)) {\n    console.log(`Page ${page.pageNumber}: ${page.reasons.join(\", \")}`);\n  }\n}\n```\n\n`reasons` is one of `\"scanned\"`, `\"no-text\"`, `\"sparse-text\"`, `\"embedded-images\"`,\n`\"garbled\"`, `\"vector-text\"`, or `\"annotation-text\"`.\n\n## Config options\n\nAll optional, camelCase:\n\n| Option | Type | Default | Description |\n|---|---|---|---|\n| `ocrLanguage` | `string` | `\"eng\"` | Language code passed to the OCR engine |\n| `ocrEnabled` | `boolean` | `false` | Run OCR on text-sparse pages |\n| `maxPages` | `number` | `1000` | Stop after this many pages |\n| `targetPages` | `string` | — | e.g. `\"1-5,10,15-20\"` |\n| `extractScreenshots` | `boolean` | `false` | Return parsed pages as PNG bytes on `result.screenshots` |\n| `dpi` | `number` | `150` | Render DPI for OCR / screenshots |\n| `outputFormat` | `\"json\" \\| \"text\" \\| \"markdown\"` | `\"json\"` | Output format; `\"markdown\"` returns rendered Markdown on `result.text` |\n| `imageMode` | `\"off\" \\| \"placeholder\" \\| \"embed\"` | `\"placeholder\"` | How raster images are surfaced in markdown output |\n| `extractLinks` | `boolean` | `true` | Render hyperlink annotations as `[text](url)` in markdown output |\n| `extractVectorGraphics` | `boolean` | `false` | Include page-scoped shapes and merged horizontal/vertical lines |\n| `extractAnnotations` | `boolean` | `false` | Include page annotations and their metadata/geometry in structured output |\n| `extractStructureTree` | `boolean` | `false` | Include the tagged-PDF logical structure tree |\n| `preserveVerySmallText` | `boolean` | `false` | Keep tiny text that's normally filtered |\n| `password` | `string` | — | Password for protected PDFs |\n| `quiet` | `boolean` | `false` | Suppress progress logging |\n| `numWorkers` | `number` | `1` | Maximum concurrent OCR calls |\n| `ocrEngine` | `object` | — | JS-side OCR engine (see below) |\n\n## OCR in the browser\n\nThe native HTTP-OCR and Tesseract backends are not available in the browser.\nTo use OCR, set `ocrEnabled: true` and supply an `ocrEngine` object with a\n`recognize` method. Supplying `ocrEngine` alone does not enable OCR.\n\n```ts\nconst parser = new LiteParse({\n  ocrEnabled: true,\n  ocrLanguage: \"eng\",\n  // Use more than 1 only if the engine supports concurrent jobs.\n  numWorkers: 2,\n  ocrEngine: {\n    /**\n     * @param imageData PNG-encoded image bytes\n     * @param width  rendered page width  in pixels\n     * @param height rendered page height in pixels\n     * @param language e.g. \"eng\"\n     * @returns array of { text, bbox: [x1,y1,x2,y2], confidence }\n     */\n    async recognize(imageData, width, height, language) {\n      // e.g. call a worker that wraps tesseract.js, or a remote OCR service\n      return [\n        { text: \"Hello\", bbox: [10, 20, 80, 40], confidence: 0.98 },\n      ];\n    },\n  },\n});\n```\n\nLiteParse keeps at most `numWorkers` calls to `recognize` active. When one call\nfinishes, LiteParse prepares and starts the next page without waiting for the\nother calls. An OCR engine can send the calls to a Web Worker pool or to\nconcurrent HTTP requests. Results stay assigned to their source pages when\njobs finish out of order. Active calls can keep up to `numWorkers` rendered\npage rasters in memory, so use a small value for high-DPI documents.\n\nA failed `recognize` call only affects its own page. With `ocrFailureFatal:\ntrue` (the default), `parse()` rejects only when every OCR call failed and at\nleast one failed page had little native text. If parsing fails, OCR calls that\nhave already started can continue.\n\n## Building from source\n\nRequires Rust + [`wasm-pack`](https://rustwasm.github.io/wasm-pack/):\n\n```sh\n# from packages/wasm\nnpm run build           # web target (default)\nnpm run build:bundler   # for webpack/rollup/vite\nnpm run build:nodejs    # for node.js\n```\n\nOutput goes to `pkg/`.\n\n## License\n\nApache-2.0\n</yakaai_skills>"}