{"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":69,"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":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/abhigyanpatwari/GitNexus/blob/d540b00184d71a896261ee02670da9a92d59d8f7/gitnexus/src/core/embeddings/http-client.ts#L51-L87","documentation":"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).","triggerScenarios":"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.","commonSituations":"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.","solutions":["Set GITNEXUS_EMBEDDING_MIN_INTERVAL_MS to a non-negative integer of milliseconds, e.g. 200.","Set it to 0 (or unset) to disable request pacing.","Keep the value ≤ 300000 (5 minutes), the ceiling."],"exampleFix":"# before\nexport GITNEXUS_EMBEDDING_MIN_INTERVAL_MS=100ms\n# after\nexport GITNEXUS_EMBEDDING_MIN_INTERVAL_MS=100","handlingStrategy":"validation","validationCode":"const v = process.env.GITNEXUS_EMBEDDING_MIN_INTERVAL_MS;\nif (v !== undefined && v !== '' && !/^\\d+$/u.test(v)) {\n  throw new Error('GITNEXUS_EMBEDDING_MIN_INTERVAL_MS must be a non-negative integer of milliseconds.');\n}","typeGuard":"const isNonNegativeDigits = (v: string | undefined): boolean =>\n  v === undefined || v === '' || /^\\d+$/u.test(v);","tryCatchPattern":null,"preventionTips":["Set GITNEXUS_EMBEDDING_MIN_INTERVAL_MS as a bare non-negative integer of milliseconds.","Use 0 (or unset) to disable request pacing.","Avoid unit suffixes like '100ms'."],"tags":["config","env-var","embeddings","http-mode","validation"],"backgroundTag":null,"analyzedSha":"d540b00184d71a896261ee02670da9a92d59d8f7","analyzedAt":"2026-08-12T19:50:25.132Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}