@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.
Files changed (48) hide show
  1. package/CHANGELOG.md +218 -0
  2. package/README.md +5 -2
  3. package/dist/providers/base-provider.d.ts +6 -2
  4. package/dist/providers/base-provider.d.ts.map +1 -1
  5. package/dist/providers/base-provider.js +249 -21
  6. package/dist/providers/base-provider.js.map +1 -1
  7. package/dist/server/mcp-server.d.ts.map +1 -1
  8. package/dist/server/mcp-server.js +4 -1
  9. package/dist/server/mcp-server.js.map +1 -1
  10. package/dist/utils/filename-sanitizer.d.ts +51 -8
  11. package/dist/utils/filename-sanitizer.d.ts.map +1 -1
  12. package/dist/utils/filename-sanitizer.js +97 -14
  13. package/dist/utils/filename-sanitizer.js.map +1 -1
  14. package/dist/utils/image-metadata-manager.d.ts +151 -0
  15. package/dist/utils/image-metadata-manager.d.ts.map +1 -0
  16. package/dist/utils/image-metadata-manager.js +172 -0
  17. package/dist/utils/image-metadata-manager.js.map +1 -0
  18. package/dist/utils/index-manager.d.ts +38 -0
  19. package/dist/utils/index-manager.d.ts.map +1 -0
  20. package/dist/utils/index-manager.js +110 -0
  21. package/dist/utils/index-manager.js.map +1 -0
  22. package/dist/utils/index.d.ts +4 -0
  23. package/dist/utils/index.d.ts.map +1 -1
  24. package/dist/utils/index.js +4 -0
  25. package/dist/utils/index.js.map +1 -1
  26. package/dist/utils/multi-format-optimizer.d.ts +96 -0
  27. package/dist/utils/multi-format-optimizer.d.ts.map +1 -0
  28. package/dist/utils/multi-format-optimizer.js +423 -0
  29. package/dist/utils/multi-format-optimizer.js.map +1 -0
  30. package/dist/utils/prompt-enhancer.d.ts +48 -0
  31. package/dist/utils/prompt-enhancer.d.ts.map +1 -0
  32. package/dist/utils/prompt-enhancer.js +169 -0
  33. package/dist/utils/prompt-enhancer.js.map +1 -0
  34. package/dist/utils/quality-validator.d.ts +61 -0
  35. package/dist/utils/quality-validator.d.ts.map +1 -0
  36. package/dist/utils/quality-validator.js +386 -0
  37. package/dist/utils/quality-validator.js.map +1 -0
  38. package/dist/utils/source-metadata.d.ts +56 -0
  39. package/dist/utils/source-metadata.d.ts.map +1 -0
  40. package/dist/utils/source-metadata.js +122 -0
  41. package/dist/utils/source-metadata.js.map +1 -0
  42. package/dist/workflow/workflow-orchestrator.d.ts.map +1 -1
  43. package/dist/workflow/workflow-orchestrator.js +23 -0
  44. package/dist/workflow/workflow-orchestrator.js.map +1 -1
  45. package/dist/workflow/workflow-tools.d.ts.map +1 -1
  46. package/dist/workflow/workflow-tools.js +18 -0
  47. package/dist/workflow/workflow-tools.js.map +1 -1
  48. package/package.json +1 -1
