chore: read agentrun hwlab defaults from yaml

This commit is contained in:
Codex
2026-06-14 12:55:47 +00:00
parent 6418d7ace6
commit 1fbfecfaf1
6 changed files with 98 additions and 4 deletions
+34 -1
View File
@@ -216,6 +216,10 @@ interface HwlabLaneConfig {
}
interface HwlabNodeLaneConfig {
readonly defaultTarget: {
readonly node: string;
readonly lane: HwlabRuntimeLane;
};
readonly requiredNoProxy: readonly string[];
readonly nodes: Record<string, HwlabRuntimeNodeSpec>;
readonly lanes: Record<HwlabRuntimeLane, HwlabLaneConfig>;
@@ -572,6 +576,8 @@ function readHwlabNodeLaneConfig(): HwlabNodeLaneConfig {
const path = rootPath(HWLAB_NODE_LANE_CONFIG_PATH);
const raw = readFileSync(path, "utf8");
const parsed = asRecord(Bun.YAML.parse(raw) as unknown, HWLAB_NODE_LANE_CONFIG_PATH);
validateConfigEnvelope(parsed);
const defaultTarget = parseDefaultTarget(asRecord(parsed.defaults, `${HWLAB_NODE_LANE_CONFIG_PATH}.defaults`));
const requiredNoProxy = stringArrayField(parsed, "requiredNoProxy", HWLAB_NODE_LANE_CONFIG_PATH);
for (const required of ["hyueapi.com", ".hyueapi.com"]) {
if (!requiredNoProxy.includes(required)) throw new Error(`${HWLAB_NODE_LANE_CONFIG_PATH}.requiredNoProxy must include ${required}`);
@@ -603,7 +609,30 @@ function readHwlabNodeLaneConfig(): HwlabNodeLaneConfig {
for (const lane of [...Object.values(lanes), ...Object.values(laneTargets).flatMap((targets) => Object.values(targets))]) {
if (nodes[lane.node] === undefined) throw new Error(`lanes.${lane.id}.node references missing node ${lane.node}`);
}
return { requiredNoProxy, nodes, lanes, laneTargets, networkProfiles, downloadProfiles };
if (nodes[defaultTarget.node] === undefined) throw new Error(`${HWLAB_NODE_LANE_CONFIG_PATH}.defaults.node references missing node ${defaultTarget.node}`);
const defaultLane = laneTargets[defaultTarget.lane]?.[defaultTarget.node] ?? lanes[defaultTarget.lane];
if (defaultLane === undefined || defaultLane.node !== defaultTarget.node) {
throw new Error(`${HWLAB_NODE_LANE_CONFIG_PATH}.defaults must reference a declared lane target`);
}
return { defaultTarget, requiredNoProxy, nodes, lanes, laneTargets, networkProfiles, downloadProfiles };
}
function validateConfigEnvelope(parsed: Record<string, unknown>): void {
if (parsed.version !== 1) throw new Error(`${HWLAB_NODE_LANE_CONFIG_PATH}.version must be 1`);
if (parsed.kind !== "HwlabNodeLaneConfig") throw new Error(`${HWLAB_NODE_LANE_CONFIG_PATH}.kind must be HwlabNodeLaneConfig`);
const metadata = asRecord(parsed.metadata, `${HWLAB_NODE_LANE_CONFIG_PATH}.metadata`);
if (stringField(metadata, "name", `${HWLAB_NODE_LANE_CONFIG_PATH}.metadata`) !== "hwlab-node-lanes") {
throw new Error(`${HWLAB_NODE_LANE_CONFIG_PATH}.metadata.name must be hwlab-node-lanes`);
}
}
function parseDefaultTarget(raw: Record<string, unknown>): { readonly node: string; readonly lane: HwlabRuntimeLane } {
const lane = stringField(raw, "lane", `${HWLAB_NODE_LANE_CONFIG_PATH}.defaults`);
if (!isSupportedLaneId(lane)) throw new Error(`${HWLAB_NODE_LANE_CONFIG_PATH}.defaults.lane is not supported by this CLI build`);
return {
node: stringField(raw, "node", `${HWLAB_NODE_LANE_CONFIG_PATH}.defaults`),
lane,
};
}
const HWLAB_NODE_LANE_CONFIG = readHwlabNodeLaneConfig();
@@ -689,6 +718,10 @@ export function hwlabRuntimeNodeIds(): string[] {
return Object.keys(HWLAB_NODE_LANE_CONFIG.nodes);
}
export function hwlabDefaultRuntimeTarget(): { readonly node: string; readonly lane: HwlabRuntimeLane } {
return { ...HWLAB_NODE_LANE_CONFIG.defaultTarget };
}
export function hwlabRuntimeLaneConfigPath(): string {
return HWLAB_NODE_LANE_CONFIG_PATH;
}