geeto 0.9.1 → 0.10.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/README.md +77 -18
- package/lib/api/copilot-sdk.d.ts.map +1 -1
- package/lib/api/copilot-sdk.js +29 -24
- package/lib/api/copilot-sdk.js.map +1 -1
- package/lib/api/copilot.d.ts.map +1 -1
- package/lib/api/copilot.js +6 -6
- package/lib/api/copilot.js.map +1 -1
- package/lib/api/gemini.d.ts.map +1 -1
- package/lib/api/gemini.js +2 -2
- package/lib/api/gemini.js.map +1 -1
- package/lib/api/groq-sdk.d.ts +11 -0
- package/lib/api/groq-sdk.d.ts.map +1 -0
- package/lib/api/groq-sdk.js +131 -0
- package/lib/api/groq-sdk.js.map +1 -0
- package/lib/api/groq.d.ts +10 -0
- package/lib/api/groq.d.ts.map +1 -0
- package/lib/api/groq.js +36 -0
- package/lib/api/groq.js.map +1 -0
- package/lib/api/openrouter-sdk.d.ts.map +1 -1
- package/lib/api/openrouter-sdk.js +58 -73
- package/lib/api/openrouter-sdk.js.map +1 -1
- package/lib/api/openrouter.d.ts.map +1 -1
- package/lib/api/openrouter.js +2 -2
- package/lib/api/openrouter.js.map +1 -1
- package/lib/api/trello.d.ts +16 -1
- package/lib/api/trello.d.ts.map +1 -1
- package/lib/api/trello.js +90 -2
- package/lib/api/trello.js.map +1 -1
- package/lib/cli/input.d.ts +1 -9
- package/lib/cli/input.d.ts.map +1 -1
- package/lib/cli/input.js +428 -169
- package/lib/cli/input.js.map +1 -1
- package/lib/cli/menu.d.ts.map +1 -1
- package/lib/cli/menu.js +33 -20
- package/lib/cli/menu.js.map +1 -1
- package/lib/core/copilot-setup.d.ts +5 -0
- package/lib/core/copilot-setup.d.ts.map +1 -1
- package/lib/core/copilot-setup.js +18 -0
- package/lib/core/copilot-setup.js.map +1 -1
- package/lib/core/gemini-setup.d.ts.map +1 -1
- package/lib/core/gemini-setup.js +7 -13
- package/lib/core/gemini-setup.js.map +1 -1
- package/lib/core/github-setup.d.ts.map +1 -1
- package/lib/core/github-setup.js +13 -7
- package/lib/core/github-setup.js.map +1 -1
- package/lib/core/gitlab-setup.d.ts.map +1 -1
- package/lib/core/gitlab-setup.js +13 -6
- package/lib/core/gitlab-setup.js.map +1 -1
- package/lib/core/groq-setup.d.ts +5 -0
- package/lib/core/groq-setup.d.ts.map +1 -0
- package/lib/core/groq-setup.js +67 -0
- package/lib/core/groq-setup.js.map +1 -0
- package/lib/core/openrouter-setup.d.ts.map +1 -1
- package/lib/core/openrouter-setup.js +11 -21
- package/lib/core/openrouter-setup.js.map +1 -1
- package/lib/core/setup.d.ts +2 -1
- package/lib/core/setup.d.ts.map +1 -1
- package/lib/core/setup.js +44 -7
- package/lib/core/setup.js.map +1 -1
- package/lib/index.js +8 -0
- package/lib/index.js.map +1 -1
- package/lib/types/index.d.ts +9 -1
- package/lib/types/index.d.ts.map +1 -1
- package/lib/utils/ai-workflow.d.ts +10 -2
- package/lib/utils/ai-workflow.d.ts.map +1 -1
- package/lib/utils/ai-workflow.js +15 -0
- package/lib/utils/ai-workflow.js.map +1 -1
- package/lib/utils/branch-naming.d.ts +2 -1
- package/lib/utils/branch-naming.d.ts.map +1 -1
- package/lib/utils/branch-naming.js +114 -68
- package/lib/utils/branch-naming.js.map +1 -1
- package/lib/utils/config.d.ts +11 -3
- package/lib/utils/config.d.ts.map +1 -1
- package/lib/utils/config.js +46 -18
- package/lib/utils/config.js.map +1 -1
- package/lib/utils/git-ai-errors.d.ts.map +1 -1
- package/lib/utils/git-ai-errors.js +5 -1
- package/lib/utils/git-ai-errors.js.map +1 -1
- package/lib/utils/git-ai.d.ts +8 -7
- package/lib/utils/git-ai.d.ts.map +1 -1
- package/lib/utils/git-ai.js +239 -117
- package/lib/utils/git-ai.js.map +1 -1
- package/lib/utils/logging.d.ts.map +1 -1
- package/lib/utils/logging.js +14 -3
- package/lib/utils/logging.js.map +1 -1
- package/lib/utils/menu-builders.js +1 -1
- package/lib/utils/menu-builders.js.map +1 -1
- package/lib/utils/prompts-embedded.d.ts.map +1 -1
- package/lib/utils/prompts-embedded.js +0 -81
- package/lib/utils/prompts-embedded.js.map +1 -1
- package/lib/utils/scramble.d.ts.map +1 -1
- package/lib/utils/scramble.js +14 -3
- package/lib/utils/scramble.js.map +1 -1
- package/lib/utils/state.d.ts.map +1 -1
- package/lib/utils/state.js +12 -1
- package/lib/utils/state.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.d.ts.map +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/lib/workflows/ai-provider.d.ts +3 -1
- package/lib/workflows/ai-provider.d.ts.map +1 -1
- package/lib/workflows/ai-provider.js +8 -2
- package/lib/workflows/ai-provider.js.map +1 -1
- package/lib/workflows/branch-helpers.d.ts.map +1 -1
- package/lib/workflows/branch-helpers.js +142 -71
- package/lib/workflows/branch-helpers.js.map +1 -1
- package/lib/workflows/branch.d.ts.map +1 -1
- package/lib/workflows/branch.js +97 -58
- package/lib/workflows/branch.js.map +1 -1
- package/lib/workflows/commit.d.ts +1 -1
- package/lib/workflows/commit.d.ts.map +1 -1
- package/lib/workflows/commit.js +97 -35
- package/lib/workflows/commit.js.map +1 -1
- package/lib/workflows/dry-run.d.ts.map +1 -1
- package/lib/workflows/dry-run.js +6 -0
- package/lib/workflows/dry-run.js.map +1 -1
- package/lib/workflows/issue.d.ts.map +1 -1
- package/lib/workflows/issue.js +12 -12
- package/lib/workflows/issue.js.map +1 -1
- package/lib/workflows/main-helpers.d.ts +3 -1
- package/lib/workflows/main-helpers.d.ts.map +1 -1
- package/lib/workflows/main-helpers.js +30 -26
- package/lib/workflows/main-helpers.js.map +1 -1
- package/lib/workflows/main.d.ts.map +1 -1
- package/lib/workflows/main.js +164 -13
- package/lib/workflows/main.js.map +1 -1
- package/lib/workflows/pr.d.ts.map +1 -1
- package/lib/workflows/pr.js +12 -12
- package/lib/workflows/pr.js.map +1 -1
- package/lib/workflows/release-merge.d.ts.map +1 -1
- package/lib/workflows/release-merge.js +40 -10
- package/lib/workflows/release-merge.js.map +1 -1
- package/lib/workflows/release-sync.d.ts.map +1 -1
- package/lib/workflows/release-sync.js +25 -7
- package/lib/workflows/release-sync.js.map +1 -1
- package/lib/workflows/release.d.ts.map +1 -1
- package/lib/workflows/release.js +130 -15
- package/lib/workflows/release.js.map +1 -1
- package/lib/workflows/repo-settings.d.ts.map +1 -1
- package/lib/workflows/repo-settings.js +35 -8
- package/lib/workflows/repo-settings.js.map +1 -1
- package/lib/workflows/reword.d.ts.map +1 -1
- package/lib/workflows/reword.js +60 -17
- package/lib/workflows/reword.js.map +1 -1
- package/lib/workflows/settings.d.ts +2 -1
- package/lib/workflows/settings.d.ts.map +1 -1
- package/lib/workflows/settings.js +364 -76
- package/lib/workflows/settings.js.map +1 -1
- package/lib/workflows/trello-menu.d.ts +0 -3
- package/lib/workflows/trello-menu.d.ts.map +1 -1
- package/lib/workflows/trello-menu.js +349 -19
- package/lib/workflows/trello-menu.js.map +1 -1
- package/package.json +12 -2
- package/lib/workflows/security-gate.d.ts +0 -8
- package/lib/workflows/security-gate.d.ts.map +0 -1
- package/lib/workflows/security-gate.js +0 -455
- package/lib/workflows/security-gate.js.map +0 -1
- package/prompts/security-gate-prompt.md +0 -80
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-ai-errors.js","sourceRoot":"","sources":["../../src/utils/git-ai-errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,CAA4B;IAC/D,4EAA4E;IAC5E,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IAEnC,qFAAqF;IACrF,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAC7D,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;YACxB,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,IAAI,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,gFAAgF,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/F,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,6CAA6C,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,mBAAmB,GACvB,mFAAmF,CAAA;IACrF,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,qEAAqE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACpF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,qBAAqB,CAAC,CAA4B;IAChE,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IAEnC,mFAAmF;IACnF,IAAI,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAChF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAClE,OAAO,IAAI,CAAA;IACb,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"git-ai-errors.js","sourceRoot":"","sources":["../../src/utils/git-ai-errors.ts"],"names":[],"mappings":"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"}
|
package/lib/utils/git-ai.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { CopilotModel } from '../api/copilot.js';
|
|
2
2
|
import type { GeminiModel } from '../api/gemini.js';
|
|
3
|
+
import type { GroqModel } from '../api/groq.js';
|
|
3
4
|
import type { OpenRouterModel } from '../api/openrouter.js';
|
|
4
5
|
import { isContextLimitFailure, isTransientAIFailure } from './git-ai-errors.js';
|
|
5
6
|
export { isContextLimitFailure, isTransientAIFailure };
|
|
@@ -12,20 +13,20 @@ export declare function getAIProviderShortName(aiProvider: string): string;
|
|
|
12
13
|
/** Return the model to show for a provider. */
|
|
13
14
|
export declare function getModelDisplayName(aiProvider: string, model?: string): string;
|
|
14
15
|
/** Ask the right provider to generate a branch-name suffix. */
|
|
15
|
-
export declare function generateBranchNameWithProvider(aiProvider: string, title: string, correction?: string, copilotModel?: CopilotModel, openrouterModel?: OpenRouterModel, geminiModel?: GeminiModel): Promise<string | null>;
|
|
16
|
-
export declare function generateReleaseNotesWithProvider(aiProvider: string, commits: string, language: 'en' | 'id', correction?: string, copilotModel?: CopilotModel, openrouterModel?: OpenRouterModel, geminiModel?: GeminiModel): Promise<string | null>;
|
|
16
|
+
export declare function generateBranchNameWithProvider(aiProvider: string, title: string, correction?: string, copilotModel?: CopilotModel, openrouterModel?: OpenRouterModel, geminiModel?: GeminiModel, groqModel?: GroqModel): Promise<string | null>;
|
|
17
|
+
export declare function generateReleaseNotesWithProvider(aiProvider: string, commits: string, language: 'en' | 'id', correction?: string, copilotModel?: CopilotModel, openrouterModel?: OpenRouterModel, geminiModel?: GeminiModel, groqModel?: GroqModel): Promise<string | null>;
|
|
17
18
|
/** Send a raw text prompt to the configured AI provider and return the response. */
|
|
18
|
-
export declare function generateTextWithProvider(aiProvider: string, prompt: string, copilotModel?: CopilotModel, openrouterModel?: OpenRouterModel, geminiModel?: GeminiModel): Promise<string | null>;
|
|
19
|
+
export declare function generateTextWithProvider(aiProvider: string, prompt: string, copilotModel?: CopilotModel, openrouterModel?: OpenRouterModel, geminiModel?: GeminiModel, groqModel?: GroqModel): Promise<string | null>;
|
|
19
20
|
/** Ask the right provider to generate a commit message from a diff. */
|
|
20
|
-
export declare function generateCommitMessageWithProvider(aiProvider: string, diff: string, correction?: string, copilotModel?: CopilotModel, openrouterModel?: OpenRouterModel, geminiModel?: GeminiModel): Promise<string | null>;
|
|
21
|
+
export declare function generateCommitMessageWithProvider(aiProvider: string, diff: string, correction?: string, copilotModel?: CopilotModel, openrouterModel?: OpenRouterModel, geminiModel?: GeminiModel, groqModel?: GroqModel): Promise<string | null>;
|
|
21
22
|
/**
|
|
22
23
|
* Interactive fallback menu when AI generation fails.
|
|
23
24
|
*/
|
|
24
|
-
export declare function interactiveAIFallback(currentSuffix: string | null, aiProvider: 'gemini' | 'copilot' | 'openrouter', model: CopilotModel | OpenRouterModel | GeminiModel | string, diff: string, correction: string, _currentBranch: string, updateModel: (provider: 'gemini' | 'copilot' | 'openrouter', model?: CopilotModel | OpenRouterModel | GeminiModel | string) => void, isCommit?: boolean): Promise<string | null>;
|
|
25
|
-
export declare function getBranchNameFromDiffUsingProvider(provider: 'gemini' | 'copilot' | 'openrouter', diff: string, correction?: string, copilotModel?: CopilotModel, openrouterModel?: OpenRouterModel): Promise<string | null>;
|
|
25
|
+
export declare function interactiveAIFallback(currentSuffix: string | null, aiProvider: 'gemini' | 'copilot' | 'openrouter' | 'groq', model: CopilotModel | OpenRouterModel | GeminiModel | string, diff: string, correction: string, _currentBranch: string, updateModel: (provider: 'gemini' | 'copilot' | 'openrouter' | 'groq', model?: CopilotModel | OpenRouterModel | GeminiModel | string) => void, isCommit?: boolean): Promise<string | null>;
|
|
26
|
+
export declare function getBranchNameFromDiffUsingProvider(provider: 'gemini' | 'copilot' | 'openrouter' | 'groq', diff: string, correction?: string, copilotModel?: CopilotModel, openrouterModel?: OpenRouterModel, geminiModel?: GeminiModel, groqModel?: GroqModel): Promise<string | null>;
|
|
26
27
|
/**
|
|
27
28
|
* Ensure provider setup and prompt the user to choose a model for that provider.
|
|
28
29
|
* Returns the chosen model value string or 'back' if the user went back, or undefined if setup failed.
|
|
29
30
|
*/
|
|
30
|
-
export declare function chooseModelForProvider(provider: 'gemini' | 'copilot' | 'openrouter', prompt?: string, backLabel?: string): Promise<string | 'back' | undefined>;
|
|
31
|
+
export declare function chooseModelForProvider(provider: 'gemini' | 'copilot' | 'openrouter' | 'groq', prompt?: string, backLabel?: string): Promise<string | 'back' | undefined>;
|
|
31
32
|
//# sourceMappingURL=git-ai.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-ai.d.ts","sourceRoot":"","sources":["../../src/utils/git-ai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAG3D,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAKhF,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,CAAA;AAItD,uEAAuE;AACvE,wBAAgB,aAAa,CAC3B,CAAC,CAAC,EAAE,YAAY,GAAG,eAAe,GAAG,WAAW,GAAG,MAAM,GACxD,MAAM,GAAG,SAAS,CASpB;AAED,uCAAuC;AACvC,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"git-ai.d.ts","sourceRoot":"","sources":["../../src/utils/git-ai.ts"],"names":[],"mappings":"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"}
|
package/lib/utils/git-ai.js
CHANGED
|
@@ -23,11 +23,14 @@ export function getAIProviderDisplayName(aiProvider) {
|
|
|
23
23
|
return 'Gemini';
|
|
24
24
|
}
|
|
25
25
|
case 'copilot': {
|
|
26
|
-
return 'GitHub
|
|
26
|
+
return 'GitHub Copilot';
|
|
27
27
|
}
|
|
28
28
|
case 'openrouter': {
|
|
29
29
|
return 'OpenRouter';
|
|
30
30
|
}
|
|
31
|
+
case 'groq': {
|
|
32
|
+
return 'Groq';
|
|
33
|
+
}
|
|
31
34
|
default: {
|
|
32
35
|
return 'Manual';
|
|
33
36
|
}
|
|
@@ -40,11 +43,14 @@ export function getAIProviderShortName(aiProvider) {
|
|
|
40
43
|
return 'Gemini';
|
|
41
44
|
}
|
|
42
45
|
case 'copilot': {
|
|
43
|
-
return 'Copilot';
|
|
46
|
+
return 'GitHub Copilot';
|
|
44
47
|
}
|
|
45
48
|
case 'openrouter': {
|
|
46
49
|
return 'OpenRouter';
|
|
47
50
|
}
|
|
51
|
+
case 'groq': {
|
|
52
|
+
return 'Groq';
|
|
53
|
+
}
|
|
48
54
|
default: {
|
|
49
55
|
return 'Manual';
|
|
50
56
|
}
|
|
@@ -62,7 +68,7 @@ export function getModelDisplayName(aiProvider, model) {
|
|
|
62
68
|
return model;
|
|
63
69
|
}
|
|
64
70
|
/** Ask the right provider to generate a branch-name suffix. */
|
|
65
|
-
export async function generateBranchNameWithProvider(aiProvider, title, correction, copilotModel, openrouterModel, geminiModel) {
|
|
71
|
+
export async function generateBranchNameWithProvider(aiProvider, title, correction, copilotModel, openrouterModel, geminiModel, groqModel) {
|
|
66
72
|
switch (aiProvider) {
|
|
67
73
|
case 'gemini': {
|
|
68
74
|
const { generateBranchName } = await import('../api/gemini.js');
|
|
@@ -72,13 +78,17 @@ export async function generateBranchNameWithProvider(aiProvider, title, correcti
|
|
|
72
78
|
const { generateBranchName } = await import('../api/copilot.js');
|
|
73
79
|
return generateBranchName(title, correction, copilotModel);
|
|
74
80
|
}
|
|
81
|
+
case 'groq': {
|
|
82
|
+
const { generateBranchName } = await import('../api/groq.js');
|
|
83
|
+
return generateBranchName(title, correction, groqModel);
|
|
84
|
+
}
|
|
75
85
|
default: {
|
|
76
86
|
const { generateBranchName } = await import('../api/openrouter.js');
|
|
77
87
|
return generateBranchName(title, correction, openrouterModel);
|
|
78
88
|
}
|
|
79
89
|
}
|
|
80
90
|
}
|
|
81
|
-
export async function generateReleaseNotesWithProvider(aiProvider, commits, language, correction, copilotModel, openrouterModel, geminiModel) {
|
|
91
|
+
export async function generateReleaseNotesWithProvider(aiProvider, commits, language, correction, copilotModel, openrouterModel, geminiModel, groqModel) {
|
|
82
92
|
switch (aiProvider) {
|
|
83
93
|
case 'gemini': {
|
|
84
94
|
const { generateReleaseNotes } = await import('../api/gemini.js');
|
|
@@ -88,6 +98,10 @@ export async function generateReleaseNotesWithProvider(aiProvider, commits, lang
|
|
|
88
98
|
const { generateReleaseNotes } = await import('../api/copilot.js');
|
|
89
99
|
return generateReleaseNotes(commits, language, correction, copilotModel);
|
|
90
100
|
}
|
|
101
|
+
case 'groq': {
|
|
102
|
+
const { generateReleaseNotes } = await import('../api/groq.js');
|
|
103
|
+
return generateReleaseNotes(commits, language, correction, groqModel);
|
|
104
|
+
}
|
|
91
105
|
default: {
|
|
92
106
|
const { generateReleaseNotes } = await import('../api/openrouter.js');
|
|
93
107
|
return generateReleaseNotes(commits, language, correction, openrouterModel);
|
|
@@ -95,7 +109,7 @@ export async function generateReleaseNotesWithProvider(aiProvider, commits, lang
|
|
|
95
109
|
}
|
|
96
110
|
}
|
|
97
111
|
/** Send a raw text prompt to the configured AI provider and return the response. */
|
|
98
|
-
export async function generateTextWithProvider(aiProvider, prompt, copilotModel, openrouterModel, geminiModel) {
|
|
112
|
+
export async function generateTextWithProvider(aiProvider, prompt, copilotModel, openrouterModel, geminiModel, groqModel) {
|
|
99
113
|
switch (aiProvider) {
|
|
100
114
|
case 'gemini': {
|
|
101
115
|
const { generateText } = await import('../api/gemini.js');
|
|
@@ -105,6 +119,10 @@ export async function generateTextWithProvider(aiProvider, prompt, copilotModel,
|
|
|
105
119
|
const { generateText } = await import('../api/copilot.js');
|
|
106
120
|
return generateText(prompt, copilotModel);
|
|
107
121
|
}
|
|
122
|
+
case 'groq': {
|
|
123
|
+
const { generateText } = await import('../api/groq.js');
|
|
124
|
+
return generateText(prompt, groqModel);
|
|
125
|
+
}
|
|
108
126
|
default: {
|
|
109
127
|
const { generateText } = await import('../api/openrouter.js');
|
|
110
128
|
return generateText(prompt, openrouterModel);
|
|
@@ -112,7 +130,7 @@ export async function generateTextWithProvider(aiProvider, prompt, copilotModel,
|
|
|
112
130
|
}
|
|
113
131
|
}
|
|
114
132
|
/** Ask the right provider to generate a commit message from a diff. */
|
|
115
|
-
export async function generateCommitMessageWithProvider(aiProvider, diff, correction, copilotModel, openrouterModel, geminiModel) {
|
|
133
|
+
export async function generateCommitMessageWithProvider(aiProvider, diff, correction, copilotModel, openrouterModel, geminiModel, groqModel) {
|
|
116
134
|
switch (aiProvider) {
|
|
117
135
|
case 'gemini': {
|
|
118
136
|
const { generateCommitMessage } = await import('../api/gemini.js');
|
|
@@ -122,6 +140,10 @@ export async function generateCommitMessageWithProvider(aiProvider, diff, correc
|
|
|
122
140
|
const { generateCommitMessage } = await import('../api/copilot.js');
|
|
123
141
|
return generateCommitMessage(diff, correction, copilotModel);
|
|
124
142
|
}
|
|
143
|
+
case 'groq': {
|
|
144
|
+
const { generateCommitMessage } = await import('../api/groq.js');
|
|
145
|
+
return generateCommitMessage(diff, correction, groqModel);
|
|
146
|
+
}
|
|
125
147
|
default: {
|
|
126
148
|
const { generateCommitMessage } = await import('../api/openrouter.js');
|
|
127
149
|
return generateCommitMessage(diff, correction, openrouterModel);
|
|
@@ -331,6 +353,22 @@ export async function interactiveAIFallback(currentSuffix, aiProvider, model, di
|
|
|
331
353
|
spinner.stop();
|
|
332
354
|
break;
|
|
333
355
|
}
|
|
356
|
+
case 'groq': {
|
|
357
|
+
const groqApi = await import('../api/groq.js');
|
|
358
|
+
const { generateBranchName, generateCommitMessage } = groqApi;
|
|
359
|
+
const spinner = new ScrambleProgress();
|
|
360
|
+
spinner.start([
|
|
361
|
+
`Retrying with Groq${getModelValue(currentModel) ? ` (${getModelValue(currentModel)})` : ''}`,
|
|
362
|
+
]);
|
|
363
|
+
if (isCommit) {
|
|
364
|
+
aiSuffix = await generateCommitMessage(diff || 'Code changes', correction, currentModel);
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
aiSuffix = await generateBranchName(diff || 'Code changes', correction, currentModel);
|
|
368
|
+
}
|
|
369
|
+
spinner.stop();
|
|
370
|
+
break;
|
|
371
|
+
}
|
|
334
372
|
default: {
|
|
335
373
|
break;
|
|
336
374
|
}
|
|
@@ -381,7 +419,7 @@ export async function interactiveAIFallback(currentSuffix, aiProvider, model, di
|
|
|
381
419
|
const copOptions = models.some((m) => m.value === 'back')
|
|
382
420
|
? models
|
|
383
421
|
: [...models, { label: 'Back to try again model selection', value: 'back' }];
|
|
384
|
-
const chosen = await select('Choose a different Copilot model:', copOptions);
|
|
422
|
+
const chosen = await select('Choose a different GitHub Copilot model:', copOptions);
|
|
385
423
|
if (chosen === 'back') {
|
|
386
424
|
continue; // Go back to try again model selection
|
|
387
425
|
}
|
|
@@ -390,7 +428,7 @@ export async function interactiveAIFallback(currentSuffix, aiProvider, model, di
|
|
|
390
428
|
updateModel?.('copilot', chosen);
|
|
391
429
|
const spinner = new ScrambleProgress();
|
|
392
430
|
spinner.start([
|
|
393
|
-
`${isCommit ? 'Generating commit message' : 'Generating branch name'} with GitHub (${chosen})`,
|
|
431
|
+
`${isCommit ? 'Generating commit message' : 'Generating branch name'} with GitHub Copilot (${chosen})`,
|
|
394
432
|
]);
|
|
395
433
|
if (isCommit) {
|
|
396
434
|
const res = await generateCommitMessage(diff, correction, chosen);
|
|
@@ -437,132 +475,197 @@ export async function interactiveAIFallback(currentSuffix, aiProvider, model, di
|
|
|
437
475
|
}
|
|
438
476
|
continue;
|
|
439
477
|
}
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
value: p,
|
|
446
|
-
}));
|
|
447
|
-
const provOptionsWithBack = providerOptions.some((p) => p.value === 'back')
|
|
448
|
-
? providerOptions
|
|
449
|
-
: [...providerOptions, { label: 'Back to try again model selection', value: 'back' }];
|
|
450
|
-
const pickProv = await select('Choose AI provider:', provOptionsWithBack);
|
|
451
|
-
if (pickProv === 'back') {
|
|
452
|
-
continue; // return to try-again model selection
|
|
453
|
-
}
|
|
454
|
-
if (pickProv === 'gemini') {
|
|
455
|
-
// user selected Gemini provider — allow model choice and apply immediately
|
|
456
|
-
log.info(`Selected AI Provider: Gemini`);
|
|
457
|
-
const { ensureAIProvider } = await import('../core/setup.js');
|
|
458
|
-
const geminiReady = await ensureAIProvider('gemini');
|
|
459
|
-
if (!geminiReady) {
|
|
460
|
-
continue;
|
|
461
|
-
}
|
|
462
|
-
const gem = await import('../api/gemini.js');
|
|
463
|
-
const models = await gem.getGeminiModels();
|
|
464
|
-
const gemOptions = models.some((m) => m.value === 'back')
|
|
465
|
-
? models
|
|
466
|
-
: [...models, { label: 'Back to try again model selection', value: 'back' }];
|
|
467
|
-
const chosenModel = await select('Choose Gemini model:', gemOptions);
|
|
468
|
-
if (chosenModel === 'back') {
|
|
469
|
-
continue; // Go back to try again model selection
|
|
470
|
-
}
|
|
471
|
-
// set active provider + model for subsequent retries
|
|
472
|
-
aiProvider = 'gemini';
|
|
473
|
-
currentModel = chosenModel;
|
|
474
|
-
updateModel?.('gemini', chosenModel);
|
|
475
|
-
const spinner = new ScrambleProgress();
|
|
476
|
-
spinner.start([
|
|
477
|
-
`${isCommit ? 'Generating commit message' : 'Generating branch name'} with Gemini (${chosenModel})`,
|
|
478
|
-
]);
|
|
479
|
-
if (isCommit) {
|
|
480
|
-
// Use built-in Gemini API for commit generation
|
|
481
|
-
const res = await gem.generateCommitMessage(diff, correction, chosenModel);
|
|
482
|
-
aiSuffix = res;
|
|
483
|
-
}
|
|
484
|
-
else {
|
|
485
|
-
const res = await gem.generateBranchName(diff, correction, chosenModel);
|
|
486
|
-
aiSuffix = res;
|
|
487
|
-
}
|
|
488
|
-
spinner.stop();
|
|
489
|
-
}
|
|
490
|
-
else if (pickProv === 'copilot') {
|
|
491
|
-
log.info(`Selected AI Provider: Copilot`);
|
|
492
|
-
const { ensureAIProvider } = await import('../core/setup.js');
|
|
493
|
-
const copilotReady = await ensureAIProvider('copilot');
|
|
494
|
-
if (!copilotReady) {
|
|
495
|
-
continue;
|
|
496
|
-
}
|
|
497
|
-
const cop = await import('../api/copilot.js');
|
|
498
|
-
const { getCopilotModels, generateBranchName, generateCommitMessage } = cop;
|
|
499
|
-
const models = await getCopilotModels();
|
|
500
|
-
const copOptions = models.some((m) => m.value === 'back')
|
|
478
|
+
if (aiProvider === 'groq') {
|
|
479
|
+
const groqApi = await import('../api/groq.js');
|
|
480
|
+
const { generateBranchName, generateCommitMessage, getGroqModels } = groqApi;
|
|
481
|
+
const models = await getGroqModels();
|
|
482
|
+
const groqOptions = models.some((m) => m.value === 'back')
|
|
501
483
|
? models
|
|
502
484
|
: [...models, { label: 'Back to try again model selection', value: 'back' }];
|
|
503
|
-
const chosen = await select('Choose
|
|
485
|
+
const chosen = await select('Choose a different Groq model:', groqOptions);
|
|
504
486
|
if (chosen === 'back') {
|
|
505
|
-
continue;
|
|
487
|
+
continue;
|
|
506
488
|
}
|
|
507
|
-
// user already selected a model from the menu — apply it immediately
|
|
508
|
-
aiProvider = 'copilot';
|
|
509
489
|
currentModel = chosen;
|
|
510
|
-
updateModel?.('
|
|
490
|
+
updateModel?.('groq', chosen);
|
|
511
491
|
const spinner = new ScrambleProgress();
|
|
512
492
|
spinner.start([
|
|
513
|
-
`${isCommit ? 'Generating commit message' : 'Generating branch name'} with
|
|
493
|
+
`${isCommit ? 'Generating commit message' : 'Generating branch name'} with Groq (${chosen})`,
|
|
514
494
|
]);
|
|
515
495
|
if (isCommit) {
|
|
516
|
-
|
|
517
|
-
aiSuffix = res;
|
|
496
|
+
aiSuffix = await generateCommitMessage(diff, correction, chosen);
|
|
518
497
|
}
|
|
519
498
|
else {
|
|
520
|
-
|
|
521
|
-
aiSuffix = res;
|
|
499
|
+
aiSuffix = await generateBranchName(diff || 'Code changes', correction, chosen);
|
|
522
500
|
}
|
|
523
501
|
spinner.stop();
|
|
502
|
+
if (isTransientFailure(aiSuffix)) {
|
|
503
|
+
failedModels.add(chosen);
|
|
504
|
+
}
|
|
505
|
+
continue;
|
|
524
506
|
}
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
507
|
+
}
|
|
508
|
+
if (pick === 'different-provider') {
|
|
509
|
+
const providers = ['gemini', 'copilot', 'openrouter', 'groq'].filter((p) => p !== aiProvider);
|
|
510
|
+
const providerOptions = providers.map((p) => ({
|
|
511
|
+
label: getAIProviderDisplayName(p),
|
|
512
|
+
value: p,
|
|
513
|
+
}));
|
|
514
|
+
const provOptionsWithBack = providerOptions.some((p) => p.value === 'back')
|
|
515
|
+
? providerOptions
|
|
516
|
+
: [...providerOptions, { label: 'Back to try again model selection', value: 'back' }];
|
|
517
|
+
const pickProv = await select('Choose AI provider:', provOptionsWithBack);
|
|
518
|
+
if (pickProv === 'back') {
|
|
519
|
+
continue; // return to try-again model selection
|
|
520
|
+
}
|
|
521
|
+
switch (pickProv) {
|
|
522
|
+
case 'gemini': {
|
|
523
|
+
// user selected Gemini provider — allow model choice and apply immediately
|
|
524
|
+
log.info(`Selected AI Provider: Gemini`);
|
|
525
|
+
const { ensureAIProvider } = await import('../core/setup.js');
|
|
526
|
+
const geminiReady = await ensureAIProvider('gemini');
|
|
527
|
+
if (!geminiReady) {
|
|
528
|
+
continue;
|
|
529
|
+
}
|
|
530
|
+
const gem = await import('../api/gemini.js');
|
|
531
|
+
const models = await gem.getGeminiModels();
|
|
532
|
+
const gemOptions = models.some((m) => m.value === 'back')
|
|
533
|
+
? models
|
|
534
|
+
: [...models, { label: 'Back to try again model selection', value: 'back' }];
|
|
535
|
+
const chosenModel = await select('Choose Gemini model:', gemOptions);
|
|
536
|
+
if (chosenModel === 'back') {
|
|
537
|
+
continue; // Go back to try again model selection
|
|
538
|
+
}
|
|
539
|
+
// set active provider + model for subsequent retries
|
|
540
|
+
aiProvider = 'gemini';
|
|
541
|
+
currentModel = chosenModel;
|
|
542
|
+
updateModel?.('gemini', chosenModel);
|
|
543
|
+
const spinner = new ScrambleProgress();
|
|
544
|
+
spinner.start([
|
|
545
|
+
`${isCommit ? 'Generating commit message' : 'Generating branch name'} with Gemini (${chosenModel})`,
|
|
546
|
+
]);
|
|
547
|
+
if (isCommit) {
|
|
548
|
+
// Use built-in Gemini API for commit generation
|
|
549
|
+
const res = await gem.generateCommitMessage(diff, correction, chosenModel);
|
|
550
|
+
aiSuffix = res;
|
|
551
|
+
}
|
|
552
|
+
else {
|
|
553
|
+
const res = await gem.generateBranchName(diff, correction, chosenModel);
|
|
554
|
+
aiSuffix = res;
|
|
555
|
+
}
|
|
556
|
+
spinner.stop();
|
|
557
|
+
break;
|
|
531
558
|
}
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
559
|
+
case 'copilot': {
|
|
560
|
+
log.info(`Selected AI Provider: GitHub Copilot`);
|
|
561
|
+
const { ensureAIProvider } = await import('../core/setup.js');
|
|
562
|
+
const copilotReady = await ensureAIProvider('copilot');
|
|
563
|
+
if (!copilotReady) {
|
|
564
|
+
continue;
|
|
565
|
+
}
|
|
566
|
+
const cop = await import('../api/copilot.js');
|
|
567
|
+
const { getCopilotModels, generateBranchName, generateCommitMessage } = cop;
|
|
568
|
+
const models = await getCopilotModels();
|
|
569
|
+
const copOptions = models.some((m) => m.value === 'back')
|
|
570
|
+
? models
|
|
571
|
+
: [...models, { label: 'Back to try again model selection', value: 'back' }];
|
|
572
|
+
const chosen = await select('Choose GitHub Copilot model:', copOptions);
|
|
573
|
+
if (chosen === 'back') {
|
|
574
|
+
continue; // Go back to try again model selection
|
|
575
|
+
}
|
|
576
|
+
// user already selected a model from the menu — apply it immediately
|
|
577
|
+
aiProvider = 'copilot';
|
|
578
|
+
currentModel = chosen;
|
|
579
|
+
updateModel?.('copilot', chosen);
|
|
580
|
+
const spinner = new ScrambleProgress();
|
|
581
|
+
spinner.start([
|
|
582
|
+
`${isCommit ? 'Generating commit message' : 'Generating branch name'} with GitHub Copilot (${chosen})`,
|
|
583
|
+
]);
|
|
584
|
+
if (isCommit) {
|
|
585
|
+
const res = await generateCommitMessage(diff, correction, chosen);
|
|
586
|
+
aiSuffix = res;
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
const res = await generateBranchName(diff, correction, chosen);
|
|
590
|
+
aiSuffix = res;
|
|
591
|
+
}
|
|
592
|
+
spinner.stop();
|
|
593
|
+
break;
|
|
541
594
|
}
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
const
|
|
552
|
-
|
|
595
|
+
case 'openrouter': {
|
|
596
|
+
log.info(`Selected AI Provider: OpenRouter`);
|
|
597
|
+
const { ensureAIProvider } = await import('../core/setup.js');
|
|
598
|
+
const openrouterReady = await ensureAIProvider('openrouter');
|
|
599
|
+
if (!openrouterReady) {
|
|
600
|
+
continue;
|
|
601
|
+
}
|
|
602
|
+
const or = await import('../api/openrouter.js');
|
|
603
|
+
const { generateBranchName, generateCommitMessage, getOpenRouterModels } = or;
|
|
604
|
+
const models = await getOpenRouterModels();
|
|
605
|
+
const orOptions = models.some((m) => m.value === 'back')
|
|
606
|
+
? models
|
|
607
|
+
: [...models, { label: 'Back to try again model selection', value: 'back' }];
|
|
608
|
+
const chosen = await select('Choose OpenRouter Model:', orOptions);
|
|
609
|
+
if (chosen === 'back') {
|
|
610
|
+
continue;
|
|
611
|
+
}
|
|
612
|
+
aiProvider = 'openrouter';
|
|
613
|
+
currentModel = chosen;
|
|
614
|
+
updateModel?.('openrouter', chosen);
|
|
615
|
+
const spinner = new ScrambleProgress();
|
|
616
|
+
spinner.start([
|
|
617
|
+
`${isCommit ? 'Generating commit message' : 'Generating branch name'} with OpenRouter (${chosen})`,
|
|
618
|
+
]);
|
|
619
|
+
if (isCommit) {
|
|
620
|
+
aiSuffix = await generateCommitMessage(diff, correction, chosen);
|
|
621
|
+
}
|
|
622
|
+
else {
|
|
623
|
+
aiSuffix = await generateBranchName(diff, correction, chosen);
|
|
624
|
+
}
|
|
625
|
+
spinner.stop();
|
|
626
|
+
break;
|
|
553
627
|
}
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
628
|
+
case 'groq': {
|
|
629
|
+
log.info(`Selected AI Provider: Groq`);
|
|
630
|
+
const { ensureAIProvider } = await import('../core/setup.js');
|
|
631
|
+
const groqReady = await ensureAIProvider('groq');
|
|
632
|
+
if (!groqReady) {
|
|
633
|
+
continue;
|
|
634
|
+
}
|
|
635
|
+
const groqApi = await import('../api/groq.js');
|
|
636
|
+
const { generateBranchName, generateCommitMessage, getGroqModels } = groqApi;
|
|
637
|
+
const models = await getGroqModels();
|
|
638
|
+
const groqOptions = models.some((m) => m.value === 'back')
|
|
639
|
+
? models
|
|
640
|
+
: [...models, { label: 'Back to try again model selection', value: 'back' }];
|
|
641
|
+
const chosen = await select('Choose Groq model:', groqOptions);
|
|
642
|
+
if (chosen === 'back') {
|
|
643
|
+
continue;
|
|
644
|
+
}
|
|
645
|
+
aiProvider = 'groq';
|
|
646
|
+
currentModel = chosen;
|
|
647
|
+
updateModel?.('groq', chosen);
|
|
648
|
+
const spinner = new ScrambleProgress();
|
|
649
|
+
spinner.start([
|
|
650
|
+
`${isCommit ? 'Generating commit message' : 'Generating branch name'} with Groq (${chosen})`,
|
|
651
|
+
]);
|
|
652
|
+
if (isCommit) {
|
|
653
|
+
aiSuffix = await generateCommitMessage(diff, correction, chosen);
|
|
654
|
+
}
|
|
655
|
+
else {
|
|
656
|
+
aiSuffix = await generateBranchName(diff, correction, chosen);
|
|
657
|
+
}
|
|
658
|
+
spinner.stop();
|
|
659
|
+
break;
|
|
557
660
|
}
|
|
558
|
-
|
|
661
|
+
// No default
|
|
559
662
|
}
|
|
560
663
|
continue;
|
|
561
664
|
}
|
|
562
665
|
}
|
|
563
666
|
}
|
|
564
|
-
export async function getBranchNameFromDiffUsingProvider(provider, diff, correction, copilotModel, openrouterModel) {
|
|
565
|
-
return generateBranchNameWithProvider(provider, diff, correction, copilotModel, openrouterModel);
|
|
667
|
+
export async function getBranchNameFromDiffUsingProvider(provider, diff, correction, copilotModel, openrouterModel, geminiModel, groqModel) {
|
|
668
|
+
return generateBranchNameWithProvider(provider, diff, correction, copilotModel, openrouterModel, geminiModel, groqModel);
|
|
566
669
|
}
|
|
567
670
|
/**
|
|
568
671
|
* Ensure provider setup and prompt the user to choose a model for that provider.
|
|
@@ -570,7 +673,7 @@ export async function getBranchNameFromDiffUsingProvider(provider, diff, correct
|
|
|
570
673
|
*/
|
|
571
674
|
export async function chooseModelForProvider(provider, prompt, backLabel) {
|
|
572
675
|
if (provider === 'copilot') {
|
|
573
|
-
log.info(`Selected AI Provider: Copilot`);
|
|
676
|
+
log.info(`Selected AI Provider: GitHub Copilot`);
|
|
574
677
|
const { ensureAIProvider } = await import('../core/setup.js');
|
|
575
678
|
const ready = await ensureAIProvider(provider);
|
|
576
679
|
if (!ready) {
|
|
@@ -580,12 +683,12 @@ export async function chooseModelForProvider(provider, prompt, backLabel) {
|
|
|
580
683
|
const models = (await cop.getCopilotModels());
|
|
581
684
|
// Check if no models are available (SDK not installed or not functioning)
|
|
582
685
|
if (models.length === 0) {
|
|
583
|
-
log.warn('Copilot
|
|
686
|
+
log.warn('GitHub Copilot API not accessible.');
|
|
584
687
|
console.log('');
|
|
585
|
-
log.info('
|
|
688
|
+
log.info('A GitHub account with Copilot access (free tier or subscription) is required.');
|
|
586
689
|
console.log('');
|
|
587
690
|
const { confirm } = await import('../cli/input.js');
|
|
588
|
-
const shouldInstall = confirm('Setup Copilot
|
|
691
|
+
const shouldInstall = confirm('Setup GitHub Copilot now?');
|
|
589
692
|
if (shouldInstall) {
|
|
590
693
|
console.log('');
|
|
591
694
|
// Use the comprehensive setup helper instead of manual exec
|
|
@@ -601,7 +704,7 @@ export async function chooseModelForProvider(provider, prompt, backLabel) {
|
|
|
601
704
|
? modelsAfterInstall
|
|
602
705
|
: [...modelsAfterInstall, { label: backLabel ?? 'Back', value: 'back' }];
|
|
603
706
|
const { select } = await import('../cli/menu.js');
|
|
604
|
-
const chosen = await select(prompt ?? 'Choose Copilot model:', options);
|
|
707
|
+
const chosen = await select(prompt ?? 'Choose GitHub Copilot model:', options);
|
|
605
708
|
return chosen;
|
|
606
709
|
}
|
|
607
710
|
else {
|
|
@@ -624,7 +727,7 @@ export async function chooseModelForProvider(provider, prompt, backLabel) {
|
|
|
624
727
|
? models
|
|
625
728
|
: [...models, { label: backLabel ?? 'Back', value: 'back' }];
|
|
626
729
|
const { select } = await import('../cli/menu.js');
|
|
627
|
-
const chosen = await select(prompt ?? 'Choose Copilot model:', options);
|
|
730
|
+
const chosen = await select(prompt ?? 'Choose GitHub Copilot model:', options);
|
|
628
731
|
return chosen;
|
|
629
732
|
}
|
|
630
733
|
if (provider === 'openrouter') {
|
|
@@ -648,6 +751,25 @@ export async function chooseModelForProvider(provider, prompt, backLabel) {
|
|
|
648
751
|
const chosen = await select(prompt ?? 'Choose OpenRouter model:', options);
|
|
649
752
|
return chosen;
|
|
650
753
|
}
|
|
754
|
+
if (provider === 'groq') {
|
|
755
|
+
log.info(`Selected AI Provider: Groq`);
|
|
756
|
+
const { ensureAIProvider } = await import('../core/setup.js');
|
|
757
|
+
const ready = await ensureAIProvider('groq');
|
|
758
|
+
if (!ready)
|
|
759
|
+
return undefined;
|
|
760
|
+
const groqApi = await import('../api/groq.js');
|
|
761
|
+
const models = await groqApi.getGroqModels();
|
|
762
|
+
if (models.length === 0) {
|
|
763
|
+
log.warn('No Groq models available.');
|
|
764
|
+
return undefined;
|
|
765
|
+
}
|
|
766
|
+
const options = models.some((m) => m.value === 'back')
|
|
767
|
+
? models
|
|
768
|
+
: [...models, { label: backLabel ?? 'Back', value: 'back' }];
|
|
769
|
+
const { select } = await import('../cli/menu.js');
|
|
770
|
+
const chosen = await select(prompt ?? 'Choose Groq model:', options);
|
|
771
|
+
return chosen;
|
|
772
|
+
}
|
|
651
773
|
// Gemini
|
|
652
774
|
log.info(`Selected AI Provider: Gemini`);
|
|
653
775
|
const { ensureAIProvider } = await import('../core/setup.js');
|