sparkecoder 0.1.77 → 0.1.78
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/dist/agent/index.js +19 -14
- package/dist/agent/index.js.map +1 -1
- package/dist/cli.js +23 -17
- package/dist/cli.js.map +1 -1
- package/dist/index.js +23 -17
- package/dist/index.js.map +1 -1
- package/dist/server/index.js +23 -17
- package/dist/server/index.js.map +1 -1
- package/dist/tools/index.js +19 -14
- package/dist/tools/index.js.map +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.html +1 -1
- package/web/.next/standalone/web/.next/server/app/index.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
- package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
- /package/web/.next/standalone/web/.next/static/{jEMyQksXLQ60IvC0f9PYc → q5xKLVzzjdkOykOwVu4eK}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{jEMyQksXLQ60IvC0f9PYc → q5xKLVzzjdkOykOwVu4eK}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/{jEMyQksXLQ60IvC0f9PYc → q5xKLVzzjdkOykOwVu4eK}/_ssgManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/static/{jEMyQksXLQ60IvC0f9PYc → q5xKLVzzjdkOykOwVu4eK}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/static/{jEMyQksXLQ60IvC0f9PYc → q5xKLVzzjdkOykOwVu4eK}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/static/{jEMyQksXLQ60IvC0f9PYc → q5xKLVzzjdkOykOwVu4eK}/_ssgManifest.js +0 -0
- /package/web/.next/static/{jEMyQksXLQ60IvC0f9PYc → q5xKLVzzjdkOykOwVu4eK}/_buildManifest.js +0 -0
- /package/web/.next/static/{jEMyQksXLQ60IvC0f9PYc → q5xKLVzzjdkOykOwVu4eK}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{jEMyQksXLQ60IvC0f9PYc → q5xKLVzzjdkOykOwVu4eK}/_ssgManifest.js +0 -0
package/dist/server/index.js
CHANGED
|
@@ -2957,26 +2957,29 @@ function cacheKey(buffer) {
|
|
|
2957
2957
|
return createHash("sha256").update(buffer).digest("hex");
|
|
2958
2958
|
}
|
|
2959
2959
|
async function resizeImageIfNeeded(buffer, mediaType) {
|
|
2960
|
+
const inputMediaType = mediaType || "image/png";
|
|
2960
2961
|
let metadata;
|
|
2961
2962
|
try {
|
|
2962
2963
|
metadata = await sharp(buffer).metadata();
|
|
2963
2964
|
} catch {
|
|
2964
|
-
return buffer;
|
|
2965
|
+
return { buffer, mediaType: inputMediaType };
|
|
2965
2966
|
}
|
|
2966
2967
|
const { width, height } = metadata;
|
|
2967
|
-
if (!width || !height) return buffer;
|
|
2968
|
+
if (!width || !height) return { buffer, mediaType: inputMediaType };
|
|
2968
2969
|
const longEdge = Math.max(width, height);
|
|
2969
2970
|
const needsResize = longEdge > MAX_LONG_EDGE;
|
|
2970
2971
|
const needsShrink = buffer.length > MAX_FILE_BYTES;
|
|
2971
|
-
if (!needsResize && !needsShrink) return buffer;
|
|
2972
|
+
if (!needsResize && !needsShrink) return { buffer, mediaType: inputMediaType };
|
|
2972
2973
|
const key = cacheKey(buffer);
|
|
2973
2974
|
const cacheDir = getCacheDir();
|
|
2974
|
-
const isPng =
|
|
2975
|
-
const
|
|
2975
|
+
const isPng = inputMediaType.includes("png");
|
|
2976
|
+
const willConvertToJpeg = isPng && (needsShrink || buffer.length > 2 * 1024 * 1024);
|
|
2977
|
+
const outputMediaType = willConvertToJpeg || !isPng ? "image/jpeg" : "image/png";
|
|
2978
|
+
const ext = outputMediaType === "image/png" ? ".png" : ".jpg";
|
|
2976
2979
|
const cachePath = join3(cacheDir, key + ext);
|
|
2977
2980
|
if (existsSync3(cachePath)) {
|
|
2978
2981
|
console.log(`[image-resize] Cache hit for ${width}x${height} image`);
|
|
2979
|
-
return readFileSync2(cachePath);
|
|
2982
|
+
return { buffer: readFileSync2(cachePath), mediaType: outputMediaType };
|
|
2980
2983
|
}
|
|
2981
2984
|
let pipeline = sharp(buffer);
|
|
2982
2985
|
if (needsResize) {
|
|
@@ -2986,25 +2989,27 @@ async function resizeImageIfNeeded(buffer, mediaType) {
|
|
|
2986
2989
|
});
|
|
2987
2990
|
}
|
|
2988
2991
|
let result;
|
|
2989
|
-
if (
|
|
2992
|
+
if (willConvertToJpeg) {
|
|
2990
2993
|
result = await pipeline.jpeg({ quality: 85 }).toBuffer();
|
|
2991
2994
|
} else if (isPng) {
|
|
2992
2995
|
result = await pipeline.png().toBuffer();
|
|
2993
2996
|
} else {
|
|
2994
2997
|
result = await pipeline.jpeg({ quality: 85 }).toBuffer();
|
|
2995
2998
|
}
|
|
2999
|
+
let finalMediaType = outputMediaType;
|
|
2996
3000
|
if (result.length > MAX_FILE_BYTES) {
|
|
2997
3001
|
for (const quality of [70, 50, 30]) {
|
|
2998
3002
|
result = await sharp(buffer).resize(MAX_LONG_EDGE, MAX_LONG_EDGE, { fit: "inside", withoutEnlargement: true }).jpeg({ quality }).toBuffer();
|
|
2999
3003
|
if (result.length <= MAX_FILE_BYTES) break;
|
|
3000
3004
|
}
|
|
3005
|
+
finalMediaType = "image/jpeg";
|
|
3001
3006
|
}
|
|
3002
3007
|
writeFileSync2(cachePath, result);
|
|
3003
3008
|
const resultMeta = await sharp(result).metadata();
|
|
3004
3009
|
console.log(
|
|
3005
|
-
`[image-resize] ${width}x${height} -> ${resultMeta.width}x${resultMeta.height} (${(buffer.length / 1024).toFixed(0)}KB -> ${(result.length / 1024).toFixed(0)}KB)`
|
|
3010
|
+
`[image-resize] ${width}x${height} -> ${resultMeta.width}x${resultMeta.height} (${(buffer.length / 1024).toFixed(0)}KB -> ${(result.length / 1024).toFixed(0)}KB, ${finalMediaType})`
|
|
3006
3011
|
);
|
|
3007
|
-
return result;
|
|
3012
|
+
return { buffer: result, mediaType: finalMediaType };
|
|
3008
3013
|
}
|
|
3009
3014
|
|
|
3010
3015
|
// src/tools/read-file.ts
|
|
@@ -3071,15 +3076,15 @@ Use this to understand existing code, check file contents, view screenshots, or
|
|
|
3071
3076
|
};
|
|
3072
3077
|
}
|
|
3073
3078
|
const rawBuffer = await readFile2(absolutePath);
|
|
3074
|
-
const
|
|
3075
|
-
const
|
|
3076
|
-
const base64 = buffer.toString("base64");
|
|
3079
|
+
const originalMediaType = getImageMediaType(absolutePath);
|
|
3080
|
+
const resized = await resizeImageIfNeeded(rawBuffer, originalMediaType);
|
|
3081
|
+
const base64 = resized.buffer.toString("base64");
|
|
3077
3082
|
return {
|
|
3078
3083
|
success: true,
|
|
3079
3084
|
path: absolutePath,
|
|
3080
3085
|
relativePath: relative(options.workingDirectory, absolutePath),
|
|
3081
|
-
content: `[Image: ${relativePath} (${mediaType}, ${(stats.size / 1024).toFixed(1)}KB)]`,
|
|
3082
|
-
mediaType,
|
|
3086
|
+
content: `[Image: ${relativePath} (${resized.mediaType}, ${(stats.size / 1024).toFixed(1)}KB)]`,
|
|
3087
|
+
mediaType: resized.mediaType,
|
|
3083
3088
|
imageData: base64,
|
|
3084
3089
|
sizeBytes: stats.size
|
|
3085
3090
|
};
|
|
@@ -8625,9 +8630,10 @@ async function saveAttachmentToDisk(sessionId, attachment, index) {
|
|
|
8625
8630
|
}
|
|
8626
8631
|
let buffer = Buffer.from(base64Data, "base64");
|
|
8627
8632
|
if (attachment.type === "image") {
|
|
8628
|
-
|
|
8629
|
-
|
|
8630
|
-
attachment.
|
|
8633
|
+
const resized = await resizeImageIfNeeded(buffer, attachment.mediaType);
|
|
8634
|
+
buffer = resized.buffer;
|
|
8635
|
+
attachment.mediaType = resized.mediaType;
|
|
8636
|
+
attachment.data = buffer.toString("base64");
|
|
8631
8637
|
}
|
|
8632
8638
|
const filePath = join9(attachmentsDir, filename);
|
|
8633
8639
|
writeFileSync4(filePath, buffer);
|