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/index.js
CHANGED
|
@@ -2952,26 +2952,29 @@ function cacheKey(buffer) {
|
|
|
2952
2952
|
return createHash("sha256").update(buffer).digest("hex");
|
|
2953
2953
|
}
|
|
2954
2954
|
async function resizeImageIfNeeded(buffer, mediaType) {
|
|
2955
|
+
const inputMediaType = mediaType || "image/png";
|
|
2955
2956
|
let metadata;
|
|
2956
2957
|
try {
|
|
2957
2958
|
metadata = await sharp(buffer).metadata();
|
|
2958
2959
|
} catch {
|
|
2959
|
-
return buffer;
|
|
2960
|
+
return { buffer, mediaType: inputMediaType };
|
|
2960
2961
|
}
|
|
2961
2962
|
const { width, height } = metadata;
|
|
2962
|
-
if (!width || !height) return buffer;
|
|
2963
|
+
if (!width || !height) return { buffer, mediaType: inputMediaType };
|
|
2963
2964
|
const longEdge = Math.max(width, height);
|
|
2964
2965
|
const needsResize = longEdge > MAX_LONG_EDGE;
|
|
2965
2966
|
const needsShrink = buffer.length > MAX_FILE_BYTES;
|
|
2966
|
-
if (!needsResize && !needsShrink) return buffer;
|
|
2967
|
+
if (!needsResize && !needsShrink) return { buffer, mediaType: inputMediaType };
|
|
2967
2968
|
const key = cacheKey(buffer);
|
|
2968
2969
|
const cacheDir = getCacheDir();
|
|
2969
|
-
const isPng =
|
|
2970
|
-
const
|
|
2970
|
+
const isPng = inputMediaType.includes("png");
|
|
2971
|
+
const willConvertToJpeg = isPng && (needsShrink || buffer.length > 2 * 1024 * 1024);
|
|
2972
|
+
const outputMediaType = willConvertToJpeg || !isPng ? "image/jpeg" : "image/png";
|
|
2973
|
+
const ext = outputMediaType === "image/png" ? ".png" : ".jpg";
|
|
2971
2974
|
const cachePath = join3(cacheDir, key + ext);
|
|
2972
2975
|
if (existsSync3(cachePath)) {
|
|
2973
2976
|
console.log(`[image-resize] Cache hit for ${width}x${height} image`);
|
|
2974
|
-
return readFileSync2(cachePath);
|
|
2977
|
+
return { buffer: readFileSync2(cachePath), mediaType: outputMediaType };
|
|
2975
2978
|
}
|
|
2976
2979
|
let pipeline = sharp(buffer);
|
|
2977
2980
|
if (needsResize) {
|
|
@@ -2981,25 +2984,27 @@ async function resizeImageIfNeeded(buffer, mediaType) {
|
|
|
2981
2984
|
});
|
|
2982
2985
|
}
|
|
2983
2986
|
let result;
|
|
2984
|
-
if (
|
|
2987
|
+
if (willConvertToJpeg) {
|
|
2985
2988
|
result = await pipeline.jpeg({ quality: 85 }).toBuffer();
|
|
2986
2989
|
} else if (isPng) {
|
|
2987
2990
|
result = await pipeline.png().toBuffer();
|
|
2988
2991
|
} else {
|
|
2989
2992
|
result = await pipeline.jpeg({ quality: 85 }).toBuffer();
|
|
2990
2993
|
}
|
|
2994
|
+
let finalMediaType = outputMediaType;
|
|
2991
2995
|
if (result.length > MAX_FILE_BYTES) {
|
|
2992
2996
|
for (const quality of [70, 50, 30]) {
|
|
2993
2997
|
result = await sharp(buffer).resize(MAX_LONG_EDGE, MAX_LONG_EDGE, { fit: "inside", withoutEnlargement: true }).jpeg({ quality }).toBuffer();
|
|
2994
2998
|
if (result.length <= MAX_FILE_BYTES) break;
|
|
2995
2999
|
}
|
|
3000
|
+
finalMediaType = "image/jpeg";
|
|
2996
3001
|
}
|
|
2997
3002
|
writeFileSync2(cachePath, result);
|
|
2998
3003
|
const resultMeta = await sharp(result).metadata();
|
|
2999
3004
|
console.log(
|
|
3000
|
-
`[image-resize] ${width}x${height} -> ${resultMeta.width}x${resultMeta.height} (${(buffer.length / 1024).toFixed(0)}KB -> ${(result.length / 1024).toFixed(0)}KB)`
|
|
3005
|
+
`[image-resize] ${width}x${height} -> ${resultMeta.width}x${resultMeta.height} (${(buffer.length / 1024).toFixed(0)}KB -> ${(result.length / 1024).toFixed(0)}KB, ${finalMediaType})`
|
|
3001
3006
|
);
|
|
3002
|
-
return result;
|
|
3007
|
+
return { buffer: result, mediaType: finalMediaType };
|
|
3003
3008
|
}
|
|
3004
3009
|
|
|
3005
3010
|
// src/tools/read-file.ts
|
|
@@ -3066,15 +3071,15 @@ Use this to understand existing code, check file contents, view screenshots, or
|
|
|
3066
3071
|
};
|
|
3067
3072
|
}
|
|
3068
3073
|
const rawBuffer = await readFile2(absolutePath);
|
|
3069
|
-
const
|
|
3070
|
-
const
|
|
3071
|
-
const base64 = buffer.toString("base64");
|
|
3074
|
+
const originalMediaType = getImageMediaType(absolutePath);
|
|
3075
|
+
const resized = await resizeImageIfNeeded(rawBuffer, originalMediaType);
|
|
3076
|
+
const base64 = resized.buffer.toString("base64");
|
|
3072
3077
|
return {
|
|
3073
3078
|
success: true,
|
|
3074
3079
|
path: absolutePath,
|
|
3075
3080
|
relativePath: relative(options.workingDirectory, absolutePath),
|
|
3076
|
-
content: `[Image: ${relativePath} (${mediaType}, ${(stats.size / 1024).toFixed(1)}KB)]`,
|
|
3077
|
-
mediaType,
|
|
3081
|
+
content: `[Image: ${relativePath} (${resized.mediaType}, ${(stats.size / 1024).toFixed(1)}KB)]`,
|
|
3082
|
+
mediaType: resized.mediaType,
|
|
3078
3083
|
imageData: base64,
|
|
3079
3084
|
sizeBytes: stats.size
|
|
3080
3085
|
};
|
|
@@ -8640,9 +8645,10 @@ async function saveAttachmentToDisk(sessionId, attachment, index) {
|
|
|
8640
8645
|
}
|
|
8641
8646
|
let buffer = Buffer.from(base64Data, "base64");
|
|
8642
8647
|
if (attachment.type === "image") {
|
|
8643
|
-
|
|
8644
|
-
|
|
8645
|
-
attachment.
|
|
8648
|
+
const resized = await resizeImageIfNeeded(buffer, attachment.mediaType);
|
|
8649
|
+
buffer = resized.buffer;
|
|
8650
|
+
attachment.mediaType = resized.mediaType;
|
|
8651
|
+
attachment.data = buffer.toString("base64");
|
|
8646
8652
|
}
|
|
8647
8653
|
const filePath = join9(attachmentsDir, filename);
|
|
8648
8654
|
writeFileSync4(filePath, buffer);
|