@michelabboud/visual-forge-mcp 0.6.1 → 0.7.0
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.
- package/CHANGELOG.md +218 -0
- package/README.md +5 -2
- package/dist/providers/base-provider.d.ts +6 -2
- package/dist/providers/base-provider.d.ts.map +1 -1
- package/dist/providers/base-provider.js +249 -21
- package/dist/providers/base-provider.js.map +1 -1
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/mcp-server.js +4 -1
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/utils/filename-sanitizer.d.ts +51 -8
- package/dist/utils/filename-sanitizer.d.ts.map +1 -1
- package/dist/utils/filename-sanitizer.js +97 -14
- package/dist/utils/filename-sanitizer.js.map +1 -1
- package/dist/utils/image-metadata-manager.d.ts +151 -0
- package/dist/utils/image-metadata-manager.d.ts.map +1 -0
- package/dist/utils/image-metadata-manager.js +172 -0
- package/dist/utils/image-metadata-manager.js.map +1 -0
- package/dist/utils/index-manager.d.ts +38 -0
- package/dist/utils/index-manager.d.ts.map +1 -0
- package/dist/utils/index-manager.js +110 -0
- package/dist/utils/index-manager.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/multi-format-optimizer.d.ts +96 -0
- package/dist/utils/multi-format-optimizer.d.ts.map +1 -0
- package/dist/utils/multi-format-optimizer.js +423 -0
- package/dist/utils/multi-format-optimizer.js.map +1 -0
- package/dist/utils/prompt-enhancer.d.ts +48 -0
- package/dist/utils/prompt-enhancer.d.ts.map +1 -0
- package/dist/utils/prompt-enhancer.js +169 -0
- package/dist/utils/prompt-enhancer.js.map +1 -0
- package/dist/utils/quality-validator.d.ts +61 -0
- package/dist/utils/quality-validator.d.ts.map +1 -0
- package/dist/utils/quality-validator.js +386 -0
- package/dist/utils/quality-validator.js.map +1 -0
- package/dist/utils/source-metadata.d.ts +56 -0
- package/dist/utils/source-metadata.d.ts.map +1 -0
- package/dist/utils/source-metadata.js +122 -0
- package/dist/utils/source-metadata.js.map +1 -0
- package/dist/workflow/workflow-orchestrator.d.ts.map +1 -1
- package/dist/workflow/workflow-orchestrator.js +23 -0
- package/dist/workflow/workflow-orchestrator.js.map +1 -1
- package/dist/workflow/workflow-tools.d.ts.map +1 -1
- package/dist/workflow/workflow-tools.js +18 -0
- package/dist/workflow/workflow-tools.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quality Validator - Validates generated images for quality issues
|
|
3
|
+
* Uses OCR (Tesseract.js) to detect text rendering problems
|
|
4
|
+
* Analyzes sharpness, brightness, and other quality metrics
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Quality validation configuration
|
|
8
|
+
*/
|
|
9
|
+
export interface QualityValidationConfig {
|
|
10
|
+
enableOCR?: boolean;
|
|
11
|
+
maxGibberishRatio?: number;
|
|
12
|
+
minConfidence?: number;
|
|
13
|
+
minSharpness?: number;
|
|
14
|
+
minBrightness?: number;
|
|
15
|
+
maxBrightness?: number;
|
|
16
|
+
minQualityScore?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Quality validation result
|
|
20
|
+
*/
|
|
21
|
+
export interface QualityValidationResult {
|
|
22
|
+
passed: boolean;
|
|
23
|
+
score: number;
|
|
24
|
+
sharpness?: {
|
|
25
|
+
value: number;
|
|
26
|
+
passed: boolean;
|
|
27
|
+
threshold: number;
|
|
28
|
+
};
|
|
29
|
+
brightness?: {
|
|
30
|
+
value: number;
|
|
31
|
+
passed: boolean;
|
|
32
|
+
minThreshold: number;
|
|
33
|
+
maxThreshold: number;
|
|
34
|
+
};
|
|
35
|
+
ocr?: {
|
|
36
|
+
text: string;
|
|
37
|
+
confidence: number;
|
|
38
|
+
gibberishRatio: number;
|
|
39
|
+
passed: boolean;
|
|
40
|
+
issues: string[];
|
|
41
|
+
};
|
|
42
|
+
failureReasons: string[];
|
|
43
|
+
recommendations: string[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Validate image quality
|
|
47
|
+
*/
|
|
48
|
+
export declare function validateImageQuality(imagePath: string, config?: QualityValidationConfig): Promise<QualityValidationResult>;
|
|
49
|
+
/**
|
|
50
|
+
* Check if quality validation is available
|
|
51
|
+
*/
|
|
52
|
+
export declare function isQualityValidationAvailable(): Promise<{
|
|
53
|
+
sharpAvailable: boolean;
|
|
54
|
+
tesseractAvailable: boolean;
|
|
55
|
+
fullyAvailable: boolean;
|
|
56
|
+
}>;
|
|
57
|
+
/**
|
|
58
|
+
* Get default quality validation configuration
|
|
59
|
+
*/
|
|
60
|
+
export declare function getDefaultQualityConfig(): Required<QualityValidationConfig>;
|
|
61
|
+
//# sourceMappingURL=quality-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-validator.d.ts","sourceRoot":"","sources":["../../src/utils/quality-validator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0DH;;GAEG;AACH,MAAM,WAAW,uBAAuB;IAEtC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IAGd,SAAS,CAAC,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,OAAO,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAEF,UAAU,CAAC,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,OAAO,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IAEF,GAAG,CAAC,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IAGF,cAAc,EAAE,MAAM,EAAE,CAAC;IAGzB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AA6PD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,uBAA4B,GACnC,OAAO,CAAC,uBAAuB,CAAC,CAoHlC;AAED;;GAEG;AACH,wBAAsB,4BAA4B,IAAI,OAAO,CAAC;IAC5D,cAAc,EAAE,OAAO,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC,CASD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,QAAQ,CAAC,uBAAuB,CAAC,CAE3E"}
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quality Validator - Validates generated images for quality issues
|
|
3
|
+
* Uses OCR (Tesseract.js) to detect text rendering problems
|
|
4
|
+
* Analyzes sharpness, brightness, and other quality metrics
|
|
5
|
+
*/
|
|
6
|
+
import { logger } from './logger.js';
|
|
7
|
+
// Dynamic import of Sharp and Tesseract
|
|
8
|
+
let sharp = null;
|
|
9
|
+
let tesseract = null; // Use 'any' since tesseract.js might not be installed
|
|
10
|
+
let sharpAvailable = false;
|
|
11
|
+
let tesseractAvailable = false;
|
|
12
|
+
/**
|
|
13
|
+
* Initialize Sharp library
|
|
14
|
+
*/
|
|
15
|
+
async function initializeSharp() {
|
|
16
|
+
if (sharp !== null) {
|
|
17
|
+
return sharpAvailable;
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
sharp = (await import('sharp')).default;
|
|
21
|
+
sharpAvailable = true;
|
|
22
|
+
logger.debug('Sharp library loaded for quality validation');
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
sharpAvailable = false;
|
|
27
|
+
logger.warn('Sharp not available - quality validation will be limited', {
|
|
28
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
29
|
+
});
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Initialize Tesseract library
|
|
35
|
+
*/
|
|
36
|
+
async function initializeTesseract() {
|
|
37
|
+
if (tesseract !== null) {
|
|
38
|
+
return tesseractAvailable;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
// Try to dynamically import tesseract.js (optional dependency)
|
|
42
|
+
// @ts-ignore - tesseract.js is an optional dependency
|
|
43
|
+
const tesseractModule = await import('tesseract.js');
|
|
44
|
+
tesseract = tesseractModule;
|
|
45
|
+
tesseractAvailable = true;
|
|
46
|
+
logger.info('Tesseract.js loaded - OCR text validation enabled');
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
tesseractAvailable = false;
|
|
51
|
+
logger.warn('Tesseract.js not available - OCR validation disabled', {
|
|
52
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
53
|
+
hint: 'Install with: npm install tesseract.js',
|
|
54
|
+
});
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Default quality validation configuration
|
|
60
|
+
*/
|
|
61
|
+
const DEFAULT_CONFIG = {
|
|
62
|
+
enableOCR: true,
|
|
63
|
+
maxGibberishRatio: 0.3,
|
|
64
|
+
minConfidence: 60,
|
|
65
|
+
minSharpness: 50,
|
|
66
|
+
minBrightness: 30,
|
|
67
|
+
maxBrightness: 240,
|
|
68
|
+
minQualityScore: 60,
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Detect gibberish in text using heuristics
|
|
72
|
+
*/
|
|
73
|
+
function detectGibberish(text) {
|
|
74
|
+
if (!text || text.trim().length === 0) {
|
|
75
|
+
return { isGibberish: false, ratio: 0 };
|
|
76
|
+
}
|
|
77
|
+
const words = text.split(/\s+/).filter(w => w.length > 0);
|
|
78
|
+
if (words.length === 0) {
|
|
79
|
+
return { isGibberish: false, ratio: 0 };
|
|
80
|
+
}
|
|
81
|
+
let gibberishCount = 0;
|
|
82
|
+
// Common gibberish patterns
|
|
83
|
+
const gibberishPatterns = [
|
|
84
|
+
/^[^aeiouAEIOU]{5,}$/, // Too many consonants
|
|
85
|
+
/(.)\1{3,}/, // Repeated characters (aaaa)
|
|
86
|
+
/^[a-zA-Z]{1,2}$/, // Single/double letter words (except common ones)
|
|
87
|
+
/[^a-zA-Z0-9\s\-'.,!?@#$%&*()]/, // Unusual characters
|
|
88
|
+
/^[0-9]+[a-zA-Z]+[0-9]+$/, // Numbers mixed with letters oddly
|
|
89
|
+
];
|
|
90
|
+
// Common short words that are OK
|
|
91
|
+
const commonShortWords = new Set([
|
|
92
|
+
'a', 'i', 'an', 'as', 'at', 'be', 'by', 'do', 'go', 'he', 'if', 'in', 'is', 'it',
|
|
93
|
+
'me', 'my', 'no', 'of', 'on', 'or', 'so', 'to', 'up', 'us', 'we',
|
|
94
|
+
]);
|
|
95
|
+
for (const word of words) {
|
|
96
|
+
const lowerWord = word.toLowerCase();
|
|
97
|
+
// Skip common short words
|
|
98
|
+
if (commonShortWords.has(lowerWord)) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
// Check for gibberish patterns
|
|
102
|
+
let isGibberishWord = false;
|
|
103
|
+
for (const pattern of gibberishPatterns) {
|
|
104
|
+
if (pattern.test(word)) {
|
|
105
|
+
isGibberishWord = true;
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Check vowel ratio (real words usually have 20-60% vowels)
|
|
110
|
+
const vowels = word.match(/[aeiouAEIOU]/g);
|
|
111
|
+
const vowelRatio = vowels ? vowels.length / word.length : 0;
|
|
112
|
+
if (word.length > 3 && (vowelRatio < 0.1 || vowelRatio > 0.8)) {
|
|
113
|
+
isGibberishWord = true;
|
|
114
|
+
}
|
|
115
|
+
if (isGibberishWord) {
|
|
116
|
+
gibberishCount++;
|
|
117
|
+
logger.debug('Detected gibberish word', { word });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const ratio = gibberishCount / words.length;
|
|
121
|
+
const isGibberish = ratio > 0.3; // More than 30% gibberish
|
|
122
|
+
return { isGibberish, ratio };
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Calculate sharpness using Laplacian variance
|
|
126
|
+
*/
|
|
127
|
+
async function calculateSharpness(imagePath) {
|
|
128
|
+
if (!sharp) {
|
|
129
|
+
return 0;
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
const image = sharp(imagePath);
|
|
133
|
+
const { data, info } = await image
|
|
134
|
+
.greyscale()
|
|
135
|
+
.raw()
|
|
136
|
+
.toBuffer({ resolveWithObject: true });
|
|
137
|
+
// Calculate Laplacian variance (edge detection)
|
|
138
|
+
const width = info.width;
|
|
139
|
+
const height = info.height;
|
|
140
|
+
let sum = 0;
|
|
141
|
+
let count = 0;
|
|
142
|
+
for (let y = 1; y < height - 1; y++) {
|
|
143
|
+
for (let x = 1; x < width - 1; x++) {
|
|
144
|
+
const idx = y * width + x;
|
|
145
|
+
const center = data[idx];
|
|
146
|
+
const top = data[(y - 1) * width + x];
|
|
147
|
+
const bottom = data[(y + 1) * width + x];
|
|
148
|
+
const left = data[y * width + (x - 1)];
|
|
149
|
+
const right = data[y * width + (x + 1)];
|
|
150
|
+
// Laplacian kernel
|
|
151
|
+
const laplacian = Math.abs(4 * center - top - bottom - left - right);
|
|
152
|
+
sum += laplacian * laplacian;
|
|
153
|
+
count++;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const variance = sum / count;
|
|
157
|
+
return variance;
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
logger.warn('Failed to calculate sharpness', {
|
|
161
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
162
|
+
});
|
|
163
|
+
return 0;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Calculate average brightness
|
|
168
|
+
*/
|
|
169
|
+
async function calculateBrightness(imagePath) {
|
|
170
|
+
if (!sharp) {
|
|
171
|
+
return 128;
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
const image = sharp(imagePath);
|
|
175
|
+
const { data } = await image
|
|
176
|
+
.greyscale()
|
|
177
|
+
.raw()
|
|
178
|
+
.toBuffer({ resolveWithObject: true });
|
|
179
|
+
const sum = Array.from(data).reduce((acc, val) => acc + val, 0);
|
|
180
|
+
const average = sum / data.length;
|
|
181
|
+
return average;
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
logger.warn('Failed to calculate brightness', {
|
|
185
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
186
|
+
});
|
|
187
|
+
return 128;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Perform OCR text detection and validation
|
|
192
|
+
*/
|
|
193
|
+
async function performOCR(imagePath, config) {
|
|
194
|
+
if (!tesseract || !tesseractAvailable) {
|
|
195
|
+
logger.debug('OCR skipped - Tesseract not available');
|
|
196
|
+
return {
|
|
197
|
+
text: '',
|
|
198
|
+
confidence: 100,
|
|
199
|
+
gibberishRatio: 0,
|
|
200
|
+
passed: true,
|
|
201
|
+
issues: [],
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
logger.debug('Performing OCR text detection', { imagePath });
|
|
206
|
+
const worker = await tesseract.createWorker('eng');
|
|
207
|
+
const { data } = await worker.recognize(imagePath);
|
|
208
|
+
await worker.terminate();
|
|
209
|
+
const detectedText = data.text.trim();
|
|
210
|
+
const avgConfidence = data.confidence;
|
|
211
|
+
logger.debug('OCR completed', {
|
|
212
|
+
textLength: detectedText.length,
|
|
213
|
+
confidence: avgConfidence.toFixed(1),
|
|
214
|
+
});
|
|
215
|
+
const issues = [];
|
|
216
|
+
// Check if text was detected (might indicate unwanted text in image)
|
|
217
|
+
if (detectedText.length === 0) {
|
|
218
|
+
// No text detected - this is usually good for diagrams
|
|
219
|
+
return {
|
|
220
|
+
text: '',
|
|
221
|
+
confidence: 100,
|
|
222
|
+
gibberishRatio: 0,
|
|
223
|
+
passed: true,
|
|
224
|
+
issues: [],
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
// If text was detected, validate quality
|
|
228
|
+
const gibberishAnalysis = detectGibberish(detectedText);
|
|
229
|
+
// Low confidence
|
|
230
|
+
if (avgConfidence < config.minConfidence) {
|
|
231
|
+
issues.push(`Low OCR confidence: ${avgConfidence.toFixed(1)}% (min: ${config.minConfidence}%)`);
|
|
232
|
+
}
|
|
233
|
+
// High gibberish ratio
|
|
234
|
+
if (gibberishAnalysis.ratio > config.maxGibberishRatio) {
|
|
235
|
+
issues.push(`High gibberish ratio: ${(gibberishAnalysis.ratio * 100).toFixed(1)}% (max: ${config.maxGibberishRatio * 100}%)`);
|
|
236
|
+
}
|
|
237
|
+
const passed = issues.length === 0;
|
|
238
|
+
if (!passed) {
|
|
239
|
+
logger.warn('OCR quality issues detected', {
|
|
240
|
+
text: detectedText.substring(0, 100),
|
|
241
|
+
confidence: avgConfidence,
|
|
242
|
+
gibberishRatio: gibberishAnalysis.ratio,
|
|
243
|
+
issues,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
return {
|
|
247
|
+
text: detectedText,
|
|
248
|
+
confidence: avgConfidence,
|
|
249
|
+
gibberishRatio: gibberishAnalysis.ratio,
|
|
250
|
+
passed,
|
|
251
|
+
issues,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
logger.warn('OCR failed', {
|
|
256
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
257
|
+
});
|
|
258
|
+
// On error, pass validation (don't block generation)
|
|
259
|
+
return {
|
|
260
|
+
text: '',
|
|
261
|
+
confidence: 0,
|
|
262
|
+
gibberishRatio: 0,
|
|
263
|
+
passed: true,
|
|
264
|
+
issues: ['OCR error - validation skipped'],
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Validate image quality
|
|
270
|
+
*/
|
|
271
|
+
export async function validateImageQuality(imagePath, config = {}) {
|
|
272
|
+
// Merge with defaults
|
|
273
|
+
const fullConfig = {
|
|
274
|
+
...DEFAULT_CONFIG,
|
|
275
|
+
...config,
|
|
276
|
+
};
|
|
277
|
+
// Initialize libraries
|
|
278
|
+
await initializeSharp();
|
|
279
|
+
if (fullConfig.enableOCR) {
|
|
280
|
+
await initializeTesseract();
|
|
281
|
+
}
|
|
282
|
+
logger.info('Starting quality validation', {
|
|
283
|
+
imagePath,
|
|
284
|
+
ocrEnabled: fullConfig.enableOCR && tesseractAvailable,
|
|
285
|
+
});
|
|
286
|
+
const failureReasons = [];
|
|
287
|
+
const recommendations = [];
|
|
288
|
+
// Calculate sharpness
|
|
289
|
+
let sharpnessResult;
|
|
290
|
+
if (sharpAvailable) {
|
|
291
|
+
const sharpnessValue = await calculateSharpness(imagePath);
|
|
292
|
+
const sharpnessPassed = sharpnessValue >= fullConfig.minSharpness;
|
|
293
|
+
sharpnessResult = {
|
|
294
|
+
value: sharpnessValue,
|
|
295
|
+
passed: sharpnessPassed,
|
|
296
|
+
threshold: fullConfig.minSharpness,
|
|
297
|
+
};
|
|
298
|
+
if (!sharpnessPassed) {
|
|
299
|
+
failureReasons.push(`Low sharpness: ${sharpnessValue.toFixed(1)} (min: ${fullConfig.minSharpness})`);
|
|
300
|
+
recommendations.push('Image appears blurry - may need higher resolution or better AI model');
|
|
301
|
+
}
|
|
302
|
+
logger.debug('Sharpness calculated', sharpnessResult);
|
|
303
|
+
}
|
|
304
|
+
// Calculate brightness
|
|
305
|
+
let brightnessResult;
|
|
306
|
+
if (sharpAvailable) {
|
|
307
|
+
const brightnessValue = await calculateBrightness(imagePath);
|
|
308
|
+
const brightnessPassed = brightnessValue >= fullConfig.minBrightness &&
|
|
309
|
+
brightnessValue <= fullConfig.maxBrightness;
|
|
310
|
+
brightnessResult = {
|
|
311
|
+
value: brightnessValue,
|
|
312
|
+
passed: brightnessPassed,
|
|
313
|
+
minThreshold: fullConfig.minBrightness,
|
|
314
|
+
maxThreshold: fullConfig.maxBrightness,
|
|
315
|
+
};
|
|
316
|
+
if (!brightnessPassed) {
|
|
317
|
+
if (brightnessValue < fullConfig.minBrightness) {
|
|
318
|
+
failureReasons.push(`Too dark: ${brightnessValue.toFixed(1)} (min: ${fullConfig.minBrightness})`);
|
|
319
|
+
recommendations.push('Image is too dark - adjust prompt or generation parameters');
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
failureReasons.push(`Too bright: ${brightnessValue.toFixed(1)} (max: ${fullConfig.maxBrightness})`);
|
|
323
|
+
recommendations.push('Image is too bright - adjust prompt or generation parameters');
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
logger.debug('Brightness calculated', brightnessResult);
|
|
327
|
+
}
|
|
328
|
+
// Perform OCR validation
|
|
329
|
+
let ocrResult;
|
|
330
|
+
if (fullConfig.enableOCR && tesseractAvailable) {
|
|
331
|
+
const ocr = await performOCR(imagePath, fullConfig);
|
|
332
|
+
ocrResult = ocr;
|
|
333
|
+
if (!ocr.passed) {
|
|
334
|
+
failureReasons.push(...ocr.issues);
|
|
335
|
+
recommendations.push('Text rendering issues detected - consider regenerating with enhanced prompt');
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
// Calculate overall quality score (0-100)
|
|
339
|
+
let score = 100;
|
|
340
|
+
if (sharpnessResult && !sharpnessResult.passed) {
|
|
341
|
+
score -= 30;
|
|
342
|
+
}
|
|
343
|
+
if (brightnessResult && !brightnessResult.passed) {
|
|
344
|
+
score -= 20;
|
|
345
|
+
}
|
|
346
|
+
if (ocrResult && !ocrResult.passed) {
|
|
347
|
+
score -= 30;
|
|
348
|
+
}
|
|
349
|
+
score = Math.max(0, Math.min(100, score));
|
|
350
|
+
// Overall pass/fail
|
|
351
|
+
const passed = score >= fullConfig.minQualityScore;
|
|
352
|
+
const result = {
|
|
353
|
+
passed,
|
|
354
|
+
score,
|
|
355
|
+
sharpness: sharpnessResult,
|
|
356
|
+
brightness: brightnessResult,
|
|
357
|
+
ocr: ocrResult,
|
|
358
|
+
failureReasons,
|
|
359
|
+
recommendations,
|
|
360
|
+
};
|
|
361
|
+
logger.info('Quality validation complete', {
|
|
362
|
+
passed,
|
|
363
|
+
score,
|
|
364
|
+
failureReasons: failureReasons.length,
|
|
365
|
+
});
|
|
366
|
+
return result;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Check if quality validation is available
|
|
370
|
+
*/
|
|
371
|
+
export async function isQualityValidationAvailable() {
|
|
372
|
+
const sharp = await initializeSharp();
|
|
373
|
+
const tesseract = await initializeTesseract();
|
|
374
|
+
return {
|
|
375
|
+
sharpAvailable: sharp,
|
|
376
|
+
tesseractAvailable: tesseract,
|
|
377
|
+
fullyAvailable: sharp && tesseract,
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Get default quality validation configuration
|
|
382
|
+
*/
|
|
383
|
+
export function getDefaultQualityConfig() {
|
|
384
|
+
return { ...DEFAULT_CONFIG };
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=quality-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-validator.js","sourceRoot":"","sources":["../../src/utils/quality-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source Metadata Manager - Manages source.json files in indexed directories
|
|
3
|
+
* Provides rich metadata about source files and generated images
|
|
4
|
+
*/
|
|
5
|
+
export interface SourceMetadata {
|
|
6
|
+
index: number;
|
|
7
|
+
sourceFile: string;
|
|
8
|
+
absolutePath: string;
|
|
9
|
+
sessionId?: string;
|
|
10
|
+
provider: string;
|
|
11
|
+
createdAt: string;
|
|
12
|
+
updatedAt: string;
|
|
13
|
+
stats: {
|
|
14
|
+
imageCount: number;
|
|
15
|
+
totalSize: number;
|
|
16
|
+
formats: {
|
|
17
|
+
[format: string]: {
|
|
18
|
+
count: number;
|
|
19
|
+
avgSize: number;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
quality?: {
|
|
24
|
+
avgScore: number;
|
|
25
|
+
passedCount: number;
|
|
26
|
+
failedCount: number;
|
|
27
|
+
regeneratedCount: number;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export declare class SourceMetadataManager {
|
|
31
|
+
/**
|
|
32
|
+
* Create source.json for a new indexed directory
|
|
33
|
+
*/
|
|
34
|
+
static create(indexDir: string, sourceFile: string, index: number, provider: string, sessionId?: string): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Read source.json from indexed directory
|
|
37
|
+
*/
|
|
38
|
+
static read(indexDir: string): Promise<SourceMetadata>;
|
|
39
|
+
/**
|
|
40
|
+
* Check if source.json exists in directory
|
|
41
|
+
*/
|
|
42
|
+
static exists(indexDir: string): Promise<boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* Update metadata (call after generating images)
|
|
45
|
+
*/
|
|
46
|
+
static update(indexDir: string, updates: Partial<SourceMetadata>): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Update stats after image generation
|
|
49
|
+
*/
|
|
50
|
+
static updateStats(indexDir: string, format: string, size: number): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Update quality metrics
|
|
53
|
+
*/
|
|
54
|
+
static updateQuality(indexDir: string, score: number, passed: boolean, regenerated?: boolean): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=source-metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-metadata.d.ts","sourceRoot":"","sources":["../../src/utils/source-metadata.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE;YACP,CAAC,MAAM,EAAE,MAAM,GAAG;gBAChB,KAAK,EAAE,MAAM,CAAC;gBACd,OAAO,EAAE,MAAM,CAAC;aACjB,CAAC;SACH,CAAC;KACH,CAAC;IACF,OAAO,CAAC,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,qBAAa,qBAAqB;IAChC;;OAEG;WACU,MAAM,CACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IA0BhB;;OAEG;WACU,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAM5D;;OAEG;WACU,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUvD;;OAEG;WACU,MAAM,CACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,OAAO,CAAC,IAAI,CAAC;IAkBhB;;OAEG;WACU,WAAW,CACtB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC;IAuBhB;;OAEG;WACU,aAAa,CACxB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,EACf,WAAW,GAAE,OAAe,GAC3B,OAAO,CAAC,IAAI,CAAC;CA4BjB"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source Metadata Manager - Manages source.json files in indexed directories
|
|
3
|
+
* Provides rich metadata about source files and generated images
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs/promises';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import { logger } from './logger.js';
|
|
8
|
+
export class SourceMetadataManager {
|
|
9
|
+
/**
|
|
10
|
+
* Create source.json for a new indexed directory
|
|
11
|
+
*/
|
|
12
|
+
static async create(indexDir, sourceFile, index, provider, sessionId) {
|
|
13
|
+
const metadata = {
|
|
14
|
+
index,
|
|
15
|
+
sourceFile,
|
|
16
|
+
absolutePath: path.resolve(sourceFile),
|
|
17
|
+
sessionId,
|
|
18
|
+
provider,
|
|
19
|
+
createdAt: new Date().toISOString(),
|
|
20
|
+
updatedAt: new Date().toISOString(),
|
|
21
|
+
stats: {
|
|
22
|
+
imageCount: 0,
|
|
23
|
+
totalSize: 0,
|
|
24
|
+
formats: {},
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
const metadataPath = path.join(indexDir, 'source.json');
|
|
28
|
+
await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2), 'utf-8');
|
|
29
|
+
logger.debug('Created source metadata', {
|
|
30
|
+
indexDir,
|
|
31
|
+
sourceFile,
|
|
32
|
+
index,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Read source.json from indexed directory
|
|
37
|
+
*/
|
|
38
|
+
static async read(indexDir) {
|
|
39
|
+
const metadataPath = path.join(indexDir, 'source.json');
|
|
40
|
+
const data = await fs.readFile(metadataPath, 'utf-8');
|
|
41
|
+
return JSON.parse(data);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check if source.json exists in directory
|
|
45
|
+
*/
|
|
46
|
+
static async exists(indexDir) {
|
|
47
|
+
try {
|
|
48
|
+
const metadataPath = path.join(indexDir, 'source.json');
|
|
49
|
+
await fs.access(metadataPath);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Update metadata (call after generating images)
|
|
58
|
+
*/
|
|
59
|
+
static async update(indexDir, updates) {
|
|
60
|
+
const current = await this.read(indexDir);
|
|
61
|
+
const updated = {
|
|
62
|
+
...current,
|
|
63
|
+
...updates,
|
|
64
|
+
updatedAt: new Date().toISOString(),
|
|
65
|
+
};
|
|
66
|
+
const metadataPath = path.join(indexDir, 'source.json');
|
|
67
|
+
await fs.writeFile(metadataPath, JSON.stringify(updated, null, 2), 'utf-8');
|
|
68
|
+
logger.debug('Updated source metadata', {
|
|
69
|
+
indexDir,
|
|
70
|
+
updates: Object.keys(updates),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Update stats after image generation
|
|
75
|
+
*/
|
|
76
|
+
static async updateStats(indexDir, format, size) {
|
|
77
|
+
const current = await this.read(indexDir);
|
|
78
|
+
if (!current.stats.formats[format]) {
|
|
79
|
+
current.stats.formats[format] = { count: 0, avgSize: 0 };
|
|
80
|
+
}
|
|
81
|
+
const formatStats = current.stats.formats[format];
|
|
82
|
+
const newCount = formatStats.count + 1;
|
|
83
|
+
const newAvgSize = (formatStats.avgSize * formatStats.count + size) / newCount;
|
|
84
|
+
current.stats.formats[format] = {
|
|
85
|
+
count: newCount,
|
|
86
|
+
avgSize: Math.round(newAvgSize),
|
|
87
|
+
};
|
|
88
|
+
current.stats.imageCount++;
|
|
89
|
+
current.stats.totalSize += size;
|
|
90
|
+
await this.update(indexDir, { stats: current.stats });
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Update quality metrics
|
|
94
|
+
*/
|
|
95
|
+
static async updateQuality(indexDir, score, passed, regenerated = false) {
|
|
96
|
+
const current = await this.read(indexDir);
|
|
97
|
+
if (!current.quality) {
|
|
98
|
+
current.quality = {
|
|
99
|
+
avgScore: score,
|
|
100
|
+
passedCount: passed ? 1 : 0,
|
|
101
|
+
failedCount: passed ? 0 : 1,
|
|
102
|
+
regeneratedCount: regenerated ? 1 : 0,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
const totalImages = current.quality.passedCount + current.quality.failedCount;
|
|
107
|
+
const newAvgScore = (current.quality.avgScore * totalImages + score) / (totalImages + 1);
|
|
108
|
+
current.quality.avgScore = Math.round(newAvgScore * 10) / 10;
|
|
109
|
+
if (passed) {
|
|
110
|
+
current.quality.passedCount++;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
current.quality.failedCount++;
|
|
114
|
+
}
|
|
115
|
+
if (regenerated) {
|
|
116
|
+
current.quality.regeneratedCount++;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
await this.update(indexDir, { quality: current.quality });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=source-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-metadata.js","sourceRoot":"","sources":["../../src/utils/source-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-orchestrator.d.ts","sourceRoot":"","sources":["../../src/workflow/workflow-orchestrator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EACL,cAAc,EACd,SAAS,EAET,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAI3B,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,YAAY,CAAgB;gBAExB,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc;IAK9D;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoDnD;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,MAAM,IAAI,IAAI;IAOd;;OAEG;IACH,IAAI,IAAI,IAAI;IAMZ;;OAEG;IACH,WAAW,IAAI,kBAAkB;IA+DjC;;OAEG;YACW,kBAAkB;IA0BhC;;OAEG;YACW,YAAY;IAsC1B;;OAEG;YACW,WAAW;IAiDzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAc3B;;OAEG;IACH,OAAO,CAAC,WAAW;IAuCnB;;OAEG;YACW,UAAU;
|
|
1
|
+
{"version":3,"file":"workflow-orchestrator.d.ts","sourceRoot":"","sources":["../../src/workflow/workflow-orchestrator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EACL,cAAc,EACd,SAAS,EAET,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAI3B,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,YAAY,CAAgB;gBAExB,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc;IAK9D;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoDnD;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,MAAM,IAAI,IAAI;IAOd;;OAEG;IACH,IAAI,IAAI,IAAI;IAMZ;;OAEG;IACH,WAAW,IAAI,kBAAkB;IA+DjC;;OAEG;YACW,kBAAkB;IA0BhC;;OAEG;YACW,YAAY;IAsC1B;;OAEG;YACW,WAAW;IAiDzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAc3B;;OAEG;IACH,OAAO,CAAC,WAAW;IAuCnB;;OAEG;YACW,UAAU;CAsGzB"}
|