@houtini/gemini-mcp 2.2.4 → 2.3.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/README.md +104 -69
- package/dist/image-viewer/src/ui/image-viewer.html +18 -18
- package/dist/services/media-server.d.ts.map +1 -1
- package/dist/services/media-server.js +3 -2
- package/dist/services/media-server.js.map +1 -1
- package/dist/tools/register-image-gen.d.ts.map +1 -1
- package/dist/tools/register-image-gen.js +77 -66
- package/dist/tools/register-image-gen.js.map +1 -1
- package/dist/tools/register-viewers.d.ts.map +1 -1
- package/dist/tools/register-viewers.js +1 -0
- package/dist/tools/register-viewers.js.map +1 -1
- package/dist/utils/image-compress.d.ts +16 -3
- package/dist/utils/image-compress.d.ts.map +1 -1
- package/dist/utils/image-compress.js +49 -32
- package/dist/utils/image-compress.js.map +1 -1
- package/dist/utils/image-utils.d.ts +6 -1
- package/dist/utils/image-utils.d.ts.map +1 -1
- package/dist/utils/image-utils.js +19 -8
- package/dist/utils/image-utils.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +3 -2
- package/dist/utils/logger.js.map +1 -1
- package/package.json +2 -2
- package/server.json +2 -2
- package/houtini-logo.jpg +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-server.d.ts","sourceRoot":"","sources":["../../src/services/media-server.ts"],"names":[],"mappings":"AAqBA;;;;;;;;;GASG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,EAAE,MAAM;IAKxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB5B,OAAO,IAAI,MAAM;IAIjB,UAAU,IAAI,MAAM;IAIpB;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"media-server.d.ts","sourceRoot":"","sources":["../../src/services/media-server.ts"],"names":[],"mappings":"AAqBA;;;;;;;;;GASG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,EAAE,MAAM;IAKxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB5B,OAAO,IAAI,MAAM;IAIjB,UAAU,IAAI,MAAM;IAIpB;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAuB1C,IAAI,IAAI,IAAI;IAQZ,OAAO,CAAC,aAAa;CAoHtB"}
|
|
@@ -72,7 +72,8 @@ export class MediaServer {
|
|
|
72
72
|
const normalAllowed = normalize(this.allowedDir);
|
|
73
73
|
const normalResolved = normalize(resolved);
|
|
74
74
|
// Ensure the file is within the allowed directory
|
|
75
|
-
|
|
75
|
+
// Use toLowerCase() to handle Windows drive letter casing (D:\ vs d:\)
|
|
76
|
+
if (!normalResolved.toLowerCase().startsWith(normalAllowed.toLowerCase())) {
|
|
76
77
|
logger.warn('Media server: path outside allowed directory', {
|
|
77
78
|
path: absPath,
|
|
78
79
|
allowedDir: this.allowedDir,
|
|
@@ -129,7 +130,7 @@ export class MediaServer {
|
|
|
129
130
|
const normalAllowed = normalize(this.allowedDir);
|
|
130
131
|
const normalFile = normalize(filePath);
|
|
131
132
|
// Path traversal protection
|
|
132
|
-
if (!normalFile.startsWith(normalAllowed)) {
|
|
133
|
+
if (!normalFile.toLowerCase().startsWith(normalAllowed.toLowerCase())) {
|
|
133
134
|
res.writeHead(403, { 'Content-Type': 'text/plain' });
|
|
134
135
|
res.end('Forbidden');
|
|
135
136
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-server.js","sourceRoot":"","sources":["../../src/services/media-server.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"media-server.js","sourceRoot":"","sources":["../../src/services/media-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-image-gen.d.ts","sourceRoot":"","sources":["../../src/tools/register-image-gen.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"register-image-gen.d.ts","sourceRoot":"","sources":["../../src/tools/register-image-gen.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA+F9C,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CA+M/C"}
|
|
@@ -7,12 +7,36 @@ import { processGeneratedImage } from '../utils/image-utils.js';
|
|
|
7
7
|
import { resolveImageInputs } from '../utils/resolve-images.js';
|
|
8
8
|
import { savedFileMessage } from '../utils/tool-wrapper.js';
|
|
9
9
|
import { imageInputSchema } from './schemas.js';
|
|
10
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Build the MCP content array for an image tool result.
|
|
12
|
+
*
|
|
13
|
+
* Pattern: resize-for-transport
|
|
14
|
+
* - Full-res original is saved to disk (and served via media server for the viewer).
|
|
15
|
+
* - A resized JPEG preview (≤800px) is returned as an inline `image` content block
|
|
16
|
+
* so the model can "see" the image and the client can display it.
|
|
17
|
+
* - The text block contains the file path + metadata so the user can find the original.
|
|
18
|
+
*
|
|
19
|
+
* This keeps the total tool result well under the 1MB MCP transport cap.
|
|
20
|
+
*/
|
|
21
|
+
function buildContent(processed, description, prompt, groundingSources, thoughtSignature) {
|
|
22
|
+
const content = [];
|
|
23
|
+
// 1. Inline resized preview — lets the model and client see the image
|
|
24
|
+
if (processed) {
|
|
25
|
+
content.push({
|
|
26
|
+
type: 'image',
|
|
27
|
+
data: processed.previewBase64,
|
|
28
|
+
mimeType: processed.previewMimeType,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
// 2. Text metadata
|
|
11
32
|
const lines = [];
|
|
12
|
-
if (savedPath)
|
|
13
|
-
lines.push(savedFileMessage('Image saved', savedPath));
|
|
14
|
-
if (previewPath)
|
|
15
|
-
lines.push(savedFileMessage('HTML preview', previewPath));
|
|
33
|
+
if (processed?.savedPath)
|
|
34
|
+
lines.push(savedFileMessage('Image saved (full-res)', processed.savedPath));
|
|
35
|
+
if (processed?.previewPath)
|
|
36
|
+
lines.push(savedFileMessage('HTML preview', processed.previewPath));
|
|
37
|
+
if (processed) {
|
|
38
|
+
lines.push(`Preview: ${processed.previewWidth}x${processed.previewHeight}px JPEG (${Math.round(processed.previewBase64.length * 0.75 / 1024)}KB)`);
|
|
39
|
+
}
|
|
16
40
|
if (description)
|
|
17
41
|
lines.push(`\n${description}`);
|
|
18
42
|
if (groundingSources && groundingSources.length > 0) {
|
|
@@ -21,12 +45,38 @@ function buildTextLines(savedPath, previewPath, description, groundingSources, t
|
|
|
21
45
|
lines.push(`${idx + 1}. [${source.title}](${source.url})`);
|
|
22
46
|
});
|
|
23
47
|
}
|
|
24
|
-
// Surface thoughtSignature so Claude can pass it to subsequent edit_image calls
|
|
25
|
-
// for conversational editing with Gemini 3 Pro Image
|
|
26
48
|
if (thoughtSignature) {
|
|
27
49
|
lines.push(`\n**thoughtSignature** (for conversational editing — pass to edit_image): \`${thoughtSignature}\``);
|
|
28
50
|
}
|
|
29
|
-
|
|
51
|
+
content.push({
|
|
52
|
+
type: 'text',
|
|
53
|
+
text: lines.join('\n') || 'Image generated successfully',
|
|
54
|
+
});
|
|
55
|
+
return content;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Build lightweight structuredContent for the App viewer.
|
|
59
|
+
* Contains ZERO base64 data — viewer loads the image via media server URL.
|
|
60
|
+
*/
|
|
61
|
+
function buildStructuredContent(ctx, processed, description, prompt, groundingSources) {
|
|
62
|
+
const imageUrl = processed?.savedPath
|
|
63
|
+
? ctx.mediaServer.getFileUrl(processed.savedPath)
|
|
64
|
+
: undefined;
|
|
65
|
+
if (processed?.savedPath && !imageUrl) {
|
|
66
|
+
logger.warn('Media server URL unavailable — image saved outside allowed directory', {
|
|
67
|
+
savedPath: processed.savedPath,
|
|
68
|
+
allowedDir: ctx.outputDir,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
imageUrl: imageUrl ?? undefined,
|
|
73
|
+
mimeType: 'image/jpeg',
|
|
74
|
+
savedPath: processed?.savedPath,
|
|
75
|
+
previewPath: processed?.previewPath,
|
|
76
|
+
description,
|
|
77
|
+
prompt,
|
|
78
|
+
groundingSources,
|
|
79
|
+
};
|
|
30
80
|
}
|
|
31
81
|
export function register(ctx) {
|
|
32
82
|
registerAppTool(ctx.server, 'generate_image', {
|
|
@@ -82,7 +132,6 @@ export function register(ctx) {
|
|
|
82
132
|
useSearch: use_search,
|
|
83
133
|
globalMediaResolution: global_media_resolution
|
|
84
134
|
});
|
|
85
|
-
// Resolve any filePath references in input images server-side
|
|
86
135
|
const resolvedImages = images ? await resolveImageInputs(images) : undefined;
|
|
87
136
|
const result = await ctx.imageService.generateImage({
|
|
88
137
|
prompt,
|
|
@@ -97,37 +146,23 @@ export function register(ctx) {
|
|
|
97
146
|
const resolvedSavePath = outputPath
|
|
98
147
|
? resolve(outputPath)
|
|
99
148
|
: resolve(ctx.outputDir, `gemini-${Date.now()}.png`);
|
|
100
|
-
let
|
|
101
|
-
let previewPath;
|
|
102
|
-
let previewImageData;
|
|
149
|
+
let processed;
|
|
103
150
|
if (firstImage?.base64Data) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
151
|
+
processed = await processGeneratedImage(firstImage.base64Data, firstImage.mimeType || 'image/png', resolvedSavePath, prompt, result.description);
|
|
152
|
+
}
|
|
153
|
+
// thoughtSignature is intentionally excluded from the tool result.
|
|
154
|
+
// It can be 500KB+ and would blow the 1MB MCP transport cap.
|
|
155
|
+
// For conversational editing, the user should use edit_image and pass
|
|
156
|
+
// the thoughtSignature from the saved file metadata if needed.
|
|
157
|
+
const droppedSig = result.parts.find(p => !!p.thoughtSignature)?.thoughtSignature;
|
|
158
|
+
if (droppedSig) {
|
|
159
|
+
logger.info('Dropping thoughtSignature from tool result', {
|
|
160
|
+
signatureKB: Math.round(droppedSig.length / 1024)
|
|
161
|
+
});
|
|
108
162
|
}
|
|
109
|
-
// Extract thoughtSignature from response parts for conversational editing
|
|
110
|
-
const thoughtSignature = result.parts.find(p => !!p.thoughtSignature)?.thoughtSignature;
|
|
111
|
-
const textLines = buildTextLines(savedPath, previewPath, result.description, result.groundingSources, thoughtSignature);
|
|
112
|
-
// Serve full-res image via media server (bypasses MCP 1MB limit)
|
|
113
|
-
const imageUrl = savedPath ? ctx.mediaServer.getFileUrl(savedPath) : undefined;
|
|
114
163
|
return {
|
|
115
|
-
structuredContent:
|
|
116
|
-
|
|
117
|
-
base64Data: imageUrl ? '' : (previewImageData || ''), // skip inline data when media server URL available
|
|
118
|
-
mimeType: 'image/jpeg',
|
|
119
|
-
savedPath,
|
|
120
|
-
previewPath,
|
|
121
|
-
description: result.description,
|
|
122
|
-
prompt,
|
|
123
|
-
groundingSources: result.groundingSources
|
|
124
|
-
},
|
|
125
|
-
content: [
|
|
126
|
-
{
|
|
127
|
-
type: 'text',
|
|
128
|
-
text: textLines.join('\n') || 'Image generated successfully'
|
|
129
|
-
}
|
|
130
|
-
]
|
|
164
|
+
structuredContent: buildStructuredContent(ctx, processed, result.description, prompt, result.groundingSources),
|
|
165
|
+
content: buildContent(processed, result.description, prompt, result.groundingSources, undefined),
|
|
131
166
|
};
|
|
132
167
|
}
|
|
133
168
|
catch (error) {
|
|
@@ -177,7 +212,6 @@ export function register(ctx) {
|
|
|
177
212
|
useSearch: use_search,
|
|
178
213
|
globalMediaResolution: global_media_resolution
|
|
179
214
|
});
|
|
180
|
-
// Resolve any filePath references in input images server-side
|
|
181
215
|
const resolvedImages = await resolveImageInputs(images);
|
|
182
216
|
const result = await ctx.imageService.generateImage({
|
|
183
217
|
prompt,
|
|
@@ -190,37 +224,14 @@ export function register(ctx) {
|
|
|
190
224
|
const resolvedSavePath = outputPath
|
|
191
225
|
? resolve(outputPath)
|
|
192
226
|
: resolve(ctx.outputDir, `gemini-edit-${Date.now()}.png`);
|
|
193
|
-
let
|
|
194
|
-
let previewPath;
|
|
195
|
-
let previewImageData;
|
|
227
|
+
let processed;
|
|
196
228
|
if (firstImage?.base64Data) {
|
|
197
|
-
|
|
198
|
-
savedPath = processed.savedPath;
|
|
199
|
-
previewPath = processed.previewPath;
|
|
200
|
-
previewImageData = processed.previewImageData;
|
|
229
|
+
processed = await processGeneratedImage(firstImage.base64Data, firstImage.mimeType || 'image/png', resolvedSavePath, `[EDIT] ${prompt}`, result.description);
|
|
201
230
|
}
|
|
202
|
-
|
|
203
|
-
const thoughtSignature = result.parts.find(p => !!p.thoughtSignature)?.thoughtSignature;
|
|
204
|
-
const textLines = buildTextLines(savedPath, previewPath, result.description, result.groundingSources, thoughtSignature);
|
|
205
|
-
// Serve full-res image via media server (bypasses MCP 1MB limit)
|
|
206
|
-
const imageUrl = savedPath ? ctx.mediaServer.getFileUrl(savedPath) : undefined;
|
|
231
|
+
const editPrompt = `[EDIT] ${prompt}`;
|
|
207
232
|
return {
|
|
208
|
-
structuredContent:
|
|
209
|
-
|
|
210
|
-
base64Data: imageUrl ? '' : (previewImageData || ''), // skip inline data when media server URL available
|
|
211
|
-
mimeType: 'image/jpeg',
|
|
212
|
-
savedPath,
|
|
213
|
-
previewPath,
|
|
214
|
-
description: result.description,
|
|
215
|
-
prompt: `[EDIT] ${prompt}`,
|
|
216
|
-
groundingSources: result.groundingSources
|
|
217
|
-
},
|
|
218
|
-
content: [
|
|
219
|
-
{
|
|
220
|
-
type: 'text',
|
|
221
|
-
text: textLines.join('\n') || 'Image edited successfully'
|
|
222
|
-
}
|
|
223
|
-
]
|
|
233
|
+
structuredContent: buildStructuredContent(ctx, processed, result.description, editPrompt, result.groundingSources),
|
|
234
|
+
content: buildContent(processed, result.description, editPrompt, result.groundingSources, undefined),
|
|
224
235
|
};
|
|
225
236
|
}
|
|
226
237
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-image-gen.js","sourceRoot":"","sources":["../../src/tools/register-image-gen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"register-image-gen.js","sourceRoot":"","sources":["../../src/tools/register-image-gen.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-viewers.d.ts","sourceRoot":"","sources":["../../src/tools/register-viewers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"register-viewers.d.ts","sourceRoot":"","sources":["../../src/tools/register-viewers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgDpE;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC,CAgEf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-viewers.js","sourceRoot":"","sources":["../../src/tools/register-viewers.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAYxC,MAAM,OAAO,GAAiB;IAC5B;QACE,IAAI,EAAE,cAAc;QACpB,UAAU,EAAE,qBAAqB;QACjC,GAAG,EAAE,+BAA+B;QACpC,QAAQ,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"register-viewers.js","sourceRoot":"","sources":["../../src/tools/register-viewers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,22 @@
|
|
|
1
|
-
export interface
|
|
1
|
+
export interface ResizeResult {
|
|
2
2
|
base64: string;
|
|
3
3
|
mimeType: 'image/jpeg';
|
|
4
|
+
width: number;
|
|
5
|
+
height: number;
|
|
4
6
|
originalBytes: number;
|
|
5
7
|
previewBytes: number;
|
|
6
|
-
wasCompressed: boolean;
|
|
7
8
|
}
|
|
8
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Resize an image so the final MCP packet stays under TARGET_PACKET_BYTES.
|
|
11
|
+
*
|
|
12
|
+
* @param base64Data Raw base64 of the source image
|
|
13
|
+
* @param _sourceMimeType Original mime type (unused — always outputs JPEG)
|
|
14
|
+
* @param nonImageOverhead Byte size of all non-image content in the tool result
|
|
15
|
+
* (text blocks, JSON keys, envelope framing).
|
|
16
|
+
* Caller measures this before invoking. Defaults to
|
|
17
|
+
* 10_000 (10KB) as a safe conservative estimate.
|
|
18
|
+
*/
|
|
19
|
+
export declare function resizeForTransport(base64Data: string, _sourceMimeType: string, nonImageOverhead?: number): Promise<ResizeResult>;
|
|
20
|
+
export { resizeForTransport as compressForViewer };
|
|
21
|
+
export type { ResizeResult as CompressResult };
|
|
9
22
|
//# sourceMappingURL=image-compress.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-compress.d.ts","sourceRoot":"","sources":["../../src/utils/image-compress.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"image-compress.d.ts","sourceRoot":"","sources":["../../src/utils/image-compress.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EACvB,gBAAgB,GAAE,MAAe,GAChC,OAAO,CAAC,YAAY,CAAC,CA+CvB;AAED,OAAO,EAAE,kBAAkB,IAAI,iBAAiB,EAAE,CAAC;AACnD,YAAY,EAAE,YAAY,IAAI,cAAc,EAAE,CAAC"}
|
|
@@ -1,43 +1,60 @@
|
|
|
1
1
|
import sharp from 'sharp';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Target total MCP packet size in bytes (measured as the JSON string length).
|
|
4
|
+
* 940KB leaves ~60KB headroom under the 1MB Claude Desktop transport cap.
|
|
5
|
+
*/
|
|
6
|
+
const TARGET_PACKET_BYTES = 600_000;
|
|
7
|
+
const MAX_PREVIEW_DIMENSION = 800;
|
|
8
|
+
/**
|
|
9
|
+
* Resize an image so the final MCP packet stays under TARGET_PACKET_BYTES.
|
|
10
|
+
*
|
|
11
|
+
* @param base64Data Raw base64 of the source image
|
|
12
|
+
* @param _sourceMimeType Original mime type (unused — always outputs JPEG)
|
|
13
|
+
* @param nonImageOverhead Byte size of all non-image content in the tool result
|
|
14
|
+
* (text blocks, JSON keys, envelope framing).
|
|
15
|
+
* Caller measures this before invoking. Defaults to
|
|
16
|
+
* 10_000 (10KB) as a safe conservative estimate.
|
|
17
|
+
*/
|
|
18
|
+
export async function resizeForTransport(base64Data, _sourceMimeType, nonImageOverhead = 10_000) {
|
|
6
19
|
const inputBuffer = Buffer.from(base64Data, 'base64');
|
|
7
20
|
const originalBytes = inputBuffer.length;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
previewBytes: retryBuffer.length,
|
|
30
|
-
wasCompressed: true,
|
|
31
|
-
};
|
|
32
|
-
}
|
|
21
|
+
// base64 string budget available for the image payload
|
|
22
|
+
const base64Budget = TARGET_PACKET_BYTES - nonImageOverhead;
|
|
23
|
+
// base64 encodes 3 binary bytes as 4 chars, so binary ceiling is:
|
|
24
|
+
const binaryBudget = Math.floor(base64Budget * 0.75);
|
|
25
|
+
const dimensionSteps = [MAX_PREVIEW_DIMENSION, 600, 400, 300, 200];
|
|
26
|
+
const quality = 80;
|
|
27
|
+
for (const maxDim of dimensionSteps) {
|
|
28
|
+
const buf = await sharp(inputBuffer)
|
|
29
|
+
.resize(maxDim, maxDim, { fit: 'inside', withoutEnlargement: true })
|
|
30
|
+
.jpeg({ quality, mozjpeg: true })
|
|
31
|
+
.toBuffer();
|
|
32
|
+
if (buf.length <= binaryBudget) {
|
|
33
|
+
const meta = await sharp(buf).metadata();
|
|
34
|
+
return {
|
|
35
|
+
base64: buf.toString('base64'),
|
|
36
|
+
mimeType: 'image/jpeg',
|
|
37
|
+
width: meta.width ?? maxDim,
|
|
38
|
+
height: meta.height ?? maxDim,
|
|
39
|
+
originalBytes,
|
|
40
|
+
previewBytes: buf.length,
|
|
41
|
+
};
|
|
33
42
|
}
|
|
34
43
|
}
|
|
44
|
+
// Last resort: 200px at quality 60 — will always fit
|
|
45
|
+
const buf = await sharp(inputBuffer)
|
|
46
|
+
.resize(200, 200, { fit: 'inside', withoutEnlargement: true })
|
|
47
|
+
.jpeg({ quality: 60, mozjpeg: true })
|
|
48
|
+
.toBuffer();
|
|
49
|
+
const meta = await sharp(buf).metadata();
|
|
35
50
|
return {
|
|
36
|
-
base64:
|
|
51
|
+
base64: buf.toString('base64'),
|
|
37
52
|
mimeType: 'image/jpeg',
|
|
53
|
+
width: meta.width ?? 200,
|
|
54
|
+
height: meta.height ?? 200,
|
|
38
55
|
originalBytes,
|
|
39
|
-
previewBytes:
|
|
40
|
-
wasCompressed: true,
|
|
56
|
+
previewBytes: buf.length,
|
|
41
57
|
};
|
|
42
58
|
}
|
|
59
|
+
export { resizeForTransport as compressForViewer };
|
|
43
60
|
//# sourceMappingURL=image-compress.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-compress.js","sourceRoot":"","sources":["../../src/utils/image-compress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,
|
|
1
|
+
{"version":3,"file":"image-compress.js","sourceRoot":"","sources":["../../src/utils/image-compress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;GAGG;AACH,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAEpC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAWlC;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAkB,EAClB,eAAuB,EACvB,mBAA2B,MAAM;IAEjC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC;IAEzC,uDAAuD;IACvD,MAAM,YAAY,GAAG,mBAAmB,GAAG,gBAAgB,CAAC;IAE5D,kEAAkE;IAClE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAErD,MAAM,cAAc,GAAG,CAAC,qBAAqB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,EAAE,CAAC;IAEnB,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC;aACjC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;aACnE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;aAChC,QAAQ,EAAE,CAAC;QAEd,IAAI,GAAG,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;YACzC,OAAO;gBACL,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC9B,QAAQ,EAAE,YAAY;gBACtB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,MAAM;gBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,MAAM;gBAC7B,aAAa;gBACb,YAAY,EAAE,GAAG,CAAC,MAAM;aACzB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC;SACjC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;SAC7D,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;SACpC,QAAQ,EAAE,CAAC;IAEd,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IACzC,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC9B,QAAQ,EAAE,YAAY;QACtB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG;QACxB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,GAAG;QAC1B,aAAa;QACb,YAAY,EAAE,GAAG,CAAC,MAAM;KACzB,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,kBAAkB,IAAI,iBAAiB,EAAE,CAAC"}
|
|
@@ -3,7 +3,12 @@ export declare function createImagePreviewHtml(imagePath: string, prompt: string
|
|
|
3
3
|
export interface ProcessedImage {
|
|
4
4
|
savedPath: string;
|
|
5
5
|
previewPath: string;
|
|
6
|
-
|
|
6
|
+
/** Base64-encoded resized JPEG preview for inline transport */
|
|
7
|
+
previewBase64: string;
|
|
8
|
+
previewMimeType: 'image/jpeg';
|
|
9
|
+
previewWidth: number;
|
|
10
|
+
previewHeight: number;
|
|
11
|
+
originalBytes: number;
|
|
7
12
|
}
|
|
8
13
|
export declare function processGeneratedImage(base64Data: string, mimeType: string, savePath: string, prompt: string, description?: string): Promise<ProcessedImage>;
|
|
9
14
|
//# sourceMappingURL=image-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-utils.d.ts","sourceRoot":"","sources":["../../src/utils/image-utils.ts"],"names":[],"mappings":"AAKA,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK7F;AAED,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAsOjB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,
|
|
1
|
+
{"version":3,"file":"image-utils.d.ts","sourceRoot":"","sources":["../../src/utils/image-utils.ts"],"names":[],"mappings":"AAKA,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK7F;AAED,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAsOjB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,YAAY,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,cAAc,CAAC,CAkCzB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { writeFile, mkdir } from 'fs/promises';
|
|
2
2
|
import { dirname, resolve } from 'path';
|
|
3
3
|
import logger from './logger.js';
|
|
4
|
-
import {
|
|
4
|
+
import { resizeForTransport } from './image-compress.js';
|
|
5
5
|
export async function saveImageToFile(base64Data, outputPath) {
|
|
6
6
|
const absolutePath = resolve(outputPath);
|
|
7
7
|
await mkdir(dirname(absolutePath), { recursive: true });
|
|
@@ -175,7 +175,7 @@ export async function createImagePreviewHtml(imagePath, prompt, description) {
|
|
|
175
175
|
|
|
176
176
|
<div class="content">
|
|
177
177
|
<div class="image-container">
|
|
178
|
-
<img src="${
|
|
178
|
+
<img src="${imagePath.replace(/\\/g, '/')}" alt="Generated image">
|
|
179
179
|
</div>
|
|
180
180
|
|
|
181
181
|
<div class="metadata">
|
|
@@ -208,7 +208,7 @@ export async function createImagePreviewHtml(imagePath, prompt, description) {
|
|
|
208
208
|
</div>
|
|
209
209
|
|
|
210
210
|
<div class="actions">
|
|
211
|
-
<a href="${
|
|
211
|
+
<a href="${imagePath.replace(/\\/g, '/')}" download class="btn">Download Image</a>
|
|
212
212
|
</div>
|
|
213
213
|
</div>
|
|
214
214
|
|
|
@@ -240,18 +240,29 @@ export async function createImagePreviewHtml(imagePath, prompt, description) {
|
|
|
240
240
|
export async function processGeneratedImage(base64Data, mimeType, savePath, prompt, description) {
|
|
241
241
|
const savedPath = await saveImageToFile(base64Data, savePath);
|
|
242
242
|
const previewPath = await createImagePreviewHtml(savedPath, prompt, description);
|
|
243
|
-
|
|
243
|
+
// Measure non-image overhead: text content that will accompany the image
|
|
244
|
+
// in the tool result (file paths + description + JSON-RPC envelope framing)
|
|
245
|
+
const nonImageOverhead = Buffer.byteLength(JSON.stringify({ savedPath, previewPath, description: description ?? '', prompt }), 'utf8') + 2_000; // 2KB extra for JSON-RPC envelope keys and framing
|
|
246
|
+
const resized = await resizeForTransport(base64Data, mimeType, nonImageOverhead);
|
|
247
|
+
const base64Chars = resized.base64.length;
|
|
244
248
|
logger.info('Image saved successfully', {
|
|
245
249
|
savedPath,
|
|
246
250
|
previewPath,
|
|
247
|
-
originalKB: Math.round(
|
|
248
|
-
previewKB: Math.round(
|
|
249
|
-
|
|
251
|
+
originalKB: Math.round(resized.originalBytes / 1024),
|
|
252
|
+
previewKB: Math.round(resized.previewBytes / 1024),
|
|
253
|
+
previewDimensions: `${resized.width}x${resized.height}`,
|
|
254
|
+
ratio: (resized.originalBytes / resized.previewBytes).toFixed(1) + 'x',
|
|
255
|
+
base64Chars,
|
|
256
|
+
base64KB: Math.round(base64Chars / 1024),
|
|
250
257
|
});
|
|
251
258
|
return {
|
|
252
259
|
savedPath,
|
|
253
260
|
previewPath,
|
|
254
|
-
|
|
261
|
+
previewBase64: resized.base64,
|
|
262
|
+
previewMimeType: resized.mimeType,
|
|
263
|
+
previewWidth: resized.width,
|
|
264
|
+
previewHeight: resized.height,
|
|
265
|
+
originalBytes: resized.originalBytes,
|
|
255
266
|
};
|
|
256
267
|
}
|
|
257
268
|
//# sourceMappingURL=image-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-utils.js","sourceRoot":"","sources":["../../src/utils/image-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"image-utils.js","sourceRoot":"","sources":["../../src/utils/image-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AA+DnC,QAAA,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AA+DnC,QAAA,MAAM,MAAM,gBAYV,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
package/dist/utils/logger.js
CHANGED
|
@@ -49,8 +49,9 @@ if (transports.length === 0) {
|
|
|
49
49
|
}
|
|
50
50
|
const logger = winston.createLogger({
|
|
51
51
|
level: config.logging.level,
|
|
52
|
-
format: winston.format.combine(winston.format.timestamp(), winston.format.errors({ stack: true }), winston.format.colorize(), winston.format.printf(({ timestamp, level, message, stack }) => {
|
|
53
|
-
|
|
52
|
+
format: winston.format.combine(winston.format.timestamp(), winston.format.errors({ stack: true }), winston.format.colorize(), winston.format.printf(({ timestamp, level, message, stack, ...meta }) => {
|
|
53
|
+
const metaStr = Object.keys(meta).length ? ' ' + JSON.stringify(meta) : '';
|
|
54
|
+
return `${timestamp} [${level}]: ${message}${metaStr}${stack ? '\n' + stack : ''}`;
|
|
54
55
|
})),
|
|
55
56
|
transports
|
|
56
57
|
});
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,0CAA0C;AAC1C,4EAA4E;AAC5E,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,MAAM,CAAC;AAExE,MAAM,UAAU,GAAwB,EAAE,CAAC;AAE3C,qEAAqE;AACrE,IAAI,oBAAoB,EAAE,CAAC;IACzB,2DAA2D;IAC3D,2CAA2C;IAC3C,iDAAiD;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,8BAA8B;QAC9B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAEvD,UAAU,CAAC,IAAI,CACb,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;YACxC,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,OAAO,EAAE,MAAM;YACxB,QAAQ,EAAE,CAAC;SACZ,CAAC,EACF,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC;YAC3C,OAAO,EAAE,OAAO,EAAE,MAAM;YACxB,QAAQ,EAAE,CAAC;SACZ,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,uDAAuD;QACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,MAAM,4BAA4B,CAAC,CAAC;IACzG,CAAC;AACH,CAAC;AAED,6DAA6D;AAC7D,0DAA0D;AAC1D,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;IAC/E,UAAU,CAAC,IAAI,CACb,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;QAC7B,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB;KAC1E,CAAC,CACH,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,+DAA+D;AAC/D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IAC5B,UAAU,CAAC,IAAI,CACb,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;QAC7B,KAAK,EAAE,OAAO;QACd,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;KACjD,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK;IAC3B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAC5B,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,EAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACtC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EACzB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|