import { callable, getAgentByName } from "agents"; import { PlaygroundAgent as Agent } from "../../shared/playground-agent"; import type { ChildAgent, ChildState } from "./child-agent"; export interface SupervisorState { childIds: string[]; } export class SupervisorAgent extends Agent { initialState: SupervisorState = { childIds: [] }; @callable({ description: "Create a new child agent" }) async createChild( childId: string ): Promise<{ childId: string; state: ChildState }> { // Get or create the child agent const child = await getAgentByName( this.env.ChildAgent, childId ); // Initialize the child with this supervisor's name const state = await child.initialize(this.name); // Track the child ID if (!this.state.childIds.includes(childId)) { this.setState({ childIds: [...this.state.childIds, childId] }); } return { childId, state }; } @callable({ description: "Get all child states" }) async getChildStates(): Promise> { const results = await Promise.all( this.state.childIds.map(async (id) => { const child = await getAgentByName( this.env.ChildAgent, id ); const state = await child.getChildState(); return { id, state }; }) ); return results; } @callable({ description: "Increment a specific child's counter" }) async incrementChild(childId: string): Promise { const child = await getAgentByName( this.env.ChildAgent, childId ); return await child.increment(); } @callable({ description: "Increment all children's counters" }) async incrementAll(): Promise> { const results = await Promise.all( this.state.childIds.map(async (id) => { const child = await getAgentByName( this.env.ChildAgent, id ); const state = await child.increment(); return { id, state }; }) ); return results; } @callable({ description: "Get aggregate statistics" }) async getStats(): Promise<{ totalChildren: number; totalCounter: number; children: Array<{ id: string; state: ChildState }>; }> { const children = await this.getChildStates(); const totalCounter = children.reduce((sum, c) => sum + c.state.counter, 0); return { totalChildren: children.length, totalCounter, children }; } @callable({ description: "Remove a child from tracking" }) async removeChild(childId: string): Promise { if (this.state.childIds.includes(childId)) { this.setState({ childIds: this.state.childIds.filter((id) => id !== childId) }); return true; } return false; } @callable({ description: "Clear all children" }) clearChildren(): void { this.setState({ childIds: [] }); } }