abhigyanpatwari/GitNexus · error · Error

${name} must be a non-negative integer <= ${max}, got "${raw

Error message

${name} must be a non-negative integer <= ${max}, got "${raw}"

What it means

Thrown by parseNonNegativeIntegerEnv() in http-client.ts when GITNEXUS_EMBEDDING_MIN_INTERVAL_MS passes the digits-only regex but Number(raw) is not a safe integer, is negative, or exceeds the max (300000ms = 5 minutes). The ceiling prevents an accidental multi-hour pacing interval that would stall every batch.

Source

Thrown at gitnexus/src/core/embeddings/http-client.ts:73

  if (!/^\d+$/u.test(raw)) {
    throw new Error(`${name} must be a positive integer, got "${raw}"`);
  }
  const parsed = Number(raw);
  if (!Number.isSafeInteger(parsed) || parsed <= 0 || parsed > max) {
    throw new Error(`${name} must be a positive integer <= ${max}, got "${raw}"`);
  }
  return parsed;
};

const parseNonNegativeIntegerEnv = (name: string, fallback: number, max: number): number => {
  const raw = process.env[name];
  if (raw === undefined || raw === '') return fallback;
  if (!/^\d+$/u.test(raw)) {
    throw new Error(`${name} must be a non-negative integer, got "${raw}"`);
  }
  const parsed = Number(raw);
  if (!Number.isSafeInteger(parsed) || parsed < 0 || parsed > max) {
    throw new Error(`${name} must be a non-negative integer <= ${max}, got "${raw}"`);
  }
  return parsed;
};

const cancelledError = (): DOMException =>
  new DOMException('Embedding request cancelled', 'AbortError');

const throwIfAborted = (signal?: AbortSignal): void => {
  if (signal?.aborted) throw cancelledError();
};

const abortableSleep = (ms: number, signal?: AbortSignal): Promise<void> => {
  throwIfAborted(signal);
  if (ms <= 0) return Promise.resolve();
  return new Promise((resolve, reject) => {
    const timer = setTimeout(() => {
      signal?.removeEventListener('abort', onAbort);
      resolve();

View on GitHub (pinned to d540b00184)

Solutions

  1. Set GITNEXUS_EMBEDDING_MIN_INTERVAL_MS to a value between 0 and 300000 inclusive.
  2. Unset it to accept the default of 0 (no pacing).
  3. If the endpoint needs stricter rate limiting than 5 min between calls, raise the retry/backoff config instead.

Example fix

# before
export GITNEXUS_EMBEDDING_MIN_INTERVAL_MS=600000
# after
export GITNEXUS_EMBEDDING_MIN_INTERVAL_MS=300000  # the 5-minute ceiling
Defensive patterns

Strategy: validation

Validate before calling

const v = process.env.GITNEXUS_EMBEDDING_MIN_INTERVAL_MS;
if (v !== undefined && v !== '') {
  const n = Number(v);
  if (!Number.isSafeInteger(n) || n < 0 || n > 300_000) {
    throw new Error('GITNEXUS_EMBEDDING_MIN_INTERVAL_MS must be 0..300000 ms.');
  }
}

Type guard

const isWithinNonNegativeCeiling = (v: string, max: number): boolean => {
  const n = Number(v);
  return Number.isSafeInteger(n) && n >= 0 && n <= max;
};

Prevention

When it happens

Trigger: readConfig() at http-client.ts:199. Fires on e.g. GITNEXUS_EMBEDDING_MIN_INTERVAL_MS=999999 (over 5 min ceiling) or a value beyond Number.MAX_SAFE_INTEGER.

Common situations: Setting a huge interval to rate-limit a strict endpoint without realizing the cap exists; copy-pasting a microseconds value where milliseconds were expected.

Related errors


AI-assisted analysis of abhigyanpatwari/GitNexus@d540b00184 (2026-08-12). Data as JSON: /api/errors/0369e473e569803d. Report an issue: GitHub.