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.
- package/dist/agent/index.d.ts +3 -3
- package/dist/agent/index.js +105 -19
- package/dist/agent/index.js.map +1 -1
- package/dist/cli.js +109 -23
- package/dist/cli.js.map +1 -1
- package/dist/db/index.d.ts +2 -2
- package/dist/{index-Cl_eUatM.d.ts → index-BAsQWqZj.d.ts} +96 -96
- package/dist/index.d.ts +5 -5
- package/dist/index.js +109 -23
- package/dist/index.js.map +1 -1
- package/dist/{schema-BSz4MzhJ.d.ts → schema-Dz-wABVY.d.ts} +3 -3
- package/dist/{search-DOzC4ojH.d.ts → search-CVVfuBPZ.d.ts} +4 -4
- package/dist/server/index.js +109 -23
- package/dist/server/index.js.map +1 -1
- package/dist/tools/index.d.ts +3 -3
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.html +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p/agents/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p/agents.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/!KG1haW4p.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/agents.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/installation.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs/installation.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/installation.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/skills.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs/skills.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/skills.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs/tools.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs/tools.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs/tools.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.html +2 -2
- package/web/.next/standalone/web/.next/server/app/docs.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/docs.segments/docs.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.html +1 -1
- package/web/.next/standalone/web/.next/server/app/index.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/!KG1haW4p.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.html +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p/settings/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p/settings.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/!KG1haW4p.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/web/.next/server/pages/404.html +1 -1
- package/web/.next/standalone/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/web/.next/server/server-reference-manifest.json +1 -1
- package/web/.next/standalone/web/runtime-config.json +2 -2
- package/web/.next/standalone/web/src/app/(main)/settings/page.tsx +1 -1
- /package/web/.next/standalone/web/.next/static/{EH_lLivb0xQQlTlBqPnCj → static/ySf1FIgV1p24IEJCK27zG}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{EH_lLivb0xQQlTlBqPnCj → static/ySf1FIgV1p24IEJCK27zG}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/{EH_lLivb0xQQlTlBqPnCj → static/ySf1FIgV1p24IEJCK27zG}/_ssgManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{static/EH_lLivb0xQQlTlBqPnCj → ySf1FIgV1p24IEJCK27zG}/_buildManifest.js +0 -0
- /package/web/.next/standalone/web/.next/static/{static/EH_lLivb0xQQlTlBqPnCj → ySf1FIgV1p24IEJCK27zG}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/web/.next/static/{static/EH_lLivb0xQQlTlBqPnCj → ySf1FIgV1p24IEJCK27zG}/_ssgManifest.js +0 -0
- /package/web/.next/static/{EH_lLivb0xQQlTlBqPnCj → ySf1FIgV1p24IEJCK27zG}/_buildManifest.js +0 -0
- /package/web/.next/static/{EH_lLivb0xQQlTlBqPnCj → ySf1FIgV1p24IEJCK27zG}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{EH_lLivb0xQQlTlBqPnCj → ySf1FIgV1p24IEJCK27zG}/_ssgManifest.js +0 -0
package/dist/agent/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import 'ai';
|
|
2
|
-
import '../schema-
|
|
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-
|
|
4
|
-
import '../search-
|
|
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';
|
package/dist/agent/index.js
CHANGED
|
@@ -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
|
|
2482
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
2543
|
-
|
|
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) =>
|
|
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,
|