mycoder-agent
Version:
Agent module for mycoder - an AI-powered software development assistant
105 lines • 3.43 kB
JavaScript
import { v4 as uuidv4 } from 'uuid';
export var AgentStatus;
(function (AgentStatus) {
AgentStatus["RUNNING"] = "running";
AgentStatus["COMPLETED"] = "completed";
AgentStatus["ERROR"] = "error";
AgentStatus["TERMINATED"] = "terminated";
})(AgentStatus || (AgentStatus = {}));
export class AgentTracker {
ownerAgentId;
agents = new Map();
agentStates = new Map();
constructor(ownerAgentId) {
this.ownerAgentId = ownerAgentId;
}
// Register a new agent
registerAgent(goal) {
const id = uuidv4();
// Create agent tracking entry
const agent = {
id,
status: AgentStatus.RUNNING,
startTime: new Date(),
goal,
};
this.agents.set(id, agent);
return id;
}
// Register agent state
registerAgentState(id, state) {
this.agentStates.set(id, state);
}
// Update agent status
updateAgentStatus(id, status, metadata) {
const agent = this.agents.get(id);
if (!agent) {
return false;
}
agent.status = status;
if (status === AgentStatus.COMPLETED ||
status === AgentStatus.ERROR ||
status === AgentStatus.TERMINATED) {
agent.endTime = new Date();
}
if (metadata) {
if (metadata.result !== undefined)
agent.result = metadata.result;
if (metadata.error !== undefined)
agent.error = metadata.error;
}
return true;
}
// Get a specific agent state
getAgentState(id) {
return this.agentStates.get(id);
}
// Get a specific agent tracking info
getAgent(id) {
return this.agents.get(id);
}
// Get all agents with optional filtering
getAgents(status) {
if (!status) {
return Array.from(this.agents.values());
}
return Array.from(this.agents.values()).filter((agent) => agent.status === status);
}
/**
* Get list of active agents with their descriptions
*/
getActiveAgents() {
return this.getAgents(AgentStatus.RUNNING).map(agent => ({
id: agent.id,
description: agent.goal,
status: agent.status
}));
}
// Cleanup and terminate agents
async cleanup() {
const runningAgents = this.getAgents(AgentStatus.RUNNING);
await Promise.all(runningAgents.map((agent) => this.terminateAgent(agent.id)));
}
// Terminate a specific agent
async terminateAgent(id) {
try {
const agentState = this.agentStates.get(id);
if (agentState && !agentState.aborted) {
// Set the agent as aborted and completed
agentState.aborted = true;
agentState.completed = true;
// Clean up resources owned by this sub-agent
await agentState.context.agentTracker.cleanup();
await agentState.context.shellTracker.cleanup();
await agentState.context.browserTracker.cleanup();
}
this.updateAgentStatus(id, AgentStatus.TERMINATED);
}
catch (error) {
this.updateAgentStatus(id, AgentStatus.ERROR, {
error: error instanceof Error ? error.message : String(error),
});
}
}
}
//# sourceMappingURL=AgentTracker.js.map