refactor: require codex sentinel model endpoint yaml

This commit is contained in:
Codex
2026-06-14 07:48:18 +00:00
parent 268b458853
commit a898610d30
@@ -205,8 +205,8 @@ export function readCodexPoolSentinelConfig(value: unknown, defaults: CodexPoolS
cronJobName: readRequiredDnsName(valueAt(value, "cronJobName"), `${sourcePath}.sentinel.cronJobName`),
roleName: readRequiredDnsName(valueAt(value, "roleName"), `${sourcePath}.sentinel.roleName`),
roleBindingName: readRequiredDnsName(valueAt(value, "roleBindingName"), `${sourcePath}.sentinel.roleBindingName`),
model: readModelName(valueAt(value, "model"), `${sourcePath}.sentinel.model`, defaults.model),
endpoint: "responses",
model: readRequiredModelName(valueAt(value, "model"), `${sourcePath}.sentinel.model`),
endpoint: readRequiredEndpoint(valueAt(value, "endpoint"), `${sourcePath}.sentinel.endpoint`),
marker: {
prefix: readMarkerPrefix(valueAt(marker, "prefix"), `${sourcePath}.sentinel.marker.prefix`, defaults.marker.prefix),
exact: readBoolean(valueAt(marker, "exact"), `${sourcePath}.sentinel.marker.exact`, defaults.marker.exact),
@@ -2106,20 +2106,30 @@ function readDnsName(value: unknown, key: string, fallback: string): string {
}
function readRequiredDnsName(value: unknown, key: string): string {
if (value === undefined || value === null) throw new Error(`${key} is required`);
if (typeof value !== "string" || value.trim().length === 0) throw new Error(`${key} must be a non-empty string`);
if (/[\r\n]/u.test(value)) throw new Error(`${key} must not contain newlines`);
const text = value.trim();
const text = readRequiredString(value, key);
if (!/^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/u.test(text)) throw new Error(`${key} must be a Kubernetes DNS label`);
return text;
}
function readModelName(value: unknown, key: string, fallback: string): string {
const text = readString(value, key, fallback);
function readRequiredModelName(value: unknown, key: string): string {
const text = readRequiredString(value, key);
if (!/^[A-Za-z0-9._:-]+$/u.test(text)) throw new Error(`${key} has an unsupported model name`);
return text;
}
function readRequiredEndpoint(value: unknown, key: string): "responses" {
const text = readRequiredString(value, key);
if (text !== "responses") throw new Error(`${key} must be responses`);
return text;
}
function readRequiredString(value: unknown, key: string): string {
if (value === undefined || value === null) throw new Error(`${key} is required`);
if (typeof value !== "string" || value.trim().length === 0) throw new Error(`${key} must be a non-empty string`);
if (/[\r\n]/u.test(value)) throw new Error(`${key} must not contain newlines`);
return value.trim();
}
function readMarkerPrefix(value: unknown, key: string, fallback: string): string {
const text = readString(value, key, fallback);
if (!/^[A-Za-z0-9_-]{2,32}$/u.test(text)) throw new Error(`${key} must be 2-32 chars of letters, digits, _ or -`);