@wuyanbin/ai-code-review-cli-remote 1.4.0 → 1.4.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.
- package/README.md +10 -1
- package/dist/core/agent-runtime.d.ts +8 -1
- package/dist/core/agent-runtime.d.ts.map +1 -1
- package/dist/core/agent-runtime.js +3 -2
- package/dist/core/agent-runtime.js.map +1 -1
- package/dist/core/prompt.d.ts +3 -0
- package/dist/core/prompt.d.ts.map +1 -1
- package/dist/core/prompt.js +16 -9
- package/dist/core/prompt.js.map +1 -1
- package/dist/core/summarizer.d.ts +4 -1
- package/dist/core/summarizer.d.ts.map +1 -1
- package/dist/core/summarizer.js +4 -2
- package/dist/core/summarizer.js.map +1 -1
- package/dist/core/summary-compose.d.ts +68 -0
- package/dist/core/summary-compose.d.ts.map +1 -0
- package/dist/core/summary-compose.js +205 -0
- package/dist/core/summary-compose.js.map +1 -0
- package/dist/core/verdict.d.ts +25 -5
- package/dist/core/verdict.d.ts.map +1 -1
- package/dist/core/verdict.js +100 -40
- package/dist/core/verdict.js.map +1 -1
- package/dist/core/verify-tools.d.ts +13 -0
- package/dist/core/verify-tools.d.ts.map +1 -1
- package/dist/core/verify-tools.js +50 -10
- package/dist/core/verify-tools.js.map +1 -1
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +49 -16
- package/dist/runner.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ stdin: git diff <merge-base>..HEAD
|
|
|
14
14
|
├─ 4. 主评审 分片 + 注解 diff + 符号级上下文;首轮 baseline 两趟取并集,增量运行一趟
|
|
15
15
|
├─ 5. 对账 保活 / 收口 / 人工 dismiss / 增量准入;已知 OPEN 交复核 agent,新报交语义判重
|
|
16
16
|
├─ 6. 取证验证 只对本次新建的 P0:带只读工具的 agent 读仓库核实,CONFIRMED 才发布
|
|
17
|
-
├─ 7. 发布 行内评论 = 经验证的 P0;P1 / P2 只在摘要汇总(封顶 10
|
|
17
|
+
├─ 7. 发布 行内评论 = 经验证的 P0;P1 / P2 只在摘要汇总(封顶 10 条);摘要布局见下
|
|
18
18
|
├─ 8. 回写 PUT /api/modules/code-review/ci/findings 全量 finding 状态(含验证结论、resolve 时间)
|
|
19
19
|
└─ 9. 上报 POST /api/modules/code-review/ci/runs 状态、用量、verdict、分项计数、Top 问题
|
|
20
20
|
```
|
|
@@ -26,6 +26,15 @@ stdin: git diff <merge-base>..HEAD
|
|
|
26
26
|
| P0 | 是,只有 `CONFIRMED` 发布 | 是 | 是(任一 OPEN 且 blocking 的 P0 → `ACTION_REQUIRED`) | 是 |
|
|
27
27
|
| P1 / P2 | 否 | 否,摘要「P1 提示(未验证)」段按文件 / 行号列出,封顶 10 条 | 否 | 是 |
|
|
28
28
|
|
|
29
|
+
### MR 摘要布局(1.4.1 起)
|
|
30
|
+
|
|
31
|
+
摘要只写一条 note、每次运行原地更新,从上到下:
|
|
32
|
+
|
|
33
|
+
1. 结论标题(`## ✅ PASSED` / `## ⚠️ ACTION REQUIRED`)→ 一句话结论带各级别计数 → 引用块:评审范围(首轮 / 增量 + commit 区间 + 变更规模 + 送审文件数),增量运行再加「较上次:修复 / 新增 / 待处理 / 人工驳回」→ 验证排除 / 预算耗尽说明(有才显示);
|
|
34
|
+
2. 「概述」(模型,1–2 句)→ 「需修复的 P0」列表(ACTION REQUIRED 时;带 blob 链接,`CI_PROJECT_URL` 缺失时退化为纯文本)→ 「P1 提示 · N 条(模型意见,未经取证验证)」封顶 10 条;
|
|
35
|
+
3. 「合入前检查项」= CLI 按文件路径识别的确定项(数据库迁移 / 数据模型、CI、依赖、部署 / 环境、接口契约 / 规格;迁移含 `UPDATE` / `DELETE` / 破坏性 DDL 时加回滚提示,见 `src/core/summary-compose.ts`)+ 模型补充的横切风险;模型被要求不复述问题清单,不输出受影响文件表(GitLab Changes 页更准)→ `<details>` 折叠的「主要变更」;
|
|
36
|
+
4. 未完整覆盖、敏感代码预警按需追加 → 页脚一行发布策略说明。整条 note 不再有级别表与 `---` 分隔线。
|
|
37
|
+
|
|
29
38
|
验证结论为 `REFUTED` / `UNSURE` / `SKIPPED` 的 finding 以 `SUPPRESSED` 入库:`REFUTED` / `UNSURE` 对同一指纹粘性,
|
|
30
39
|
后续 push 不重验;`SKIPPED`(预算、候选上限、时限没排上)不粘性,下次再报重新验证。
|
|
31
40
|
|
|
@@ -18,11 +18,18 @@ export type AgentStopReason = "submitted" | "max_turns" | "deadline" | "budget_e
|
|
|
18
18
|
export type ToolRunOutcome = string | {
|
|
19
19
|
error: string;
|
|
20
20
|
};
|
|
21
|
+
/**
|
|
22
|
+
* 工具单次调用的上下文。`signal` 是候选截止信号——与中断进行中 API 请求的是同一个
|
|
23
|
+
* AbortController,由 Tool Runner 透传到每次工具调用;工具据此终止自己的子进程。
|
|
24
|
+
*/
|
|
25
|
+
export interface ToolRunContext {
|
|
26
|
+
signal?: AbortSignal;
|
|
27
|
+
}
|
|
21
28
|
export interface AgentTool<Schema extends z.ZodType = z.ZodType> {
|
|
22
29
|
name: string;
|
|
23
30
|
description: string;
|
|
24
31
|
inputSchema: Schema;
|
|
25
|
-
run: (input: z.infer<Schema
|
|
32
|
+
run: (input: z.infer<Schema>, context?: ToolRunContext) => Promise<ToolRunOutcome> | ToolRunOutcome;
|
|
26
33
|
/** 收口工具:schema strict,模型调用它即为提交结论并结束运行(不执行 run) */
|
|
27
34
|
submit?: boolean;
|
|
28
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runtime.d.ts","sourceRoot":"","sources":["../../src/core/agent-runtime.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAExD;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,eAAe,GACvB,WAAW,GACX,WAAW,GACX,UAAU,GACV,iBAAiB,GACjB,OAAO,CAAC;AAEZ,kEAAkE;AAClE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,MAAM,WAAW,SAAS,CAAC,MAAM,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"agent-runtime.d.ts","sourceRoot":"","sources":["../../src/core/agent-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,10 +61,11 @@ function toRunnableTool(tool) {
|
|
|
61
61
|
name: tool.name,
|
|
62
62
|
description: tool.description,
|
|
63
63
|
inputSchema: tool.inputSchema,
|
|
64
|
-
run: async (input) => {
|
|
64
|
+
run: async (input, context) => {
|
|
65
65
|
if (tool.submit)
|
|
66
66
|
return "结论已收到。";
|
|
67
|
-
|
|
67
|
+
// Tool Runner 把 toolRunner 选项里的 signal(候选截止)作为 context 传入每次工具调用
|
|
68
|
+
const outcome = await tool.run(input, { signal: context?.signal ?? undefined });
|
|
68
69
|
if (typeof outcome === "string")
|
|
69
70
|
return outcome;
|
|
70
71
|
throw new ToolError_1.ToolError(outcome.error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runtime.js","sourceRoot":"","sources":["../../src/core/agent-runtime.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"agent-runtime.js","sourceRoot":"","sources":["../../src/core/agent-runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/core/prompt.d.ts
CHANGED
|
@@ -27,6 +27,7 @@ export declare class PromptBuilder {
|
|
|
27
27
|
export declare class SummaryPromptBuilder {
|
|
28
28
|
private digest;
|
|
29
29
|
private findings;
|
|
30
|
+
private checklist;
|
|
30
31
|
/**
|
|
31
32
|
* 摘要以「变更文件清单 + 增删行统计」为输入,而不是整份 diff。
|
|
32
33
|
*
|
|
@@ -37,6 +38,8 @@ export declare class SummaryPromptBuilder {
|
|
|
37
38
|
setDigest(digest: DiffDigest): this;
|
|
38
39
|
/** 本次评审已产出的 findings:让摘要能点出风险,而不必重读源码 */
|
|
39
40
|
setFindings(findings: AIComment[]): this;
|
|
41
|
+
/** CLI 按文件路径识别出的合入前检查项:已在摘要里渲染,模型只补充、不重复 */
|
|
42
|
+
setChecklist(items: string[]): this;
|
|
40
43
|
buildSystem(): string;
|
|
41
44
|
buildUser(): string;
|
|
42
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/core/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAgBlD,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,gBAAgB,CAAwB;IAEhD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK3B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAKhC,mDAAmD;IACnD,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAKvC,0DAA0D;IAC1D,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKvC,8BAA8B;IAC9B,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKtC,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI;IAKpD;;;OAGG;IACH,WAAW,IAAI,MAAM;IAgCrB,SAAS,IAAI,MAAM;CAqCpB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAA6D;IAC3E,OAAO,CAAC,QAAQ,CAAmB;
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/core/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAgBlD,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,gBAAgB,CAAwB;IAEhD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK3B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAKhC,mDAAmD;IACnD,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAKvC,0DAA0D;IAC1D,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKvC,8BAA8B;IAC9B,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKtC,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI;IAKpD;;;OAGG;IACH,WAAW,IAAI,MAAM;IAgCrB,SAAS,IAAI,MAAM;CAqCpB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAA6D;IAC3E,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,SAAS,CAAgB;IAEjC;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAKnC,yCAAyC;IACzC,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI;IAKxC,4CAA4C;IAC5C,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAMnC,WAAW,IAAI,MAAM;IAqBrB,SAAS,IAAI,MAAM;CA0CpB"}
|
package/dist/core/prompt.js
CHANGED
|
@@ -112,6 +112,7 @@ class SummaryPromptBuilder {
|
|
|
112
112
|
constructor() {
|
|
113
113
|
this.digest = { files: [], totalAdded: 0, totalRemoved: 0 };
|
|
114
114
|
this.findings = [];
|
|
115
|
+
this.checklist = [];
|
|
115
116
|
}
|
|
116
117
|
/**
|
|
117
118
|
* 摘要以「变更文件清单 + 增删行统计」为输入,而不是整份 diff。
|
|
@@ -129,27 +130,30 @@ class SummaryPromptBuilder {
|
|
|
129
130
|
this.findings = findings;
|
|
130
131
|
return this;
|
|
131
132
|
}
|
|
133
|
+
/** CLI 按文件路径识别出的合入前检查项:已在摘要里渲染,模型只补充、不重复 */
|
|
134
|
+
setChecklist(items) {
|
|
135
|
+
this.checklist = items;
|
|
136
|
+
return this;
|
|
137
|
+
}
|
|
132
138
|
// 固定指令集中于 system(与评审 prompt 同一缓存策略)
|
|
133
139
|
buildSystem() {
|
|
134
140
|
return [
|
|
135
141
|
"你是一位资深开发工程师,擅长分析代码改动并生成清晰的技术摘要。",
|
|
136
|
-
"
|
|
142
|
+
"你会收到本次改动的【变更文件清单与增删行统计】、【本次代码审查已发现的问题】与【已自动识别的检查项】,",
|
|
137
143
|
"而不是完整 diff。请据此推断改动意图并生成中文 Markdown 汇总报告。",
|
|
138
144
|
"对无法从文件清单确定的细节,用概括性描述,不要臆造具体实现。",
|
|
139
145
|
"必须直接输出纯 Markdown 文本,不要返回 JSON,不要用代码块包裹。",
|
|
140
146
|
"",
|
|
141
|
-
"
|
|
147
|
+
"报告只包含以下三段,不要增加其它段落(尤其不要列受影响文件表,GitLab 已有):",
|
|
142
148
|
"## 概述",
|
|
143
149
|
"用 1-2 句话说明整体目的和范围。",
|
|
144
150
|
"",
|
|
145
151
|
"## 主要变更",
|
|
146
|
-
"
|
|
152
|
+
"按目录/模块归纳这次改了哪些部分,说明各自的可能意图;最多 6 条。",
|
|
147
153
|
"",
|
|
148
|
-
"##
|
|
149
|
-
"
|
|
150
|
-
"",
|
|
151
|
-
"## 注意事项",
|
|
152
|
-
"结合已发现的问题列出需要关注的风险;没有则写\u201C无\u201D。",
|
|
154
|
+
"## 合入前检查项",
|
|
155
|
+
"只列无法落到某一行代码的横切风险:数据迁移与回滚、配置或环境变量、对外接口契约、兼容与发布顺序、大幅重构需要回归的链路。",
|
|
156
|
+
"【本次代码审查已发现的问题】已在报告其它部分逐条列出,不要复述;【已自动识别的检查项】也不要重复,只补充它们带来的风险。没有则只写\u201C无\u201D。",
|
|
153
157
|
].join("\n");
|
|
154
158
|
}
|
|
155
159
|
buildUser() {
|
|
@@ -169,11 +173,14 @@ class SummaryPromptBuilder {
|
|
|
169
173
|
}
|
|
170
174
|
if (this.findings.length > 0) {
|
|
171
175
|
const shownFindings = this.findings.slice(0, MAX_SUMMARY_FINDINGS);
|
|
172
|
-
parts.push("", "
|
|
176
|
+
parts.push("", "本次代码审查已发现的问题(已在报告中逐条列出,仅供判断横切风险,不要复述):", ...shownFindings.map((c) => `- [${c.severity}] ${c.file}:${c.line} ${c.message}`));
|
|
173
177
|
if (this.findings.length > shownFindings.length) {
|
|
174
178
|
parts.push(`- …另有 ${this.findings.length - shownFindings.length} 条`);
|
|
175
179
|
}
|
|
176
180
|
}
|
|
181
|
+
if (this.checklist.length > 0) {
|
|
182
|
+
parts.push("", "已自动识别的检查项(已在报告中列出,不要重复):", ...this.checklist.map((item) => `- ${item}`));
|
|
183
|
+
}
|
|
177
184
|
return parts.join("\n");
|
|
178
185
|
}
|
|
179
186
|
}
|
package/dist/core/prompt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/core/prompt.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/core/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import type { AIComment, CodeReviewConfig } from "../types";
|
|
2
2
|
/**
|
|
3
3
|
* @param findings 本次评审已产出的评论;让摘要能点出风险而无需重读源码
|
|
4
|
+
* @param options.checklist CLI 已识别的合入前检查项;喂给模型避免重复
|
|
4
5
|
*/
|
|
5
|
-
export declare function generateSummary(diff: string, config: CodeReviewConfig, findings?: AIComment[]
|
|
6
|
+
export declare function generateSummary(diff: string, config: CodeReviewConfig, findings?: AIComment[], options?: {
|
|
7
|
+
checklist?: string[];
|
|
8
|
+
}): Promise<string | null>;
|
|
6
9
|
//# sourceMappingURL=summarizer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../../src/core/summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AA8B5D
|
|
1
|
+
{"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../../src/core/summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AA8B5D;;;GAGG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,EACxB,QAAQ,GAAE,SAAS,EAAO,EAC1B,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GACrC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsBxB"}
|
package/dist/core/summarizer.js
CHANGED
|
@@ -36,8 +36,9 @@ function cleanMarkdownResponse(content) {
|
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
38
|
* @param findings 本次评审已产出的评论;让摘要能点出风险而无需重读源码
|
|
39
|
+
* @param options.checklist CLI 已识别的合入前检查项;喂给模型避免重复
|
|
39
40
|
*/
|
|
40
|
-
async function generateSummary(diff, config, findings = []) {
|
|
41
|
+
async function generateSummary(diff, config, findings = [], options = {}) {
|
|
41
42
|
const effectiveDiff = (0, diff_1.filterDiffByIgnore)(diff, config.ignore);
|
|
42
43
|
if (!effectiveDiff.trim())
|
|
43
44
|
return null;
|
|
@@ -47,7 +48,8 @@ async function generateSummary(diff, config, findings = []) {
|
|
|
47
48
|
// 输入是文件清单与增删统计,不是整份 diff:摘要调用的体量与 diff 总量解耦
|
|
48
49
|
const prompt = new prompt_1.SummaryPromptBuilder()
|
|
49
50
|
.setDigest((0, diff_1.summarizeDiffFiles)(effectiveDiff))
|
|
50
|
-
.setFindings(findings)
|
|
51
|
+
.setFindings(findings)
|
|
52
|
+
.setChecklist(options.checklist ?? []);
|
|
51
53
|
const raw = await adapter.call(config.ai.model, prompt.buildSystem(), prompt.buildUser(), { purpose: "summary" });
|
|
52
54
|
return raw ? cleanMarkdownResponse(raw) : null;
|
|
53
55
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../../src/core/summarizer.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../../src/core/summarizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { ReconcileResult } from "./incremental";
|
|
2
|
+
/**
|
|
3
|
+
* MR 摘要的「整合布局」(2026-10-21 用户拍板):
|
|
4
|
+
* - 头部一行评审范围(首轮 / 增量 + commit 区间 + 变更规模 + 送审文件数),增量运行再加一行相对上次的变化;
|
|
5
|
+
* - 行级问题只出现一次且只由 CLI 生成(P0 列表 / P1 汇总),模型不复述;
|
|
6
|
+
* - 模型输出只保留「概述」「主要变更」「合入前检查项」,「受影响文件」表去掉(GitLab Changes 页更准);
|
|
7
|
+
* - 「合入前检查项」= CLI 按文件路径识别的确定项 + 模型补充的横切风险;「主要变更」折叠。
|
|
8
|
+
* 段落顺序:结论与计数 → 范围 / 较上次 → 概述 → 需修复的 P0 → P1 提示 → 合入前检查项 → 主要变更。
|
|
9
|
+
*/
|
|
10
|
+
export interface ReviewScopeInfo {
|
|
11
|
+
/** baseline = 首轮全量;incremental = 平台已有 lastReviewedSha;stateless = 平台快照不可用 */
|
|
12
|
+
mode: "baseline" | "incremental" | "stateless";
|
|
13
|
+
/** 上次评审到的 commit(增量运行) */
|
|
14
|
+
fromSha?: string | null;
|
|
15
|
+
/** 本次流水线 head */
|
|
16
|
+
toSha?: string | null;
|
|
17
|
+
/** 整份 MR diff 的文件数与增删行(含被忽略的文件) */
|
|
18
|
+
changedFiles: number;
|
|
19
|
+
added: number;
|
|
20
|
+
removed: number;
|
|
21
|
+
/** 实际送审的文件数(coverage.reviewedFiles) */
|
|
22
|
+
reviewedFiles?: number;
|
|
23
|
+
}
|
|
24
|
+
/** 相对上次评审的 finding 变化(只在增量运行展示) */
|
|
25
|
+
export interface ReviewDeltaInfo {
|
|
26
|
+
new: number;
|
|
27
|
+
fixed: number;
|
|
28
|
+
open: number;
|
|
29
|
+
wontFix: number;
|
|
30
|
+
}
|
|
31
|
+
/** 行级条目的链接基址:GitLab 项目地址 + 本次评审的 commit,缺任一则退化为纯文本 */
|
|
32
|
+
export interface SummaryLinkBase {
|
|
33
|
+
projectUrl?: string | null;
|
|
34
|
+
sha?: string | null;
|
|
35
|
+
}
|
|
36
|
+
export declare function shortSha(sha: string | null | undefined): string | null;
|
|
37
|
+
export declare function buildScopeLine(scope: ReviewScopeInfo): string;
|
|
38
|
+
export declare function buildDeltaLine(delta: ReviewDeltaInfo): string;
|
|
39
|
+
/**
|
|
40
|
+
* 从对账统计派生「相对上次」:
|
|
41
|
+
* - 新增 = 本次新建 − 验证排除(排除的不发布、另有「验证排除 N 条」说明)
|
|
42
|
+
* - 修复 = fixed − severity 迁移(迁移是换键,不是修复)
|
|
43
|
+
* - 仍待处理 = 保活的已知 finding − 复核判定已修复的
|
|
44
|
+
*/
|
|
45
|
+
export declare function buildReviewDelta(stats: ReconcileResult["stats"]): ReviewDeltaInfo;
|
|
46
|
+
/** `file:line`,能拼出 blob 链接时指向本次评审 commit 上的那一行 */
|
|
47
|
+
export declare function fileRef(file: string, line: number, links?: SummaryLinkBase): string;
|
|
48
|
+
/** 按文件收集 diff 里的新增行(不含 `+++` 头),只用于迁移文件的风险判断 */
|
|
49
|
+
export declare function addedLinesByFile(diff: string): Map<string, string[]>;
|
|
50
|
+
/**
|
|
51
|
+
* 从变更文件清单识别需要人工确认的合入 / 发布事项。规则跨语言、只看路径(迁移文件另看新增行),
|
|
52
|
+
* 结果稳定可测;模型只在这之上补充判断性的条目。
|
|
53
|
+
*/
|
|
54
|
+
export declare function detectMergeChecklist(files: string[], diff?: string): string[];
|
|
55
|
+
/** 模型写的检查项规整为「- 」列表;写「无」视为空 */
|
|
56
|
+
export declare function normalizeChecklistItems(body: string | null): string[];
|
|
57
|
+
/** 模型摘要的解析结果:概述、折叠展示的主要变更、规整后的检查项 */
|
|
58
|
+
export interface ModelSummary {
|
|
59
|
+
overview: string | null;
|
|
60
|
+
changes: string | null;
|
|
61
|
+
/** 已规整为「- 」列表的模型补充检查项;模型写「无」为空 */
|
|
62
|
+
checklist: string[];
|
|
63
|
+
/** 是否按约定结构解析成功;失败时整段当概述保留,不丢内容 */
|
|
64
|
+
recognized: boolean;
|
|
65
|
+
}
|
|
66
|
+
/** 按二级标题拆模型输出;「受影响文件」段丢弃;空输出返回 null */
|
|
67
|
+
export declare function parseModelSummary(markdown: string | null | undefined): ModelSummary | null;
|
|
68
|
+
//# sourceMappingURL=summary-compose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary-compose.d.ts","sourceRoot":"","sources":["../../src/core/summary-compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD;;;;;;;GAOG;AAEH,MAAM,WAAW,eAAe;IAC9B,6EAA6E;IAC7E,IAAI,EAAE,UAAU,GAAG,aAAa,GAAG,WAAW,CAAC;IAC/C,0BAA0B;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,mCAAmC;AACnC,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,sDAAsD;AACtD,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAGtE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAe7D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAI7D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,eAAe,CAQjF;AAED,kDAAkD;AAClD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,eAAe,GAAG,MAAM,CAMnF;AAuBD,gDAAgD;AAChD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAgBpE;AAOD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,SAAK,GAAG,MAAM,EAAE,CAyBzE;AA6CD,+BAA+B;AAC/B,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,CAiBrE;AAED,qCAAqC;AACrC,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,kCAAkC;IAClC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kCAAkC;IAClC,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,uCAAuC;AACvC,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,YAAY,GAAG,IAAI,CAa1F"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.shortSha = shortSha;
|
|
4
|
+
exports.buildScopeLine = buildScopeLine;
|
|
5
|
+
exports.buildDeltaLine = buildDeltaLine;
|
|
6
|
+
exports.buildReviewDelta = buildReviewDelta;
|
|
7
|
+
exports.fileRef = fileRef;
|
|
8
|
+
exports.addedLinesByFile = addedLinesByFile;
|
|
9
|
+
exports.detectMergeChecklist = detectMergeChecklist;
|
|
10
|
+
exports.normalizeChecklistItems = normalizeChecklistItems;
|
|
11
|
+
exports.parseModelSummary = parseModelSummary;
|
|
12
|
+
function shortSha(sha) {
|
|
13
|
+
const trimmed = sha?.trim();
|
|
14
|
+
return trimmed ? trimmed.slice(0, 8) : null;
|
|
15
|
+
}
|
|
16
|
+
function buildScopeLine(scope) {
|
|
17
|
+
const to = shortSha(scope.toSha);
|
|
18
|
+
const from = shortSha(scope.fromSha);
|
|
19
|
+
let range;
|
|
20
|
+
if (scope.mode === "incremental" && from) {
|
|
21
|
+
range = `增量评审 ${from} → ${to ?? "HEAD"}`;
|
|
22
|
+
}
|
|
23
|
+
else if (scope.mode === "baseline") {
|
|
24
|
+
range = to ? `首轮评审(至 ${to})` : "首轮评审";
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
range = to ? `评审(至 ${to},未对接平台历史)` : "评审(未对接平台历史)";
|
|
28
|
+
}
|
|
29
|
+
const size = `变更 ${scope.changedFiles} 个文件(+${scope.added} / −${scope.removed})`;
|
|
30
|
+
const reviewed = typeof scope.reviewedFiles === "number" ? `,送审 ${scope.reviewedFiles} 个` : "";
|
|
31
|
+
return `${range} · ${size}${reviewed}`;
|
|
32
|
+
}
|
|
33
|
+
function buildDeltaLine(delta) {
|
|
34
|
+
const parts = [`修复 ${delta.fixed}`, `新增 ${delta.new}`, `待处理 ${delta.open}`];
|
|
35
|
+
if (delta.wontFix > 0)
|
|
36
|
+
parts.push(`人工驳回 ${delta.wontFix}`);
|
|
37
|
+
return `较上次:${parts.join(" · ")}`;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 从对账统计派生「相对上次」:
|
|
41
|
+
* - 新增 = 本次新建 − 验证排除(排除的不发布、另有「验证排除 N 条」说明)
|
|
42
|
+
* - 修复 = fixed − severity 迁移(迁移是换键,不是修复)
|
|
43
|
+
* - 仍待处理 = 保活的已知 finding − 复核判定已修复的
|
|
44
|
+
*/
|
|
45
|
+
function buildReviewDelta(stats) {
|
|
46
|
+
const nonNegative = (n) => (n > 0 ? n : 0);
|
|
47
|
+
return {
|
|
48
|
+
new: nonNegative(stats.new - stats.suppressed),
|
|
49
|
+
fixed: nonNegative(stats.fixed - stats.severityMigrated),
|
|
50
|
+
open: nonNegative(stats.kept - stats.revalidatedFixed),
|
|
51
|
+
wontFix: stats.wontFix,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** `file:line`,能拼出 blob 链接时指向本次评审 commit 上的那一行 */
|
|
55
|
+
function fileRef(file, line, links) {
|
|
56
|
+
const label = `\`${file}:${line}\``;
|
|
57
|
+
const base = links?.projectUrl?.trim().replace(/\/+$/, "");
|
|
58
|
+
const sha = links?.sha?.trim();
|
|
59
|
+
if (!base || !sha)
|
|
60
|
+
return label;
|
|
61
|
+
return `[${label}](${base}/-/blob/${sha}/${encodeURI(file)}#L${line})`;
|
|
62
|
+
}
|
|
63
|
+
// ───────────────────────── 合入前检查项(确定性规则) ─────────────────────────
|
|
64
|
+
const MIGRATION_DIR_RE = /(^|\/)(migrations?|db\/migrate|flyway|liquibase)\//i;
|
|
65
|
+
const MIGRATION_FILE_RE = /\.(sql|ts|js|mjs|cjs|py|rb|xml|ya?ml|kt|java|go)$/i;
|
|
66
|
+
const DATA_MODEL_RE = /(^|\/)schema\.prisma$/;
|
|
67
|
+
const CI_RE = /(^|\/)(\.gitlab-ci\.ya?ml|\.gitlab\/.*|ci-templates\/.*|Jenkinsfile[^/]*|\.github\/workflows\/.*|\.circleci\/.*)$/;
|
|
68
|
+
const DEPS_RE = /(^|\/)(package\.json|package-lock\.json|pnpm-lock\.yaml|yarn\.lock|go\.mod|go\.sum|pom\.xml|build\.gradle(\.kts)?|settings\.gradle(\.kts)?|gradle\/libs\.versions\.toml|Podfile|Podfile\.lock|Package\.swift|Package\.resolved|Cartfile(\.resolved)?|requirements[^/]*\.txt|pyproject\.toml|poetry\.lock|Cargo\.toml|Cargo\.lock|Gemfile(\.lock)?|composer\.(json|lock))$/;
|
|
69
|
+
const DEPLOY_RE = /(^|\/)(\.env(\.[^/]+)?|Dockerfile[^/]*|docker-compose[^/]*\.ya?ml|(k8s|kubernetes|helm|deploy|deployment)\/.*)$/i;
|
|
70
|
+
const CONTRACT_RE = /(^|\/)(openapi[^/]*\.(ya?ml|json)|swagger[^/]*\.(ya?ml|json)|[^/]*\.proto|schema\.graphql|openspec\/specs\/.*)$/i;
|
|
71
|
+
/** 存量数据修改或破坏性 DDL:这些迁移不能只靠「再跑一次」回滚 */
|
|
72
|
+
const DATA_CHANGE_RE = /\b(UPDATE\s+\S+\s+SET|DELETE\s+FROM|TRUNCATE\s+(TABLE\s+)?\S+|DROP\s+(TABLE|COLUMN|INDEX)|ALTER\s+TABLE\s+\S+\s+(DROP|MODIFY|CHANGE|RENAME))\b/i;
|
|
73
|
+
function isMigrationFile(file) {
|
|
74
|
+
return (MIGRATION_DIR_RE.test(file) && MIGRATION_FILE_RE.test(file)) || DATA_MODEL_RE.test(file);
|
|
75
|
+
}
|
|
76
|
+
/** 按文件收集 diff 里的新增行(不含 `+++` 头),只用于迁移文件的风险判断 */
|
|
77
|
+
function addedLinesByFile(diff) {
|
|
78
|
+
const out = new Map();
|
|
79
|
+
let current = null;
|
|
80
|
+
for (const line of diff.split("\n")) {
|
|
81
|
+
const header = /^diff --git a\/(.+?) b\/(.+)$/.exec(line);
|
|
82
|
+
if (header) {
|
|
83
|
+
current = header[2];
|
|
84
|
+
if (!out.has(current))
|
|
85
|
+
out.set(current, []);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (!current)
|
|
89
|
+
continue;
|
|
90
|
+
if (line.startsWith("+") && !line.startsWith("+++")) {
|
|
91
|
+
out.get(current).push(line.slice(1));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
function listFiles(files, max = 3) {
|
|
97
|
+
const shown = files.slice(0, max).map((f) => `\`${f}\``);
|
|
98
|
+
return files.length > max ? `${shown.join("、")} 等 ${files.length} 个` : shown.join("、");
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 从变更文件清单识别需要人工确认的合入 / 发布事项。规则跨语言、只看路径(迁移文件另看新增行),
|
|
102
|
+
* 结果稳定可测;模型只在这之上补充判断性的条目。
|
|
103
|
+
*/
|
|
104
|
+
function detectMergeChecklist(files, diff = "") {
|
|
105
|
+
const items = [];
|
|
106
|
+
const unique = [...new Set(files)];
|
|
107
|
+
const migrations = unique.filter(isMigrationFile);
|
|
108
|
+
if (migrations.length > 0) {
|
|
109
|
+
const added = addedLinesByFile(diff);
|
|
110
|
+
const risky = migrations.some((f) => (added.get(f) ?? []).some((line) => DATA_CHANGE_RE.test(line)));
|
|
111
|
+
items.push(`数据库迁移 / 数据模型变更:${listFiles(migrations)}${risky ? ";含存量数据修改或破坏性 DDL,确认可回滚与上线顺序" : ""}`);
|
|
112
|
+
}
|
|
113
|
+
const ci = unique.filter((f) => CI_RE.test(f));
|
|
114
|
+
if (ci.length > 0)
|
|
115
|
+
items.push(`CI / 流水线配置变更:${listFiles(ci)}`);
|
|
116
|
+
const deps = unique.filter((f) => DEPS_RE.test(f));
|
|
117
|
+
if (deps.length > 0)
|
|
118
|
+
items.push(`依赖变更:${listFiles(deps)}`);
|
|
119
|
+
const deploy = unique.filter((f) => DEPLOY_RE.test(f));
|
|
120
|
+
if (deploy.length > 0)
|
|
121
|
+
items.push(`部署 / 环境配置变更:${listFiles(deploy)}`);
|
|
122
|
+
const contracts = unique.filter((f) => CONTRACT_RE.test(f));
|
|
123
|
+
if (contracts.length > 0)
|
|
124
|
+
items.push(`接口契约 / 规格变更:${listFiles(contracts)}`);
|
|
125
|
+
return items;
|
|
126
|
+
}
|
|
127
|
+
function normalizeTitle(raw) {
|
|
128
|
+
return raw.replace(/^[^\p{L}\p{N}]+/u, "").trim();
|
|
129
|
+
}
|
|
130
|
+
/** 只按二级标题切分;三级标题属于所在段落的正文 */
|
|
131
|
+
function splitSections(markdown) {
|
|
132
|
+
const result = { overview: null, changes: null, checklist: null, recognized: false };
|
|
133
|
+
let currentKey = null;
|
|
134
|
+
const buffers = { overview: [], changes: [], checklist: [] };
|
|
135
|
+
for (const line of markdown.split("\n")) {
|
|
136
|
+
const heading = /^##\s+(.+?)\s*$/.exec(line);
|
|
137
|
+
if (heading) {
|
|
138
|
+
const title = normalizeTitle(heading[1]);
|
|
139
|
+
if (title.includes("概述"))
|
|
140
|
+
currentKey = "overview";
|
|
141
|
+
else if (title.includes("主要变更"))
|
|
142
|
+
currentKey = "changes";
|
|
143
|
+
else if (title.includes("合入前检查项") || title.includes("注意事项"))
|
|
144
|
+
currentKey = "checklist";
|
|
145
|
+
else
|
|
146
|
+
currentKey = "ignored";
|
|
147
|
+
if (currentKey !== "ignored")
|
|
148
|
+
result.recognized = true;
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (currentKey && currentKey !== "ignored")
|
|
152
|
+
buffers[currentKey].push(line);
|
|
153
|
+
}
|
|
154
|
+
const body = (lines) => {
|
|
155
|
+
const text = lines.join("\n").trim();
|
|
156
|
+
return text ? text : null;
|
|
157
|
+
};
|
|
158
|
+
result.overview = body(buffers.overview);
|
|
159
|
+
result.changes = body(buffers.changes);
|
|
160
|
+
result.checklist = body(buffers.checklist);
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
const EMPTY_CHECKLIST_RE = /^[\s\-*•]*(无|没有|无。|none|n\/a)[\s。.]*$/i;
|
|
164
|
+
/** 模型写的检查项规整为「- 」列表;写「无」视为空 */
|
|
165
|
+
function normalizeChecklistItems(body) {
|
|
166
|
+
if (!body)
|
|
167
|
+
return [];
|
|
168
|
+
if (EMPTY_CHECKLIST_RE.test(body.trim()))
|
|
169
|
+
return [];
|
|
170
|
+
const items = [];
|
|
171
|
+
for (const raw of body.split("\n")) {
|
|
172
|
+
if (!raw.trim())
|
|
173
|
+
continue;
|
|
174
|
+
const indented = /^\s+[-*•]\s+/.test(raw);
|
|
175
|
+
if (indented) {
|
|
176
|
+
items.push(raw.replace(/^\s+[-*•]\s+/, " - "));
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const line = raw.trim();
|
|
180
|
+
if (/^\d+[.、)]\s+/.test(line))
|
|
181
|
+
items.push(`- ${line.replace(/^\d+[.、)]\s+/, "")}`);
|
|
182
|
+
else if (/^[-*•]\s+/.test(line))
|
|
183
|
+
items.push(`- ${line.replace(/^[-*•]\s+/, "")}`);
|
|
184
|
+
else
|
|
185
|
+
items.push(`- ${line}`);
|
|
186
|
+
}
|
|
187
|
+
return items;
|
|
188
|
+
}
|
|
189
|
+
/** 按二级标题拆模型输出;「受影响文件」段丢弃;空输出返回 null */
|
|
190
|
+
function parseModelSummary(markdown) {
|
|
191
|
+
const raw = markdown?.trim() ?? "";
|
|
192
|
+
if (!raw)
|
|
193
|
+
return null;
|
|
194
|
+
const sections = splitSections(raw);
|
|
195
|
+
if (!sections.recognized) {
|
|
196
|
+
return { overview: raw, changes: null, checklist: [], recognized: false };
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
overview: sections.overview,
|
|
200
|
+
changes: sections.changes,
|
|
201
|
+
checklist: normalizeChecklistItems(sections.checklist),
|
|
202
|
+
recognized: true,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=summary-compose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary-compose.js","sourceRoot":"","sources":["../../src/core/summary-compose.ts"],"names":[],"mappings":";;AAwCA,4BAGC;AAED,wCAeC;AAED,wCAIC;AAQD,4CAQC;AAGD,0BAMC;AAwBD,4CAgBC;AAWD,oDAyBC;AA8CD,0DAiBC;AAaD,8CAaC;AAxND,SAAgB,QAAQ,CAAC,GAA8B;IACrD,MAAM,OAAO,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;IAC5B,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAED,SAAgB,cAAc,CAAC,KAAsB;IACnD,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,KAAa,CAAC;IAClB,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,IAAI,EAAE,CAAC;QACzC,KAAK,GAAG,QAAQ,IAAI,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;IAC3C,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACrC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC;IACrD,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,YAAY,SAAS,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,CAAC;IACjF,MAAM,QAAQ,GACZ,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,OAAO,GAAG,KAAK,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;AACzC,CAAC;AAED,SAAgB,cAAc,CAAC,KAAsB;IACnD,MAAM,KAAK,GAAG,CAAC,MAAM,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5E,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3D,OAAO,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AACpC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,KAA+B;IAC9D,MAAM,WAAW,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO;QACL,GAAG,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC;QAC9C,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,gBAAgB,CAAC;QACxD,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,gBAAgB,CAAC;QACtD,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;AACJ,CAAC;AAED,kDAAkD;AAClD,SAAgB,OAAO,CAAC,IAAY,EAAE,IAAY,EAAE,KAAuB;IACzE,MAAM,KAAK,GAAG,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC;IACpC,MAAM,IAAI,GAAG,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IAChC,OAAO,IAAI,KAAK,KAAK,IAAI,WAAW,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;AACzE,CAAC;AAED,oEAAoE;AAEpE,MAAM,gBAAgB,GAAG,qDAAqD,CAAC;AAC/E,MAAM,iBAAiB,GAAG,oDAAoD,CAAC;AAC/E,MAAM,aAAa,GAAG,uBAAuB,CAAC;AAC9C,MAAM,KAAK,GACT,mHAAmH,CAAC;AACtH,MAAM,OAAO,GACX,2WAA2W,CAAC;AAC9W,MAAM,SAAS,GACb,kHAAkH,CAAC;AACrH,MAAM,WAAW,GACf,kHAAkH,CAAC;AACrH,sCAAsC;AACtC,MAAM,cAAc,GAClB,iJAAiJ,CAAC;AAEpJ,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnG,CAAC;AAED,gDAAgD;AAChD,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB,CAAC;IACxC,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC5C,SAAS;QACX,CAAC;QACD,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,GAAG,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,SAAS,CAAC,KAAe,EAAE,GAAG,GAAG,CAAC;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzF,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,KAAe,EAAE,IAAI,GAAG,EAAE;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAEnC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAClD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAClC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAC/D,CAAC;QACF,KAAK,CAAC,IAAI,CACR,kBAAkB,SAAS,CAAC,UAAU,CAAC,GACrC,KAAK,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAC1C,EAAE,CACH,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,eAAe,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,eAAe,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC5E,OAAO,KAAK,CAAC;AACf,CAAC;AAWD,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACpD,CAAC;AAED,6BAA6B;AAC7B,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,MAAM,GAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACrG,IAAI,UAAU,GAAgE,IAAI,CAAC;IACnF,MAAM,OAAO,GAA6B,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IACvF,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,UAAU,GAAG,UAAU,CAAC;iBAC7C,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,UAAU,GAAG,SAAS,CAAC;iBACnD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,UAAU,GAAG,WAAW,CAAC;;gBACjF,UAAU,GAAG,SAAS,CAAC;YAC5B,IAAI,UAAU,KAAK,SAAS;gBAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;YACvD,SAAS;QACX,CAAC;QACD,IAAI,UAAU,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,KAAe,EAAiB,EAAE;QAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5B,CAAC,CAAC;IACF,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,kBAAkB,GAAG,wCAAwC,CAAC;AAEpE,+BAA+B;AAC/B,SAAgB,uBAAuB,CAAC,IAAmB;IACzD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAAE,OAAO,EAAE,CAAC;IACpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;YAAE,SAAS;QAC1B,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;YAChD,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;aAC9E,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;;YAC7E,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAYD,uCAAuC;AACvC,SAAgB,iBAAiB,CAAC,QAAmC;IACnE,MAAM,GAAG,GAAG,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QACzB,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAC5E,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,SAAS,EAAE,uBAAuB,CAAC,QAAQ,CAAC,SAAS,CAAC;QACtD,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC"}
|