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
@@ -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 = mediaType?.includes("png");
2975
- const ext = isPng ? ".png" : ".jpg";
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 (isPng && (needsShrink || buffer.length > 2 * 1024 * 1024)) {
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 mediaType = getImageMediaType(absolutePath);
3075
- const buffer = await resizeImageIfNeeded(rawBuffer, mediaType);
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
- buffer = await resizeImageIfNeeded(buffer, attachment.mediaType);
8629
- const prefix = attachment.data.includes(",") ? attachment.data.split(",")[0] + "," : "";
8630
- attachment.data = prefix + buffer.toString("base64");
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);