@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.
Files changed (68) hide show
  1. package/CHANGELOG.md +403 -2
  2. package/README.md +88 -5
  3. package/config/pricing.json +1 -1
  4. package/dist/parser/markdown-parser.d.ts +2 -0
  5. package/dist/parser/markdown-parser.d.ts.map +1 -1
  6. package/dist/parser/markdown-parser.js +23 -10
  7. package/dist/parser/markdown-parser.js.map +1 -1
  8. package/dist/placeholders/placeholder-manager.d.ts +8 -0
  9. package/dist/placeholders/placeholder-manager.d.ts.map +1 -1
  10. package/dist/placeholders/placeholder-manager.js +71 -18
  11. package/dist/placeholders/placeholder-manager.js.map +1 -1
  12. package/dist/providers/base-provider.d.ts +13 -0
  13. package/dist/providers/base-provider.d.ts.map +1 -1
  14. package/dist/providers/base-provider.js +263 -17
  15. package/dist/providers/base-provider.js.map +1 -1
  16. package/dist/providers/gemini/gemini-provider.d.ts.map +1 -1
  17. package/dist/providers/gemini/gemini-provider.js +3 -7
  18. package/dist/providers/gemini/gemini-provider.js.map +1 -1
  19. package/dist/providers/index.d.ts.map +1 -1
  20. package/dist/providers/index.js +5 -1
  21. package/dist/providers/index.js.map +1 -1
  22. package/dist/server/mcp-server.d.ts.map +1 -1
  23. package/dist/server/mcp-server.js +4 -1
  24. package/dist/server/mcp-server.js.map +1 -1
  25. package/dist/utils/filename-sanitizer.d.ts +85 -0
  26. package/dist/utils/filename-sanitizer.d.ts.map +1 -0
  27. package/dist/utils/filename-sanitizer.js +156 -0
  28. package/dist/utils/filename-sanitizer.js.map +1 -0
  29. package/dist/utils/image-metadata-manager.d.ts +151 -0
  30. package/dist/utils/image-metadata-manager.d.ts.map +1 -0
  31. package/dist/utils/image-metadata-manager.js +172 -0
  32. package/dist/utils/image-metadata-manager.js.map +1 -0
  33. package/dist/utils/index-manager.d.ts +38 -0
  34. package/dist/utils/index-manager.d.ts.map +1 -0
  35. package/dist/utils/index-manager.js +110 -0
  36. package/dist/utils/index-manager.js.map +1 -0
  37. package/dist/utils/index.d.ts +5 -0
  38. package/dist/utils/index.d.ts.map +1 -1
  39. package/dist/utils/index.js +5 -0
  40. package/dist/utils/index.js.map +1 -1
  41. package/dist/utils/multi-format-optimizer.d.ts +96 -0
  42. package/dist/utils/multi-format-optimizer.d.ts.map +1 -0
  43. package/dist/utils/multi-format-optimizer.js +423 -0
  44. package/dist/utils/multi-format-optimizer.js.map +1 -0
  45. package/dist/utils/pricing-checker.d.ts.map +1 -1
  46. package/dist/utils/pricing-checker.js +3 -5
  47. package/dist/utils/pricing-checker.js.map +1 -1
  48. package/dist/utils/prompt-enhancer.d.ts +48 -0
  49. package/dist/utils/prompt-enhancer.d.ts.map +1 -0
  50. package/dist/utils/prompt-enhancer.js +169 -0
  51. package/dist/utils/prompt-enhancer.js.map +1 -0
  52. package/dist/utils/quality-validator.d.ts +61 -0
  53. package/dist/utils/quality-validator.d.ts.map +1 -0
  54. package/dist/utils/quality-validator.js +386 -0
  55. package/dist/utils/quality-validator.js.map +1 -0
  56. package/dist/utils/source-metadata.d.ts +56 -0
  57. package/dist/utils/source-metadata.d.ts.map +1 -0
  58. package/dist/utils/source-metadata.js +122 -0
  59. package/dist/utils/source-metadata.js.map +1 -0
  60. package/dist/workflow/workflow-orchestrator.d.ts.map +1 -1
  61. package/dist/workflow/workflow-orchestrator.js +23 -0
  62. package/dist/workflow/workflow-orchestrator.js.map +1 -1
  63. package/dist/workflow/workflow-tools.d.ts.map +1 -1
  64. package/dist/workflow/workflow-tools.js +18 -0
  65. package/dist/workflow/workflow-tools.js.map +1 -1
  66. package/docs/guides/provider-setup.md +543 -0
  67. package/package.json +2 -2
  68. package/scripts/README.md +460 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-metadata-manager.d.ts","sourceRoot":"","sources":["../../src/utils/image-metadata-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,UAAU,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAClC,CAAC;IACF,OAAO,EAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,OAAO,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,IAAI,EAAE;QACJ,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,YAAY,CAAC,EAAE;QACb,OAAO,EAAE;YACP,IAAI,CAAC,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC;YACtC,GAAG,CAAC,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC;YACrC,GAAG,CAAC,EAAE;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC;SACtC,CAAC;QACF,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,YAAY,CAAC,EAAE;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC5B;AAED,qBAAa,oBAAoB;IAC/B;;;OAGG;WACU,YAAY,CACvB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,IAAI,CAAC;IAehB;;OAEG;WACU,YAAY,CACvB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC;IAMzB;;OAEG;WACU,cAAc,CACzB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;IAUnB;;OAEG;WACU,cAAc,CACzB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC;IAgBhB;;;OAGG;WACU,aAAa,CACxB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC;IAoBhB;;OAEG;WACU,SAAS,CACpB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,EACxB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACzB,OAAO,CAAC,IAAI,CAAC;IAehB;;OAEG;WACU,OAAO,CAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC;IAKlB;;OAEG;WACU,sBAAsB,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;QACJ,MAAM,EAAE;YACN,QAAQ,EAAE,MAAM,CAAC;YACjB,aAAa,CAAC,EAAE,MAAM,CAAC;YACvB,UAAU,EAAE,MAAM,CAAC;SACpB,CAAC;QACF,UAAU,EAAE;YACV,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;YACd,SAAS,EAAE,MAAM,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC;YAChB,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;SAClC,CAAC;QACF,OAAO,EAAE;YACP,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,UAAU,EAAE,MAAM,CAAC;YACnB,QAAQ,EAAE,MAAM,CAAC;YACjB,MAAM,EAAE,OAAO,CAAC;YAChB,KAAK,CAAC,EAAE,MAAM,CAAC;SAChB,CAAC;QACF,IAAI,EAAE;YACJ,SAAS,EAAE,MAAM,CAAC;YAClB,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,GACA,OAAO,CAAC,IAAI,CAAC;IA4ChB;;OAEG;WACU,uBAAuB,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QACP,IAAI,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QACtC,GAAG,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QACrC,GAAG,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;KACtC,EACD,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,IAAI,CAAC;IAchB;;OAEG;WACU,uBAAuB,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC;CAcjB"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Image Metadata Manager
