geeto 0.1.0-beta.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 +21 -0
- package/README.md +152 -0
- package/lib/api/copilot-adapter.d.ts +11 -0
- package/lib/api/copilot-adapter.d.ts.map +1 -0
- package/lib/api/copilot-adapter.js +41 -0
- package/lib/api/copilot-adapter.js.map +1 -0
- package/lib/api/copilot-sdk.d.ts +48 -0
- package/lib/api/copilot-sdk.d.ts.map +1 -0
- package/lib/api/copilot-sdk.js +451 -0
- package/lib/api/copilot-sdk.js.map +1 -0
- package/lib/api/copilot.d.ts +21 -0
- package/lib/api/copilot.d.ts.map +1 -0
- package/lib/api/copilot.js +87 -0
- package/lib/api/copilot.js.map +1 -0
- package/lib/api/gemini-sdk.d.ts +24 -0
- package/lib/api/gemini-sdk.d.ts.map +1 -0
- package/lib/api/gemini-sdk.js +245 -0
- package/lib/api/gemini-sdk.js.map +1 -0
- package/lib/api/gemini.d.ts +21 -0
- package/lib/api/gemini.d.ts.map +1 -0
- package/lib/api/gemini.js +87 -0
- package/lib/api/gemini.js.map +1 -0
- package/lib/api/openrouter-sdk.d.ts +58 -0
- package/lib/api/openrouter-sdk.d.ts.map +1 -0
- package/lib/api/openrouter-sdk.js +341 -0
- package/lib/api/openrouter-sdk.js.map +1 -0
- package/lib/api/openrouter.d.ts +17 -0
- package/lib/api/openrouter.d.ts.map +1 -0
- package/lib/api/openrouter.js +111 -0
- package/lib/api/openrouter.js.map +1 -0
- package/lib/api/trello.d.ts +17 -0
- package/lib/api/trello.d.ts.map +1 -0
- package/lib/api/trello.js +72 -0
- package/lib/api/trello.js.map +1 -0
- package/lib/cli/input.d.ts +39 -0
- package/lib/cli/input.d.ts.map +1 -0
- package/lib/cli/input.js +119 -0
- package/lib/cli/input.js.map +1 -0
- package/lib/cli/menu.d.ts +9 -0
- package/lib/cli/menu.d.ts.map +1 -0
- package/lib/cli/menu.js +201 -0
- package/lib/cli/menu.js.map +1 -0
- package/lib/core/constants.d.ts +22 -0
- package/lib/core/constants.d.ts.map +1 -0
- package/lib/core/constants.js +24 -0
- package/lib/core/constants.js.map +1 -0
- package/lib/core/copilot-setup.d.ts +13 -0
- package/lib/core/copilot-setup.d.ts.map +1 -0
- package/lib/core/copilot-setup.js +447 -0
- package/lib/core/copilot-setup.js.map +1 -0
- package/lib/core/gemini-setup.d.ts +8 -0
- package/lib/core/gemini-setup.d.ts.map +1 -0
- package/lib/core/gemini-setup.js +84 -0
- package/lib/core/gemini-setup.js.map +1 -0
- package/lib/core/menu-constants.d.ts +24 -0
- package/lib/core/menu-constants.d.ts.map +1 -0
- package/lib/core/menu-constants.js +22 -0
- package/lib/core/menu-constants.js.map +1 -0
- package/lib/core/openrouter-setup.d.ts +8 -0
- package/lib/core/openrouter-setup.d.ts.map +1 -0
- package/lib/core/openrouter-setup.js +73 -0
- package/lib/core/openrouter-setup.js.map +1 -0
- package/lib/core/setup.d.ts +21 -0
- package/lib/core/setup.d.ts.map +1 -0
- package/lib/core/setup.js +88 -0
- package/lib/core/setup.js.map +1 -0
- package/lib/core/trello-setup.d.ts +8 -0
- package/lib/core/trello-setup.d.ts.map +1 -0
- package/lib/core/trello-setup.js +107 -0
- package/lib/core/trello-setup.js.map +1 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +250 -0
- package/lib/index.js.map +1 -0
- package/lib/types/index.d.ts +78 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +2 -0
- package/lib/types/index.js.map +1 -0
- package/lib/utils/branch-naming.d.ts +11 -0
- package/lib/utils/branch-naming.d.ts.map +1 -0
- package/lib/utils/branch-naming.js +396 -0
- package/lib/utils/branch-naming.js.map +1 -0
- package/lib/utils/colors.d.ts +14 -0
- package/lib/utils/colors.d.ts.map +1 -0
- package/lib/utils/colors.js +14 -0
- package/lib/utils/colors.js.map +1 -0
- package/lib/utils/commit-helpers.d.ts +53 -0
- package/lib/utils/commit-helpers.d.ts.map +1 -0
- package/lib/utils/commit-helpers.js +177 -0
- package/lib/utils/commit-helpers.js.map +1 -0
- package/lib/utils/config.d.ts +87 -0
- package/lib/utils/config.d.ts.map +1 -0
- package/lib/utils/config.js +326 -0
- package/lib/utils/config.js.map +1 -0
- package/lib/utils/display.d.ts +27 -0
- package/lib/utils/display.d.ts.map +1 -0
- package/lib/utils/display.js +116 -0
- package/lib/utils/display.js.map +1 -0
- package/lib/utils/error-helpers.d.ts +27 -0
- package/lib/utils/error-helpers.d.ts.map +1 -0
- package/lib/utils/error-helpers.js +102 -0
- package/lib/utils/error-helpers.js.map +1 -0
- package/lib/utils/exec.d.ts +18 -0
- package/lib/utils/exec.d.ts.map +1 -0
- package/lib/utils/exec.js +96 -0
- package/lib/utils/exec.js.map +1 -0
- package/lib/utils/git-ai-errors.d.ts +10 -0
- package/lib/utils/git-ai-errors.d.ts.map +1 -0
- package/lib/utils/git-ai-errors.js +71 -0
- package/lib/utils/git-ai-errors.js.map +1 -0
- package/lib/utils/git-ai.d.ts +26 -0
- package/lib/utils/git-ai.d.ts.map +1 -0
- package/lib/utils/git-ai.js +603 -0
- package/lib/utils/git-ai.js.map +1 -0
- package/lib/utils/git-commands.d.ts +21 -0
- package/lib/utils/git-commands.d.ts.map +1 -0
- package/lib/utils/git-commands.js +58 -0
- package/lib/utils/git-commands.js.map +1 -0
- package/lib/utils/git-errors.d.ts +76 -0
- package/lib/utils/git-errors.d.ts.map +1 -0
- package/lib/utils/git-errors.js +565 -0
- package/lib/utils/git-errors.js.map +1 -0
- package/lib/utils/git.d.ts +61 -0
- package/lib/utils/git.d.ts.map +1 -0
- package/lib/utils/git.js +245 -0
- package/lib/utils/git.js.map +1 -0
- package/lib/utils/logging.d.ts +25 -0
- package/lib/utils/logging.d.ts.map +1 -0
- package/lib/utils/logging.js +71 -0
- package/lib/utils/logging.js.map +1 -0
- package/lib/utils/menu-builders.d.ts +47 -0
- package/lib/utils/menu-builders.d.ts.map +1 -0
- package/lib/utils/menu-builders.js +34 -0
- package/lib/utils/menu-builders.js.map +1 -0
- package/lib/utils/platform.d.ts +13 -0
- package/lib/utils/platform.d.ts.map +1 -0
- package/lib/utils/platform.js +32 -0
- package/lib/utils/platform.js.map +1 -0
- package/lib/utils/spinner-wrapper.d.ts +16 -0
- package/lib/utils/spinner-wrapper.d.ts.map +1 -0
- package/lib/utils/spinner-wrapper.js +56 -0
- package/lib/utils/spinner-wrapper.js.map +1 -0
- package/lib/utils/state.d.ts +22 -0
- package/lib/utils/state.d.ts.map +1 -0
- package/lib/utils/state.js +75 -0
- package/lib/utils/state.js.map +1 -0
- package/lib/utils/time.d.ts +4 -0
- package/lib/utils/time.d.ts.map +1 -0
- package/lib/utils/time.js +29 -0
- package/lib/utils/time.js.map +1 -0
- package/lib/utils/type-guards.d.ts +10 -0
- package/lib/utils/type-guards.d.ts.map +1 -0
- package/lib/utils/type-guards.js +29 -0
- package/lib/utils/type-guards.js.map +1 -0
- package/lib/workflows/ai-provider.d.ts +13 -0
- package/lib/workflows/ai-provider.d.ts.map +1 -0
- package/lib/workflows/ai-provider.js +55 -0
- package/lib/workflows/ai-provider.js.map +1 -0
- package/lib/workflows/author.d.ts +4 -0
- package/lib/workflows/author.d.ts.map +1 -0
- package/lib/workflows/author.js +80 -0
- package/lib/workflows/author.js.map +1 -0
- package/lib/workflows/branch-helpers.d.ts +9 -0
- package/lib/workflows/branch-helpers.d.ts.map +1 -0
- package/lib/workflows/branch-helpers.js +406 -0
- package/lib/workflows/branch-helpers.js.map +1 -0
- package/lib/workflows/branch-utils.d.ts +9 -0
- package/lib/workflows/branch-utils.d.ts.map +1 -0
- package/lib/workflows/branch-utils.js +61 -0
- package/lib/workflows/branch-utils.js.map +1 -0
- package/lib/workflows/branch.d.ts +12 -0
- package/lib/workflows/branch.d.ts.map +1 -0
- package/lib/workflows/branch.js +555 -0
- package/lib/workflows/branch.js.map +1 -0
- package/lib/workflows/cleanup.d.ts +10 -0
- package/lib/workflows/cleanup.d.ts.map +1 -0
- package/lib/workflows/cleanup.js +287 -0
- package/lib/workflows/cleanup.js.map +1 -0
- package/lib/workflows/commit.d.ts +10 -0
- package/lib/workflows/commit.d.ts.map +1 -0
- package/lib/workflows/commit.js +771 -0
- package/lib/workflows/commit.js.map +1 -0
- package/lib/workflows/main-steps.d.ts +12 -0
- package/lib/workflows/main-steps.d.ts.map +1 -0
- package/lib/workflows/main-steps.js +407 -0
- package/lib/workflows/main-steps.js.map +1 -0
- package/lib/workflows/main.d.ts +8 -0
- package/lib/workflows/main.d.ts.map +1 -0
- package/lib/workflows/main.js +720 -0
- package/lib/workflows/main.js.map +1 -0
- package/lib/workflows/security-gate.d.ts +8 -0
- package/lib/workflows/security-gate.d.ts.map +1 -0
- package/lib/workflows/security-gate.js +447 -0
- package/lib/workflows/security-gate.js.map +1 -0
- package/lib/workflows/settings.d.ts +15 -0
- package/lib/workflows/settings.d.ts.map +1 -0
- package/lib/workflows/settings.js +438 -0
- package/lib/workflows/settings.js.map +1 -0
- package/lib/workflows/trello-menu.d.ts +16 -0
- package/lib/workflows/trello-menu.d.ts.map +1 -0
- package/lib/workflows/trello-menu.js +361 -0
- package/lib/workflows/trello-menu.js.map +1 -0
- package/package.json +112 -0
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
import { DEFAULT_GEMINI_MODEL } from './config.js';
|
|
2
|
+
import { isContextLimitFailure, isTransientAIFailure } from './git-ai-errors.js';
|
|
3
|
+
import { log } from '../utils/logging.js';
|
|
4
|
+
// Re-export error detection functions for backward compatibility
|
|
5
|
+
export { isContextLimitFailure, isTransientAIFailure };
|
|
6
|
+
// execGit not needed here
|
|
7
|
+
/** Return the canonical string value for a model (object or string) */
|
|
8
|
+
export function getModelValue(m) {
|
|
9
|
+
if (!m) {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
if (typeof m === 'string') {
|
|
13
|
+
return m;
|
|
14
|
+
}
|
|
15
|
+
// model objects expose a `value` property in our menus
|
|
16
|
+
return m.value;
|
|
17
|
+
}
|
|
18
|
+
/** Return a friendly provider name. */
|
|
19
|
+
export function getAIProviderDisplayName(aiProvider) {
|
|
20
|
+
switch (aiProvider) {
|
|
21
|
+
case 'gemini': {
|
|
22
|
+
return 'Gemini';
|
|
23
|
+
}
|
|
24
|
+
case 'copilot': {
|
|
25
|
+
return 'GitHub Copilot (Recommended)';
|
|
26
|
+
}
|
|
27
|
+
case 'openrouter': {
|
|
28
|
+
return 'OpenRouter';
|
|
29
|
+
}
|
|
30
|
+
default: {
|
|
31
|
+
return 'Manual';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** Short provider name for brief displays. */
|
|
36
|
+
export function getAIProviderShortName(aiProvider) {
|
|
37
|
+
switch (aiProvider) {
|
|
38
|
+
case 'gemini': {
|
|
39
|
+
return 'Gemini';
|
|
40
|
+
}
|
|
41
|
+
case 'copilot': {
|
|
42
|
+
return 'GitHub Copilot';
|
|
43
|
+
}
|
|
44
|
+
case 'openrouter': {
|
|
45
|
+
return 'OpenRouter';
|
|
46
|
+
}
|
|
47
|
+
default: {
|
|
48
|
+
return 'Manual';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Return the model to show for a provider. */
|
|
53
|
+
export function getModelDisplayName(aiProvider, model) {
|
|
54
|
+
if (aiProvider === 'gemini') {
|
|
55
|
+
// don't rely on config-stored model; prefer explicit model param then default
|
|
56
|
+
return model ?? DEFAULT_GEMINI_MODEL;
|
|
57
|
+
}
|
|
58
|
+
if (!model) {
|
|
59
|
+
return '';
|
|
60
|
+
}
|
|
61
|
+
return model;
|
|
62
|
+
}
|
|
63
|
+
/** Ask the right provider to generate a branch-name suffix. */
|
|
64
|
+
export async function generateBranchNameWithProvider(aiProvider, title, correction, copilotModel, openrouterModel, geminiModel) {
|
|
65
|
+
switch (aiProvider) {
|
|
66
|
+
case 'gemini': {
|
|
67
|
+
const { generateBranchName } = await import('../api/gemini.js');
|
|
68
|
+
return generateBranchName(title, correction, geminiModel);
|
|
69
|
+
}
|
|
70
|
+
case 'copilot': {
|
|
71
|
+
const { generateBranchName } = await import('../api/copilot.js');
|
|
72
|
+
return generateBranchName(title, correction, copilotModel);
|
|
73
|
+
}
|
|
74
|
+
default: {
|
|
75
|
+
const { generateBranchName } = await import('../api/openrouter.js');
|
|
76
|
+
return generateBranchName(title, correction, openrouterModel);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Interactive fallback menu when AI generation fails.
|
|
82
|
+
*/
|
|
83
|
+
export async function interactiveAIFallback(currentSuffix, aiProvider, model, diff, correction, _currentBranch, updateModel, isCommit = false) {
|
|
84
|
+
const { select } = await import('../cli/menu.js');
|
|
85
|
+
const isTransientFailure = isTransientAIFailure;
|
|
86
|
+
let aiSuffix = currentSuffix;
|
|
87
|
+
const failedModels = new Set();
|
|
88
|
+
// track the current model (may be a string or a provider-specific model object)
|
|
89
|
+
let currentModel = model;
|
|
90
|
+
// Loop until manual pick or non-rate result
|
|
91
|
+
while (true) {
|
|
92
|
+
// If we have a valid suffix (not a failure), return it
|
|
93
|
+
if (aiSuffix && !isTransientFailure(aiSuffix)) {
|
|
94
|
+
return aiSuffix;
|
|
95
|
+
}
|
|
96
|
+
// aiSuffix is null/transient — show interactive alternatives menu
|
|
97
|
+
let choices = [
|
|
98
|
+
{
|
|
99
|
+
label: `Try a different ${getAIProviderShortName(aiProvider)} model`,
|
|
100
|
+
value: 'different-model',
|
|
101
|
+
},
|
|
102
|
+
{ label: 'Try a different AI provider', value: 'different-provider' },
|
|
103
|
+
{ label: 'Manual input', value: 'manual' },
|
|
104
|
+
];
|
|
105
|
+
// If this failure is due to context/token limits, prefer forcing the user
|
|
106
|
+
// to pick a different model or provider (retrying the same model won't help).
|
|
107
|
+
const contextLimit = isContextLimitFailure(aiSuffix);
|
|
108
|
+
if (contextLimit && typeof currentModel === 'string') {
|
|
109
|
+
// mark the current model string as failed to avoid reselecting it
|
|
110
|
+
failedModels.add(currentModel);
|
|
111
|
+
}
|
|
112
|
+
if (aiSuffix && isTransientFailure(aiSuffix)) {
|
|
113
|
+
// Decide whether to show "Try a different <provider> model".
|
|
114
|
+
// Hide it when there are no alternative models left or when the
|
|
115
|
+
// failure clearly indicates provider-wide quota exhaustion.
|
|
116
|
+
const low = String(aiSuffix).toLowerCase();
|
|
117
|
+
let showDifferentModel = true;
|
|
118
|
+
// If message clearly indicates quota or subscription problem, don't offer model switch
|
|
119
|
+
if (low.includes('quota') ||
|
|
120
|
+
low.includes('no quota') ||
|
|
121
|
+
low.includes('quota_exceeded') ||
|
|
122
|
+
low.includes('insufficient') ||
|
|
123
|
+
low.includes('payment') ||
|
|
124
|
+
/subscription/.test(low)) {
|
|
125
|
+
showDifferentModel = false;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
// Otherwise, check whether there are alternative models available
|
|
129
|
+
switch (aiProvider) {
|
|
130
|
+
case 'gemini': {
|
|
131
|
+
const gem = await import('../api/gemini.js');
|
|
132
|
+
const models = await gem.getGeminiModels();
|
|
133
|
+
// Always offer all models (do not hide models marked as failed)
|
|
134
|
+
const available = models;
|
|
135
|
+
if (available.length === 0) {
|
|
136
|
+
showDifferentModel = false;
|
|
137
|
+
}
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
case 'copilot': {
|
|
141
|
+
const cop = await import('../api/copilot.js');
|
|
142
|
+
const models = await cop.getCopilotModels();
|
|
143
|
+
// Always offer all models (do not hide models marked as failed)
|
|
144
|
+
const available = models;
|
|
145
|
+
if (available.length === 0) {
|
|
146
|
+
showDifferentModel = false;
|
|
147
|
+
}
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
case 'openrouter': {
|
|
151
|
+
const open = await import('../api/openrouter.js');
|
|
152
|
+
const models = await open.getOpenRouterModels();
|
|
153
|
+
// Always offer all models (do not hide models marked as failed)
|
|
154
|
+
const available = models;
|
|
155
|
+
if (available.length === 0) {
|
|
156
|
+
showDifferentModel = false;
|
|
157
|
+
}
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
default: {
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
choices = [
|
|
166
|
+
{
|
|
167
|
+
label: `Try again with ${getAIProviderShortName(aiProvider)}${getModelValue(currentModel) ? ` (${getModelValue(currentModel)})` : ''} model`,
|
|
168
|
+
value: 'retry-current',
|
|
169
|
+
},
|
|
170
|
+
...(showDifferentModel
|
|
171
|
+
? [
|
|
172
|
+
{
|
|
173
|
+
label: `Try a different ${getAIProviderShortName(aiProvider)} model`,
|
|
174
|
+
value: 'different-model',
|
|
175
|
+
},
|
|
176
|
+
]
|
|
177
|
+
: []),
|
|
178
|
+
{ label: 'Try a different AI provider', value: 'different-provider' },
|
|
179
|
+
{ label: 'Manual input', value: 'manual' },
|
|
180
|
+
];
|
|
181
|
+
}
|
|
182
|
+
// Use short provider name and show a context-aware prompt
|
|
183
|
+
const shortName = getAIProviderShortName(aiProvider);
|
|
184
|
+
// Detect network/connectivity style failures so we can offer a retry
|
|
185
|
+
const lowForNetwork = aiSuffix ? String(aiSuffix).toLowerCase() : '';
|
|
186
|
+
const isNetworkError = aiSuffix === null ||
|
|
187
|
+
aiSuffix === undefined ||
|
|
188
|
+
lowForNetwork.includes('unable to connect') ||
|
|
189
|
+
lowForNetwork.includes('failed to fetch') ||
|
|
190
|
+
lowForNetwork.includes('network') ||
|
|
191
|
+
lowForNetwork.includes('connection') ||
|
|
192
|
+
/enotfound|econnrefused|timeout/.test(lowForNetwork);
|
|
193
|
+
if (isNetworkError) {
|
|
194
|
+
// Offer a retry with the current provider/model as the first choice
|
|
195
|
+
choices = [
|
|
196
|
+
{
|
|
197
|
+
label: `Try again with current ${getAIProviderShortName(aiProvider)}${getModelValue(currentModel) ? ` (${getModelValue(currentModel)})` : ''} model`,
|
|
198
|
+
value: 'retry-current',
|
|
199
|
+
},
|
|
200
|
+
...choices,
|
|
201
|
+
];
|
|
202
|
+
}
|
|
203
|
+
let promptMsg;
|
|
204
|
+
if (aiSuffix === null || aiSuffix === undefined) {
|
|
205
|
+
promptMsg = `${shortName}${getModelValue(currentModel) ? ` (${getModelValue(currentModel)})` : ''} returned no suggestion. What would you like to do?`;
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
const low = String(aiSuffix).toLowerCase();
|
|
209
|
+
if (low.includes('rate') ||
|
|
210
|
+
low.includes('quota') ||
|
|
211
|
+
low.includes('insufficient') ||
|
|
212
|
+
low.includes('payment') ||
|
|
213
|
+
/subscription/.test(low)) {
|
|
214
|
+
// Rate/quota/subscription style problems
|
|
215
|
+
promptMsg = `${shortName}${getModelValue(currentModel) ? ` (${getModelValue(currentModel)})` : ''} is limited (rate/quota). What would you like to do?`;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
// Generic fallback message
|
|
219
|
+
promptMsg = `${shortName}${getModelValue(currentModel) ? ` (${getModelValue(currentModel)})` : ''} returned: ${aiSuffix}. What would you like to do?`;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
const pick = await select(promptMsg, choices);
|
|
223
|
+
if (pick === 'manual') {
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
if (pick === 'retry-current') {
|
|
227
|
+
// Re-run generation with the same provider and model
|
|
228
|
+
switch (aiProvider) {
|
|
229
|
+
case 'gemini': {
|
|
230
|
+
const gem = await import('../api/gemini.js');
|
|
231
|
+
const { generateBranchName, generateCommitMessage } = gem;
|
|
232
|
+
const spinner = log.spinner();
|
|
233
|
+
spinner.start(`Retrying with ${getAIProviderShortName(aiProvider)}${getModelValue(currentModel) ? ` (${getModelValue(currentModel)})` : ''}...`);
|
|
234
|
+
if (isCommit) {
|
|
235
|
+
const res = await generateCommitMessage(diff || 'Code changes', correction, currentModel);
|
|
236
|
+
aiSuffix = res;
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
const res = await generateBranchName(diff || 'Code changes', correction, currentModel);
|
|
240
|
+
aiSuffix = res;
|
|
241
|
+
}
|
|
242
|
+
spinner.stop();
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
case 'copilot': {
|
|
246
|
+
const cop = await import('../api/copilot.js');
|
|
247
|
+
const { generateBranchName, generateCommitMessage } = cop;
|
|
248
|
+
const spinner = log.spinner();
|
|
249
|
+
spinner.start(`Retrying with ${getAIProviderShortName(aiProvider)}${getModelValue(currentModel) ? ` (${getModelValue(currentModel)})` : ''}...`);
|
|
250
|
+
if (isCommit) {
|
|
251
|
+
const res = await generateCommitMessage(diff || 'Code changes', correction, currentModel);
|
|
252
|
+
aiSuffix = res;
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
const res = await generateBranchName(diff || 'Code changes', correction, currentModel);
|
|
256
|
+
aiSuffix = res;
|
|
257
|
+
}
|
|
258
|
+
spinner.stop();
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
case 'openrouter': {
|
|
262
|
+
const or = await import('../api/openrouter.js');
|
|
263
|
+
const { generateBranchName, generateCommitMessage } = or;
|
|
264
|
+
const spinner = log.spinner();
|
|
265
|
+
spinner.start(`Retrying with ${getAIProviderShortName(aiProvider)}${getModelValue(currentModel) ? ` (${getModelValue(currentModel)})` : ''}...`);
|
|
266
|
+
if (isCommit) {
|
|
267
|
+
const res = await generateCommitMessage(diff || 'Code changes', correction, currentModel);
|
|
268
|
+
aiSuffix = res;
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
const res = await generateBranchName(diff || 'Code changes', correction, currentModel);
|
|
272
|
+
aiSuffix = res;
|
|
273
|
+
}
|
|
274
|
+
spinner.stop();
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
default: {
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// If retry produced a transient failure, record it to avoid immediate reselection
|
|
282
|
+
if (isTransientFailure(aiSuffix) && typeof currentModel === 'string') {
|
|
283
|
+
failedModels.add(currentModel);
|
|
284
|
+
}
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
if (pick === 'different-model') {
|
|
288
|
+
if (aiProvider === 'gemini') {
|
|
289
|
+
const gem = await import('../api/gemini.js');
|
|
290
|
+
const { generateBranchName, generateCommitMessage, getGeminiModels } = gem;
|
|
291
|
+
const models = await getGeminiModels();
|
|
292
|
+
const gemOptions = models.some((m) => m.value === 'back')
|
|
293
|
+
? models
|
|
294
|
+
: [...models, { label: 'Back to try again model selection', value: 'back' }];
|
|
295
|
+
const chosen = await select('Choose a different Gemini model:', gemOptions);
|
|
296
|
+
if (chosen === 'back') {
|
|
297
|
+
continue; // Go back to try again model selection
|
|
298
|
+
}
|
|
299
|
+
// user already selected a model from the menu — apply it immediately
|
|
300
|
+
currentModel = chosen;
|
|
301
|
+
updateModel?.('gemini', chosen);
|
|
302
|
+
const spinner = log.spinner();
|
|
303
|
+
spinner.start(`${isCommit ? 'Generating commit message' : 'Generating branch name'} with Gemini (${chosen})...`);
|
|
304
|
+
if (isCommit) {
|
|
305
|
+
const res = await generateCommitMessage(diff, correction, chosen);
|
|
306
|
+
aiSuffix = res;
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
const res = await generateBranchName(diff || 'Code changes', correction, chosen);
|
|
310
|
+
aiSuffix = res;
|
|
311
|
+
}
|
|
312
|
+
spinner.stop();
|
|
313
|
+
if (isTransientFailure(aiSuffix)) {
|
|
314
|
+
failedModels.add(chosen);
|
|
315
|
+
}
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
if (aiProvider === 'copilot') {
|
|
319
|
+
const cop = await import('../api/copilot.js');
|
|
320
|
+
const { generateBranchName, generateCommitMessage, getCopilotModels } = cop;
|
|
321
|
+
const models = await getCopilotModels();
|
|
322
|
+
const copOptions = models.some((m) => m.value === 'back')
|
|
323
|
+
? models
|
|
324
|
+
: [...models, { label: 'Back to try again model selection', value: 'back' }];
|
|
325
|
+
const chosen = await select('Choose a different Copilot model:', copOptions);
|
|
326
|
+
if (chosen === 'back') {
|
|
327
|
+
continue; // Go back to try again model selection
|
|
328
|
+
}
|
|
329
|
+
// user already selected a model from the menu — apply it immediately
|
|
330
|
+
currentModel = chosen;
|
|
331
|
+
updateModel?.('copilot', chosen);
|
|
332
|
+
const spinner = log.spinner();
|
|
333
|
+
spinner.start(`${isCommit ? 'Generating commit message' : 'Generating branch name'} with GitHub Copilot (${chosen})...`);
|
|
334
|
+
if (isCommit) {
|
|
335
|
+
const res = await generateCommitMessage(diff, correction, chosen);
|
|
336
|
+
aiSuffix = res;
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
const res = await generateBranchName(diff, correction, chosen);
|
|
340
|
+
aiSuffix = res;
|
|
341
|
+
}
|
|
342
|
+
spinner.stop();
|
|
343
|
+
if (isTransientFailure(aiSuffix)) {
|
|
344
|
+
failedModels.add(chosen);
|
|
345
|
+
}
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
if (aiProvider === 'openrouter') {
|
|
349
|
+
const or = await import('../api/openrouter.js');
|
|
350
|
+
const { generateBranchName, generateCommitMessage, getOpenRouterModels } = or;
|
|
351
|
+
const models = await getOpenRouterModels();
|
|
352
|
+
const orOptions = models.some((m) => m.value === 'back')
|
|
353
|
+
? models
|
|
354
|
+
: [...models, { label: 'Back to try again model selection', value: 'back' }];
|
|
355
|
+
const chosen = await select('Choose a different OpenRouter model:', orOptions);
|
|
356
|
+
if (chosen === 'back') {
|
|
357
|
+
continue; // Go back to try again model selection
|
|
358
|
+
}
|
|
359
|
+
// user already selected a model from the menu — apply it immediately
|
|
360
|
+
currentModel = chosen;
|
|
361
|
+
updateModel?.('openrouter', chosen);
|
|
362
|
+
const spinner = log.spinner();
|
|
363
|
+
spinner.start(`${isCommit ? 'Generating commit message' : 'Generating branch name'} with OpenRouter (${chosen})...`);
|
|
364
|
+
if (isCommit) {
|
|
365
|
+
const res = await generateCommitMessage(diff, correction, chosen);
|
|
366
|
+
aiSuffix = res;
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
const res = await generateBranchName(diff || 'Code changes', correction, chosen);
|
|
370
|
+
aiSuffix = res;
|
|
371
|
+
}
|
|
372
|
+
if (isTransientFailure(aiSuffix)) {
|
|
373
|
+
failedModels.add(chosen);
|
|
374
|
+
}
|
|
375
|
+
continue;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
if (pick === 'different-provider') {
|
|
379
|
+
const providers = ['gemini', 'copilot', 'openrouter'].filter((p) => p !== aiProvider);
|
|
380
|
+
const providerOptions = providers.map((p) => ({
|
|
381
|
+
label: getAIProviderDisplayName(p),
|
|
382
|
+
value: p,
|
|
383
|
+
}));
|
|
384
|
+
const provOptionsWithBack = providerOptions.some((p) => p.value === 'back')
|
|
385
|
+
? providerOptions
|
|
386
|
+
: [...providerOptions, { label: 'Back to try again model selection', value: 'back' }];
|
|
387
|
+
const pickProv = await select('Choose AI provider:', provOptionsWithBack);
|
|
388
|
+
if (pickProv === 'back') {
|
|
389
|
+
continue; // return to try-again model selection
|
|
390
|
+
}
|
|
391
|
+
if (pickProv === 'gemini') {
|
|
392
|
+
// user selected Gemini provider — allow model choice and apply immediately
|
|
393
|
+
log.info(`Selected AI Provider: Gemini`);
|
|
394
|
+
const { ensureAIProvider } = await import('../core/setup.js');
|
|
395
|
+
const geminiReady = await ensureAIProvider('gemini');
|
|
396
|
+
if (!geminiReady) {
|
|
397
|
+
continue;
|
|
398
|
+
}
|
|
399
|
+
const gem = await import('../api/gemini.js');
|
|
400
|
+
const models = await gem.getGeminiModels();
|
|
401
|
+
const gemOptions = models.some((m) => m.value === 'back')
|
|
402
|
+
? models
|
|
403
|
+
: [...models, { label: 'Back to try again model selection', value: 'back' }];
|
|
404
|
+
const chosenModel = await select('Choose Gemini model:', gemOptions);
|
|
405
|
+
if (chosenModel === 'back') {
|
|
406
|
+
continue; // Go back to try again model selection
|
|
407
|
+
}
|
|
408
|
+
// set active provider + model for subsequent retries
|
|
409
|
+
aiProvider = 'gemini';
|
|
410
|
+
currentModel = chosenModel;
|
|
411
|
+
updateModel?.('gemini', chosenModel);
|
|
412
|
+
const spinner = log.spinner();
|
|
413
|
+
spinner.start(`${isCommit ? 'Generating commit message' : 'Generating branch name'} with Gemini (${chosenModel})...`);
|
|
414
|
+
if (isCommit) {
|
|
415
|
+
// Use built-in Gemini API for commit generation
|
|
416
|
+
const res = await gem.generateCommitMessage(diff, correction, chosenModel);
|
|
417
|
+
aiSuffix = res;
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
const res = await gem.generateBranchName(diff, correction, chosenModel);
|
|
421
|
+
aiSuffix = res;
|
|
422
|
+
}
|
|
423
|
+
spinner.stop();
|
|
424
|
+
}
|
|
425
|
+
else if (pickProv === 'copilot') {
|
|
426
|
+
log.info(`Selected AI Provider: Copilot`);
|
|
427
|
+
const { ensureAIProvider } = await import('../core/setup.js');
|
|
428
|
+
const copilotReady = await ensureAIProvider('copilot');
|
|
429
|
+
if (!copilotReady) {
|
|
430
|
+
continue;
|
|
431
|
+
}
|
|
432
|
+
const cop = await import('../api/copilot.js');
|
|
433
|
+
const { getCopilotModels, generateBranchName, generateCommitMessage } = cop;
|
|
434
|
+
const models = await getCopilotModels();
|
|
435
|
+
const copOptions = models.some((m) => m.value === 'back')
|
|
436
|
+
? models
|
|
437
|
+
: [...models, { label: 'Back to try again model selection', value: 'back' }];
|
|
438
|
+
const chosen = await select('Choose Copilot model:', copOptions);
|
|
439
|
+
if (chosen === 'back') {
|
|
440
|
+
continue; // Go back to try again model selection
|
|
441
|
+
}
|
|
442
|
+
// user already selected a model from the menu — apply it immediately
|
|
443
|
+
aiProvider = 'copilot';
|
|
444
|
+
currentModel = chosen;
|
|
445
|
+
updateModel?.('copilot', chosen);
|
|
446
|
+
const spinner = log.spinner();
|
|
447
|
+
spinner.start(`${isCommit ? 'Generating commit message' : 'Generating branch name'} with GitHub Copilot (${chosen})...`);
|
|
448
|
+
if (isCommit) {
|
|
449
|
+
const res = await generateCommitMessage(diff, correction, chosen);
|
|
450
|
+
aiSuffix = res;
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
const res = await generateBranchName(diff, correction, chosen);
|
|
454
|
+
aiSuffix = res;
|
|
455
|
+
}
|
|
456
|
+
spinner.stop();
|
|
457
|
+
}
|
|
458
|
+
else {
|
|
459
|
+
log.info(`Selected AI Provider: OpenRouter`);
|
|
460
|
+
const { ensureAIProvider } = await import('../core/setup.js');
|
|
461
|
+
const openrouterReady = await ensureAIProvider('openrouter');
|
|
462
|
+
if (!openrouterReady) {
|
|
463
|
+
continue;
|
|
464
|
+
}
|
|
465
|
+
const or = await import('../api/openrouter.js');
|
|
466
|
+
const { generateBranchName, generateCommitMessage, getOpenRouterModels } = or;
|
|
467
|
+
const models = await getOpenRouterModels();
|
|
468
|
+
const orOptions = models.some((m) => m.value === 'back')
|
|
469
|
+
? models
|
|
470
|
+
: [...models, { label: 'Back to try again model selection', value: 'back' }];
|
|
471
|
+
const chosen = await select('Choose OpenRouter Model:', orOptions);
|
|
472
|
+
if (chosen === 'back') {
|
|
473
|
+
continue; // Go back to try again model selection
|
|
474
|
+
}
|
|
475
|
+
// user already selected a model from the menu — apply it immediately
|
|
476
|
+
aiProvider = 'openrouter';
|
|
477
|
+
currentModel = chosen;
|
|
478
|
+
updateModel?.('openrouter', chosen);
|
|
479
|
+
const spinner = log.spinner();
|
|
480
|
+
spinner.start(`${isCommit ? 'Generating commit message' : 'Generating branch name'} with OpenRouter (${chosen})...`);
|
|
481
|
+
if (isCommit) {
|
|
482
|
+
const res = await generateCommitMessage(diff, correction, chosen);
|
|
483
|
+
aiSuffix = res;
|
|
484
|
+
}
|
|
485
|
+
else {
|
|
486
|
+
const res = await generateBranchName(diff, correction, chosen);
|
|
487
|
+
aiSuffix = res;
|
|
488
|
+
}
|
|
489
|
+
spinner.stop();
|
|
490
|
+
}
|
|
491
|
+
continue;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
export async function getBranchNameFromDiffUsingProvider(provider, diff, correction, copilotModel, openrouterModel) {
|
|
496
|
+
return generateBranchNameWithProvider(provider, diff, correction, copilotModel, openrouterModel);
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Ensure provider setup and prompt the user to choose a model for that provider.
|
|
500
|
+
* Returns the chosen model value string or 'back' if the user went back, or undefined if setup failed.
|
|
501
|
+
*/
|
|
502
|
+
export async function chooseModelForProvider(provider, prompt, backLabel) {
|
|
503
|
+
if (provider === 'copilot') {
|
|
504
|
+
log.info(`Selected AI Provider: Copilot`);
|
|
505
|
+
const { ensureAIProvider } = await import('../core/setup.js');
|
|
506
|
+
const ready = await ensureAIProvider(provider);
|
|
507
|
+
if (!ready) {
|
|
508
|
+
return undefined;
|
|
509
|
+
}
|
|
510
|
+
const cop = await import('../api/copilot.js');
|
|
511
|
+
const models = (await cop.getCopilotModels());
|
|
512
|
+
// Check if no models are available (SDK not installed or not functioning)
|
|
513
|
+
if (models.length === 0) {
|
|
514
|
+
log.warn('⚠ Copilot SDK not available.');
|
|
515
|
+
console.log('');
|
|
516
|
+
log.info('The Copilot CLI is required to use GitHub Copilot models.');
|
|
517
|
+
console.log('');
|
|
518
|
+
const { confirm } = await import('../cli/input.js');
|
|
519
|
+
const shouldInstall = confirm('Setup Copilot CLI now?');
|
|
520
|
+
if (shouldInstall) {
|
|
521
|
+
console.log('');
|
|
522
|
+
// Use the comprehensive setup helper instead of manual exec
|
|
523
|
+
const { setupGitHubCopilotInteractive } = await import('../core/copilot-setup.js');
|
|
524
|
+
const setupSuccess = await setupGitHubCopilotInteractive();
|
|
525
|
+
if (setupSuccess) {
|
|
526
|
+
console.log('');
|
|
527
|
+
log.info('Verifying Copilot models...');
|
|
528
|
+
// Re-check if models are now available
|
|
529
|
+
const modelsAfterInstall = (await cop.getCopilotModels());
|
|
530
|
+
if (modelsAfterInstall.length > 0) {
|
|
531
|
+
const options = modelsAfterInstall.some((m) => m.value === 'back')
|
|
532
|
+
? modelsAfterInstall
|
|
533
|
+
: [...modelsAfterInstall, { label: backLabel ?? 'Back', value: 'back' }];
|
|
534
|
+
const { select } = await import('../cli/menu.js');
|
|
535
|
+
const chosen = await select(prompt ?? 'Choose Copilot model:', options);
|
|
536
|
+
return chosen;
|
|
537
|
+
}
|
|
538
|
+
else {
|
|
539
|
+
log.warn('⚠ Installation completed but models still not available.');
|
|
540
|
+
log.info('You may need to restart your terminal or check your installation.');
|
|
541
|
+
return 'back';
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
else {
|
|
545
|
+
log.info('Setup was not completed. Returning to provider selection.');
|
|
546
|
+
return 'back';
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
else {
|
|
550
|
+
log.info('Setup skipped. Returning to provider selection.');
|
|
551
|
+
return 'back';
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
const options = models.some((m) => m.value === 'back')
|
|
555
|
+
? models
|
|
556
|
+
: [...models, { label: backLabel ?? 'Back', value: 'back' }];
|
|
557
|
+
const { select } = await import('../cli/menu.js');
|
|
558
|
+
const chosen = await select(prompt ?? 'Choose Copilot model:', options);
|
|
559
|
+
return chosen;
|
|
560
|
+
}
|
|
561
|
+
if (provider === 'openrouter') {
|
|
562
|
+
log.info(`Selected AI Provider: OpenRouter`);
|
|
563
|
+
const { ensureAIProvider } = await import('../core/setup.js');
|
|
564
|
+
const ready = await ensureAIProvider(provider);
|
|
565
|
+
if (!ready) {
|
|
566
|
+
return undefined;
|
|
567
|
+
}
|
|
568
|
+
const or = await import('../api/openrouter.js');
|
|
569
|
+
const models = (await or.getOpenRouterModels());
|
|
570
|
+
// Check if no models are available
|
|
571
|
+
if (models.length === 0) {
|
|
572
|
+
log.warn('⚠ No OpenRouter models available.');
|
|
573
|
+
return undefined;
|
|
574
|
+
}
|
|
575
|
+
const options = models.some((m) => m.value === 'back')
|
|
576
|
+
? models
|
|
577
|
+
: [...models, { label: backLabel ?? 'Back', value: 'back' }];
|
|
578
|
+
const { select } = await import('../cli/menu.js');
|
|
579
|
+
const chosen = await select(prompt ?? 'Choose OpenRouter model:', options);
|
|
580
|
+
return chosen;
|
|
581
|
+
}
|
|
582
|
+
// Gemini
|
|
583
|
+
log.info(`Selected AI Provider: Gemini`);
|
|
584
|
+
const { ensureAIProvider } = await import('../core/setup.js');
|
|
585
|
+
const ready = await ensureAIProvider(provider);
|
|
586
|
+
if (!ready) {
|
|
587
|
+
return undefined;
|
|
588
|
+
}
|
|
589
|
+
const gm = await import('../api/gemini.js');
|
|
590
|
+
const models = (await gm.getGeminiModels());
|
|
591
|
+
// Check if no models are available
|
|
592
|
+
if (models.length === 0) {
|
|
593
|
+
log.warn('⚠ No Gemini models available.');
|
|
594
|
+
return undefined;
|
|
595
|
+
}
|
|
596
|
+
const options = models.some((m) => m.value === 'back')
|
|
597
|
+
? models
|
|
598
|
+
: [...models, { label: backLabel ?? 'Back', value: 'back' }];
|
|
599
|
+
const { select } = await import('../cli/menu.js');
|
|
600
|
+
const chosen = await select(prompt ?? 'Choose Gemini model:', options);
|
|
601
|
+
return chosen;
|
|
602
|
+
}
|
|
603
|
+
//# sourceMappingURL=git-ai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-ai.js","sourceRoot":"","sources":["../../src/utils/git-ai.ts"],"names":[],"mappings":"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"}
|