abhigyanpatwari/GitNexus · error · Error

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

Error message

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

What it means

Thrown by parseNonNegativeIntegerEnv() in http-client.ts when GITNEXUS_EMBEDDING_MIN_INTERVAL_MS is set to a value that fails the /^\d+$/u regex. Unlike the positive-integer parser, this one allows 0 (the default — no pacing), so the regex check is the only thing that catches non-digit input. The check fires before the range check (error 118).

Source

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

const parsePositiveIntegerEnv = (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 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();

View on GitHub (pinned to d540b00184)

Solutions

  1. Set GITNEXUS_EMBEDDING_MIN_INTERVAL_MS to a non-negative integer of milliseconds, e.g. 200.
  2. Set it to 0 (or unset) to disable request pacing.
  3. Keep the value ≤ 300000 (5 minutes), the ceiling.

Example fix

# before
export GITNEXUS_EMBEDDING_MIN_INTERVAL_MS=100ms
# after
export GITNEXUS_EMBEDDING_MIN_INTERVAL_MS=100
Defensive patterns

Strategy: validation

Validate before calling

const v = process.env.GITNEXUS_EMBEDDING_MIN_INTERVAL_MS;
if (v !== undefined && v !== '' && !/^\d+$/u.test(v)) {
  throw new Error('GITNEXUS_EMBEDDING_MIN_INTERVAL_MS must be a non-negative integer of milliseconds.');
}

Type guard

const isNonNegativeDigits = (v: string | undefined): boolean =>
  v === undefined || v === '' || /^\d+$/u.test(v);

Prevention

When it happens

Trigger: readConfig() calls parseNonNegativeIntegerEnv('GITNEXUS_EMBEDDING_MIN_INTERVAL_MS', 0, 300000) at http-client.ts:199. Fires on e.g. GITNEXUS_EMBEDDING_MIN_INTERVAL_MS=-100 (leading -), =1.5, =100ms, =auto.

Common situations: Adding a unit suffix (100ms) when a bare integer is required; using a negative value to mean 'no limit' (use 0 instead); a YAML/computed value that became a float or string.

Related errors


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