code-gate 0.1.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +222 -114
- package/README_ZH.md +224 -0
- package/bin/code-gate.js +12 -19
- package/dist/__tests__/config.test.js +1 -1
- package/dist/__tests__/config.test.js.map +1 -1
- package/dist/__tests__/render.test.js +24 -7
- package/dist/__tests__/render.test.js.map +1 -1
- package/dist/cli/commands/hook.d.ts +1 -0
- package/dist/cli/commands/hook.js +164 -0
- package/dist/cli/commands/hook.js.map +1 -0
- package/dist/cli/commands/init.d.ts +1 -0
- package/dist/cli/commands/init.js +157 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +1 -0
- package/dist/cli/commands/setup.js +19 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +26 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/hook.js +7 -0
- package/dist/commands/hook.js.map +1 -1
- package/dist/commands/init.js +20 -20
- package/dist/config/defaults.d.ts +2 -0
- package/dist/config/defaults.js +33 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.js +77 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +55 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config.d.ts +111 -21
- package/dist/config.js +83 -21
- package/dist/config.js.map +1 -1
- package/dist/core/git.d.ts +7 -0
- package/dist/core/git.js +67 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/review-flow.js +105 -59
- package/dist/core/review-flow.js.map +1 -1
- package/dist/core/review.d.ts +6 -0
- package/dist/core/review.js +167 -0
- package/dist/core/review.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/llm/base.d.ts +14 -0
- package/dist/llm/base.js +10 -0
- package/dist/llm/base.js.map +1 -0
- package/dist/llm/deepseek.js +3 -3
- package/dist/llm/deepseek.js.map +1 -1
- package/dist/llm/index.d.ts +4 -0
- package/dist/llm/index.js +41 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/ollama.js +2 -2
- package/dist/llm/ollama.js.map +1 -1
- package/dist/llm/providers/aliyun.d.ts +4 -0
- package/dist/llm/providers/aliyun.js +25 -0
- package/dist/llm/providers/aliyun.js.map +1 -0
- package/dist/llm/providers/anthropic.d.ts +4 -0
- package/dist/llm/providers/anthropic.js +52 -0
- package/dist/llm/providers/anthropic.js.map +1 -0
- package/dist/llm/providers/azure.d.ts +4 -0
- package/dist/llm/providers/azure.js +38 -0
- package/dist/llm/providers/azure.js.map +1 -0
- package/dist/llm/providers/cohere.d.ts +4 -0
- package/dist/llm/providers/cohere.js +39 -0
- package/dist/llm/providers/cohere.js.map +1 -0
- package/dist/llm/providers/deepseek.d.ts +4 -0
- package/dist/llm/providers/deepseek.js +25 -0
- package/dist/llm/providers/deepseek.js.map +1 -0
- package/dist/llm/providers/gemini.d.ts +4 -0
- package/dist/llm/providers/gemini.js +40 -0
- package/dist/llm/providers/gemini.js.map +1 -0
- package/dist/llm/providers/mistral.d.ts +4 -0
- package/dist/llm/providers/mistral.js +42 -0
- package/dist/llm/providers/mistral.js.map +1 -0
- package/dist/llm/providers/ollama.d.ts +5 -0
- package/dist/llm/providers/ollama.js +67 -0
- package/dist/llm/providers/ollama.js.map +1 -0
- package/dist/llm/providers/openai.d.ts +4 -0
- package/dist/llm/providers/openai.js +27 -0
- package/dist/llm/providers/openai.js.map +1 -0
- package/dist/llm/providers/volcengine.d.ts +4 -0
- package/dist/llm/providers/volcengine.js +29 -0
- package/dist/llm/providers/volcengine.js.map +1 -0
- package/dist/llm/providers/zhipu.d.ts +4 -0
- package/dist/llm/providers/zhipu.js +25 -0
- package/dist/llm/providers/zhipu.js.map +1 -0
- package/dist/locales/de.d.ts +2 -0
- package/dist/locales/de.js +33 -0
- package/dist/locales/de.js.map +1 -0
- package/dist/locales/en.d.ts +2 -0
- package/dist/locales/en.js +33 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/locales/fr.d.ts +2 -0
- package/dist/locales/fr.js +33 -0
- package/dist/locales/fr.js.map +1 -0
- package/dist/locales/index.d.ts +3 -0
- package/dist/locales/index.js +41 -0
- package/dist/locales/index.js.map +1 -0
- package/dist/locales/ja.d.ts +2 -0
- package/dist/locales/ja.js +33 -0
- package/dist/locales/ja.js.map +1 -0
- package/dist/locales/ko.d.ts +2 -0
- package/dist/locales/ko.js +33 -0
- package/dist/locales/ko.js.map +1 -0
- package/dist/locales/types.d.ts +32 -0
- package/dist/locales/types.js +2 -0
- package/dist/locales/types.js.map +1 -0
- package/dist/locales/zh-CN.d.ts +2 -0
- package/dist/locales/zh-CN.js +33 -0
- package/dist/locales/zh-CN.js.map +1 -0
- package/dist/locales/zh-TW.d.ts +2 -0
- package/dist/locales/zh-TW.js +33 -0
- package/dist/locales/zh-TW.js.map +1 -0
- package/dist/ui/render/assets.d.ts +8 -0
- package/dist/ui/render/assets.js +89 -0
- package/dist/ui/render/assets.js.map +1 -0
- package/dist/ui/render/html.d.ts +35 -0
- package/dist/ui/render/html.js +295 -0
- package/dist/ui/render/html.js.map +1 -0
- package/dist/ui/render.d.ts +11 -0
- package/dist/ui/render.js +198 -13
- package/dist/ui/render.js.map +1 -1
- package/dist/ui/server.d.ts +4 -2
- package/dist/ui/server.js +30 -8
- package/dist/ui/server.js.map +1 -1
- package/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.js +10 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +27 -8
- package/scripts/hook.sh +12 -0
package/dist/core/review-flow.js
CHANGED
|
@@ -2,13 +2,16 @@ import { loadConfig } from '../config.js';
|
|
|
2
2
|
import { getStagedFiles, getStagedDiff, filterFiles, getStagedDiffForFile } from '../git.js';
|
|
3
3
|
import { deepseekReview } from '../llm/deepseek.js';
|
|
4
4
|
import { ollamaReview } from '../llm/ollama.js';
|
|
5
|
-
import {
|
|
6
|
-
import { serveReview } from '../ui/server.js';
|
|
5
|
+
import { renderHTMLLive, renderHTMLTabs } from '../ui/render.js';
|
|
6
|
+
import { serveReview, saveOutput, triggerOpen } from '../ui/server.js';
|
|
7
7
|
import { info, warn } from '../log.js';
|
|
8
8
|
export async function runReviewFlow() {
|
|
9
9
|
const cfg = await loadConfig();
|
|
10
|
-
const providerUsed =
|
|
11
|
-
const
|
|
10
|
+
const providerUsed = cfg.provider;
|
|
11
|
+
const mode = (cfg.reviewMode || 'files');
|
|
12
|
+
const modelUsed = providerUsed === 'deepseek'
|
|
13
|
+
? cfg.providerOptions?.deepseek?.model
|
|
14
|
+
: cfg.providerOptions?.ollama?.model;
|
|
12
15
|
const files = filterFiles(getStagedFiles(), cfg.fileTypes);
|
|
13
16
|
if (files.length === 0) {
|
|
14
17
|
info('code-gate: 没有可审查的文件');
|
|
@@ -24,86 +27,129 @@ export async function runReviewFlow() {
|
|
|
24
27
|
let aiInvoked = false;
|
|
25
28
|
let aiSucceeded = false;
|
|
26
29
|
let status = '';
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
async function runSummary() {
|
|
31
|
+
try {
|
|
32
|
+
if (providerUsed === 'deepseek') {
|
|
33
|
+
const apiKeyEnv = cfg.providerOptions?.deepseek?.apiKeyEnv || 'DEEPSEEK_API_KEY';
|
|
34
|
+
if (!process.env[apiKeyEnv]) {
|
|
35
|
+
status = `缺少 DeepSeek 密钥 ${apiKeyEnv}`;
|
|
36
|
+
aiInvoked = false;
|
|
37
|
+
aiSucceeded = false;
|
|
38
|
+
return (`未生成 AI 审查结果。\n原因:缺少 DeepSeek 密钥 ${apiKeyEnv}。\n` +
|
|
34
39
|
`解决方案:在当前环境设置 ${apiKeyEnv},或切换 provider 为 ollama。\n` +
|
|
35
|
-
`示例:export ${apiKeyEnv}="你的密钥"
|
|
36
|
-
|
|
37
|
-
|
|
40
|
+
`示例:export ${apiKeyEnv}="你的密钥"`);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
aiInvoked = true;
|
|
44
|
+
const s = await deepseekReview(cfg, { prompt, diff });
|
|
45
|
+
aiSucceeded = !!s;
|
|
46
|
+
return s || '';
|
|
47
|
+
}
|
|
38
48
|
}
|
|
39
49
|
else {
|
|
40
50
|
aiInvoked = true;
|
|
41
|
-
|
|
42
|
-
aiSucceeded = !!
|
|
51
|
+
const s = await ollamaReview(cfg, { prompt, diff });
|
|
52
|
+
aiSucceeded = !!s;
|
|
53
|
+
return s || '';
|
|
43
54
|
}
|
|
44
55
|
}
|
|
45
|
-
|
|
56
|
+
catch (e) {
|
|
57
|
+
warn(`code-gate: LLM 调用失败:${e?.message || e}`);
|
|
58
|
+
status = `LLM 调用失败:${e?.message || e}`;
|
|
46
59
|
aiInvoked = true;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
catch (e) {
|
|
52
|
-
warn(`code-gate: LLM 调用失败:${e?.message || e}`);
|
|
53
|
-
status = `LLM 调用失败:${e?.message || e}`;
|
|
54
|
-
content =
|
|
55
|
-
`未生成 AI 审查结果。\n可能原因:网络不可达、服务未启动或配置错误。\n` +
|
|
60
|
+
aiSucceeded = false;
|
|
61
|
+
return (`未生成 AI 审查结果。\n可能原因:网络不可达、服务未启动或配置错误。\n` +
|
|
56
62
|
`当前 provider:${cfg.provider}\n` +
|
|
57
63
|
(cfg.provider === 'ollama'
|
|
58
64
|
? `请检查本地 Ollama 是否运行(默认 http://localhost:11434),模型是否可用。\n示例:ollama list`
|
|
59
|
-
: `请检查 ${cfg.deepseek?.apiKeyEnv || 'DEEPSEEK_API_KEY'} 是否已设置、baseURL 是否为 https://api.deepseek.com`);
|
|
60
|
-
aiInvoked = true;
|
|
61
|
-
aiSucceeded = false;
|
|
62
|
-
}
|
|
63
|
-
if (cfg.review?.mode === 'per_file') {
|
|
64
|
-
const items = [];
|
|
65
|
-
for (const f of files.slice(0, cfg.limits?.maxFiles || files.length)) {
|
|
66
|
-
const fdiff = getStagedDiffForFile(f);
|
|
67
|
-
let frev = '';
|
|
68
|
-
try {
|
|
69
|
-
if (providerUsed === 'deepseek') {
|
|
70
|
-
const apiKeyEnv = cfg.deepseek?.apiKeyEnv || 'DEEPSEEK_API_KEY';
|
|
71
|
-
if (process.env[apiKeyEnv]) {
|
|
72
|
-
aiInvoked = true;
|
|
73
|
-
frev = await deepseekReview(cfg, { prompt, diff: fdiff });
|
|
74
|
-
aiSucceeded = aiSucceeded || !!frev;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
aiInvoked = true;
|
|
79
|
-
frev = await ollamaReview(cfg, { prompt, diff: fdiff });
|
|
80
|
-
aiSucceeded = aiSucceeded || !!frev;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
catch (e) {
|
|
84
|
-
warn(`code-gate: 文件 ${f} 审查失败:${e?.message || e}`);
|
|
85
|
-
}
|
|
86
|
-
items.push({ file: f, review: frev, diff: fdiff || 'diff --git a/' + f + ' b/' + f });
|
|
65
|
+
: `请检查 ${cfg.providerOptions?.deepseek?.apiKeyEnv || 'DEEPSEEK_API_KEY'} 是否已设置、baseURL 是否为 https://api.deepseek.com`));
|
|
87
66
|
}
|
|
88
|
-
|
|
67
|
+
}
|
|
68
|
+
const maxFiles = cfg.limits?.maxFiles || files.length;
|
|
69
|
+
const list = files.slice(0, maxFiles);
|
|
70
|
+
const rawConcurrency = providerUsed === 'deepseek'
|
|
71
|
+
? cfg.providerOptions?.deepseek?.concurrencyFiles ?? 4
|
|
72
|
+
: cfg.providerOptions?.ollama?.concurrencyFiles ?? 1;
|
|
73
|
+
const concurrency = Math.max(1, Math.min(8, rawConcurrency || 1));
|
|
74
|
+
const items = [];
|
|
75
|
+
const id = Date.now().toString(36);
|
|
76
|
+
if (mode === 'summary') {
|
|
77
|
+
const s = await runSummary();
|
|
78
|
+
items.push({ file: 'Summary', review: s, diff, done: true });
|
|
79
|
+
const html = renderHTMLLive(id, { aiInvoked, aiSucceeded, provider: providerUsed, model: modelUsed, status }, [{ file: 'Summary', review: s, diff }]);
|
|
80
|
+
await serveReview(cfg, html, id, () => ({ files: items, done: true }));
|
|
81
|
+
const finalHtml = renderHTMLTabs(items, {
|
|
89
82
|
aiInvoked,
|
|
90
83
|
aiSucceeded,
|
|
91
84
|
provider: providerUsed,
|
|
92
85
|
model: modelUsed,
|
|
93
86
|
status
|
|
94
87
|
});
|
|
95
|
-
|
|
88
|
+
saveOutput(cfg, id, finalHtml);
|
|
89
|
+
return false;
|
|
96
90
|
}
|
|
97
|
-
|
|
98
|
-
|
|
91
|
+
const html = renderHTMLLive(id, { aiInvoked, aiSucceeded, provider: providerUsed, model: modelUsed, status }, []);
|
|
92
|
+
const previewUrl = await serveReview(cfg, html, id, () => {
|
|
93
|
+
const completed = items.filter((it) => it.done);
|
|
94
|
+
const expected = list.length + (mode === 'both' ? 1 : 0);
|
|
95
|
+
const allDone = completed.length >= expected;
|
|
96
|
+
return { files: completed, done: allDone };
|
|
97
|
+
}, false);
|
|
98
|
+
async function runTask(f) {
|
|
99
|
+
const fdiff = getStagedDiffForFile(f);
|
|
100
|
+
let frev = '';
|
|
101
|
+
try {
|
|
102
|
+
if (providerUsed === 'deepseek') {
|
|
103
|
+
const apiKeyEnv = cfg.providerOptions?.deepseek?.apiKeyEnv || 'DEEPSEEK_API_KEY';
|
|
104
|
+
if (process.env[apiKeyEnv]) {
|
|
105
|
+
aiInvoked = true;
|
|
106
|
+
frev = await deepseekReview(cfg, { prompt, diff: fdiff });
|
|
107
|
+
aiSucceeded = aiSucceeded || !!frev;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
aiInvoked = true;
|
|
112
|
+
frev = await ollamaReview(cfg, { prompt, diff: fdiff });
|
|
113
|
+
aiSucceeded = aiSucceeded || !!frev;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
warn(`code-gate: 文件 ${f} 审查失败:${e?.message || e}`);
|
|
118
|
+
}
|
|
119
|
+
items.push({ file: f, review: frev, diff: fdiff || 'diff --git a/' + f + ' b/' + f, done: true });
|
|
120
|
+
if (mode === 'files' && items.length === 1 && previewUrl) {
|
|
121
|
+
triggerOpen(previewUrl);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const queue = [...list];
|
|
125
|
+
const workers = [];
|
|
126
|
+
for (let i = 0; i < Math.max(1, concurrency); i++) {
|
|
127
|
+
const worker = (async () => {
|
|
128
|
+
while (queue.length) {
|
|
129
|
+
const f = queue.shift();
|
|
130
|
+
if (!f)
|
|
131
|
+
break;
|
|
132
|
+
await runTask(f);
|
|
133
|
+
}
|
|
134
|
+
})();
|
|
135
|
+
workers.push(worker);
|
|
136
|
+
}
|
|
137
|
+
await Promise.all(workers);
|
|
138
|
+
if (mode === 'both') {
|
|
139
|
+
const s = await runSummary();
|
|
140
|
+
items.push({ file: 'Summary', review: s, diff, done: true });
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
const finalHtml = renderHTMLTabs(items, {
|
|
99
144
|
aiInvoked,
|
|
100
145
|
aiSucceeded,
|
|
101
146
|
provider: providerUsed,
|
|
102
147
|
model: modelUsed,
|
|
103
148
|
status
|
|
104
149
|
});
|
|
105
|
-
|
|
150
|
+
saveOutput(cfg, id, finalHtml);
|
|
106
151
|
}
|
|
152
|
+
catch { }
|
|
107
153
|
return false;
|
|
108
154
|
}
|
|
109
155
|
//# sourceMappingURL=review-flow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-flow.js","sourceRoot":"","sources":["../../src/core/review-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"review-flow.js","sourceRoot":"","sources":["../../src/core/review-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export interface ReviewFlowOptions {
|
|
2
|
+
onProgress?: (file: string, index: number, total: number) => void;
|
|
3
|
+
onServerReady?: (url: string) => void;
|
|
4
|
+
onStart?: (total: number) => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function runReviewFlow(opts?: ReviewFlowOptions): Promise<boolean>;
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { loadConfig } from '../config/index.js';
|
|
2
|
+
import { setLanguage, t } from '../locales/index.js';
|
|
3
|
+
import { getStagedFiles, getStagedDiff, filterFiles, getStagedDiffForFile, getBranchName, getDiffStats, getCommitMessage } from './git.js';
|
|
4
|
+
import { createLLMProvider } from '../llm/index.js';
|
|
5
|
+
import { renderHTMLLive, renderHTMLTabs } from '../ui/render/html.js';
|
|
6
|
+
import { serveReview, saveOutput, triggerOpen } from '../ui/server.js';
|
|
7
|
+
import { warn } from '../utils/logger.js';
|
|
8
|
+
export async function runReviewFlow(opts = {}) {
|
|
9
|
+
const cfg = await loadConfig();
|
|
10
|
+
if (cfg.language) {
|
|
11
|
+
setLanguage(cfg.language);
|
|
12
|
+
}
|
|
13
|
+
const provider = createLLMProvider(cfg);
|
|
14
|
+
const providerName = cfg.provider;
|
|
15
|
+
const mode = (cfg.reviewMode || 'files');
|
|
16
|
+
const modelUsed = cfg.providerOptions?.[providerName]?.model || 'unknown';
|
|
17
|
+
const files = filterFiles(getStagedFiles(), cfg.fileTypes, cfg.exclude);
|
|
18
|
+
if (files.length === 0) {
|
|
19
|
+
// info('code-gate: 没有可审查的文件')
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
let diff = getStagedDiff();
|
|
23
|
+
if (!diff) {
|
|
24
|
+
// warn('code-gate: 未获取到 diff')
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
const prompt = cfg.prompt || '';
|
|
28
|
+
let aiInvoked = false;
|
|
29
|
+
let aiSucceeded = false;
|
|
30
|
+
let status = '';
|
|
31
|
+
// 1. Pre-check for Ollama connectivity if selected
|
|
32
|
+
if (providerName === 'ollama') {
|
|
33
|
+
try {
|
|
34
|
+
const baseURL = cfg.providerOptions?.ollama?.baseURL || 'http://localhost:11434';
|
|
35
|
+
const checkRes = await fetch(baseURL).catch(() => null);
|
|
36
|
+
if (!checkRes) {
|
|
37
|
+
warn(t('cli.ollamaCheckFailed'));
|
|
38
|
+
// Don't block, but user should know AI might fail
|
|
39
|
+
status = t('cli.ollamaCheckFailed');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch { }
|
|
43
|
+
}
|
|
44
|
+
if (opts.onStart)
|
|
45
|
+
opts.onStart(files.length);
|
|
46
|
+
async function runSummary() {
|
|
47
|
+
try {
|
|
48
|
+
aiInvoked = true;
|
|
49
|
+
const s = await provider.review({ prompt, diff });
|
|
50
|
+
aiSucceeded = true;
|
|
51
|
+
return s || '';
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
warn(`code-gate: LLM 调用失败:${e?.message || e}`);
|
|
55
|
+
status = `LLM 调用失败:${e?.message || e}`;
|
|
56
|
+
aiSucceeded = false;
|
|
57
|
+
return `未生成 AI 审查结果。\n错误信息:${e?.message || e}`;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const maxFiles = cfg.limits?.maxFiles || files.length;
|
|
61
|
+
const list = files.slice(0, maxFiles);
|
|
62
|
+
const concurrency = Math.max(1, Math.min(8, cfg.providerOptions?.[providerName]?.concurrencyFiles || 1));
|
|
63
|
+
const items = [];
|
|
64
|
+
// Generate ID with timestamp format: YYYYMMDD-HHmmss (Local Time)
|
|
65
|
+
const now = new Date();
|
|
66
|
+
const year = now.getFullYear();
|
|
67
|
+
const month = String(now.getMonth() + 1).padStart(2, '0');
|
|
68
|
+
const day = String(now.getDate()).padStart(2, '0');
|
|
69
|
+
const hours = String(now.getHours()).padStart(2, '0');
|
|
70
|
+
const minutes = String(now.getMinutes()).padStart(2, '0');
|
|
71
|
+
const seconds = String(now.getSeconds()).padStart(2, '0');
|
|
72
|
+
const id = `${year}${month}${day}-${hours}${minutes}${seconds}`;
|
|
73
|
+
const formattedTime = now.toLocaleString();
|
|
74
|
+
const branchName = getBranchName();
|
|
75
|
+
const commitMsg = getCommitMessage();
|
|
76
|
+
const diffStats = getDiffStats();
|
|
77
|
+
// Prefer commit message, fallback to diff stats
|
|
78
|
+
const info = commitMsg || diffStats;
|
|
79
|
+
const subtitle = `Branch: ${branchName}${info ? ` | ${info}` : ''}`;
|
|
80
|
+
if (mode === 'summary') {
|
|
81
|
+
const s = await runSummary();
|
|
82
|
+
items.push({ file: 'Summary', review: s, diff, done: true });
|
|
83
|
+
const html = renderHTMLLive(id, { aiInvoked, aiSucceeded, provider: providerName, model: modelUsed, status, datetime: formattedTime, subtitle }, [{ file: 'Summary', review: s, diff }]);
|
|
84
|
+
const url = await serveReview(cfg, html, id, () => ({ files: items, done: true }));
|
|
85
|
+
if (opts.onServerReady)
|
|
86
|
+
opts.onServerReady(url);
|
|
87
|
+
const finalHtml = renderHTMLTabs(items, {
|
|
88
|
+
aiInvoked,
|
|
89
|
+
aiSucceeded,
|
|
90
|
+
provider: providerName,
|
|
91
|
+
model: modelUsed,
|
|
92
|
+
status,
|
|
93
|
+
datetime: formattedTime,
|
|
94
|
+
subtitle
|
|
95
|
+
});
|
|
96
|
+
saveOutput(cfg, id, finalHtml);
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
const html = renderHTMLLive(id, { aiInvoked, aiSucceeded, provider: providerName, model: modelUsed, status, datetime: formattedTime, subtitle }, []);
|
|
100
|
+
const previewUrl = await serveReview(cfg, html, id, () => {
|
|
101
|
+
const completed = items.filter((it) => it.done);
|
|
102
|
+
const expected = list.length + (mode === 'both' ? 1 : 0);
|
|
103
|
+
const allDone = completed.length >= expected;
|
|
104
|
+
return { files: completed, done: allDone };
|
|
105
|
+
}, false);
|
|
106
|
+
if (opts.onServerReady && previewUrl)
|
|
107
|
+
opts.onServerReady(previewUrl);
|
|
108
|
+
let completedCount = 0;
|
|
109
|
+
async function runTask(f) {
|
|
110
|
+
let fdiff = getStagedDiffForFile(f);
|
|
111
|
+
// Check for max diff lines
|
|
112
|
+
const maxDiffLines = cfg.limits?.maxDiffLines || 10000;
|
|
113
|
+
const lines = fdiff.split('\n');
|
|
114
|
+
if (lines.length > maxDiffLines) {
|
|
115
|
+
fdiff = lines.slice(0, maxDiffLines).join('\n') + t('cli.diffTruncated', { lines: lines.length });
|
|
116
|
+
}
|
|
117
|
+
let frev = '';
|
|
118
|
+
try {
|
|
119
|
+
aiInvoked = true;
|
|
120
|
+
frev = await provider.review({ prompt, diff: fdiff });
|
|
121
|
+
aiSucceeded = aiSucceeded || !!frev;
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
// warn(`code-gate: 文件 ${f} 审查失败:${e?.message || e}`)
|
|
125
|
+
}
|
|
126
|
+
items.push({ file: f, review: frev, diff: fdiff || 'diff --git a/' + f + ' b/' + f, done: true });
|
|
127
|
+
if (mode === 'files' && items.length === 1 && previewUrl) {
|
|
128
|
+
triggerOpen(previewUrl);
|
|
129
|
+
}
|
|
130
|
+
completedCount++;
|
|
131
|
+
if (opts.onProgress)
|
|
132
|
+
opts.onProgress(f, completedCount, list.length);
|
|
133
|
+
}
|
|
134
|
+
const queue = [...list];
|
|
135
|
+
const workers = [];
|
|
136
|
+
for (let i = 0; i < Math.max(1, concurrency); i++) {
|
|
137
|
+
const worker = (async () => {
|
|
138
|
+
while (queue.length) {
|
|
139
|
+
const f = queue.shift();
|
|
140
|
+
if (!f)
|
|
141
|
+
break;
|
|
142
|
+
await runTask(f);
|
|
143
|
+
}
|
|
144
|
+
})();
|
|
145
|
+
workers.push(worker);
|
|
146
|
+
}
|
|
147
|
+
await Promise.all(workers);
|
|
148
|
+
if (mode === 'both') {
|
|
149
|
+
const s = await runSummary();
|
|
150
|
+
items.push({ file: 'Summary', review: s, diff, done: true });
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
const finalHtml = renderHTMLTabs(items, {
|
|
154
|
+
aiInvoked,
|
|
155
|
+
aiSucceeded,
|
|
156
|
+
provider: providerName,
|
|
157
|
+
model: modelUsed,
|
|
158
|
+
status,
|
|
159
|
+
datetime: formattedTime,
|
|
160
|
+
subtitle
|
|
161
|
+
});
|
|
162
|
+
saveOutput(cfg, id, finalHtml);
|
|
163
|
+
}
|
|
164
|
+
catch { }
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/core/review.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './cli.js';
|
|
1
|
+
export * from './cli/index.js';
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './cli.js';
|
|
1
|
+
export * from './cli/index.js';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Config } from '../config/types.js';
|
|
2
|
+
export interface ReviewInput {
|
|
3
|
+
prompt: string;
|
|
4
|
+
diff: string;
|
|
5
|
+
}
|
|
6
|
+
export interface LLMProvider {
|
|
7
|
+
review(input: ReviewInput): Promise<string>;
|
|
8
|
+
}
|
|
9
|
+
export declare abstract class BaseLLMProvider implements LLMProvider {
|
|
10
|
+
protected config: Config;
|
|
11
|
+
constructor(config: Config);
|
|
12
|
+
abstract review(input: ReviewInput): Promise<string>;
|
|
13
|
+
protected buildUserPrompt(diff: string): string;
|
|
14
|
+
}
|
package/dist/llm/base.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/llm/base.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAA;AAWvC,MAAM,OAAgB,eAAe;IAGnC,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAIS,eAAe,CAAC,IAAY;QACpC,OAAO,CAAC,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3C,CAAC;CACF"}
|
package/dist/llm/deepseek.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import OpenAI from 'openai';
|
|
2
2
|
export async function deepseekReview(cfg, input) {
|
|
3
|
-
const baseURL = (cfg.deepseek?.baseURL || 'https://api.deepseek.com').replace(/`/g, '').trim();
|
|
4
|
-
const apiKeyEnv = cfg.deepseek?.apiKeyEnv || 'DEEPSEEK_API_KEY';
|
|
3
|
+
const baseURL = (cfg.providerOptions?.deepseek?.baseURL || 'https://api.deepseek.com').replace(/`/g, '').trim();
|
|
4
|
+
const apiKeyEnv = cfg.providerOptions?.deepseek?.apiKeyEnv || 'DEEPSEEK_API_KEY';
|
|
5
5
|
const apiKey = process.env[apiKeyEnv];
|
|
6
6
|
if (!apiKey)
|
|
7
7
|
throw new Error(`Missing DeepSeek API key in ${apiKeyEnv}`);
|
|
8
8
|
const client = new OpenAI({ baseURL, apiKey });
|
|
9
|
-
const model = cfg.deepseek?.model || 'deepseek-chat';
|
|
9
|
+
const model = cfg.providerOptions?.deepseek?.model || 'deepseek-chat';
|
|
10
10
|
const res = await client.chat.completions.create({
|
|
11
11
|
model,
|
|
12
12
|
messages: [
|
package/dist/llm/deepseek.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deepseek.js","sourceRoot":"","sources":["../../src/llm/deepseek.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAQ3B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,KAAkB;IAClE,MAAM,OAAO,GACX,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,IAAI,0BAA0B,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"deepseek.js","sourceRoot":"","sources":["../../src/llm/deepseek.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAQ3B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,KAAkB;IAClE,MAAM,OAAO,GACX,CAAC,GAAG,CAAC,eAAe,EAAE,QAAQ,EAAE,OAAO,IAAI,0BAA0B,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACjG,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe,EAAE,QAAQ,EAAE,SAAS,IAAI,kBAAkB,CAAA;IAChF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACrC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAA;IACxE,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;IAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,eAAe,EAAE,QAAQ,EAAE,KAAK,IAAI,eAAe,CAAA;IACrE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAC/C,KAAK;QACL,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE;YACzC;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EACL,kDAAkD;oBAClD,KAAK,CAAC,IAAI;aACb;SACF;KACF,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAA;IACxD,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { DeepSeekProvider } from './providers/deepseek.js';
|
|
2
|
+
import { OllamaProvider } from './providers/ollama.js';
|
|
3
|
+
import { OpenAIProvider } from './providers/openai.js';
|
|
4
|
+
import { AnthropicProvider } from './providers/anthropic.js';
|
|
5
|
+
import { GeminiProvider } from './providers/gemini.js';
|
|
6
|
+
import { MistralProvider } from './providers/mistral.js';
|
|
7
|
+
import { CohereProvider } from './providers/cohere.js';
|
|
8
|
+
import { AzureOpenAIProvider } from './providers/azure.js';
|
|
9
|
+
import { AliyunProvider } from './providers/aliyun.js';
|
|
10
|
+
import { VolcengineProvider } from './providers/volcengine.js';
|
|
11
|
+
import { ZhipuProvider } from './providers/zhipu.js';
|
|
12
|
+
export * from './base.js';
|
|
13
|
+
export function createLLMProvider(config) {
|
|
14
|
+
switch (config.provider) {
|
|
15
|
+
case 'deepseek':
|
|
16
|
+
return new DeepSeekProvider(config);
|
|
17
|
+
case 'ollama':
|
|
18
|
+
return new OllamaProvider(config);
|
|
19
|
+
case 'openai':
|
|
20
|
+
return new OpenAIProvider(config);
|
|
21
|
+
case 'anthropic':
|
|
22
|
+
return new AnthropicProvider(config);
|
|
23
|
+
case 'gemini':
|
|
24
|
+
return new GeminiProvider(config);
|
|
25
|
+
case 'mistral':
|
|
26
|
+
return new MistralProvider(config);
|
|
27
|
+
case 'cohere':
|
|
28
|
+
return new CohereProvider(config);
|
|
29
|
+
case 'azureOpenAI':
|
|
30
|
+
return new AzureOpenAIProvider(config);
|
|
31
|
+
case 'aliyun':
|
|
32
|
+
return new AliyunProvider(config);
|
|
33
|
+
case 'volcengine':
|
|
34
|
+
return new VolcengineProvider(config);
|
|
35
|
+
case 'zhipu':
|
|
36
|
+
return new ZhipuProvider(config);
|
|
37
|
+
default:
|
|
38
|
+
throw new Error(`Unsupported provider: ${config.provider}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,cAAc,WAAW,CAAA;AAEzB,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,UAAU;YACb,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAA;QACrC,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;QACnC,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;QACnC,KAAK,WAAW;YACd,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAA;QACtC,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;QACnC,KAAK,SAAS;YACZ,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAA;QACpC,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;QACnC,KAAK,aAAa;YAChB,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAA;QACxC,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;QACnC,KAAK,YAAY;YACf,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAA;QACvC,KAAK,OAAO;YACV,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAA;QAClC;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC/D,CAAC;AACH,CAAC"}
|
package/dist/llm/ollama.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export async function ollamaReview(cfg, input) {
|
|
2
|
-
const baseURL = cfg.ollama?.baseURL || 'http://localhost:11434';
|
|
3
|
-
const model = cfg.ollama?.model || 'qwen2.5-coder';
|
|
2
|
+
const baseURL = cfg.providerOptions?.ollama?.baseURL || 'http://localhost:11434';
|
|
3
|
+
const model = cfg.providerOptions?.ollama?.model || 'qwen2.5-coder';
|
|
4
4
|
const chatUrl = `${baseURL}/api/chat`;
|
|
5
5
|
const chatBody = {
|
|
6
6
|
model,
|
package/dist/llm/ollama.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/llm/ollama.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,KAAkB;IAChE,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,IAAI,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/llm/ollama.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import OpenAI from 'openai';
|
|
2
|
+
import { BaseLLMProvider } from '../base.js';
|
|
3
|
+
export class AliyunProvider extends BaseLLMProvider {
|
|
4
|
+
async review(input) {
|
|
5
|
+
const opts = this.config.providerOptions?.aliyun;
|
|
6
|
+
const baseURL = (opts?.baseURL || 'https://dashscope.aliyuncs.com/compatible-mode/v1').replace(/`/g, '').trim();
|
|
7
|
+
const apiKeyEnv = opts?.apiKeyEnv || 'DASHSCOPE_API_KEY';
|
|
8
|
+
const apiKey = process.env[apiKeyEnv] || opts?.apiKey;
|
|
9
|
+
if (!apiKey) {
|
|
10
|
+
throw new Error(`Missing Aliyun DashScope 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 || 'qwen-plus';
|
|
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=aliyun.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aliyun.js","sourceRoot":"","sources":["../../../src/llm/providers/aliyun.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,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,mDAAmD,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QAC/G,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,gDAAgD,SAAS,iEAAiE,CAAC,CAAA;QAC7I,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;QAC9C,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,WAAW,CAAA;QAExC,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"}
|