@michelabboud/visual-forge-mcp 0.6.0 → 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 +403 -2
- package/README.md +88 -5
- package/config/pricing.json +1 -1
- package/dist/parser/markdown-parser.d.ts +2 -0
- package/dist/parser/markdown-parser.d.ts.map +1 -1
- package/dist/parser/markdown-parser.js +23 -10
- package/dist/parser/markdown-parser.js.map +1 -1
- package/dist/placeholders/placeholder-manager.d.ts +8 -0
- package/dist/placeholders/placeholder-manager.d.ts.map +1 -1
- package/dist/placeholders/placeholder-manager.js +71 -18
- package/dist/placeholders/placeholder-manager.js.map +1 -1
- package/dist/providers/base-provider.d.ts +13 -0
- package/dist/providers/base-provider.d.ts.map +1 -1
- package/dist/providers/base-provider.js +263 -17
- package/dist/providers/base-provider.js.map +1 -1
- package/dist/providers/gemini/gemini-provider.d.ts.map +1 -1
- package/dist/providers/gemini/gemini-provider.js +3 -7
- package/dist/providers/gemini/gemini-provider.js.map +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +5 -1
- package/dist/providers/index.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 +85 -0
- package/dist/utils/filename-sanitizer.d.ts.map +1 -0
- package/dist/utils/filename-sanitizer.js +156 -0
- package/dist/utils/filename-sanitizer.js.map +1 -0
- 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 +5 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +5 -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/pricing-checker.d.ts.map +1 -1
- package/dist/utils/pricing-checker.js +3 -5
- package/dist/utils/pricing-checker.js.map +1 -1
- 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/docs/guides/provider-setup.md +543 -0
- package/package.json +2 -2
- package/scripts/README.md +460 -0
|
@@ -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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricing-checker.d.ts","sourceRoot":"","sources":["../../src/utils/pricing-checker.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"pricing-checker.d.ts","sourceRoot":"","sources":["../../src/utils/pricing-checker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,cAAc,EAAE,GAAG,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAA8B;IAE5C;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;IACH,aAAa,IAAI,IAAI;IAWrB;;OAEG;IACH,qBAAqB,IAAI;QACvB,UAAU,EAAE,OAAO,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B;IA8BD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IA+BnC;;OAEG;IACH,iBAAiB,IAAI;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QACxE,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB;CAqCF;AAGD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
|
|
@@ -3,12 +3,10 @@
|
|
|
3
3
|
* Monitors pricing configuration freshness and reminds users to update
|
|
4
4
|
*/
|
|
5
5
|
import { readFileSync, writeFileSync } from 'fs';
|
|
6
|
-
import { join
|
|
7
|
-
import { fileURLToPath } from 'url';
|
|
6
|
+
import { join } from 'path';
|
|
8
7
|
import { logger } from './logger.js';
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
const PRICING_FILE = join(__dirname, '../../config/pricing.json');
|
|
8
|
+
// Use relative path from project root (works in both test and production)
|
|
9
|
+
const PRICING_FILE = join(process.cwd(), 'config/pricing.json');
|
|
12
10
|
const CHECK_INTERVAL_HOURS = 24;
|
|
13
11
|
export class PricingChecker {
|
|
14
12
|
config = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricing-checker.js","sourceRoot":"","sources":["../../src/utils/pricing-checker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"pricing-checker.js","sourceRoot":"","sources":["../../src/utils/pricing-checker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,0EAA0E;AAC1E,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,qBAAqB,CAAC,CAAC;AAChE,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAWhC,MAAM,OAAO,cAAc;IACjB,MAAM,GAAyB,IAAI,CAAC;IAE5C;;OAEG;IACK,WAAW;QACjB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/E,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,MAAqB;QACvC,IAAI,CAAC;YACH,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa;QACX,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAClC,MAAM,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC9C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9E,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED;;OAEG;IACH,qBAAqB;QAOnB,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACtD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAEvF,MAAM,gBAAgB,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACpF,MAAM,eAAe,GAAG,WAAW;gBACjC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC;gBAC5D,CAAC,CAAC,QAAQ,CAAC;YAEb,MAAM,UAAU,GAAG,eAAe,IAAI,oBAAoB,CAAC;YAE3D,OAAO;gBACL,UAAU;gBACV,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE;gBACvC,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE;gBACtC,eAAe,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS;gBACtE,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;aAC/C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5E,OAAO;gBACL,UAAU,EAAE,KAAK;gBACjB,WAAW,EAAE,SAAS;aACvB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE5C,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW;gBACvC,CAAC,CAAC,gBAAgB,MAAM,CAAC,eAAe,YAAY;gBACpD,CAAC,CAAC,eAAe,CAAC;YAEpB,MAAM,CAAC,IAAI,CAAC,iDAAiD,EAAE;gBAC7D,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,OAAO;gBAC1C,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,eAAe,EAAE,MAAM,CAAC,eAAe;gBACvC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;aAC1C,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC,8DAA8D,EAAE;gBAC1E,OAAO,EAAE,yBAAyB,cAAc,iIAAiI;gBACjL,IAAI,EAAE,wFAAwF;aAC/F,CAAC,CAAC;YAEH,yDAAyD;YACzD,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE;gBACjD,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,GAAG,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC,QAAQ;aACzF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB;QAQf,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACnC,CAAC;QAED,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,YAAY,GAAG,QAAQ,CAAC;QAC5B,IAAI,QAAQ,GAA6D,IAAI,CAAC;QAE9E,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,EAAE;YACxE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAgB,EAAE,EAAE;gBAClE,WAAW,EAAE,CAAC;gBACd,IAAI,KAAK,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;oBAC7B,YAAY,EAAE,CAAC;gBACjB,CAAC;gBACD,IAAI,KAAK,CAAC,YAAY,GAAG,YAAY,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;oBAChE,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;oBAClC,QAAQ,GAAG;wBACT,QAAQ,EAAE,WAAW;wBACrB,KAAK,EAAE,QAAQ;wBACf,IAAI,EAAE,KAAK,CAAC,YAAY;qBACzB,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM;YACzD,WAAW;YACX,YAAY;YACZ,aAAa,EAAE,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;SACrC,CAAC;IACJ,CAAC;CACF;AAED,qBAAqB;AACrB,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC"}
|
|
@@ -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"}
|