@@ -0,0 +1,423 @@
1
+ /**
2
+ * Multi-Format Image Optimizer with Watermarking
3
+ * Generates multiple optimized formats from a single source image
4
+ *
5
+ * Formats:
6
+ * - WebP: For web use (watermarked, high compression)
7
+ * - JPEG: For PDF export (watermarked, universal compatibility)
8
+ * - PNG: Optional, for specific use cases (watermarked)
9
+ * - Original: Pristine backup (NO watermark)
10
+ *
11
+ * Directory structure:
12
+ * {provider}/
13
+ * ├── original/
14
+ * │ ├── img-01.png (NO watermark)
15
+ * │ ├── img-01.meta.json
16
+ * │ └── img-01.log
17
+ * ├── webp/
18
+ * │ └── img-01.webp (watermarked)
19
+ * ├── jpg/
20
+ * │ └── img-01.jpg (watermarked)
21
+ * └── png/
22
+ * └── img-01.png (watermarked, optional)
23
+ */
24
+ import * as fs from 'fs/promises';
25
+ import * as path from 'path';
26
+ import { logger } from './logger.js';
27
+ import { createFormatPath } from './filename-sanitizer.js';
28
+ // Dynamic import of Sharp
29
+ let sharp = null;
30
+ let sharpAvailable = false;
31
+ /**
32
+ * Initialize Sharp library
33
+ */
34
+ async function initializeSharp() {
35
+ if (sharp !== null) {
36
+ return sharpAvailable;
37
+ }
38
+ try {
39
+ sharp = (await import('sharp')).default;
40
+ sharpAvailable = true;
41
+ logger.info('Sharp library loaded - multi-format optimization enabled');
42
+ return true;
43
+ }
44
+ catch (error) {
45
+ sharpAvailable = false;
46
+ logger.warn('Sharp library not available - multi-format optimization disabled', {
47
+ error: error instanceof Error ? error.message : 'Unknown error',
48
+ });
49
+ return false;
50
+ }
51
+ }
52
+ /**
53
+ * Default watermark configuration
54
+ */
55
+ const DEFAULT_WATERMARK = {
56
+ text: 'Generated with Visual Forge MCP ©',
57
+ position: 'bottom-right',
58
+ opacity: 30,
59
+ fontSize: 12,
60
+ color: '#666666',
61
+ fontFamily: 'Arial',
62
+ };
63
+ /**
64
+ * Create SVG watermark overlay
65
+ */
66
+ function createWatermarkSVG(config, imageWidth, imageHeight) {
67
+ const padding = 10;
68
+ let x;
69
+ let y;
70
+ let anchor;
71
+ switch (config.position) {
72
+ case 'bottom-right':
73
+ x = imageWidth - padding;
74
+ y = imageHeight - padding;
75
+ anchor = 'end';
76
+ break;
77
+ case 'bottom-left':
78
+ x = padding;
79
+ y = imageHeight - padding;
80
+ anchor = 'start';
81
+ break;
82
+ case 'top-right':
83
+ x = imageWidth - padding;
84
+ y = padding + config.fontSize;
85
+ anchor = 'end';
86
+ break;
87
+ case 'top-left':
88
+ x = padding;
89
+ y = padding + config.fontSize;
90
+ anchor = 'start';
91
+ break;
92
+ case 'center':
93
+ x = imageWidth / 2;
94
+ y = imageHeight / 2;
95
+ anchor = 'middle';
96
+ break;
97
+ }
98
+ const opacityDecimal = config.opacity / 100;
99
+ return `
100
+ <svg width="${imageWidth}" height="${imageHeight}">
101
+ <text
102
+ x="${x}"
103
+ y="${y}"
104
+ font-family="${config.fontFamily || 'Arial'}"
105
+ font-size="${config.fontSize}"
106
+ fill="${config.color}"
107
+ fill-opacity="${opacityDecimal}"
108
+ text-anchor="${anchor}"
109
+ >
110
+ ${config.text}
111
+ </text>
112
+ </svg>
113
+ `;
114
+ }
115
+ /**
116
+ * Optimize image to multiple formats with optional watermarking
117
+ *
118
+ * @param originalImagePath - Path to the original generated image (in provider root)
119
+ * @param sourceFile - Original source markdown file path
120
+ * @param imageId - Image identifier
121
+ * @param provider - Provider name
122
+ * @param options - Multi-format optimization options
123
+ * @returns Multi-format optimization result
124
+ */
125
+ export async function optimizeToMultipleFormats(originalImagePath, sourceFile, imageId, provider, options = {}) {
126
+ // Default options
127
+ const { generateWebP = true, generateJPEG = true, generatePNG = false, webpQuality = 85, jpegQuality = 90, pngQuality = 85, pngCompressionLevel = 9, pngUsePalette = true, pngColors = 256, pngDither = 1.0, maxWidth = 1920, maxHeight = 1920, watermark = DEFAULT_WATERMARK, skipWatermark = false, } = options;
128
+ const formats = [];
129
+ // Check if Sharp is available
130
+ const isSharpAvailable = await initializeSharp();
131
+ if (!isSharpAvailable || !sharp) {
132
+ logger.warn('Sharp not available - skipping multi-format optimization', {
133
+ originalImagePath,
134
+ });
135
+ // Get original file size
136
+ const originalStats = await fs.stat(originalImagePath);
137
+ const originalSize = originalStats.size;
138
+ return {
139
+ sourceFile,
140
+ imageId,
141
+ provider,
142
+ originalPath: originalImagePath,
143
+ originalSize,
144
+ formats: [
145
+ {
146
+ format: 'original',
147
+ path: originalImagePath,
148
+ size: originalSize,
149
+ watermarked: false,
150
+ },
151
+ ],
152
+ totalOptimizedSize: 0,
153
+ watermarkApplied: false,
154
+ sharpAvailable: false,
155
+ };
156
+ }
157
+ try {
158
+ logger.info('Starting multi-format optimization', {
159
+ imageId,
160
+ formats: {
161
+ webp: generateWebP,
162
+ jpeg: generateJPEG,
163
+ png: generatePNG,
164
+ },
165
+ watermark: !skipWatermark,
166
+ });
167
+ // Get original file stats
168
+ const originalStats = await fs.stat(originalImagePath);
169
+ const originalSize = originalStats.size;
170
+ // Load original image with Sharp
171
+ const sharpInstance = sharp(originalImagePath);
172
+ const metadata = await sharpInstance.metadata();
173
+ logger.debug('Original image metadata', {
174
+ width: metadata.width,
175
+ height: metadata.height,
176
+ format: metadata.format,
177
+ size: originalSize,
178
+ });
179
+ // Create original/ directory and move pristine original there
180
+ const originalPath = await createFormatPath(sourceFile, provider, 'original', imageId, 'png');
181
+ const originalDir = path.dirname(originalPath);
182
+ await fs.mkdir(originalDir, { recursive: true });
183
+ await fs.copyFile(originalImagePath, originalPath);
184
+ logger.info('Pristine original saved (no watermark)', {
185
+ path: originalPath,
186
+ size: originalSize,
187
+ });
188
+ formats.push({
189
+ format: 'original',
190
+ path: originalPath,
191
+ size: originalSize,
192
+ watermarked: false,
193
+ });
194
+ // Prepare base pipeline with resize if needed
195
+ let basePipeline = sharp(originalImagePath);
196
+ const imageWidth = metadata.width || 1920;
197
+ const imageHeight = metadata.height || 1920;
198
+ if (imageWidth > maxWidth || imageHeight > maxHeight) {
199
+ basePipeline = basePipeline.resize(maxWidth, maxHeight, {
200
+ fit: 'inside',
201
+ withoutEnlargement: true,
202
+ });
203
+ logger.debug('Image will be resized', { maxWidth, maxHeight });
204
+ }
205
+ // Create watermark SVG if watermarking is enabled
206
+ let watermarkBuffer;
207
+ if (!skipWatermark) {
208
+ const watermarkSVG = createWatermarkSVG(watermark, imageWidth, imageHeight);
209
+ watermarkBuffer = Buffer.from(watermarkSVG);
210
+ logger.debug('Watermark created', {
211
+ text: watermark.text,
212
+ position: watermark.position,
213
+ opacity: watermark.opacity,
214
+ });
215
+ }
216
+ // Generate WebP
217
+ if (generateWebP) {
218
+ const webpPath = await createFormatPath(sourceFile, provider, 'webp', imageId, 'webp');
219
+ const webpDir = path.dirname(webpPath);
220
+ await fs.mkdir(webpDir, { recursive: true });
221
+ let webpPipeline = sharp(originalImagePath);
222
+ // Resize if needed
223
+ if (imageWidth > maxWidth || imageHeight > maxHeight) {
224
+ webpPipeline = webpPipeline.resize(maxWidth, maxHeight, {
225
+ fit: 'inside',
226
+ withoutEnlargement: true,
227
+ });
228
+ }
229
+ // Apply watermark
230
+ if (!skipWatermark && watermarkBuffer) {
231
+ webpPipeline = webpPipeline.composite([
232
+ {
233
+ input: watermarkBuffer,
234
+ blend: 'over',
235
+ },
236
+ ]);
237
+ }
238
+ // Convert to WebP
239
+ await webpPipeline.webp({ quality: webpQuality, effort: 6 }).toFile(webpPath);
240
+ const webpStats = await fs.stat(webpPath);
241
+ const webpSize = webpStats.size;
242
+ logger.info('WebP generated', {
243
+ path: webpPath,
244
+ size: webpSize,
245
+ reduction: `${(((originalSize - webpSize) / originalSize) * 100).toFixed(1)}%`,
246
+ });
247
+ formats.push({
248
+ format: 'webp',
249
+ path: webpPath,
250
+ size: webpSize,
251
+ watermarked: !skipWatermark,
252
+ });
253
+ }
254
+ // Generate JPEG
255
+ if (generateJPEG) {
256
+ const jpegPath = await createFormatPath(sourceFile, provider, 'jpg', imageId, 'jpg');
257
+ const jpegDir = path.dirname(jpegPath);
258
+ await fs.mkdir(jpegDir, { recursive: true });
259
+ let jpegPipeline = sharp(originalImagePath);
260
+ // Resize if needed
261
+ if (imageWidth > maxWidth || imageHeight > maxHeight) {
262
+ jpegPipeline = jpegPipeline.resize(maxWidth, maxHeight, {
263
+ fit: 'inside',
264
+ withoutEnlargement: true,
265
+ });
266
+ }
267
+ // Apply watermark
268
+ if (!skipWatermark && watermarkBuffer) {
269
+ jpegPipeline = jpegPipeline.composite([
270
+ {
271
+ input: watermarkBuffer,
272
+ blend: 'over',
273
+ },
274
+ ]);
275
+ }
276
+ // Convert to JPEG
277
+ await jpegPipeline.jpeg({ quality: jpegQuality, mozjpeg: true }).toFile(jpegPath);
278
+ const jpegStats = await fs.stat(jpegPath);
279
+ const jpegSize = jpegStats.size;
280
+ logger.info('JPEG generated', {
281
+ path: jpegPath,
282
+ size: jpegSize,
283
+ reduction: `${(((originalSize - jpegSize) / originalSize) * 100).toFixed(1)}%`,
284
+ });
285
+ formats.push({
286
+ format: 'jpg',
287
+ path: jpegPath,
288
+ size: jpegSize,
289
+ watermarked: !skipWatermark,
290
+ });
291
+ }
292
+ // Generate PNG (optional, watermarked)
293
+ if (generatePNG) {
294
+ const pngPath = await createFormatPath(sourceFile, provider, 'png', imageId, 'png');
295
+ const pngDir = path.dirname(pngPath);
296
+ await fs.mkdir(pngDir, { recursive: true });
297
+ let pngPipeline = sharp(originalImagePath);
298
+ // Resize if needed
299
+ if (imageWidth > maxWidth || imageHeight > maxHeight) {
300
+ pngPipeline = pngPipeline.resize(maxWidth, maxHeight, {
301
+ fit: 'inside',
302
+ withoutEnlargement: true,
303
+ });
304
+ }
305
+ // Apply watermark
306
+ if (!skipWatermark && watermarkBuffer) {
307
+ pngPipeline = pngPipeline.composite([
308
+ {
309
+ input: watermarkBuffer,
310
+ blend: 'over',
311
+ },
312
+ ]);
313
+ }
314
+ // Convert to PNG with lossy or lossless optimization
315
+ if (pngUsePalette) {
316
+ // Lossy optimization with palette (70% size reduction)
317
+ await pngPipeline
318
+ .png({
319
+ quality: pngQuality,
320
+ palette: true,
321
+ compressionLevel: pngCompressionLevel,
322
+ colors: pngColors,
323
+ dither: pngDither,
324
+ })
325
+ .toFile(pngPath);
326
+ logger.debug('PNG lossy optimization applied', {
327
+ quality: pngQuality,
328
+ colors: pngColors,
329
+ dither: pngDither,
330
+ });
331
+ }
332
+ else {
333
+ // Lossless optimization (15% size reduction)
334
+ await pngPipeline
335
+ .png({ compressionLevel: pngCompressionLevel, adaptiveFiltering: true })
336
+ .toFile(pngPath);
337
+ logger.debug('PNG lossless optimization applied', {
338
+ compressionLevel: pngCompressionLevel,
339
+ });
340
+ }
341
+ const pngStats = await fs.stat(pngPath);
342
+ const pngSize = pngStats.size;
343
+ logger.info('PNG (watermarked, optimized) generated', {
344
+ path: pngPath,
345
+ size: pngSize,
346
+ mode: pngUsePalette ? 'lossy' : 'lossless',
347
+ reduction: `${(((originalSize - pngSize) / originalSize) * 100).toFixed(1)}%`,
348
+ });
349
+ formats.push({
350
+ format: 'png',
351
+ path: pngPath,
352
+ size: pngSize,
353
+ watermarked: !skipWatermark,
354
+ });
355
+ }
356
+ // Remove original from provider root (it's now in original/ subdirectory)
357
+ if (originalImagePath !== originalPath) {
358
+ await fs.unlink(originalImagePath);
359
+ logger.debug('Removed original from provider root', { path: originalImagePath });
360
+ }
361
+ // Calculate total optimized size (excluding original)
362
+ const totalOptimizedSize = formats
363
+ .filter(f => f.format !== 'original')
364
+ .reduce((sum, f) => sum + f.size, 0);
365
+ logger.info('Multi-format optimization complete', {
366
+ imageId,
367
+ originalSize,
368
+ totalOptimizedSize,
369
+ formats: formats.map(f => f.format),
370
+ watermarkApplied: !skipWatermark,
371
+ });
372
+ return {
373
+ sourceFile,
374
+ imageId,
375
+ provider,
376
+ originalPath,
377
+ originalSize,
378
+ formats,
379
+ totalOptimizedSize,
380
+ watermarkApplied: !skipWatermark,
381
+ sharpAvailable: true,
382
+ };
383
+ }
384
+ catch (error) {
385
+ logger.error('Multi-format optimization failed', {
386
+ imageId,
387
+ error: error instanceof Error ? error.message : 'Unknown error',
388
+ });
389
+ // On error, keep original and return minimal result
390
+ const originalStats = await fs.stat(originalImagePath);
391
+ return {
392
+ sourceFile,
393
+ imageId,
394
+ provider,
395
+ originalPath: originalImagePath,
396
+ originalSize: originalStats.size,
397
+ formats: [
398
+ {
399
+ format: 'original',
400
+ path: originalImagePath,
401
+ size: originalStats.size,
402
+ watermarked: false,
403
+ },
404
+ ],
405
+ totalOptimizedSize: 0,
406
+ watermarkApplied: false,
407
+ sharpAvailable: true,
408
+ };
409
+ }
410
+ }
411
+ /**
412
+ * Check if multi-format optimization is available
413
+ */
414
+ export async function isMultiFormatOptimizationAvailable() {
415
+ return await initializeSharp();
416
+ }
417
+ /**
418
+ * Get default watermark configuration
419
+ */
420
+ export function getDefaultWatermark() {
421
+ return { ...DEFAULT_WATERMARK };
422
+ }
423
+ //# sourceMappingURL=multi-format-optimizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-format-optimizer.js","sourceRoot":"","sources":["../../src/utils/multi-format-optimizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Prompt Enhancer - Enhances prompts to minimize AI text rendering errors
3
+ * Adds specific instructions to reduce gibberish and improve quality
4
+ */
5
+ /**
6
+ * Prompt enhancement configuration
7
+ */
8
+ export interface PromptEnhancementConfig {
9
+ preventText?: boolean;
10
+ preventLabels?: boolean;
11
+ addQualityInstructions?: boolean;
12
+ addStyleInstructions?: boolean;
13
+ customPrefix?: string;
14
+ customSuffix?: string;
15
+ }
16
+ /**
17
+ * Enhance a prompt to minimize text rendering errors
18
+ *
19
+ * @param originalPrompt - The original prompt
20
+ * @param config - Enhancement configuration
21
+ * @returns Enhanced prompt
22
+ */
23
+ export declare function enhancePrompt(originalPrompt: string, config?: PromptEnhancementConfig): string;
24
+ /**
25
+ * Enhance prompt specifically for diagrams
26
+ */
27
+ export declare function enhanceForDiagram(prompt: string): string;
28
+ /**
29
+ * Enhance prompt specifically for illustrations
30
+ */
31
+ export declare function enhanceForIllustration(prompt: string): string;
32
+ /**
33
+ * Enhance prompt specifically for icons
34
+ */
35
+ export declare function enhanceForIcon(prompt: string): string;
36
+ /**
37
+ * Enhance prompt specifically for screenshots
38
+ */
39
+ export declare function enhanceForScreenshot(prompt: string): string;
40
+ /**
41
+ * Enhance prompt based on image type
42
+ */
43
+ export declare function enhanceByType(prompt: string, imageType: string): string;
44
+ /**
45
+ * Get default enhancement configuration
46
+ */
47
+ export declare function getDefaultEnhancementConfig(): Required<PromptEnhancementConfig>;
48
+ //# sourceMappingURL=prompt-enhancer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-enhancer.d.ts","sourceRoot":"","sources":["../../src/utils/prompt-enhancer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,WAAW,uBAAuB;IAEtC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAG/B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA8CD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,cAAc,EAAE,MAAM,EACtB,MAAM,GAAE,uBAA4B,GACnC,MAAM,CAqDR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQxD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ7D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQrD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ3D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,MAAM,CAoBR;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,QAAQ,CAAC,uBAAuB,CAAC,CAE/E"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Prompt Enhancer - Enhances prompts to minimize AI text rendering errors
3
+ * Adds specific instructions to reduce gibberish and improve quality
4
+ */
5
+ import { logger } from './logger.js';
6
+ /**
7
+ * Default enhancement configuration
8
+ */
9
+ const DEFAULT_CONFIG = {
10
+ preventText: true,
11
+ preventLabels: true,
12
+ addQualityInstructions: true,
13
+ addStyleInstructions: true,
14
+ customPrefix: '',
15
+ customSuffix: '',
16
+ };
17
+ /**
18
+ * Text prevention instructions (prevent AI from adding text)
19
+ */
20
+ const TEXT_PREVENTION_INSTRUCTIONS = [
21
+ 'no text or labels',
22
+ 'no watermarks',
23
+ 'no captions',
24
+ 'no written words',
25
+ 'clean visual only',
26
+ ];
27
+ /**
28
+ * Quality enhancement keywords
29
+ */
30
+ const QUALITY_KEYWORDS = [
31
+ 'professional',
32
+ 'high quality',
33
+ 'detailed',
34
+ 'crisp',
35
+ 'clear',
36
+ 'well-defined',
37
+ ];
38
+ /**
39
+ * Style consistency keywords
40
+ */
41
+ const STYLE_KEYWORDS = [
42
+ 'consistent style',
43
+ 'cohesive design',
44
+ 'unified aesthetic',
45
+ ];
46
+ /**
47
+ * Enhance a prompt to minimize text rendering errors
48
+ *
49
+ * @param originalPrompt - The original prompt
50
+ * @param config - Enhancement configuration
51
+ * @returns Enhanced prompt
52
+ */
53
+ export function enhancePrompt(originalPrompt, config = {}) {
54
+ // Merge with defaults
55
+ const fullConfig = {
56
+ ...DEFAULT_CONFIG,
57
+ ...config,
58
+ };
59
+ const parts = [];
60
+ // Add custom prefix
61
+ if (fullConfig.customPrefix) {
62
+ parts.push(fullConfig.customPrefix);
63
+ }
64
+ // Add original prompt
65
+ parts.push(originalPrompt);
66
+ const enhancements = [];
67
+ // Add quality instructions
68
+ if (fullConfig.addQualityInstructions) {
69
+ enhancements.push(...QUALITY_KEYWORDS);
70
+ }
71
+ // Add style instructions
72
+ if (fullConfig.addStyleInstructions) {
73
+ enhancements.push(...STYLE_KEYWORDS);
74
+ }
75
+ // Add text prevention
76
+ if (fullConfig.preventText || fullConfig.preventLabels) {
77
+ enhancements.push(...TEXT_PREVENTION_INSTRUCTIONS);
78
+ }
79
+ // Add custom suffix
80
+ if (fullConfig.customSuffix) {
81
+ enhancements.push(fullConfig.customSuffix);
82
+ }
83
+ // Combine enhancements
84
+ if (enhancements.length > 0) {
85
+ parts.push(enhancements.join(', '));
86
+ }
87
+ const enhancedPrompt = parts.join(', ');
88
+ logger.debug('Prompt enhanced', {
89
+ originalLength: originalPrompt.length,
90
+ enhancedLength: enhancedPrompt.length,
91
+ addedKeywords: enhancements.length,
92
+ });
93
+ return enhancedPrompt;
94
+ }
95
+ /**
96
+ * Enhance prompt specifically for diagrams
97
+ */
98
+ export function enhanceForDiagram(prompt) {
99
+ return enhancePrompt(prompt, {
100
+ preventText: true,
101
+ preventLabels: false, // Diagrams may need labels
102
+ addQualityInstructions: true,
103
+ addStyleInstructions: true,
104
+ customSuffix: 'technical diagram, clean lines, clear structure',
105
+ });
106
+ }
107
+ /**
108
+ * Enhance prompt specifically for illustrations
109
+ */
110
+ export function enhanceForIllustration(prompt) {
111
+ return enhancePrompt(prompt, {
112
+ preventText: true,
113
+ preventLabels: true,
114
+ addQualityInstructions: true,
115
+ addStyleInstructions: true,
116
+ customSuffix: 'artistic illustration, visual storytelling, no text overlay',
117
+ });
118
+ }
119
+ /**
120
+ * Enhance prompt specifically for icons
121
+ */
122
+ export function enhanceForIcon(prompt) {
123
+ return enhancePrompt(prompt, {
124
+ preventText: true,
125
+ preventLabels: true,
126
+ addQualityInstructions: true,
127
+ addStyleInstructions: true,
128
+ customSuffix: 'simple icon, minimalist design, scalable vector style',
129
+ });
130
+ }
131
+ /**
132
+ * Enhance prompt specifically for screenshots
133
+ */
134
+ export function enhanceForScreenshot(prompt) {
135
+ return enhancePrompt(prompt, {
136
+ preventText: false, // Screenshots may contain UI text
137
+ preventLabels: false,
138
+ addQualityInstructions: true,
139
+ addStyleInstructions: true,
140
+ customSuffix: 'realistic UI mockup, modern interface design',
141
+ });
142
+ }
143
+ /**
144
+ * Enhance prompt based on image type
145
+ */
146
+ export function enhanceByType(prompt, imageType) {
147
+ switch (imageType) {
148
+ case 'diagram':
149
+ case 'flowchart':
150
+ case 'architecture':
151
+ return enhanceForDiagram(prompt);
152
+ case 'illustration':
153
+ case 'hero':
154
+ return enhanceForIllustration(prompt);
155
+ case 'icon':
156
+ return enhanceForIcon(prompt);
157
+ case 'screenshot':
158
+ return enhanceForScreenshot(prompt);
159
+ default:
160
+ return enhancePrompt(prompt);
161
+ }
162
+ }
163
+ /**
164
+ * Get default enhancement configuration
165
+ */
166
+ export function getDefaultEnhancementConfig() {
167
+ return { ...DEFAULT_CONFIG };
168
+ }
169
+ //# sourceMappingURL=prompt-enhancer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-enhancer.js","sourceRoot":"","sources":["../../src/utils/prompt-enhancer.ts"],"names":[],"mappings":"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"}