chore: read agentrun hwlab defaults from yaml
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user