code-gate 0.1.0 → 1.0.1

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 (133) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +222 -114
  3. package/README_ZH.md +224 -0
  4. package/bin/code-gate.js +12 -19
  5. package/dist/__tests__/config.test.js +1 -1
  6. package/dist/__tests__/config.test.js.map +1 -1
  7. package/dist/__tests__/render.test.js +24 -7
  8. package/dist/__tests__/render.test.js.map +1 -1
  9. package/dist/cli/commands/hook.d.ts +1 -0
  10. package/dist/cli/commands/hook.js +164 -0
  11. package/dist/cli/commands/hook.js.map +1 -0
  12. package/dist/cli/commands/init.d.ts +1 -0
  13. package/dist/cli/commands/init.js +157 -0
  14. package/dist/cli/commands/init.js.map +1 -0
  15. package/dist/cli/commands/setup.d.ts +1 -0
  16. package/dist/cli/commands/setup.js +19 -0
  17. package/dist/cli/commands/setup.js.map +1 -0
  18. package/dist/cli/index.d.ts +2 -0
  19. package/dist/cli/index.js +26 -0
  20. package/dist/cli/index.js.map +1 -0
  21. package/dist/commands/hook.js +7 -0
  22. package/dist/commands/hook.js.map +1 -1
  23. package/dist/commands/init.js +20 -20
  24. package/dist/config/defaults.d.ts +2 -0
  25. package/dist/config/defaults.js +33 -0
  26. package/dist/config/defaults.js.map +1 -0
  27. package/dist/config/index.d.ts +4 -0
  28. package/dist/config/index.js +77 -0
  29. package/dist/config/index.js.map +1 -0
  30. package/dist/config/types.d.ts +55 -0
  31. package/dist/config/types.js +2 -0
  32. package/dist/config/types.js.map +1 -0
  33. package/dist/config.d.ts +111 -21
  34. package/dist/config.js +83 -21
  35. package/dist/config.js.map +1 -1
  36. package/dist/core/git.d.ts +7 -0
  37. package/dist/core/git.js +67 -0
  38. package/dist/core/git.js.map +1 -0
  39. package/dist/core/review-flow.js +105 -59
  40. package/dist/core/review-flow.js.map +1 -1
  41. package/dist/core/review.d.ts +6 -0
  42. package/dist/core/review.js +167 -0
  43. package/dist/core/review.js.map +1 -0
  44. package/dist/index.d.ts +1 -1
  45. package/dist/index.js +1 -1
  46. package/dist/index.js.map +1 -1
  47. package/dist/llm/base.d.ts +14 -0
  48. package/dist/llm/base.js +10 -0
  49. package/dist/llm/base.js.map +1 -0
  50. package/dist/llm/deepseek.js +3 -3
  51. package/dist/llm/deepseek.js.map +1 -1
  52. package/dist/llm/index.d.ts +4 -0
  53. package/dist/llm/index.js +41 -0
  54. package/dist/llm/index.js.map +1 -0
  55. package/dist/llm/ollama.js +2 -2
  56. package/dist/llm/ollama.js.map +1 -1
  57. package/dist/llm/providers/aliyun.d.ts +4 -0
  58. package/dist/llm/providers/aliyun.js +25 -0
  59. package/dist/llm/providers/aliyun.js.map +1 -0
  60. package/dist/llm/providers/anthropic.d.ts +4 -0
  61. package/dist/llm/providers/anthropic.js +52 -0
  62. package/dist/llm/providers/anthropic.js.map +1 -0
  63. package/dist/llm/providers/azure.d.ts +4 -0
  64. package/dist/llm/providers/azure.js +38 -0
  65. package/dist/llm/providers/azure.js.map +1 -0
  66. package/dist/llm/providers/cohere.d.ts +4 -0
  67. package/dist/llm/providers/cohere.js +39 -0
  68. package/dist/llm/providers/cohere.js.map +1 -0
  69. package/dist/llm/providers/deepseek.d.ts +4 -0
  70. package/dist/llm/providers/deepseek.js +25 -0
  71. package/dist/llm/providers/deepseek.js.map +1 -0
  72. package/dist/llm/providers/gemini.d.ts +4 -0
  73. package/dist/llm/providers/gemini.js +40 -0
  74. package/dist/llm/providers/gemini.js.map +1 -0
  75. package/dist/llm/providers/mistral.d.ts +4 -0
  76. package/dist/llm/providers/mistral.js +42 -0
  77. package/dist/llm/providers/mistral.js.map +1 -0
  78. package/dist/llm/providers/ollama.d.ts +5 -0
  79. package/dist/llm/providers/ollama.js +67 -0
  80. package/dist/llm/providers/ollama.js.map +1 -0
  81. package/dist/llm/providers/openai.d.ts +4 -0
  82. package/dist/llm/providers/openai.js +27 -0
  83. package/dist/llm/providers/openai.js.map +1 -0
  84. package/dist/llm/providers/volcengine.d.ts +4 -0
  85. package/dist/llm/providers/volcengine.js +29 -0
  86. package/dist/llm/providers/volcengine.js.map +1 -0
  87. package/dist/llm/providers/zhipu.d.ts +4 -0
  88. package/dist/llm/providers/zhipu.js +25 -0
  89. package/dist/llm/providers/zhipu.js.map +1 -0
  90. package/dist/locales/de.d.ts +2 -0
  91. package/dist/locales/de.js +33 -0
  92. package/dist/locales/de.js.map +1 -0
  93. package/dist/locales/en.d.ts +2 -0
  94. package/dist/locales/en.js +33 -0
  95. package/dist/locales/en.js.map +1 -0
  96. package/dist/locales/fr.d.ts +2 -0
  97. package/dist/locales/fr.js +33 -0
  98. package/dist/locales/fr.js.map +1 -0
  99. package/dist/locales/index.d.ts +3 -0
  100. package/dist/locales/index.js +41 -0
  101. package/dist/locales/index.js.map +1 -0
  102. package/dist/locales/ja.d.ts +2 -0
  103. package/dist/locales/ja.js +33 -0
  104. package/dist/locales/ja.js.map +1 -0
  105. package/dist/locales/ko.d.ts +2 -0
  106. package/dist/locales/ko.js +33 -0
  107. package/dist/locales/ko.js.map +1 -0
  108. package/dist/locales/types.d.ts +32 -0
  109. package/dist/locales/types.js +2 -0
  110. package/dist/locales/types.js.map +1 -0
  111. package/dist/locales/zh-CN.d.ts +2 -0
  112. package/dist/locales/zh-CN.js +33 -0
  113. package/dist/locales/zh-CN.js.map +1 -0
  114. package/dist/locales/zh-TW.d.ts +2 -0
  115. package/dist/locales/zh-TW.js +33 -0
  116. package/dist/locales/zh-TW.js.map +1 -0
  117. package/dist/ui/render/assets.d.ts +8 -0
  118. package/dist/ui/render/assets.js +89 -0
  119. package/dist/ui/render/assets.js.map +1 -0
  120. package/dist/ui/render/html.d.ts +35 -0
  121. package/dist/ui/render/html.js +294 -0
  122. package/dist/ui/render/html.js.map +1 -0
  123. package/dist/ui/render.d.ts +11 -0
  124. package/dist/ui/render.js +198 -13
  125. package/dist/ui/render.js.map +1 -1
  126. package/dist/ui/server.d.ts +4 -2
  127. package/dist/ui/server.js +30 -8
  128. package/dist/ui/server.js.map +1 -1
  129. package/dist/utils/logger.d.ts +3 -0
  130. package/dist/utils/logger.js +10 -0
  131. package/dist/utils/logger.js.map +1 -0
  132. package/package.json +27 -8
  133. package/scripts/hook.sh +12 -0
