seaworthycode 1.2.10 → 1.2.12
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/index.js +30 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -5904,19 +5904,41 @@ function classifyError(err) {
|
|
|
5904
5904
|
if (err instanceof Error && err.name === "TimeoutError") return "llm.timeout";
|
|
5905
5905
|
if (err instanceof DOMException && (err.name === "TimeoutError" || err.name === "AbortError")) return "llm.timeout";
|
|
5906
5906
|
if (err instanceof Error && /rate|429|too many/i.test(err.message)) return "llm.rate_limited";
|
|
5907
|
+
if (err instanceof Error && /auth|401|unauthorized|invalid.*key/i.test(err.message)) return "llm.auth_error";
|
|
5907
5908
|
return "llm.unexpected";
|
|
5908
5909
|
}
|
|
5910
|
+
var LLM_TIMEOUT_MS = 9e4;
|
|
5911
|
+
function withLLMTimeout(promise, ms) {
|
|
5912
|
+
return new Promise((resolve22, reject) => {
|
|
5913
|
+
const timerId = setTimeout(() => {
|
|
5914
|
+
const err = new Error("LLM request timed out");
|
|
5915
|
+
err.name = "TimeoutError";
|
|
5916
|
+
reject(err);
|
|
5917
|
+
}, ms);
|
|
5918
|
+
promise.then(
|
|
5919
|
+
(value) => {
|
|
5920
|
+
clearTimeout(timerId);
|
|
5921
|
+
resolve22(value);
|
|
5922
|
+
},
|
|
5923
|
+
(err) => {
|
|
5924
|
+
clearTimeout(timerId);
|
|
5925
|
+
reject(err);
|
|
5926
|
+
}
|
|
5927
|
+
);
|
|
5928
|
+
});
|
|
5929
|
+
}
|
|
5909
5930
|
async function callLLMWithRetry(llm, prompt, checkId) {
|
|
5910
5931
|
let lastError;
|
|
5911
5932
|
const delays = [0, 2e3];
|
|
5912
5933
|
for (let attempt = 0; attempt < delays.length; attempt++) {
|
|
5913
5934
|
try {
|
|
5914
5935
|
if (attempt > 0) await new Promise((r) => setTimeout(r, delays[attempt]));
|
|
5915
|
-
return await llm.complete(prompt);
|
|
5936
|
+
return await withLLMTimeout(llm.complete(prompt), LLM_TIMEOUT_MS);
|
|
5916
5937
|
} catch (err) {
|
|
5917
5938
|
lastError = err;
|
|
5918
5939
|
if (err instanceof LLMResponseError) break;
|
|
5919
5940
|
if (err instanceof Error && /rate|429/i.test(err.message)) break;
|
|
5941
|
+
if (err instanceof Error && /auth|401|unauthorized|invalid.*key/i.test(err.message)) break;
|
|
5920
5942
|
}
|
|
5921
5943
|
}
|
|
5922
5944
|
const code = classifyError(lastError);
|
|
@@ -16106,7 +16128,13 @@ async function executeScan(args, ctx) {
|
|
|
16106
16128
|
getCopy("errors.scan.timed_out", Math.round(checkIdleMs / 1e3))
|
|
16107
16129
|
);
|
|
16108
16130
|
heartbeat = hb;
|
|
16109
|
-
const
|
|
16131
|
+
const keepAlive = setInterval(() => heartbeat(), 3e4);
|
|
16132
|
+
let result;
|
|
16133
|
+
try {
|
|
16134
|
+
result = await timedScanPromise;
|
|
16135
|
+
} finally {
|
|
16136
|
+
clearInterval(keepAlive);
|
|
16137
|
+
}
|
|
16110
16138
|
const reportInput = {
|
|
16111
16139
|
findings: result.findings,
|
|
16112
16140
|
targetDir: args.targetDir,
|