{"record":{"id":"f92462cb7208c9c6","repo":"abhigyanpatwari/GitNexus","slug":"name-must-be-a-non-negative-integer-got-raw","errorCode":null,"errorMessage":"${name} must be a non-negative integer, got \"${raw}\"","messagePattern":"(.+?) must be a non-negative integer, got \"(.+?)\"","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"gitnexus/src/core/embeddings/http-client.ts","lineNumber":71,"sourceCode":"\nconst parsePositiveIntegerEnv = (name: string, fallback: number, max: number): number => {\n  const raw = process.env[name];\n  if (raw === undefined || raw === '') return fallback;\n  if (!/^\\d+$/u.test(raw)) {\n    throw new Error(`${name} must be a positive integer, got \"${raw}\"`);\n  }\n  const parsed = Number(raw);\n  if (!Number.isSafeInteger(parsed) || parsed <= 0 || parsed > max) {\n    throw new Error(`${name} must be a positive integer <= ${max}, got \"${raw}\"`);\n  }\n  return parsed;\n};\n\nconst parseNonNegativeIntegerEnv = (name: string, fallback: number, max: number): number => {\n  const raw = process.env[name];\n  if (raw === undefined || raw === '') return fallback;\n  if (!/^\\d+$/u.test(raw)) {\n    throw new Error(`${name} must be a non-negative integer, got \"${raw}\"`);\n  }\n  const parsed = Number(raw);\n  if (!Number.isSafeInteger(parsed) || parsed < 0 || parsed > max) {\n    throw new Error(`${name} must be a non-negative integer <= ${max}, got \"${raw}\"`);\n  }\n  return parsed;\n};\n\nconst cancelledError = (): DOMException =>\n  new DOMException('Embedding request cancelled', 'AbortError');\n\nconst throwIfAborted = (signal?: AbortSignal): void => {\n  if (signal?.aborted) throw cancelledError();\n};\n\nconst abortableSleep = (ms: number, signal?: AbortSignal): Promise<void> => {\n  throwIfAborted(signal);\n  if (ms <= 0) return Promise.resolve();","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/abhigyanpatwari/GitNexus/blob/ac9a4e9abd8fd3058c070b72c23402a4f887929a/gitnexus/src/core/embeddings/http-client.ts#L53-L89","documentation":"parseNonNegativeIntegerEnv() rejects non-digit values for GITNEXUS_EMBEDDING_MIN_INTERVAL_MS (the HTTP pacing floor between requests; fallback 0, max 300000). Unlike the positive variant, 0 is legal here — but '0x10', '1.5', '-5', or '1e3' still throw.","triggerScenarios":"Setting GITNEXUS_EMBEDDING_MIN_INTERVAL_MS to a float, hex, negative, or whitespace-polluted value while HTTP embedding mode (GITNEXUS_EMBEDDING_URL + GITNEXUS_EMBEDDING_MODEL) is active, then triggering any embed call that reads config.","commonSituations":"Throttling configuration copied from a provider docs page that uses decimals ('0.5 req/s') or units ('100ms'), or values injected via CI with stray quotes.","solutions":["Use a bare integer of milliseconds: GITNEXUS_EMBEDDING_MIN_INTERVAL_MS=100.","Unset the variable to use the default pacing (0).","Verify no hidden characters in the value (the regex ^\\d+$ is strict)."],"exampleFix":"# before\nexport GITNEXUS_EMBEDDING_MIN_INTERVAL_MS='100ms'\n# after\nexport GITNEXUS_EMBEDDING_MIN_INTERVAL_MS=100","handlingStrategy":"validation","validationCode":"const raw = process.env.GITNEXUS_EMBEDDING_MIN_INTERVAL_MS;\nif (raw !== undefined && raw !== '' && !/^\\d+$/.test(raw)) {\n  throw new Error('GITNEXUS_EMBEDDING_MIN_INTERVAL_MS must be digits (milliseconds)');\n}","typeGuard":"const isEnvFormatError = (e: unknown): boolean =>\n  e instanceof Error && /must be a non-negative integer, got/.test(e.message);","tryCatchPattern":"try {\n  await httpEmbed(texts);\n} catch (e) {\n  if (isEnvFormatError(e)) { /* fix or unset the env var; non-retryable config error */ }\n  else throw e;\n}","preventionTips":["Express pacing as whole milliseconds ('100'), never '100ms' or '0.1s'.","0 is valid for the min-interval knob (no pacing) unlike the attempt/timeout knobs."],"tags":["embeddings","environment-variable","configuration","validation","rate-limiting"],"backgroundTag":"invalid-env-var","analyzedSha":"ac9a4e9abd8fd3058c070b72c23402a4f887929a","analyzedAt":"2026-08-20T23:29:22.980Z","contentChangedAt":"2026-08-20T23:29:22.980Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}