3
+ * Manages per-image metadata files (prompts, logs, quality metrics)
4
+ * Stored in original/ folder alongside each generated image
5
+ */
6
+ import * as fs from 'fs/promises';
7
+ import * as path from 'path';
8
+ import { logger } from './logger.js';
9
+ export class ImageMetadataManager {
10
+ /**
11
+ * Save metadata JSON file for an image
12
+ * Saved as: original/img-01.meta.json
13
+ */
14
+ static async saveMetadata(originalDir, imageId, metadata) {
15
+ const metadataPath = path.join(originalDir, `${imageId}.meta.json`);
16
+ await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2), 'utf-8');
17
+ logger.debug('Saved image metadata', {
18
+ imageId,
19
+ metadataPath,
20
+ });
21
+ }
22
+ /**
23
+ * Read metadata for an image
24
+ */
25
+ static async readMetadata(originalDir, imageId) {
26
+ const metadataPath = path.join(originalDir, `${imageId}.meta.json`);
27
+ const data = await fs.readFile(metadataPath, 'utf-8');
28
+ return JSON.parse(data);
29
+ }
30
+ /**
31
+ * Check if metadata exists for an image
32
+ */
33
+ static async metadataExists(originalDir, imageId) {
34
+ try {
35
+ const metadataPath = path.join(originalDir, `${imageId}.meta.json`);
36
+ await fs.access(metadataPath);
37
+ return true;
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ }
43
+ /**
44
+ * Update existing metadata (partial update)
45
+ */
46
+ static async updateMetadata(originalDir, imageId, updates) {
47
+ const current = await this.readMetadata(originalDir, imageId);
48
+ const updated = {
49
+ ...current,
50
+ ...updates,
51
+ };
52
+ await this.saveMetadata(originalDir, imageId, updated);
53
+ logger.debug('Updated image metadata', {
54
+ imageId,
55
+ updatedFields: Object.keys(updates),
56
+ });
57
+ }
58
+ /**
59
+ * Initialize log file for an image
60
+ * Creates: original/img-01.log
61
+ */
62
+ static async initializeLog(originalDir, imageId, initialMessage) {
63
+ const logPath = path.join(originalDir, `${imageId}.log`);
64
+ const header = [
65
+ `Image Generation Log`,
66
+ `Image ID: ${imageId}`,
67
+ `Started: ${new Date().toISOString()}`,
68
+ `${'='.repeat(60)}`,
69
+ '',
70
+ ].join('\n');
71
+ await fs.writeFile(logPath, header, 'utf-8');
72
+ await this.appendLog(originalDir, imageId, 'INFO', initialMessage);
73
+ logger.debug('Initialized log file', {
74
+ imageId,
75
+ logPath,
76
+ });
77
+ }
78
+ /**
79
+ * Append entry to log file
80
+ */
81
+ static async appendLog(originalDir, imageId, level, message, data) {
82
+ const logPath = path.join(originalDir, `${imageId}.log`);
83
+ const timestamp = new Date().toISOString();
84
+ let logLine = `[${timestamp}] ${level}: ${message}`;
85
+ if (data) {
86
+ logLine += `\n${JSON.stringify(data, null, 2)}`;
87
+ }
88
+ logLine += '\n';
89
+ await fs.appendFile(logPath, logLine, 'utf-8');
90
+ }
91
+ /**
92
+ * Read full log file
93
+ */
94
+ static async readLog(originalDir, imageId) {
95
+ const logPath = path.join(originalDir, `${imageId}.log`);
96
+ return await fs.readFile(logPath, 'utf-8');
97
+ }
98
+ /**
99
+ * Create complete metadata and log for a newly generated image
100
+ */
101
+ static async createCompleteMetadata(originalDir, imageId, data) {
102
+ // Calculate duration
103
+ const duration = data.generation.endTime - data.generation.startTime;
104
+ // Create metadata JSON
105
+ const metadata = {
106
+ imageId,
107
+ prompt: data.prompt,
108
+ generation: {
109
+ provider: data.generation.provider,
110
+ model: data.generation.model,
111
+ timestamp: new Date(data.generation.startTime).toISOString(),
112
+ duration,
113
+ apiVersion: data.generation.apiVersion,
114
+ parameters: data.generation.parameters,
115
+ },
116
+ quality: data.quality,
117
+ cost: data.cost,
118
+ };
119
+ await this.saveMetadata(originalDir, imageId, metadata);
120
+ // Create log file with generation details
121
+ await this.initializeLog(originalDir, imageId, 'Starting image generation');
122
+ await this.appendLog(originalDir, imageId, 'DEBUG', `Provider: ${data.generation.provider}`);
123
+ await this.appendLog(originalDir, imageId, 'DEBUG', `Model: ${data.generation.model}`);
124
+ await this.appendLog(originalDir, imageId, 'DEBUG', `Full prompt length: ${data.prompt.fullPrompt.length} chars`);
125
+ await this.appendLog(originalDir, imageId, 'INFO', 'API request sent');
126
+ await this.appendLog(originalDir, imageId, 'INFO', `API response received (${duration}ms)`);
127
+ await this.appendLog(originalDir, imageId, 'INFO', `Image saved: ${imageId}.png`);
128
+ await this.appendLog(originalDir, imageId, 'DEBUG', 'Quality check', {
129
+ sharpness: data.quality.sharpness,
130
+ brightness: data.quality.brightness,
131
+ dimensions: data.quality.dimensions,
132
+ passed: data.quality.passed,
133
+ });
134
+ await this.appendLog(originalDir, imageId, 'INFO', `Generation complete (${duration}ms)`);
135
+ logger.info('Created complete metadata and log', {
136
+ imageId,
137
+ originalDir,
138
+ });
139
+ }
140
+ /**
141
+ * Update metadata with optimization results
142
+ */
143
+ static async addOptimizationMetadata(originalDir, imageId, formats, watermarked) {
144
+ await this.updateMetadata(originalDir, imageId, {
145
+ optimization: {
146
+ formats,
147
+ watermarked,
148
+ },
149
+ });
150
+ await this.appendLog(originalDir, imageId, 'INFO', 'Image optimization complete', {
151
+ formats: Object.keys(formats),
152
+ watermarked,
153
+ });
154
+ }
155
+ /**
156
+ * Update metadata with regeneration info
157
+ */
158
+ static async addRegenerationMetadata(originalDir, imageId, attempt, reason, previousQuality) {
159
+ await this.updateMetadata(originalDir, imageId, {
160
+ regeneration: {
161
+ attempt,
162
+ reason,
163
+ previousQuality,
164
+ },
165
+ });
166
+ await this.appendLog(originalDir, imageId, 'WARN', `Regeneration attempt ${attempt}`, {
167
+ reason,
168
+ previousQuality,
169
+ });
170
+ }
171
+ }
172
+ //# sourceMappingURL=image-metadata-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-metadata-manager.js","sourceRoot":"","sources":["../../src/utils/image-metadata-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Index Manager - Manages sequential indices for source files
3
+ * Prevents directory name collisions by assigning unique indices
4
+ */
5
+ export declare class IndexManager {
6
+ private indexFilePath;
7
+ private currentIndex;
8
+ private indexMap;
9
+ constructor(baseDir: string);
10
+ /**
11
+ * Initialize by reading existing index file
12
+ */
13
+ initialize(): Promise<void>;
14
+ /**
15
+ * Get index for a source file (create if doesn't exist)
16
+ */
17
+ getIndexForFile(sourceFile: string): Promise<number>;
18
+ /**
19
+ * Get source file for an index
20
+ */
21
+ getFileForIndex(index: number): string | undefined;
22
+ /**
23
+ * List all indexed files
24
+ */
25
+ listAll(): Array<{
26
+ index: number;
27
+ sourceFile: string;
28
+ }>;
29
+ /**
30
+ * Remove index (when cleaning up)
31
+ */
32
+ removeIndex(sourceFile: string): Promise<void>;
33
+ /**
34
+ * Save index to disk (atomic write)
35
+ */
36
+ private save;
37
+ }
38
+ //# sourceMappingURL=index-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-manager.d.ts","sourceRoot":"","sources":["../../src/utils/index-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,qBAAa,YAAY;IACvB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAkC;gBAEtC,OAAO,EAAE,MAAM;IAI3B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBjC;;OAEG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0B1D;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IASlD;;OAEG;IACH,OAAO,IAAI,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IASvD;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpD;;OAEG;YACW,IAAI;CAkBnB"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Index Manager - Manages sequential indices for source files
3
+ * Prevents directory name collisions by assigning unique indices
4
+ */
5
+ import * as fs from 'fs/promises';
6
+ import * as path from 'path';
7
+ import { logger } from './logger.js';
8
+ export class IndexManager {
9
+ indexFilePath;
10
+ currentIndex = 0;
11
+ indexMap = new Map();
12
+ constructor(baseDir) {
13
+ this.indexFilePath = path.join(baseDir, '.index');
14
+ }
15
+ /**
16
+ * Initialize by reading existing index file
17
+ */
18
+ async initialize() {
19
+ try {
20
+ const data = await fs.readFile(this.indexFilePath, 'utf-8');
21
+ const saved = JSON.parse(data);
22
+ this.currentIndex = saved.currentIndex || 0;
23
+ this.indexMap = new Map(Object.entries(saved.indexMap || {}));
24
+ logger.info('Index manager initialized', {
25
+ currentIndex: this.currentIndex,
26
+ files: this.indexMap.size,
27
+ });
28
+ }
29
+ catch (error) {
30
+ // File doesn't exist - start fresh
31
+ this.currentIndex = 0;
32
+ this.indexMap = new Map();
33
+ logger.info('Index manager initialized (new)', {
34
+ indexFile: this.indexFilePath,
35
+ });
36
+ }
37
+ }
38
+ /**
39
+ * Get index for a source file (create if doesn't exist)
40
+ */
41
+ async getIndexForFile(sourceFile) {
42
+ // Normalize path to absolute
43
+ const absolutePath = path.resolve(sourceFile);
44
+ // Check if we already have an index for this file
45
+ if (this.indexMap.has(absolutePath)) {
46
+ return this.indexMap.get(absolutePath);
47
+ }
48
+ // Assign new index
49
+ this.currentIndex++;
50
+ const newIndex = this.currentIndex;
51
+ this.indexMap.set(absolutePath, newIndex);
52
+ // Save to disk
53
+ await this.save();
54
+ logger.info('Assigned new index', {
55
+ sourceFile: absolutePath,
56
+ index: newIndex,
57
+ });
58
+ return newIndex;
59
+ }
60
+ /**
61
+ * Get source file for an index
62
+ */
63
+ getFileForIndex(index) {
64
+ for (const [file, idx] of this.indexMap.entries()) {
65
+ if (idx === index) {
66
+ return file;
67
+ }
68
+ }
69
+ return undefined;
70
+ }
71
+ /**
72
+ * List all indexed files
73
+ */
74
+ listAll() {
75
+ return Array.from(this.indexMap.entries())
76
+ .map(([file, index]) => ({
77
+ index,
78
+ sourceFile: file,
79
+ }))
80
+ .sort((a, b) => a.index - b.index);
81
+ }
82
+ /**
83
+ * Remove index (when cleaning up)
84
+ */
85
+ async removeIndex(sourceFile) {
86
+ const absolutePath = path.resolve(sourceFile);
87
+ this.indexMap.delete(absolutePath);
88
+ await this.save();
89
+ logger.info('Removed index', { sourceFile: absolutePath });
90
+ }
91
+ /**
92
+ * Save index to disk (atomic write)
93
+ */
94
+ async save() {
95
+ const data = {
96
+ currentIndex: this.currentIndex,
97
+ indexMap: Object.fromEntries(this.indexMap),
98
+ lastUpdated: new Date().toISOString(),
99
+ };
100
+ // Atomic write: write to temp file, then rename
101
+ const tempPath = `${this.indexFilePath}.tmp`;
102
+ await fs.writeFile(tempPath, JSON.stringify(data, null, 2), 'utf-8');
103
+ await fs.rename(tempPath, this.indexFilePath);
104
+ logger.debug('Index saved', {
105
+ currentIndex: this.currentIndex,
106
+ files: this.indexMap.size,
107
+ });
108
+ }
109
+ }
110
+ //# sourceMappingURL=index-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-manager.js","sourceRoot":"","sources":["../../src/utils/index-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAQrC,MAAM,OAAO,YAAY;IACf,aAAa,CAAS;IACtB,YAAY,GAAW,CAAC,CAAC;IACzB,QAAQ,GAAwB,IAAI,GAAG,EAAE,CAAC;IAElD,YAAY,OAAe;QACzB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAc,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAE1C,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;YAE9D,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;gBACvC,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;aAC1B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,mCAAmC;YACnC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;YAE1B,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE;gBAC7C,SAAS,EAAE,IAAI,CAAC,aAAa;aAC9B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,UAAkB;QACtC,6BAA6B;QAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAE9C,kDAAkD;QAClD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC;QAC1C,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC;QAEnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAE1C,eAAe;QACf,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAChC,UAAU,EAAE,YAAY;YACxB,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,KAAa;QAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAClD,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;aACvC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACvB,KAAK;YACL,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,UAAkB;QAClC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACnC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,IAAI;QAChB,MAAM,IAAI,GAAc;YACtB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC3C,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC;QAEF,gDAAgD;QAChD,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,aAAa,MAAM,CAAC;QAE7C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACrE,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAE9C,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE;YAC1B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;SAC1B,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -9,4 +9,9 @@ export * from './config-manager.js';
9
9
  export * from './validation.js';