@@ -0,0 +1,52 @@
1
+ import { BaseLLMProvider } from '../base.js';
2
+ export class AnthropicProvider extends BaseLLMProvider {
3
+ async review(input) {
4
+ const opts = this.config.providerOptions?.anthropic;
5
+ const apiKeyEnv = opts?.apiKeyEnv || 'ANTHROPIC_API_KEY';
6
+ const apiKey = process.env[apiKeyEnv] || opts?.apiKey;
7
+ if (!apiKey) {
8
+ throw new Error(`Missing Anthropic API key. Please set ${apiKeyEnv} in environment variables or configure 'apiKey' in .codegate.js`);
9
+ }
10
+ // OpenAI SDK compatible client for Anthropic via baseURL if using a proxy,
11
+ // BUT usually Anthropic has its own SDK.
12
+ // For simplicity and uniformity, we can try to use the 'anthropic-openai' adapter OR
13
+ // just implement a simple fetch for Anthropic API since we don't want to add too many heavy dependencies.
14
+ // However, the user asked for "robustness".
15
+ // Let's use the OpenAI SDK with a custom baseURL if the user provides a compatible proxy,
16
+ // OR we can use the `anthropic` package. But `openai` package is already installed.
17
+ // Let's implement a direct fetch to avoid adding another dependency if possible, OR
18
+ // just use OpenAI SDK structure if the user is using a proxy.
19
+ // WAIT, for Anthropic native API we should use `fetch`.
20
+ const baseURL = opts?.baseURL || 'https://api.anthropic.com/v1';
21
+ const model = opts?.model || 'claude-3-5-sonnet-20240620';
22
+ try {
23
+ const res = await fetch(`${baseURL}/messages`, {
24
+ method: 'POST',
25
+ headers: {
26
+ 'x-api-key': apiKey,
27
+ 'anthropic-version': '2023-06-01',
28
+ 'content-type': 'application/json'
29
+ },
30
+ body: JSON.stringify({
31
+ model,
32
+ max_tokens: opts?.request?.max_tokens || 4096,
33
+ messages: [
34
+ { role: 'user', content: `${input.prompt}\n\n${this.buildUserPrompt(input.diff)}` } // Anthropic system prompt is separate usually, but this works
35
+ ],
36
+ system: input.prompt, // New Anthropic API supports system param
37
+ temperature: opts?.request?.temperature
38
+ })
39
+ });
40
+ if (!res.ok) {
41
+ const txt = await res.text();
42
+ throw new Error(`Anthropic API error: ${res.status} ${txt}`);
43
+ }
44
+ const data = await res.json();
45
+ return data.content?.[0]?.text || '';
46
+ }
47
+ catch (e) {
48
+ throw new Error(`Anthropic review failed: ${e.message}`);
49
+ }
50
+ }
51
+ }
52
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/llm/providers/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAe,MAAM,YAAY,CAAA;AAEzD,MAAM,OAAO,iBAAkB,SAAQ,eAAe;IACpD,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,SAAS,CAAA;QACnD,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,mBAAmB,CAAA;QACxD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,MAAM,CAAA;QAErD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,yCAAyC,SAAS,iEAAiE,CAAC,CAAA;QACtI,CAAC;QAED,4EAA4E;QAC5E,0CAA0C;QAC1C,sFAAsF;QACtF,0GAA0G;QAC1G,4CAA4C;QAC5C,0FAA0F;QAC1F,oFAAoF;QACpF,oFAAoF;QACpF,8DAA8D;QAC9D,wDAAwD;QAExD,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,8BAA8B,CAAA;QAC/D,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,4BAA4B,CAAA;QAEzD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,WAAW,EAAE;gBAC7C,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,WAAW,EAAE,MAAM;oBACnB,mBAAmB,EAAE,YAAY;oBACjC,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK;oBACL,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,IAAI,IAAI;oBAC7C,QAAQ,EAAE;wBACR,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,8DAA8D;qBACnJ;oBACD,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,0CAA0C;oBAChE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW;iBACxC,CAAC;aACH,CAAC,CAAA;YAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;gBAC5B,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAA;YAC9D,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;YAC7B,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;QACtC,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QAC1D,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import { BaseLLMProvider, ReviewInput } from '../base.js';
2
+ export declare class AzureOpenAIProvider extends BaseLLMProvider {
3
+ review(input: ReviewInput): Promise<string>;
4
+ }
@@ -0,0 +1,38 @@
1
+ import OpenAI from 'openai';
2
+ import { BaseLLMProvider } from '../base.js';
3
+ export class AzureOpenAIProvider extends BaseLLMProvider {
4
+ async review(input) {
5
+ const opts = this.config.providerOptions?.azureOpenAI;
6
+ const apiKeyEnv = opts?.apiKeyEnv || 'AZURE_OPENAI_API_KEY';
7
+ const apiKey = process.env[apiKeyEnv] || opts?.apiKey;
8
+ // Azure specific config
9
+ const endpoint = opts?.endpoint;
10
+ const deployment = opts?.deployment;
11
+ const apiVersion = opts?.apiVersion || '2024-08-01-preview';
12
+ if (!apiKey) {
13
+ throw new Error(`Missing Azure OpenAI API key. Please set ${apiKeyEnv} in environment variables or configure 'apiKey' in .codegate.js`);
14
+ }
15
+ if (!endpoint) {
16
+ throw new Error('Missing Azure OpenAI endpoint in config');
17
+ }
18
+ if (!deployment) {
19
+ throw new Error('Missing Azure OpenAI deployment name in config');
20
+ }
21
+ const client = new OpenAI({
22
+ apiKey,
23
+ baseURL: `${endpoint}/openai/deployments/${deployment}`,
24
+ defaultQuery: { 'api-version': apiVersion },
25
+ defaultHeaders: { 'api-key': apiKey }
26
+ });
27
+ const res = await client.chat.completions.create({
28
+ model: deployment, // Azure uses deployment name as model
29
+ messages: [
30
+ { role: 'system', content: input.prompt },
31
+ { role: 'user', content: this.buildUserPrompt(input.diff) }
32
+ ],
33
+ ...opts?.request
34
+ });
35
+ return res.choices?.[0]?.message?.content || '';
36
+ }
37
+ }
38
+ //# sourceMappingURL=azure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure.js","sourceRoot":"","sources":["../../../src/llm/providers/azure.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,eAAe,EAAe,MAAM,YAAY,CAAA;AAEzD,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IACtD,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,WAAW,CAAA;QACrD,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,sBAAsB,CAAA;QAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,MAAM,CAAA;QAErD,wBAAwB;QACxB,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,CAAA;QAC/B,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,CAAA;QACnC,MAAM,UAAU,GAAG,IAAI,EAAE,UAAU,IAAI,oBAAoB,CAAA;QAE3D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,4CAA4C,SAAS,iEAAiE,CAAC,CAAA;QACzI,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;QAC5D,CAAC;QACD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;QACnE,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,MAAM;YACN,OAAO,EAAE,GAAG,QAAQ,uBAAuB,UAAU,EAAE;YACvD,YAAY,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE;YAC3C,cAAc,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;SACtC,CAAC,CAAA;QAEF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YAC/C,KAAK,EAAE,UAAU,EAAE,sCAAsC;YACzD,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE;gBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;aAC5D;YACD,GAAG,IAAI,EAAE,OAAO;SACjB,CAAC,CAAA;QAEF,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAA;IACjD,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import { BaseLLMProvider, ReviewInput } from '../base.js';
2
+ export declare class CohereProvider extends BaseLLMProvider {
3
+ review(input: ReviewInput): Promise<string>;
4
+ }
@@ -0,0 +1,39 @@
1
+ import { BaseLLMProvider } from '../base.js';
2
+ export class CohereProvider extends BaseLLMProvider {
3
+ async review(input) {
4
+ const opts = this.config.providerOptions?.cohere;
5
+ const apiKeyEnv = opts?.apiKeyEnv || 'CO_API_KEY';
6
+ const apiKey = process.env[apiKeyEnv] || opts?.apiKey;
7
+ if (!apiKey) {
8
+ throw new Error(`Missing Cohere API key. Please set ${apiKeyEnv} in environment variables or configure 'apiKey' in .codegate.js`);
9
+ }
10
+ const baseURL = opts?.baseURL || 'https://api.cohere.ai/v1';
11
+ const model = opts?.model || 'command-r-plus';
12
+ try {
13
+ const res = await fetch(`${baseURL}/chat`, {
14
+ method: 'POST',
15
+ headers: {
16
+ 'Authorization': `Bearer ${apiKey}`,
17
+ 'Content-Type': 'application/json'
18
+ },
19
+ body: JSON.stringify({
20
+ model,
21
+ message: this.buildUserPrompt(input.diff),
22
+ preamble: input.prompt,
23
+ temperature: opts?.request?.temperature,
24
+ p: opts?.request?.top_p
25
+ })
26
+ });
27
+ if (!res.ok) {
28
+ const txt = await res.text();
29
+ throw new Error(`Cohere API error: ${res.status} ${txt}`);
30
+ }
31
+ const data = await res.json();
32
+ return data.text || '';
33
+ }
34
+ catch (e) {
35
+ throw new Error(`Cohere review failed: ${e.message}`);
36
+ }
37
+ }
38
+ }
39
+ //# sourceMappingURL=cohere.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cohere.js","sourceRoot":"","sources":["../../../src/llm/providers/cohere.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAe,MAAM,YAAY,CAAA;AAEzD,MAAM,OAAO,cAAe,SAAQ,eAAe;IACjD,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAA;QAChD,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,YAAY,CAAA;QACjD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,MAAM,CAAA;QAErD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,sCAAsC,SAAS,iEAAiE,CAAC,CAAA;QACnI,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,0BAA0B,CAAA;QAC3D,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,gBAAgB,CAAA;QAE7C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,OAAO,EAAE;gBACzC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,eAAe,EAAE,UAAU,MAAM,EAAE;oBACnC,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK;oBACL,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;oBACzC,QAAQ,EAAE,KAAK,CAAC,MAAM;oBACtB,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW;oBACvC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK;iBACxB,CAAC;aACH,CAAC,CAAA;YAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;gBAC5B,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAA;YAC3D,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;YAC7B,OAAO,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;QACxB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import { BaseLLMProvider, ReviewInput } from '../base.js';
2
+ export declare class DeepSeekProvider extends BaseLLMProvider {
3
+ review(input: ReviewInput): Promise<string>;
4
+ }
@@ -0,0 +1,25 @@
1
+ import OpenAI from 'openai';
2
+ import { BaseLLMProvider } from '../base.js';
3
+ export class DeepSeekProvider extends BaseLLMProvider {
4
+ async review(input) {
5
+ const opts = this.config.providerOptions?.deepseek;
6
+ const baseURL = (opts?.baseURL || 'https://api.deepseek.com').replace(/`/g, '').trim();
7
+ const apiKeyEnv = opts?.apiKeyEnv || 'DEEPSEEK_API_KEY';
8
+ const apiKey = process.env[apiKeyEnv] || opts?.apiKey;
9
+ if (!apiKey) {
10
+ throw new Error(`Missing DeepSeek API key. Please set ${apiKeyEnv} in environment variables or configure 'apiKey' in .codegate.js`);
11
+ }
12
+ const client = new OpenAI({ baseURL, apiKey });
13
+ const model = opts?.model || 'deepseek-chat';
14
+ const res = await client.chat.completions.create({
15
+ model,
16
+ messages: [
17
+ { role: 'system', content: input.prompt },
18
+ { role: 'user', content: this.buildUserPrompt(input.diff) }
19
+ ],
20
+ ...opts?.request
21
+ });
22
+ return res.choices?.[0]?.message?.content || '';
23
+ }
24
+ }
25
+ //# sourceMappingURL=deepseek.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepseek.js","sourceRoot":"","sources":["../../../src/llm/providers/deepseek.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,eAAe,EAAe,MAAM,YAAY,CAAA;AAEzD,MAAM,OAAO,gBAAiB,SAAQ,eAAe;IACnD,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,QAAQ,CAAA;QAClD,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,0BAA0B,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QACtF,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,kBAAkB,CAAA;QACvD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,MAAM,CAAA;QAErD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,wCAAwC,SAAS,iEAAiE,CAAC,CAAA;QACrI,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;QAC9C,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,eAAe,CAAA;QAE5C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YAC/C,KAAK;YACL,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE;gBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;aAC5D;YACD,GAAG,IAAI,EAAE,OAAO;SACjB,CAAC,CAAA;QAEF,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAA;IACjD,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import { BaseLLMProvider, ReviewInput } from '../base.js';
2
+ export declare class GeminiProvider extends BaseLLMProvider {
3
+ review(input: ReviewInput): Promise<string>;
4
+ }
@@ -0,0 +1,40 @@
1
+ import { BaseLLMProvider } from '../base.js';
2
+ export class GeminiProvider extends BaseLLMProvider {
3
+ async review(input) {
4
+ const opts = this.config.providerOptions?.gemini;
5
+ const apiKeyEnv = opts?.apiKeyEnv || 'GEMINI_API_KEY';
6
+ const apiKey = process.env[apiKeyEnv] || opts?.apiKey;
7
+ if (!apiKey) {
8
+ throw new Error(`Missing Gemini API key. Please set ${apiKeyEnv} in environment variables or configure 'apiKey' in .codegate.js`);
9
+ }
10
+ const baseURL = opts?.baseURL || 'https://generativelanguage.googleapis.com/v1beta';
11
+ const model = opts?.model || 'gemini-1.5-flash';
12
+ const url = `${baseURL}/models/${model}:generateContent?key=${apiKey}`;
13
+ try {
14
+ const res = await fetch(url, {
15
+ method: 'POST',
16
+ headers: { 'Content-Type': 'application/json' },
17
+ body: JSON.stringify({
18
+ contents: [{
19
+ parts: [{ text: input.prompt + '\n\n' + this.buildUserPrompt(input.diff) }]
20
+ }],
21
+ generationConfig: {
22
+ temperature: opts?.request?.temperature,
23
+ maxOutputTokens: opts?.request?.max_tokens,
24
+ topP: opts?.request?.top_p
25
+ }
26
+ })
27
+ });
28
+ if (!res.ok) {
29
+ const txt = await res.text();
30
+ throw new Error(`Gemini API error: ${res.status} ${txt}`);
31
+ }
32
+ const data = await res.json();
33
+ return data.candidates?.[0]?.content?.parts?.[0]?.text || '';
34
+ }
35
+ catch (e) {
36
+ throw new Error(`Gemini review failed: ${e.message}`);
37
+ }
38
+ }
39
+ }
40
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/llm/providers/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAe,MAAM,YAAY,CAAA;AAEzD,MAAM,OAAO,cAAe,SAAQ,eAAe;IACjD,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAA;QAChD,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,gBAAgB,CAAA;QACrD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,MAAM,CAAA;QAErD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,sCAAsC,SAAS,iEAAiE,CAAC,CAAA;QACnI,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,kDAAkD,CAAA;QACnF,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,kBAAkB,CAAA;QAE/C,MAAM,GAAG,GAAG,GAAG,OAAO,WAAW,KAAK,wBAAwB,MAAM,EAAE,CAAA;QAEtE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC3B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,QAAQ,EAAE,CAAC;4BACT,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;yBAC5E,CAAC;oBACF,gBAAgB,EAAE;wBAChB,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW;wBACvC,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU;wBAC1C,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK;qBAC3B;iBACF,CAAC;aACH,CAAC,CAAA;YAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;gBAC5B,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAA;YAC3D,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;YAC7B,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAA;QAC9D,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import { BaseLLMProvider, ReviewInput } from '../base.js';
2
+ export declare class MistralProvider extends BaseLLMProvider {
3
+ review(input: ReviewInput): Promise<string>;
4
+ }
@@ -0,0 +1,42 @@
1
+ import { BaseLLMProvider } from '../base.js';
2
+ export class MistralProvider extends BaseLLMProvider {
3
+ async review(input) {
4
+ const opts = this.config.providerOptions?.mistral;
5
+ const apiKeyEnv = opts?.apiKeyEnv || 'MISTRAL_API_KEY';
6
+ const apiKey = process.env[apiKeyEnv] || opts?.apiKey;
7
+ if (!apiKey) {
8
+ throw new Error(`Missing Mistral API key. Please set ${apiKeyEnv} in environment variables or configure 'apiKey' in .codegate.js`);
9
+ }
10
+ const baseURL = opts?.baseURL || 'https://api.mistral.ai/v1';
11
+ const model = opts?.model || 'mistral-large-latest';
12
+ try {
13
+ const res = await fetch(`${baseURL}/chat/completions`, {
14
+ method: 'POST',
15
+ headers: {
16
+ 'Authorization': `Bearer ${apiKey}`,
17
+ 'Content-Type': 'application/json'
18
+ },
19
+ body: JSON.stringify({
20
+ model,
21
+ messages: [
22
+ { role: 'system', content: input.prompt },
23
+ { role: 'user', content: this.buildUserPrompt(input.diff) }
24
+ ],
25
+ temperature: opts?.request?.temperature,
26
+ max_tokens: opts?.request?.max_tokens,
27
+ top_p: opts?.request?.top_p
28
+ })
29
+ });
30
+ if (!res.ok) {
31
+ const txt = await res.text();
32
+ throw new Error(`Mistral API error: ${res.status} ${txt}`);
33
+ }
34
+ const data = await res.json();
35
+ return data.choices?.[0]?.message?.content || '';
36
+ }
37
+ catch (e) {
38
+ throw new Error(`Mistral review failed: ${e.message}`);
39
+ }
40
+ }
41
+ }
42
+ //# sourceMappingURL=mistral.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mistral.js","sourceRoot":"","sources":["../../../src/llm/providers/mistral.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAe,MAAM,YAAY,CAAA;AAEzD,MAAM,OAAO,eAAgB,SAAQ,eAAe;IAClD,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,CAAA;QACjD,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,iBAAiB,CAAA;QACtD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,MAAM,CAAA;QAErD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,uCAAuC,SAAS,iEAAiE,CAAC,CAAA;QACpI,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,2BAA2B,CAAA;QAC5D,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,sBAAsB,CAAA;QAEnD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,mBAAmB,EAAE;gBACrD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,eAAe,EAAE,UAAU,MAAM,EAAE;oBACnC,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK;oBACL,QAAQ,EAAE;wBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE;wBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;qBAC5D;oBACD,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW;oBACvC,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU;oBACrC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK;iBAC5B,CAAC;aACH,CAAC,CAAA;YAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;gBAC5B,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAA;YAC5D,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;YAC7B,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAA;QAClD,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QACxD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import { BaseLLMProvider, ReviewInput } from '../base.js';
2
+ export declare class OllamaProvider extends BaseLLMProvider {
3
+ review(input: ReviewInput): Promise<string>;
4
+ private fallbackToGenerate;
5
+ }
@@ -0,0 +1,67 @@
1
+ import { BaseLLMProvider } from '../base.js';
2
+ export class OllamaProvider extends BaseLLMProvider {
3
+ async review(input) {
4
+ const opts = this.config.providerOptions?.ollama;
5
+ const baseURL = opts?.baseURL || 'http://localhost:11434';
6
+ const model = opts?.model || 'qwen2.5-coder';
7
+ const timeout = opts?.request?.timeout || 15000;
8
+ const chatUrl = `${baseURL}/api/chat`;
9
+ const chatBody = {
10
+ model,
11
+ messages: [
12
+ { role: 'system', content: input.prompt },
13
+ { role: 'user', content: this.buildUserPrompt(input.diff) }
14
+ ],
15
+ stream: false
16
+ };
17
+ const controller = new AbortController();
18
+ const timer = setTimeout(() => controller.abort('timeout'), timeout);
19
+ try {
20
+ const res = await fetch(chatUrl, {
21
+ method: 'POST',
22
+ headers: { 'Content-Type': 'application/json' },
23
+ body: JSON.stringify(chatBody),
24
+ signal: controller.signal
25
+ });
26
+ clearTimeout(timer);
27
+ if (res.ok) {
28
+ const data = await res.json();
29
+ return (data?.message?.content ||
30
+ data?.messages?.[data.messages.length - 1]?.content ||
31
+ '');
32
+ }
33
+ // If chat endpoint fails, try generate endpoint
34
+ const txt = await res.text().catch(() => '');
35
+ return this.fallbackToGenerate(baseURL, model, input, `Request failed: ${res.status} ${txt}`);
36
+ }
37
+ catch (e) {
38
+ clearTimeout(timer);
39
+ return this.fallbackToGenerate(baseURL, model, input, e?.message || String(e));
40
+ }
41
+ }
42
+ async fallbackToGenerate(baseURL, model, input, errorMsg) {
43
+ const genUrl = `${baseURL}/api/generate`;
44
+ const genBody = {
45
+ model,
46
+ prompt: input.prompt + '\n\n' + this.buildUserPrompt(input.diff),
47
+ stream: false
48
+ };
49
+ try {
50
+ const res = await fetch(genUrl, {
51
+ method: 'POST',
52
+ headers: { 'Content-Type': 'application/json' },
53
+ body: JSON.stringify(genBody)
54
+ });
55
+ if (!res.ok) {
56
+ const txt = await res.text().catch(() => '');
57
+ throw new Error(`Ollama fallback failed: ${res.status} ${txt} (Original error: ${errorMsg})`);
58
+ }
59
+ const data = await res.json();
60
+ return data?.response || '';
61
+ }
62
+ catch (e) {
63
+ throw new Error(`Ollama review failed: ${e.message} (Original error: ${errorMsg})`);
64
+ }
65
+ }
66
+ }
67
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../src/llm/providers/ollama.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { BaseLLMProvider, ReviewInput } from '../base.js';
2
+ export declare class OpenAIProvider extends BaseLLMProvider {
3
+ review(input: ReviewInput): Promise<string>;
4
+ }
@@ -0,0 +1,27 @@
1
+ import OpenAI from 'openai';
2
+ import { BaseLLMProvider } from '../base.js';
3
+ export class OpenAIProvider extends BaseLLMProvider {
4
+ async review(input) {
5
+ const opts = this.config.providerOptions?.openai;
6
+ const apiKeyEnv = opts?.apiKeyEnv || 'OPENAI_API_KEY';
7
+ const apiKey = process.env[apiKeyEnv] || opts?.apiKey;
8
+ if (!apiKey) {
9
+ throw new Error(`Missing OpenAI API key. Please set ${apiKeyEnv} in environment variables or configure 'apiKey' in .codegate.js`);
10
+ }
11
+ const client = new OpenAI({
12
+ baseURL: opts?.baseURL, // Optional, defaults to https://api.openai.com/v1
13
+ apiKey
14
+ });
15
+ const model = opts?.model || 'gpt-4o';
16
+ const res = await client.chat.completions.create({
17
+ model,
18
+ messages: [
19
+ { role: 'system', content: input.prompt },
20
+ { role: 'user', content: this.buildUserPrompt(input.diff) }
21
+ ],
22
+ ...opts?.request
23
+ });
24
+ return res.choices?.[0]?.message?.content || '';
25
+ }
26
+ }
27
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/llm/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,eAAe,EAAe,MAAM,YAAY,CAAA;AAEzD,MAAM,OAAO,cAAe,SAAQ,eAAe;IACjD,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAA;QAChD,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,gBAAgB,CAAA;QACrD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,MAAM,CAAA;QAErD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,sCAAsC,SAAS,iEAAiE,CAAC,CAAA;QACnI,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,kDAAkD;YAC1E,MAAM;SACP,CAAC,CAAA;QACF,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,QAAQ,CAAA;QAErC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YAC/C,KAAK;YACL,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE;gBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;aAC5D;YACD,GAAG,IAAI,EAAE,OAAO;SACjB,CAAC,CAAA;QAEF,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAA;IACjD,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import { BaseLLMProvider, ReviewInput } from '../base.js';
2
+ export declare class VolcengineProvider extends BaseLLMProvider {
3
+ review(input: ReviewInput): Promise<string>;
4
+ }
@@ -0,0 +1,29 @@
1
+ import OpenAI from 'openai';
2
+ import { BaseLLMProvider } from '../base.js';
3
+ export class VolcengineProvider extends BaseLLMProvider {
4
+ async review(input) {
5
+ const opts = this.config.providerOptions?.volcengine;
6
+ const baseURL = (opts?.baseURL || 'https://ark.cn-beijing.volces.com/api/v3').replace(/`/g, '').trim();
7
+ const apiKeyEnv = opts?.apiKeyEnv || 'VOLCENGINE_API_KEY';
8
+ const apiKey = process.env[apiKeyEnv] || opts?.apiKey;
9
+ if (!apiKey) {
10
+ throw new Error(`Missing Volcengine API key. Please set ${apiKeyEnv} in environment variables or configure 'apiKey' in .codegate.js`);
11
+ }
12
+ const client = new OpenAI({ baseURL, apiKey });
13
+ // Note: Volcengine usually uses an endpoint ID (e.g. ep-2024...) as the model name
14
+ const model = opts?.model;
15
+ if (!model) {
16
+ throw new Error('Missing Volcengine model (Endpoint ID). Please configure providerOptions.volcengine.model in .codegate.js');
17
+ }
18
+ const res = await client.chat.completions.create({
19
+ model,
20
+ messages: [
21
+ { role: 'system', content: input.prompt },
22
+ { role: 'user', content: this.buildUserPrompt(input.diff) }
23
+ ],
24
+ ...opts?.request
25
+ });
26
+ return res.choices?.[0]?.message?.content || '';
27
+ }
28
+ }
29
+ //# sourceMappingURL=volcengine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"volcengine.js","sourceRoot":"","sources":["../../../src/llm/providers/volcengine.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,eAAe,EAAe,MAAM,YAAY,CAAA;AAEzD,MAAM,OAAO,kBAAmB,SAAQ,eAAe;IACrD,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAA;QACpD,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,0CAA0C,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QACtG,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,oBAAoB,CAAA;QACzD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,MAAM,CAAA;QAErD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,0CAA0C,SAAS,iEAAiE,CAAC,CAAA;QACvI,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;QAC9C,mFAAmF;QACnF,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,CAAA;QAEzB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,2GAA2G,CAAC,CAAA;QAC9H,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YAC/C,KAAK;YACL,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE;gBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;aAC5D;YACD,GAAG,IAAI,EAAE,OAAO;SACjB,CAAC,CAAA;QAEF,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAA;IACjD,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import { BaseLLMProvider, ReviewInput } from '../base.js';
2
+ export declare class ZhipuProvider extends BaseLLMProvider {
3
+ review(input: ReviewInput): Promise<string>;
4
+ }
@@ -0,0 +1,25 @@
1
+ import OpenAI from 'openai';
2
+ import { BaseLLMProvider } from '../base.js';
3
+ export class ZhipuProvider extends BaseLLMProvider {
4
+ async review(input) {
5
+ const opts = this.config.providerOptions?.zhipu;
6
+ const baseURL = (opts?.baseURL || 'https://open.bigmodel.cn/api/paas/v4').replace(/`/g, '').trim();
7
+ const apiKeyEnv = opts?.apiKeyEnv || 'ZHIPU_API_KEY';
8
+ const apiKey = process.env[apiKeyEnv] || opts?.apiKey;
9
+ if (!apiKey) {
10
+ throw new Error(`Missing Zhipu AI API key. Please set ${apiKeyEnv} in environment variables or configure 'apiKey' in .codegate.js`);
11
+ }
12
+ const client = new OpenAI({ baseURL, apiKey });
13
+ const model = opts?.model || 'glm-4';
14
+ const res = await client.chat.completions.create({
15
+ model,
16
+ messages: [
17
+ { role: 'system', content: input.prompt },
18
+ { role: 'user', content: this.buildUserPrompt(input.diff) }
19
+ ],
20
+ ...opts?.request
21
+ });
22
+ return res.choices?.[0]?.message?.content || '';
23
+ }
24
+ }
25
+ //# sourceMappingURL=zhipu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zhipu.js","sourceRoot":"","sources":["../../../src/llm/providers/zhipu.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,eAAe,EAAe,MAAM,YAAY,CAAA;AAEzD,MAAM,OAAO,aAAc,SAAQ,eAAe;IAChD,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,CAAA;QAC/C,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,sCAAsC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QAClG,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,eAAe,CAAA;QACpD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,MAAM,CAAA;QAErD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,wCAAwC,SAAS,iEAAiE,CAAC,CAAA;QACrI,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;QAC9C,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,OAAO,CAAA;QAEpC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YAC/C,KAAK;YACL,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE;gBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;aAC5D;YACD,GAAG,IAAI,EAAE,OAAO;SACjB,CAAC,CAAA;QAEF,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAA;IACjD,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ import { Translation } from './types.js';
2
+ export declare const de: Translation;
@@ -0,0 +1,33 @@
1
+ export const de = {
2
+ cli: {
3
+ welcome: ' Code Gate AI Review ',
4
+ nonInteractive: 'code-gate: Nicht-interaktive Umgebung, Review übersprungen',
5
+ confirmReview: 'Möchten Sie diesen Commit überprüfen lassen?',
6
+ opCancelled: 'Vorgang abgebrochen',
7
+ reviewSkipped: 'AI-Review übersprungen',
8
+ initReview: 'AI-Review wird initialisiert...',
9
+ preparingReview: 'Bereite Review für {total} Dateien vor...',
10
+ analyzing: 'Analysiere [{idx}/{total}] {file}',
11
+ taskSubmitted: 'AI-Review-Aufgabe gesendet',
12
+ previewUrl: 'Vorschau-URL',
13
+ confirmCommit: 'Review abgeschlossen. Mit Commit fortfahren?',
14
+ commitCancelled: 'Commit abgebrochen',
15
+ commitConfirmed: 'Commit bestätigt, fahre fort...',
16
+ diffTruncated: '\n...(Diff aufgrund der Länge gekürzt, Gesamtzeilen: {lines})',
17
+ ollamaCheckFailed: 'Warnung: Ollama-Dienst nicht verfügbar oder nicht erreichbar. AI-Review könnte fehlschlagen.',
18
+ },
19
+ ui: {
20
+ title: 'Code Review',
21
+ panelAI: 'AI Review',
22
+ panelDiff: 'Diff',
23
+ statusPending: 'AI: Ausstehend',
24
+ statusFailed: 'AI: Fehlgeschlagen',
25
+ statusDone: 'AI: Fertig',
26
+ statusProcessing: 'AI: Verarbeite verbleibende Dateien...',
27
+ emptyReview: 'Kein Review-Inhalt verfügbar',
28
+ },
29
+ prompt: {
30
+ userTemplate: 'Bitte überprüfen Sie den Code basierend auf dem folgenden git diff und geben Sie eine Liste von Problemen und Verbesserungsvorschlägen an:\n\n{diff}'
31
+ }
32
+ };
33
+ //# sourceMappingURL=de.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"de.js","sourceRoot":"","sources":["../../src/locales/de.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,EAAE,GAAgB;IAC7B,GAAG,EAAE;QACH,OAAO,EAAE,uBAAuB;QAChC,cAAc,EAAE,4DAA4D;QAC5E,aAAa,EAAE,8CAA8C;QAC7D,WAAW,EAAE,qBAAqB;QAClC,aAAa,EAAE,wBAAwB;QACvC,UAAU,EAAE,iCAAiC;QAC7C,eAAe,EAAE,2CAA2C;QAC5D,SAAS,EAAE,mCAAmC;QAC9C,aAAa,EAAE,4BAA4B;QAC3C,UAAU,EAAE,cAAc;QAC1B,aAAa,EAAE,8CAA8C;QAC7D,eAAe,EAAE,oBAAoB;QACrC,eAAe,EAAE,iCAAiC;QAClD,aAAa,EAAE,+DAA+D;QAC9E,iBAAiB,EAAE,8FAA8F;KAClH;IACD,EAAE,EAAE;QACF,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE,MAAM;QACjB,aAAa,EAAE,gBAAgB;QAC/B,YAAY,EAAE,oBAAoB;QAClC,UAAU,EAAE,YAAY;QACxB,gBAAgB,EAAE,wCAAwC;QAC1D,WAAW,EAAE,8BAA8B;KAC5C;IACD,MAAM,EAAE;QACN,YAAY,EAAE,sJAAsJ;KACrK;CACF,CAAA"}
@@ -0,0 +1,2 @@
1
+ import { Translation } from './types.js';
2
+ export declare const en: Translation;
@@ -0,0 +1,33 @@
1
+ export const en = {
2
+ cli: {
3
+ welcome: ' Code Gate AI Review ',
4
+ nonInteractive: 'code-gate: non-interactive environment, skipping review',
5
+ confirmReview: 'Do you want to review this commit?',
6
+ opCancelled: 'Operation cancelled',
7
+ reviewSkipped: 'AI Review skipped',
8
+ initReview: 'Initializing AI Review...',
9
+ preparingReview: 'Preparing to review {total} files...',
10
+ analyzing: 'Analyzing [{idx}/{total}] {file}',
11
+ taskSubmitted: 'AI Review task submitted',
12
+ previewUrl: 'Preview URL',
13
+ confirmCommit: 'Review completed. Continue to commit?',
14
+ commitCancelled: 'Commit cancelled',
15
+ commitConfirmed: 'Commit confirmed, proceeding...',
16
+ diffTruncated: '\n...(Diff truncated due to length, total lines: {lines})',
17
+ ollamaCheckFailed: 'Warning: Ollama service seems unavailable. AI Review might fail.',
18
+ },
19
+ ui: {
20
+ title: 'Code Review',
21
+ panelAI: 'AI Review',
22
+ panelDiff: 'Diff',
23
+ statusPending: 'AI: Pending',
24
+ statusFailed: 'AI: Failed',
25
+ statusDone: 'AI: Done',
26
+ statusProcessing: 'AI: Processing remaining files...',
27
+ emptyReview: 'No review content available',
28
+ },
29
+ prompt: {
30
+ userTemplate: 'Please review the code based on the following git diff, and provide a list of issues and suggestions for improvement:\n\n{diff}'
31
+ }
32
+ };
33
+ //# sourceMappingURL=en.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.js","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,EAAE,GAAgB;IAC7B,GAAG,EAAE;QACH,OAAO,EAAE,uBAAuB;QAChC,cAAc,EAAE,yDAAyD;QACzE,aAAa,EAAE,oCAAoC;QACnD,WAAW,EAAE,qBAAqB;QAClC,aAAa,EAAE,mBAAmB;QAClC,UAAU,EAAE,2BAA2B;QACvC,eAAe,EAAE,sCAAsC;QACvD,SAAS,EAAE,kCAAkC;QAC7C,aAAa,EAAE,0BAA0B;QACzC,UAAU,EAAE,aAAa;QACzB,aAAa,EAAE,uCAAuC;QACtD,eAAe,EAAE,kBAAkB;QACnC,eAAe,EAAE,iCAAiC;QAClD,aAAa,EAAE,2DAA2D;QAC1E,iBAAiB,EAAE,kEAAkE;KACtF;IACD,EAAE,EAAE;QACF,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE,MAAM;QACjB,aAAa,EAAE,aAAa;QAC5B,YAAY,EAAE,YAAY;QAC1B,UAAU,EAAE,UAAU;QACtB,gBAAgB,EAAE,mCAAmC;QACrD,WAAW,EAAE,6BAA6B;KAC3C;IACD,MAAM,EAAE;QACN,YAAY,EAAE,iIAAiI;KAChJ;CACF,CAAA"}
@@ -0,0 +1,2 @@
1
+ import { Translation } from './types.js';
2
+ export declare const fr: Translation;