@sema-agent/core
Version:
Stateless, task-oriented AI agent core
40 lines (39 loc) • 1.61 kB
JavaScript
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;
}