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,181 @@
1
+ /**
2
+ * Budget Enforcer
3
+ * Real-time budget enforcement and quota warning system.
4
+ * Monitors usage across providers and enforces spending limits.
5
+ *
6
+ * Copyright (c) 2025 Dobeu Tech Solutions LLC
7
+ * Licensed under CC BY-NC 4.0
8
+ */
9
+ import { type ProviderName } from '../config/provider-config.js';
10
+ /**
11
+ * Budget configuration
12
+ */
13
+ export interface BudgetConfig {
14
+ monthlyLimitUsd: number;
15
+ dailyLimitUsd: number;
16
+ sessionLimitUsd: number;
17
+ warningThreshold: number;
18
+ hardLimit: boolean;
19
+ providers: Partial<Record<ProviderName, ProviderBudget>>;
20
+ }
21
+ /**
22
+ * Per-provider budget limits
23
+ */
24
+ export interface ProviderBudget {
25
+ dailyLimitUsd?: number;
26
+ monthlyLimitUsd?: number;
27
+ requestsPerMinute?: number;
28
+ tokensPerMinute?: number;
29
+ }
30
+ /**
31
+ * Budget status for a time period
32
+ */
33
+ export interface BudgetStatus {
34
+ period: 'daily' | 'monthly' | 'session' | 'all-time';
35
+ limitUsd: number;
36
+ usedUsd: number;
37
+ remainingUsd: number;
38
+ percentUsed: number;
39
+ isExceeded: boolean;
40
+ isWarning: boolean;
41
+ }
42
+ /**
43
+ * Usage tracking entry
44
+ */
45
+ export interface UsageEntry {
46
+ timestamp: number;
47
+ provider: ProviderName;
48
+ model: string;
49
+ inputTokens: number;
50
+ outputTokens: number;
51
+ costUsd: number;
52
+ tool?: string;
53
+ sessionId?: string;
54
+ }
55
+ /**
56
+ * Rate limit status
57
+ */
58
+ export interface RateLimitStatus {
59
+ provider: ProviderName;
60
+ requestsInWindow: number;
61
+ tokensInWindow: number;
62
+ windowStartMs: number;
63
+ isRateLimited: boolean;
64
+ resetInMs: number;
65
+ }
66
+ /**
67
+ * Default budget configuration
68
+ */
69
+ export declare const DEFAULT_BUDGET_CONFIG: BudgetConfig;
70
+ /**
71
+ * Token pricing per million tokens
72
+ */
73
+ export declare const TOKEN_PRICING: Record<string, {
74
+ input: number;
75
+ output: number;
76
+ }>;
77
+ /**
78
+ * Budget Enforcer class
79
+ */
80
+ export declare class BudgetEnforcer {
81
+ private config;
82
+ private usageLog;
83
+ private usageFilePath;
84
+ private currentSessionId;
85
+ private rateLimitWindows;
86
+ private warningCallbacks;
87
+ private blockCallbacks;
88
+ constructor(agentDir: string, config?: Partial<BudgetConfig>);
89
+ /**
90
+ * Load usage log from file
91
+ */
92
+ private loadUsageLog;
93
+ /**
94
+ * Save usage log to file
95
+ */
96
+ private saveUsageLog;
97
+ /**
98
+ * Calculate cost for token usage
99
+ */
100
+ calculateCost(inputTokens: number, outputTokens: number, model: string): number;
101
+ /**
102
+ * Record usage
103
+ */
104
+ recordUsage(provider: ProviderName, model: string, inputTokens: number, outputTokens: number, tool?: string): BudgetStatus;
105
+ /**
106
+ * Update rate limit tracking window
107
+ */
108
+ private updateRateLimitWindow;
109
+ /**
110
+ * Check rate limit status for a provider
111
+ */
112
+ checkRateLimit(provider: ProviderName): RateLimitStatus | null;
113
+ /**
114
+ * Check if operation should be blocked due to rate limits
115
+ */
116
+ isRateLimited(provider: ProviderName): boolean;
117
+ /**
118
+ * Check budget status
119
+ */
120
+ checkBudget(period: 'daily' | 'monthly' | 'session' | 'all-time'): BudgetStatus;
121
+ /**
122
+ * Check if operation should be blocked due to budget
123
+ */
124
+ shouldBlock(): {
125
+ blocked: boolean;
126
+ reason?: string;
127
+ };
128
+ /**
129
+ * Get usage summary
130
+ */
131
+ getUsageSummary(): string;
132
+ /**
133
+ * Get per-provider usage breakdown
134
+ */
135
+ getProviderBreakdown(): Record<ProviderName, number>;
136
+ /**
137
+ * Get burn rate ($ per hour)
138
+ */
139
+ getBurnRate(hoursLookback?: number): number;
140
+ /**
141
+ * Estimate time until budget exhausted
142
+ */
143
+ estimateTimeUntilExhaustion(): {
144
+ hours: number | null;
145
+ limitType: string;
146
+ };
147
+ /**
148
+ * Register warning callback
149
+ */
150
+ onWarning(callback: (status: BudgetStatus) => void): void;
151
+ /**
152
+ * Register block callback
153
+ */
154
+ onBlock(callback: (status: BudgetStatus) => void): void;
155
+ /**
156
+ * Update configuration
157
+ */
158
+ updateConfig(config: Partial<BudgetConfig>): void;
159
+ /**
160
+ * Get current configuration
161
+ */
162
+ getConfig(): BudgetConfig;
163
+ /**
164
+ * Start a new session
165
+ */
166
+ startNewSession(): string;
167
+ /**
168
+ * Get current session ID
169
+ */
170
+ getCurrentSessionId(): string;
171
+ /**
172
+ * Clear usage history (for testing)
173
+ */
174
+ clearHistory(): void;
175
+ }
176
+ /**
177
+ * Create a budget enforcer instance
178
+ */
179
+ export declare function createBudgetEnforcer(agentDir: string, config?: Partial<BudgetConfig>): BudgetEnforcer;
180
+ export default BudgetEnforcer;
181
+ //# sourceMappingURL=budget-enforcer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget-enforcer.d.ts","sourceRoot":"","sources":["../../src/utils/budget-enforcer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,386 @@
1
+ /**
2
+ * Budget Enforcer
3
+ * Real-time budget enforcement and quota warning system.
4
+ * Monitors usage across providers and enforces spending limits.
5
+ *
6
+ * Copyright (c) 2025 Dobeu Tech Solutions LLC
7
+ * Licensed under CC BY-NC 4.0
8
+ */
9
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
10
+ import { join, dirname } from 'path';
11
+ /**
12
+ * Default budget configuration
13
+ */
14
+ export const DEFAULT_BUDGET_CONFIG = {
15
+ monthlyLimitUsd: 100,
16
+ dailyLimitUsd: 10,
17
+ sessionLimitUsd: 5,
18
+ warningThreshold: 0.8,
19
+ hardLimit: false,
20
+ providers: {
21
+ anthropic: {
22
+ dailyLimitUsd: 10,
23
+ requestsPerMinute: 50,
24
+ tokensPerMinute: 100000,
25
+ },
26
+ openai: {
27
+ dailyLimitUsd: 10,
28
+ requestsPerMinute: 60,
29
+ tokensPerMinute: 90000,
30
+ },
31
+ google: {
32
+ dailyLimitUsd: 5,
33
+ requestsPerMinute: 60,
34
+ tokensPerMinute: 32000,
35
+ },
36
+ cursor: {
37
+ dailyLimitUsd: 5,
38
+ },
39
+ },
40
+ };
41
+ /**
42
+ * Token pricing per million tokens
43
+ */
44
+ export const TOKEN_PRICING = {
45
+ // Claude models
46
+ 'claude-sonnet-4-20250514': { input: 3, output: 15 },
47
+ 'claude-3-5-sonnet': { input: 3, output: 15 },
48
+ 'claude-3-opus': { input: 15, output: 75 },
49
+ 'claude-3-haiku': { input: 0.25, output: 1.25 },
50
+ // GPT models
51
+ 'gpt-4-turbo': { input: 10, output: 30 },
52
+ 'gpt-4o': { input: 2.5, output: 10 },
53
+ 'gpt-4o-mini': { input: 0.15, output: 0.6 },
54
+ 'o1-preview': { input: 15, output: 60 },
55
+ 'o1-mini': { input: 3, output: 12 },
56
+ // Gemini models
57
+ 'gemini-2.5-flash': { input: 0.075, output: 0.3 },
58
+ 'gemini-2.5-pro': { input: 1.25, output: 5 },
59
+ 'gemini-2.0-flash': { input: 0.1, output: 0.4 },
60
+ // Cursor models
61
+ 'cursor-agent': { input: 0, output: 0 }, // Subscription-based
62
+ // Default fallback
63
+ default: { input: 3, output: 15 },
64
+ };
65
+ /**
66
+ * Budget Enforcer class
67
+ */
68
+ export class BudgetEnforcer {
69
+ config;
70
+ usageLog = [];
71
+ usageFilePath;
72
+ currentSessionId;
73
+ rateLimitWindows = new Map();
74
+ warningCallbacks = [];
75
+ blockCallbacks = [];
76
+ constructor(agentDir, config) {
77
+ this.config = { ...DEFAULT_BUDGET_CONFIG, ...config };
78
+ this.usageFilePath = join(agentDir, 'usage_log.jsonl');
79
+ this.currentSessionId = `session-${Date.now()}`;
80
+ this.loadUsageLog();
81
+ }
82
+ /**
83
+ * Load usage log from file
84
+ */
85
+ loadUsageLog() {
86
+ try {
87
+ if (!existsSync(this.usageFilePath)) {
88
+ return;
89
+ }
90
+ const content = readFileSync(this.usageFilePath, 'utf-8');
91
+ const lines = content.trim().split('\n').filter(l => l);
92
+ this.usageLog = lines.map(line => JSON.parse(line));
93
+ }
94
+ catch {
95
+ this.usageLog = [];
96
+ }
97
+ }
98
+ /**
99
+ * Save usage log to file
100
+ */
101
+ saveUsageLog() {
102
+ try {
103
+ const dir = dirname(this.usageFilePath);
104
+ if (!existsSync(dir)) {
105
+ mkdirSync(dir, { recursive: true });
106
+ }
107
+ const content = this.usageLog.map(e => JSON.stringify(e)).join('\n');
108
+ writeFileSync(this.usageFilePath, content, 'utf-8');
109
+ }
110
+ catch {
111
+ // Failed to save
112
+ }
113
+ }
114
+ /**
115
+ * Calculate cost for token usage
116
+ */
117
+ calculateCost(inputTokens, outputTokens, model) {
118
+ const pricing = TOKEN_PRICING[model] || TOKEN_PRICING.default;
119
+ if (!pricing)
120
+ return 0;
121
+ return ((inputTokens / 1000000) * pricing.input +
122
+ (outputTokens / 1000000) * pricing.output);
123
+ }
124
+ /**
125
+ * Record usage
126
+ */
127
+ recordUsage(provider, model, inputTokens, outputTokens, tool) {
128
+ const costUsd = this.calculateCost(inputTokens, outputTokens, model);
129
+ const entry = {
130
+ timestamp: Date.now(),
131
+ provider,
132
+ model,
133
+ inputTokens,
134
+ outputTokens,
135
+ costUsd,
136
+ tool,
137
+ sessionId: this.currentSessionId,
138
+ };
139
+ this.usageLog.push(entry);
140
+ this.saveUsageLog();
141
+ // Update rate limit tracking
142
+ this.updateRateLimitWindow(provider, inputTokens + outputTokens);
143
+ // Check budget status and trigger callbacks
144
+ const status = this.checkBudget('daily');
145
+ if (status.isWarning && !status.isExceeded) {
146
+ this.warningCallbacks.forEach(cb => cb(status));
147
+ }
148
+ if (status.isExceeded) {
149
+ this.blockCallbacks.forEach(cb => cb(status));
150
+ }
151
+ return status;
152
+ }
153
+ /**
154
+ * Update rate limit tracking window
155
+ */
156
+ updateRateLimitWindow(provider, tokens) {
157
+ const now = Date.now();
158
+ const windowMs = 60 * 1000; // 1 minute window
159
+ let status = this.rateLimitWindows.get(provider);
160
+ if (!status || now - status.windowStartMs > windowMs) {
161
+ status = {
162
+ provider,
163
+ requestsInWindow: 0,
164
+ tokensInWindow: 0,
165
+ windowStartMs: now,
166
+ isRateLimited: false,
167
+ resetInMs: windowMs,
168
+ };
169
+ }
170
+ status.requestsInWindow++;
171
+ status.tokensInWindow += tokens;
172
+ status.resetInMs = windowMs - (now - status.windowStartMs);
173
+ // Check rate limits
174
+ const providerConfig = this.config.providers[provider];
175
+ if (providerConfig) {
176
+ const rpmLimit = providerConfig.requestsPerMinute || Infinity;
177
+ const tpmLimit = providerConfig.tokensPerMinute || Infinity;
178
+ status.isRateLimited =
179
+ status.requestsInWindow >= rpmLimit ||
180
+ status.tokensInWindow >= tpmLimit;
181
+ }
182
+ this.rateLimitWindows.set(provider, status);
183
+ }
184
+ /**
185
+ * Check rate limit status for a provider
186
+ */
187
+ checkRateLimit(provider) {
188
+ return this.rateLimitWindows.get(provider) || null;
189
+ }
190
+ /**
191
+ * Check if operation should be blocked due to rate limits
192
+ */
193
+ isRateLimited(provider) {
194
+ const status = this.rateLimitWindows.get(provider);
195
+ if (!status)
196
+ return false;
197
+ // Check if window has expired
198
+ if (Date.now() - status.windowStartMs > 60 * 1000) {
199
+ return false;
200
+ }
201
+ return status.isRateLimited;
202
+ }
203
+ /**
204
+ * Check budget status
205
+ */
206
+ checkBudget(period) {
207
+ const now = Date.now();
208
+ let limitUsd;
209
+ let entries;
210
+ switch (period) {
211
+ case 'daily':
212
+ limitUsd = this.config.dailyLimitUsd;
213
+ const dayStart = new Date().setHours(0, 0, 0, 0);
214
+ entries = this.usageLog.filter(e => e.timestamp >= dayStart);
215
+ break;
216
+ case 'monthly':
217
+ limitUsd = this.config.monthlyLimitUsd;
218
+ const monthStart = new Date(new Date().setDate(1)).setHours(0, 0, 0, 0);
219
+ entries = this.usageLog.filter(e => e.timestamp >= monthStart);
220
+ break;
221
+ case 'session':
222
+ limitUsd = this.config.sessionLimitUsd;
223
+ entries = this.usageLog.filter(e => e.sessionId === this.currentSessionId);
224
+ break;
225
+ case 'all-time':
226
+ limitUsd = Infinity;
227
+ entries = this.usageLog;
228
+ break;
229
+ default:
230
+ throw new Error(`Unknown period: ${period}`);
231
+ }
232
+ const usedUsd = entries.reduce((sum, e) => sum + e.costUsd, 0);
233
+ const remainingUsd = Math.max(0, limitUsd - usedUsd);
234
+ const percentUsed = limitUsd > 0 ? usedUsd / limitUsd : 0;
235
+ return {
236
+ period,
237
+ limitUsd,
238
+ usedUsd,
239
+ remainingUsd,
240
+ percentUsed,
241
+ isExceeded: percentUsed >= 1,
242
+ isWarning: percentUsed >= this.config.warningThreshold,
243
+ };
244
+ }
245
+ /**
246
+ * Check if operation should be blocked due to budget
247
+ */
248
+ shouldBlock() {
249
+ if (!this.config.hardLimit) {
250
+ return { blocked: false };
251
+ }
252
+ const daily = this.checkBudget('daily');
253
+ if (daily.isExceeded) {
254
+ return {
255
+ blocked: true,
256
+ reason: `Daily budget exceeded ($${daily.usedUsd.toFixed(2)} / $${daily.limitUsd.toFixed(2)})`,
257
+ };
258
+ }
259
+ const monthly = this.checkBudget('monthly');
260
+ if (monthly.isExceeded) {
261
+ return {
262
+ blocked: true,
263
+ reason: `Monthly budget exceeded ($${monthly.usedUsd.toFixed(2)} / $${monthly.limitUsd.toFixed(2)})`,
264
+ };
265
+ }
266
+ const session = this.checkBudget('session');
267
+ if (session.isExceeded) {
268
+ return {
269
+ blocked: true,
270
+ reason: `Session budget exceeded ($${session.usedUsd.toFixed(2)} / $${session.limitUsd.toFixed(2)})`,
271
+ };
272
+ }
273
+ return { blocked: false };
274
+ }
275
+ /**
276
+ * Get usage summary
277
+ */
278
+ getUsageSummary() {
279
+ const daily = this.checkBudget('daily');
280
+ const monthly = this.checkBudget('monthly');
281
+ const session = this.checkBudget('session');
282
+ const lines = [
283
+ '## Budget Status',
284
+ '',
285
+ `**Session:** $${session.usedUsd.toFixed(4)} / $${session.limitUsd.toFixed(2)} (${(session.percentUsed * 100).toFixed(1)}%)`,
286
+ `**Today:** $${daily.usedUsd.toFixed(4)} / $${daily.limitUsd.toFixed(2)} (${(daily.percentUsed * 100).toFixed(1)}%)`,
287
+ `**Month:** $${monthly.usedUsd.toFixed(4)} / $${monthly.limitUsd.toFixed(2)} (${(monthly.percentUsed * 100).toFixed(1)}%)`,
288
+ '',
289
+ ];
290
+ if (daily.isWarning || monthly.isWarning) {
291
+ lines.push('⚠️ **Warning:** Approaching budget limit');
292
+ }
293
+ if (daily.isExceeded || monthly.isExceeded) {
294
+ lines.push('🚫 **Budget Exceeded**');
295
+ }
296
+ return lines.join('\n');
297
+ }
298
+ /**
299
+ * Get per-provider usage breakdown
300
+ */
301
+ getProviderBreakdown() {
302
+ const breakdown = {};
303
+ for (const entry of this.usageLog) {
304
+ breakdown[entry.provider] = (breakdown[entry.provider] || 0) + entry.costUsd;
305
+ }
306
+ return breakdown;
307
+ }
308
+ /**
309
+ * Get burn rate ($ per hour)
310
+ */
311
+ getBurnRate(hoursLookback = 1) {
312
+ const cutoff = Date.now() - hoursLookback * 60 * 60 * 1000;
313
+ const recentEntries = this.usageLog.filter(e => e.timestamp >= cutoff);
314
+ const totalCost = recentEntries.reduce((sum, e) => sum + e.costUsd, 0);
315
+ return totalCost / hoursLookback;
316
+ }
317
+ /**
318
+ * Estimate time until budget exhausted
319
+ */
320
+ estimateTimeUntilExhaustion() {
321
+ const burnRate = this.getBurnRate();
322
+ if (burnRate <= 0) {
323
+ return { hours: null, limitType: 'none' };
324
+ }
325
+ const daily = this.checkBudget('daily');
326
+ const dailyHours = daily.remainingUsd / burnRate;
327
+ const monthly = this.checkBudget('monthly');
328
+ const monthlyHours = monthly.remainingUsd / burnRate;
329
+ if (dailyHours < monthlyHours) {
330
+ return { hours: dailyHours, limitType: 'daily' };
331
+ }
332
+ return { hours: monthlyHours, limitType: 'monthly' };
333
+ }
334
+ /**
335
+ * Register warning callback
336
+ */
337
+ onWarning(callback) {
338
+ this.warningCallbacks.push(callback);
339
+ }
340
+ /**
341
+ * Register block callback
342
+ */
343
+ onBlock(callback) {
344
+ this.blockCallbacks.push(callback);
345
+ }
346
+ /**
347
+ * Update configuration
348
+ */
349
+ updateConfig(config) {
350
+ this.config = { ...this.config, ...config };
351
+ }
352
+ /**
353
+ * Get current configuration
354
+ */
355
+ getConfig() {
356
+ return { ...this.config };
357
+ }
358
+ /**
359
+ * Start a new session
360
+ */
361
+ startNewSession() {
362
+ this.currentSessionId = `session-${Date.now()}`;
363
+ return this.currentSessionId;
364
+ }
365
+ /**
366
+ * Get current session ID
367
+ */
368
+ getCurrentSessionId() {
369
+ return this.currentSessionId;
370
+ }
371
+ /**
372
+ * Clear usage history (for testing)
373
+ */
374
+ clearHistory() {
375
+ this.usageLog = [];
376
+ this.saveUsageLog();
377
+ }
378
+ }
379
+ /**
380
+ * Create a budget enforcer instance
381
+ */
382
+ export function createBudgetEnforcer(agentDir, config) {
383
+ return new BudgetEnforcer(agentDir, config);
384
+ }
385
+ export default BudgetEnforcer;
386
+ //# sourceMappingURL=budget-enforcer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget-enforcer.js","sourceRoot":"","sources":["../../src/utils/budget-enforcer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * ChatGPT Subscription Detector
3
+ * Detects ChatGPT Plus/Team/Enterprise subscription credentials from local system.
4
+ * Similar to Claude Code detector for Anthropic subscriptions.
5
+ *
6
+ * Copyright (c) 2025 Dobeu Tech Solutions LLC
7
+ * Licensed under CC BY-NC 4.0
8
+ */
9
+ /**
10
+ * ChatGPT credential structure
11
+ */
12
+ export interface ChatGPTCredentials {
13
+ accessToken: string;
14
+ refreshToken?: string;
15
+ expiresAt?: number;
16
+ tokenType?: string;
17
+ organizationId?: string;
18
+ email?: string;
19
+ tier?: 'free' | 'plus' | 'team' | 'enterprise';
20
+ }
21
+ /**
22
+ * Possible paths where ChatGPT credentials might be stored
23
+ */
24
+ export declare function getChatGPTPaths(): string[];
25
+ /**
26
+ * Check if token is expired
27
+ */
28
+ export declare function isTokenExpired(credentials: ChatGPTCredentials): boolean;
29
+ /**
30
+ * Get days until expiration
31
+ */
32
+ export declare function getDaysUntilExpiration(credentials: ChatGPTCredentials): number | null;
33
+ /**
34
+ * Attempt to refresh the access token
35
+ */
36
+ export declare function refreshChatGPTToken(refreshToken: string): Promise<ChatGPTCredentials | null>;
37
+ /**
38
+ * Main detection function
39
+ * Attempts to find ChatGPT/OpenAI subscription credentials from the local system
40
+ */
41
+ export declare function detectChatGPTCredentials(): Promise<ChatGPTCredentials | null>;
42
+ /**
43
+ * Validate ChatGPT credentials against the API
44
+ */
45
+ export declare function validateChatGPTCredentials(credentials: ChatGPTCredentials): Promise<boolean>;
46
+ /**
47
+ * Get credential status string
48
+ */
49
+ export declare function getCredentialStatus(credentials: ChatGPTCredentials): string;
50
+ export default detectChatGPTCredentials;
51
+ //# sourceMappingURL=chatgpt-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatgpt-detector.d.ts","sourceRoot":"","sources":["../../src/utils/chatgpt-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,YAAY,CAAC;CAChD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,EAAE,CA0B1C;AA2GD;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,kBAAkB,GAAG,OAAO,CAcvE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAgBrF;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAuBpC;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAkCnF;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,kBAAkB,GAC9B,OAAO,CAAC,OAAO,CAAC,CAclB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,GAAG,MAAM,CA2B3E;AAED,eAAe,wBAAwB,CAAC"}