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,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"}
|