10
10
  export * from './pricing-checker.js';
11
11
  export * from './image-optimizer.js';
12
+ export * from './filename-sanitizer.js';
13
+ export * from './image-metadata-manager.js';
14
+ export * from './multi-format-optimizer.js';
15
+ export * from './quality-validator.js';
16
+ export * from './prompt-enhancer.js';
12
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
@@ -9,4 +9,9 @@ export * from './config-manager.js';
9
9
  export * from './validation.js';
10
10
  export * from './pricing-checker.js';
11
11
  export * from './image-optimizer.js';
12
+ export * from './filename-sanitizer.js';
13
+ export * from './image-metadata-manager.js';
14
+ export * from './multi-format-optimizer.js';
15
+ export * from './quality-validator.js';
16
+ export * from './prompt-enhancer.js';
12
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,96 @@
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
+ /**
25
+ * Watermark configuration
26
+ */
27
+ export interface WatermarkConfig {
28
+ text: string;
29
+ position: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left' | 'center';
30
+ opacity: number;
31
+ fontSize: number;
32
+ color: string;
33
+ fontFamily?: string;
34
+ }
35
+ /**
36
+ * Multi-format optimization options
37
+ */
38
+ export interface MultiFormatOptions {
39
+ generateWebP?: boolean;
40
+ generateJPEG?: boolean;
41
+ generatePNG?: boolean;
42
+ webpQuality?: number;
43
+ jpegQuality?: number;
44
+ pngQuality?: number;
45
+ pngCompressionLevel?: number;
46
+ pngUsePalette?: boolean;
47
+ pngColors?: number;
48
+ pngDither?: number;
49
+ maxWidth?: number;
50
+ maxHeight?: number;
51
+ watermark?: WatermarkConfig;
52
+ skipWatermark?: boolean;
53
+ }
54
+ /**
55
+ * Result for a single format
56
+ */
57
+ export interface FormatResult {
58
+ format: 'webp' | 'jpg' | 'png' | 'original';
59
+ path: string;
60
+ size: number;
61
+ watermarked: boolean;
62
+ }
63
+ /**
64
+ * Multi-format optimization result
65
+ */
66
+ export interface MultiFormatResult {
67
+ sourceFile: string;
68
+ imageId: string;
69
+ provider: string;
70
+ originalPath: string;
71
+ originalSize: number;
72
+ formats: FormatResult[];
73
+ totalOptimizedSize: number;
74
+ watermarkApplied: boolean;
75
+ sharpAvailable: boolean;
76
+ }
77
+ /**
78
+ * Optimize image to multiple formats with optional watermarking
79
+ *
80
+ * @param originalImagePath - Path to the original generated image (in provider root)
81
+ * @param sourceFile - Original source markdown file path
82
+ * @param imageId - Image identifier
83
+ * @param provider - Provider name
84
+ * @param options - Multi-format optimization options
85
+ * @returns Multi-format optimization result
86
+ */
87
+ export declare function optimizeToMultipleFormats(originalImagePath: string, sourceFile: string, imageId: string, provider: string, options?: MultiFormatOptions): Promise<MultiFormatResult>;
88
+ /**
89
+ * Check if multi-format optimization is available
90
+ */
91
+ export declare function isMultiFormatOptimizationAvailable(): Promise<boolean>;
92
+ /**
93
+ * Get default watermark configuration
94
+ */
95
+ export declare function getDefaultWatermark(): WatermarkConfig;
96
+ //# sourceMappingURL=multi-format-optimizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-format-optimizer.d.ts","sourceRoot":"","sources":["../../src/utils/multi-format-optimizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAiCH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,cAAc,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC/E,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAEjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IAGtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;CACzB;AAuED;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAC7C,iBAAiB,EAAE,MAAM,EACzB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CA0V5B;AAED;;GAEG;AACH,wBAAsB,kCAAkC,IAAI,OAAO,CAAC,OAAO,CAAC,CAE3E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,eAAe,CAErD"}