/** * Preview Worker - Fast-path local preview generation * * Watches ~/Lia-Hub/shared/outputs/ and generates: * - Thumbnails (for images) * - Metadata extraction (dimensions, page count, text snippets) * - Preview JSON for instant gallery display * * NO LLM involvement - pure local, deterministic processing. * Targets sub-second response for most assets. * * Uses chokidar for reliable cross-platform file watching with: * - awaitWriteFinish to handle half-written files * - Ignore patterns to avoid loops (*.asset.json, thumbs, etc.) */ import { AssetManifest, AssetPreview } from './assets.js'; export interface PreviewWorkerOptions { /** Directories to watch */ watchDirs?: string[]; /** Max concurrent preview jobs */ concurrency?: number; /** Callback when asset is discovered */ onAsset?: (manifest: AssetManifest) => void; /** Callback when preview is ready */ onPreview?: (preview: AssetPreview) => void; /** Enable verbose logging */ verbose?: boolean; } export declare class PreviewWorker { private watcher; private queue; private processing; private debounceTimers; private concurrency; private options; private running; private rootDir; constructor(options?: PreviewWorkerOptions); /** * Start watching directories */ start(): void; /** * Handle file add/change with debouncing */ private handleFile; /** * Stop watching */ stop(): void; /** * Add file to processing queue */ private enqueue; /** * Process queue with concurrency limit */ private processQueue; /** * Process a single file - generate manifest and preview */ private processFile; /** * Generate preview for an asset */ private generatePreview; /** * Get image dimensions using sips (macOS) or file command */ private getImageInfo; /** * Generate thumbnail as base64 data URL * Uses sips on macOS for fast resizing */ private generateImageThumbnail; /** * Get PDF info using pdfinfo or mdls */ private getPdfInfo; /** * Get text snippet from file */ private getTextSnippet; /** * Extract group ID from file path * e.g., ~/Lia-Hub/shared/outputs/run_abc123/file.png -> run_abc123 */ private extractGroupId; private log; } export interface AssetRegistry { assets: Map; previews: Map; byGroup: Map>; } export declare function getAssetRegistry(): AssetRegistry; export declare function registerAsset(manifest: AssetManifest): void; export declare function registerPreview(preview: AssetPreview): void; export declare function getAsset(assetId: string): AssetManifest | undefined; export declare function getPreview(assetId: string): AssetPreview | undefined; export declare function getAssetsByGroup(groupId: string): AssetManifest[]; export declare function getAllAssets(): AssetManifest[]; export declare function startPreviewWorker(options?: PreviewWorkerOptions): PreviewWorker; export declare function stopPreviewWorker(): void;