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 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 result = await timedScanPromise;
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,