cortexweaver
Version:
CortexWeaver is a command-line interface (CLI) tool that orchestrates a swarm of specialized AI agents, powered by Claude Code and Gemini CLI, to assist in software development. It transforms a high-level project plan (plan.md) into a series of coordinate
113 lines • 5.23 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CostMonitor = void 0;
/**
* CostMonitor handles cost tracking and analytics for the Governor agent
*/
class CostMonitor {
constructor(claudeClient, cognitiveCanvas, projectConfig, currentTask) {
this.claudeClient = claudeClient;
this.cognitiveCanvas = cognitiveCanvas;
this.projectConfig = projectConfig;
this.currentTask = currentTask;
}
/**
* Monitor project costs via Cognitive Canvas queries (V3.0 Enhanced)
*/
async monitorCosts() {
try {
const claudeUsage = this.claudeClient?.getTokenUsage();
// Default values for missing or invalid data
const totalTokens = Math.max(0, claudeUsage?.totalTokens || 0);
const totalCost = Math.max(0, claudeUsage?.estimatedCost || 0);
// Calculate breakdown based on project config
const claudeCost = totalCost * 0.8; // Estimate 80% Claude usage
const geminiCost = totalCost * 0.2; // Estimate 20% Gemini usage
const baseCostData = {
totalTokens: isNaN(totalTokens) ? 0 : totalTokens,
totalCost: isNaN(totalCost) ? 0 : totalCost,
breakdown: {
claude: isNaN(claudeCost) ? 0 : claudeCost,
gemini: isNaN(geminiCost) ? 0 : geminiCost
}
};
// V3.0: Enhanced analytics
try {
const enhancedData = await this.calculateEnhancedCostAnalytics(baseCostData);
return { ...baseCostData, ...enhancedData };
}
catch (error) {
console.warn('Failed to calculate enhanced cost analytics:', error);
return baseCostData;
}
}
catch (error) {
// Return safe defaults on error
return {
totalTokens: 0,
totalCost: 0,
breakdown: { claude: 0, gemini: 0 }
};
}
}
/**
* Calculate enhanced cost analytics (V3.0)
*/
async calculateEnhancedCostAnalytics(baseCostData) {
const analytics = {};
// Calculate hourly rate and projections
const currentHour = new Date().getHours();
const hoursElapsed = currentHour > 0 ? currentHour : 1;
analytics.hourlyRate = baseCostData.totalCost / hoursElapsed;
analytics.dailyProjection = analytics.hourlyRate * 24;
// V3.0: Agent-level cost tracking via Cognitive Canvas
if (this.cognitiveCanvas && this.currentTask) {
try {
const tasks = await this.cognitiveCanvas.getTasksByProject(this.currentTask.projectId);
analytics.costByAgent = {};
analytics.tokensByAgent = {};
// Estimate cost per agent based on task completion
const completedTasks = tasks.filter(t => t.status === 'completed');
const avgCostPerTask = completedTasks.length > 0 ? baseCostData.totalCost / completedTasks.length : 0;
const avgTokensPerTask = completedTasks.length > 0 ? baseCostData.totalTokens / completedTasks.length : 0;
// Group by agent assignments (simplified - would need actual agent tracking)
for (const task of completedTasks) {
const agentType = task.metadata?.agentType || 'unknown';
analytics.costByAgent[agentType] = (analytics.costByAgent[agentType] || 0) + avgCostPerTask;
analytics.tokensByAgent[agentType] = (analytics.tokensByAgent[agentType] || 0) + avgTokensPerTask;
}
// Calculate efficiency metrics
analytics.efficiency = {
tokensPerTask: avgTokensPerTask,
costPerTask: avgCostPerTask,
successRateImpact: this.calculateSuccessRateImpact(tasks)
};
}
catch (error) {
console.warn('Failed to calculate agent-level cost analytics:', error);
}
}
// Calculate cost trends (simplified - would need historical data)
analytics.costTrend = {
last24h: baseCostData.totalCost, // Simplified - same as current
last7d: baseCostData.totalCost * 7, // Estimated
projectedDaily: analytics.dailyProjection || 0,
projectedWeekly: (analytics.dailyProjection || 0) * 7
};
return analytics;
}
/**
* Calculate success rate impact on costs
*/
calculateSuccessRateImpact(tasks) {
if (tasks.length === 0)
return 0;
const completedTasks = tasks.filter(t => t.status === 'completed');
const failedTasks = tasks.filter(t => t.status === 'failed' || t.status === 'error');
const successRate = completedTasks.length / tasks.length;
const failureImpact = failedTasks.length * 0.5; // Assume failures cost 50% more to resolve
return Math.max(0, 1 - (failureImpact / tasks.length)) * successRate;
}
}
exports.CostMonitor = CostMonitor;
//# sourceMappingURL=cost-monitor.js.map