39 lines
1.5 KiB
TypeScript
39 lines
1.5 KiB
TypeScript
import type { TeamConfig, TeamRole } from "./team-config.ts";
|
|
|
|
function line(key: string, value: string | string[] | undefined): string | undefined {
|
|
if (value === undefined) return undefined;
|
|
if (Array.isArray(value)) return `${key}: ${value.join(", ")}`;
|
|
return `${key}: ${value}`;
|
|
}
|
|
|
|
function serializeRole(role: TeamRole): string {
|
|
const parts = [`agent=${role.agent}`];
|
|
if (role.model) parts.push(`model=${role.model}`);
|
|
if (role.skills === false) parts.push("skills=false");
|
|
else if (role.skills?.length) parts.push(`skills=${role.skills.join(",")}`);
|
|
if (role.maxConcurrency !== undefined) parts.push(`maxConcurrency=${role.maxConcurrency}`);
|
|
if (role.description) parts.push(role.description);
|
|
return `- ${role.name}: ${parts.join(" ")}`;
|
|
}
|
|
|
|
export function serializeTeam(team: TeamConfig): string {
|
|
const lines = [
|
|
"---",
|
|
`name: ${team.name}`,
|
|
`description: ${team.description}`,
|
|
team.defaultWorkflow ? `defaultWorkflow: ${team.defaultWorkflow}` : undefined,
|
|
team.workspaceMode ? `workspaceMode: ${team.workspaceMode}` : undefined,
|
|
team.maxConcurrency !== undefined ? `maxConcurrency: ${team.maxConcurrency}` : undefined,
|
|
line("triggers", team.routing?.triggers),
|
|
line("useWhen", team.routing?.useWhen),
|
|
line("avoidWhen", team.routing?.avoidWhen),
|
|
line("cost", team.routing?.cost),
|
|
line("category", team.routing?.category),
|
|
"---",
|
|
"",
|
|
...team.roles.map(serializeRole),
|
|
"",
|
|
].filter((entry): entry is string => entry !== undefined);
|
|
return lines.join("\n");
|
|
}
|