@lov3kaizen/agentsea-ingest 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/EventEmitter.ts","../src/parsers/BaseParser.ts","../src/parsers/PDFParser.ts","../src/parsers/DOCXParser.ts","../src/parsers/HTMLParser.ts","../src/parsers/MarkdownParser.ts","../src/parsers/TextParser.ts","../src/parsers/CSVParser.ts","../src/parsers/ExcelParser.ts","../src/parsers/JSONParser.ts","../src/parsers/index.ts","../src/core/ParserRegistry.ts","../src/chunking/BaseChunker.ts","../src/chunking/FixedChunker.ts","../src/chunking/RecursiveChunker.ts","../src/chunking/SentenceChunker.ts","../src/chunking/ParagraphChunker.ts","../src/chunking/SemanticChunker.ts","../src/chunking/HierarchicalChunker.ts","../src/chunking/index.ts","../src/core/ChunkerRegistry.ts","../src/core/Pipeline.ts","../src/core/PipelineBuilder.ts","../src/core/Ingester.ts"],"sourcesContent":["/**\n * Event Emitter\n *\n * Simple typed event emitter for pipeline events.\n */\n\nimport type { DocumentEvent, PipelineEventEmitter } from '../types/index.js';\n\ntype EventHandler<T> = (event: T) => void;\n\n/**\n * Typed event emitter for document processing events\n */\nexport class IngestEventEmitter implements PipelineEventEmitter {\n private listeners: Map<string, Set<EventHandler<DocumentEvent>>> = new Map();\n\n /**\n * Subscribe to events\n */\n on(\n eventType: DocumentEvent['type'],\n handler: EventHandler<DocumentEvent>,\n ): void {\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set());\n }\n this.listeners.get(eventType)!.add(handler);\n }\n\n /**\n * Unsubscribe from events\n */\n off(\n eventType: DocumentEvent['type'],\n handler: EventHandler<DocumentEvent>,\n ): void {\n const handlers = this.listeners.get(eventType);\n if (handlers) {\n handlers.delete(handler);\n }\n }\n\n /**\n * Subscribe to event once\n */\n once(\n eventType: DocumentEvent['type'],\n handler: EventHandler<DocumentEvent>,\n ): void {\n const onceHandler: EventHandler<DocumentEvent> = (event) => {\n this.off(eventType, onceHandler);\n handler(event);\n };\n this.on(eventType, onceHandler);\n }\n\n /**\n * Emit event\n */\n emit(event: DocumentEvent): void {\n const handlers = this.listeners.get(event.type);\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(event);\n } catch (error) {\n console.error(`Error in event handler for ${event.type}:`, error);\n }\n }\n }\n }\n\n /**\n * Remove all listeners\n */\n removeAllListeners(eventType?: DocumentEvent['type']): void {\n if (eventType) {\n this.listeners.delete(eventType);\n } else {\n this.listeners.clear();\n }\n }\n\n /**\n * Get listener count\n */\n listenerCount(eventType: DocumentEvent['type']): number {\n return this.listeners.get(eventType)?.size ?? 0;\n }\n}\n\n/**\n * Create a new event emitter instance\n */\nexport function createEventEmitter(): PipelineEventEmitter {\n return new IngestEventEmitter();\n}\n","/**\n * Base Parser\n *\n * Abstract base class for document parsers.\n */\n\nimport { nanoid } from 'nanoid';\nimport type {\n Parser,\n ParserCapabilities,\n ParserOptions,\n ParseResult,\n DocumentType,\n Element,\n TableData,\n ImageData,\n DocumentMetadata,\n} from '../types/index.js';\n\n/**\n * Abstract base parser class\n */\nexport abstract class BaseParser implements Parser {\n abstract readonly name: string;\n abstract readonly supportedMimeTypes: string[];\n abstract readonly supportedExtensions: string[];\n abstract readonly capabilities: ParserCapabilities;\n\n /**\n * Check if parser can handle this content\n */\n canParse(mimeType: string, extension?: string): boolean {\n if (mimeType && this.supportedMimeTypes.includes(mimeType)) {\n return true;\n }\n if (\n extension &&\n this.supportedExtensions.includes(extension.toLowerCase())\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Parse document from buffer\n */\n abstract parse(buffer: Buffer, options?: ParserOptions): Promise<ParseResult>;\n\n /**\n * Parse document stream (optional)\n */\n parseStream?(\n stream: NodeJS.ReadableStream,\n options?: ParserOptions,\n ): AsyncIterableIterator<Element>;\n\n /**\n * Create empty parse result\n */\n protected createEmptyResult(type: DocumentType): ParseResult {\n return {\n type,\n text: '',\n elements: [],\n tables: [],\n images: [],\n metadata: {},\n };\n }\n\n /**\n * Create text element\n */\n protected createElement(\n type: Element['type'],\n text: string,\n pageNumber?: number,\n metadata?: Record<string, unknown>,\n ): Element {\n return {\n type,\n text,\n pageNumber,\n metadata,\n };\n }\n\n /**\n * Create table data\n */\n protected createTable(\n headers: string[],\n rows: string[][],\n pageNumber?: number,\n caption?: string,\n ): TableData {\n return {\n id: nanoid(),\n headers,\n rows,\n pageNumber,\n caption,\n };\n }\n\n /**\n * Create image data\n */\n protected createImage(\n width: number,\n height: number,\n format: string,\n options: Partial<ImageData> = {},\n ): ImageData {\n return {\n id: nanoid(),\n width,\n height,\n format,\n ...options,\n };\n }\n\n /**\n * Estimate word count\n */\n protected estimateWordCount(text: string): number {\n return text.split(/\\s+/).filter((w) => w.length > 0).length;\n }\n\n /**\n * Estimate character count\n */\n protected estimateCharacterCount(text: string): number {\n return text.length;\n }\n\n /**\n * Extract text from elements\n */\n protected extractTextFromElements(elements: Element[]): string {\n return elements\n .map((el) => {\n if (el.children && el.children.length > 0) {\n return this.extractTextFromElements(el.children);\n }\n return el.text;\n })\n .join('\\n\\n');\n }\n\n /**\n * Merge metadata with defaults\n */\n protected mergeMetadata(\n extracted: Partial<DocumentMetadata>,\n text: string,\n ): DocumentMetadata {\n return {\n ...extracted,\n wordCount: extracted.wordCount ?? this.estimateWordCount(text),\n characterCount:\n extracted.characterCount ?? this.estimateCharacterCount(text),\n };\n }\n}\n","/**\n * PDF Parser\n *\n * Parser for PDF documents using pdf-parse.\n */\n\nimport type {\n ParserCapabilities,\n ParseResult,\n PDFParserOptions,\n Element,\n} from '../types/index.js';\nimport { BaseParser } from './BaseParser.js';\n\n/**\n * PDF document parser\n */\nexport class PDFParser extends BaseParser {\n readonly name = 'pdf-parser';\n readonly supportedMimeTypes = ['application/pdf'];\n readonly supportedExtensions = ['pdf'];\n readonly capabilities: ParserCapabilities = {\n text: true,\n structure: true,\n tables: false, // Limited table support\n images: false, // Images require additional processing\n metadata: true,\n streaming: false,\n };\n\n /**\n * Parse PDF document\n */\n async parse(\n buffer: Buffer,\n options?: PDFParserOptions,\n ): Promise<ParseResult> {\n const result = this.createEmptyResult('pdf');\n const warnings: string[] = [];\n\n try {\n // Dynamic import of pdf-parse\n const pdfParse = await import('pdf-parse');\n const pdf = await pdfParse.default(buffer, {\n max: options?.maxPages ?? 0, // 0 means all pages\n pagerender: options?.preserveFormatting\n ? (pageData: unknown) => this.renderPage(pageData)\n : undefined,\n });\n\n // Extract text\n result.text = pdf.text;\n\n // Extract metadata\n result.metadata = {\n title: pdf.info?.Title,\n author: pdf.info?.Author,\n createdAt: pdf.info?.CreationDate\n ? this.parsePDFDate(pdf.info.CreationDate)\n : undefined,\n modifiedAt: pdf.info?.ModDate\n ? this.parsePDFDate(pdf.info.ModDate)\n : undefined,\n pageCount: pdf.numpages,\n wordCount: this.estimateWordCount(pdf.text),\n characterCount: pdf.text.length,\n custom: {\n producer: pdf.info?.Producer,\n creator: pdf.info?.Creator,\n pdfVersion: pdf.version,\n },\n };\n\n // Create elements from text\n result.elements = this.createElements(pdf.text, pdf.numpages);\n\n // Handle page range\n if (options?.pageRange) {\n const { start, end } = options.pageRange;\n result.elements = result.elements.filter(\n (el) =>\n el.pageNumber && el.pageNumber >= start && el.pageNumber <= end,\n );\n result.text = result.elements.map((el) => el.text).join('\\n\\n');\n }\n } catch (error) {\n // Handle password-protected PDFs\n if (\n error instanceof Error &&\n error.message.includes('encrypted') &&\n !options?.password\n ) {\n throw new Error(\n 'PDF is password protected. Please provide a password.',\n );\n }\n throw error;\n }\n\n if (warnings.length > 0) {\n result.warnings = warnings;\n }\n\n return result;\n }\n\n /**\n * Create elements from PDF text\n */\n private createElements(text: string, pageCount: number): Element[] {\n const elements: Element[] = [];\n\n // Split by page breaks or double newlines\n const paragraphs = text.split(/\\n\\n+/);\n\n for (let i = 0; i < paragraphs.length; i++) {\n const para = paragraphs[i].trim();\n if (!para) continue;\n\n // Estimate page number (rough approximation)\n const estimatedPage = Math.min(\n Math.ceil(((i + 1) / paragraphs.length) * pageCount),\n pageCount,\n );\n\n // Detect element type\n const type = this.detectElementType(para);\n\n elements.push(this.createElement(type, para, estimatedPage));\n }\n\n return elements;\n }\n\n /**\n * Detect element type from text\n */\n private detectElementType(text: string): Element['type'] {\n // Check for heading patterns\n if (text.length < 100 && /^[A-Z0-9]/.test(text) && !text.endsWith('.')) {\n if (/^\\d+\\.?\\s+[A-Z]/.test(text)) {\n return 'heading';\n }\n if (text === text.toUpperCase()) {\n return 'title';\n }\n }\n\n // Check for list items\n if (/^[-*•]\\s/.test(text) || /^\\d+[.)]\\s/.test(text)) {\n return 'list_item';\n }\n\n return 'paragraph';\n }\n\n /**\n * Parse PDF date format\n */\n private parsePDFDate(dateStr: string): Date | undefined {\n try {\n // PDF date format: D:YYYYMMDDHHmmSSOHH'mm\n const match = dateStr.match(\n /D:(\\d{4})(\\d{2})(\\d{2})(\\d{2})?(\\d{2})?(\\d{2})?/,\n );\n if (match) {\n const [, year, month, day, hour = '00', min = '00', sec = '00'] = match;\n return new Date(\n parseInt(year),\n parseInt(month) - 1,\n parseInt(day),\n parseInt(hour),\n parseInt(min),\n parseInt(sec),\n );\n }\n return new Date(dateStr);\n } catch {\n return undefined;\n }\n }\n\n /**\n * Custom page renderer for preserving formatting\n */\n private renderPage(_pageData: unknown): string {\n // This is a placeholder - actual implementation would use pdf.js for better formatting\n return '';\n }\n}\n\n/**\n * Create PDF parser instance\n */\nexport function createPDFParser(): PDFParser {\n return new PDFParser();\n}\n","/**\n * DOCX Parser\n *\n * Parser for Microsoft Word documents using mammoth.\n */\n\nimport type {\n ParserCapabilities,\n ParseResult,\n DOCXParserOptions,\n Element,\n TableData,\n ImageData,\n} from '../types/index.js';\nimport { BaseParser } from './BaseParser.js';\n\n/**\n * DOCX document parser\n */\nexport class DOCXParser extends BaseParser {\n readonly name = 'docx-parser';\n readonly supportedMimeTypes = [\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n ];\n readonly supportedExtensions = ['docx'];\n readonly capabilities: ParserCapabilities = {\n text: true,\n structure: true,\n tables: true,\n images: true,\n metadata: true,\n streaming: false,\n };\n\n /**\n * Parse DOCX document\n */\n async parse(\n buffer: Buffer,\n options?: DOCXParserOptions,\n ): Promise<ParseResult> {\n const result = this.createEmptyResult('docx');\n const warnings: string[] = [];\n\n try {\n // Dynamic import of mammoth\n const mammoth = await import('mammoth');\n\n // Extract raw text\n const textResult = await mammoth.extractRawText({ buffer });\n result.text = textResult.value;\n\n // Extract HTML for structure\n const htmlResult = await mammoth.convertToHtml({ buffer });\n\n if (htmlResult.messages.length > 0) {\n warnings.push(\n ...htmlResult.messages\n .filter((m) => m.type === 'warning')\n .map((m) => m.message),\n );\n }\n\n // Parse HTML to extract structure\n const { elements, tables, images } = await this.parseHtmlStructure(\n htmlResult.value,\n options,\n );\n\n result.elements = elements;\n result.tables = tables;\n result.images = images;\n\n // Extract metadata\n result.metadata = {\n wordCount: this.estimateWordCount(result.text),\n characterCount: result.text.length,\n };\n } catch (error) {\n throw new Error(\n `Failed to parse DOCX: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n if (warnings.length > 0) {\n result.warnings = warnings;\n }\n\n return result;\n }\n\n /**\n * Parse HTML structure from mammoth output\n */\n private async parseHtmlStructure(\n html: string,\n options?: DOCXParserOptions,\n ): Promise<{\n elements: Element[];\n tables: TableData[];\n images: ImageData[];\n }> {\n const elements: Element[] = [];\n const tables: TableData[] = [];\n const images: ImageData[] = [];\n\n try {\n // Dynamic import of cheerio\n const cheerio = await import('cheerio');\n const $ = cheerio.load(html);\n\n // Process headings\n $('h1, h2, h3, h4, h5, h6').each((_, el) => {\n const $el = $(el);\n const level = parseInt(el.tagName.charAt(1));\n elements.push(\n this.createElement(\n level === 1 ? 'title' : 'heading',\n $el.text().trim(),\n undefined,\n {\n level,\n },\n ),\n );\n });\n\n // Process paragraphs\n $('p').each((_, el) => {\n const text = $(el).text().trim();\n if (text) {\n elements.push(this.createElement('paragraph', text));\n }\n });\n\n // Process lists\n $('ul, ol').each((_, el) => {\n const $list = $(el);\n const isOrdered = el.tagName === 'ol';\n const listElement = this.createElement('list', '', undefined, {\n ordered: isOrdered,\n });\n\n const children: Element[] = [];\n $list.find('li').each((i, li) => {\n children.push(\n this.createElement('list_item', $(li).text().trim(), undefined, {\n index: i,\n }),\n );\n });\n\n listElement.children = children;\n listElement.text = children.map((c) => c.text).join('\\n');\n elements.push(listElement);\n });\n\n // Process tables\n $('table').each((_, table) => {\n const $table = $(table);\n const headers: string[] = [];\n const rows: string[][] = [];\n\n // Get headers\n $table.find('thead tr th, thead tr td').each((_, th) => {\n headers.push($(th).text().trim());\n });\n\n // Get rows\n $table.find('tbody tr').each((_, tr) => {\n const row: string[] = [];\n $(tr)\n .find('td')\n .each((_, td) => {\n row.push($(td).text().trim());\n });\n if (row.length > 0) {\n rows.push(row);\n }\n });\n\n // If no thead, try first row as header\n if (headers.length === 0 && rows.length > 0) {\n $table.find('tr:first-child td, tr:first-child th').each((_, td) => {\n headers.push($(td).text().trim());\n });\n // Get remaining rows\n rows.length = 0;\n $table.find('tr:not(:first-child)').each((_, tr) => {\n const row: string[] = [];\n $(tr)\n .find('td')\n .each((_, td) => {\n row.push($(td).text().trim());\n });\n if (row.length > 0) {\n rows.push(row);\n }\n });\n }\n\n if (headers.length > 0 || rows.length > 0) {\n tables.push(this.createTable(headers, rows));\n }\n });\n\n // Process images\n if (options?.extractImages !== false) {\n $('img').each((_, img) => {\n const $img = $(img);\n const src = $img.attr('src') ?? '';\n const alt = $img.attr('alt') ?? '';\n\n // Handle base64 images\n if (src.startsWith('data:image')) {\n const match = src.match(/data:image\\/(\\w+);base64,(.+)/);\n if (match) {\n const [, format, base64] = match;\n images.push(\n this.createImage(0, 0, format, {\n base64,\n altText: alt,\n }),\n );\n }\n } else if (src) {\n images.push(\n this.createImage(0, 0, 'unknown', {\n url: src,\n altText: alt,\n }),\n );\n }\n });\n }\n } catch (error) {\n // Fallback: just extract text elements\n const paragraphs = html\n .replace(/<[^>]+>/g, '\\n')\n .split(/\\n+/)\n .filter((p) => p.trim());\n for (const para of paragraphs) {\n elements.push(this.createElement('paragraph', para.trim()));\n }\n }\n\n return { elements, tables, images };\n }\n}\n\n/**\n * Create DOCX parser instance\n */\nexport function createDOCXParser(): DOCXParser {\n return new DOCXParser();\n}\n","/**\n * HTML Parser\n *\n * Parser for HTML documents using cheerio.\n */\n\nimport type {\n ParserCapabilities,\n ParseResult,\n HTMLParserOptions,\n Element,\n TableData,\n ImageData,\n DocumentMetadata,\n} from '../types/index.js';\nimport { BaseParser } from './BaseParser.js';\n\n// Use type alias for cheerio's complex types\ntype CheerioAPI = ReturnType<typeof import('cheerio').load>;\n\n/**\n * HTML document parser\n */\nexport class HTMLParser extends BaseParser {\n readonly name = 'html-parser';\n readonly supportedMimeTypes = ['text/html', 'application/xhtml+xml'];\n readonly supportedExtensions = ['html', 'htm', 'xhtml'];\n readonly capabilities: ParserCapabilities = {\n text: true,\n structure: true,\n tables: true,\n images: true,\n metadata: true,\n streaming: false,\n };\n\n /**\n * Parse HTML document\n */\n async parse(\n buffer: Buffer,\n options?: HTMLParserOptions,\n ): Promise<ParseResult> {\n const result = this.createEmptyResult('html');\n const html = buffer.toString('utf-8');\n\n try {\n // Dynamic import of cheerio\n const cheerio = await import('cheerio');\n const $ = cheerio.load(html);\n\n // Remove excluded elements\n if (options?.excludeSelectors) {\n for (const selector of options.excludeSelectors) {\n $(selector).remove();\n }\n }\n\n // Get content container\n const contentSelector = options?.contentSelector ?? 'body';\n const $content = $(contentSelector);\n\n // Extract metadata\n result.metadata = this.extractMetadata($);\n\n // Extract elements\n result.elements = this.extractElements($, $content, options);\n\n // Extract tables\n if (options?.extractTables !== false) {\n result.tables = this.extractTables($, $content);\n }\n\n // Extract images\n if (options?.extractImages !== false) {\n result.images = this.extractImages($, $content, options?.baseUrl);\n }\n\n // Extract text\n result.text = this.extractText($content);\n } catch (error) {\n throw new Error(\n `Failed to parse HTML: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n return result;\n }\n\n /**\n * Extract metadata from HTML\n */\n private extractMetadata($: CheerioAPI): DocumentMetadata {\n const metadata: DocumentMetadata = {};\n\n // Title\n metadata.title = $('title').text().trim() || $('h1').first().text().trim();\n\n // Meta tags\n $('meta').each(function () {\n const $el = $(this);\n const name = $el.attr('name') ?? $el.attr('property');\n const content = $el.attr('content');\n\n if (name && content) {\n switch (name.toLowerCase()) {\n case 'author':\n case 'article:author':\n metadata.author = content;\n break;\n case 'description':\n case 'og:description':\n metadata.custom = { ...metadata.custom, description: content };\n break;\n case 'keywords':\n metadata.custom = { ...metadata.custom, keywords: content };\n break;\n case 'language':\n metadata.language = content;\n break;\n }\n }\n });\n\n // HTML lang attribute\n if (!metadata.language) {\n const lang = $('html').attr('lang');\n if (lang) {\n metadata.language = lang;\n }\n }\n\n return metadata;\n }\n\n /**\n * Extract elements from HTML\n */\n private extractElements(\n $: CheerioAPI,\n $content: ReturnType<CheerioAPI>,\n options?: HTMLParserOptions,\n ): Element[] {\n const elements: Element[] = [];\n\n // Process headings\n $content.find('h1, h2, h3, h4, h5, h6').each(function () {\n const $el = $(this);\n const tagName =\n (this as unknown as { tagName: string }).tagName?.toLowerCase() ?? 'h1';\n const level = parseInt(tagName.charAt(1));\n const text = $el.text().trim();\n if (text) {\n elements.push({\n type: level === 1 ? 'title' : 'heading',\n text,\n metadata: { level },\n });\n }\n });\n\n // Process paragraphs\n $content.find('p').each(function () {\n const text = $(this).text().trim();\n if (text) {\n elements.push({ type: 'paragraph', text });\n }\n });\n\n // Process lists\n $content.find('ul, ol').each(function () {\n const $list = $(this);\n const tagName =\n (this as unknown as { tagName: string }).tagName?.toLowerCase() ?? 'ul';\n const isOrdered = tagName === 'ol';\n const items: Element[] = [];\n\n $list.children('li').each(function (i: number) {\n const text = $(this).text().trim();\n if (text) {\n items.push({ type: 'list_item', text, metadata: { index: i } });\n }\n });\n\n if (items.length > 0) {\n const listElement: Element = {\n type: 'list',\n text: items.map((i) => i.text).join('\\n'),\n metadata: { ordered: isOrdered },\n children: items,\n };\n elements.push(listElement);\n }\n });\n\n // Process blockquotes\n $content.find('blockquote').each(function () {\n const text = $(this).text().trim();\n if (text) {\n elements.push({ type: 'quote', text });\n }\n });\n\n // Process code blocks\n $content.find('pre code, pre').each(function () {\n const $el = $(this);\n const text = $el.text().trim();\n const language = $el.attr('class')?.match(/language-(\\w+)/)?.[1];\n if (text) {\n elements.push({ type: 'code', text, metadata: { language } });\n }\n });\n\n // Process links if requested\n if (options?.extractLinks) {\n $content.find('a[href]').each(function () {\n const $el = $(this);\n const href = $el.attr('href');\n const text = $el.text().trim();\n if (href && text) {\n let url = href;\n if (options.baseUrl && !href.startsWith('http')) {\n url = new URL(href, options.baseUrl).toString();\n }\n elements.push({ type: 'link', text, metadata: { url } });\n }\n });\n }\n\n return elements;\n }\n\n /**\n * Extract tables from HTML\n */\n private extractTables(\n $: CheerioAPI,\n $content: ReturnType<CheerioAPI>,\n ): TableData[] {\n const tables: TableData[] = [];\n\n $content.find('table').each(function () {\n const $table = $(this);\n const headers: string[] = [];\n const rows: string[][] = [];\n\n // Get caption\n const caption = $table.find('caption').text().trim();\n\n // Get headers\n $table.find('thead th, thead td').each(function () {\n headers.push($(this).text().trim());\n });\n\n // If no thead, use first row\n if (headers.length === 0) {\n $table.find('tr:first-child th, tr:first-child td').each(function () {\n headers.push($(this).text().trim());\n });\n }\n\n // Get rows - look in tbody if it exists, otherwise use tr outside thead\n const hasThead = $table.find('thead').length > 0;\n const $rows = hasThead ? $table.find('tbody tr') : $table.find('tr');\n const skipFirst = headers.length > 0 && !hasThead;\n $rows.each(function (i: number) {\n if (skipFirst && i === 0) return;\n\n const row: string[] = [];\n $(this)\n .find('td')\n .each(function () {\n row.push($(this).text().trim());\n });\n\n if (row.length > 0) {\n rows.push(row);\n }\n });\n\n if (headers.length > 0 || rows.length > 0) {\n tables.push({\n id: `table-${tables.length}`,\n headers,\n rows,\n caption: caption || undefined,\n });\n }\n });\n\n return tables;\n }\n\n /**\n * Extract images from HTML\n */\n private extractImages(\n $: CheerioAPI,\n $content: ReturnType<CheerioAPI>,\n baseUrl?: string,\n ): ImageData[] {\n const images: ImageData[] = [];\n\n $content.find('img').each(function () {\n const $img = $(this);\n const src = $img.attr('src');\n const alt = $img.attr('alt');\n const width = parseInt($img.attr('width') ?? '0');\n const height = parseInt($img.attr('height') ?? '0');\n\n if (src) {\n let url = src;\n let base64: string | undefined;\n let format = 'unknown';\n\n // Handle base64 images\n if (src.startsWith('data:image')) {\n const match = src.match(/data:image\\/(\\w+);base64,(.+)/);\n if (match) {\n format = match[1];\n base64 = match[2];\n }\n } else {\n // Resolve relative URLs\n if (baseUrl && !src.startsWith('http')) {\n url = new URL(src, baseUrl).toString();\n }\n // Detect format from extension\n const extMatch = src.match(/\\.(\\w+)(?:\\?|$)/);\n if (extMatch) {\n format = extMatch[1].toLowerCase();\n }\n }\n\n images.push({\n id: `img-${images.length}`,\n width,\n height,\n format,\n url: base64 ? undefined : url,\n base64,\n altText: alt ?? undefined,\n });\n }\n });\n\n return images;\n }\n\n /**\n * Extract clean text from HTML\n */\n private extractText($content: ReturnType<CheerioAPI>): string {\n // Remove script and style tags\n $content.find('script, style, noscript').remove();\n\n // Get text with spacing\n return $content\n .text()\n .replace(/\\s+/g, ' ')\n .replace(/\\n\\s*\\n/g, '\\n\\n')\n .trim();\n }\n}\n\n/**\n * Create HTML parser instance\n */\nexport function createHTMLParser(): HTMLParser {\n return new HTMLParser();\n}\n","/**\n * Markdown Parser\n *\n * Parser for Markdown documents using marked.\n */\n\nimport type {\n ParserCapabilities,\n ParseResult,\n MarkdownParserOptions,\n Element,\n TableData,\n ImageData,\n} from '../types/index.js';\nimport { BaseParser } from './BaseParser.js';\n\n// Type for marked tokens\ninterface MarkedToken {\n type: string;\n text?: string;\n raw?: string;\n depth?: number;\n items?: Array<{ text: string }>;\n ordered?: boolean;\n lang?: string;\n header?: Array<{ text: string }>;\n rows?: Array<Array<{ text: string }>>;\n href?: string;\n title?: string;\n tokens?: MarkedToken[];\n}\n\n/**\n * Markdown document parser\n */\nexport class MarkdownParser extends BaseParser {\n readonly name = 'markdown-parser';\n readonly supportedMimeTypes = ['text/markdown', 'text/x-markdown'];\n readonly supportedExtensions = ['md', 'markdown', 'mdown', 'mkd'];\n readonly capabilities: ParserCapabilities = {\n text: true,\n structure: true,\n tables: true,\n images: true,\n metadata: true,\n streaming: false,\n };\n\n /**\n * Parse Markdown document\n */\n async parse(\n buffer: Buffer,\n options?: MarkdownParserOptions,\n ): Promise<ParseResult> {\n const result = this.createEmptyResult('markdown');\n let content = buffer.toString('utf-8');\n\n // Extract frontmatter if enabled\n if (options?.extractFrontmatter !== false) {\n const { frontmatter, body } = this.extractFrontmatter(content);\n if (frontmatter) {\n result.metadata = { ...result.metadata, custom: frontmatter };\n }\n content = body;\n }\n\n try {\n // Dynamic import of marked\n const { marked } = await import('marked');\n\n // Configure marked\n marked.setOptions({\n gfm: options?.gfm ?? true,\n breaks: true,\n });\n\n // Get tokens for structure analysis\n const tokens = marked.lexer(content) as MarkedToken[];\n\n // Extract elements from tokens\n result.elements = this.extractElements(tokens, options);\n\n // Extract tables\n if (options?.extractTables !== false) {\n result.tables = this.extractTables(tokens);\n }\n\n // Extract images\n if (options?.extractImages !== false) {\n result.images = this.extractImages(tokens);\n }\n\n // Extract plain text\n result.text = this.extractText(tokens, options);\n\n // Update metadata\n result.metadata = {\n ...result.metadata,\n wordCount: this.estimateWordCount(result.text),\n characterCount: result.text.length,\n };\n } catch (error) {\n throw new Error(\n `Failed to parse Markdown: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n return result;\n }\n\n /**\n * Extract frontmatter from Markdown\n */\n private extractFrontmatter(content: string): {\n frontmatter: Record<string, unknown> | null;\n body: string;\n } {\n const frontmatterRegex = /^---\\n([\\s\\S]*?)\\n---\\n/;\n const match = content.match(frontmatterRegex);\n\n if (!match) {\n return { frontmatter: null, body: content };\n }\n\n const frontmatterStr = match[1];\n const body = content.slice(match[0].length);\n\n try {\n // Simple YAML-like parsing\n const frontmatter: Record<string, unknown> = {};\n const lines = frontmatterStr.split('\\n');\n\n for (const line of lines) {\n const colonIndex = line.indexOf(':');\n if (colonIndex > 0) {\n const key = line.slice(0, colonIndex).trim();\n let value: unknown = line.slice(colonIndex + 1).trim();\n\n // Parse common types\n if (value === 'true') value = true;\n else if (value === 'false') value = false;\n else if (/^\\d+$/.test(value as string))\n value = parseInt(value as string);\n else if (/^\\d+\\.\\d+$/.test(value as string))\n value = parseFloat(value as string);\n else if (\n (value as string).startsWith('[') &&\n (value as string).endsWith(']')\n ) {\n value = (value as string)\n .slice(1, -1)\n .split(',')\n .map((v) => v.trim().replace(/^['\"]|['\"]$/g, ''));\n } else {\n value = (value as string).replace(/^['\"]|['\"]$/g, '');\n }\n\n frontmatter[key] = value;\n }\n }\n\n return { frontmatter, body };\n } catch {\n return { frontmatter: null, body: content };\n }\n }\n\n /**\n * Extract elements from tokens\n */\n private extractElements(\n tokens: MarkedToken[],\n options?: MarkdownParserOptions,\n ): Element[] {\n const elements: Element[] = [];\n\n for (const token of tokens) {\n switch (token.type) {\n case 'heading': {\n const depth = token.depth ?? 1;\n elements.push(\n this.createElement(\n depth === 1 ? 'title' : 'heading',\n token.text ?? '',\n undefined,\n { level: depth },\n ),\n );\n break;\n }\n\n case 'paragraph': {\n elements.push(this.createElement('paragraph', token.text ?? ''));\n break;\n }\n\n case 'list': {\n const items: Element[] = (token.items ?? []).map((item, i) =>\n this.createElement('list_item', item.text, undefined, { index: i }),\n );\n\n const listElement = this.createElement(\n 'list',\n items.map((i) => i.text).join('\\n'),\n undefined,\n { ordered: token.ordered ?? false },\n );\n listElement.children = items;\n elements.push(listElement);\n break;\n }\n\n case 'blockquote': {\n elements.push(this.createElement('quote', token.text ?? ''));\n break;\n }\n\n case 'code': {\n if (options?.preserveCodeBlocks) {\n elements.push(\n this.createElement('code', token.text ?? '', undefined, {\n language: token.lang,\n raw: true,\n }),\n );\n } else {\n elements.push(\n this.createElement('code', token.text ?? '', undefined, {\n language: token.lang,\n }),\n );\n }\n break;\n }\n\n case 'hr': {\n elements.push(this.createElement('page_break', '---'));\n break;\n }\n }\n }\n\n return elements;\n }\n\n /**\n * Extract tables from tokens\n */\n private extractTables(tokens: MarkedToken[]): TableData[] {\n const tables: TableData[] = [];\n\n for (const token of tokens) {\n if (token.type === 'table') {\n const headers = (token.header ?? []).map((h) => h.text);\n const rows = (token.rows ?? []).map((row) =>\n row.map((cell) => cell.text),\n );\n\n tables.push(this.createTable(headers, rows));\n }\n }\n\n return tables;\n }\n\n /**\n * Extract images from tokens\n */\n private extractImages(tokens: MarkedToken[]): ImageData[] {\n const images: ImageData[] = [];\n\n const extractFromTokens = (toks: MarkedToken[]) => {\n for (const token of toks) {\n if (token.type === 'image') {\n images.push(\n this.createImage(0, 0, this.getImageFormat(token.href ?? ''), {\n url: token.href,\n altText: token.text,\n caption: token.title ?? undefined,\n }),\n );\n }\n\n // Check for images in paragraph inline tokens\n if (token.tokens && Array.isArray(token.tokens)) {\n extractFromTokens(token.tokens);\n }\n }\n };\n\n extractFromTokens(tokens);\n return images;\n }\n\n /**\n * Get image format from URL\n */\n private getImageFormat(url: string): string {\n const match = url.match(/\\.(\\w+)(?:\\?|$)/);\n return match ? match[1].toLowerCase() : 'unknown';\n }\n\n /**\n * Extract plain text from tokens\n */\n private extractText(\n tokens: MarkedToken[],\n options?: MarkdownParserOptions,\n ): string {\n const textParts: string[] = [];\n\n const extractText = (toks: MarkedToken[]) => {\n for (const token of toks) {\n switch (token.type) {\n case 'heading':\n case 'paragraph':\n case 'text':\n if (token.text) textParts.push(token.text);\n break;\n\n case 'list': {\n for (const item of token.items ?? []) {\n textParts.push(item.text);\n }\n break;\n }\n\n case 'blockquote': {\n if (token.text) textParts.push(token.text);\n break;\n }\n\n case 'code': {\n if (!options?.preserveCodeBlocks && token.text) {\n textParts.push(token.text);\n }\n break;\n }\n\n case 'table': {\n textParts.push((token.header ?? []).map((h) => h.text).join(' | '));\n for (const row of token.rows ?? []) {\n textParts.push(row.map((cell) => cell.text).join(' | '));\n }\n break;\n }\n }\n\n if (token.tokens && Array.isArray(token.tokens)) {\n extractText(token.tokens);\n }\n }\n };\n\n extractText(tokens);\n return textParts.join('\\n\\n').trim();\n }\n}\n\n/**\n * Create Markdown parser instance\n */\nexport function createMarkdownParser(): MarkdownParser {\n return new MarkdownParser();\n}\n","/**\n * Text Parser\n *\n * Parser for plain text documents.\n */\n\nimport type {\n ParserCapabilities,\n ParserOptions,\n ParseResult,\n Element,\n} from '../types/index.js';\nimport { BaseParser } from './BaseParser.js';\n\n/**\n * Plain text document parser\n */\nexport class TextParser extends BaseParser {\n readonly name = 'text-parser';\n readonly supportedMimeTypes = ['text/plain'];\n readonly supportedExtensions = ['txt', 'text', 'log'];\n readonly capabilities: ParserCapabilities = {\n text: true,\n structure: true,\n tables: false,\n images: false,\n metadata: false,\n streaming: true,\n };\n\n /**\n * Parse text document\n */\n parse(buffer: Buffer, options?: ParserOptions): Promise<ParseResult> {\n const result = this.createEmptyResult('txt');\n\n // Detect encoding (simplified - always use utf-8 for now)\n const encoding = (options?.custom?.encoding as string) || 'utf-8';\n const text = buffer.toString(encoding as BufferEncoding);\n\n result.text = text;\n result.elements = this.extractElements(text);\n result.metadata = {\n wordCount: this.estimateWordCount(text),\n characterCount: text.length,\n custom: {\n lineCount: text.split('\\n').length,\n encoding,\n },\n };\n\n return Promise.resolve(result);\n }\n\n /**\n * Parse text stream\n */\n async *parseStream(\n stream: NodeJS.ReadableStream,\n _options?: ParserOptions,\n ): AsyncIterableIterator<Element> {\n let buffer = '';\n let paragraphIndex = 0;\n\n for await (const chunk of stream) {\n buffer += chunk.toString();\n\n // Look for paragraph breaks\n const paragraphs = buffer.split(/\\n\\n+/);\n\n // Yield complete paragraphs, keep the last one (may be incomplete)\n while (paragraphs.length > 1) {\n const para = paragraphs.shift()!.trim();\n if (para) {\n yield this.createElement('paragraph', para, undefined, {\n index: paragraphIndex++,\n });\n }\n }\n\n buffer = paragraphs[0];\n }\n\n // Yield remaining content\n if (buffer.trim()) {\n yield this.createElement('paragraph', buffer.trim(), undefined, {\n index: paragraphIndex,\n });\n }\n }\n\n /**\n * Extract elements from text\n */\n private extractElements(text: string): Element[] {\n const elements: Element[] = [];\n const paragraphs = text.split(/\\n\\n+/);\n\n for (let i = 0; i < paragraphs.length; i++) {\n const para = paragraphs[i].trim();\n if (!para) continue;\n\n const type = this.detectElementType(para);\n elements.push(this.createElement(type, para, undefined, { index: i }));\n }\n\n return elements;\n }\n\n /**\n * Detect element type from text content\n */\n private detectElementType(text: string): Element['type'] {\n // Check for list items\n const lines = text.split('\\n');\n const listPatterns = [/^[-*•]\\s/, /^\\d+[.)]\\s/, /^[a-z][.)]\\s/i];\n\n if (lines.every((line) => listPatterns.some((p) => p.test(line.trim())))) {\n return 'list';\n }\n\n // Check for code-like content\n if (\n text.includes('function ') ||\n text.includes('const ') ||\n text.includes('class ') ||\n /^[\\s]*[{[(]/.test(text)\n ) {\n return 'code';\n }\n\n // Check for heading-like content\n if (text.length < 100 && !text.includes('.') && /^[A-Z0-9]/.test(text)) {\n return 'heading';\n }\n\n return 'paragraph';\n }\n}\n\n/**\n * Create text parser instance\n */\nexport function createTextParser(): TextParser {\n return new TextParser();\n}\n","/**\n * CSV Parser\n *\n * Parser for CSV (Comma-Separated Values) documents.\n */\n\nimport type {\n ParserCapabilities,\n ParseResult,\n CSVParserOptions,\n Element,\n} from '../types/index.js';\nimport { BaseParser } from './BaseParser.js';\n\n/**\n * CSV document parser\n */\nexport class CSVParser extends BaseParser {\n readonly name = 'csv-parser';\n readonly supportedMimeTypes = ['text/csv', 'application/csv'];\n readonly supportedExtensions = ['csv', 'tsv'];\n readonly capabilities: ParserCapabilities = {\n text: true,\n structure: true,\n tables: true,\n images: false,\n metadata: true,\n streaming: true,\n };\n\n /**\n * Parse CSV document\n */\n parse(buffer: Buffer, options?: CSVParserOptions): Promise<ParseResult> {\n const result = this.createEmptyResult('csv');\n const encoding = options?.encoding ?? 'utf-8';\n const content = buffer.toString(encoding);\n\n // Detect delimiter if not specified\n const delimiter = options?.delimiter ?? this.detectDelimiter(content);\n const quote = options?.quote ?? '\"';\n const hasHeader = options?.hasHeader ?? true;\n\n // Parse CSV content\n const rows = this.parseCSV(content, delimiter, quote);\n\n if (rows.length === 0) {\n return Promise.resolve(result);\n }\n\n // Extract headers\n const headers = hasHeader\n ? rows[0]\n : rows[0].map((_, i) => `Column ${i + 1}`);\n const dataRows = hasHeader ? rows.slice(1) : rows;\n\n // Create table\n const table = this.createTable(headers, dataRows);\n result.tables = [table];\n\n // Create text representation\n result.text = this.createTextRepresentation(headers, dataRows);\n\n // Create elements\n result.elements = this.createElements(headers, dataRows);\n\n // Metadata\n result.metadata = {\n wordCount: this.estimateWordCount(result.text),\n characterCount: result.text.length,\n custom: {\n rowCount: dataRows.length,\n columnCount: headers.length,\n delimiter,\n hasHeader,\n },\n };\n\n return Promise.resolve(result);\n }\n\n /**\n * Parse CSV stream\n */\n async *parseStream(\n stream: NodeJS.ReadableStream,\n options?: CSVParserOptions,\n ): AsyncIterableIterator<Element> {\n let buffer = '';\n let isFirstRow = true;\n let headers: string[] = [];\n let rowIndex = 0;\n\n const delimiter = options?.delimiter ?? ',';\n const quote = options?.quote ?? '\"';\n const hasHeader = options?.hasHeader ?? true;\n\n for await (const chunk of stream) {\n buffer += chunk.toString();\n\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? ''; // Keep incomplete line in buffer\n\n for (const line of lines) {\n if (!line.trim()) continue;\n\n const row = this.parseRow(line, delimiter, quote);\n\n if (isFirstRow) {\n isFirstRow = false;\n if (hasHeader) {\n headers = row;\n continue;\n } else {\n headers = row.map((_, i) => `Column ${i + 1}`);\n }\n }\n\n // Create element for this row\n const rowText = headers\n .map((h, i) => `${h}: ${row[i] ?? ''}`)\n .join(', ');\n yield this.createElement('paragraph', rowText, undefined, {\n rowIndex: rowIndex++,\n rowData: Object.fromEntries(headers.map((h, i) => [h, row[i] ?? ''])),\n });\n }\n }\n\n // Process remaining buffer\n if (buffer.trim()) {\n const row = this.parseRow(buffer, delimiter, quote);\n const rowText = headers.map((h, i) => `${h}: ${row[i] ?? ''}`).join(', ');\n yield this.createElement('paragraph', rowText, undefined, {\n rowIndex: rowIndex++,\n rowData: Object.fromEntries(headers.map((h, i) => [h, row[i] ?? ''])),\n });\n }\n }\n\n /**\n * Detect delimiter from content\n */\n private detectDelimiter(content: string): string {\n const firstLine = content.split('\\n')[0];\n const delimiters = [',', '\\t', ';', '|'];\n let maxCount = 0;\n let detected = ',';\n\n for (const delimiter of delimiters) {\n // Use split instead of regex to avoid special character issues with |\n const count = firstLine.split(delimiter).length - 1;\n if (count > maxCount) {\n maxCount = count;\n detected = delimiter;\n }\n }\n\n return detected;\n }\n\n /**\n * Parse CSV content into rows\n */\n private parseCSV(\n content: string,\n delimiter: string,\n quote: string,\n ): string[][] {\n const rows: string[][] = [];\n const lines = content.split('\\n');\n\n let currentRow: string[] = [];\n let currentField = '';\n let inQuotes = false;\n\n for (const line of lines) {\n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n const nextChar = line[i + 1];\n\n if (inQuotes) {\n if (char === quote) {\n if (nextChar === quote) {\n // Escaped quote\n currentField += quote;\n i++;\n } else {\n // End of quoted field\n inQuotes = false;\n }\n } else {\n currentField += char;\n }\n } else {\n if (char === quote) {\n inQuotes = true;\n } else if (char === delimiter) {\n currentRow.push(currentField.trim());\n currentField = '';\n } else {\n currentField += char;\n }\n }\n }\n\n if (!inQuotes) {\n currentRow.push(currentField.trim());\n if (currentRow.some((cell) => cell.length > 0)) {\n rows.push(currentRow);\n }\n currentRow = [];\n currentField = '';\n } else {\n // Multiline field\n currentField += '\\n';\n }\n }\n\n return rows;\n }\n\n /**\n * Parse a single CSV row\n */\n private parseRow(line: string, delimiter: string, quote: string): string[] {\n const fields: string[] = [];\n let currentField = '';\n let inQuotes = false;\n\n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n const nextChar = line[i + 1];\n\n if (inQuotes) {\n if (char === quote) {\n if (nextChar === quote) {\n currentField += quote;\n i++;\n } else {\n inQuotes = false;\n }\n } else {\n currentField += char;\n }\n } else {\n if (char === quote) {\n inQuotes = true;\n } else if (char === delimiter) {\n fields.push(currentField.trim());\n currentField = '';\n } else {\n currentField += char;\n }\n }\n }\n\n fields.push(currentField.trim());\n return fields;\n }\n\n /**\n * Create text representation of CSV\n */\n private createTextRepresentation(\n headers: string[],\n rows: string[][],\n ): string {\n const lines: string[] = [];\n\n // Header line\n lines.push(headers.join(' | '));\n lines.push('-'.repeat(lines[0].length));\n\n // Data rows\n for (const row of rows) {\n lines.push(row.join(' | '));\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Create elements from CSV data\n */\n private createElements(headers: string[], rows: string[][]): Element[] {\n const elements: Element[] = [];\n\n // Table element\n const tableElement = this.createElement(\n 'table',\n `Table with ${headers.length} columns and ${rows.length} rows`,\n undefined,\n { headers, rowCount: rows.length },\n );\n\n // Row elements as children\n tableElement.children = rows.map((row, i) =>\n this.createElement(\n 'paragraph',\n headers.map((h, j) => `${h}: ${row[j] ?? ''}`).join(', '),\n undefined,\n { rowIndex: i },\n ),\n );\n\n elements.push(tableElement);\n\n return elements;\n }\n}\n\n/**\n * Create CSV parser instance\n */\nexport function createCSVParser(): CSVParser {\n return new CSVParser();\n}\n","/**\n * Excel Parser\n *\n * Parser for Excel documents using xlsx.\n */\n\nimport type {\n ParserCapabilities,\n ParseResult,\n ExcelParserOptions,\n Element,\n TableData,\n} from '../types/index.js';\nimport { BaseParser } from './BaseParser.js';\n\n/**\n * Excel document parser\n */\nexport class ExcelParser extends BaseParser {\n readonly name = 'excel-parser';\n readonly supportedMimeTypes = [\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-excel',\n ];\n readonly supportedExtensions = ['xlsx', 'xls'];\n readonly capabilities: ParserCapabilities = {\n text: true,\n structure: true,\n tables: true,\n images: false,\n metadata: true,\n streaming: false,\n };\n\n /**\n * Parse Excel document\n */\n async parse(\n buffer: Buffer,\n options?: ExcelParserOptions,\n ): Promise<ParseResult> {\n const result = this.createEmptyResult('xlsx');\n\n try {\n // Dynamic import of xlsx\n const XLSX = await import('xlsx');\n\n // Read workbook\n const workbook = XLSX.read(buffer, {\n type: 'buffer',\n cellFormula: options?.includeFormulas ?? false,\n cellStyles: options?.includeStyles ?? false,\n });\n\n // Get sheets to process\n let sheetNames = workbook.SheetNames;\n if (options?.sheets) {\n if (typeof options.sheets[0] === 'number') {\n sheetNames = (options.sheets as number[])\n .filter((i) => i >= 0 && i < workbook.SheetNames.length)\n .map((i) => workbook.SheetNames[i]);\n } else {\n sheetNames = (options.sheets as string[]).filter((name) =>\n workbook.SheetNames.includes(name),\n );\n }\n }\n\n const textParts: string[] = [];\n const elements: Element[] = [];\n const tables: TableData[] = [];\n\n // Process each sheet\n for (const sheetName of sheetNames) {\n const sheet = workbook.Sheets[sheetName];\n if (!sheet) continue;\n\n // Convert to JSON\n const rows = XLSX.utils.sheet_to_json<string[]>(sheet, {\n header: 1,\n defval: '',\n });\n\n if (rows.length === 0) continue;\n\n // Extract headers (first row)\n const headers = rows[0].map((cell) => String(cell ?? ''));\n const dataRows = rows\n .slice(1)\n .map((row) => row.map((cell) => String(cell ?? '')));\n\n // Create table\n const table = this.createTable(headers, dataRows, undefined, sheetName);\n tables.push(table);\n\n // Create element for this sheet\n const sheetElement = this.createElement(\n 'table',\n `Sheet: ${sheetName} (${headers.length} columns, ${dataRows.length} rows)`,\n undefined,\n { sheetName, headers, rowCount: dataRows.length },\n );\n elements.push(sheetElement);\n\n // Add to text representation\n textParts.push(`## ${sheetName}\\n`);\n textParts.push(headers.join(' | '));\n textParts.push('-'.repeat(50));\n for (const row of dataRows.slice(0, 100)) {\n // Limit rows in text\n textParts.push(row.join(' | '));\n }\n if (dataRows.length > 100) {\n textParts.push(`... and ${dataRows.length - 100} more rows`);\n }\n textParts.push('');\n }\n\n result.text = textParts.join('\\n');\n result.elements = elements;\n result.tables = tables;\n\n // Metadata\n result.metadata = {\n wordCount: this.estimateWordCount(result.text),\n characterCount: result.text.length,\n custom: {\n sheetCount: sheetNames.length,\n sheetNames,\n totalTables: tables.length,\n },\n };\n } catch (error) {\n throw new Error(\n `Failed to parse Excel: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n return result;\n }\n}\n\n/**\n * Create Excel parser instance\n */\nexport function createExcelParser(): ExcelParser {\n return new ExcelParser();\n}\n","/**\n * JSON Parser\n *\n * Parser for JSON documents.\n */\n\nimport type {\n ParserCapabilities,\n ParserOptions,\n ParseResult,\n Element,\n TableData,\n} from '../types/index.js';\nimport { BaseParser } from './BaseParser.js';\n\n/**\n * JSON document parser\n */\nexport class JSONParser extends BaseParser {\n readonly name = 'json-parser';\n readonly supportedMimeTypes = ['application/json', 'text/json'];\n readonly supportedExtensions = ['json', 'jsonl'];\n readonly capabilities: ParserCapabilities = {\n text: true,\n structure: true,\n tables: true,\n images: false,\n metadata: true,\n streaming: false,\n };\n\n /**\n * Parse JSON document\n */\n parse(buffer: Buffer, options?: ParserOptions): Promise<ParseResult> {\n const result = this.createEmptyResult('json');\n const content = buffer.toString('utf-8');\n\n try {\n // Check if it's JSONL (JSON Lines)\n if (content.includes('\\n') && this.isJSONLines(content)) {\n return this.parseJSONLines(content, options);\n }\n\n // Parse JSON\n const data = JSON.parse(content);\n\n // Extract structure\n result.elements = this.extractElements(data, '');\n\n // Create text representation\n result.text = this.createTextRepresentation(data);\n\n // Extract tables from arrays of objects\n result.tables = this.extractTables(data);\n\n // Metadata\n result.metadata = {\n wordCount: this.estimateWordCount(result.text),\n characterCount: result.text.length,\n custom: {\n type: Array.isArray(data) ? 'array' : typeof data,\n itemCount: Array.isArray(data)\n ? data.length\n : Object.keys(data).length,\n },\n };\n } catch (error) {\n return Promise.reject(\n new Error(\n `Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`,\n ),\n );\n }\n\n return Promise.resolve(result);\n }\n\n /**\n * Check if content is JSON Lines format\n */\n private isJSONLines(content: string): boolean {\n const lines = content.trim().split('\\n');\n if (lines.length < 2) return false;\n\n try {\n // Try parsing first two lines as separate JSON objects\n JSON.parse(lines[0]);\n JSON.parse(lines[1]);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Parse JSON Lines format\n */\n private parseJSONLines(\n content: string,\n _options?: ParserOptions,\n ): Promise<ParseResult> {\n const result = this.createEmptyResult('json');\n const lines = content.trim().split('\\n');\n const items: unknown[] = [];\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n items.push(JSON.parse(line));\n } catch {\n // Skip invalid lines\n }\n }\n\n // Create text representation\n result.text = items\n .map((item) => JSON.stringify(item, null, 2))\n .join('\\n\\n');\n\n // Create elements\n result.elements = items.map((item, i) =>\n this.createElement(\n 'paragraph',\n JSON.stringify(item, null, 2),\n undefined,\n { index: i, type: 'json_object' },\n ),\n );\n\n // Extract tables if all items are objects with same keys\n if (\n items.length > 0 &&\n items.every((item) => typeof item === 'object' && item !== null)\n ) {\n const tables = this.extractTablesFromArray(\n items as Record<string, unknown>[],\n );\n result.tables = tables;\n }\n\n result.metadata = {\n wordCount: this.estimateWordCount(result.text),\n characterCount: result.text.length,\n custom: {\n type: 'jsonl',\n itemCount: items.length,\n },\n };\n\n return Promise.resolve(result);\n }\n\n /**\n * Extract elements from JSON data\n */\n private extractElements(data: unknown, path: string): Element[] {\n const elements: Element[] = [];\n\n if (data === null || data === undefined) {\n return elements;\n }\n\n if (Array.isArray(data)) {\n // Create element for array\n const arrayElement = this.createElement(\n 'list',\n `Array with ${data.length} items`,\n undefined,\n { path, type: 'array', itemCount: data.length },\n );\n\n // Process array items\n const children: Element[] = [];\n for (let i = 0; i < data.length; i++) {\n const itemPath = `${path}[${i}]`;\n const item = data[i];\n\n if (typeof item === 'object' && item !== null) {\n children.push(...this.extractElements(item, itemPath));\n } else {\n children.push(\n this.createElement('list_item', String(item), undefined, {\n path: itemPath,\n index: i,\n }),\n );\n }\n }\n\n arrayElement.children = children;\n elements.push(arrayElement);\n } else if (typeof data === 'object') {\n // Process object properties\n for (const [key, value] of Object.entries(data)) {\n const propPath = path ? `${path}.${key}` : key;\n\n if (typeof value === 'object' && value !== null) {\n // Create heading for nested object/array\n elements.push(\n this.createElement('heading', key, undefined, {\n path: propPath,\n type: Array.isArray(value) ? 'array' : 'object',\n }),\n );\n elements.push(...this.extractElements(value, propPath));\n } else {\n // Create element for primitive value\n elements.push(\n this.createElement('paragraph', `${key}: ${value}`, undefined, {\n path: propPath,\n key,\n value,\n }),\n );\n }\n }\n }\n\n return elements;\n }\n\n /**\n * Create text representation of JSON data\n */\n private createTextRepresentation(data: unknown, indent = 0): string {\n const lines: string[] = [];\n const prefix = ' '.repeat(indent);\n\n if (data === null || data === undefined) {\n return '';\n }\n\n if (Array.isArray(data)) {\n for (let i = 0; i < data.length; i++) {\n const item = data[i];\n if (typeof item === 'object' && item !== null) {\n lines.push(`${prefix}- Item ${i + 1}:`);\n lines.push(this.createTextRepresentation(item, indent + 1));\n } else {\n lines.push(`${prefix}- ${item}`);\n }\n }\n } else if (typeof data === 'object') {\n for (const [key, value] of Object.entries(data)) {\n if (typeof value === 'object' && value !== null) {\n lines.push(`${prefix}${key}:`);\n lines.push(this.createTextRepresentation(value, indent + 1));\n } else {\n lines.push(`${prefix}${key}: ${value}`);\n }\n }\n } else {\n lines.push(`${prefix}${String(data)}`);\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Extract tables from JSON data\n */\n private extractTables(data: unknown): TableData[] {\n const tables: TableData[] = [];\n\n if (Array.isArray(data) && data.length > 0) {\n // Check if it's an array of objects with consistent keys\n const firstItem = data[0];\n if (typeof firstItem === 'object' && firstItem !== null) {\n tables.push(\n ...this.extractTablesFromArray(data as Record<string, unknown>[]),\n );\n }\n } else if (typeof data === 'object' && data !== null) {\n // Look for arrays in object properties\n for (const [key, value] of Object.entries(data)) {\n if (Array.isArray(value) && value.length > 0) {\n const firstItem = value[0];\n if (typeof firstItem === 'object' && firstItem !== null) {\n const extractedTables = this.extractTablesFromArray(\n value as Record<string, unknown>[],\n );\n // Add caption with property name\n for (const table of extractedTables) {\n table.caption = key;\n }\n tables.push(...extractedTables);\n }\n }\n }\n }\n\n return tables;\n }\n\n /**\n * Extract tables from array of objects\n */\n private extractTablesFromArray(\n items: Record<string, unknown>[],\n ): TableData[] {\n if (items.length === 0) return [];\n\n // Get all unique keys\n const allKeys = new Set<string>();\n for (const item of items) {\n for (const key of Object.keys(item)) {\n allKeys.add(key);\n }\n }\n\n const headers = Array.from(allKeys);\n const rows: string[][] = items.map((item) =>\n headers.map((key) => {\n const value = item[key];\n if (value === null || value === undefined) return '';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n }),\n );\n\n return [this.createTable(headers, rows)];\n }\n}\n\n/**\n * Create JSON parser instance\n */\nexport function createJSONParser(): JSONParser {\n return new JSONParser();\n}\n","/**\n * Parsers Index\n *\n * Document parser exports.\n */\n\nexport { BaseParser } from './BaseParser.js';\nexport { PDFParser, createPDFParser } from './PDFParser.js';\nexport { DOCXParser, createDOCXParser } from './DOCXParser.js';\nexport { HTMLParser, createHTMLParser } from './HTMLParser.js';\nexport { MarkdownParser, createMarkdownParser } from './MarkdownParser.js';\nexport { TextParser, createTextParser } from './TextParser.js';\nexport { CSVParser, createCSVParser } from './CSVParser.js';\nexport { ExcelParser, createExcelParser } from './ExcelParser.js';\nexport { JSONParser, createJSONParser } from './JSONParser.js';\n\nimport type { Parser } from '../types/index.js';\nimport { PDFParser } from './PDFParser.js';\nimport { DOCXParser } from './DOCXParser.js';\nimport { HTMLParser } from './HTMLParser.js';\nimport { MarkdownParser } from './MarkdownParser.js';\nimport { TextParser } from './TextParser.js';\nimport { CSVParser } from './CSVParser.js';\nimport { ExcelParser } from './ExcelParser.js';\nimport { JSONParser } from './JSONParser.js';\n\n/**\n * Get all built-in parsers\n */\nexport function getBuiltInParsers(): Parser[] {\n return [\n new PDFParser(),\n new DOCXParser(),\n new HTMLParser(),\n new MarkdownParser(),\n new TextParser(),\n new CSVParser(),\n new ExcelParser(),\n new JSONParser(),\n ];\n}\n\n/**\n * Register all built-in parsers with a parser registry\n */\nexport function registerBuiltInParsers(\n register: (parser: Parser) => void,\n): void {\n for (const parser of getBuiltInParsers()) {\n register(parser);\n }\n}\n","/**\n * Parser Registry\n *\n * Registry for document parsers with automatic detection.\n */\n\nimport type {\n Parser,\n ParserOptions,\n ParserRegistryConfig,\n ParseResult,\n} from '../types/index.js';\nimport { getBuiltInParsers } from '../parsers/index.js';\n\n/**\n * MIME type to extension mapping\n */\nconst MIME_TO_EXTENSION: Record<string, string[]> = {\n 'application/pdf': ['pdf'],\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': [\n 'docx',\n ],\n 'application/msword': ['doc'],\n 'text/html': ['html', 'htm'],\n 'text/markdown': ['md', 'markdown'],\n 'text/plain': ['txt'],\n 'text/csv': ['csv'],\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': ['xlsx'],\n 'application/vnd.ms-excel': ['xls'],\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': [\n 'pptx',\n ],\n 'message/rfc822': ['eml'],\n 'application/epub+zip': ['epub'],\n 'application/json': ['json'],\n};\n\n/**\n * Extension to MIME type mapping\n */\nconst EXTENSION_TO_MIME: Record<string, string> = {};\nfor (const [mime, exts] of Object.entries(MIME_TO_EXTENSION)) {\n for (const ext of exts) {\n EXTENSION_TO_MIME[ext] = mime;\n }\n}\n\n/**\n * Parser registry for managing document parsers\n */\nexport class ParserRegistry {\n private parsers: Map<string, Parser> = new Map();\n private mimeTypeOverrides: Map<string, Parser> = new Map();\n private defaultOptions: ParserOptions;\n\n constructor(config: ParserRegistryConfig = {}) {\n this.defaultOptions = config.defaultOptions ?? {};\n\n // Register built-in parsers by default unless explicitly disabled\n if (config.registerBuiltIns !== false) {\n for (const parser of getBuiltInParsers()) {\n this.register(parser);\n }\n }\n\n // Register custom parsers\n if (config.customParsers) {\n for (const parser of config.customParsers) {\n this.register(parser);\n }\n }\n\n // Register MIME type overrides\n if (config.mimeTypeOverrides) {\n for (const [mimeType, parser] of Object.entries(\n config.mimeTypeOverrides,\n )) {\n this.mimeTypeOverrides.set(mimeType, parser);\n }\n }\n }\n\n /**\n * Register a parser\n */\n register(parser: Parser): void {\n this.parsers.set(parser.name, parser);\n }\n\n /**\n * Unregister a parser\n */\n unregister(name: string): void {\n this.parsers.delete(name);\n }\n\n /**\n * Get parser by name\n */\n get(name: string): Parser | undefined {\n return this.parsers.get(name);\n }\n\n /**\n * Find parser for MIME type and/or extension\n */\n findParser(mimeType?: string, extension?: string): Parser | undefined {\n // Check MIME type overrides first\n if (mimeType && this.mimeTypeOverrides.has(mimeType)) {\n return this.mimeTypeOverrides.get(mimeType);\n }\n\n // Try to find parser that can handle this content\n for (const parser of this.parsers.values()) {\n if (parser.canParse(mimeType ?? '', extension)) {\n return parser;\n }\n }\n\n return undefined;\n }\n\n /**\n * Parse document with automatic parser detection\n */\n async parse(\n buffer: Buffer,\n mimeType?: string,\n extension?: string,\n options?: ParserOptions,\n ): Promise<ParseResult> {\n let parser = this.findParser(mimeType, extension);\n\n // If no parser found and no MIME type or extension provided, try text parser as fallback\n if (!parser && !mimeType && !extension) {\n parser = this.findParser('text/plain', 'txt');\n }\n\n if (!parser) {\n throw new Error(\n `No parser found for MIME type \"${mimeType}\" or extension \"${extension}\"`,\n );\n }\n\n const mergedOptions = { ...this.defaultOptions, ...options };\n return parser.parse(buffer, mergedOptions);\n }\n\n /**\n * Check if a MIME type or extension is supported\n */\n isSupported(mimeType?: string, extension?: string): boolean {\n return this.findParser(mimeType, extension) !== undefined;\n }\n\n /**\n * Get all registered parsers\n */\n getAll(): Parser[] {\n return Array.from(this.parsers.values());\n }\n\n /**\n * Get all supported MIME types\n */\n getSupportedMimeTypes(): string[] {\n const mimeTypes = new Set<string>();\n for (const parser of this.parsers.values()) {\n for (const mimeType of parser.supportedMimeTypes) {\n mimeTypes.add(mimeType);\n }\n }\n return Array.from(mimeTypes);\n }\n\n /**\n * Get all supported extensions\n */\n getSupportedExtensions(): string[] {\n const extensions = new Set<string>();\n for (const parser of this.parsers.values()) {\n for (const ext of parser.supportedExtensions) {\n extensions.add(ext);\n }\n }\n return Array.from(extensions);\n }\n\n /**\n * Detect MIME type from extension\n */\n static detectMimeType(extension: string): string | undefined {\n const ext = extension.toLowerCase().replace(/^\\./, '');\n return EXTENSION_TO_MIME[ext];\n }\n\n /**\n * Detect extension from MIME type\n */\n static detectExtension(mimeType: string): string | undefined {\n const extensions = MIME_TO_EXTENSION[mimeType];\n return extensions?.[0];\n }\n\n /**\n * Extract extension from filename\n */\n static getExtension(filename: string): string {\n const match = filename.match(/\\.([^.]+)$/);\n return match ? match[1].toLowerCase() : '';\n }\n}\n\n/**\n * Create a new parser registry\n */\nexport function createParserRegistry(\n config?: ParserRegistryConfig,\n): ParserRegistry {\n return new ParserRegistry(config);\n}\n","/**\n * Base Chunker\n *\n * Abstract base class for chunking strategies.\n */\n\nimport { nanoid } from 'nanoid';\nimport type {\n Chunker,\n ChunkingStrategy,\n ChunkingOptions,\n Chunk,\n ChunkMetadata,\n Element,\n TokenCounter,\n} from '../types/index.js';\n\n/**\n * Default token counter (rough estimate: ~4 characters per token)\n */\nconst DEFAULT_TOKEN_COUNTER: TokenCounter = (text: string) =>\n Math.ceil(text.length / 4);\n\n/**\n * Abstract base chunker class\n */\nexport abstract class BaseChunker implements Chunker {\n abstract readonly name: string;\n abstract readonly strategy: ChunkingStrategy;\n\n protected tokenCounter: TokenCounter;\n\n constructor(tokenCounter?: TokenCounter) {\n this.tokenCounter = tokenCounter ?? DEFAULT_TOKEN_COUNTER;\n }\n\n /**\n * Chunk text content\n */\n abstract chunk(\n text: string,\n options?: ChunkingOptions,\n ): Chunk[] | Promise<Chunk[]>;\n\n /**\n * Chunk document elements\n */\n chunkElements(\n elements: Element[],\n options?: ChunkingOptions,\n ): Chunk[] | Promise<Chunk[]> {\n // Default implementation: extract text from elements and chunk\n const text = this.extractTextFromElements(elements);\n const result = this.chunk(text, options);\n\n // Helper to enrich chunks with element metadata\n const enrichChunks = (chunks: Chunk[]): Chunk[] =>\n chunks.map((chunk) => ({\n ...chunk,\n metadata: {\n ...chunk.metadata,\n elementType: this.findElementTypeForChunk(chunk, elements),\n },\n }));\n\n // Handle both sync and async chunk results\n if (Array.isArray(result)) {\n return enrichChunks(result);\n }\n return result.then(enrichChunks);\n }\n\n /**\n * Estimate chunk count\n */\n estimateChunks(text: string, options?: ChunkingOptions): number {\n const maxTokens = options?.maxTokens ?? 512;\n const overlap = options?.overlap ?? 0;\n const totalTokens = this.tokenCounter(text);\n const effectiveChunkSize = maxTokens - overlap;\n\n if (effectiveChunkSize <= 0) return 1;\n return Math.ceil(totalTokens / effectiveChunkSize);\n }\n\n /**\n * Create a chunk\n */\n protected createChunk(\n text: string,\n documentId: string,\n index: number,\n metadata: Partial<ChunkMetadata> = {},\n ): Chunk {\n return {\n id: nanoid(),\n documentId,\n text,\n tokenCount: this.tokenCounter(text),\n metadata: {\n index,\n ...metadata,\n },\n };\n }\n\n /**\n * Extract text from elements\n */\n protected extractTextFromElements(elements: Element[]): string {\n return elements\n .map((el) => {\n if (el.children && el.children.length > 0) {\n return this.extractTextFromElements(el.children);\n }\n return el.text;\n })\n .join('\\n\\n');\n }\n\n /**\n * Find element type for a chunk based on text overlap\n */\n protected findElementTypeForChunk(\n chunk: Chunk,\n elements: Element[],\n ): Element['type'] | undefined {\n const chunkText = chunk.text.slice(0, 100).toLowerCase();\n\n for (const element of elements) {\n if (element.text.toLowerCase().includes(chunkText)) {\n return element.type;\n }\n }\n\n return undefined;\n }\n\n /**\n * Split text at sentence boundaries\n */\n protected splitAtSentenceBoundaries(text: string): string[] {\n // Split on sentence-ending punctuation followed by whitespace\n const sentences = text.split(/(?<=[.!?])\\s+/);\n return sentences.filter((s) => s.trim().length > 0);\n }\n\n /**\n * Split text at paragraph boundaries\n */\n protected splitAtParagraphBoundaries(text: string): string[] {\n return text.split(/\\n\\n+/).filter((p) => p.trim().length > 0);\n }\n\n /**\n * Merge chunks to target size\n */\n protected mergeToTargetSize(\n texts: string[],\n maxTokens: number,\n separator = '\\n\\n',\n ): string[] {\n const merged: string[] = [];\n let current = '';\n\n for (const text of texts) {\n const combined = current ? `${current}${separator}${text}` : text;\n const combinedTokens = this.tokenCounter(combined);\n\n if (combinedTokens <= maxTokens) {\n current = combined;\n } else {\n if (current) {\n merged.push(current);\n }\n current = text;\n }\n }\n\n if (current) {\n merged.push(current);\n }\n\n return merged;\n }\n\n /**\n * Apply overlap between chunks\n */\n protected applyOverlap(chunks: string[], overlapTokens: number): string[] {\n if (overlapTokens <= 0 || chunks.length <= 1) {\n return chunks;\n }\n\n const result: string[] = [];\n\n for (let i = 0; i < chunks.length; i++) {\n let chunk = chunks[i];\n\n // Add overlap from previous chunk\n if (i > 0) {\n const prevChunk = chunks[i - 1];\n const prevWords = prevChunk.split(/\\s+/);\n const overlapChars = overlapTokens * 4; // Rough estimate\n let overlapText = '';\n\n for (let j = prevWords.length - 1; j >= 0; j--) {\n const word = prevWords[j];\n if ((overlapText + word).length <= overlapChars) {\n overlapText = word + (overlapText ? ' ' + overlapText : '');\n } else {\n break;\n }\n }\n\n if (overlapText) {\n chunk = overlapText + '\\n\\n' + chunk;\n }\n }\n\n result.push(chunk);\n }\n\n return result;\n }\n}\n","/**\n * Fixed Chunker\n *\n * Fixed-size chunking strategy.\n */\n\nimport type { Chunk, FixedChunkingOptions } from '../types/index.js';\nimport { BaseChunker } from './BaseChunker.js';\n\n/**\n * Fixed-size chunker implementation\n */\nexport class FixedChunker extends BaseChunker {\n readonly name = 'fixed-chunker';\n readonly strategy = 'fixed' as const;\n\n /**\n * Chunk text into fixed-size chunks\n */\n chunk(text: string, options?: FixedChunkingOptions): Chunk[] {\n const maxTokens = options?.maxTokens ?? 512;\n const maxChars = options?.maxCharacters ?? maxTokens * 4;\n const overlap = options?.overlap ?? 0;\n const documentId = '';\n\n const chunks: Chunk[] = [];\n let position = 0;\n let index = 0;\n\n while (position < text.length) {\n // Calculate end position\n let endPos = Math.min(position + maxChars, text.length);\n\n // Adjust for word boundaries if requested\n if (options?.splitOnWords && endPos < text.length) {\n const searchStart = Math.max(endPos - 100, position);\n const searchText = text.slice(searchStart, endPos + 50);\n const lastSpace = searchText.lastIndexOf(' ');\n if (lastSpace > 0) {\n endPos = searchStart + lastSpace;\n }\n }\n\n // Adjust for sentence boundaries if requested\n if (options?.splitOnSentences && endPos < text.length) {\n const searchStart = Math.max(endPos - 200, position);\n const searchText = text.slice(searchStart, endPos + 100);\n const sentenceEnd = searchText.search(/[.!?]\\s/);\n if (sentenceEnd > 0) {\n endPos = searchStart + sentenceEnd + 2;\n }\n }\n\n // Extract chunk text\n const chunkText = text.slice(position, endPos).trim();\n\n if (chunkText.length > 0) {\n chunks.push(\n this.createChunk(chunkText, documentId, index, {\n startOffset: position,\n endOffset: endPos,\n }),\n );\n index++;\n }\n\n // Calculate next position with overlap\n const overlapChars = overlap * 4;\n position = endPos - overlapChars;\n\n // Prevent infinite loop\n const lastChunkStart = chunks[chunks.length - 1]?.metadata.startOffset;\n if (position <= (lastChunkStart ?? 0)) {\n position = endPos;\n }\n }\n\n return chunks;\n }\n}\n\n/**\n * Create fixed chunker instance\n */\nexport function createFixedChunker(): FixedChunker {\n return new FixedChunker();\n}\n","/**\n * Recursive Chunker\n *\n * Recursive text splitting chunking strategy (similar to LangChain's RecursiveCharacterTextSplitter).\n */\n\nimport type { Chunk, RecursiveChunkingOptions } from '../types/index.js';\nimport { BaseChunker } from './BaseChunker.js';\n\n/**\n * Default separators in order of preference\n */\nconst DEFAULT_SEPARATORS = [\n '\\n\\n', // Paragraphs\n '\\n', // Lines\n '. ', // Sentences\n ', ', // Clauses\n ' ', // Words\n '', // Characters\n];\n\n/**\n * Recursive chunker implementation\n */\nexport class RecursiveChunker extends BaseChunker {\n readonly name = 'recursive-chunker';\n readonly strategy = 'recursive' as const;\n\n /**\n * Chunk text recursively with multiple separators\n */\n chunk(text: string, options?: RecursiveChunkingOptions): Chunk[] {\n const maxTokens = options?.maxTokens ?? 512;\n const maxChars = options?.maxCharacters ?? maxTokens * 4;\n const overlap = options?.overlap ?? 0;\n const separators = options?.separators ?? DEFAULT_SEPARATORS;\n const keepSeparator = options?.keepSeparator ?? true;\n const minChunkSize = options?.minChunkSize ?? 10;\n const documentId = '';\n\n // Recursively split text\n const splits = this.recursiveSplit(\n text,\n separators,\n maxChars,\n keepSeparator,\n );\n\n // Merge small chunks\n const merged = this.mergeSplits(splits, maxChars, minChunkSize);\n\n // Apply overlap\n const withOverlap =\n overlap > 0 ? this.applyOverlap(merged, overlap) : merged;\n\n // Create chunk objects\n return withOverlap.map((chunkText, index) =>\n this.createChunk(chunkText, documentId, index),\n );\n }\n\n /**\n * Recursively split text using separators\n */\n private recursiveSplit(\n text: string,\n separators: string[],\n maxChars: number,\n keepSeparator: boolean,\n ): string[] {\n // Base case: text is small enough\n if (text.length <= maxChars) {\n return [text];\n }\n\n // Try each separator in order\n for (let i = 0; i < separators.length; i++) {\n const separator = separators[i];\n\n // Check if separator exists in text\n if (separator === '' || text.includes(separator)) {\n const splits = this.splitBySeparator(text, separator, keepSeparator);\n\n const result: string[] = [];\n for (const split of splits) {\n if (split.length <= maxChars) {\n result.push(split);\n } else {\n // Recursively split with remaining separators\n const subSplits = this.recursiveSplit(\n split,\n separators.slice(i + 1),\n maxChars,\n keepSeparator,\n );\n result.push(...subSplits);\n }\n }\n\n return result;\n }\n }\n\n // Fallback: split by characters\n return this.splitByCharacters(text, maxChars);\n }\n\n /**\n * Split text by separator\n */\n private splitBySeparator(\n text: string,\n separator: string,\n keepSeparator: boolean,\n ): string[] {\n if (separator === '') {\n return [text];\n }\n\n const parts = text.split(separator);\n const result: string[] = [];\n\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n\n // Add separator back if requested\n if (keepSeparator && i < parts.length - 1) {\n part = part + separator;\n }\n\n if (part.trim()) {\n result.push(part);\n }\n }\n\n return result;\n }\n\n /**\n * Split by characters (last resort)\n */\n private splitByCharacters(text: string, maxChars: number): string[] {\n const splits: string[] = [];\n\n for (let i = 0; i < text.length; i += maxChars) {\n splits.push(text.slice(i, i + maxChars));\n }\n\n return splits;\n }\n\n /**\n * Merge small splits into larger chunks\n */\n private mergeSplits(\n splits: string[],\n maxChars: number,\n minChunkSize: number,\n ): string[] {\n const merged: string[] = [];\n let current = '';\n\n for (const split of splits) {\n const combined = current ? current + split : split;\n\n if (combined.length <= maxChars) {\n current = combined;\n } else {\n if (current) {\n merged.push(current);\n }\n current = split;\n }\n }\n\n if (current) {\n merged.push(current);\n }\n\n // Handle very small final chunk\n if (merged.length > 1 && merged[merged.length - 1].length < minChunkSize) {\n const last = merged.pop()!;\n const prev = merged.pop()!;\n if ((prev + last).length <= maxChars) {\n merged.push(prev + last);\n } else {\n merged.push(prev);\n merged.push(last);\n }\n }\n\n return merged;\n }\n}\n\n/**\n * Create recursive chunker instance\n */\nexport function createRecursiveChunker(): RecursiveChunker {\n return new RecursiveChunker();\n}\n","/**\n * Sentence Chunker\n *\n * Sentence-based chunking strategy.\n */\n\nimport type { Chunk, SentenceChunkingOptions } from '../types/index.js';\nimport { BaseChunker } from './BaseChunker.js';\n\n/**\n * Default sentence delimiters\n */\nconst DEFAULT_DELIMITERS = ['.', '!', '?', '。', '!', '?'];\n\n/**\n * Sentence chunker implementation\n */\nexport class SentenceChunker extends BaseChunker {\n readonly name = 'sentence-chunker';\n readonly strategy = 'sentence' as const;\n\n /**\n * Chunk text by sentences\n */\n chunk(text: string, options?: SentenceChunkingOptions): Chunk[] {\n const maxTokens = options?.maxTokens ?? 512;\n const minSentences = options?.minSentences ?? 1;\n const maxSentences = options?.maxSentences ?? 10;\n const overlap = options?.overlap ?? 0;\n const delimiters = options?.delimiters ?? DEFAULT_DELIMITERS;\n const documentId = '';\n\n // Split into sentences\n const sentences = this.splitIntoSentences(text, delimiters);\n\n // Group sentences into chunks\n const groups = this.groupSentences(\n sentences,\n maxTokens,\n minSentences,\n maxSentences,\n );\n\n // Apply overlap\n const withOverlap = this.applyOverlapSentences(groups, overlap, sentences);\n\n // Create chunk objects\n return withOverlap.map((group, index) => {\n const chunkText = group.join(' ');\n return this.createChunk(chunkText, documentId, index, {\n custom: { sentenceCount: group.length },\n });\n });\n }\n\n /**\n * Split text into sentences\n */\n private splitIntoSentences(text: string, delimiters: string[]): string[] {\n const sentences: string[] = [];\n let current = '';\n\n // Build regex pattern for sentence endings\n const delimPattern = delimiters\n .map((d) => d.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('|');\n const pattern = new RegExp(`(${delimPattern})(?=\\\\s|$)`, 'g');\n\n const parts = text.split(pattern);\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n\n if (delimiters.includes(part)) {\n current += part;\n if (current.trim()) {\n sentences.push(current.trim());\n }\n current = '';\n } else {\n current += part;\n }\n }\n\n // Add remaining text\n if (current.trim()) {\n sentences.push(current.trim());\n }\n\n return sentences;\n }\n\n /**\n * Group sentences into chunks respecting token limits\n */\n private groupSentences(\n sentences: string[],\n maxTokens: number,\n minSentences: number,\n maxSentences: number,\n ): string[][] {\n const groups: string[][] = [];\n let currentGroup: string[] = [];\n let currentTokens = 0;\n\n for (const sentence of sentences) {\n const sentenceTokens = this.tokenCounter(sentence);\n\n // Check if adding this sentence would exceed limits\n const wouldExceedTokens = currentTokens + sentenceTokens > maxTokens;\n const wouldExceedSentences = currentGroup.length >= maxSentences;\n\n if (\n (wouldExceedTokens || wouldExceedSentences) &&\n currentGroup.length >= minSentences\n ) {\n // Start new group\n groups.push(currentGroup);\n currentGroup = [sentence];\n currentTokens = sentenceTokens;\n } else {\n currentGroup.push(sentence);\n currentTokens += sentenceTokens;\n }\n }\n\n // Add final group\n if (currentGroup.length > 0) {\n groups.push(currentGroup);\n }\n\n return groups;\n }\n\n /**\n * Apply sentence-level overlap between chunks\n */\n private applyOverlapSentences(\n groups: string[][],\n overlapSentences: number,\n _allSentences: string[],\n ): string[][] {\n if (overlapSentences <= 0 || groups.length <= 1) {\n return groups;\n }\n\n const result: string[][] = [];\n\n for (let i = 0; i < groups.length; i++) {\n const currentGroup = [...groups[i]];\n\n // Add overlap from previous group\n if (i > 0) {\n const prevGroup = groups[i - 1];\n const overlapCount = Math.min(overlapSentences, prevGroup.length);\n const overlapItems = prevGroup.slice(-overlapCount);\n currentGroup.unshift(...overlapItems);\n }\n\n result.push(currentGroup);\n }\n\n return result;\n }\n}\n\n/**\n * Create sentence chunker instance\n */\nexport function createSentenceChunker(): SentenceChunker {\n return new SentenceChunker();\n}\n","/**\n * Paragraph Chunker\n *\n * Paragraph-based chunking strategy.\n */\n\nimport type { Chunk, ParagraphChunkingOptions } from '../types/index.js';\nimport { BaseChunker } from './BaseChunker.js';\n\n/**\n * Paragraph chunker implementation\n */\nexport class ParagraphChunker extends BaseChunker {\n readonly name = 'paragraph-chunker';\n readonly strategy = 'paragraph' as const;\n\n /**\n * Chunk text by paragraphs\n */\n chunk(text: string, options?: ParagraphChunkingOptions): Chunk[] {\n const maxTokens = options?.maxTokens ?? 512;\n const minParagraphs = options?.minParagraphs ?? 1;\n const maxParagraphs = options?.maxParagraphs ?? 5;\n const overlap = options?.overlap ?? 0;\n const separatorPattern = options?.separatorPattern ?? /\\n\\n+/;\n const documentId = '';\n\n // Split into paragraphs\n const paragraphs = text\n .split(separatorPattern)\n .map((p) => p.trim())\n .filter((p) => p.length > 0);\n\n // Group paragraphs into chunks\n const groups = this.groupParagraphs(\n paragraphs,\n maxTokens,\n minParagraphs,\n maxParagraphs,\n );\n\n // Apply overlap\n const withOverlap = this.applyOverlapParagraphs(groups, overlap);\n\n // Create chunk objects\n return withOverlap.map((group, index) => {\n const chunkText = group.join('\\n\\n');\n return this.createChunk(chunkText, documentId, index, {\n custom: { paragraphCount: group.length },\n });\n });\n }\n\n /**\n * Group paragraphs into chunks respecting token limits\n */\n private groupParagraphs(\n paragraphs: string[],\n maxTokens: number,\n minParagraphs: number,\n maxParagraphs: number,\n ): string[][] {\n const groups: string[][] = [];\n let currentGroup: string[] = [];\n let currentTokens = 0;\n\n for (const paragraph of paragraphs) {\n const paragraphTokens = this.tokenCounter(paragraph);\n\n // Check if adding this paragraph would exceed limits\n const wouldExceedTokens = currentTokens + paragraphTokens > maxTokens;\n const wouldExceedParagraphs = currentGroup.length >= maxParagraphs;\n\n if (\n (wouldExceedTokens || wouldExceedParagraphs) &&\n currentGroup.length >= minParagraphs\n ) {\n // Start new group\n groups.push(currentGroup);\n currentGroup = [paragraph];\n currentTokens = paragraphTokens;\n } else {\n currentGroup.push(paragraph);\n currentTokens += paragraphTokens;\n }\n }\n\n // Add final group\n if (currentGroup.length > 0) {\n groups.push(currentGroup);\n }\n\n return groups;\n }\n\n /**\n * Apply paragraph-level overlap between chunks\n */\n private applyOverlapParagraphs(\n groups: string[][],\n overlapParagraphs: number,\n ): string[][] {\n if (overlapParagraphs <= 0 || groups.length <= 1) {\n return groups;\n }\n\n const result: string[][] = [];\n\n for (let i = 0; i < groups.length; i++) {\n const currentGroup = [...groups[i]];\n\n // Add overlap from previous group\n if (i > 0) {\n const prevGroup = groups[i - 1];\n const overlapCount = Math.min(overlapParagraphs, prevGroup.length);\n const overlapItems = prevGroup.slice(-overlapCount);\n currentGroup.unshift(...overlapItems);\n }\n\n result.push(currentGroup);\n }\n\n return result;\n }\n}\n\n/**\n * Create paragraph chunker instance\n */\nexport function createParagraphChunker(): ParagraphChunker {\n return new ParagraphChunker();\n}\n","/**\n * Semantic Chunker\n *\n * Semantic-based chunking strategy using embeddings for similarity.\n */\n\nimport type { Chunk, SemanticChunkingOptions } from '../types/index.js';\nimport { BaseChunker } from './BaseChunker.js';\n\n/**\n * Default embedding function (fallback - uses simple word overlap)\n */\nconst defaultEmbedFunction = (text: string): Promise<number[]> => {\n // Simple word-based \"embedding\" for fallback\n const words = text.toLowerCase().split(/\\s+/);\n const wordSet = new Set(words);\n const vocab = Array.from(wordSet).slice(0, 100);\n\n const embedding = vocab.map((word) => {\n const count = words.filter((w) => w === word).length;\n return count / words.length;\n });\n\n return Promise.resolve(embedding);\n};\n\n/**\n * Semantic chunker implementation\n */\nexport class SemanticChunker extends BaseChunker {\n readonly name = 'semantic-chunker';\n readonly strategy = 'semantic' as const;\n\n /**\n * Chunk text based on semantic similarity\n */\n async chunk(\n text: string,\n options?: SemanticChunkingOptions,\n ): Promise<Chunk[]> {\n const maxTokens = options?.maxTokens ?? 512;\n const similarityThreshold = options?.similarityThreshold ?? 0.5;\n const minChunkSize = options?.minChunkSize ?? 50;\n const embedFunction = options?.embedFunction ?? defaultEmbedFunction;\n const documentId = '';\n\n // Split into sentences first\n const sentences = this.splitIntoSentences(text);\n\n if (sentences.length === 0) {\n return [];\n }\n\n if (sentences.length === 1) {\n return [this.createChunk(sentences[0], documentId, 0)];\n }\n\n // Get embeddings for each sentence\n const embeddings = await Promise.all(\n sentences.map((s) => embedFunction(s)),\n );\n\n // Find breakpoints based on semantic similarity\n const breakpoints = this.findSemanticBreakpoints(\n sentences,\n embeddings,\n similarityThreshold,\n maxTokens,\n minChunkSize,\n );\n\n // Create chunks from breakpoints\n const chunks: Chunk[] = [];\n let start = 0;\n\n for (let i = 0; i < breakpoints.length; i++) {\n const end = breakpoints[i];\n const chunkSentences = sentences.slice(start, end + 1);\n const chunkText = chunkSentences.join(' ');\n\n if (chunkText.trim()) {\n chunks.push(\n this.createChunk(chunkText, documentId, chunks.length, {\n custom: { sentenceCount: chunkSentences.length },\n }),\n );\n }\n\n start = end + 1;\n }\n\n // Add remaining sentences\n if (start < sentences.length) {\n const chunkSentences = sentences.slice(start);\n const chunkText = chunkSentences.join(' ');\n\n if (chunkText.trim()) {\n chunks.push(\n this.createChunk(chunkText, documentId, chunks.length, {\n custom: { sentenceCount: chunkSentences.length },\n }),\n );\n }\n }\n\n return chunks;\n }\n\n /**\n * Split text into sentences\n */\n private splitIntoSentences(text: string): string[] {\n return text\n .split(/(?<=[.!?])\\s+/)\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n }\n\n /**\n * Find semantic breakpoints based on embedding similarity\n */\n private findSemanticBreakpoints(\n sentences: string[],\n embeddings: number[][],\n threshold: number,\n maxTokens: number,\n minChunkSize: number,\n ): number[] {\n const breakpoints: number[] = [];\n let currentTokens = 0;\n let chunkStart = 0;\n\n for (let i = 0; i < sentences.length - 1; i++) {\n const sentenceTokens = this.tokenCounter(sentences[i]);\n currentTokens += sentenceTokens;\n\n // Check if we need to break due to size\n if (currentTokens >= maxTokens) {\n breakpoints.push(i);\n currentTokens = 0;\n chunkStart = i + 1;\n continue;\n }\n\n // Check semantic similarity with next sentence\n const similarity = this.cosineSimilarity(\n embeddings[i],\n embeddings[i + 1],\n );\n\n // Check if current chunk is large enough for semantic break\n const currentChunkSize = sentences\n .slice(chunkStart, i + 1)\n .join(' ').length;\n\n if (similarity < threshold && currentChunkSize >= minChunkSize) {\n breakpoints.push(i);\n currentTokens = 0;\n chunkStart = i + 1;\n }\n }\n\n return breakpoints;\n }\n\n /**\n * Calculate cosine similarity between two vectors\n */\n private cosineSimilarity(a: number[], b: number[]): number {\n if (a.length === 0 || b.length === 0) {\n return 0;\n }\n\n // Pad shorter vector with zeros\n const maxLen = Math.max(a.length, b.length);\n const paddedA = [...a, ...Array(maxLen - a.length).fill(0)];\n const paddedB = [...b, ...Array(maxLen - b.length).fill(0)];\n\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < maxLen; i++) {\n dotProduct += paddedA[i] * paddedB[i];\n normA += paddedA[i] * paddedA[i];\n normB += paddedB[i] * paddedB[i];\n }\n\n normA = Math.sqrt(normA);\n normB = Math.sqrt(normB);\n\n if (normA === 0 || normB === 0) {\n return 0;\n }\n\n return dotProduct / (normA * normB);\n }\n}\n\n/**\n * Create semantic chunker instance\n */\nexport function createSemanticChunker(): SemanticChunker {\n return new SemanticChunker();\n}\n","/**\n * Hierarchical Chunker\n *\n * Heading-based hierarchical chunking strategy.\n */\n\nimport type {\n Chunk,\n HierarchicalChunkingOptions,\n Element,\n} from '../types/index.js';\nimport { BaseChunker } from './BaseChunker.js';\n\n/**\n * Section node for hierarchical structure\n */\ninterface SectionNode {\n level: number;\n heading: string;\n content: string;\n children: SectionNode[];\n path: string[];\n}\n\n/**\n * Hierarchical chunker implementation\n */\nexport class HierarchicalChunker extends BaseChunker {\n readonly name = 'hierarchical-chunker';\n readonly strategy = 'hierarchical' as const;\n\n /**\n * Chunk text based on heading hierarchy\n */\n chunk(text: string, options?: HierarchicalChunkingOptions): Chunk[] {\n const maxTokens = options?.maxTokens ?? 512;\n const headingLevels = options?.headingLevels ?? [1, 2, 3, 4, 5, 6];\n const includeParentContext = options?.includeParentContext ?? true;\n const maxDepth = options?.maxDepth ?? 6;\n const documentId = '';\n\n // Parse text into hierarchical sections\n const sections = this.parseHierarchy(text, headingLevels, maxDepth);\n\n // Flatten sections into chunks\n const chunks = this.flattenToChunks(\n sections,\n documentId,\n maxTokens,\n includeParentContext,\n );\n\n return chunks;\n }\n\n /**\n * Chunk document elements with hierarchy awareness\n */\n chunkElements(\n elements: Element[],\n options?: HierarchicalChunkingOptions,\n ): Chunk[] {\n const maxTokens = options?.maxTokens ?? 512;\n const includeParentContext = options?.includeParentContext ?? true;\n const documentId = '';\n\n // Build hierarchy from elements\n const sections = this.buildHierarchyFromElements(elements);\n\n // Flatten to chunks\n return this.flattenToChunks(\n sections,\n documentId,\n maxTokens,\n includeParentContext,\n );\n }\n\n /**\n * Parse text into hierarchical sections based on headings\n */\n private parseHierarchy(\n text: string,\n headingLevels: number[],\n maxDepth: number,\n ): SectionNode[] {\n const lines = text.split('\\n');\n const root: SectionNode[] = [];\n const stack: SectionNode[] = [];\n\n // Heading patterns for markdown and common formats\n const headingPatterns = [\n {\n pattern: /^#{1,6}\\s+(.+)$/,\n getLevel: (m: RegExpMatchArray) => m[0].indexOf(' '),\n },\n { pattern: /^(.+)\\n={3,}$/, getLevel: () => 1 },\n { pattern: /^(.+)\\n-{3,}$/, getLevel: () => 2 },\n {\n pattern: /^(\\d+\\.)+\\s+(.+)$/,\n getLevel: (m: RegExpMatchArray) => m[0].split('.').length,\n },\n ];\n\n let currentContent = '';\n let lineIndex = 0;\n\n while (lineIndex < lines.length) {\n const line = lines[lineIndex];\n let heading: { level: number; text: string } | null = null;\n\n // Check for headings\n for (const { pattern, getLevel } of headingPatterns) {\n const match = line.match(pattern);\n if (match) {\n const level = getLevel(match);\n if (headingLevels.includes(level) && level <= maxDepth) {\n heading = {\n level,\n text: match[1]?.trim() || line.replace(/^#+\\s*/, '').trim(),\n };\n break;\n }\n }\n }\n\n // Check for underlined heading (next line)\n if (!heading && lineIndex + 1 < lines.length) {\n const nextLine = lines[lineIndex + 1];\n if (/^={3,}$/.test(nextLine)) {\n heading = { level: 1, text: line.trim() };\n lineIndex++; // Skip underline\n } else if (/^-{3,}$/.test(nextLine)) {\n heading = { level: 2, text: line.trim() };\n lineIndex++;\n }\n }\n\n if (heading) {\n // Save current content to previous section\n if (currentContent.trim()) {\n const target = stack.length > 0 ? stack[stack.length - 1] : null;\n if (target) {\n target.content = currentContent.trim();\n }\n }\n\n // Create new section\n const headingLevel = heading.level;\n const path = stack\n .filter((s) => s.level < headingLevel)\n .map((s) => s.heading);\n path.push(heading.text);\n\n const section: SectionNode = {\n level: heading.level,\n heading: heading.text,\n content: '',\n children: [],\n path,\n };\n\n // Find parent in stack\n while (\n stack.length > 0 &&\n stack[stack.length - 1].level >= heading.level\n ) {\n stack.pop();\n }\n\n if (stack.length > 0) {\n stack[stack.length - 1].children.push(section);\n } else {\n root.push(section);\n }\n\n stack.push(section);\n currentContent = '';\n } else {\n currentContent += line + '\\n';\n }\n\n lineIndex++;\n }\n\n // Save final content\n if (currentContent.trim() && stack.length > 0) {\n stack[stack.length - 1].content = currentContent.trim();\n } else if (currentContent.trim() && root.length === 0) {\n // No headings found - create single root section\n root.push({\n level: 0,\n heading: '',\n content: currentContent.trim(),\n children: [],\n path: [],\n });\n }\n\n return root;\n }\n\n /**\n * Build hierarchy from document elements\n */\n private buildHierarchyFromElements(elements: Element[]): SectionNode[] {\n const root: SectionNode[] = [];\n const stack: SectionNode[] = [];\n let currentContent: string[] = [];\n\n for (const element of elements) {\n if (element.type === 'title' || element.type === 'heading') {\n // Save current content\n if (currentContent.length > 0 && stack.length > 0) {\n stack[stack.length - 1].content = currentContent.join('\\n\\n');\n currentContent = [];\n }\n\n const level = (element.metadata?.level as number) ?? 1;\n const section: SectionNode = {\n level,\n heading: element.text,\n content: '',\n children: [],\n path: [],\n };\n\n // Find parent\n while (stack.length > 0 && stack[stack.length - 1].level >= level) {\n stack.pop();\n }\n\n // Build path\n section.path = [...stack.map((s) => s.heading), element.text];\n\n if (stack.length > 0) {\n stack[stack.length - 1].children.push(section);\n } else {\n root.push(section);\n }\n\n stack.push(section);\n } else {\n currentContent.push(element.text);\n }\n }\n\n // Save final content\n if (currentContent.length > 0) {\n if (stack.length > 0) {\n stack[stack.length - 1].content = currentContent.join('\\n\\n');\n } else if (root.length === 0) {\n root.push({\n level: 0,\n heading: '',\n content: currentContent.join('\\n\\n'),\n children: [],\n path: [],\n });\n }\n }\n\n return root;\n }\n\n /**\n * Flatten hierarchy into chunks\n */\n private flattenToChunks(\n sections: SectionNode[],\n documentId: string,\n maxTokens: number,\n includeParentContext: boolean,\n ): Chunk[] {\n const chunks: Chunk[] = [];\n\n const processSection = (\n section: SectionNode,\n parentContext: string = '',\n ) => {\n // Build chunk text\n let chunkText = '';\n\n if (includeParentContext && parentContext) {\n chunkText += parentContext + '\\n\\n';\n }\n\n if (section.heading) {\n chunkText += section.heading + '\\n\\n';\n }\n\n if (section.content) {\n chunkText += section.content;\n }\n\n // Check if chunk exceeds max tokens\n const tokens = this.tokenCounter(chunkText);\n\n if (tokens <= maxTokens && chunkText.trim()) {\n chunks.push(\n this.createChunk(chunkText.trim(), documentId, chunks.length, {\n sectionPath: section.path,\n custom: {\n heading: section.heading,\n level: section.level,\n hasChildren: section.children.length > 0,\n },\n }),\n );\n } else if (chunkText.trim()) {\n // Split large sections using recursive chunking\n const subChunks = this.splitLargeSection(\n chunkText,\n documentId,\n maxTokens,\n chunks.length,\n section.path,\n );\n chunks.push(...subChunks);\n }\n\n // Process children with context\n const contextForChildren = includeParentContext\n ? (parentContext ? parentContext + ' > ' : '') + section.heading\n : '';\n\n for (const child of section.children) {\n processSection(child, contextForChildren);\n }\n };\n\n for (const section of sections) {\n processSection(section);\n }\n\n // Re-index chunks\n return chunks.map((chunk, i) => ({\n ...chunk,\n metadata: { ...chunk.metadata, index: i },\n }));\n }\n\n /**\n * Split large sections into smaller chunks\n */\n private splitLargeSection(\n text: string,\n documentId: string,\n maxTokens: number,\n startIndex: number,\n path: string[],\n ): Chunk[] {\n const chunks: Chunk[] = [];\n const paragraphs = text.split(/\\n\\n+/);\n let currentText = '';\n let index = startIndex;\n\n for (const paragraph of paragraphs) {\n const combined = currentText\n ? currentText + '\\n\\n' + paragraph\n : paragraph;\n const tokens = this.tokenCounter(combined);\n\n if (tokens <= maxTokens) {\n currentText = combined;\n } else {\n if (currentText.trim()) {\n chunks.push(\n this.createChunk(currentText.trim(), documentId, index++, {\n sectionPath: path,\n }),\n );\n }\n currentText = paragraph;\n }\n }\n\n if (currentText.trim()) {\n chunks.push(\n this.createChunk(currentText.trim(), documentId, index, {\n sectionPath: path,\n }),\n );\n }\n\n return chunks;\n }\n}\n\n/**\n * Create hierarchical chunker instance\n */\nexport function createHierarchicalChunker(): HierarchicalChunker {\n return new HierarchicalChunker();\n}\n","/**\n * Chunking Index\n *\n * Chunking strategy exports.\n */\n\nexport { BaseChunker } from './BaseChunker.js';\nexport { FixedChunker, createFixedChunker } from './FixedChunker.js';\nexport {\n RecursiveChunker,\n createRecursiveChunker,\n} from './RecursiveChunker.js';\nexport { SentenceChunker, createSentenceChunker } from './SentenceChunker.js';\nexport {\n ParagraphChunker,\n createParagraphChunker,\n} from './ParagraphChunker.js';\nexport { SemanticChunker, createSemanticChunker } from './SemanticChunker.js';\nexport {\n HierarchicalChunker,\n createHierarchicalChunker,\n} from './HierarchicalChunker.js';\n\nimport type { Chunker, ChunkingStrategy } from '../types/index.js';\nimport { FixedChunker } from './FixedChunker.js';\nimport { RecursiveChunker } from './RecursiveChunker.js';\nimport { SentenceChunker } from './SentenceChunker.js';\nimport { ParagraphChunker } from './ParagraphChunker.js';\nimport { SemanticChunker } from './SemanticChunker.js';\nimport { HierarchicalChunker } from './HierarchicalChunker.js';\n\n/**\n * Get all built-in chunkers\n */\nexport function getBuiltInChunkers(): Chunker[] {\n return [\n new FixedChunker(),\n new RecursiveChunker(),\n new SentenceChunker(),\n new ParagraphChunker(),\n new SemanticChunker(),\n new HierarchicalChunker(),\n ];\n}\n\n/**\n * Create chunker by strategy name\n */\nexport function createChunker(strategy: ChunkingStrategy): Chunker {\n switch (strategy) {\n case 'fixed':\n return new FixedChunker();\n case 'recursive':\n return new RecursiveChunker();\n case 'sentence':\n return new SentenceChunker();\n case 'paragraph':\n return new ParagraphChunker();\n case 'semantic':\n return new SemanticChunker();\n case 'hierarchical':\n return new HierarchicalChunker();\n case 'sliding_window':\n // Use fixed chunker with overlap for sliding window\n return new FixedChunker();\n case 'custom':\n throw new Error('Custom chunker must be provided');\n }\n}\n\n/**\n * Register all built-in chunkers with a chunker registry\n */\nexport function registerBuiltInChunkers(\n register: (chunker: Chunker) => void,\n): void {\n for (const chunker of getBuiltInChunkers()) {\n register(chunker);\n }\n}\n","/**\n * Chunker Registry\n *\n * Registry for chunking strategies.\n */\n\nimport type {\n Chunker,\n ChunkingStrategy,\n ChunkingOptions,\n ChunkerRegistryConfig,\n Chunk,\n Element,\n} from '../types/index.js';\nimport { getBuiltInChunkers } from '../chunking/index.js';\n\n/**\n * Chunker registry for managing chunking strategies\n */\nexport class ChunkerRegistry {\n private chunkers: Map<ChunkingStrategy, Chunker> = new Map();\n private defaultOptions: ChunkingOptions;\n\n constructor(config: ChunkerRegistryConfig = {}) {\n this.defaultOptions = config.defaultOptions ?? {\n maxTokens: 512,\n overlap: 50,\n };\n\n // Register built-in chunkers by default unless explicitly disabled\n if (config.registerBuiltIns !== false) {\n for (const chunker of getBuiltInChunkers()) {\n this.register(chunker);\n }\n }\n\n // Register custom chunkers\n if (config.customChunkers) {\n for (const chunker of config.customChunkers) {\n this.register(chunker);\n }\n }\n\n // Register strategy overrides\n if (config.strategyOverrides) {\n for (const [strategy, chunker] of Object.entries(\n config.strategyOverrides,\n )) {\n this.chunkers.set(strategy as ChunkingStrategy, chunker);\n }\n }\n }\n\n /**\n * Register a chunker\n */\n register(chunker: Chunker): void {\n this.chunkers.set(chunker.strategy, chunker);\n }\n\n /**\n * Unregister a chunker\n */\n unregister(strategy: ChunkingStrategy): void {\n this.chunkers.delete(strategy);\n }\n\n /**\n * Get chunker by strategy\n */\n get(strategy: ChunkingStrategy): Chunker | undefined {\n return this.chunkers.get(strategy);\n }\n\n /**\n * Chunk text using specified strategy\n */\n chunk(\n text: string,\n strategy: ChunkingStrategy,\n options?: ChunkingOptions,\n ): Chunk[] | Promise<Chunk[]> {\n const chunker = this.chunkers.get(strategy);\n\n if (!chunker) {\n throw new Error(`No chunker found for strategy \"${strategy}\"`);\n }\n\n const mergedOptions = { ...this.defaultOptions, ...options };\n return chunker.chunk(text, mergedOptions);\n }\n\n /**\n * Chunk elements using specified strategy\n */\n chunkElements(\n elements: Element[],\n strategy: ChunkingStrategy,\n options?: ChunkingOptions,\n ): Chunk[] | Promise<Chunk[]> {\n const chunker = this.chunkers.get(strategy);\n\n if (!chunker) {\n throw new Error(`No chunker found for strategy \"${strategy}\"`);\n }\n\n const mergedOptions = { ...this.defaultOptions, ...options };\n return chunker.chunkElements(elements, mergedOptions);\n }\n\n /**\n * Check if strategy is supported\n */\n isSupported(strategy: ChunkingStrategy): boolean {\n return this.chunkers.has(strategy);\n }\n\n /**\n * Get all registered chunkers\n */\n getAll(): Chunker[] {\n return Array.from(this.chunkers.values());\n }\n\n /**\n * Get all supported strategies\n */\n getSupportedStrategies(): ChunkingStrategy[] {\n return Array.from(this.chunkers.keys());\n }\n\n /**\n * Set default options\n */\n setDefaultOptions(options: ChunkingOptions): void {\n this.defaultOptions = { ...this.defaultOptions, ...options };\n }\n\n /**\n * Get default options\n */\n getDefaultOptions(): ChunkingOptions {\n return { ...this.defaultOptions };\n }\n}\n\n/**\n * Create a new chunker registry\n */\nexport function createChunkerRegistry(\n config?: ChunkerRegistryConfig,\n): ChunkerRegistry {\n return new ChunkerRegistry(config);\n}\n","/**\n * Pipeline\n *\n * Document processing pipeline implementation.\n */\n\nimport { nanoid } from 'nanoid';\nimport type {\n Pipeline as IPipeline,\n PipelineConfig,\n PipelineStage,\n PipelineResult,\n PipelineValidationResult,\n PipelineContext,\n PipelineError,\n CustomStageHandler,\n ProcessedDocument,\n DocumentInput,\n DocumentMetadata,\n Chunk,\n ProcessingError,\n} from '../types/index.js';\nimport { IngestEventEmitter } from './EventEmitter.js';\nimport { ParserRegistry } from './ParserRegistry.js';\nimport { ChunkerRegistry } from './ChunkerRegistry.js';\n\n/**\n * Default pipeline stages in order\n */\nconst DEFAULT_STAGES: PipelineStage[] = [\n 'load',\n 'parse',\n 'extract',\n 'clean',\n 'chunk',\n 'enrich',\n 'embed',\n 'store',\n];\n\n/**\n * Document processing pipeline\n */\nexport class Pipeline implements IPipeline {\n readonly name: string;\n readonly config: PipelineConfig;\n\n private parserRegistry: ParserRegistry;\n private chunkerRegistry: ChunkerRegistry;\n private eventEmitter: IngestEventEmitter;\n private customStages: Map<string, CustomStageHandler> = new Map();\n private stageOrder: string[] = [];\n private aborted = false;\n\n constructor(config: PipelineConfig = {}) {\n this.name = config.name ?? 'default-pipeline';\n this.config = config;\n this.parserRegistry = new ParserRegistry();\n this.chunkerRegistry = new ChunkerRegistry();\n this.eventEmitter = new IngestEventEmitter();\n\n // Set up stage order\n this.stageOrder = config.stages ?? [...DEFAULT_STAGES];\n\n // Register custom stages\n if (config.customStages) {\n for (const [name, handler] of Object.entries(config.customStages)) {\n this.customStages.set(name, handler);\n }\n }\n }\n\n /**\n * Process a single document\n */\n async process(input: DocumentInput): Promise<ProcessedDocument> {\n const documentId = nanoid();\n const errors: ProcessingError[] = [];\n\n // Create initial document\n let document: ProcessedDocument = {\n id: documentId,\n type: 'unknown',\n text: '',\n metadata: {},\n elements: [],\n chunks: [],\n tables: [],\n images: [],\n processedAt: new Date(),\n };\n\n // Create pipeline context\n const context: PipelineContext = {\n config: this.config,\n currentStage: 'load',\n stageResults: new Map(),\n sharedData: new Map(),\n abortSignal: undefined,\n };\n\n // Notify document start\n this.config.callbacks?.onDocumentStart?.(documentId, input);\n\n try {\n // Execute each stage\n for (const stage of this.stageOrder) {\n if (this.aborted) {\n throw new Error('Pipeline aborted');\n }\n\n context.currentStage = stage as PipelineStage;\n this.config.callbacks?.onStageStart?.(\n stage as PipelineStage,\n documentId,\n );\n\n try {\n document = await this.executeStage(stage, document, input, context);\n context.stageResults.set(stage as PipelineStage, document);\n this.config.callbacks?.onStageComplete?.(\n stage as PipelineStage,\n documentId,\n document,\n );\n } catch (error) {\n const pipelineError = this.createPipelineError(\n stage as PipelineStage,\n documentId,\n error,\n );\n errors.push({\n stage,\n message: pipelineError.message,\n details: pipelineError.cause,\n });\n\n this.config.callbacks?.onStageError?.(\n stage as PipelineStage,\n documentId,\n error as Error,\n );\n\n if (!this.config.errorHandling?.continueOnError) {\n throw error;\n }\n }\n }\n\n document.errors = errors.length > 0 ? errors : undefined;\n document.processedAt = new Date();\n\n // Notify document complete\n this.config.callbacks?.onDocumentComplete?.(document);\n this.eventEmitter.emit({ type: 'document:completed', document });\n\n return document;\n } catch (error) {\n const pipelineError = this.createPipelineError(\n context.currentStage,\n documentId,\n error,\n );\n this.eventEmitter.emit({\n type: 'document:error',\n documentId,\n error: pipelineError,\n });\n throw error;\n }\n }\n\n /**\n * Process multiple documents\n */\n async processBatch(inputs: DocumentInput[]): Promise<PipelineResult> {\n const startTime = Date.now();\n const documents: ProcessedDocument[] = [];\n const errors: PipelineError[] = [];\n const stageTimings = new Map<PipelineStage, number>();\n let successCount = 0;\n let failedCount = 0;\n let skippedCount = 0;\n let totalChunks = 0;\n\n for (let i = 0; i < inputs.length; i++) {\n if (this.aborted) {\n skippedCount = inputs.length - i;\n break;\n }\n\n const input = inputs[i];\n\n try {\n const document = await this.process(input);\n documents.push(document);\n totalChunks += document.chunks.length;\n successCount++;\n } catch (error) {\n failedCount++;\n const pipelineError = this.createPipelineError(\n 'parse',\n undefined,\n error,\n );\n errors.push(pipelineError);\n\n if (!this.config.errorHandling?.skipFailing) {\n throw error;\n }\n }\n\n // Report progress\n this.config.callbacks?.onProgress?.({\n documentIndex: i + 1,\n totalDocuments: inputs.length,\n currentStage: 'parse',\n stageProgress: 1,\n overallProgress: (i + 1) / inputs.length,\n elapsedTime: Date.now() - startTime,\n });\n }\n\n return {\n documents,\n successCount,\n failedCount,\n skippedCount,\n totalChunks,\n errors,\n processingTime: Date.now() - startTime,\n stageTimings,\n };\n }\n\n /**\n * Process stream of documents\n */\n async *processStream(\n inputs: AsyncIterable<DocumentInput>,\n ): AsyncIterable<ProcessedDocument> {\n for await (const input of inputs) {\n if (this.aborted) {\n break;\n }\n\n try {\n const document = await this.process(input);\n yield document;\n } catch (error) {\n if (!this.config.errorHandling?.skipFailing) {\n throw error;\n }\n }\n }\n }\n\n /**\n * Add custom stage\n */\n addStage(\n name: string,\n handler: CustomStageHandler,\n after?: PipelineStage,\n ): void {\n this.customStages.set(name, handler);\n\n if (after) {\n const index = this.stageOrder.indexOf(after);\n if (index !== -1) {\n this.stageOrder.splice(index + 1, 0, name);\n } else {\n this.stageOrder.push(name);\n }\n } else {\n this.stageOrder.push(name);\n }\n }\n\n /**\n * Remove stage\n */\n removeStage(stage: string): void {\n const index = this.stageOrder.indexOf(stage);\n if (index !== -1) {\n this.stageOrder.splice(index, 1);\n }\n this.customStages.delete(stage);\n }\n\n /**\n * Get stage handler\n */\n getStageHandler(stage: string): CustomStageHandler | undefined {\n return this.customStages.get(stage);\n }\n\n /**\n * Validate configuration\n */\n validate(): PipelineValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Check chunking configuration\n if (this.config.chunking) {\n if (!this.config.chunking.strategy) {\n errors.push(\n 'Chunking strategy is required when chunking is configured',\n );\n }\n if (\n this.config.chunking.maxTokens &&\n this.config.chunking.overlap &&\n this.config.chunking.overlap >= this.config.chunking.maxTokens\n ) {\n errors.push('Chunk overlap must be less than maxTokens');\n }\n }\n\n // Check storage configuration\n if (this.stageOrder.includes('store') && !this.config.storage) {\n warnings.push(\n 'Store stage is enabled but no storage configuration provided',\n );\n }\n\n // Check embedding configuration\n if (this.stageOrder.includes('embed') && !this.config.embedding) {\n warnings.push(\n 'Embed stage is enabled but no embedding configuration provided',\n );\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n }\n\n /**\n * Abort processing\n */\n abort(): void {\n this.aborted = true;\n }\n\n /**\n * Get event emitter\n */\n getEventEmitter(): IngestEventEmitter {\n return this.eventEmitter;\n }\n\n /**\n * Get parser registry\n */\n getParserRegistry(): ParserRegistry {\n return this.parserRegistry;\n }\n\n /**\n * Get chunker registry\n */\n getChunkerRegistry(): ChunkerRegistry {\n return this.chunkerRegistry;\n }\n\n /**\n * Execute a pipeline stage\n */\n private async executeStage(\n stage: string,\n document: ProcessedDocument,\n input: DocumentInput,\n context: PipelineContext,\n ): Promise<ProcessedDocument> {\n // Check for custom stage handler\n const customHandler = this.customStages.get(stage);\n if (customHandler) {\n return customHandler(document, context);\n }\n\n // Execute built-in stages\n switch (stage) {\n case 'load':\n return this.executeLoad(document, input);\n case 'parse':\n return this.executeParse(document, input);\n case 'extract':\n return this.executeExtract(document);\n case 'clean':\n return this.executeClean(document);\n case 'chunk':\n return this.executeChunk(document);\n case 'enrich':\n return this.executeEnrich(document);\n case 'embed':\n return this.executeEmbed(document);\n case 'store':\n return this.executeStore(document);\n default:\n // Unknown stage - return document unchanged\n return document;\n }\n }\n\n /**\n * Load stage - load document content\n */\n private async executeLoad(\n document: ProcessedDocument,\n input: DocumentInput,\n ): Promise<ProcessedDocument> {\n const metadata: DocumentMetadata = {\n filename: input.filename,\n mimeType: input.mimeType,\n };\n\n // Load from path\n if (input.path) {\n const fs = await import('node:fs/promises');\n const stats = await fs.stat(input.path);\n metadata.fileSize = stats.size;\n metadata.filename = input.filename ?? input.path.split('/').pop();\n\n this.eventEmitter.emit({\n type: 'document:loaded',\n documentId: document.id,\n metadata,\n });\n\n return {\n ...document,\n metadata,\n };\n }\n\n // Load from URL\n if (input.url) {\n const response = await fetch(input.url);\n const buffer = Buffer.from(await response.arrayBuffer());\n metadata.sourceUrl = input.url;\n metadata.fileSize = buffer.length;\n metadata.mimeType =\n response.headers.get('content-type') ?? input.mimeType;\n\n this.eventEmitter.emit({\n type: 'document:loaded',\n documentId: document.id,\n metadata,\n });\n\n return {\n ...document,\n metadata,\n };\n }\n\n // Use provided buffer\n if (input.buffer) {\n metadata.fileSize = input.buffer.length;\n\n this.eventEmitter.emit({\n type: 'document:loaded',\n documentId: document.id,\n metadata,\n });\n\n return {\n ...document,\n metadata,\n };\n }\n\n throw new Error('No input source provided (path, url, or buffer)');\n }\n\n /**\n * Parse stage - parse document content\n */\n private async executeParse(\n document: ProcessedDocument,\n input: DocumentInput,\n ): Promise<ProcessedDocument> {\n // Get buffer\n let buffer: Buffer;\n if (input.buffer) {\n buffer = input.buffer;\n } else if (input.path) {\n const fs = await import('node:fs/promises');\n buffer = await fs.readFile(input.path);\n } else if (input.url) {\n const response = await fetch(input.url);\n buffer = Buffer.from(await response.arrayBuffer());\n } else {\n throw new Error('No input source for parsing');\n }\n\n // Detect extension\n const extension = input.filename\n ? ParserRegistry.getExtension(input.filename)\n : undefined;\n\n // Parse document\n const result = await this.parserRegistry.parse(\n buffer,\n input.mimeType,\n extension,\n this.config.parser,\n );\n\n this.eventEmitter.emit({\n type: 'document:parsed',\n documentId: document.id,\n elementCount: result.elements.length,\n });\n\n return {\n ...document,\n type: result.type,\n text: result.text,\n elements: result.elements,\n tables: result.tables,\n images: result.images,\n metadata: {\n ...document.metadata,\n ...result.metadata,\n },\n };\n }\n\n /**\n * Extract stage - extract tables, images, metadata\n */\n private executeExtract(\n document: ProcessedDocument,\n ): Promise<ProcessedDocument> {\n // Extraction happens during parsing for most formats\n // This stage can be used for additional extraction or post-processing\n\n this.eventEmitter.emit({\n type: 'document:extracted',\n documentId: document.id,\n tables: document.tables.length,\n images: document.images.length,\n });\n\n return Promise.resolve(document);\n }\n\n /**\n * Clean stage - clean and normalize text\n */\n private executeClean(\n document: ProcessedDocument,\n ): Promise<ProcessedDocument> {\n if (!this.config.cleaning) {\n return Promise.resolve(document);\n }\n\n const originalLength = document.text.length;\n let cleanedText = document.text;\n\n // Apply cleaning operations\n for (const operation of this.config.cleaning.operations) {\n cleanedText = this.applyCleaningOperation(cleanedText, operation);\n }\n\n this.eventEmitter.emit({\n type: 'document:cleaned',\n documentId: document.id,\n originalLength,\n cleanedLength: cleanedText.length,\n });\n\n return Promise.resolve({\n ...document,\n text: cleanedText,\n });\n }\n\n /**\n * Apply a cleaning operation\n */\n private applyCleaningOperation(text: string, operation: string): string {\n switch (operation) {\n case 'normalize_whitespace':\n return text.replace(/\\s+/g, ' ');\n case 'trim':\n return text.trim();\n case 'remove_extra_whitespace':\n return text.replace(/ +/g, ' ').replace(/\\n\\n+/g, '\\n\\n');\n case 'lowercase':\n return text.toLowerCase();\n case 'uppercase':\n return text.toUpperCase();\n case 'remove_urls':\n return text.replace(/https?:\\/\\/[^\\s]+/g, '');\n case 'remove_emails':\n return text.replace(\n /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g,\n '',\n );\n default:\n return text;\n }\n }\n\n /**\n * Chunk stage - split document into chunks\n */\n private async executeChunk(\n document: ProcessedDocument,\n ): Promise<ProcessedDocument> {\n if (!this.config.chunking) {\n // Default chunking if not configured\n const chunks: Chunk[] = [\n {\n id: nanoid(),\n documentId: document.id,\n text: document.text,\n tokenCount: this.estimateTokens(document.text),\n metadata: { index: 0 },\n },\n ];\n\n this.eventEmitter.emit({\n type: 'document:chunked',\n documentId: document.id,\n chunkCount: chunks.length,\n });\n\n return { ...document, chunks };\n }\n\n // Use chunker registry\n const strategy = this.config.chunking.strategy;\n let chunks: Chunk[];\n\n if (this.chunkerRegistry.isSupported(strategy)) {\n const result = this.chunkerRegistry.chunk(\n document.text,\n strategy,\n this.config.chunking,\n );\n // Handle both sync and async chunkers\n chunks = Array.isArray(result) ? result : await result;\n // Set document ID on chunks\n chunks = chunks.map((chunk) => ({ ...chunk, documentId: document.id }));\n } else {\n // Fallback to simple chunking\n chunks = this.simpleChunk(document);\n }\n\n this.eventEmitter.emit({\n type: 'document:chunked',\n documentId: document.id,\n chunkCount: chunks.length,\n });\n\n return { ...document, chunks };\n }\n\n /**\n * Simple chunking fallback\n */\n private simpleChunk(document: ProcessedDocument): Chunk[] {\n const maxTokens = this.config.chunking?.maxTokens ?? 512;\n const overlap = this.config.chunking?.overlap ?? 50;\n const text = document.text;\n const chunks: Chunk[] = [];\n\n let start = 0;\n let index = 0;\n\n while (start < text.length) {\n // Estimate end position based on tokens\n const estimatedChars = maxTokens * 4; // Rough estimate: 4 chars per token\n let end = Math.min(start + estimatedChars, text.length);\n\n // Try to break at sentence boundary\n if (end < text.length) {\n const searchStart = Math.max(start + estimatedChars - 200, start);\n const searchText = text.slice(searchStart, end + 100);\n const sentenceEnd = searchText.search(/[.!?]\\s/);\n if (sentenceEnd !== -1) {\n end = searchStart + sentenceEnd + 2;\n }\n }\n\n const chunkText = text.slice(start, end).trim();\n if (chunkText.length > 0) {\n chunks.push({\n id: nanoid(),\n documentId: document.id,\n text: chunkText,\n tokenCount: this.estimateTokens(chunkText),\n metadata: {\n index,\n startOffset: start,\n endOffset: end,\n },\n });\n index++;\n }\n\n // Move start position with overlap\n const overlapChars = overlap * 4;\n start = end - overlapChars;\n const lastChunkStart = chunks[chunks.length - 1]?.metadata.startOffset;\n if (start <= (lastChunkStart ?? 0)) {\n start = end; // Prevent infinite loop\n }\n }\n\n return chunks;\n }\n\n /**\n * Estimate token count\n */\n private estimateTokens(text: string): number {\n // Rough estimate: ~4 characters per token\n return Math.ceil(text.length / 4);\n }\n\n /**\n * Enrich stage - extract entities, keywords, etc.\n */\n private executeEnrich(\n document: ProcessedDocument,\n ): Promise<ProcessedDocument> {\n if (!this.config.enrichment) {\n return Promise.resolve(document);\n }\n\n const enrichments: string[] = [];\n\n // Placeholder for enrichment logic\n // In production, this would use NLP/LLM services\n\n this.eventEmitter.emit({\n type: 'document:enriched',\n documentId: document.id,\n enrichments,\n });\n\n return Promise.resolve(document);\n }\n\n /**\n * Embed stage - generate embeddings\n */\n private executeEmbed(\n document: ProcessedDocument,\n ): Promise<ProcessedDocument> {\n if (!this.config.embedding) {\n return Promise.resolve(document);\n }\n\n // Placeholder for embedding logic\n // In production, this would use embedding providers\n\n this.eventEmitter.emit({\n type: 'document:embedded',\n documentId: document.id,\n embeddingCount: document.chunks.length,\n });\n\n return Promise.resolve(document);\n }\n\n /**\n * Store stage - persist document and chunks\n */\n private executeStore(\n document: ProcessedDocument,\n ): Promise<ProcessedDocument> {\n if (!this.config.storage) {\n return Promise.resolve(document);\n }\n\n // Placeholder for storage logic\n // In production, this would use storage adapters\n\n this.eventEmitter.emit({\n type: 'document:stored',\n documentId: document.id,\n storageId: document.id,\n });\n\n return Promise.resolve(document);\n }\n\n /**\n * Create pipeline error\n */\n private createPipelineError(\n stage: PipelineStage,\n documentId: string | undefined,\n error: unknown,\n ): PipelineError {\n return {\n stage,\n documentId,\n message: error instanceof Error ? error.message : String(error),\n cause: error instanceof Error ? error : undefined,\n recoverable: this.config.errorHandling?.continueOnError ?? false,\n };\n }\n}\n\n/**\n * Create a new pipeline\n */\nexport function createPipeline(config?: PipelineConfig): Pipeline {\n return new Pipeline(config);\n}\n","/**\n * Pipeline Builder\n *\n * Fluent API for building document processing pipelines.\n */\n\nimport type {\n PipelineBuilder as IPipelineBuilder,\n PipelineConfig,\n PipelineStage,\n CustomStageHandler,\n ParserOptions,\n ExtractionConfig,\n CleaningConfig,\n ChunkingConfig,\n EnrichmentConfig,\n EmbeddingPipelineConfig,\n StorageConfig,\n OCRConfig,\n ErrorHandlingConfig,\n PipelineCallbacks,\n Pipeline as IPipeline,\n} from '../types/index.js';\nimport { Pipeline } from './Pipeline.js';\n\n/**\n * Fluent builder for document processing pipelines\n */\nexport class PipelineBuilder implements IPipelineBuilder {\n private config: PipelineConfig = {\n stages: [],\n };\n private customStages: Map<\n string,\n { handler: CustomStageHandler; after?: PipelineStage }\n > = new Map();\n\n /**\n * Set pipeline name\n */\n withName(name: string): this {\n this.config.name = name;\n return this;\n }\n\n /**\n * Set stages to execute\n */\n withStages(stages: PipelineStage[]): this {\n this.config.stages = stages;\n return this;\n }\n\n /**\n * Set parser options\n */\n withParser(options: ParserOptions): this {\n this.config.parser = options;\n return this;\n }\n\n /**\n * Set extraction options\n */\n withExtraction(options: ExtractionConfig): this {\n this.config.extraction = options;\n return this;\n }\n\n /**\n * Set cleaning options\n */\n withCleaning(config: CleaningConfig): this {\n this.config.cleaning = config;\n return this;\n }\n\n /**\n * Set chunking options\n */\n withChunking(config: ChunkingConfig): this {\n this.config.chunking = config;\n return this;\n }\n\n /**\n * Set enrichment options\n */\n withEnrichment(config: EnrichmentConfig): this {\n this.config.enrichment = config;\n return this;\n }\n\n /**\n * Set embedding options\n */\n withEmbedding(config: EmbeddingPipelineConfig): this {\n this.config.embedding = config;\n return this;\n }\n\n /**\n * Set storage options\n */\n withStorage(config: StorageConfig): this {\n this.config.storage = config;\n return this;\n }\n\n /**\n * Set OCR options\n */\n withOCR(config: OCRConfig): this {\n this.config.ocr = config;\n return this;\n }\n\n /**\n * Add custom stage\n */\n addCustomStage(\n name: string,\n handler: CustomStageHandler,\n after?: PipelineStage,\n ): this {\n this.customStages.set(name, { handler, after });\n return this;\n }\n\n /**\n * Set error handling\n */\n withErrorHandling(config: ErrorHandlingConfig): this {\n this.config.errorHandling = config;\n return this;\n }\n\n /**\n * Set callbacks\n */\n withCallbacks(callbacks: PipelineCallbacks): this {\n this.config.callbacks = callbacks;\n return this;\n }\n\n /**\n * Build the pipeline\n */\n build(): IPipeline {\n // Add custom stages to config\n const customStagesConfig: Record<string, CustomStageHandler> = {};\n for (const [name, { handler }] of this.customStages) {\n customStagesConfig[name] = handler;\n }\n this.config.customStages = customStagesConfig;\n\n // Create pipeline\n const pipeline = new Pipeline(this.config);\n\n // Add custom stages in order\n for (const [name, { handler, after }] of this.customStages) {\n pipeline.addStage(name, handler, after);\n }\n\n return pipeline;\n }\n\n /**\n * Create a copy of this builder\n */\n clone(): PipelineBuilder {\n const builder = new PipelineBuilder();\n builder.config = JSON.parse(JSON.stringify(this.config));\n builder.customStages = new Map(this.customStages);\n return builder;\n }\n}\n\n/**\n * Create a new pipeline builder\n */\nexport function createPipelineBuilder(): PipelineBuilder {\n return new PipelineBuilder();\n}\n\n/**\n * Quick pipeline builders for common use cases\n */\nexport const pipelines = {\n /**\n * Simple text extraction pipeline\n */\n simple(): PipelineBuilder {\n return new PipelineBuilder()\n .withName('simple-extraction')\n .withStages(['load', 'parse', 'chunk']);\n },\n\n /**\n * Full processing pipeline with all stages\n */\n full(): PipelineBuilder {\n return new PipelineBuilder()\n .withName('full-processing')\n .withStages([\n 'load',\n 'parse',\n 'extract',\n 'clean',\n 'chunk',\n 'enrich',\n 'embed',\n 'store',\n ]);\n },\n\n /**\n * RAG-optimized pipeline\n */\n rag(): PipelineBuilder {\n return new PipelineBuilder()\n .withName('rag-pipeline')\n .withStages(['load', 'parse', 'clean', 'chunk', 'embed'])\n .withChunking({\n strategy: 'semantic',\n maxTokens: 512,\n overlap: 50,\n });\n },\n\n /**\n * Document analysis pipeline (no chunking/embedding)\n */\n analysis(): PipelineBuilder {\n return new PipelineBuilder()\n .withName('analysis-pipeline')\n .withStages(['load', 'parse', 'extract', 'enrich']);\n },\n\n /**\n * OCR pipeline for scanned documents\n */\n ocr(): PipelineBuilder {\n return new PipelineBuilder()\n .withName('ocr-pipeline')\n .withStages(['load', 'parse', 'clean', 'chunk'])\n .withOCR({\n engine: 'tesseract',\n languages: ['eng'],\n });\n },\n};\n","/**\n * Ingester\n *\n * High-level document ingestion interface.\n */\n\nimport type {\n Ingester as IIngester,\n IngesterConfig,\n IngesterStatus,\n DirectoryIngestOptions,\n PipelineResult,\n ProcessedDocument,\n DocumentInput,\n} from '../types/index.js';\nimport { Pipeline } from './Pipeline.js';\nimport { ParserRegistry } from './ParserRegistry.js';\n\n/**\n * High-level document ingester\n */\nexport class Ingester extends Pipeline implements IIngester {\n private ingesterConfig: IngesterConfig;\n private status: IngesterStatus;\n private watcher: unknown = null;\n private processedCount = 0;\n private pendingQueue: DocumentInput[] = [];\n private startTime: number;\n\n constructor(config: IngesterConfig = {}) {\n super(config);\n this.ingesterConfig = config;\n this.startTime = Date.now();\n this.status = {\n isProcessing: false,\n isWatching: false,\n documentsProcessed: 0,\n documentsPending: 0,\n errorsCount: 0,\n uptime: 0,\n };\n }\n\n /**\n * Ingest from file path\n */\n async ingestFile(path: string): Promise<ProcessedDocument> {\n await this.validateFileSize(path);\n\n const extension = ParserRegistry.getExtension(path);\n const mimeType = ParserRegistry.detectMimeType(extension);\n\n if (!this.isSupportedMimeType(mimeType)) {\n throw new Error(`Unsupported file type: ${extension}`);\n }\n\n const input: DocumentInput = {\n path,\n filename: path.split('/').pop(),\n mimeType,\n };\n\n return this.process(input);\n }\n\n /**\n * Ingest from URL\n */\n async ingestUrl(url: string): Promise<ProcessedDocument> {\n const input: DocumentInput = {\n url,\n filename: url.split('/').pop()?.split('?')[0],\n };\n\n return this.process(input);\n }\n\n /**\n * Ingest from buffer\n */\n async ingestBuffer(\n buffer: Buffer,\n filename?: string,\n ): Promise<ProcessedDocument> {\n this.validateBufferSize(buffer);\n\n const extension = filename\n ? ParserRegistry.getExtension(filename)\n : undefined;\n const mimeType = extension\n ? ParserRegistry.detectMimeType(extension)\n : undefined;\n\n const input: DocumentInput = {\n buffer,\n filename,\n mimeType,\n };\n\n return this.process(input);\n }\n\n /**\n * Ingest from directory\n */\n async ingestDirectory(\n dirPath: string,\n options: DirectoryIngestOptions = {},\n ): Promise<PipelineResult> {\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n\n const files = await this.listFiles(dirPath, options);\n\n // Sort files\n if (options.sortBy) {\n const stats = await Promise.all(\n files.map(async (f) => ({\n file: f,\n stat: await fs.stat(f),\n })),\n );\n\n stats.sort((a, b) => {\n switch (options.sortBy) {\n case 'name':\n return a.file.localeCompare(b.file);\n case 'date':\n return a.stat.mtime.getTime() - b.stat.mtime.getTime();\n case 'size':\n return a.stat.size - b.stat.size;\n default:\n return 0;\n }\n });\n\n files.length = 0;\n files.push(...stats.map((s) => s.file));\n }\n\n // Limit files\n const filesToProcess = options.maxFiles\n ? files.slice(0, options.maxFiles)\n : files;\n\n // Create inputs\n const inputs: DocumentInput[] = filesToProcess.map((filePath) => ({\n path: filePath,\n filename: path.basename(filePath),\n mimeType: ParserRegistry.detectMimeType(\n ParserRegistry.getExtension(filePath),\n ),\n }));\n\n return this.processBatch(inputs);\n }\n\n /**\n * Start watch mode\n */\n startWatching(): void {\n if (!this.ingesterConfig.watchMode?.enabled) {\n throw new Error('Watch mode is not configured');\n }\n\n this.status.isWatching = true;\n\n // Process existing files if configured\n if (this.ingesterConfig.watchMode.processExisting) {\n for (const watchPath of this.ingesterConfig.watchMode.paths) {\n this.ingestDirectory(watchPath, {\n recursive: true,\n include: this.ingesterConfig.watchMode.include,\n exclude: this.ingesterConfig.watchMode.exclude,\n }).catch((err) => {\n console.error('Error processing existing files:', err);\n });\n }\n }\n\n // Set up file watcher (using native fs.watch)\n void this.setupWatcher();\n }\n\n /**\n * Stop watch mode\n */\n stopWatching(): void {\n this.status.isWatching = false;\n\n if (this.watcher) {\n // Clean up watcher\n (this.watcher as { close?: () => void }).close?.();\n this.watcher = null;\n }\n }\n\n /**\n * Get ingestion status\n */\n getStatus(): IngesterStatus {\n return {\n ...this.status,\n documentsProcessed: this.processedCount,\n documentsPending: this.pendingQueue.length,\n uptime: Date.now() - this.startTime,\n };\n }\n\n /**\n * Override process to track status\n */\n async process(input: DocumentInput): Promise<ProcessedDocument> {\n this.status.isProcessing = true;\n this.status.currentDocument = input.filename ?? input.path ?? input.url;\n\n try {\n const result = await super.process(input);\n this.processedCount++;\n return result;\n } catch (error) {\n this.status.errorsCount++;\n throw error;\n } finally {\n this.status.isProcessing = false;\n this.status.currentDocument = undefined;\n }\n }\n\n /**\n * List files in directory\n */\n private async listFiles(\n dirPath: string,\n options: DirectoryIngestOptions,\n ): Promise<string[]> {\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n\n const files: string[] = [];\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n\n if (entry.isDirectory() && options.recursive) {\n const subFiles = await this.listFiles(fullPath, options);\n files.push(...subFiles);\n } else if (entry.isFile()) {\n // Check include patterns\n if (options.include && options.include.length > 0) {\n const matches = options.include.some((pattern) =>\n this.matchPattern(entry.name, pattern),\n );\n if (!matches) continue;\n }\n\n // Check exclude patterns\n if (options.exclude && options.exclude.length > 0) {\n const excluded = options.exclude.some((pattern) =>\n this.matchPattern(entry.name, pattern),\n );\n if (excluded) continue;\n }\n\n // Check if supported\n const extension = ParserRegistry.getExtension(entry.name);\n const mimeType = ParserRegistry.detectMimeType(extension);\n if (this.isSupportedMimeType(mimeType)) {\n files.push(fullPath);\n }\n }\n }\n\n return files;\n }\n\n /**\n * Match filename against pattern\n */\n private matchPattern(filename: string, pattern: string): boolean {\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/\\./g, '\\\\.')\n .replace(/\\*/g, '.*')\n .replace(/\\?/g, '.');\n return new RegExp(`^${regexPattern}$`).test(filename);\n }\n\n /**\n * Validate file size\n */\n private async validateFileSize(path: string): Promise<void> {\n if (!this.ingesterConfig.fileSizeLimit) return;\n\n const fs = await import('node:fs/promises');\n const stats = await fs.stat(path);\n\n if (stats.size > this.ingesterConfig.fileSizeLimit) {\n throw new Error(\n `File size ${stats.size} exceeds limit ${this.ingesterConfig.fileSizeLimit}`,\n );\n }\n }\n\n /**\n * Validate buffer size\n */\n private validateBufferSize(buffer: Buffer): void {\n if (!this.ingesterConfig.fileSizeLimit) return;\n\n if (buffer.length > this.ingesterConfig.fileSizeLimit) {\n throw new Error(\n `Buffer size ${buffer.length} exceeds limit ${this.ingesterConfig.fileSizeLimit}`,\n );\n }\n }\n\n /**\n * Check if MIME type is supported\n */\n private isSupportedMimeType(mimeType?: string): boolean {\n if (!this.ingesterConfig.supportedMimeTypes) return true;\n if (!mimeType) return false;\n return this.ingesterConfig.supportedMimeTypes.includes(mimeType);\n }\n\n /**\n * Set up file watcher\n */\n private async setupWatcher(): Promise<void> {\n const fs = await import('node:fs');\n const path = await import('node:path');\n\n if (!this.ingesterConfig.watchMode) return;\n\n const debounceMs = this.ingesterConfig.watchMode.debounceDelay ?? 1000;\n const pendingFiles = new Map<string, NodeJS.Timeout>();\n\n for (const watchPath of this.ingesterConfig.watchMode.paths) {\n const watcher = fs.watch(\n watchPath,\n { recursive: true },\n (eventType, filename) => {\n if (!filename || eventType !== 'change') return;\n\n const fullPath = path.join(watchPath, filename);\n\n // Debounce\n if (pendingFiles.has(fullPath)) {\n clearTimeout(pendingFiles.get(fullPath));\n }\n\n pendingFiles.set(\n fullPath,\n setTimeout(() => {\n pendingFiles.delete(fullPath);\n\n // Check patterns\n const watchConfig = this.ingesterConfig.watchMode!;\n if (watchConfig.include?.length) {\n const matches = watchConfig.include.some((p) =>\n this.matchPattern(filename, p),\n );\n if (!matches) return;\n }\n if (watchConfig.exclude?.length) {\n const excluded = watchConfig.exclude.some((p) =>\n this.matchPattern(filename, p),\n );\n if (excluded) return;\n }\n\n this.ingestFile(fullPath).catch((error) => {\n console.error(`Error ingesting ${fullPath}:`, error);\n });\n }, debounceMs),\n );\n },\n );\n\n this.watcher = watcher;\n }\n }\n}\n\n/**\n * Create a new ingester\n */\nexport function createIngester(config?: IngesterConfig): Ingester {\n return new Ingester(config);\n}\n"],"mappings":"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","names":["_","nanoid","nanoid","nanoid","chunks"]}