monty-autonomous-fullstack-dev-multillm 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +81 -0
- package/README.md +608 -0
- package/bin/cli.js +448 -0
- package/dist/agents/coding.d.ts +15 -0
- package/dist/agents/coding.d.ts.map +1 -0
- package/dist/agents/coding.js +189 -0
- package/dist/agents/coding.js.map +1 -0
- package/dist/agents/initializer.d.ts +15 -0
- package/dist/agents/initializer.d.ts.map +1 -0
- package/dist/agents/initializer.js +87 -0
- package/dist/agents/initializer.js.map +1 -0
- package/dist/agents/prompts/arbitrator.md +143 -0
- package/dist/agents/prompts/coding.md +247 -0
- package/dist/agents/prompts/initializer.md +98 -0
- package/dist/config/agent-config.d.ts +103 -0
- package/dist/config/agent-config.d.ts.map +1 -0
- package/dist/config/agent-config.js +138 -0
- package/dist/config/agent-config.js.map +1 -0
- package/dist/config/auth-config.d.ts +152 -0
- package/dist/config/auth-config.d.ts.map +1 -0
- package/dist/config/auth-config.js +139 -0
- package/dist/config/auth-config.js.map +1 -0
- package/dist/config/mcp-config.d.ts +109 -0
- package/dist/config/mcp-config.d.ts.map +1 -0
- package/dist/config/mcp-config.js +234 -0
- package/dist/config/mcp-config.js.map +1 -0
- package/dist/config/provider-config.d.ts +139 -0
- package/dist/config/provider-config.d.ts.map +1 -0
- package/dist/config/provider-config.js +344 -0
- package/dist/config/provider-config.js.map +1 -0
- package/dist/config/subagents-config.d.ts +85 -0
- package/dist/config/subagents-config.d.ts.map +1 -0
- package/dist/config/subagents-config.js +430 -0
- package/dist/config/subagents-config.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +385 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/arbitrator.d.ts +93 -0
- package/dist/orchestrator/arbitrator.d.ts.map +1 -0
- package/dist/orchestrator/arbitrator.js +330 -0
- package/dist/orchestrator/arbitrator.js.map +1 -0
- package/dist/orchestrator/index.d.ts +113 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +217 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/review-coordinator.d.ts +143 -0
- package/dist/orchestrator/review-coordinator.d.ts.map +1 -0
- package/dist/orchestrator/review-coordinator.js +401 -0
- package/dist/orchestrator/review-coordinator.js.map +1 -0
- package/dist/orchestrator/task-classifier.d.ts +87 -0
- package/dist/orchestrator/task-classifier.d.ts.map +1 -0
- package/dist/orchestrator/task-classifier.js +250 -0
- package/dist/orchestrator/task-classifier.js.map +1 -0
- package/dist/providers/anthropic-provider.d.ts +64 -0
- package/dist/providers/anthropic-provider.d.ts.map +1 -0
- package/dist/providers/anthropic-provider.js +264 -0
- package/dist/providers/anthropic-provider.js.map +1 -0
- package/dist/providers/base-provider.d.ts +219 -0
- package/dist/providers/base-provider.d.ts.map +1 -0
- package/dist/providers/base-provider.js +143 -0
- package/dist/providers/base-provider.js.map +1 -0
- package/dist/providers/cursor-provider.d.ts +82 -0
- package/dist/providers/cursor-provider.d.ts.map +1 -0
- package/dist/providers/cursor-provider.js +321 -0
- package/dist/providers/cursor-provider.js.map +1 -0
- package/dist/providers/google-provider.d.ts +75 -0
- package/dist/providers/google-provider.d.ts.map +1 -0
- package/dist/providers/google-provider.js +274 -0
- package/dist/providers/google-provider.js.map +1 -0
- package/dist/providers/index.d.ts +92 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +233 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai-provider.d.ts +83 -0
- package/dist/providers/openai-provider.d.ts.map +1 -0
- package/dist/providers/openai-provider.js +295 -0
- package/dist/providers/openai-provider.js.map +1 -0
- package/dist/templates/feature_list.template.json +66 -0
- package/dist/templates/progress.template.txt +51 -0
- package/dist/utils/auth-manager.d.ts +121 -0
- package/dist/utils/auth-manager.d.ts.map +1 -0
- package/dist/utils/auth-manager.js +560 -0
- package/dist/utils/auth-manager.js.map +1 -0
- package/dist/utils/budget-enforcer.d.ts +181 -0
- package/dist/utils/budget-enforcer.d.ts.map +1 -0
- package/dist/utils/budget-enforcer.js +386 -0
- package/dist/utils/budget-enforcer.js.map +1 -0
- package/dist/utils/chatgpt-detector.d.ts +51 -0
- package/dist/utils/chatgpt-detector.d.ts.map +1 -0
- package/dist/utils/chatgpt-detector.js +274 -0
- package/dist/utils/chatgpt-detector.js.map +1 -0
- package/dist/utils/claude-code-detector.d.ts +39 -0
- package/dist/utils/claude-code-detector.d.ts.map +1 -0
- package/dist/utils/claude-code-detector.js +153 -0
- package/dist/utils/claude-code-detector.js.map +1 -0
- package/dist/utils/code-quality.d.ts +58 -0
- package/dist/utils/code-quality.d.ts.map +1 -0
- package/dist/utils/code-quality.js +258 -0
- package/dist/utils/code-quality.js.map +1 -0
- package/dist/utils/context-primer.d.ts +50 -0
- package/dist/utils/context-primer.d.ts.map +1 -0
- package/dist/utils/context-primer.js +429 -0
- package/dist/utils/context-primer.js.map +1 -0
- package/dist/utils/dependency-management.d.ts +40 -0
- package/dist/utils/dependency-management.d.ts.map +1 -0
- package/dist/utils/dependency-management.js +123 -0
- package/dist/utils/dependency-management.js.map +1 -0
- package/dist/utils/environment-validation.d.ts +33 -0
- package/dist/utils/environment-validation.d.ts.map +1 -0
- package/dist/utils/environment-validation.js +136 -0
- package/dist/utils/environment-validation.js.map +1 -0
- package/dist/utils/error-recovery.d.ts +60 -0
- package/dist/utils/error-recovery.d.ts.map +1 -0
- package/dist/utils/error-recovery.js +183 -0
- package/dist/utils/error-recovery.js.map +1 -0
- package/dist/utils/feature-list.d.ts +102 -0
- package/dist/utils/feature-list.d.ts.map +1 -0
- package/dist/utils/feature-list.js +191 -0
- package/dist/utils/feature-list.js.map +1 -0
- package/dist/utils/gemini-detector.d.ts +65 -0
- package/dist/utils/gemini-detector.d.ts.map +1 -0
- package/dist/utils/gemini-detector.js +340 -0
- package/dist/utils/gemini-detector.js.map +1 -0
- package/dist/utils/git-utils.d.ts +48 -0
- package/dist/utils/git-utils.d.ts.map +1 -0
- package/dist/utils/git-utils.js +110 -0
- package/dist/utils/git-utils.js.map +1 -0
- package/dist/utils/health-check.d.ts +32 -0
- package/dist/utils/health-check.d.ts.map +1 -0
- package/dist/utils/health-check.js +152 -0
- package/dist/utils/health-check.js.map +1 -0
- package/dist/utils/hooks-manager.d.ts +154 -0
- package/dist/utils/hooks-manager.d.ts.map +1 -0
- package/dist/utils/hooks-manager.js +359 -0
- package/dist/utils/hooks-manager.js.map +1 -0
- package/dist/utils/multi-auth-manager.d.ts +144 -0
- package/dist/utils/multi-auth-manager.d.ts.map +1 -0
- package/dist/utils/multi-auth-manager.js +588 -0
- package/dist/utils/multi-auth-manager.js.map +1 -0
- package/dist/utils/progress.d.ts +49 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +209 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/project-detection.d.ts +40 -0
- package/dist/utils/project-detection.d.ts.map +1 -0
- package/dist/utils/project-detection.js +230 -0
- package/dist/utils/project-detection.js.map +1 -0
- package/dist/utils/session-manager.d.ts +119 -0
- package/dist/utils/session-manager.d.ts.map +1 -0
- package/dist/utils/session-manager.js +389 -0
- package/dist/utils/session-manager.js.map +1 -0
- package/dist/utils/skills-manager.d.ts +113 -0
- package/dist/utils/skills-manager.d.ts.map +1 -0
- package/dist/utils/skills-manager.js +332 -0
- package/dist/utils/skills-manager.js.map +1 -0
- package/dist/utils/structured-output.d.ts +117 -0
- package/dist/utils/structured-output.d.ts.map +1 -0
- package/dist/utils/structured-output.js +191 -0
- package/dist/utils/structured-output.js.map +1 -0
- package/dist/utils/subagent-manager.d.ts +143 -0
- package/dist/utils/subagent-manager.d.ts.map +1 -0
- package/dist/utils/subagent-manager.js +326 -0
- package/dist/utils/subagent-manager.js.map +1 -0
- package/dist/utils/supabase-setup.d.ts +50 -0
- package/dist/utils/supabase-setup.d.ts.map +1 -0
- package/dist/utils/supabase-setup.js +151 -0
- package/dist/utils/supabase-setup.js.map +1 -0
- package/dist/utils/token-refresh.d.ts +21 -0
- package/dist/utils/token-refresh.d.ts.map +1 -0
- package/dist/utils/token-refresh.js +77 -0
- package/dist/utils/token-refresh.js.map +1 -0
- package/dist/utils/tos-warning.d.ts +115 -0
- package/dist/utils/tos-warning.d.ts.map +1 -0
- package/dist/utils/tos-warning.js +304 -0
- package/dist/utils/tos-warning.js.map +1 -0
- package/dist/utils/usage-monitor.d.ts +156 -0
- package/dist/utils/usage-monitor.d.ts.map +1 -0
- package/dist/utils/usage-monitor.js +296 -0
- package/dist/utils/usage-monitor.js.map +1 -0
- package/package.json +105 -0
- package/scripts/init.ps1 +73 -0
- package/scripts/init.sh +86 -0
- package/scripts/test-auth.sh +90 -0
- package/templates/feature_list.template.json +66 -0
- package/templates/progress.template.txt +51 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage Monitor (Feature B5)
|
|
3
|
+
* Track API costs, token usage, and session metrics
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2025 Dobeu Tech Solutions LLC
|
|
6
|
+
* Licensed under CC BY-NC 4.0
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Token pricing (USD per 1M tokens) - Claude 3.5 Sonnet
|
|
10
|
+
*/
|
|
11
|
+
export declare const TOKEN_PRICING: {
|
|
12
|
+
'claude-3-5-sonnet': {
|
|
13
|
+
input: number;
|
|
14
|
+
output: number;
|
|
15
|
+
};
|
|
16
|
+
'claude-3-opus': {
|
|
17
|
+
input: number;
|
|
18
|
+
output: number;
|
|
19
|
+
};
|
|
20
|
+
'claude-3-haiku': {
|
|
21
|
+
input: number;
|
|
22
|
+
output: number;
|
|
23
|
+
};
|
|
24
|
+
default: {
|
|
25
|
+
input: number;
|
|
26
|
+
output: number;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Usage entry for a single API call
|
|
31
|
+
*/
|
|
32
|
+
export interface UsageEntry {
|
|
33
|
+
timestamp: string;
|
|
34
|
+
session_id: string;
|
|
35
|
+
model: string;
|
|
36
|
+
tokens_input: number;
|
|
37
|
+
tokens_output: number;
|
|
38
|
+
cost_usd: number;
|
|
39
|
+
tool_used?: string;
|
|
40
|
+
duration_ms?: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Session usage summary
|
|
44
|
+
*/
|
|
45
|
+
export interface SessionUsage {
|
|
46
|
+
session_id: string;
|
|
47
|
+
started_at: string;
|
|
48
|
+
ended_at?: string;
|
|
49
|
+
total_tokens_input: number;
|
|
50
|
+
total_tokens_output: number;
|
|
51
|
+
total_cost_usd: number;
|
|
52
|
+
api_calls: number;
|
|
53
|
+
tools_used: Record<string, number>;
|
|
54
|
+
model: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Daily usage summary
|
|
58
|
+
*/
|
|
59
|
+
export interface DailyUsage {
|
|
60
|
+
date: string;
|
|
61
|
+
total_tokens_input: number;
|
|
62
|
+
total_tokens_output: number;
|
|
63
|
+
total_cost_usd: number;
|
|
64
|
+
sessions: number;
|
|
65
|
+
api_calls: number;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Usage tracker state
|
|
69
|
+
*/
|
|
70
|
+
interface UsageState {
|
|
71
|
+
current_session: SessionUsage | null;
|
|
72
|
+
daily_totals: Record<string, DailyUsage>;
|
|
73
|
+
all_time_totals: {
|
|
74
|
+
tokens_input: number;
|
|
75
|
+
tokens_output: number;
|
|
76
|
+
cost_usd: number;
|
|
77
|
+
sessions: number;
|
|
78
|
+
api_calls: number;
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Calculate cost for token usage
|
|
83
|
+
*/
|
|
84
|
+
export declare function calculateCost(inputTokens: number, outputTokens: number, model?: string): number;
|
|
85
|
+
/**
|
|
86
|
+
* Start tracking a new session
|
|
87
|
+
*/
|
|
88
|
+
export declare function startSession(agentDir: string, sessionId: string, model?: string): void;
|
|
89
|
+
/**
|
|
90
|
+
* Record an API call
|
|
91
|
+
*/
|
|
92
|
+
export declare function recordUsage(agentDir: string, inputTokens: number, outputTokens: number, tool?: string, durationMs?: number): void;
|
|
93
|
+
/**
|
|
94
|
+
* End the current session
|
|
95
|
+
*/
|
|
96
|
+
export declare function endSession(agentDir: string): SessionUsage | null;
|
|
97
|
+
/**
|
|
98
|
+
* Get current session usage
|
|
99
|
+
*/
|
|
100
|
+
export declare function getCurrentSessionUsage(agentDir: string): SessionUsage | null;
|
|
101
|
+
/**
|
|
102
|
+
* Get all-time usage totals
|
|
103
|
+
*/
|
|
104
|
+
export declare function getAllTimeTotals(agentDir: string): UsageState['all_time_totals'];
|
|
105
|
+
/**
|
|
106
|
+
* Get daily usage for a specific date or last N days
|
|
107
|
+
*/
|
|
108
|
+
export declare function getDailyUsage(agentDir: string, days?: number): DailyUsage[];
|
|
109
|
+
/**
|
|
110
|
+
* Get usage summary report
|
|
111
|
+
*/
|
|
112
|
+
export declare function getUsageSummary(agentDir: string): string;
|
|
113
|
+
/**
|
|
114
|
+
* Estimate remaining budget usage
|
|
115
|
+
*/
|
|
116
|
+
export declare function estimateBudgetUsage(agentDir: string, budgetUsd: number): {
|
|
117
|
+
used: number;
|
|
118
|
+
remaining: number;
|
|
119
|
+
percentUsed: number;
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* Get burn rate (cost per hour) based on recent sessions
|
|
123
|
+
*/
|
|
124
|
+
export declare function getBurnRate(agentDir: string, hoursLookback?: number): number;
|
|
125
|
+
declare const _default: {
|
|
126
|
+
calculateCost: typeof calculateCost;
|
|
127
|
+
startSession: typeof startSession;
|
|
128
|
+
recordUsage: typeof recordUsage;
|
|
129
|
+
endSession: typeof endSession;
|
|
130
|
+
getCurrentSessionUsage: typeof getCurrentSessionUsage;
|
|
131
|
+
getAllTimeTotals: typeof getAllTimeTotals;
|
|
132
|
+
getDailyUsage: typeof getDailyUsage;
|
|
133
|
+
getUsageSummary: typeof getUsageSummary;
|
|
134
|
+
estimateBudgetUsage: typeof estimateBudgetUsage;
|
|
135
|
+
getBurnRate: typeof getBurnRate;
|
|
136
|
+
TOKEN_PRICING: {
|
|
137
|
+
'claude-3-5-sonnet': {
|
|
138
|
+
input: number;
|
|
139
|
+
output: number;
|
|
140
|
+
};
|
|
141
|
+
'claude-3-opus': {
|
|
142
|
+
input: number;
|
|
143
|
+
output: number;
|
|
144
|
+
};
|
|
145
|
+
'claude-3-haiku': {
|
|
146
|
+
input: number;
|
|
147
|
+
output: number;
|
|
148
|
+
};
|
|
149
|
+
default: {
|
|
150
|
+
input: number;
|
|
151
|
+
output: number;
|
|
152
|
+
};
|
|
153
|
+
};
|
|
154
|
+
};
|
|
155
|
+
export default _default;
|
|
156
|
+
//# sourceMappingURL=usage-monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-monitor.d.ts","sourceRoot":"","sources":["../../src/utils/usage-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage Monitor (Feature B5)
|
|
3
|
+
* Track API costs, token usage, and session metrics
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2025 Dobeu Tech Solutions LLC
|
|
6
|
+
* Licensed under CC BY-NC 4.0
|
|
7
|
+
*/
|
|
8
|
+
import { writeFileSync, readFileSync, existsSync, appendFileSync } from 'fs';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
/**
|
|
11
|
+
* Token pricing (USD per 1M tokens) - Claude 3.5 Sonnet
|
|
12
|
+
*/
|
|
13
|
+
export const TOKEN_PRICING = {
|
|
14
|
+
'claude-3-5-sonnet': {
|
|
15
|
+
input: 3.00, // $3 per 1M input tokens
|
|
16
|
+
output: 15.00, // $15 per 1M output tokens
|
|
17
|
+
},
|
|
18
|
+
'claude-3-opus': {
|
|
19
|
+
input: 15.00, // $15 per 1M input tokens
|
|
20
|
+
output: 75.00, // $75 per 1M output tokens
|
|
21
|
+
},
|
|
22
|
+
'claude-3-haiku': {
|
|
23
|
+
input: 0.25, // $0.25 per 1M input tokens
|
|
24
|
+
output: 1.25, // $1.25 per 1M output tokens
|
|
25
|
+
},
|
|
26
|
+
default: {
|
|
27
|
+
input: 3.00,
|
|
28
|
+
output: 15.00,
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Calculate cost for token usage
|
|
33
|
+
*/
|
|
34
|
+
export function calculateCost(inputTokens, outputTokens, model = 'default') {
|
|
35
|
+
const pricing = TOKEN_PRICING[model] || TOKEN_PRICING.default;
|
|
36
|
+
const inputCost = (inputTokens / 1_000_000) * pricing.input;
|
|
37
|
+
const outputCost = (outputTokens / 1_000_000) * pricing.output;
|
|
38
|
+
return Math.round((inputCost + outputCost) * 10000) / 10000; // Round to 4 decimal places
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Load usage state from file
|
|
42
|
+
*/
|
|
43
|
+
function loadUsageState(agentDir) {
|
|
44
|
+
const statePath = join(agentDir, 'usage_state.json');
|
|
45
|
+
if (!existsSync(statePath)) {
|
|
46
|
+
return {
|
|
47
|
+
current_session: null,
|
|
48
|
+
daily_totals: {},
|
|
49
|
+
all_time_totals: {
|
|
50
|
+
tokens_input: 0,
|
|
51
|
+
tokens_output: 0,
|
|
52
|
+
cost_usd: 0,
|
|
53
|
+
sessions: 0,
|
|
54
|
+
api_calls: 0,
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
return JSON.parse(readFileSync(statePath, 'utf-8'));
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return {
|
|
63
|
+
current_session: null,
|
|
64
|
+
daily_totals: {},
|
|
65
|
+
all_time_totals: {
|
|
66
|
+
tokens_input: 0,
|
|
67
|
+
tokens_output: 0,
|
|
68
|
+
cost_usd: 0,
|
|
69
|
+
sessions: 0,
|
|
70
|
+
api_calls: 0,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Save usage state to file
|
|
77
|
+
*/
|
|
78
|
+
function saveUsageState(agentDir, state) {
|
|
79
|
+
const statePath = join(agentDir, 'usage_state.json');
|
|
80
|
+
writeFileSync(statePath, JSON.stringify(state, null, 2));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Start tracking a new session
|
|
84
|
+
*/
|
|
85
|
+
export function startSession(agentDir, sessionId, model = 'claude-3-5-sonnet') {
|
|
86
|
+
const state = loadUsageState(agentDir);
|
|
87
|
+
state.current_session = {
|
|
88
|
+
session_id: sessionId,
|
|
89
|
+
started_at: new Date().toISOString(),
|
|
90
|
+
total_tokens_input: 0,
|
|
91
|
+
total_tokens_output: 0,
|
|
92
|
+
total_cost_usd: 0,
|
|
93
|
+
api_calls: 0,
|
|
94
|
+
tools_used: {},
|
|
95
|
+
model,
|
|
96
|
+
};
|
|
97
|
+
state.all_time_totals.sessions++;
|
|
98
|
+
saveUsageState(agentDir, state);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Record an API call
|
|
102
|
+
*/
|
|
103
|
+
export function recordUsage(agentDir, inputTokens, outputTokens, tool, durationMs) {
|
|
104
|
+
const state = loadUsageState(agentDir);
|
|
105
|
+
if (!state.current_session) {
|
|
106
|
+
console.warn('No active session to record usage');
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const cost = calculateCost(inputTokens, outputTokens, state.current_session.model);
|
|
110
|
+
// Update session
|
|
111
|
+
state.current_session.total_tokens_input += inputTokens;
|
|
112
|
+
state.current_session.total_tokens_output += outputTokens;
|
|
113
|
+
state.current_session.total_cost_usd += cost;
|
|
114
|
+
state.current_session.api_calls++;
|
|
115
|
+
if (tool) {
|
|
116
|
+
state.current_session.tools_used[tool] = (state.current_session.tools_used[tool] || 0) + 1;
|
|
117
|
+
}
|
|
118
|
+
// Update all-time totals
|
|
119
|
+
state.all_time_totals.tokens_input += inputTokens;
|
|
120
|
+
state.all_time_totals.tokens_output += outputTokens;
|
|
121
|
+
state.all_time_totals.cost_usd += cost;
|
|
122
|
+
state.all_time_totals.api_calls++;
|
|
123
|
+
// Update daily totals
|
|
124
|
+
const today = new Date().toISOString().split('T')[0];
|
|
125
|
+
if (!state.daily_totals[today]) {
|
|
126
|
+
state.daily_totals[today] = {
|
|
127
|
+
date: today,
|
|
128
|
+
total_tokens_input: 0,
|
|
129
|
+
total_tokens_output: 0,
|
|
130
|
+
total_cost_usd: 0,
|
|
131
|
+
sessions: 0,
|
|
132
|
+
api_calls: 0,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
state.daily_totals[today].total_tokens_input += inputTokens;
|
|
136
|
+
state.daily_totals[today].total_tokens_output += outputTokens;
|
|
137
|
+
state.daily_totals[today].total_cost_usd += cost;
|
|
138
|
+
state.daily_totals[today].api_calls++;
|
|
139
|
+
saveUsageState(agentDir, state);
|
|
140
|
+
// Also append to log
|
|
141
|
+
const entry = {
|
|
142
|
+
timestamp: new Date().toISOString(),
|
|
143
|
+
session_id: state.current_session.session_id,
|
|
144
|
+
model: state.current_session.model,
|
|
145
|
+
tokens_input: inputTokens,
|
|
146
|
+
tokens_output: outputTokens,
|
|
147
|
+
cost_usd: cost,
|
|
148
|
+
tool_used: tool,
|
|
149
|
+
duration_ms: durationMs,
|
|
150
|
+
};
|
|
151
|
+
const logPath = join(agentDir, 'usage_log.jsonl');
|
|
152
|
+
appendFileSync(logPath, JSON.stringify(entry) + '\n');
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* End the current session
|
|
156
|
+
*/
|
|
157
|
+
export function endSession(agentDir) {
|
|
158
|
+
const state = loadUsageState(agentDir);
|
|
159
|
+
if (!state.current_session) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
state.current_session.ended_at = new Date().toISOString();
|
|
163
|
+
// Update daily session count
|
|
164
|
+
const today = new Date().toISOString().split('T')[0];
|
|
165
|
+
if (state.daily_totals[today]) {
|
|
166
|
+
state.daily_totals[today].sessions++;
|
|
167
|
+
}
|
|
168
|
+
const completedSession = { ...state.current_session };
|
|
169
|
+
// Save session to history
|
|
170
|
+
const historyPath = join(agentDir, 'session_usage_history.json');
|
|
171
|
+
let history = [];
|
|
172
|
+
if (existsSync(historyPath)) {
|
|
173
|
+
try {
|
|
174
|
+
history = JSON.parse(readFileSync(historyPath, 'utf-8'));
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
history = [];
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
history.push(completedSession);
|
|
181
|
+
if (history.length > 100) {
|
|
182
|
+
history = history.slice(-100);
|
|
183
|
+
}
|
|
184
|
+
writeFileSync(historyPath, JSON.stringify(history, null, 2));
|
|
185
|
+
state.current_session = null;
|
|
186
|
+
saveUsageState(agentDir, state);
|
|
187
|
+
return completedSession;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get current session usage
|
|
191
|
+
*/
|
|
192
|
+
export function getCurrentSessionUsage(agentDir) {
|
|
193
|
+
const state = loadUsageState(agentDir);
|
|
194
|
+
return state.current_session;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Get all-time usage totals
|
|
198
|
+
*/
|
|
199
|
+
export function getAllTimeTotals(agentDir) {
|
|
200
|
+
const state = loadUsageState(agentDir);
|
|
201
|
+
return state.all_time_totals;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Get daily usage for a specific date or last N days
|
|
205
|
+
*/
|
|
206
|
+
export function getDailyUsage(agentDir, days = 7) {
|
|
207
|
+
const state = loadUsageState(agentDir);
|
|
208
|
+
const sortedDays = Object.values(state.daily_totals)
|
|
209
|
+
.sort((a, b) => b.date.localeCompare(a.date))
|
|
210
|
+
.slice(0, days);
|
|
211
|
+
return sortedDays;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Get usage summary report
|
|
215
|
+
*/
|
|
216
|
+
export function getUsageSummary(agentDir) {
|
|
217
|
+
const state = loadUsageState(agentDir);
|
|
218
|
+
const today = new Date().toISOString().split('T')[0];
|
|
219
|
+
const todayUsage = state.daily_totals[today];
|
|
220
|
+
const lines = [
|
|
221
|
+
'╔══════════════════════════════════════════════════════════════╗',
|
|
222
|
+
'║ USAGE SUMMARY ║',
|
|
223
|
+
'╠══════════════════════════════════════════════════════════════╣',
|
|
224
|
+
];
|
|
225
|
+
// Current session
|
|
226
|
+
if (state.current_session) {
|
|
227
|
+
lines.push('║ Current Session: ║');
|
|
228
|
+
lines.push(`║ Tokens: ${state.current_session.total_tokens_input.toLocaleString()} in / ${state.current_session.total_tokens_output.toLocaleString()} out`.padEnd(63) + '║');
|
|
229
|
+
lines.push(`║ Cost: $${state.current_session.total_cost_usd.toFixed(4)}`.padEnd(63) + '║');
|
|
230
|
+
lines.push(`║ API Calls: ${state.current_session.api_calls}`.padEnd(63) + '║');
|
|
231
|
+
lines.push('╠══════════════════════════════════════════════════════════════╣');
|
|
232
|
+
}
|
|
233
|
+
// Today
|
|
234
|
+
if (todayUsage) {
|
|
235
|
+
lines.push('║ Today: ║');
|
|
236
|
+
lines.push(`║ Tokens: ${todayUsage.total_tokens_input.toLocaleString()} in / ${todayUsage.total_tokens_output.toLocaleString()} out`.padEnd(63) + '║');
|
|
237
|
+
lines.push(`║ Cost: $${todayUsage.total_cost_usd.toFixed(4)}`.padEnd(63) + '║');
|
|
238
|
+
lines.push(`║ Sessions: ${todayUsage.sessions} | API Calls: ${todayUsage.api_calls}`.padEnd(63) + '║');
|
|
239
|
+
lines.push('╠══════════════════════════════════════════════════════════════╣');
|
|
240
|
+
}
|
|
241
|
+
// All time
|
|
242
|
+
lines.push('║ All Time: ║');
|
|
243
|
+
lines.push(`║ Tokens: ${state.all_time_totals.tokens_input.toLocaleString()} in / ${state.all_time_totals.tokens_output.toLocaleString()} out`.padEnd(63) + '║');
|
|
244
|
+
lines.push(`║ Cost: $${state.all_time_totals.cost_usd.toFixed(4)}`.padEnd(63) + '║');
|
|
245
|
+
lines.push(`║ Sessions: ${state.all_time_totals.sessions} | API Calls: ${state.all_time_totals.api_calls}`.padEnd(63) + '║');
|
|
246
|
+
lines.push('╚══════════════════════════════════════════════════════════════╝');
|
|
247
|
+
return lines.join('\n');
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Estimate remaining budget usage
|
|
251
|
+
*/
|
|
252
|
+
export function estimateBudgetUsage(agentDir, budgetUsd) {
|
|
253
|
+
const totals = getAllTimeTotals(agentDir);
|
|
254
|
+
const used = totals.cost_usd;
|
|
255
|
+
const remaining = Math.max(0, budgetUsd - used);
|
|
256
|
+
const percentUsed = (used / budgetUsd) * 100;
|
|
257
|
+
return { used, remaining, percentUsed };
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Get burn rate (cost per hour) based on recent sessions
|
|
261
|
+
*/
|
|
262
|
+
export function getBurnRate(agentDir, hoursLookback = 24) {
|
|
263
|
+
const logPath = join(agentDir, 'usage_log.jsonl');
|
|
264
|
+
if (!existsSync(logPath))
|
|
265
|
+
return 0;
|
|
266
|
+
try {
|
|
267
|
+
const content = readFileSync(logPath, 'utf-8');
|
|
268
|
+
const lines = content.trim().split('\n').filter(Boolean);
|
|
269
|
+
const cutoff = new Date(Date.now() - hoursLookback * 60 * 60 * 1000);
|
|
270
|
+
let totalCost = 0;
|
|
271
|
+
for (const line of lines) {
|
|
272
|
+
const entry = JSON.parse(line);
|
|
273
|
+
if (new Date(entry.timestamp) >= cutoff) {
|
|
274
|
+
totalCost += entry.cost_usd;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return totalCost / hoursLookback;
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
return 0;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
export default {
|
|
284
|
+
calculateCost,
|
|
285
|
+
startSession,
|
|
286
|
+
recordUsage,
|
|
287
|
+
endSession,
|
|
288
|
+
getCurrentSessionUsage,
|
|
289
|
+
getAllTimeTotals,
|
|
290
|
+
getDailyUsage,
|
|
291
|
+
getUsageSummary,
|
|
292
|
+
estimateBudgetUsage,
|
|
293
|
+
getBurnRate,
|
|
294
|
+
TOKEN_PRICING,
|
|
295
|
+
};
|
|
296
|
+
//# sourceMappingURL=usage-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-monitor.js","sourceRoot":"","sources":["../../src/utils/usage-monitor.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "monty-autonomous-fullstack-dev-multillm",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Multi-LLM autonomous full-stack development agent - supports Anthropic, OpenAI, Google, and Cursor",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"monty": "./bin/cli.js",
|
|
10
|
+
"monty-agent": "./bin/cli.js",
|
|
11
|
+
"fullstack-agent": "./bin/cli.js"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"start": "node dist/index.js",
|
|
15
|
+
"dev": "tsx src/index.ts",
|
|
16
|
+
"agent:init": "node dist/index.js --init",
|
|
17
|
+
"agent:code": "node dist/index.js --code",
|
|
18
|
+
"build": "tsc && npm run copy-assets",
|
|
19
|
+
"copy-assets": "shx mkdir -p dist/agents && shx cp -r src/agents/prompts dist/agents/ && shx cp -r templates dist/",
|
|
20
|
+
"typecheck": "tsc --noEmit",
|
|
21
|
+
"test": "vitest run",
|
|
22
|
+
"test:watch": "vitest",
|
|
23
|
+
"clean": "rm -rf dist .agent",
|
|
24
|
+
"help": "node dist/index.js --help",
|
|
25
|
+
"prepublishOnly": "npm run build",
|
|
26
|
+
"prepare": "npm run build",
|
|
27
|
+
"postinstall": "echo '✅ monty-autonomous-fullstack-dev-multillm installed! Run: monty --help'"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"multi-llm",
|
|
31
|
+
"autonomous",
|
|
32
|
+
"fullstack-dev",
|
|
33
|
+
"claude",
|
|
34
|
+
"agent",
|
|
35
|
+
"ai",
|
|
36
|
+
"anthropic",
|
|
37
|
+
"openai",
|
|
38
|
+
"google",
|
|
39
|
+
"cursor",
|
|
40
|
+
"sdk",
|
|
41
|
+
"fullstack",
|
|
42
|
+
"developer",
|
|
43
|
+
"code-generation",
|
|
44
|
+
"web-development",
|
|
45
|
+
"react",
|
|
46
|
+
"nextjs",
|
|
47
|
+
"typescript",
|
|
48
|
+
"production",
|
|
49
|
+
"deployment",
|
|
50
|
+
"long-running",
|
|
51
|
+
"incremental"
|
|
52
|
+
],
|
|
53
|
+
"author": "Dobeu Tech Solutions LLC",
|
|
54
|
+
"license": "CC-BY-NC-4.0",
|
|
55
|
+
"repository": {
|
|
56
|
+
"type": "git",
|
|
57
|
+
"url": "git+https://github.com/dobeutech/monty-ai-fullstackdev-coder.git"
|
|
58
|
+
},
|
|
59
|
+
"bugs": {
|
|
60
|
+
"url": "https://github.com/dobeutech/monty-ai-fullstackdev-coder/issues"
|
|
61
|
+
},
|
|
62
|
+
"homepage": "https://github.com/dobeutech/monty-ai-fullstackdev-coder#readme",
|
|
63
|
+
"dependencies": {
|
|
64
|
+
"@anthropic-ai/claude-agent-sdk": "^0.2.6",
|
|
65
|
+
"open": "^11.0.0"
|
|
66
|
+
},
|
|
67
|
+
"optionalDependencies": {
|
|
68
|
+
"@openai/codex-sdk": "^1.0.0",
|
|
69
|
+
"@google/adk": "^0.2.0"
|
|
70
|
+
},
|
|
71
|
+
"peerDependencies": {
|
|
72
|
+
"@openai/codex-sdk": "^1.0.0",
|
|
73
|
+
"@google/adk": "^0.2.0"
|
|
74
|
+
},
|
|
75
|
+
"peerDependenciesMeta": {
|
|
76
|
+
"@openai/codex-sdk": {
|
|
77
|
+
"optional": true
|
|
78
|
+
},
|
|
79
|
+
"@google/adk": {
|
|
80
|
+
"optional": true
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"devDependencies": {
|
|
84
|
+
"@types/node": "^20.10.0",
|
|
85
|
+
"@vitest/ui": "^4.0.17",
|
|
86
|
+
"shx": "^0.4.0",
|
|
87
|
+
"tsx": "^4.7.0",
|
|
88
|
+
"typescript": "^5.3.0",
|
|
89
|
+
"vitest": "^4.0.17"
|
|
90
|
+
},
|
|
91
|
+
"engines": {
|
|
92
|
+
"node": ">=18.0.0"
|
|
93
|
+
},
|
|
94
|
+
"files": [
|
|
95
|
+
"dist",
|
|
96
|
+
"bin",
|
|
97
|
+
"templates",
|
|
98
|
+
"scripts",
|
|
99
|
+
"README.md",
|
|
100
|
+
"LICENSE"
|
|
101
|
+
],
|
|
102
|
+
"publishConfig": {
|
|
103
|
+
"access": "public"
|
|
104
|
+
}
|
|
105
|
+
}
|
package/scripts/init.ps1
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Development Environment Initialization Script (Windows PowerShell)
|
|
3
|
+
# This script is called by the agent to set up and start the development server.
|
|
4
|
+
#
|
|
5
|
+
# Usage: .\scripts\init.ps1 [options]
|
|
6
|
+
# -Install Run npm install before starting
|
|
7
|
+
# -Build Run build before starting
|
|
8
|
+
# -Test Run tests instead of dev server
|
|
9
|
+
#
|
|
10
|
+
|
|
11
|
+
param(
|
|
12
|
+
[switch]$Install,
|
|
13
|
+
[switch]$Build,
|
|
14
|
+
[switch]$Test
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
$ErrorActionPreference = "Stop"
|
|
18
|
+
|
|
19
|
+
Write-Host "════════════════════════════════════════════════════════════════" -ForegroundColor Blue
|
|
20
|
+
Write-Host " Development Environment Initialization " -ForegroundColor Blue
|
|
21
|
+
Write-Host "════════════════════════════════════════════════════════════════" -ForegroundColor Blue
|
|
22
|
+
|
|
23
|
+
# Check if we're in the right directory
|
|
24
|
+
if (-not (Test-Path "package.json")) {
|
|
25
|
+
Write-Host "Error: package.json not found. Are you in the project root?" -ForegroundColor Red
|
|
26
|
+
exit 1
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
# Install dependencies if requested or if node_modules doesn't exist
|
|
30
|
+
if ($Install -or -not (Test-Path "node_modules")) {
|
|
31
|
+
Write-Host "Installing dependencies..." -ForegroundColor Yellow
|
|
32
|
+
npm install
|
|
33
|
+
if ($LASTEXITCODE -ne 0) {
|
|
34
|
+
Write-Host "Error: npm install failed" -ForegroundColor Red
|
|
35
|
+
exit 1
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
# Run build if requested
|
|
40
|
+
if ($Build) {
|
|
41
|
+
Write-Host "Building project..." -ForegroundColor Yellow
|
|
42
|
+
npm run build
|
|
43
|
+
if ($LASTEXITCODE -ne 0) {
|
|
44
|
+
Write-Host "Error: build failed" -ForegroundColor Red
|
|
45
|
+
exit 1
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
# Run tests if requested
|
|
50
|
+
if ($Test) {
|
|
51
|
+
Write-Host "Running tests..." -ForegroundColor Yellow
|
|
52
|
+
npm test
|
|
53
|
+
exit $LASTEXITCODE
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
# Start development server
|
|
57
|
+
Write-Host "Starting development server..." -ForegroundColor Green
|
|
58
|
+
Write-Host "────────────────────────────────────────────────────────────────" -ForegroundColor Blue
|
|
59
|
+
|
|
60
|
+
# Read package.json to check for available scripts
|
|
61
|
+
$packageJson = Get-Content "package.json" -Raw | ConvertFrom-Json
|
|
62
|
+
$scripts = $packageJson.scripts
|
|
63
|
+
|
|
64
|
+
if ($scripts.dev) {
|
|
65
|
+
npm run dev
|
|
66
|
+
} elseif ($scripts.start) {
|
|
67
|
+
npm start
|
|
68
|
+
} else {
|
|
69
|
+
Write-Host "Error: No 'dev' or 'start' script found in package.json" -ForegroundColor Red
|
|
70
|
+
Write-Host "Available scripts:" -ForegroundColor Yellow
|
|
71
|
+
npm run
|
|
72
|
+
exit 1
|
|
73
|
+
}
|