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
@@ -2519,26 +2519,29 @@ function cacheKey(buffer) {
2519
2519
  return createHash("sha256").update(buffer).digest("hex");
2520
2520
  }
2521
2521
  async function resizeImageIfNeeded(buffer, mediaType) {
2522
+ const inputMediaType = mediaType || "image/png";
2522
2523
  let metadata;
2523
2524
  try {
2524
2525
  metadata = await sharp(buffer).metadata();
2525
2526
  } catch {
2526
- return buffer;
2527
+ return { buffer, mediaType: inputMediaType };
2527
2528
  }
2528
2529
  const { width, height } = metadata;
2529
- if (!width || !height) return buffer;
2530
+ if (!width || !height) return { buffer, mediaType: inputMediaType };
2530
2531
  const longEdge = Math.max(width, height);
2531
2532
  const needsResize = longEdge > MAX_LONG_EDGE;
2532
2533
  const needsShrink = buffer.length > MAX_FILE_BYTES;
2533
- if (!needsResize && !needsShrink) return buffer;
2534
+ if (!needsResize && !needsShrink) return { buffer, mediaType: inputMediaType };
2534
2535
  const key = cacheKey(buffer);
2535
2536
  const cacheDir = getCacheDir();
2536
- const isPng = mediaType?.includes("png");
2537
- const ext = isPng ? ".png" : ".jpg";
2537
+ const isPng = inputMediaType.includes("png");
2538
+ const willConvertToJpeg = isPng && (needsShrink || buffer.length > 2 * 1024 * 1024);
2539
+ const outputMediaType = willConvertToJpeg || !isPng ? "image/jpeg" : "image/png";
2540
+ const ext = outputMediaType === "image/png" ? ".png" : ".jpg";
2538
2541
  const cachePath = join3(cacheDir, key + ext);
2539
2542
  if (existsSync3(cachePath)) {
2540
2543
  console.log(`[image-resize] Cache hit for ${width}x${height} image`);
2541
- return readFileSync2(cachePath);
2544
+ return { buffer: readFileSync2(cachePath), mediaType: outputMediaType };
2542
2545
  }
2543
2546
  let pipeline = sharp(buffer);
2544
2547
  if (needsResize) {
@@ -2548,25 +2551,27 @@ async function resizeImageIfNeeded(buffer, mediaType) {
2548
2551
  });
2549
2552
  }
2550
2553
  let result;
2551
- if (isPng && (needsShrink || buffer.length > 2 * 1024 * 1024)) {
2554
+ if (willConvertToJpeg) {
2552
2555
  result = await pipeline.jpeg({ quality: 85 }).toBuffer();
2553
2556
  } else if (isPng) {
2554
2557
  result = await pipeline.png().toBuffer();
2555
2558
  } else {
2556
2559
  result = await pipeline.jpeg({ quality: 85 }).toBuffer();
2557
2560
  }
2561
+ let finalMediaType = outputMediaType;
2558
2562
  if (result.length > MAX_FILE_BYTES) {
2559
2563
  for (const quality of [70, 50, 30]) {
2560
2564
  result = await sharp(buffer).resize(MAX_LONG_EDGE, MAX_LONG_EDGE, { fit: "inside", withoutEnlargement: true }).jpeg({ quality }).toBuffer();
2561
2565
  if (result.length <= MAX_FILE_BYTES) break;
2562
2566
  }
2567
+ finalMediaType = "image/jpeg";
2563
2568
  }
2564
2569
  writeFileSync2(cachePath, result);
2565
2570
  const resultMeta = await sharp(result).metadata();
2566
2571
  console.log(
2567
- `[image-resize] ${width}x${height} -> ${resultMeta.width}x${resultMeta.height} (${(buffer.length / 1024).toFixed(0)}KB -> ${(result.length / 1024).toFixed(0)}KB)`
2572
+ `[image-resize] ${width}x${height} -> ${resultMeta.width}x${resultMeta.height} (${(buffer.length / 1024).toFixed(0)}KB -> ${(result.length / 1024).toFixed(0)}KB, ${finalMediaType})`
2568
2573
  );
2569
- return result;
2574
+ return { buffer: result, mediaType: finalMediaType };
2570
2575
  }
2571
2576
 
2572
2577
  // src/tools/read-file.ts
@@ -2633,15 +2638,15 @@ Use this to understand existing code, check file contents, view screenshots, or
2633
2638
  };
2634
2639
  }
2635
2640
  const rawBuffer = await readFile2(absolutePath);
2636
- const mediaType = getImageMediaType(absolutePath);
2637
- const buffer = await resizeImageIfNeeded(rawBuffer, mediaType);
2638
- const base64 = buffer.toString("base64");
2641
+ const originalMediaType = getImageMediaType(absolutePath);
2642
+ const resized = await resizeImageIfNeeded(rawBuffer, originalMediaType);
2643
+ const base64 = resized.buffer.toString("base64");
2639
2644
  return {
2640
2645
  success: true,
2641
2646
  path: absolutePath,
2642
2647
  relativePath: relative(options.workingDirectory, absolutePath),
2643
- content: `[Image: ${relativePath} (${mediaType}, ${(stats.size / 1024).toFixed(1)}KB)]`,
2644
- mediaType,
2648
+ content: `[Image: ${relativePath} (${resized.mediaType}, ${(stats.size / 1024).toFixed(1)}KB)]`,
2649
+ mediaType: resized.mediaType,
2645
2650
  imageData: base64,
2646
2651
  sizeBytes: stats.size
2647
2652
  };