@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 @@
|
|
|
1
|
+
{"version":3,"file":"image-metadata-manager.d.ts","sourceRoot":"","sources":["../../src/utils/image-metadata-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAyDrC,MAAM,OAAO,oBAAoB;IAC/B;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY,CACvB,WAAmB,EACnB,OAAe,EACf,QAAuB;QAEvB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,YAAY,CAAC,CAAC;QAEpE,MAAM,EAAE,CAAC,SAAS,CAChB,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EACjC,OAAO,CACR,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;YACnC,OAAO;YACP,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY,CACvB,WAAmB,EACnB,OAAe;QAEf,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,YAAY,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,cAAc,CACzB,WAAmB,EACnB,OAAe;QAEf,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,YAAY,CAAC,CAAC;YACpE,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,cAAc,CACzB,WAAmB,EACnB,OAAe,EACf,OAA+B;QAE/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG;YACd,GAAG,OAAO;YACV,GAAG,OAAO;SACX,CAAC;QAEF,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAEvD,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;YACrC,OAAO;YACP,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,aAAa,CACxB,WAAmB,EACnB,OAAe,EACf,cAAsB;QAEtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,MAAM,CAAC,CAAC;QAEzD,MAAM,MAAM,GAAG;YACb,sBAAsB;YACtB,aAAa,OAAO,EAAE;YACtB,YAAY,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;YACtC,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;YACnB,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;QAEnE,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;YACnC,OAAO;YACP,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,SAAS,CACpB,WAAmB,EACnB,OAAe,EACf,KAAwB,EACxB,OAAe,EACf,IAA0B;QAE1B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,MAAM,CAAC,CAAC;QAEzD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,OAAO,GAAG,IAAI,SAAS,KAAK,KAAK,KAAK,OAAO,EAAE,CAAC;QAEpD,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAClD,CAAC;QAED,OAAO,IAAI,IAAI,CAAC;QAEhB,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,CAClB,WAAmB,EACnB,OAAe;QAEf,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,MAAM,CAAC,CAAC;QACzD,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,sBAAsB,CACjC,WAAmB,EACnB,OAAe,EACf,IA0BC;QAED,qBAAqB;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAErE,uBAAuB;QACvB,MAAM,QAAQ,GAAkB;YAC9B,OAAO;YACP,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE;gBACV,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ;gBAClC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK;gBAC5B,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;gBAC5D,QAAQ;gBACR,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU;gBACtC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU;aACvC;YACD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;QAEF,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAExD,0CAA0C;QAC1C,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,EAAE,2BAA2B,CAAC,CAAC;QAC5E,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7F,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;QACvF,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,uBAAuB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,CAAC;QAClH,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;QACvE,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,0BAA0B,QAAQ,KAAK,CAAC,CAAC;QAC5F,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,OAAO,MAAM,CAAC,CAAC;QAClF,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE;YACnE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;YACjC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;YACnC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;YACnC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;SAC5B,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,wBAAwB,QAAQ,KAAK,CAAC,CAAC;QAE1F,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE;YAC/C,OAAO;YACP,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAClC,WAAmB,EACnB,OAAe,EACf,OAIC,EACD,WAAoB;QAEpB,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE;YAC9C,YAAY,EAAE;gBACZ,OAAO;gBACP,WAAW;aACZ;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,6BAA6B,EAAE;YAChF,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YAC7B,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAClC,WAAmB,EACnB,OAAe,EACf,OAAe,EACf,MAAc,EACd,eAAwB;QAExB,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE;YAC9C,YAAY,EAAE;gBACZ,OAAO;gBACP,MAAM;gBACN,eAAe;aAChB;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,wBAAwB,OAAO,EAAE,EAAE;YACpF,MAAM;YACN,eAAe;SAChB,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -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":"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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/utils/index.js
CHANGED
|
@@ -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
|
package/dist/utils/index.js.map
CHANGED
|
@@ -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"}
|