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.
Files changed (86) hide show
  1. package/dist/agent/index.js +19 -14
  2. package/dist/agent/index.js.map +1 -1
  3. package/dist/cli.js +23 -17
  4. package/dist/cli.js.map +1 -1
  5. package/dist/index.js +23 -17
  6. package/dist/index.js.map +1 -1
  7. package/dist/server/index.js +23 -17
  8. package/dist/server/index.js.map +1 -1
  9. package/dist/tools/index.js +19 -14
  10. package/dist/tools/index.js.map +1 -1
  11. package/package.json +1 -1
  12. package/web/.next/BUILD_ID +1 -1
  13. package/web/.next/standalone/web/.next/BUILD_ID +1 -1
  14. package/web/.next/standalone/web/.next/build-manifest.json +2 -2
  15. package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
  16. package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
  17. package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
  18. package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  19. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  20. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  21. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  22. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  23. package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
  24. package/web/.next/standalone/web/.next/server/app/_not-found.rsc +1 -1
  25. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  26. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  27. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  28. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  29. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  30. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  31. package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
  32. package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +1 -1
  33. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +1 -1
  34. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
  35. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +1 -1
  36. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +1 -1
  37. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +1 -1
  38. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
  39. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +1 -1
  40. package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
  41. package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +1 -1
  42. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +1 -1
  43. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
  44. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +1 -1
  45. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +1 -1
  46. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
  47. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
  48. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +1 -1
  49. package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
  50. package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +1 -1
  51. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +1 -1
  52. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
  53. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +1 -1
  54. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +1 -1
  55. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +1 -1
  56. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
  57. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +1 -1
  58. package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
  59. package/web/.next/standalone/web/.next/server/app/docs.rsc +1 -1
  60. package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +1 -1
  61. package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
  62. package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +1 -1
  63. package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +1 -1
  64. package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
  65. package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +1 -1
  66. package/web/.next/standalone/web/.next/server/app/index.html +1 -1
  67. package/web/.next/standalone/web/.next/server/app/index.rsc +1 -1
  68. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +1 -1
  69. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +1 -1
  70. package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +1 -1
  71. package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  72. package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +1 -1
  73. package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  74. package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
  75. package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
  76. package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
  77. package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
  78. /package/web/.next/standalone/web/.next/static/{jEMyQksXLQ60IvC0f9PYc → q5xKLVzzjdkOykOwVu4eK}/_buildManifest.js +0 -0
  79. /package/web/.next/standalone/web/.next/static/{jEMyQksXLQ60IvC0f9PYc → q5xKLVzzjdkOykOwVu4eK}/_clientMiddlewareManifest.json +0 -0
  80. /package/web/.next/standalone/web/.next/static/{jEMyQksXLQ60IvC0f9PYc → q5xKLVzzjdkOykOwVu4eK}/_ssgManifest.js +0 -0
  81. /package/web/.next/standalone/web/.next/static/static/{jEMyQksXLQ60IvC0f9PYc → q5xKLVzzjdkOykOwVu4eK}/_buildManifest.js +0 -0
  82. /package/web/.next/standalone/web/.next/static/static/{jEMyQksXLQ60IvC0f9PYc → q5xKLVzzjdkOykOwVu4eK}/_clientMiddlewareManifest.json +0 -0
  83. /package/web/.next/standalone/web/.next/static/static/{jEMyQksXLQ60IvC0f9PYc → q5xKLVzzjdkOykOwVu4eK}/_ssgManifest.js +0 -0
  84. /package/web/.next/static/{jEMyQksXLQ60IvC0f9PYc → q5xKLVzzjdkOykOwVu4eK}/_buildManifest.js +0 -0
  85. /package/web/.next/static/{jEMyQksXLQ60IvC0f9PYc → q5xKLVzzjdkOykOwVu4eK}/_clientMiddlewareManifest.json +0 -0
  86. /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 = mediaType?.includes("png");
2970
- const ext = isPng ? ".png" : ".jpg";
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 (isPng && (needsShrink || buffer.length > 2 * 1024 * 1024)) {
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 mediaType = getImageMediaType(absolutePath);
3070
- const buffer = await resizeImageIfNeeded(rawBuffer, mediaType);
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
- buffer = await resizeImageIfNeeded(buffer, attachment.mediaType);
8644
- const prefix = attachment.data.includes(",") ? attachment.data.split(",")[0] + "," : "";
8645
- attachment.data = prefix + buffer.toString("base64");
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);