UNPKG

@sema-agent/core

Version:

Stateless, task-oriented AI agent core

40 lines (39 loc) • 1.61 kB
import { announceEnvKnob } from "./env-knob-announce.js"; const ENV_SCIENTIFIC_RE = /^[+-]?(\d+(\.\d*)?|\.\d+)[eE][+-]?\d+$/; const ENV_GROUPED_RE = /^[+-]?\d{1,3}([_,\u00A0\u202F ])\d{3}(?:\1\d{3})*$/; const ENV_GROUP_SEPARATORS_RE = /[_,\u00A0\u202F ]/g; const ENV_NUMERIC_MAX_LEN = 32; export function parseWholeNumber(raw) { if (/^[+-]?\d+$/.test(raw)) { const n = Number(raw); return Number.isSafeInteger(n) ? n : undefined; } if (raw.length > ENV_NUMERIC_MAX_LEN) return undefined; if (ENV_SCIENTIFIC_RE.test(raw)) { const n = Number(raw); return Number.isSafeInteger(n) ? n : undefined; } if (ENV_GROUPED_RE.test(raw)) return parseInt(raw.replace(ENV_GROUP_SEPARATORS_RE, ""), 10); return undefined; } export function resolveEnvBudget(rawEnv, spec) { if (rawEnv === undefined || rawEnv.trim() === "") return spec.default; const raw = rawEnv.trim(); const n = parseWholeNumber(raw); if (n === undefined || n <= 0) { announceEnvKnob(`${spec.name}=${rawEnv} was ignored — it is not a positive whole number of ${spec.unit}. Using ${spec.default === undefined ? "the built-in default" : spec.default} instead.`); return spec.default; } if (spec.max !== undefined && n > spec.max) { announceEnvKnob(`${spec.name}=${rawEnv} Capped from ${n} to ${spec.max}.`); return spec.max; } if (spec.min !== undefined && n < spec.min) { announceEnvKnob(`${spec.name}=${rawEnv} Raised from ${n} to ${spec.min}.`); return spec.min; } return n; }