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,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature List Utilities
|
|
3
|
+
* Manages feature list operations with Poka-yoke error prevention.
|
|
4
|
+
* Implements safeguards to prevent accidental modification of test criteria.
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync, writeFileSync, existsSync } from "fs";
|
|
7
|
+
import { agentConfig } from "../config/agent-config.js";
|
|
8
|
+
/**
|
|
9
|
+
* Load the feature list from disk
|
|
10
|
+
*/
|
|
11
|
+
export function loadFeatureList() {
|
|
12
|
+
const path = agentConfig.paths.featureList;
|
|
13
|
+
if (!existsSync(path)) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
const content = readFileSync(path, "utf-8");
|
|
18
|
+
return JSON.parse(content);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
console.error("Error loading feature list:", error);
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Save the feature list to disk
|
|
27
|
+
*/
|
|
28
|
+
export function saveFeatureList(featureList) {
|
|
29
|
+
const path = agentConfig.paths.featureList;
|
|
30
|
+
try {
|
|
31
|
+
// Update metadata before saving
|
|
32
|
+
featureList.metadata.total_features = featureList.features.length;
|
|
33
|
+
featureList.metadata.passing_features = featureList.features.filter(f => f.passes).length;
|
|
34
|
+
featureList.metadata.last_updated = new Date().toISOString();
|
|
35
|
+
const content = JSON.stringify(featureList, null, 2);
|
|
36
|
+
writeFileSync(path, content, "utf-8");
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error("Error saving feature list:", error);
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Poka-yoke validation: Ensure feature list updates don't violate constraints
|
|
46
|
+
*
|
|
47
|
+
* CONSTRAINTS:
|
|
48
|
+
* - Cannot delete features
|
|
49
|
+
* - Cannot modify feature steps (test criteria)
|
|
50
|
+
* - Cannot modify feature descriptions
|
|
51
|
+
* - Can only update: passes, last_tested, notes
|
|
52
|
+
*/
|
|
53
|
+
export function validateFeatureListUpdate(original, updated) {
|
|
54
|
+
const warnings = [];
|
|
55
|
+
// Rule 1: Cannot delete features
|
|
56
|
+
if (updated.features.length < original.features.length) {
|
|
57
|
+
return {
|
|
58
|
+
valid: false,
|
|
59
|
+
error: `Cannot delete features. Original: ${original.features.length}, Updated: ${updated.features.length}`,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Rule 2: Cannot modify existing features' steps or descriptions
|
|
63
|
+
for (const originalFeat of original.features) {
|
|
64
|
+
const updatedFeat = updated.features.find(f => f.id === originalFeat.id);
|
|
65
|
+
if (!updatedFeat) {
|
|
66
|
+
return {
|
|
67
|
+
valid: false,
|
|
68
|
+
error: `Feature ${originalFeat.id} was removed. This is not allowed.`,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
// Check if steps were modified
|
|
72
|
+
if (JSON.stringify(originalFeat.steps) !== JSON.stringify(updatedFeat.steps)) {
|
|
73
|
+
return {
|
|
74
|
+
valid: false,
|
|
75
|
+
error: `Cannot modify test steps for feature ${originalFeat.id}. Steps are immutable.`,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// Check if description was modified
|
|
79
|
+
if (originalFeat.description !== updatedFeat.description) {
|
|
80
|
+
return {
|
|
81
|
+
valid: false,
|
|
82
|
+
error: `Cannot modify description for feature ${originalFeat.id}. Descriptions are immutable.`,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// Check if category was modified
|
|
86
|
+
if (originalFeat.category !== updatedFeat.category) {
|
|
87
|
+
return {
|
|
88
|
+
valid: false,
|
|
89
|
+
error: `Cannot modify category for feature ${originalFeat.id}. Categories are immutable.`,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// Warn if passes changed from true to false (regression)
|
|
93
|
+
if (originalFeat.passes && !updatedFeat.passes) {
|
|
94
|
+
warnings.push(`Feature ${originalFeat.id} regressed from passing to failing.`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
valid: true,
|
|
99
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get the next feature to work on (highest priority failing feature)
|
|
104
|
+
*/
|
|
105
|
+
export function getNextFeature(featureList) {
|
|
106
|
+
const failingFeatures = featureList.features
|
|
107
|
+
.filter(f => !f.passes)
|
|
108
|
+
.sort((a, b) => a.priority - b.priority);
|
|
109
|
+
return failingFeatures[0] || null;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Mark a feature as passing
|
|
113
|
+
*/
|
|
114
|
+
export function markFeaturePassing(featureList, featureId, notes) {
|
|
115
|
+
const feature = featureList.features.find(f => f.id === featureId);
|
|
116
|
+
if (feature) {
|
|
117
|
+
feature.passes = true;
|
|
118
|
+
feature.last_tested = new Date().toISOString();
|
|
119
|
+
if (notes) {
|
|
120
|
+
feature.notes = notes;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return featureList;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get progress statistics
|
|
127
|
+
*/
|
|
128
|
+
export function getProgressStats(featureList) {
|
|
129
|
+
const total = featureList.features.length;
|
|
130
|
+
const passing = featureList.features.filter(f => f.passes).length;
|
|
131
|
+
const failing = total - passing;
|
|
132
|
+
const byCategory = {};
|
|
133
|
+
for (const feature of featureList.features) {
|
|
134
|
+
if (!byCategory[feature.category]) {
|
|
135
|
+
byCategory[feature.category] = { passing: 0, total: 0 };
|
|
136
|
+
}
|
|
137
|
+
const categoryStats = byCategory[feature.category];
|
|
138
|
+
if (categoryStats) {
|
|
139
|
+
categoryStats.total++;
|
|
140
|
+
if (feature.passes) {
|
|
141
|
+
categoryStats.passing++;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
total,
|
|
147
|
+
passing,
|
|
148
|
+
failing,
|
|
149
|
+
percentage: total > 0 ? Math.round((passing / total) * 100) : 0,
|
|
150
|
+
byCategory,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Generate a progress report string
|
|
155
|
+
*/
|
|
156
|
+
export function generateProgressReport(featureList) {
|
|
157
|
+
const stats = getProgressStats(featureList);
|
|
158
|
+
let report = `
|
|
159
|
+
═══════════════════════════════════════════════════════
|
|
160
|
+
PROGRESS REPORT
|
|
161
|
+
═══════════════════════════════════════════════════════
|
|
162
|
+
|
|
163
|
+
Project: ${featureList.project.name}
|
|
164
|
+
Last Updated: ${featureList.metadata.last_updated}
|
|
165
|
+
|
|
166
|
+
OVERALL PROGRESS: ${stats.passing}/${stats.total} (${stats.percentage}%)
|
|
167
|
+
${"█".repeat(Math.floor(stats.percentage / 5))}${"░".repeat(20 - Math.floor(stats.percentage / 5))}
|
|
168
|
+
|
|
169
|
+
BY CATEGORY:
|
|
170
|
+
`;
|
|
171
|
+
for (const [category, catStats] of Object.entries(stats.byCategory)) {
|
|
172
|
+
const catPercent = catStats.total > 0
|
|
173
|
+
? Math.round((catStats.passing / catStats.total) * 100)
|
|
174
|
+
: 0;
|
|
175
|
+
report += ` ${category.padEnd(15)} ${catStats.passing}/${catStats.total} (${catPercent}%)\n`;
|
|
176
|
+
}
|
|
177
|
+
report += `
|
|
178
|
+
═══════════════════════════════════════════════════════
|
|
179
|
+
`;
|
|
180
|
+
return report;
|
|
181
|
+
}
|
|
182
|
+
export default {
|
|
183
|
+
loadFeatureList,
|
|
184
|
+
saveFeatureList,
|
|
185
|
+
validateFeatureListUpdate,
|
|
186
|
+
getNextFeature,
|
|
187
|
+
markFeaturePassing,
|
|
188
|
+
getProgressStats,
|
|
189
|
+
generateProgressReport,
|
|
190
|
+
};
|
|
191
|
+
//# sourceMappingURL=feature-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-list.js","sourceRoot":"","sources":["../../src/utils/feature-list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAiDxD;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC;IAE3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,WAAwB;IACtD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC;IAE3C,IAAI,CAAC;QACH,gCAAgC;QAChC,WAAW,CAAC,QAAQ,CAAC,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClE,WAAW,CAAC,QAAQ,CAAC,gBAAgB,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;QAC1F,WAAW,CAAC,QAAQ,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE7D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACrD,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACnD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CACvC,QAAqB,EACrB,OAAoB;IAEpB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,iCAAiC;IACjC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACvD,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,qCAAqC,QAAQ,CAAC,QAAQ,CAAC,MAAM,cAAc,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE;SAC5G,CAAC;IACJ,CAAC;IAED,iEAAiE;IACjE,KAAK,MAAM,YAAY,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC;QAEzE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,WAAW,YAAY,CAAC,EAAE,oCAAoC;aACtE,CAAC;QACJ,CAAC;QAED,+BAA+B;QAC/B,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7E,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,wCAAwC,YAAY,CAAC,EAAE,wBAAwB;aACvF,CAAC;QACJ,CAAC;QAED,oCAAoC;QACpC,IAAI,YAAY,CAAC,WAAW,KAAK,WAAW,CAAC,WAAW,EAAE,CAAC;YACzD,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,yCAAyC,YAAY,CAAC,EAAE,+BAA+B;aAC/F,CAAC;QACJ,CAAC;QAED,iCAAiC;QACjC,IAAI,YAAY,CAAC,QAAQ,KAAK,WAAW,CAAC,QAAQ,EAAE,CAAC;YACnD,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,sCAAsC,YAAY,CAAC,EAAE,6BAA6B;aAC1F,CAAC;QACJ,CAAC;QAED,yDAAyD;QACzD,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YAC/C,QAAQ,CAAC,IAAI,CAAC,WAAW,YAAY,CAAC,EAAE,qCAAqC,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;KACrD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,WAAwB;IACrD,MAAM,eAAe,GAAG,WAAW,CAAC,QAAQ;SACzC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;SACtB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE3C,OAAO,eAAe,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAAwB,EACxB,SAAiB,EACjB,KAAc;IAEd,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IAEnE,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;QACtB,OAAO,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC/C,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAwB;IAOvD,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IAClE,MAAM,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC;IAEhC,MAAM,UAAU,GAAuD,EAAE,CAAC;IAE1E,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC1D,CAAC;QACD,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,aAAa,EAAE,CAAC;YAClB,aAAa,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,aAAa,CAAC,OAAO,EAAE,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK;QACL,OAAO;QACP,OAAO;QACP,UAAU,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAAwB;IAC7D,MAAM,KAAK,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE5C,IAAI,MAAM,GAAG;;;;;WAKJ,WAAW,CAAC,OAAO,CAAC,IAAI;gBACnB,WAAW,CAAC,QAAQ,CAAC,YAAY;;oBAE7B,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,UAAU;EACnE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;;;CAGjG,CAAC;IAEA,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACpE,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC;YACnC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;YACvD,CAAC,CAAC,CAAC,CAAC;QACN,MAAM,IAAI,KAAK,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,KAAK,KAAK,UAAU,MAAM,CAAC;IAChG,CAAC;IAED,MAAM,IAAI;;CAEX,CAAC;IAEA,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,eAAe;IACb,eAAe;IACf,eAAe;IACf,yBAAyB;IACzB,cAAc;IACd,kBAAkB;IAClB,gBAAgB;IAChB,sBAAsB;CACvB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini Code Assist Detector
|
|
3
|
+
* Detects Gemini Code Assist subscription credentials and quota status.
|
|
4
|
+
* Supports both API key and Google Cloud auth flows.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2025 Dobeu Tech Solutions LLC
|
|
7
|
+
* Licensed under CC BY-NC 4.0
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Gemini credential structure
|
|
11
|
+
*/
|
|
12
|
+
export interface GeminiCredentials {
|
|
13
|
+
apiKey?: string;
|
|
14
|
+
accessToken?: string;
|
|
15
|
+
refreshToken?: string;
|
|
16
|
+
expiresAt?: number;
|
|
17
|
+
projectId?: string;
|
|
18
|
+
quotaProjectId?: string;
|
|
19
|
+
email?: string;
|
|
20
|
+
tier?: 'free' | 'code_assist' | 'enterprise';
|
|
21
|
+
authMethod: 'api_key' | 'gcloud' | 'service_account';
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Gemini quota information
|
|
25
|
+
*/
|
|
26
|
+
export interface GeminiQuota {
|
|
27
|
+
requestsPerMinute: number;
|
|
28
|
+
requestsPerDay: number;
|
|
29
|
+
tokensPerMinute: number;
|
|
30
|
+
currentUsage?: {
|
|
31
|
+
requestsToday: number;
|
|
32
|
+
tokensToday: number;
|
|
33
|
+
lastReset: string;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Possible paths where Gemini credentials might be stored
|
|
38
|
+
*/
|
|
39
|
+
export declare function getGeminiPaths(): string[];
|
|
40
|
+
/**
|
|
41
|
+
* Check if access token is expired
|
|
42
|
+
*/
|
|
43
|
+
export declare function isTokenExpired(credentials: GeminiCredentials): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Refresh gcloud access token
|
|
46
|
+
*/
|
|
47
|
+
export declare function refreshGCloudToken(): Promise<GeminiCredentials | null>;
|
|
48
|
+
/**
|
|
49
|
+
* Get quota information from the API
|
|
50
|
+
*/
|
|
51
|
+
export declare function getQuotaInfo(credentials: GeminiCredentials): Promise<GeminiQuota | null>;
|
|
52
|
+
/**
|
|
53
|
+
* Validate Gemini credentials
|
|
54
|
+
*/
|
|
55
|
+
export declare function validateGeminiCredentials(credentials: GeminiCredentials): Promise<boolean>;
|
|
56
|
+
/**
|
|
57
|
+
* Main detection function
|
|
58
|
+
*/
|
|
59
|
+
export declare function detectGeminiCredentials(): Promise<GeminiCredentials | null>;
|
|
60
|
+
/**
|
|
61
|
+
* Get credential status string
|
|
62
|
+
*/
|
|
63
|
+
export declare function getCredentialStatus(credentials: GeminiCredentials): string;
|
|
64
|
+
export default detectGeminiCredentials;
|
|
65
|
+
//# sourceMappingURL=gemini-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-detector.d.ts","sourceRoot":"","sources":["../../src/utils/gemini-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,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,aAAa,GAAG,YAAY,CAAC;IAC7C,UAAU,EAAE,SAAS,GAAG,QAAQ,GAAG,iBAAiB,CAAC;CACtD;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE;QACb,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAwBzC;AAuJD;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAiBtE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAoB5E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA6B9F;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,iBAAiB,GAC7B,OAAO,CAAC,OAAO,CAAC,CAmBlB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA0CjF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,iBAAiB,GAAG,MAAM,CA6B1E;AAED,eAAe,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini Code Assist Detector
|
|
3
|
+
* Detects Gemini Code Assist subscription credentials and quota status.
|
|
4
|
+
* Supports both API key and Google Cloud auth flows.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2025 Dobeu Tech Solutions LLC
|
|
7
|
+
* Licensed under CC BY-NC 4.0
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync } from 'fs';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { homedir } from 'os';
|
|
12
|
+
import { exec } from 'child_process';
|
|
13
|
+
import { promisify } from 'util';
|
|
14
|
+
const execAsync = promisify(exec);
|
|
15
|
+
/**
|
|
16
|
+
* Possible paths where Gemini credentials might be stored
|
|
17
|
+
*/
|
|
18
|
+
export function getGeminiPaths() {
|
|
19
|
+
const home = homedir();
|
|
20
|
+
return [
|
|
21
|
+
// Gemini CLI paths
|
|
22
|
+
join(home, '.gemini', 'credentials.json'),
|
|
23
|
+
join(home, '.gemini', 'auth.json'),
|
|
24
|
+
join(home, '.config', 'gemini', 'credentials.json'),
|
|
25
|
+
// Google Cloud SDK paths
|
|
26
|
+
join(home, '.config', 'gcloud', 'application_default_credentials.json'),
|
|
27
|
+
join(home, '.config', 'gcloud', 'credentials.db'),
|
|
28
|
+
// Service account paths
|
|
29
|
+
join(home, '.config', 'gcloud', 'service_account.json'),
|
|
30
|
+
// Google AI Studio paths
|
|
31
|
+
join(home, '.google-ai', 'credentials.json'),
|
|
32
|
+
join(home, '.config', 'google-ai', 'credentials.json'),
|
|
33
|
+
// Windows-specific paths
|
|
34
|
+
join(process.env.APPDATA || '', 'gcloud', 'application_default_credentials.json'),
|
|
35
|
+
join(process.env.LOCALAPPDATA || '', 'Google', 'Cloud SDK', 'credentials.json'),
|
|
36
|
+
].filter(p => p && !p.startsWith(join('')));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Try to detect credentials using gcloud CLI
|
|
40
|
+
*/
|
|
41
|
+
async function detectFromGCloudCLI() {
|
|
42
|
+
try {
|
|
43
|
+
// Check if gcloud is available and authenticated
|
|
44
|
+
const { stdout: authList } = await execAsync('gcloud auth list --format=json', {
|
|
45
|
+
timeout: 5000,
|
|
46
|
+
});
|
|
47
|
+
const accounts = JSON.parse(authList);
|
|
48
|
+
const activeAccount = accounts.find((a) => a.status === 'ACTIVE');
|
|
49
|
+
if (!activeAccount) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
// Get access token
|
|
53
|
+
const { stdout: tokenOutput } = await execAsync('gcloud auth print-access-token', {
|
|
54
|
+
timeout: 5000,
|
|
55
|
+
});
|
|
56
|
+
const accessToken = tokenOutput.trim();
|
|
57
|
+
if (!accessToken) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
// Get project info
|
|
61
|
+
let projectId;
|
|
62
|
+
try {
|
|
63
|
+
const { stdout: projectOutput } = await execAsync('gcloud config get-value project', {
|
|
64
|
+
timeout: 5000,
|
|
65
|
+
});
|
|
66
|
+
projectId = projectOutput.trim() || undefined;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Project not set
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
accessToken,
|
|
73
|
+
email: activeAccount.account,
|
|
74
|
+
projectId,
|
|
75
|
+
authMethod: 'gcloud',
|
|
76
|
+
tier: 'code_assist', // gcloud auth typically indicates Code Assist
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// gcloud CLI not available
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Try to detect credentials using gemini CLI
|
|
86
|
+
*/
|
|
87
|
+
async function detectFromGeminiCLI() {
|
|
88
|
+
try {
|
|
89
|
+
// Try using gemini CLI to get auth info
|
|
90
|
+
const { stdout } = await execAsync('gemini auth show --format json', {
|
|
91
|
+
timeout: 5000,
|
|
92
|
+
});
|
|
93
|
+
const config = JSON.parse(stdout);
|
|
94
|
+
if (config.apiKey || config.api_key) {
|
|
95
|
+
return {
|
|
96
|
+
apiKey: config.apiKey || config.api_key,
|
|
97
|
+
projectId: config.projectId || config.project_id,
|
|
98
|
+
email: config.email,
|
|
99
|
+
authMethod: 'api_key',
|
|
100
|
+
tier: config.tier || 'free',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (config.accessToken || config.access_token) {
|
|
104
|
+
return {
|
|
105
|
+
accessToken: config.accessToken || config.access_token,
|
|
106
|
+
refreshToken: config.refreshToken || config.refresh_token,
|
|
107
|
+
expiresAt: config.expiresAt || config.expires_at,
|
|
108
|
+
projectId: config.projectId || config.project_id,
|
|
109
|
+
email: config.email,
|
|
110
|
+
authMethod: 'gcloud',
|
|
111
|
+
tier: config.tier || 'code_assist',
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// CLI not available
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Try to detect credentials from file system
|
|
123
|
+
*/
|
|
124
|
+
async function detectFromFiles() {
|
|
125
|
+
const paths = getGeminiPaths();
|
|
126
|
+
for (const path of paths) {
|
|
127
|
+
try {
|
|
128
|
+
if (!existsSync(path)) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
const content = readFileSync(path, 'utf-8');
|
|
132
|
+
const data = JSON.parse(content);
|
|
133
|
+
// Check for API key
|
|
134
|
+
if (data.api_key || data.apiKey) {
|
|
135
|
+
return {
|
|
136
|
+
apiKey: data.api_key || data.apiKey,
|
|
137
|
+
projectId: data.project_id || data.projectId,
|
|
138
|
+
quotaProjectId: data.quota_project_id || data.quotaProjectId,
|
|
139
|
+
email: data.email || data.client_email,
|
|
140
|
+
authMethod: 'api_key',
|
|
141
|
+
tier: 'free',
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
// Check for OAuth credentials (application_default_credentials.json)
|
|
145
|
+
if (data.type === 'authorized_user') {
|
|
146
|
+
return {
|
|
147
|
+
accessToken: data.access_token,
|
|
148
|
+
refreshToken: data.refresh_token,
|
|
149
|
+
email: data.client_email,
|
|
150
|
+
authMethod: 'gcloud',
|
|
151
|
+
tier: 'code_assist',
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
// Check for service account
|
|
155
|
+
if (data.type === 'service_account') {
|
|
156
|
+
return {
|
|
157
|
+
email: data.client_email,
|
|
158
|
+
projectId: data.project_id,
|
|
159
|
+
authMethod: 'service_account',
|
|
160
|
+
tier: 'enterprise',
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// Failed to read or parse
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Check if access token is expired
|
|
173
|
+
*/
|
|
174
|
+
export function isTokenExpired(credentials) {
|
|
175
|
+
// API keys don't expire
|
|
176
|
+
if (credentials.authMethod === 'api_key' && credentials.apiKey) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
if (!credentials.expiresAt) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
let expiresAt = credentials.expiresAt;
|
|
183
|
+
if (expiresAt < 1e12) {
|
|
184
|
+
expiresAt *= 1000;
|
|
185
|
+
}
|
|
186
|
+
const graceMs = 5 * 60 * 1000;
|
|
187
|
+
return expiresAt - graceMs < Date.now();
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Refresh gcloud access token
|
|
191
|
+
*/
|
|
192
|
+
export async function refreshGCloudToken() {
|
|
193
|
+
try {
|
|
194
|
+
const { stdout } = await execAsync('gcloud auth print-access-token', {
|
|
195
|
+
timeout: 10000,
|
|
196
|
+
});
|
|
197
|
+
const accessToken = stdout.trim();
|
|
198
|
+
if (accessToken) {
|
|
199
|
+
return {
|
|
200
|
+
accessToken,
|
|
201
|
+
authMethod: 'gcloud',
|
|
202
|
+
// Token expires in 1 hour typically
|
|
203
|
+
expiresAt: Date.now() + 60 * 60 * 1000,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get quota information from the API
|
|
214
|
+
*/
|
|
215
|
+
export async function getQuotaInfo(credentials) {
|
|
216
|
+
try {
|
|
217
|
+
const key = credentials.apiKey || credentials.accessToken;
|
|
218
|
+
if (!key)
|
|
219
|
+
return null;
|
|
220
|
+
// Default quotas based on tier
|
|
221
|
+
const quotas = {
|
|
222
|
+
free: {
|
|
223
|
+
requestsPerMinute: 60,
|
|
224
|
+
requestsPerDay: 1500,
|
|
225
|
+
tokensPerMinute: 32000,
|
|
226
|
+
},
|
|
227
|
+
code_assist: {
|
|
228
|
+
requestsPerMinute: 1000,
|
|
229
|
+
requestsPerDay: 50000,
|
|
230
|
+
tokensPerMinute: 120000,
|
|
231
|
+
},
|
|
232
|
+
enterprise: {
|
|
233
|
+
requestsPerMinute: 10000,
|
|
234
|
+
requestsPerDay: 500000,
|
|
235
|
+
tokensPerMinute: 1000000,
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
const quota = quotas[credentials.tier || 'free'];
|
|
239
|
+
return quota || null;
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Validate Gemini credentials
|
|
247
|
+
*/
|
|
248
|
+
export async function validateGeminiCredentials(credentials) {
|
|
249
|
+
try {
|
|
250
|
+
const key = credentials.apiKey || credentials.accessToken;
|
|
251
|
+
if (!key)
|
|
252
|
+
return false;
|
|
253
|
+
const url = credentials.apiKey
|
|
254
|
+
? `https://generativelanguage.googleapis.com/v1beta/models?key=${key}`
|
|
255
|
+
: 'https://generativelanguage.googleapis.com/v1beta/models';
|
|
256
|
+
const headers = {};
|
|
257
|
+
if (credentials.accessToken) {
|
|
258
|
+
headers['Authorization'] = `Bearer ${credentials.accessToken}`;
|
|
259
|
+
}
|
|
260
|
+
const response = await fetch(url, { method: 'GET', headers });
|
|
261
|
+
return response.status === 200;
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
return true; // Assume valid on network error
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Main detection function
|
|
269
|
+
*/
|
|
270
|
+
export async function detectGeminiCredentials() {
|
|
271
|
+
// Check environment variable first
|
|
272
|
+
const envApiKey = process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY;
|
|
273
|
+
if (envApiKey) {
|
|
274
|
+
return {
|
|
275
|
+
apiKey: envApiKey,
|
|
276
|
+
authMethod: 'api_key',
|
|
277
|
+
tier: 'free',
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
// Try Gemini CLI
|
|
281
|
+
const geminiCreds = await detectFromGeminiCLI();
|
|
282
|
+
if (geminiCreds) {
|
|
283
|
+
if (!isTokenExpired(geminiCreds)) {
|
|
284
|
+
return geminiCreds;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// Try gcloud CLI
|
|
288
|
+
const gcloudCreds = await detectFromGCloudCLI();
|
|
289
|
+
if (gcloudCreds) {
|
|
290
|
+
return gcloudCreds;
|
|
291
|
+
}
|
|
292
|
+
// Try file detection
|
|
293
|
+
const fileCreds = await detectFromFiles();
|
|
294
|
+
if (fileCreds) {
|
|
295
|
+
if (!isTokenExpired(fileCreds)) {
|
|
296
|
+
return fileCreds;
|
|
297
|
+
}
|
|
298
|
+
// Try refresh for gcloud auth
|
|
299
|
+
if (fileCreds.authMethod === 'gcloud') {
|
|
300
|
+
const refreshed = await refreshGCloudToken();
|
|
301
|
+
if (refreshed) {
|
|
302
|
+
return { ...fileCreds, ...refreshed };
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return null;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Get credential status string
|
|
310
|
+
*/
|
|
311
|
+
export function getCredentialStatus(credentials) {
|
|
312
|
+
const parts = [];
|
|
313
|
+
parts.push(`Method: ${credentials.authMethod}`);
|
|
314
|
+
parts.push(`Tier: ${credentials.tier || 'unknown'}`);
|
|
315
|
+
if (credentials.email) {
|
|
316
|
+
parts.push(`Email: ${credentials.email}`);
|
|
317
|
+
}
|
|
318
|
+
if (credentials.projectId) {
|
|
319
|
+
parts.push(`Project: ${credentials.projectId}`);
|
|
320
|
+
}
|
|
321
|
+
if (credentials.authMethod === 'api_key') {
|
|
322
|
+
parts.push('Status: Valid (API key)');
|
|
323
|
+
}
|
|
324
|
+
else if (credentials.expiresAt) {
|
|
325
|
+
const msUntil = credentials.expiresAt - Date.now();
|
|
326
|
+
if (msUntil <= 0) {
|
|
327
|
+
parts.push('Status: Expired');
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
const minsUntil = Math.ceil(msUntil / (60 * 1000));
|
|
331
|
+
parts.push(`Expires in: ${minsUntil} minutes`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
parts.push('Status: Valid');
|
|
336
|
+
}
|
|
337
|
+
return parts.join(' | ');
|
|
338
|
+
}
|
|
339
|
+
export default detectGeminiCredentials;
|
|
340
|
+
//# sourceMappingURL=gemini-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-detector.js","sourceRoot":"","sources":["../../src/utils/gemini-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced Git Utilities
|
|
3
|
+
* Provides git operations, conflict detection, branch management, and change tracking.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Git status information
|
|
7
|
+
*/
|
|
8
|
+
export interface GitStatus {
|
|
9
|
+
hasChanges: boolean;
|
|
10
|
+
hasUncommittedChanges: boolean;
|
|
11
|
+
hasUntrackedFiles: boolean;
|
|
12
|
+
hasConflicts: boolean;
|
|
13
|
+
currentBranch: string | null;
|
|
14
|
+
aheadOfRemote: number;
|
|
15
|
+
behindRemote: number;
|
|
16
|
+
lastCommit: string | null;
|
|
17
|
+
lastCommitMessage: string | null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check if git is initialized
|
|
21
|
+
*/
|
|
22
|
+
export declare function isGitInitialized(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Get git status summary
|
|
25
|
+
* Note: This provides hints - actual status requires running git commands
|
|
26
|
+
*/
|
|
27
|
+
export declare function getGitStatus(): GitStatus;
|
|
28
|
+
/**
|
|
29
|
+
* Check for merge conflicts
|
|
30
|
+
*/
|
|
31
|
+
export declare function hasMergeConflicts(): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Generate git status summary for agent prompts
|
|
34
|
+
*/
|
|
35
|
+
export declare function generateGitSummary(): string;
|
|
36
|
+
/**
|
|
37
|
+
* Get recommended git workflow
|
|
38
|
+
*/
|
|
39
|
+
export declare function getGitWorkflow(): string[];
|
|
40
|
+
declare const _default: {
|
|
41
|
+
isGitInitialized: typeof isGitInitialized;
|
|
42
|
+
getGitStatus: typeof getGitStatus;
|
|
43
|
+
hasMergeConflicts: typeof hasMergeConflicts;
|
|
44
|
+
generateGitSummary: typeof generateGitSummary;
|
|
45
|
+
getGitWorkflow: typeof getGitWorkflow;
|
|
46
|
+
};
|
|
47
|
+
export default _default;
|
|
48
|
+
//# sourceMappingURL=git-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-utils.d.ts","sourceRoot":"","sources":["../../src/utils/git-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAG1C;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,SAAS,CA+BxC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAgB3C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CA2B3C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAQzC;;;;;;;;AAED,wBAME"}
|