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.
Files changed (203) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +152 -0
  3. package/lib/api/copilot-adapter.d.ts +11 -0
  4. package/lib/api/copilot-adapter.d.ts.map +1 -0
  5. package/lib/api/copilot-adapter.js +41 -0
  6. package/lib/api/copilot-adapter.js.map +1 -0
  7. package/lib/api/copilot-sdk.d.ts +48 -0
  8. package/lib/api/copilot-sdk.d.ts.map +1 -0
  9. package/lib/api/copilot-sdk.js +451 -0
  10. package/lib/api/copilot-sdk.js.map +1 -0
  11. package/lib/api/copilot.d.ts +21 -0
  12. package/lib/api/copilot.d.ts.map +1 -0
  13. package/lib/api/copilot.js +87 -0
  14. package/lib/api/copilot.js.map +1 -0
  15. package/lib/api/gemini-sdk.d.ts +24 -0
  16. package/lib/api/gemini-sdk.d.ts.map +1 -0
  17. package/lib/api/gemini-sdk.js +245 -0
  18. package/lib/api/gemini-sdk.js.map +1 -0
  19. package/lib/api/gemini.d.ts +21 -0
  20. package/lib/api/gemini.d.ts.map +1 -0
  21. package/lib/api/gemini.js +87 -0
  22. package/lib/api/gemini.js.map +1 -0
  23. package/lib/api/openrouter-sdk.d.ts +58 -0
  24. package/lib/api/openrouter-sdk.d.ts.map +1 -0
  25. package/lib/api/openrouter-sdk.js +341 -0
  26. package/lib/api/openrouter-sdk.js.map +1 -0
  27. package/lib/api/openrouter.d.ts +17 -0
  28. package/lib/api/openrouter.d.ts.map +1 -0
  29. package/lib/api/openrouter.js +111 -0
  30. package/lib/api/openrouter.js.map +1 -0
  31. package/lib/api/trello.d.ts +17 -0
  32. package/lib/api/trello.d.ts.map +1 -0
  33. package/lib/api/trello.js +72 -0
  34. package/lib/api/trello.js.map +1 -0
  35. package/lib/cli/input.d.ts +39 -0
  36. package/lib/cli/input.d.ts.map +1 -0
  37. package/lib/cli/input.js +119 -0
  38. package/lib/cli/input.js.map +1 -0
  39. package/lib/cli/menu.d.ts +9 -0
  40. package/lib/cli/menu.d.ts.map +1 -0
  41. package/lib/cli/menu.js +201 -0
  42. package/lib/cli/menu.js.map +1 -0
  43. package/lib/core/constants.d.ts +22 -0
  44. package/lib/core/constants.d.ts.map +1 -0
  45. package/lib/core/constants.js +24 -0
  46. package/lib/core/constants.js.map +1 -0
  47. package/lib/core/copilot-setup.d.ts +13 -0
  48. package/lib/core/copilot-setup.d.ts.map +1 -0
  49. package/lib/core/copilot-setup.js +447 -0
  50. package/lib/core/copilot-setup.js.map +1 -0
  51. package/lib/core/gemini-setup.d.ts +8 -0
  52. package/lib/core/gemini-setup.d.ts.map +1 -0
  53. package/lib/core/gemini-setup.js +84 -0
  54. package/lib/core/gemini-setup.js.map +1 -0
  55. package/lib/core/menu-constants.d.ts +24 -0
  56. package/lib/core/menu-constants.d.ts.map +1 -0
  57. package/lib/core/menu-constants.js +22 -0
  58. package/lib/core/menu-constants.js.map +1 -0
  59. package/lib/core/openrouter-setup.d.ts +8 -0
  60. package/lib/core/openrouter-setup.d.ts.map +1 -0
  61. package/lib/core/openrouter-setup.js +73 -0
  62. package/lib/core/openrouter-setup.js.map +1 -0
  63. package/lib/core/setup.d.ts +21 -0
  64. package/lib/core/setup.d.ts.map +1 -0
  65. package/lib/core/setup.js +88 -0
  66. package/lib/core/setup.js.map +1 -0
  67. package/lib/core/trello-setup.d.ts +8 -0
  68. package/lib/core/trello-setup.d.ts.map +1 -0
  69. package/lib/core/trello-setup.js +107 -0
  70. package/lib/core/trello-setup.js.map +1 -0
  71. package/lib/index.d.ts +3 -0
  72. package/lib/index.d.ts.map +1 -0
  73. package/lib/index.js +250 -0
  74. package/lib/index.js.map +1 -0
  75. package/lib/types/index.d.ts +78 -0
  76. package/lib/types/index.d.ts.map +1 -0
  77. package/lib/types/index.js +2 -0
  78. package/lib/types/index.js.map +1 -0
  79. package/lib/utils/branch-naming.d.ts +11 -0
  80. package/lib/utils/branch-naming.d.ts.map +1 -0
  81. package/lib/utils/branch-naming.js +396 -0
  82. package/lib/utils/branch-naming.js.map +1 -0
  83. package/lib/utils/colors.d.ts +14 -0
  84. package/lib/utils/colors.d.ts.map +1 -0
  85. package/lib/utils/colors.js +14 -0
  86. package/lib/utils/colors.js.map +1 -0
  87. package/lib/utils/commit-helpers.d.ts +53 -0
  88. package/lib/utils/commit-helpers.d.ts.map +1 -0
  89. package/lib/utils/commit-helpers.js +177 -0
  90. package/lib/utils/commit-helpers.js.map +1 -0
  91. package/lib/utils/config.d.ts +87 -0
  92. package/lib/utils/config.d.ts.map +1 -0
  93. package/lib/utils/config.js +326 -0
  94. package/lib/utils/config.js.map +1 -0
  95. package/lib/utils/display.d.ts +27 -0
  96. package/lib/utils/display.d.ts.map +1 -0
  97. package/lib/utils/display.js +116 -0
  98. package/lib/utils/display.js.map +1 -0
  99. package/lib/utils/error-helpers.d.ts +27 -0
  100. package/lib/utils/error-helpers.d.ts.map +1 -0
  101. package/lib/utils/error-helpers.js +102 -0
  102. package/lib/utils/error-helpers.js.map +1 -0
  103. package/lib/utils/exec.d.ts +18 -0
  104. package/lib/utils/exec.d.ts.map +1 -0
  105. package/lib/utils/exec.js +96 -0
  106. package/lib/utils/exec.js.map +1 -0
  107. package/lib/utils/git-ai-errors.d.ts +10 -0
  108. package/lib/utils/git-ai-errors.d.ts.map +1 -0
  109. package/lib/utils/git-ai-errors.js +71 -0
  110. package/lib/utils/git-ai-errors.js.map +1 -0
  111. package/lib/utils/git-ai.d.ts +26 -0
  112. package/lib/utils/git-ai.d.ts.map +1 -0
  113. package/lib/utils/git-ai.js +603 -0
  114. package/lib/utils/git-ai.js.map +1 -0
  115. package/lib/utils/git-commands.d.ts +21 -0
  116. package/lib/utils/git-commands.d.ts.map +1 -0
  117. package/lib/utils/git-commands.js +58 -0
  118. package/lib/utils/git-commands.js.map +1 -0
  119. package/lib/utils/git-errors.d.ts +76 -0
  120. package/lib/utils/git-errors.d.ts.map +1 -0
  121. package/lib/utils/git-errors.js +565 -0
  122. package/lib/utils/git-errors.js.map +1 -0
  123. package/lib/utils/git.d.ts +61 -0
  124. package/lib/utils/git.d.ts.map +1 -0
  125. package/lib/utils/git.js +245 -0
  126. package/lib/utils/git.js.map +1 -0
  127. package/lib/utils/logging.d.ts +25 -0
  128. package/lib/utils/logging.d.ts.map +1 -0
  129. package/lib/utils/logging.js +71 -0
  130. package/lib/utils/logging.js.map +1 -0
  131. package/lib/utils/menu-builders.d.ts +47 -0
  132. package/lib/utils/menu-builders.d.ts.map +1 -0
  133. package/lib/utils/menu-builders.js +34 -0
  134. package/lib/utils/menu-builders.js.map +1 -0
  135. package/lib/utils/platform.d.ts +13 -0
  136. package/lib/utils/platform.d.ts.map +1 -0
  137. package/lib/utils/platform.js +32 -0
  138. package/lib/utils/platform.js.map +1 -0
  139. package/lib/utils/spinner-wrapper.d.ts +16 -0
  140. package/lib/utils/spinner-wrapper.d.ts.map +1 -0
  141. package/lib/utils/spinner-wrapper.js +56 -0
  142. package/lib/utils/spinner-wrapper.js.map +1 -0
  143. package/lib/utils/state.d.ts +22 -0
  144. package/lib/utils/state.d.ts.map +1 -0
  145. package/lib/utils/state.js +75 -0
  146. package/lib/utils/state.js.map +1 -0
  147. package/lib/utils/time.d.ts +4 -0
  148. package/lib/utils/time.d.ts.map +1 -0
  149. package/lib/utils/time.js +29 -0
  150. package/lib/utils/time.js.map +1 -0
  151. package/lib/utils/type-guards.d.ts +10 -0
  152. package/lib/utils/type-guards.d.ts.map +1 -0
  153. package/lib/utils/type-guards.js +29 -0
  154. package/lib/utils/type-guards.js.map +1 -0
  155. package/lib/workflows/ai-provider.d.ts +13 -0
  156. package/lib/workflows/ai-provider.d.ts.map +1 -0
  157. package/lib/workflows/ai-provider.js +55 -0
  158. package/lib/workflows/ai-provider.js.map +1 -0
  159. package/lib/workflows/author.d.ts +4 -0
  160. package/lib/workflows/author.d.ts.map +1 -0
  161. package/lib/workflows/author.js +80 -0
  162. package/lib/workflows/author.js.map +1 -0
  163. package/lib/workflows/branch-helpers.d.ts +9 -0
  164. package/lib/workflows/branch-helpers.d.ts.map +1 -0
  165. package/lib/workflows/branch-helpers.js +406 -0
  166. package/lib/workflows/branch-helpers.js.map +1 -0
  167. package/lib/workflows/branch-utils.d.ts +9 -0
  168. package/lib/workflows/branch-utils.d.ts.map +1 -0
  169. package/lib/workflows/branch-utils.js +61 -0
  170. package/lib/workflows/branch-utils.js.map +1 -0
  171. package/lib/workflows/branch.d.ts +12 -0
  172. package/lib/workflows/branch.d.ts.map +1 -0
  173. package/lib/workflows/branch.js +555 -0
  174. package/lib/workflows/branch.js.map +1 -0
  175. package/lib/workflows/cleanup.d.ts +10 -0
  176. package/lib/workflows/cleanup.d.ts.map +1 -0
  177. package/lib/workflows/cleanup.js +287 -0
  178. package/lib/workflows/cleanup.js.map +1 -0
  179. package/lib/workflows/commit.d.ts +10 -0
  180. package/lib/workflows/commit.d.ts.map +1 -0
  181. package/lib/workflows/commit.js +771 -0
  182. package/lib/workflows/commit.js.map +1 -0
  183. package/lib/workflows/main-steps.d.ts +12 -0
  184. package/lib/workflows/main-steps.d.ts.map +1 -0
  185. package/lib/workflows/main-steps.js +407 -0
  186. package/lib/workflows/main-steps.js.map +1 -0
  187. package/lib/workflows/main.d.ts +8 -0
  188. package/lib/workflows/main.d.ts.map +1 -0
  189. package/lib/workflows/main.js +720 -0
  190. package/lib/workflows/main.js.map +1 -0
  191. package/lib/workflows/security-gate.d.ts +8 -0
  192. package/lib/workflows/security-gate.d.ts.map +1 -0
  193. package/lib/workflows/security-gate.js +447 -0
  194. package/lib/workflows/security-gate.js.map +1 -0
  195. package/lib/workflows/settings.d.ts +15 -0
  196. package/lib/workflows/settings.d.ts.map +1 -0
  197. package/lib/workflows/settings.js +438 -0
  198. package/lib/workflows/settings.js.map +1 -0
  199. package/lib/workflows/trello-menu.d.ts +16 -0
  200. package/lib/workflows/trello-menu.d.ts.map +1 -0
  201. package/lib/workflows/trello-menu.js +361 -0
  202. package/lib/workflows/trello-menu.js.map +1 -0
  203. 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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"}