abhigyanpatwari/GitNexus · error · Error
must be a positive integer <= , got
Error message
${name} must be a positive integer <= ${max}, got "${raw}" What it means
parsePositiveIntegerEnv() second guard: the value is all digits but Number(raw) is not a safe positive integer within the variable's cap (GITNEXUS_EMBEDDING_MAX_ATTEMPTS ≤ 20; GITNEXUS_EMBEDDING_RETRY_CAP_MS ≤ 300000; GITNEXUS_EMBEDDING_HTTP_TIMEOUT_MS ≤ 300000). '0' hits this too — zero is not positive.
Solutions
- Lower the value to the maximum stated in the message (e.g. timeout ≤ 300000 ms).
- Use a value ≥ 1; to get default behavior unset the variable entirely.
- Double-check units — these knobs are milliseconds, not seconds, and attempts, not retries.
Example fix
# before export GITNEXUS_EMBEDDING_HTTP_TIMEOUT_MS=600000 # 10min > 300000 cap # after export GITNEXUS_EMBEDDING_HTTP_TIMEOUT_MS=300000
Defensive patterns
Strategy: validation
Validate before calling
const LIMITS: Record<string, number> = {
GITNEXUS_EMBEDDING_MAX_ATTEMPTS: 20,
GITNEXUS_EMBEDDING_RETRY_CAP_MS: 300_000,
GITNEXUS_EMBEDDING_HTTP_TIMEOUT_MS: 300_000,
};
for (const [name, max] of Object.entries(LIMITS)) {
const v = Number(process.env[name]);
if (process.env[name] && (!Number.isSafeInteger(v) || v <= 0 || v > max)) {
throw new Error(`${name} must be 1..${max}`);
}
} Type guard
const isEnvRangeError = (e: unknown): boolean => e instanceof Error && /must be a positive integer <=/.test(e.message);
Try / catch
try {
await httpEmbed(texts);
} catch (e) {
if (isEnvRangeError(e)) { /* fix the value cited in the message; non-retryable */ }
else throw e;
} Prevention
- Remember the caps: attempts ≤ 20, retry-cap ≤ 300000 ms, HTTP timeout ≤ 300000 ms.
- All durations are milliseconds; 0 is invalid for these three knobs.
- Codify the caps in your config management so bad values never reach runtime.
When it happens
Trigger: GITNEXUS_EMBEDDING_MAX_ATTEMPTS=0 or 21+, GITNEXUS_EMBEDDING_RETRY_CAP_MS=999999, GITNEXUS_EMBEDDING_HTTP_TIMEOUT_MS=600000, or absurd values like '99999999999999999999' that exceed Number.MAX_SAFE_INTEGER.
Common situations: Users pasting millisecond values in seconds ('180000' vs intended '180'), setting MAX_ATTEMPTS=0 to 'disable retries' (not supported — unset it instead), or copying a cap-busting timeout from another tool's config.
Related errors
- must be a positive integer, got
- Embedding request failed
- GITNEXUS_EMBEDDING_DIMS must be a positive integer, got
- GITNEXUS_EMBEDDING_REQUEST_DIMS must be a positive integer…
- must be a non-negative integer, got
AI-assisted analysis of abhigyanpatwari/GitNexus@ac9a4e9abd (2026-08-20).
Data as JSON: /api/errors/88b382fc1aa22cf9.
Report an issue: GitHub.
Appendix: source
Thrown at gitnexus/src/core/embeddings/http-client.ts:62
requestDimensions?: number;
}
export interface EmbeddingRequestOptions {
signal?: AbortSignal;
}
let lastHttpRequestStartedAt: number | undefined;
let httpPaceQueue: Promise<void> = Promise.resolve();
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 =>View on GitHub (pinned to ac9a4e9abd)