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/cli.js CHANGED
@@ -3735,26 +3735,29 @@ function cacheKey(buffer) {
3735
3735
  return createHash("sha256").update(buffer).digest("hex");
3736
3736
  }
3737
3737
  async function resizeImageIfNeeded(buffer, mediaType) {
3738
+ const inputMediaType = mediaType || "image/png";
3738
3739
  let metadata;
3739
3740
  try {
3740
3741
  metadata = await sharp(buffer).metadata();
3741
3742
  } catch {
3742
- return buffer;
3743
+ return { buffer, mediaType: inputMediaType };
3743
3744
  }
3744
3745
  const { width, height } = metadata;
3745
- if (!width || !height) return buffer;
3746
+ if (!width || !height) return { buffer, mediaType: inputMediaType };
3746
3747
  const longEdge = Math.max(width, height);
3747
3748
  const needsResize = longEdge > MAX_LONG_EDGE;
3748
3749
  const needsShrink = buffer.length > MAX_FILE_BYTES;
3749
- if (!needsResize && !needsShrink) return buffer;
3750
+ if (!needsResize && !needsShrink) return { buffer, mediaType: inputMediaType };
3750
3751
  const key = cacheKey(buffer);
3751
3752
  const cacheDir = getCacheDir();
3752
- const isPng = mediaType?.includes("png");
3753
- const ext = isPng ? ".png" : ".jpg";
3753
+ const isPng = inputMediaType.includes("png");
3754
+ const willConvertToJpeg = isPng && (needsShrink || buffer.length > 2 * 1024 * 1024);
3755
+ const outputMediaType = willConvertToJpeg || !isPng ? "image/jpeg" : "image/png";
3756
+ const ext = outputMediaType === "image/png" ? ".png" : ".jpg";
3754
3757
  const cachePath = join3(cacheDir, key + ext);
3755
3758
  if (existsSync3(cachePath)) {
3756
3759
  console.log(`[image-resize] Cache hit for ${width}x${height} image`);
3757
- return readFileSync2(cachePath);
3760
+ return { buffer: readFileSync2(cachePath), mediaType: outputMediaType };
3758
3761
  }
3759
3762
  let pipeline = sharp(buffer);
3760
3763
  if (needsResize) {
@@ -3764,25 +3767,27 @@ async function resizeImageIfNeeded(buffer, mediaType) {
3764
3767
  });
3765
3768
  }
3766
3769
  let result;
3767
- if (isPng && (needsShrink || buffer.length > 2 * 1024 * 1024)) {
3770
+ if (willConvertToJpeg) {
3768
3771
  result = await pipeline.jpeg({ quality: 85 }).toBuffer();
3769
3772
  } else if (isPng) {
3770
3773
  result = await pipeline.png().toBuffer();
3771
3774
  } else {
3772
3775
  result = await pipeline.jpeg({ quality: 85 }).toBuffer();
3773
3776
  }
3777
+ let finalMediaType = outputMediaType;
3774
3778
  if (result.length > MAX_FILE_BYTES) {
3775
3779
  for (const quality of [70, 50, 30]) {
3776
3780
  result = await sharp(buffer).resize(MAX_LONG_EDGE, MAX_LONG_EDGE, { fit: "inside", withoutEnlargement: true }).jpeg({ quality }).toBuffer();
3777
3781
  if (result.length <= MAX_FILE_BYTES) break;
3778
3782
  }
3783
+ finalMediaType = "image/jpeg";
3779
3784
  }
3780
3785
  writeFileSync2(cachePath, result);
3781
3786
  const resultMeta = await sharp(result).metadata();
3782
3787
  console.log(
3783
- `[image-resize] ${width}x${height} -> ${resultMeta.width}x${resultMeta.height} (${(buffer.length / 1024).toFixed(0)}KB -> ${(result.length / 1024).toFixed(0)}KB)`
3788
+ `[image-resize] ${width}x${height} -> ${resultMeta.width}x${resultMeta.height} (${(buffer.length / 1024).toFixed(0)}KB -> ${(result.length / 1024).toFixed(0)}KB, ${finalMediaType})`
3784
3789
  );
3785
- return result;
3790
+ return { buffer: result, mediaType: finalMediaType };
3786
3791
  }
3787
3792
 
3788
3793
  // src/tools/read-file.ts
@@ -3849,15 +3854,15 @@ Use this to understand existing code, check file contents, view screenshots, or
3849
3854
  };
3850
3855
  }
3851
3856
  const rawBuffer = await readFile2(absolutePath);
3852
- const mediaType = getImageMediaType(absolutePath);
3853
- const buffer = await resizeImageIfNeeded(rawBuffer, mediaType);
3854
- const base64 = buffer.toString("base64");
3857
+ const originalMediaType = getImageMediaType(absolutePath);
3858
+ const resized = await resizeImageIfNeeded(rawBuffer, originalMediaType);
3859
+ const base64 = resized.buffer.toString("base64");
3855
3860
  return {
3856
3861
  success: true,
3857
3862
  path: absolutePath,
3858
3863
  relativePath: relative(options.workingDirectory, absolutePath),
3859
- content: `[Image: ${relativePath} (${mediaType}, ${(stats.size / 1024).toFixed(1)}KB)]`,
3860
- mediaType,
3864
+ content: `[Image: ${relativePath} (${resized.mediaType}, ${(stats.size / 1024).toFixed(1)}KB)]`,
3865
+ mediaType: resized.mediaType,
3861
3866
  imageData: base64,
3862
3867
  sizeBytes: stats.size
3863
3868
  };
@@ -9403,9 +9408,10 @@ async function saveAttachmentToDisk(sessionId, attachment, index) {
9403
9408
  }
9404
9409
  let buffer = Buffer.from(base64Data, "base64");
9405
9410
  if (attachment.type === "image") {
9406
- buffer = await resizeImageIfNeeded(buffer, attachment.mediaType);
9407
- const prefix = attachment.data.includes(",") ? attachment.data.split(",")[0] + "," : "";
9408
- attachment.data = prefix + buffer.toString("base64");
9411
+ const resized = await resizeImageIfNeeded(buffer, attachment.mediaType);
9412
+ buffer = resized.buffer;
9413
+ attachment.mediaType = resized.mediaType;
9414
+ attachment.data = buffer.toString("base64");
9409
9415
  }
9410
9416
  const filePath = join9(attachmentsDir, filename);
9411
9417
  writeFileSync4(filePath, buffer);