Files
pi-config/extensions/pi-crew/src/teams/team-serializer.ts

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");
}