fix: exclude __words__ keyword index from corruption detection and getStats()
The __words__ keyword index stores 50-5000 entries per entity (one per word), which inflated avg entries/entity well above the corruption threshold of 100. This caused: 1. validateConsistency() to falsely detect corruption on every startup, triggering unnecessary clearAllIndexData() + rebuild() cycles 2. getStats() to log false "Metadata index may be corrupted" warnings and report inflated totalEntries/totalIds stats Both methods now skip __words__ when counting, so stats and health checks reflect metadata fields only (noun, type, createdAt, etc.). Keyword search is unaffected since the __words__ field index itself is not modified.
This commit is contained in:
parent
32dbdcec61
commit
364360d447
128 changed files with 5637 additions and 5682 deletions
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Format Handler Registry (v5.2.0)
|
||||
* Format Handler Registry
|
||||
*
|
||||
* Central registry for format handlers with:
|
||||
* - MIME type-based routing
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ export class IntelligentImportAugmentation extends BaseAugmentation {
|
|||
enableCSV: true,
|
||||
enableExcel: true,
|
||||
enablePDF: true,
|
||||
enableImage: true, // v5.2.0: Image handler enabled by default
|
||||
enableImage: true, // Image handler enabled by default
|
||||
maxFileSize: 100 * 1024 * 1024, // 100MB default
|
||||
enableCache: true,
|
||||
cacheTTL: 24 * 60 * 60 * 1000, // 24 hours
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ export class CSVHandler extends BaseFormatHandler {
|
|||
const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data, 'utf-8')
|
||||
const totalBytes = buffer.length
|
||||
|
||||
// v4.5.0: Report total bytes for progress tracking
|
||||
// Report total bytes for progress tracking
|
||||
if (progressHooks?.onBytesProcessed) {
|
||||
progressHooks.onBytesProcessed(0)
|
||||
}
|
||||
|
|
@ -55,7 +55,7 @@ export class CSVHandler extends BaseFormatHandler {
|
|||
// Detect delimiter if not specified
|
||||
const delimiter = options.csvDelimiter || this.detectDelimiter(text)
|
||||
|
||||
// v4.5.0: Report progress - parsing started
|
||||
// Report progress - parsing started
|
||||
if (progressHooks?.onCurrentItem) {
|
||||
progressHooks.onCurrentItem(`Parsing CSV rows (delimiter: "${delimiter}")...`)
|
||||
}
|
||||
|
|
@ -75,7 +75,7 @@ export class CSVHandler extends BaseFormatHandler {
|
|||
cast: false // We'll do type inference ourselves
|
||||
})
|
||||
|
||||
// v4.5.0: Report bytes processed (entire file parsed)
|
||||
// Report bytes processed (entire file parsed)
|
||||
if (progressHooks?.onBytesProcessed) {
|
||||
progressHooks.onBytesProcessed(totalBytes)
|
||||
}
|
||||
|
|
@ -83,7 +83,7 @@ export class CSVHandler extends BaseFormatHandler {
|
|||
// Convert to array of objects
|
||||
const data = Array.isArray(records) ? records : [records]
|
||||
|
||||
// v4.5.0: Report data extraction progress
|
||||
// Report data extraction progress
|
||||
if (progressHooks?.onDataExtracted) {
|
||||
progressHooks.onDataExtracted(data.length, data.length)
|
||||
}
|
||||
|
|
@ -101,7 +101,7 @@ export class CSVHandler extends BaseFormatHandler {
|
|||
converted[key] = this.convertValue(value, types[key] || 'string')
|
||||
}
|
||||
|
||||
// v4.5.0: Report progress every 1000 rows
|
||||
// Report progress every 1000 rows
|
||||
if (progressHooks?.onCurrentItem && index > 0 && index % 1000 === 0) {
|
||||
progressHooks.onCurrentItem(`Converting types: ${index}/${data.length} rows...`)
|
||||
}
|
||||
|
|
@ -111,7 +111,7 @@ export class CSVHandler extends BaseFormatHandler {
|
|||
|
||||
const processingTime = Date.now() - startTime
|
||||
|
||||
// v4.5.0: Final progress update
|
||||
// Final progress update
|
||||
if (progressHooks?.onCurrentItem) {
|
||||
progressHooks.onCurrentItem(`CSV processing complete: ${convertedData.length} rows`)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ export class ExcelHandler extends BaseFormatHandler {
|
|||
const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data, 'binary')
|
||||
const totalBytes = buffer.length
|
||||
|
||||
// v4.5.0: Report start
|
||||
// Report start
|
||||
if (progressHooks?.onBytesProcessed) {
|
||||
progressHooks.onBytesProcessed(0)
|
||||
}
|
||||
|
|
@ -47,7 +47,7 @@ export class ExcelHandler extends BaseFormatHandler {
|
|||
// Determine which sheets to process
|
||||
const sheetsToProcess = this.getSheetsToProcess(workbook, options)
|
||||
|
||||
// v4.5.0: Report workbook loaded
|
||||
// Report workbook loaded
|
||||
if (progressHooks?.onCurrentItem) {
|
||||
progressHooks.onCurrentItem(`Processing ${sheetsToProcess.length} sheets...`)
|
||||
}
|
||||
|
|
@ -59,7 +59,7 @@ export class ExcelHandler extends BaseFormatHandler {
|
|||
for (let sheetIndex = 0; sheetIndex < sheetsToProcess.length; sheetIndex++) {
|
||||
const sheetName = sheetsToProcess[sheetIndex]
|
||||
|
||||
// v4.5.0: Report current sheet
|
||||
// Report current sheet
|
||||
if (progressHooks?.onCurrentItem) {
|
||||
progressHooks.onCurrentItem(
|
||||
`Reading sheet: ${sheetName} (${sheetIndex + 1}/${sheetsToProcess.length})`
|
||||
|
|
@ -117,19 +117,19 @@ export class ExcelHandler extends BaseFormatHandler {
|
|||
headers
|
||||
}
|
||||
|
||||
// v4.5.0: Estimate bytes processed (sheets are sequential)
|
||||
// Estimate bytes processed (sheets are sequential)
|
||||
const bytesProcessed = Math.floor(((sheetIndex + 1) / sheetsToProcess.length) * totalBytes)
|
||||
if (progressHooks?.onBytesProcessed) {
|
||||
progressHooks.onBytesProcessed(bytesProcessed)
|
||||
}
|
||||
|
||||
// v4.5.0: Report extraction progress
|
||||
// Report extraction progress
|
||||
if (progressHooks?.onDataExtracted) {
|
||||
progressHooks.onDataExtracted(allData.length, undefined) // Total unknown until complete
|
||||
}
|
||||
}
|
||||
|
||||
// v4.5.0: Report data extraction complete
|
||||
// Report data extraction complete
|
||||
if (progressHooks?.onCurrentItem) {
|
||||
progressHooks.onCurrentItem(`Extracted ${allData.length} rows, inferring types...`)
|
||||
}
|
||||
|
|
@ -152,7 +152,7 @@ export class ExcelHandler extends BaseFormatHandler {
|
|||
}
|
||||
}
|
||||
|
||||
// v4.5.0: Report progress every 1000 rows (avoid spam)
|
||||
// Report progress every 1000 rows (avoid spam)
|
||||
if (progressHooks?.onCurrentItem && index > 0 && index % 1000 === 0) {
|
||||
progressHooks.onCurrentItem(`Converting types: ${index}/${allData.length} rows...`)
|
||||
}
|
||||
|
|
@ -160,14 +160,14 @@ export class ExcelHandler extends BaseFormatHandler {
|
|||
return converted
|
||||
})
|
||||
|
||||
// v4.5.0: Final progress - all bytes processed
|
||||
// Final progress - all bytes processed
|
||||
if (progressHooks?.onBytesProcessed) {
|
||||
progressHooks.onBytesProcessed(totalBytes)
|
||||
}
|
||||
|
||||
const processingTime = Date.now() - startTime
|
||||
|
||||
// v4.5.0: Report completion
|
||||
// Report completion
|
||||
if (progressHooks?.onCurrentItem) {
|
||||
progressHooks.onCurrentItem(
|
||||
`Excel complete: ${sheetsToProcess.length} sheets, ${convertedData.length} rows`
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Image Import Handler (v5.8.0 - Pure JavaScript)
|
||||
* Image Import Handler
|
||||
*
|
||||
* Handles image files with:
|
||||
* - EXIF metadata extraction (camera, GPS, timestamps) via exifr
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
* - Support for JPEG, PNG, WebP, GIF, TIFF, BMP, SVG
|
||||
*
|
||||
* NO NATIVE DEPENDENCIES - Pure JavaScript implementation
|
||||
* Replaces Sharp (v5.7.x) with lightweight pure-JS alternatives
|
||||
* Replaces Sharp with lightweight pure-JS alternatives
|
||||
*/
|
||||
|
||||
import { BaseFormatHandler } from './base.js'
|
||||
|
|
@ -96,7 +96,7 @@ export interface ImageHandlerOptions extends FormatHandlerOptions {
|
|||
* Enables developers to import images into the knowledge graph with
|
||||
* full metadata extraction.
|
||||
*
|
||||
* v5.8.0: Pure JavaScript implementation (no native dependencies)
|
||||
* Pure JavaScript implementation (no native dependencies)
|
||||
*/
|
||||
export class ImageHandler extends BaseFormatHandler {
|
||||
readonly format = 'image'
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ export class PDFHandler extends BaseFormatHandler {
|
|||
const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data, 'binary')
|
||||
const totalBytes = buffer.length
|
||||
|
||||
// v4.5.0: Report start
|
||||
// Report start
|
||||
if (progressHooks?.onBytesProcessed) {
|
||||
progressHooks.onBytesProcessed(0)
|
||||
}
|
||||
|
|
@ -74,7 +74,7 @@ export class PDFHandler extends BaseFormatHandler {
|
|||
const metadata = await pdfDoc.getMetadata()
|
||||
const numPages = pdfDoc.numPages
|
||||
|
||||
// v4.5.0: Report document loaded
|
||||
// Report document loaded
|
||||
if (progressHooks?.onCurrentItem) {
|
||||
progressHooks.onCurrentItem(`Processing ${numPages} pages...`)
|
||||
}
|
||||
|
|
@ -85,7 +85,7 @@ export class PDFHandler extends BaseFormatHandler {
|
|||
let detectedTables = 0
|
||||
|
||||
for (let pageNum = 1; pageNum <= numPages; pageNum++) {
|
||||
// v4.5.0: Report current page
|
||||
// Report current page
|
||||
if (progressHooks?.onCurrentItem) {
|
||||
progressHooks.onCurrentItem(`Processing page ${pageNum} of ${numPages}`)
|
||||
}
|
||||
|
|
@ -131,19 +131,19 @@ export class PDFHandler extends BaseFormatHandler {
|
|||
}
|
||||
}
|
||||
|
||||
// v4.5.0: Estimate bytes processed (pages are sequential)
|
||||
// Estimate bytes processed (pages are sequential)
|
||||
const bytesProcessed = Math.floor((pageNum / numPages) * totalBytes)
|
||||
if (progressHooks?.onBytesProcessed) {
|
||||
progressHooks.onBytesProcessed(bytesProcessed)
|
||||
}
|
||||
|
||||
// v4.5.0: Report extraction progress
|
||||
// Report extraction progress
|
||||
if (progressHooks?.onDataExtracted) {
|
||||
progressHooks.onDataExtracted(allData.length, undefined) // Total unknown until complete
|
||||
}
|
||||
}
|
||||
|
||||
// v4.5.0: Final progress - all bytes processed
|
||||
// Final progress - all bytes processed
|
||||
if (progressHooks?.onBytesProcessed) {
|
||||
progressHooks.onBytesProcessed(totalBytes)
|
||||
}
|
||||
|
|
@ -153,7 +153,7 @@ export class PDFHandler extends BaseFormatHandler {
|
|||
|
||||
const processingTime = Date.now() - startTime
|
||||
|
||||
// v4.5.0: Report completion
|
||||
// Report completion
|
||||
if (progressHooks?.onCurrentItem) {
|
||||
progressHooks.onCurrentItem(
|
||||
`PDF complete: ${numPages} pages, ${allData.length} items extracted`
|
||||
|
|
|
|||
|
|
@ -18,14 +18,14 @@ export { ExcelHandler } from './handlers/excelHandler.js'
|
|||
export { PDFHandler } from './handlers/pdfHandler.js'
|
||||
export { ImageHandler } from './handlers/imageHandler.js'
|
||||
|
||||
// Format Handler Registry (v5.2.0)
|
||||
// Format Handler Registry
|
||||
export {
|
||||
FormatHandlerRegistry,
|
||||
globalHandlerRegistry
|
||||
} from './FormatHandlerRegistry.js'
|
||||
export type { HandlerRegistration } from './FormatHandlerRegistry.js'
|
||||
|
||||
// Image Handler Types (v5.2.0)
|
||||
// Image Handler Types
|
||||
export type {
|
||||
ImageMetadata,
|
||||
EXIFData,
|
||||
|
|
|
|||
|
|
@ -88,13 +88,13 @@ export interface FormatHandlerOptions {
|
|||
streaming?: boolean
|
||||
|
||||
/**
|
||||
* Progress hooks (v4.5.0)
|
||||
* Progress hooks
|
||||
* Handlers call these to report progress during processing
|
||||
*/
|
||||
progressHooks?: FormatHandlerProgressHooks
|
||||
|
||||
/**
|
||||
* Total file size in bytes (v4.5.0)
|
||||
* Total file size in bytes
|
||||
* Used for progress percentage calculation
|
||||
*/
|
||||
totalBytes?: number
|
||||
|
|
@ -168,7 +168,7 @@ export interface IntelligentImportConfig {
|
|||
/** Enable PDF handler */
|
||||
enablePDF: boolean
|
||||
|
||||
/** Enable Image handler (v5.2.0) */
|
||||
/** Enable Image handler */
|
||||
enableImage: boolean
|
||||
|
||||
/** Default options for CSV */
|
||||
|
|
@ -180,7 +180,7 @@ export interface IntelligentImportConfig {
|
|||
/** Default options for PDF */
|
||||
pdfDefaults?: Partial<FormatHandlerOptions>
|
||||
|
||||
/** Default options for Image (v5.2.0) */
|
||||
/** Default options for Image */
|
||||
imageDefaults?: Partial<FormatHandlerOptions>
|
||||
|
||||
/** Maximum file size to process (bytes) */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue