sparkecoder 0.1.142 → 0.1.143

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 (111) hide show
  1. package/dist/agent/index.d.ts +3 -3
  2. package/dist/agent/index.js +105 -19
  3. package/dist/agent/index.js.map +1 -1
  4. package/dist/cli.js +109 -23
  5. package/dist/cli.js.map +1 -1
  6. package/dist/db/index.d.ts +2 -2
  7. package/dist/{index-Cl_eUatM.d.ts → index-BAsQWqZj.d.ts} +96 -96
  8. package/dist/index.d.ts +5 -5
  9. package/dist/index.js +109 -23
  10. package/dist/index.js.map +1 -1
  11. package/dist/{schema-BSz4MzhJ.d.ts → schema-Dz-wABVY.d.ts} +3 -3
  12. package/dist/{search-DOzC4ojH.d.ts → search-CVVfuBPZ.d.ts} +4 -4
  13. package/dist/server/index.js +109 -23
  14. package/dist/server/index.js.map +1 -1
  15. package/dist/tools/index.d.ts +3 -3
  16. package/package.json +1 -1
  17. package/web/.next/BUILD_ID +1 -1
  18. package/web/.next/standalone/web/.next/BUILD_ID +1 -1
  19. package/web/.next/standalone/web/.next/build-manifest.json +2 -2
  20. package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
  21. package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
  22. package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
  23. package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  24. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  25. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  26. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  27. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  28. package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
  29. package/web/.next/standalone/web/.next/server/app/_not-found.rsc +1 -1
  30. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  31. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  32. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  33. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  34. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  35. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  36. package/web/.next/standalone/web/.next/server/app/agents.html +1 -1
  37. package/web/.next/standalone/web/.next/server/app/agents.rsc +1 -1
  38. package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p/agents/__PAGE__.segment.rsc +1 -1
  39. package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p/agents.segment.rsc +1 -1
  40. package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p.segment.rsc +1 -1
  41. package/web/.next/standalone/web/.next/server/app/agents.segments/_full.segment.rsc +1 -1
  42. package/web/.next/standalone/web/.next/server/app/agents.segments/_head.segment.rsc +1 -1
  43. package/web/.next/standalone/web/.next/server/app/agents.segments/_index.segment.rsc +1 -1
  44. package/web/.next/standalone/web/.next/server/app/agents.segments/_tree.segment.rsc +1 -1
  45. package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
  46. package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +1 -1
  47. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +1 -1
  48. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
  49. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +1 -1
  50. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +1 -1
  51. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +1 -1
  52. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
  53. package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +1 -1
  54. package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
  55. package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +1 -1
  56. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +1 -1
  57. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
  58. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +1 -1
  59. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +1 -1
  60. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
  61. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
  62. package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +1 -1
  63. package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
  64. package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +1 -1
  65. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +1 -1
  66. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
  67. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +1 -1
  68. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +1 -1
  69. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +1 -1
  70. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
  71. package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +1 -1
  72. package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
  73. package/web/.next/standalone/web/.next/server/app/docs.rsc +1 -1
  74. package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +1 -1
  75. package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
  76. package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +1 -1
  77. package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +1 -1
  78. package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
  79. package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +1 -1
  80. package/web/.next/standalone/web/.next/server/app/index.html +1 -1
  81. package/web/.next/standalone/web/.next/server/app/index.rsc +1 -1
  82. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +1 -1
  83. package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +1 -1
  84. package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +1 -1
  85. package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  86. package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +1 -1
  87. package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  88. package/web/.next/standalone/web/.next/server/app/settings.html +1 -1
  89. package/web/.next/standalone/web/.next/server/app/settings.rsc +1 -1
  90. package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p/settings/__PAGE__.segment.rsc +1 -1
  91. package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p/settings.segment.rsc +1 -1
  92. package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p.segment.rsc +1 -1
  93. package/web/.next/standalone/web/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  94. package/web/.next/standalone/web/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  95. package/web/.next/standalone/web/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  96. package/web/.next/standalone/web/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  97. package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
  98. package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
  99. package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
  100. package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
  101. package/web/.next/standalone/web/runtime-config.json +2 -2
  102. package/web/.next/standalone/web/src/app/(main)/settings/page.tsx +1 -1
  103. /package/web/.next/standalone/web/.next/static/{EH_lLivb0xQQlTlBqPnCj → static/ySf1FIgV1p24IEJCK27zG}/_buildManifest.js +0 -0
  104. /package/web/.next/standalone/web/.next/static/{EH_lLivb0xQQlTlBqPnCj → static/ySf1FIgV1p24IEJCK27zG}/_clientMiddlewareManifest.json +0 -0
  105. /package/web/.next/standalone/web/.next/static/{EH_lLivb0xQQlTlBqPnCj → static/ySf1FIgV1p24IEJCK27zG}/_ssgManifest.js +0 -0
  106. /package/web/.next/standalone/web/.next/static/{static/EH_lLivb0xQQlTlBqPnCj → ySf1FIgV1p24IEJCK27zG}/_buildManifest.js +0 -0
  107. /package/web/.next/standalone/web/.next/static/{static/EH_lLivb0xQQlTlBqPnCj → ySf1FIgV1p24IEJCK27zG}/_clientMiddlewareManifest.json +0 -0
  108. /package/web/.next/standalone/web/.next/static/{static/EH_lLivb0xQQlTlBqPnCj → ySf1FIgV1p24IEJCK27zG}/_ssgManifest.js +0 -0
  109. /package/web/.next/static/{EH_lLivb0xQQlTlBqPnCj → ySf1FIgV1p24IEJCK27zG}/_buildManifest.js +0 -0
  110. /package/web/.next/static/{EH_lLivb0xQQlTlBqPnCj → ySf1FIgV1p24IEJCK27zG}/_clientMiddlewareManifest.json +0 -0
  111. /package/web/.next/static/{EH_lLivb0xQQlTlBqPnCj → ySf1FIgV1p24IEJCK27zG}/_ssgManifest.js +0 -0
@@ -1,6 +1,6 @@
1
1
  import 'ai';
2
- import '../schema-BSz4MzhJ.js';
3
- export { A as Agent, a as AgentOptions, b as AgentRunOptions, c as AgentStreamResult, C as ContextManager, M as MessageAttachment, d as buildSystemPrompt, e as buildTaskPromptAddendum } from '../index-Cl_eUatM.js';
4
- import '../search-DOzC4ojH.js';
2
+ import '../schema-Dz-wABVY.js';
3
+ export { A as Agent, a as AgentOptions, b as AgentRunOptions, c as AgentStreamResult, C as ContextManager, M as MessageAttachment, d as buildSystemPrompt, e as buildTaskPromptAddendum } from '../index-BAsQWqZj.js';
4
+ import '../search-CVVfuBPZ.js';
5
5
  import 'drizzle-orm/sqlite-core';
6
6
  import 'zod';
@@ -2478,8 +2478,31 @@ function formatBytes(n) {
2478
2478
  if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;
2479
2479
  return `${(n / 1024 / 1024).toFixed(2)} MB`;
2480
2480
  }
2481
- function sleep(ms) {
2482
- return new Promise((resolve11) => setTimeout(resolve11, ms));
2481
+ function abortError() {
2482
+ const err = new Error("aborted");
2483
+ err.name = "AbortError";
2484
+ return err;
2485
+ }
2486
+ function throwIfAborted(signal) {
2487
+ if (signal?.aborted) throw abortError();
2488
+ }
2489
+ function isAbortLike(err) {
2490
+ return err?.name === "AbortError" || String(err?.message || err).toLowerCase().includes("aborted");
2491
+ }
2492
+ function sleep(ms, signal) {
2493
+ throwIfAborted(signal);
2494
+ return new Promise((resolve11, reject) => {
2495
+ const t = setTimeout(() => {
2496
+ signal?.removeEventListener("abort", onAbort);
2497
+ resolve11();
2498
+ }, ms);
2499
+ const onAbort = () => {
2500
+ clearTimeout(t);
2501
+ signal?.removeEventListener("abort", onAbort);
2502
+ reject(abortError());
2503
+ };
2504
+ signal?.addEventListener("abort", onAbort, { once: true });
2505
+ });
2483
2506
  }
2484
2507
  function imageMagic(bytes) {
2485
2508
  if (bytes.length < 12) return null;
@@ -2499,19 +2522,21 @@ function validateDownloadedBytes(bytes, declaredContentType) {
2499
2522
  if (!actual) return "invalid_image_bytes";
2500
2523
  return null;
2501
2524
  }
2502
- async function fetchSlackPrivateFile(sourceUrl, botToken) {
2525
+ async function fetchSlackPrivateFile(sourceUrl, botToken, signal) {
2503
2526
  let lastError = "unknown";
2504
2527
  for (let attempt = 0; attempt < 3; attempt++) {
2505
2528
  try {
2529
+ throwIfAborted(signal);
2506
2530
  const res = await fetch(sourceUrl, {
2507
- headers: { Authorization: `Bearer ${botToken}` }
2531
+ headers: { Authorization: `Bearer ${botToken}` },
2532
+ signal
2508
2533
  });
2509
2534
  if (res.status === 429 || res.status >= 500) {
2510
2535
  lastError = `slack_fetch_${res.status}`;
2511
2536
  const retryAfter = Number(res.headers.get("retry-after"));
2512
2537
  const waitMs = Number.isFinite(retryAfter) && retryAfter > 0 ? Math.min(retryAfter * 1e3, 2e3) : 250 * (attempt + 1);
2513
2538
  if (attempt < 2) {
2514
- await sleep(waitMs);
2539
+ await sleep(waitMs, signal);
2515
2540
  continue;
2516
2541
  }
2517
2542
  }
@@ -2522,25 +2547,58 @@ async function fetchSlackPrivateFile(sourceUrl, botToken) {
2522
2547
  if (Number.isFinite(contentLength) && contentLength > MAX_BYTES) {
2523
2548
  return { ok: false, error: "size_exceeded" };
2524
2549
  }
2525
- const ab = await res.arrayBuffer();
2526
- if (ab.byteLength > MAX_BYTES) {
2527
- return { ok: false, error: "size_exceeded" };
2528
- }
2529
- return { ok: true, bytes: Buffer.from(ab) };
2550
+ return await readResponseBodyWithCap(res, signal);
2530
2551
  } catch (err) {
2552
+ if (isAbortLike(err) || signal?.aborted) {
2553
+ return { ok: false, error: "aborted" };
2554
+ }
2531
2555
  lastError = `slack_fetch_error:${err?.message || "unknown"}`;
2532
2556
  if (attempt < 2) {
2533
- await sleep(250 * (attempt + 1));
2557
+ await sleep(250 * (attempt + 1), signal);
2534
2558
  continue;
2535
2559
  }
2536
2560
  }
2537
2561
  }
2538
2562
  return { ok: false, error: lastError };
2539
2563
  }
2540
- function withTimeout(p, ms, label) {
2564
+ async function readResponseBodyWithCap(res, signal) {
2565
+ const body = res.body;
2566
+ if (!body) {
2567
+ const ab = await res.arrayBuffer();
2568
+ if (ab.byteLength > MAX_BYTES) return { ok: false, error: "size_exceeded" };
2569
+ return { ok: true, bytes: Buffer.from(ab) };
2570
+ }
2571
+ const reader = body.getReader();
2572
+ const chunks = [];
2573
+ let total = 0;
2574
+ try {
2575
+ while (true) {
2576
+ throwIfAborted(signal);
2577
+ const { done, value } = await reader.read();
2578
+ if (done) break;
2579
+ if (!value) continue;
2580
+ total += value.byteLength;
2581
+ if (total > MAX_BYTES) {
2582
+ await reader.cancel().catch(() => void 0);
2583
+ return { ok: false, error: "size_exceeded" };
2584
+ }
2585
+ chunks.push(Buffer.from(value));
2586
+ }
2587
+ } catch (err) {
2588
+ await reader.cancel().catch(() => void 0);
2589
+ if (isAbortLike(err) || signal?.aborted) return { ok: false, error: "aborted" };
2590
+ throw err;
2591
+ }
2592
+ return { ok: true, bytes: Buffer.concat(chunks, total) };
2593
+ }
2594
+ function withAbortTimeout(run, ms, label) {
2541
2595
  return new Promise((resolve11, reject) => {
2542
- const t = setTimeout(() => reject(new Error(`${label}_timeout`)), ms);
2543
- p.then(
2596
+ const controller = new AbortController();
2597
+ const t = setTimeout(() => {
2598
+ controller.abort();
2599
+ reject(new Error(`${label}_timeout`));
2600
+ }, ms);
2601
+ run(controller.signal).then(
2544
2602
  (v) => {
2545
2603
  clearTimeout(t);
2546
2604
  resolve11(v);
@@ -2552,7 +2610,8 @@ function withTimeout(p, ms, label) {
2552
2610
  );
2553
2611
  });
2554
2612
  }
2555
- async function ingestOne(file, sessionId, botToken) {
2613
+ async function ingestOne(file, sessionId, botToken, signal) {
2614
+ throwIfAborted(signal);
2556
2615
  const fileName = inferFileName(file);
2557
2616
  const contentType = inferContentType(file);
2558
2617
  const declaredSize = typeof file.size === "number" ? file.size : 0;
@@ -2570,7 +2629,8 @@ async function ingestOne(file, sessionId, botToken) {
2570
2629
  return { ...base, shortUrl: null, error: "size_exceeded" };
2571
2630
  }
2572
2631
  let bytes;
2573
- const fetched = await fetchSlackPrivateFile(sourceUrl, botToken);
2632
+ const fetched = await fetchSlackPrivateFile(sourceUrl, botToken, signal);
2633
+ throwIfAborted(signal);
2574
2634
  if (!fetched.ok) {
2575
2635
  return { ...base, shortUrl: null, error: fetched.error };
2576
2636
  }
@@ -2583,18 +2643,27 @@ async function ingestOne(file, sessionId, botToken) {
2583
2643
  return { ...base, sizeBytes: bytes.length, shortUrl: null, error: byteError };
2584
2644
  }
2585
2645
  const { storageQueries: storageQueries2 } = await Promise.resolve().then(() => (init_remote(), remote_exports));
2586
- let upload;
2646
+ let upload = null;
2587
2647
  try {
2648
+ throwIfAborted(signal);
2588
2649
  upload = await storageQueries2.getUploadUrl(sessionId, fileName, contentType, "slack");
2650
+ throwIfAborted(signal);
2589
2651
  } catch (err) {
2652
+ if (isAbortLike(err) || signal.aborted) {
2653
+ if (upload?.fileId) await cleanupAbortedUpload(storageQueries2, upload.fileId);
2654
+ throw err;
2655
+ }
2590
2656
  return { ...base, sizeBytes: bytes.length, shortUrl: null, error: `presign_failed:${err?.message || "unknown"}` };
2591
2657
  }
2592
2658
  try {
2659
+ throwIfAborted(signal);
2593
2660
  const putRes = await fetch(upload.uploadUrl, {
2594
2661
  method: "PUT",
2595
2662
  headers: { "Content-Type": contentType },
2596
- body: bytes
2663
+ body: bytes,
2664
+ signal
2597
2665
  });
2666
+ throwIfAborted(signal);
2598
2667
  if (!putRes.ok) {
2599
2668
  return {
2600
2669
  ...base,
@@ -2604,6 +2673,10 @@ async function ingestOne(file, sessionId, botToken) {
2604
2673
  };
2605
2674
  }
2606
2675
  } catch (err) {
2676
+ if (isAbortLike(err) || signal.aborted) {
2677
+ await cleanupAbortedUpload(storageQueries2, upload.fileId);
2678
+ throw err;
2679
+ }
2607
2680
  return {
2608
2681
  ...base,
2609
2682
  sizeBytes: bytes.length,
@@ -2612,8 +2685,13 @@ async function ingestOne(file, sessionId, botToken) {
2612
2685
  };
2613
2686
  }
2614
2687
  try {
2688
+ throwIfAborted(signal);
2615
2689
  await storageQueries2.updateFile(upload.fileId, { sizeBytes: bytes.length });
2616
2690
  } catch (err) {
2691
+ if (isAbortLike(err) || signal.aborted) {
2692
+ await cleanupAbortedUpload(storageQueries2, upload.fileId);
2693
+ throw err;
2694
+ }
2617
2695
  console.warn(`[slack-files] sizeBytes patch failed for ${upload.fileId}:`, err?.message || err);
2618
2696
  }
2619
2697
  const shortUrl = upload.shortUrl || // Defensive fallback: build it from the upload URL's origin if the
@@ -2625,6 +2703,14 @@ async function ingestOne(file, sessionId, botToken) {
2625
2703
  shortUrl
2626
2704
  };
2627
2705
  }
2706
+ async function cleanupAbortedUpload(storageQueries2, fileId) {
2707
+ if (typeof storageQueries2?.deleteFile !== "function") return;
2708
+ try {
2709
+ await storageQueries2.deleteFile(fileId);
2710
+ } catch (err) {
2711
+ console.warn(`[slack-files] cleanup after aborted upload failed for ${fileId}:`, err?.message || err);
2712
+ }
2713
+ }
2628
2714
  function inferShortUrlFromUploadUrl(uploadUrl, fileId) {
2629
2715
  try {
2630
2716
  const u = new URL(uploadUrl);
@@ -2664,7 +2750,7 @@ async function ingestSlackFiles(files, sessionId, options = {}) {
2664
2750
  const startedAt = Date.now();
2665
2751
  const pipeline = Promise.allSettled(
2666
2752
  files.map(
2667
- (f) => withTimeout(ingestOne(f, sessionId, botToken), timeoutMs, `ingest:${f.id}`).catch((err) => {
2753
+ (f) => withAbortTimeout((signal) => ingestOne(f, sessionId, botToken, signal), timeoutMs, `ingest:${f.id}`).catch((err) => {
2668
2754
  if (String(err?.message || err).includes("_timeout")) {
2669
2755
  return {
2670
2756
  slackFileId: f.id,