@wuyanbin/ai-code-review-cli-remote 1.0.14-canary.0 → 1.0.15
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/dist/client.d.ts +18 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +57 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +161 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +8 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +16 -2
- package/dist/constants.js.map +1 -1
- package/dist/core/reviewer.d.ts.map +1 -1
- package/dist/core/reviewer.js +2 -13
- package/dist/core/reviewer.js.map +1 -1
- package/dist/diff.d.ts +6 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +127 -0
- package/dist/diff.js.map +1 -0
- package/dist/formatters.d.ts +4 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/formatters.js +31 -0
- package/dist/formatters.js.map +1 -0
- package/dist/gitlab/api.d.ts +40 -0
- package/dist/gitlab/api.d.ts.map +1 -1
- package/dist/gitlab/api.js +82 -29
- package/dist/gitlab/api.js.map +1 -1
- package/dist/gitlab.d.ts +11 -0
- package/dist/gitlab.d.ts.map +1 -0
- package/dist/gitlab.js +193 -0
- package/dist/gitlab.js.map +1 -0
- package/dist/http.d.ts +4 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +31 -0
- package/dist/http.js.map +1 -0
- package/dist/index.js +0 -0
- package/dist/model.d.ts +6 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +120 -0
- package/dist/model.js.map +1 -0
- package/dist/report.d.ts +9 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +31 -0
- package/dist/report.js.map +1 -0
- package/dist/reviewer.d.ts +3 -0
- package/dist/reviewer.d.ts.map +1 -0
- package/dist/reviewer.js +140 -0
- package/dist/reviewer.js.map +1 -0
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +9 -1
- package/dist/runner.js.map +1 -1
- package/dist/shared/concurrency.d.ts +2 -0
- package/dist/shared/concurrency.d.ts.map +1 -0
- package/dist/shared/concurrency.js +16 -0
- package/dist/shared/concurrency.js.map +1 -0
- package/dist/shared/http.d.ts +15 -0
- package/dist/shared/http.d.ts.map +1 -1
- package/dist/shared/http.js +36 -0
- package/dist/shared/http.js.map +1 -1
- package/dist/shared/identity.d.ts +6 -3
- package/dist/shared/identity.d.ts.map +1 -1
- package/dist/shared/identity.js +6 -4
- package/dist/shared/identity.js.map +1 -1
- package/dist/summarizer.d.ts +3 -0
- package/dist/summarizer.d.ts.map +1 -0
- package/dist/summarizer.js +75 -0
- package/dist/summarizer.js.map +1 -0
- package/package.json +1 -1
package/dist/model.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createModelAdapter = createModelAdapter;
|
|
4
|
+
const constants_1 = require("./constants");
|
|
5
|
+
const http_1 = require("./http");
|
|
6
|
+
async function readErrorBody(resp) {
|
|
7
|
+
const text = await resp.text().catch(() => "");
|
|
8
|
+
return text.trim().slice(0, 1000);
|
|
9
|
+
}
|
|
10
|
+
class BaseModelAdapter {
|
|
11
|
+
constructor(endpoint, apiKey) {
|
|
12
|
+
this.endpoint = endpoint;
|
|
13
|
+
this.apiKey = apiKey;
|
|
14
|
+
}
|
|
15
|
+
async call(model, systemPrompt, userPrompt) {
|
|
16
|
+
const tag = this.providerName;
|
|
17
|
+
console.error(`[model] ${tag} request start model=${model}`);
|
|
18
|
+
let resp;
|
|
19
|
+
try {
|
|
20
|
+
resp = await (0, http_1.fetchWithTimeout)(this.buildRequestUrl(), {
|
|
21
|
+
method: "POST",
|
|
22
|
+
headers: {
|
|
23
|
+
"Content-Type": "application/json",
|
|
24
|
+
...this.buildHeaders(),
|
|
25
|
+
},
|
|
26
|
+
body: JSON.stringify(this.buildBody(model, systemPrompt, userPrompt)),
|
|
27
|
+
}, constants_1.REQUEST_TIMEOUT_MS);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
const reason = err instanceof Error && err.name === "AbortError"
|
|
31
|
+
? "timeout"
|
|
32
|
+
: "network error";
|
|
33
|
+
console.error(`[model] ${tag} request ${reason}: ${err}`);
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
if (!resp.ok) {
|
|
37
|
+
const body = await readErrorBody(resp);
|
|
38
|
+
console.error(body
|
|
39
|
+
? `[model] ${tag} API failed status=${resp.status} body=${body}`
|
|
40
|
+
: `[model] ${tag} API failed status=${resp.status}`);
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const json = await (0, http_1.parseJsonSafe)(resp);
|
|
44
|
+
if (!json) {
|
|
45
|
+
console.error(`[model] ${tag} response body parse failed`);
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const content = this.extractContent(json);
|
|
49
|
+
console.error(content
|
|
50
|
+
? `[model] ${tag} request complete bytes=${Buffer.byteLength(content)}`
|
|
51
|
+
: `[model] ${tag} response empty`);
|
|
52
|
+
return content;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
class OpenAIAdapter extends BaseModelAdapter {
|
|
56
|
+
get providerName() {
|
|
57
|
+
return "openai-compatible";
|
|
58
|
+
}
|
|
59
|
+
buildRequestUrl() {
|
|
60
|
+
const url = this.endpoint.replace(/\/+$/, "");
|
|
61
|
+
return url.endsWith("/chat/completions") ? url : `${url}/chat/completions`;
|
|
62
|
+
}
|
|
63
|
+
buildHeaders() {
|
|
64
|
+
return { Authorization: `Bearer ${this.apiKey}` };
|
|
65
|
+
}
|
|
66
|
+
buildBody(model, systemPrompt, userPrompt) {
|
|
67
|
+
return {
|
|
68
|
+
model,
|
|
69
|
+
messages: [
|
|
70
|
+
{ role: "system", content: systemPrompt },
|
|
71
|
+
{ role: "user", content: userPrompt },
|
|
72
|
+
],
|
|
73
|
+
stream: false,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
extractContent(json) {
|
|
77
|
+
const data = json;
|
|
78
|
+
return data.choices?.[0]?.message?.content?.trim() || null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
class ClaudeAdapter extends BaseModelAdapter {
|
|
82
|
+
get providerName() {
|
|
83
|
+
return "claude";
|
|
84
|
+
}
|
|
85
|
+
buildRequestUrl() {
|
|
86
|
+
const url = this.endpoint.replace(/\/+$/, "");
|
|
87
|
+
return url.endsWith("/v1/messages") ? url : `${url}/v1/messages`;
|
|
88
|
+
}
|
|
89
|
+
buildHeaders() {
|
|
90
|
+
return {
|
|
91
|
+
"x-api-key": this.apiKey,
|
|
92
|
+
"anthropic-version": "2023-06-01",
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
buildBody(model, systemPrompt, userPrompt) {
|
|
96
|
+
return {
|
|
97
|
+
model,
|
|
98
|
+
max_tokens: 32768,
|
|
99
|
+
system: systemPrompt,
|
|
100
|
+
messages: [{ role: "user", content: userPrompt }],
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
extractContent(json) {
|
|
104
|
+
const data = json;
|
|
105
|
+
return data.content?.find((b) => b.type === "text")?.text?.trim() || null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function createModelAdapter(endpoint, apiKey, apiFormat) {
|
|
109
|
+
if (apiFormat === "claude") {
|
|
110
|
+
return new ClaudeAdapter(endpoint, apiKey);
|
|
111
|
+
}
|
|
112
|
+
if (apiFormat === "openai") {
|
|
113
|
+
return new OpenAIAdapter(endpoint, apiKey);
|
|
114
|
+
}
|
|
115
|
+
if (endpoint.includes("anthropic.com") || endpoint.includes("/v1/messages")) {
|
|
116
|
+
return new ClaudeAdapter(endpoint, apiKey);
|
|
117
|
+
}
|
|
118
|
+
return new OpenAIAdapter(endpoint, apiKey);
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":";;AAiKA,gDAeC;AAhLD,2CAAiD;AACjD,iCAAyD;AAmBzD,KAAK,UAAU,aAAa,CAAC,IAAc;IACzC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,MAAe,gBAAgB;IAC7B,YACqB,QAAgB,EAChB,MAAc;QADd,aAAQ,GAAR,QAAQ,CAAQ;QAChB,WAAM,GAAN,MAAM,CAAQ;IAChC,CAAC;IAYJ,KAAK,CAAC,IAAI,CACR,KAAa,EACb,YAAoB,EACpB,UAAkB;QAElB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,wBAAwB,KAAK,EAAE,CAAC,CAAC;QAE7D,IAAI,IAAc,CAAC;QACnB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,IAAA,uBAAgB,EAC3B,IAAI,CAAC,eAAe,EAAE,EACtB;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,GAAG,IAAI,CAAC,YAAY,EAAE;iBACvB;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;aACtE,EACD,8BAAkB,CACnB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,GACV,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY;gBAC/C,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,eAAe,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,YAAY,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC;YAC1D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;YACvC,OAAO,CAAC,KAAK,CACX,IAAI;gBACF,CAAC,CAAC,WAAW,GAAG,sBAAsB,IAAI,CAAC,MAAM,SAAS,IAAI,EAAE;gBAChE,CAAC,CAAC,WAAW,GAAG,sBAAsB,IAAI,CAAC,MAAM,EAAE,CACtD,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAA,oBAAa,EAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,6BAA6B,CAAC,CAAC;YAC3D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO,CAAC,KAAK,CACX,OAAO;YACL,CAAC,CAAC,WAAW,GAAG,2BAA2B,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;YACvE,CAAC,CAAC,WAAW,GAAG,iBAAiB,CACpC,CAAC;QACF,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED,MAAM,aAAc,SAAQ,gBAAgB;IAC1C,IAAc,YAAY;QACxB,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAES,eAAe;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9C,OAAO,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,mBAAmB,CAAC;IAC7E,CAAC;IAES,YAAY;QACpB,OAAO,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;IACpD,CAAC;IAES,SAAS,CAAC,KAAa,EAAE,YAAoB,EAAE,UAAkB;QACzE,OAAO;YACL,KAAK;YACL,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;gBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE;aACtC;YACD,MAAM,EAAE,KAAK;SACd,CAAC;IACJ,CAAC;IAES,cAAc,CAAC,IAAa;QACpC,MAAM,IAAI,GAAG,IAAsB,CAAC;QACpC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;IAC7D,CAAC;CACF;AAED,MAAM,aAAc,SAAQ,gBAAgB;IAC1C,IAAc,YAAY;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAES,eAAe;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9C,OAAO,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,cAAc,CAAC;IACnE,CAAC;IAES,YAAY;QACpB,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,MAAM;YACxB,mBAAmB,EAAE,YAAY;SAClC,CAAC;IACJ,CAAC;IAES,SAAS,CAAC,KAAa,EAAE,YAAoB,EAAE,UAAkB;QACzE,OAAO;YACL,KAAK;YACL,UAAU,EAAE,KAAK;YACjB,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;SAClD,CAAC;IACJ,CAAC;IAES,cAAc,CAAC,IAAa;QACpC,MAAM,IAAI,GAAG,IAAsB,CAAC;QACpC,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;IAC5E,CAAC;CACF;AAED,SAAgB,kBAAkB,CAChC,QAAgB,EAChB,MAAc,EACd,SAA4B;IAE5B,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC5E,OAAO,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC"}
|
package/dist/report.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface RunReportPayload {
|
|
2
|
+
status: "SUCCESS" | "FAILED" | "TIMEOUT" | "QUOTA_EXCEEDED";
|
|
3
|
+
modelUsed?: string;
|
|
4
|
+
commentCount?: number;
|
|
5
|
+
duration?: number;
|
|
6
|
+
mrIid?: string | number;
|
|
7
|
+
}
|
|
8
|
+
export declare function postRunReport(payload: RunReportPayload, env?: NodeJS.ProcessEnv): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,gBAAgB,CAAC;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,gBAAgB,EACzB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
|
package/dist/report.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.postRunReport = postRunReport;
|
|
4
|
+
const constants_1 = require("./constants");
|
|
5
|
+
const http_1 = require("./http");
|
|
6
|
+
async function postRunReport(payload, env = process.env) {
|
|
7
|
+
const platformUrl = env[constants_1.ENV_PLATFORM_URL]?.replace(/\/+$/, "");
|
|
8
|
+
const token = env[constants_1.ENV_PROJECT_TOKEN];
|
|
9
|
+
if (!platformUrl || !token)
|
|
10
|
+
return;
|
|
11
|
+
try {
|
|
12
|
+
console.error(`[report] posting run report status=${payload.status}`);
|
|
13
|
+
const resp = await (0, http_1.fetchWithTimeout)(`${platformUrl}${constants_1.API_RUNS_PATH}`, {
|
|
14
|
+
method: "POST",
|
|
15
|
+
headers: {
|
|
16
|
+
"Content-Type": "application/json",
|
|
17
|
+
Authorization: `Bearer ${token}`,
|
|
18
|
+
},
|
|
19
|
+
body: JSON.stringify(payload),
|
|
20
|
+
}, constants_1.API_TIMEOUT_MS);
|
|
21
|
+
if (!resp.ok) {
|
|
22
|
+
console.error(`[report] 运行结果上报失败 status=${resp.status}`);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
console.error("[report] run report posted");
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
console.error("[report] 运行结果上报异常:", error instanceof Error ? error.message : String(error));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":";;AAgBA,sCAiCC;AAjDD,2CAKqB;AACrB,iCAA0C;AAUnC,KAAK,UAAU,aAAa,CACjC,OAAyB,EACzB,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,WAAW,GAAG,GAAG,CAAC,4BAAgB,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,GAAG,CAAC,6BAAiB,CAAC,CAAC;IACrC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnC,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,sCAAsC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,MAAM,IAAA,uBAAgB,EACjC,GAAG,WAAW,GAAG,yBAAa,EAAE,EAChC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,KAAK,EAAE;aACjC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,EACD,0BAAc,CACf,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,4BAA4B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,oBAAoB,EACpB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../src/reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAgI5D,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA4B5B"}
|
package/dist/reviewer.js
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.reviewCode = reviewCode;
|
|
4
|
+
const diff_1 = require("./diff");
|
|
5
|
+
const model_1 = require("./model");
|
|
6
|
+
const SEVERITY_ORDER = { info: 0, warning: 1, error: 2 };
|
|
7
|
+
const COMMON_RULES = [
|
|
8
|
+
"重点关注潜在 bug、性能问题、可读性与安全性(如 XSS、注入、敏感信息泄露)",
|
|
9
|
+
"代码要有适当的错误处理",
|
|
10
|
+
"避免代码重复,注意抽离复用逻辑",
|
|
11
|
+
"函数和变量命名要语义化,见名知意",
|
|
12
|
+
"复杂逻辑要添加注释说明",
|
|
13
|
+
];
|
|
14
|
+
function buildSystemPrompt() {
|
|
15
|
+
return "你是一个资深的代码审查助手,需要根据给定的 Git diff 和项目规范,对改动的代码进行严格的 Code Review。";
|
|
16
|
+
}
|
|
17
|
+
function buildUserPrompt(diff, rules) {
|
|
18
|
+
return [
|
|
19
|
+
"请你只针对 diff 中【新增或修改】的代码行给出审查意见。",
|
|
20
|
+
"输出格式要求:必须返回严格的 JSON,形如:",
|
|
21
|
+
'{"comments":[{"file":"src/xxx.ts","line":123,"code":"该行完整代码","severity":"warning","message":"问题描述","suggestion":"修复建议"}]}',
|
|
22
|
+
"注意:severity 只能是 info / warning / error;file 必须使用 diff 中出现的路径;line 必须是 new file 侧真实行号;只能评论新增行。",
|
|
23
|
+
"",
|
|
24
|
+
"可评论行索引:",
|
|
25
|
+
(0, diff_1.buildAddedLinesIndexText)(diff),
|
|
26
|
+
"",
|
|
27
|
+
"项目规范:",
|
|
28
|
+
rules.join("\n"),
|
|
29
|
+
"",
|
|
30
|
+
"Git diff:",
|
|
31
|
+
diff,
|
|
32
|
+
].join("\n");
|
|
33
|
+
}
|
|
34
|
+
function stripFences(text) {
|
|
35
|
+
return (text ?? "")
|
|
36
|
+
.replace(/^```(?:json)?\s*/i, "")
|
|
37
|
+
.replace(/```$/i, "")
|
|
38
|
+
.trim();
|
|
39
|
+
}
|
|
40
|
+
function extractJsonObject(content) {
|
|
41
|
+
const text = stripFences(content);
|
|
42
|
+
const start = text.indexOf("{");
|
|
43
|
+
const end = text.lastIndexOf("}");
|
|
44
|
+
if (start >= 0 && end > start)
|
|
45
|
+
return text.slice(start, end + 1);
|
|
46
|
+
return text;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 修复 JSON 字符串字面量中的非法控制字符(未转义的 \n/\r/\t 或其他 0x00-0x1F)。
|
|
50
|
+
* 逐字符扫描,仅在 JSON 字符串内部将裸控制字符替换为合法转义序列。
|
|
51
|
+
*/
|
|
52
|
+
function escapeControlCharsInJsonStrings(json) {
|
|
53
|
+
let out = "";
|
|
54
|
+
let inString = false;
|
|
55
|
+
let escape = false;
|
|
56
|
+
for (let i = 0; i < json.length; i++) {
|
|
57
|
+
const ch = json[i];
|
|
58
|
+
if (!inString) {
|
|
59
|
+
if (ch === '"')
|
|
60
|
+
inString = true;
|
|
61
|
+
out += ch;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (escape) {
|
|
65
|
+
out += ch;
|
|
66
|
+
escape = false;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (ch === "\\") {
|
|
70
|
+
out += ch;
|
|
71
|
+
escape = true;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (ch === '"') {
|
|
75
|
+
out += ch;
|
|
76
|
+
inString = false;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const code = ch.charCodeAt(0);
|
|
80
|
+
if (code < 0x20) {
|
|
81
|
+
if (ch === "\n")
|
|
82
|
+
out += "\\n";
|
|
83
|
+
else if (ch === "\r")
|
|
84
|
+
out += "\\r";
|
|
85
|
+
else if (ch === "\t")
|
|
86
|
+
out += "\\t";
|
|
87
|
+
else if (ch === "\b")
|
|
88
|
+
out += "\\b";
|
|
89
|
+
else if (ch === "\f")
|
|
90
|
+
out += "\\f";
|
|
91
|
+
else
|
|
92
|
+
out += `\\u${code.toString(16).padStart(4, "0")}`;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
out += ch;
|
|
96
|
+
}
|
|
97
|
+
return out;
|
|
98
|
+
}
|
|
99
|
+
function parseAIResponse(content) {
|
|
100
|
+
const jsonText = extractJsonObject(content);
|
|
101
|
+
try {
|
|
102
|
+
const parsed = JSON.parse(jsonText);
|
|
103
|
+
return { comments: Array.isArray(parsed.comments) ? parsed.comments : [] };
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// 尝试修复 JSON 字符串内未转义的控制字符后重新解析
|
|
107
|
+
try {
|
|
108
|
+
const repaired = escapeControlCharsInJsonStrings(jsonText);
|
|
109
|
+
const parsed = JSON.parse(repaired);
|
|
110
|
+
return { comments: Array.isArray(parsed.comments) ? parsed.comments : [] };
|
|
111
|
+
}
|
|
112
|
+
catch (retryError) {
|
|
113
|
+
console.error("[reviewer] AI 返回 JSON 解析失败");
|
|
114
|
+
console.error(retryError);
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async function reviewCode(diff, config) {
|
|
120
|
+
const effectiveDiff = (0, diff_1.filterDiffByIgnore)(diff, config.review.ignore);
|
|
121
|
+
if (!effectiveDiff.trim())
|
|
122
|
+
return { comments: [] };
|
|
123
|
+
if (!config.ai.apiKey || !config.ai.endpoint)
|
|
124
|
+
return null;
|
|
125
|
+
const adapter = (0, model_1.createModelAdapter)(config.ai.endpoint, config.ai.apiKey, config.ai.apiFormat);
|
|
126
|
+
const raw = await adapter.call(config.ai.model, buildSystemPrompt(), buildUserPrompt(effectiveDiff, [...COMMON_RULES, ...config.rules.custom]));
|
|
127
|
+
if (!raw)
|
|
128
|
+
return null;
|
|
129
|
+
const parsed = parseAIResponse(raw);
|
|
130
|
+
if (!parsed)
|
|
131
|
+
return null;
|
|
132
|
+
const minSeverity = SEVERITY_ORDER[config.review.severity];
|
|
133
|
+
let comments = (0, diff_1.alignCommentsToDiffAddedLines)(effectiveDiff, parsed.comments)
|
|
134
|
+
.filter((c) => SEVERITY_ORDER[c.severity] >= minSeverity);
|
|
135
|
+
if (comments.length > config.review.maxComments) {
|
|
136
|
+
comments = comments.slice(0, config.review.maxComments);
|
|
137
|
+
}
|
|
138
|
+
return { comments };
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=reviewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../src/reviewer.ts"],"names":[],"mappings":"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"}
|
package/dist/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,SAAS,QAAO,OAAO,CAAC,MAAM,CASvC,CAAC;AA0CL,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA+DhD"}
|
package/dist/runner.js
CHANGED
|
@@ -50,6 +50,7 @@ function logConfigDetails(config) {
|
|
|
50
50
|
console.error(`[runner] ${line}`);
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
|
+
// 评论入口
|
|
53
54
|
async function reviewMain() {
|
|
54
55
|
const startedAt = Date.now();
|
|
55
56
|
const diff = await (0, exports.readStdin)();
|
|
@@ -80,17 +81,24 @@ async function reviewMain() {
|
|
|
80
81
|
return;
|
|
81
82
|
}
|
|
82
83
|
console.error(`[runner] review complete comments=${result.comments.length}`);
|
|
84
|
+
// 单次运行只拉取一次 GitLab user + discussions,供评论与摘要复用
|
|
85
|
+
const gitlabContext = (await (0, api_1.fetchGitlabContext)({ token: config.gitlab?.token })) ?? undefined;
|
|
83
86
|
// 生成代码块评论
|
|
84
87
|
await (0, api_1.postGitlabDiscussions)({
|
|
85
88
|
comments: result.comments,
|
|
86
89
|
diff,
|
|
87
90
|
token: config.gitlab?.token,
|
|
91
|
+
context: gitlabContext,
|
|
88
92
|
});
|
|
89
93
|
console.log(JSON.stringify((0, output_1.buildRdjson)(result.comments)));
|
|
90
94
|
// 生成总结评论
|
|
91
95
|
const markdown = await (0, summarizer_1.generateSummary)(diff, config);
|
|
92
96
|
if (markdown) {
|
|
93
|
-
await (0, api_1.postGitlabSummary)({
|
|
97
|
+
await (0, api_1.postGitlabSummary)({
|
|
98
|
+
markdown,
|
|
99
|
+
token: config.gitlab?.token,
|
|
100
|
+
context: gitlabContext,
|
|
101
|
+
});
|
|
94
102
|
}
|
|
95
103
|
await (0, report_1.postRunReport)({
|
|
96
104
|
status: "SUCCESS",
|
package/dist/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/shared/concurrency.ts"],"names":[],"mappings":"AAAA,wBAAsB,aAAa,CAAC,CAAC,EAAE,CAAC,EACtC,KAAK,EAAE,CAAC,EAAE,EACV,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACzC,OAAO,CAAC,CAAC,EAAE,CAAC,CAad"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mapConcurrent = mapConcurrent;
|
|
4
|
+
async function mapConcurrent(items, concurrency, fn) {
|
|
5
|
+
const results = new Array(items.length);
|
|
6
|
+
let next = 0;
|
|
7
|
+
async function worker() {
|
|
8
|
+
while (next < items.length) {
|
|
9
|
+
const i = next++;
|
|
10
|
+
results[i] = await fn(items[i], i);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, worker));
|
|
14
|
+
return results;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=concurrency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../src/shared/concurrency.ts"],"names":[],"mappings":";;AAAA,sCAiBC;AAjBM,KAAK,UAAU,aAAa,CACjC,KAAU,EACV,WAAmB,EACnB,EAA0C;IAE1C,MAAM,OAAO,GAAG,IAAI,KAAK,CAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,UAAU,MAAM;QACnB,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CACpE,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/shared/http.d.ts
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
1
|
export declare function fetchWithTimeout(url: string, init: RequestInit, timeoutMs: number): Promise<Response>;
|
|
2
|
+
export interface RetryOptions {
|
|
3
|
+
/** Max extra attempts after the first request. Default 1. */
|
|
4
|
+
maxRetries?: number;
|
|
5
|
+
/** Fallback delay when no Retry-After header is present. Default 1000ms. */
|
|
6
|
+
baseDelayMs?: number;
|
|
7
|
+
/** Upper bound for any single backoff delay. Default 10000ms. */
|
|
8
|
+
maxDelayMs?: number;
|
|
9
|
+
sleep?: (ms: number) => Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Like fetchWithTimeout but performs a limited, gentle backoff on 429 / 5xx,
|
|
13
|
+
* honoring Retry-After. Intended for idempotent requests (GET/PUT/DELETE).
|
|
14
|
+
* Deliberately avoids exponential retry storms that would amplify load.
|
|
15
|
+
*/
|
|
16
|
+
export declare function fetchWithRetry(url: string, init: RequestInit, timeoutMs: number, options?: RetryOptions): Promise<Response>;
|
|
2
17
|
export declare function parseJsonSafe<T>(resp: Response): Promise<T | null>;
|
|
3
18
|
//# sourceMappingURL=http.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/shared/http.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC,CAMnB;AAED,wBAAsB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAMxE"}
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/shared/http.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC,CAMnB;AAED,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAeD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,QAAQ,CAAC,CAqBnB;AAED,wBAAsB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAMxE"}
|
package/dist/shared/http.js
CHANGED
|
@@ -1,12 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.fetchWithTimeout = fetchWithTimeout;
|
|
4
|
+
exports.fetchWithRetry = fetchWithRetry;
|
|
4
5
|
exports.parseJsonSafe = parseJsonSafe;
|
|
5
6
|
function fetchWithTimeout(url, init, timeoutMs) {
|
|
6
7
|
const controller = new AbortController();
|
|
7
8
|
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
8
9
|
return fetch(url, { ...init, signal: controller.signal }).finally(() => clearTimeout(timer));
|
|
9
10
|
}
|
|
11
|
+
const defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
12
|
+
function parseRetryAfterMs(resp, fallbackMs) {
|
|
13
|
+
const header = resp.headers.get("retry-after");
|
|
14
|
+
if (!header)
|
|
15
|
+
return fallbackMs;
|
|
16
|
+
const seconds = Number(header);
|
|
17
|
+
if (Number.isFinite(seconds) && seconds >= 0)
|
|
18
|
+
return seconds * 1000;
|
|
19
|
+
const dateMs = Date.parse(header);
|
|
20
|
+
if (!Number.isNaN(dateMs))
|
|
21
|
+
return Math.max(0, dateMs - Date.now());
|
|
22
|
+
return fallbackMs;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Like fetchWithTimeout but performs a limited, gentle backoff on 429 / 5xx,
|
|
26
|
+
* honoring Retry-After. Intended for idempotent requests (GET/PUT/DELETE).
|
|
27
|
+
* Deliberately avoids exponential retry storms that would amplify load.
|
|
28
|
+
*/
|
|
29
|
+
async function fetchWithRetry(url, init, timeoutMs, options = {}) {
|
|
30
|
+
const maxRetries = options.maxRetries ?? 1;
|
|
31
|
+
const baseDelayMs = options.baseDelayMs ?? 1000;
|
|
32
|
+
const maxDelayMs = options.maxDelayMs ?? 10000;
|
|
33
|
+
const sleep = options.sleep ?? defaultSleep;
|
|
34
|
+
let attempt = 0;
|
|
35
|
+
while (true) {
|
|
36
|
+
const resp = await fetchWithTimeout(url, init, timeoutMs);
|
|
37
|
+
const retriable = resp.status === 429 || resp.status >= 500;
|
|
38
|
+
if (!retriable || attempt >= maxRetries)
|
|
39
|
+
return resp;
|
|
40
|
+
const delay = Math.min(parseRetryAfterMs(resp, baseDelayMs), maxDelayMs);
|
|
41
|
+
console.error(`[http] status=${resp.status} backing off ${delay}ms (retry ${attempt + 1}/${maxRetries})`);
|
|
42
|
+
await sleep(delay);
|
|
43
|
+
attempt += 1;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
10
46
|
async function parseJsonSafe(resp) {
|
|
11
47
|
try {
|
|
12
48
|
return (await resp.json());
|
package/dist/shared/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/shared/http.ts"],"names":[],"mappings":";;AAAA,4CAUC;AAED,sCAMC;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/shared/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,9 +3,12 @@ export declare const COMMENT_MARKER_PREFIX = "aicr-comment";
|
|
|
3
3
|
export declare const SUMMARY_MARKER = "aicr-summary";
|
|
4
4
|
export declare function stableHash(value: string): string;
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* Content-stable fingerprint for GitLab discussion lifecycle (match/update/resolve).
|
|
7
|
+
* Intentionally excludes the line number so that a finding survives line drift
|
|
8
|
+
* (code inserted above it) and still matches its existing discussion instead of
|
|
9
|
+
* being deleted and recreated. Also excludes AI prose (message/suggestion) so
|
|
10
|
+
* rephrased descriptions of the same issue keep matching. GitLab repositions the
|
|
11
|
+
* inline note onto the new diff automatically when the head SHA changes.
|
|
9
12
|
*/
|
|
10
13
|
export declare function buildCommentFingerprint(comment: AIComment): string;
|
|
11
14
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/shared/identity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAG1C,eAAO,MAAM,qBAAqB,iBAAiB,CAAC;AACpD,eAAO,MAAM,cAAc,iBAAiB,CAAC;AAE7C,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/shared/identity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAG1C,eAAO,MAAM,qBAAqB,iBAAiB,CAAC;AACpD,eAAO,MAAM,cAAc,iBAAiB,CAAC;AAE7C,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAQlE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAWlE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI7E"}
|
package/dist/shared/identity.js
CHANGED
|
@@ -14,14 +14,16 @@ function stableHash(value) {
|
|
|
14
14
|
return (0, node_crypto_1.createHash)("sha1").update(value).digest("hex").slice(0, 16);
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
17
|
+
* Content-stable fingerprint for GitLab discussion lifecycle (match/update/resolve).
|
|
18
|
+
* Intentionally excludes the line number so that a finding survives line drift
|
|
19
|
+
* (code inserted above it) and still matches its existing discussion instead of
|
|
20
|
+
* being deleted and recreated. Also excludes AI prose (message/suggestion) so
|
|
21
|
+
* rephrased descriptions of the same issue keep matching. GitLab repositions the
|
|
22
|
+
* inline note onto the new diff automatically when the head SHA changes.
|
|
20
23
|
*/
|
|
21
24
|
function buildCommentFingerprint(comment) {
|
|
22
25
|
return stableHash([
|
|
23
26
|
(0, diff_1.normalizePath)(comment.file),
|
|
24
|
-
String(comment.line),
|
|
25
27
|
comment.code?.trim() ?? "",
|
|
26
28
|
comment.severity,
|
|
27
29
|
].join("\0"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/shared/identity.ts"],"names":[],"mappings":";;;AAOA,gCAEC;
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/shared/identity.ts"],"names":[],"mappings":";;;AAOA,gCAEC;AAUD,0DAQC;AAMD,0DAWC;AAED,8CAEC;AAED,kDAIC;AAtDD,6CAAyC;AAEzC,uCAA6C;AAEhC,QAAA,qBAAqB,GAAG,cAAc,CAAC;AACvC,QAAA,cAAc,GAAG,cAAc,CAAC;AAE7C,SAAgB,UAAU,CAAC,KAAa;IACtC,OAAO,IAAA,wBAAU,EAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,uBAAuB,CAAC,OAAkB;IACxD,OAAO,UAAU,CACf;QACE,IAAA,oBAAa,EAAC,OAAO,CAAC,IAAI,CAAC;QAC3B,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;QAC1B,OAAO,CAAC,QAAQ;KACjB,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,uBAAuB,CAAC,OAAkB;IACxD,OAAO,UAAU,CACf;QACE,IAAA,oBAAa,EAAC,OAAO,CAAC,IAAI,CAAC;QAC3B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;QACpB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;QAC1B,OAAO,CAAC,QAAQ;QAChB,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE;QACtB,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE;KACjC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB,CAAC,IAAY,EAAE,WAAmB;IACjE,OAAO,QAAQ,IAAI,IAAI,WAAW,MAAM,CAAC;AAC3C,CAAC;AAED,SAAgB,mBAAmB,CAAC,IAAY,EAAE,IAAY;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,WAAW,OAAO,sBAAsB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9E,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../src/summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA0DhD,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgBxB"}
|