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.
Files changed (186) hide show
  1. package/LICENSE +81 -0
  2. package/README.md +608 -0
  3. package/bin/cli.js +448 -0
  4. package/dist/agents/coding.d.ts +15 -0
  5. package/dist/agents/coding.d.ts.map +1 -0
  6. package/dist/agents/coding.js +189 -0
  7. package/dist/agents/coding.js.map +1 -0
  8. package/dist/agents/initializer.d.ts +15 -0
  9. package/dist/agents/initializer.d.ts.map +1 -0
  10. package/dist/agents/initializer.js +87 -0
  11. package/dist/agents/initializer.js.map +1 -0
  12. package/dist/agents/prompts/arbitrator.md +143 -0
  13. package/dist/agents/prompts/coding.md +247 -0
  14. package/dist/agents/prompts/initializer.md +98 -0
  15. package/dist/config/agent-config.d.ts +103 -0
  16. package/dist/config/agent-config.d.ts.map +1 -0
  17. package/dist/config/agent-config.js +138 -0
  18. package/dist/config/agent-config.js.map +1 -0
  19. package/dist/config/auth-config.d.ts +152 -0
  20. package/dist/config/auth-config.d.ts.map +1 -0
  21. package/dist/config/auth-config.js +139 -0
  22. package/dist/config/auth-config.js.map +1 -0
  23. package/dist/config/mcp-config.d.ts +109 -0
  24. package/dist/config/mcp-config.d.ts.map +1 -0
  25. package/dist/config/mcp-config.js +234 -0
  26. package/dist/config/mcp-config.js.map +1 -0
  27. package/dist/config/provider-config.d.ts +139 -0
  28. package/dist/config/provider-config.d.ts.map +1 -0
  29. package/dist/config/provider-config.js +344 -0
  30. package/dist/config/provider-config.js.map +1 -0
  31. package/dist/config/subagents-config.d.ts +85 -0
  32. package/dist/config/subagents-config.d.ts.map +1 -0
  33. package/dist/config/subagents-config.js +430 -0
  34. package/dist/config/subagents-config.js.map +1 -0
  35. package/dist/index.d.ts +14 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +385 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/orchestrator/arbitrator.d.ts +93 -0
  40. package/dist/orchestrator/arbitrator.d.ts.map +1 -0
  41. package/dist/orchestrator/arbitrator.js +330 -0
  42. package/dist/orchestrator/arbitrator.js.map +1 -0
  43. package/dist/orchestrator/index.d.ts +113 -0
  44. package/dist/orchestrator/index.d.ts.map +1 -0
  45. package/dist/orchestrator/index.js +217 -0
  46. package/dist/orchestrator/index.js.map +1 -0
  47. package/dist/orchestrator/review-coordinator.d.ts +143 -0
  48. package/dist/orchestrator/review-coordinator.d.ts.map +1 -0
  49. package/dist/orchestrator/review-coordinator.js +401 -0
  50. package/dist/orchestrator/review-coordinator.js.map +1 -0
  51. package/dist/orchestrator/task-classifier.d.ts +87 -0
  52. package/dist/orchestrator/task-classifier.d.ts.map +1 -0
  53. package/dist/orchestrator/task-classifier.js +250 -0
  54. package/dist/orchestrator/task-classifier.js.map +1 -0
  55. package/dist/providers/anthropic-provider.d.ts +64 -0
  56. package/dist/providers/anthropic-provider.d.ts.map +1 -0
  57. package/dist/providers/anthropic-provider.js +264 -0
  58. package/dist/providers/anthropic-provider.js.map +1 -0
  59. package/dist/providers/base-provider.d.ts +219 -0
  60. package/dist/providers/base-provider.d.ts.map +1 -0
  61. package/dist/providers/base-provider.js +143 -0
  62. package/dist/providers/base-provider.js.map +1 -0
  63. package/dist/providers/cursor-provider.d.ts +82 -0
  64. package/dist/providers/cursor-provider.d.ts.map +1 -0
  65. package/dist/providers/cursor-provider.js +321 -0
  66. package/dist/providers/cursor-provider.js.map +1 -0
  67. package/dist/providers/google-provider.d.ts +75 -0
  68. package/dist/providers/google-provider.d.ts.map +1 -0
  69. package/dist/providers/google-provider.js +274 -0
  70. package/dist/providers/google-provider.js.map +1 -0
  71. package/dist/providers/index.d.ts +92 -0
  72. package/dist/providers/index.d.ts.map +1 -0
  73. package/dist/providers/index.js +233 -0
  74. package/dist/providers/index.js.map +1 -0
  75. package/dist/providers/openai-provider.d.ts +83 -0
  76. package/dist/providers/openai-provider.d.ts.map +1 -0
  77. package/dist/providers/openai-provider.js +295 -0
  78. package/dist/providers/openai-provider.js.map +1 -0
  79. package/dist/templates/feature_list.template.json +66 -0
  80. package/dist/templates/progress.template.txt +51 -0
  81. package/dist/utils/auth-manager.d.ts +121 -0
  82. package/dist/utils/auth-manager.d.ts.map +1 -0
  83. package/dist/utils/auth-manager.js +560 -0
  84. package/dist/utils/auth-manager.js.map +1 -0
  85. package/dist/utils/budget-enforcer.d.ts +181 -0
  86. package/dist/utils/budget-enforcer.d.ts.map +1 -0
  87. package/dist/utils/budget-enforcer.js +386 -0
  88. package/dist/utils/budget-enforcer.js.map +1 -0
  89. package/dist/utils/chatgpt-detector.d.ts +51 -0
  90. package/dist/utils/chatgpt-detector.d.ts.map +1 -0
  91. package/dist/utils/chatgpt-detector.js +274 -0
  92. package/dist/utils/chatgpt-detector.js.map +1 -0
  93. package/dist/utils/claude-code-detector.d.ts +39 -0
  94. package/dist/utils/claude-code-detector.d.ts.map +1 -0
  95. package/dist/utils/claude-code-detector.js +153 -0
  96. package/dist/utils/claude-code-detector.js.map +1 -0
  97. package/dist/utils/code-quality.d.ts +58 -0
  98. package/dist/utils/code-quality.d.ts.map +1 -0
  99. package/dist/utils/code-quality.js +258 -0
  100. package/dist/utils/code-quality.js.map +1 -0
  101. package/dist/utils/context-primer.d.ts +50 -0
  102. package/dist/utils/context-primer.d.ts.map +1 -0
  103. package/dist/utils/context-primer.js +429 -0
  104. package/dist/utils/context-primer.js.map +1 -0
  105. package/dist/utils/dependency-management.d.ts +40 -0
  106. package/dist/utils/dependency-management.d.ts.map +1 -0
  107. package/dist/utils/dependency-management.js +123 -0
  108. package/dist/utils/dependency-management.js.map +1 -0
  109. package/dist/utils/environment-validation.d.ts +33 -0
  110. package/dist/utils/environment-validation.d.ts.map +1 -0
  111. package/dist/utils/environment-validation.js +136 -0
  112. package/dist/utils/environment-validation.js.map +1 -0
  113. package/dist/utils/error-recovery.d.ts +60 -0
  114. package/dist/utils/error-recovery.d.ts.map +1 -0
  115. package/dist/utils/error-recovery.js +183 -0
  116. package/dist/utils/error-recovery.js.map +1 -0
  117. package/dist/utils/feature-list.d.ts +102 -0
  118. package/dist/utils/feature-list.d.ts.map +1 -0
  119. package/dist/utils/feature-list.js +191 -0
  120. package/dist/utils/feature-list.js.map +1 -0
  121. package/dist/utils/gemini-detector.d.ts +65 -0
  122. package/dist/utils/gemini-detector.d.ts.map +1 -0
  123. package/dist/utils/gemini-detector.js +340 -0
  124. package/dist/utils/gemini-detector.js.map +1 -0
  125. package/dist/utils/git-utils.d.ts +48 -0
  126. package/dist/utils/git-utils.d.ts.map +1 -0
  127. package/dist/utils/git-utils.js +110 -0
  128. package/dist/utils/git-utils.js.map +1 -0
  129. package/dist/utils/health-check.d.ts +32 -0
  130. package/dist/utils/health-check.d.ts.map +1 -0
  131. package/dist/utils/health-check.js +152 -0
  132. package/dist/utils/health-check.js.map +1 -0
  133. package/dist/utils/hooks-manager.d.ts +154 -0
  134. package/dist/utils/hooks-manager.d.ts.map +1 -0
  135. package/dist/utils/hooks-manager.js +359 -0
  136. package/dist/utils/hooks-manager.js.map +1 -0
  137. package/dist/utils/multi-auth-manager.d.ts +144 -0
  138. package/dist/utils/multi-auth-manager.d.ts.map +1 -0
  139. package/dist/utils/multi-auth-manager.js +588 -0
  140. package/dist/utils/multi-auth-manager.js.map +1 -0
  141. package/dist/utils/progress.d.ts +49 -0
  142. package/dist/utils/progress.d.ts.map +1 -0
  143. package/dist/utils/progress.js +209 -0
  144. package/dist/utils/progress.js.map +1 -0
  145. package/dist/utils/project-detection.d.ts +40 -0
  146. package/dist/utils/project-detection.d.ts.map +1 -0
  147. package/dist/utils/project-detection.js +230 -0
  148. package/dist/utils/project-detection.js.map +1 -0
  149. package/dist/utils/session-manager.d.ts +119 -0
  150. package/dist/utils/session-manager.d.ts.map +1 -0
  151. package/dist/utils/session-manager.js +389 -0
  152. package/dist/utils/session-manager.js.map +1 -0
  153. package/dist/utils/skills-manager.d.ts +113 -0
  154. package/dist/utils/skills-manager.d.ts.map +1 -0
  155. package/dist/utils/skills-manager.js +332 -0
  156. package/dist/utils/skills-manager.js.map +1 -0
  157. package/dist/utils/structured-output.d.ts +117 -0
  158. package/dist/utils/structured-output.d.ts.map +1 -0
  159. package/dist/utils/structured-output.js +191 -0
  160. package/dist/utils/structured-output.js.map +1 -0
  161. package/dist/utils/subagent-manager.d.ts +143 -0
  162. package/dist/utils/subagent-manager.d.ts.map +1 -0
  163. package/dist/utils/subagent-manager.js +326 -0
  164. package/dist/utils/subagent-manager.js.map +1 -0
  165. package/dist/utils/supabase-setup.d.ts +50 -0
  166. package/dist/utils/supabase-setup.d.ts.map +1 -0
  167. package/dist/utils/supabase-setup.js +151 -0
  168. package/dist/utils/supabase-setup.js.map +1 -0
  169. package/dist/utils/token-refresh.d.ts +21 -0
  170. package/dist/utils/token-refresh.d.ts.map +1 -0
  171. package/dist/utils/token-refresh.js +77 -0
  172. package/dist/utils/token-refresh.js.map +1 -0
  173. package/dist/utils/tos-warning.d.ts +115 -0
  174. package/dist/utils/tos-warning.d.ts.map +1 -0
  175. package/dist/utils/tos-warning.js +304 -0
  176. package/dist/utils/tos-warning.js.map +1 -0
  177. package/dist/utils/usage-monitor.d.ts +156 -0
  178. package/dist/utils/usage-monitor.d.ts.map +1 -0
  179. package/dist/utils/usage-monitor.js +296 -0
  180. package/dist/utils/usage-monitor.js.map +1 -0
  181. package/package.json +105 -0
  182. package/scripts/init.ps1 +73 -0
  183. package/scripts/init.sh +86 -0
  184. package/scripts/test-auth.sh +90 -0
  185. package/templates/feature_list.template.json +66 -0
  186. 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
+ }
@@ -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
+ }