soloforge 1.2.2 → 1.2.4
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 +229 -28
- package/dist/adapters/claude_code/tools.d.ts.map +1 -1
- package/dist/adapters/claude_code/tools.js +319 -5
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/adapters/shared/workflow_template.d.ts.map +1 -1
- package/dist/adapters/shared/workflow_template.js +26 -3
- package/dist/adapters/shared/workflow_template.js.map +1 -1
- package/dist/bin/soloforge.js +169 -13
- package/dist/bin/soloforge.js.map +1 -1
- package/dist/engine/audit_pool.d.ts +36 -0
- package/dist/engine/audit_pool.d.ts.map +1 -0
- package/dist/engine/audit_pool.js +83 -0
- package/dist/engine/audit_pool.js.map +1 -0
- package/dist/engine/audit_sampler.d.ts +15 -0
- package/dist/engine/audit_sampler.d.ts.map +1 -0
- package/dist/engine/audit_sampler.js +26 -0
- package/dist/engine/audit_sampler.js.map +1 -0
- package/dist/engine/capability_action_advisor.d.ts +24 -0
- package/dist/engine/capability_action_advisor.d.ts.map +1 -0
- package/dist/engine/capability_action_advisor.js +147 -0
- package/dist/engine/capability_action_advisor.js.map +1 -0
- package/dist/engine/capability_registry.d.ts +23 -1
- package/dist/engine/capability_registry.d.ts.map +1 -1
- package/dist/engine/capability_registry.js +511 -19
- package/dist/engine/capability_registry.js.map +1 -1
- package/dist/engine/capability_state_store.d.ts +50 -0
- package/dist/engine/capability_state_store.d.ts.map +1 -0
- package/dist/engine/capability_state_store.js +123 -0
- package/dist/engine/capability_state_store.js.map +1 -0
- package/dist/engine/cognitive_anchor.d.ts +59 -0
- package/dist/engine/cognitive_anchor.d.ts.map +1 -0
- package/dist/engine/cognitive_anchor.js +68 -0
- package/dist/engine/cognitive_anchor.js.map +1 -0
- package/dist/engine/conflict_gate.d.ts +36 -0
- package/dist/engine/conflict_gate.d.ts.map +1 -0
- package/dist/engine/conflict_gate.js +73 -0
- package/dist/engine/conflict_gate.js.map +1 -0
- package/dist/engine/decision_contract.d.ts +29 -0
- package/dist/engine/decision_contract.d.ts.map +1 -0
- package/dist/engine/decision_contract.js +41 -0
- package/dist/engine/decision_contract.js.map +1 -0
- package/dist/engine/delivery.d.ts.map +1 -1
- package/dist/engine/delivery.js +83 -0
- package/dist/engine/delivery.js.map +1 -1
- package/dist/engine/developer_sovereignty.d.ts +62 -0
- package/dist/engine/developer_sovereignty.d.ts.map +1 -0
- package/dist/engine/developer_sovereignty.js +134 -0
- package/dist/engine/developer_sovereignty.js.map +1 -0
- package/dist/engine/diff_ownership.d.ts +74 -0
- package/dist/engine/diff_ownership.d.ts.map +1 -0
- package/dist/engine/diff_ownership.js +143 -0
- package/dist/engine/diff_ownership.js.map +1 -0
- package/dist/engine/diff_ownership_store.d.ts +76 -0
- package/dist/engine/diff_ownership_store.d.ts.map +1 -0
- package/dist/engine/diff_ownership_store.js +264 -0
- package/dist/engine/diff_ownership_store.js.map +1 -0
- package/dist/engine/escape_report.d.ts +45 -0
- package/dist/engine/escape_report.d.ts.map +1 -0
- package/dist/engine/escape_report.js +97 -0
- package/dist/engine/escape_report.js.map +1 -0
- package/dist/engine/exploration.d.ts +54 -0
- package/dist/engine/exploration.d.ts.map +1 -1
- package/dist/engine/exploration.js +138 -0
- package/dist/engine/exploration.js.map +1 -1
- package/dist/engine/governance_report.d.ts +36 -0
- package/dist/engine/governance_report.d.ts.map +1 -0
- package/dist/engine/governance_report.js +79 -0
- package/dist/engine/governance_report.js.map +1 -0
- package/dist/engine/java_quality_guard.d.ts +52 -0
- package/dist/engine/java_quality_guard.d.ts.map +1 -0
- package/dist/engine/java_quality_guard.js +237 -0
- package/dist/engine/java_quality_guard.js.map +1 -0
- package/dist/engine/job_manager.d.ts +76 -0
- package/dist/engine/job_manager.d.ts.map +1 -0
- package/dist/engine/job_manager.js +225 -0
- package/dist/engine/job_manager.js.map +1 -0
- package/dist/engine/knowledge_sovereignty.d.ts +61 -0
- package/dist/engine/knowledge_sovereignty.d.ts.map +1 -0
- package/dist/engine/knowledge_sovereignty.js +190 -0
- package/dist/engine/knowledge_sovereignty.js.map +1 -0
- package/dist/engine/mutation_audit.d.ts +43 -0
- package/dist/engine/mutation_audit.d.ts.map +1 -0
- package/dist/engine/mutation_audit.js +118 -0
- package/dist/engine/mutation_audit.js.map +1 -0
- package/dist/engine/policy_drift_detector.d.ts +46 -0
- package/dist/engine/policy_drift_detector.d.ts.map +1 -0
- package/dist/engine/policy_drift_detector.js +181 -0
- package/dist/engine/policy_drift_detector.js.map +1 -0
- package/dist/engine/regression_matrix.d.ts +102 -0
- package/dist/engine/regression_matrix.d.ts.map +1 -0
- package/dist/engine/regression_matrix.js +380 -0
- package/dist/engine/regression_matrix.js.map +1 -0
- package/dist/engine/risk_sampler.d.ts +37 -0
- package/dist/engine/risk_sampler.d.ts.map +1 -0
- package/dist/engine/risk_sampler.js +69 -0
- package/dist/engine/risk_sampler.js.map +1 -0
- package/dist/engine/runtime_safety.d.ts +80 -0
- package/dist/engine/runtime_safety.d.ts.map +1 -0
- package/dist/engine/runtime_safety.js +195 -0
- package/dist/engine/runtime_safety.js.map +1 -0
- package/dist/engine/scope_lease.d.ts +45 -0
- package/dist/engine/scope_lease.d.ts.map +1 -0
- package/dist/engine/scope_lease.js +122 -0
- package/dist/engine/scope_lease.js.map +1 -0
- package/dist/engine/semantic_evidence.d.ts +23 -0
- package/dist/engine/semantic_evidence.d.ts.map +1 -0
- package/dist/engine/semantic_evidence.js +81 -0
- package/dist/engine/semantic_evidence.js.map +1 -0
- package/dist/engine/task_context.d.ts +16 -0
- package/dist/engine/task_context.d.ts.map +1 -1
- package/dist/engine/task_context.js +58 -0
- package/dist/engine/task_context.js.map +1 -1
- package/dist/engine/verifier.d.ts.map +1 -1
- package/dist/engine/verifier.js +22 -1
- package/dist/engine/verifier.js.map +1 -1
- package/dist/engine/workspace_resumer.d.ts +43 -0
- package/dist/engine/workspace_resumer.d.ts.map +1 -1
- package/dist/engine/workspace_resumer.js +119 -4
- package/dist/engine/workspace_resumer.js.map +1 -1
- package/dist/engine/zero_config_init.d.ts +87 -0
- package/dist/engine/zero_config_init.d.ts.map +1 -0
- package/dist/engine/zero_config_init.js +427 -0
- package/dist/engine/zero_config_init.js.map +1 -0
- package/dist/knowledge/index_manager.d.ts +19 -0
- package/dist/knowledge/index_manager.d.ts.map +1 -1
- package/dist/knowledge/index_manager.js +31 -0
- package/dist/knowledge/index_manager.js.map +1 -1
- package/dist/knowledge/writer.d.ts.map +1 -1
- package/dist/knowledge/writer.js +1 -0
- package/dist/knowledge/writer.js.map +1 -1
- package/dist/types.d.ts +61 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/templates/knowledge/patterns/core/Diff/345/275/222/345/261/236/350/277/275/350/270/252.md +47 -0
- package/templates/knowledge/patterns/core/Java/350/264/250/351/207/217/351/227/250/347/246/201.md +46 -0
- package/templates/knowledge/patterns/core/LLM/351/242/204/347/256/227/347/275/221/345/205/263.md +46 -0
- package/templates/knowledge/patterns/core//344/273/273/345/212/241/344/270/212/344/270/213/346/226/207/347/224/237/345/221/275/345/221/250/346/234/237.md +47 -0
- package/templates/knowledge/patterns/core//344/273/273/345/212/241/347/256/241/347/220/206/345/231/250.md +47 -0
- package/templates/knowledge/patterns/core//344/275/234/347/224/250/345/237/237/344/270/216/345/257/206/351/222/245/346/213/246/346/210/252.md +46 -0
- package/templates/knowledge/patterns/core//344/275/234/347/224/250/345/237/237/347/247/237/347/272/246.md +47 -0
- package/templates/knowledge/patterns/core//345/206/262/347/252/201/351/227/250/347/246/201.md +47 -0
- package/templates/knowledge/patterns/core//345/206/263/347/255/226/347/275/221/345/205/263.md +30 -11
- package/templates/knowledge/patterns/core//345/217/230/345/274/202/345/256/241/350/256/241.md +20 -0
- package/templates/knowledge/patterns/core//345/233/236/345/275/222/347/237/251/351/230/265.md +46 -0
- package/templates/knowledge/patterns/core//345/267/245/344/275/234/345/214/272/344/272/222/346/226/245/351/224/201.md +44 -0
- package/templates/knowledge/patterns/core//345/267/245/344/275/234/345/214/272/345/224/244/351/206/222.md +46 -0
- package/templates/knowledge/patterns/core//345/271/266/345/217/221/351/224/201.md +29 -16
- package/templates/knowledge/patterns/core//345/274/200/345/217/221/350/200/205/345/256/252/346/263/225.md +20 -0
- package/templates/knowledge/patterns/core//346/225/217/346/204/237/344/277/241/346/201/257/346/211/253/346/217/217.md +45 -0
- package/templates/knowledge/patterns/core//346/262/273/347/220/206/350/277/220/350/241/214/346/227/266/345/276/252/347/216/257.md +48 -0
- package/templates/knowledge/patterns/core//346/265/201/345/274/217/345/277/203/350/267/263.md +20 -0
- package/templates/knowledge/patterns/core//347/237/245/350/257/206/344/270/273/346/235/203.md +20 -0
- package/templates/knowledge/patterns/core//350/257/255/344/271/211/350/257/201/346/215/256.md +47 -0
- package/templates/knowledge/patterns/core//350/277/220/350/241/214/345/256/211/345/205/250/345/214/205.md +50 -0
- package/templates/knowledge/patterns/core//351/233/266/351/205/215/347/275/256/345/210/235/345/247/213/345/214/226.md +47 -0
- package/templates/knowledge/patterns/core//351/252/214/350/257/201/345/221/275/344/273/244/347/224/237/346/210/220.md +46 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/engine/delivery.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/engine/delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Developer Sovereignty — 交付前 raw diff 展示、证据链、回滚路径、否决入口。
|
|
3
|
+
* R11 advisory: 不 hard block,提供信息供开发者决策。
|
|
4
|
+
*
|
|
5
|
+
* 职责:
|
|
6
|
+
* - preDeliveryReview: 交付前预览(raw diff + 风险摘要 + 证据链 + 回滚命令)
|
|
7
|
+
* - vetoDelivery: 开发者否决入口
|
|
8
|
+
*/
|
|
9
|
+
import type { TaskContext, RequirementPoint } from "../types.js";
|
|
10
|
+
import type { GitOperations } from "./git_deps.js";
|
|
11
|
+
export interface PreDeliveryReview {
|
|
12
|
+
task_id: string;
|
|
13
|
+
/** raw diff 摘要(变更文件列表 + 行数统计) */
|
|
14
|
+
diff_summary: {
|
|
15
|
+
changed_files: string[];
|
|
16
|
+
additions: number;
|
|
17
|
+
deletions: number;
|
|
18
|
+
file_details: Array<{
|
|
19
|
+
file_path: string;
|
|
20
|
+
additions: number;
|
|
21
|
+
deletions: number;
|
|
22
|
+
}>;
|
|
23
|
+
};
|
|
24
|
+
/** 风险摘要 */
|
|
25
|
+
risk_summary: {
|
|
26
|
+
risk_level: "low" | "medium" | "high";
|
|
27
|
+
factors: string[];
|
|
28
|
+
advisory: string;
|
|
29
|
+
};
|
|
30
|
+
/** 证据链(requirement → change → test → evidence) */
|
|
31
|
+
evidence_chain: {
|
|
32
|
+
requirements: RequirementPoint[];
|
|
33
|
+
coverage_summary: string;
|
|
34
|
+
uncovered_points: string[];
|
|
35
|
+
} | null;
|
|
36
|
+
/** 回滚命令 */
|
|
37
|
+
rollback_command: string;
|
|
38
|
+
/** 是否可以交付 */
|
|
39
|
+
can_deliver: boolean;
|
|
40
|
+
/** 阻断原因(can_deliver=false 时) */
|
|
41
|
+
delivery_blockers: string[];
|
|
42
|
+
/** advisory 信息 */
|
|
43
|
+
advisory: string;
|
|
44
|
+
}
|
|
45
|
+
export interface VetoResult {
|
|
46
|
+
vetoed: boolean;
|
|
47
|
+
task_id: string;
|
|
48
|
+
reason: string;
|
|
49
|
+
timestamp: string;
|
|
50
|
+
advisory: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 交付前预览 — 收集 raw diff、风险摘要、证据链、回滚命令。
|
|
54
|
+
* 使用 git_deps.GitOperations 获取真实 diff 统计和 commit/branch 信息。
|
|
55
|
+
*/
|
|
56
|
+
export declare function preDeliveryReview(taskContext: TaskContext, gitOps: GitOperations, projectPath: string): Promise<PreDeliveryReview>;
|
|
57
|
+
/**
|
|
58
|
+
* 否决交付 — 开发者行使否决权。
|
|
59
|
+
* 返回 VetoResult 记录否决事件,不修改任何状态。
|
|
60
|
+
*/
|
|
61
|
+
export declare function vetoDelivery(taskId: string, reason: string): VetoResult;
|
|
62
|
+
//# sourceMappingURL=developer_sovereignty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"developer_sovereignty.d.ts","sourceRoot":"","sources":["../../src/engine/developer_sovereignty.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,WAAW,EAEX,gBAAgB,EAEjB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,YAAY,EAAE;QACZ,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,KAAK,CAAC;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAClF,CAAC;IACF,WAAW;IACX,YAAY,EAAE;QACZ,UAAU,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;QACtC,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,kDAAkD;IAClD,cAAc,EAAE;QACd,YAAY,EAAE,gBAAgB,EAAE,CAAC;QACjC,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,EAAE,CAAC;KAC5B,GAAG,IAAI,CAAC;IACT,WAAW;IACX,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,gCAAgC;IAChC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,kBAAkB;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,iBAAiB,CAAC,CAiH5B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,UAAU,CAQZ"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Developer Sovereignty — 交付前 raw diff 展示、证据链、回滚路径、否决入口。
|
|
3
|
+
* R11 advisory: 不 hard block,提供信息供开发者决策。
|
|
4
|
+
*
|
|
5
|
+
* 职责:
|
|
6
|
+
* - preDeliveryReview: 交付前预览(raw diff + 风险摘要 + 证据链 + 回滚命令)
|
|
7
|
+
* - vetoDelivery: 开发者否决入口
|
|
8
|
+
*/
|
|
9
|
+
import { buildDeliveryEvidenceChain } from "./semantic_evidence.js";
|
|
10
|
+
/**
|
|
11
|
+
* 交付前预览 — 收集 raw diff、风险摘要、证据链、回滚命令。
|
|
12
|
+
* 使用 git_deps.GitOperations 获取真实 diff 统计和 commit/branch 信息。
|
|
13
|
+
*/
|
|
14
|
+
export async function preDeliveryReview(taskContext, gitOps, projectPath) {
|
|
15
|
+
const changedFiles = taskContext.execution?.changed_files ?? [];
|
|
16
|
+
const attemptCount = taskContext.execution?.attempt_count ?? 0;
|
|
17
|
+
const failureCount = taskContext.execution?.failure_history?.length ?? 0;
|
|
18
|
+
const risk = taskContext.classification?.risk ?? "low";
|
|
19
|
+
// Diff summary — merge unstaged + cached diffs per file
|
|
20
|
+
const [unstaged, staged] = await Promise.all([
|
|
21
|
+
gitOps.getDiff(projectPath, { cached: false }),
|
|
22
|
+
gitOps.getDiff(projectPath, { cached: true }),
|
|
23
|
+
]);
|
|
24
|
+
const diffFiles = new Set(changedFiles);
|
|
25
|
+
// Merge by file: sum additions/deletions from both sources
|
|
26
|
+
const merged = new Map();
|
|
27
|
+
for (const h of [...unstaged, ...staged]) {
|
|
28
|
+
if (!diffFiles.has(h.file))
|
|
29
|
+
continue;
|
|
30
|
+
const existing = merged.get(h.file);
|
|
31
|
+
if (existing) {
|
|
32
|
+
existing.additions += h.additions;
|
|
33
|
+
existing.deletions += h.deletions;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
merged.set(h.file, { file_path: h.file, additions: h.additions, deletions: h.deletions });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// For changed files not in any diff output, add zero-count entries
|
|
40
|
+
for (const f of changedFiles) {
|
|
41
|
+
if (!merged.has(f)) {
|
|
42
|
+
merged.set(f, { file_path: f, additions: 0, deletions: 0 });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const fileDetails = [...merged.values()];
|
|
46
|
+
const totalAdditions = fileDetails.reduce((s, d) => s + d.additions, 0);
|
|
47
|
+
const totalDeletions = fileDetails.reduce((s, d) => s + d.deletions, 0);
|
|
48
|
+
const diffSummary = {
|
|
49
|
+
changed_files: changedFiles,
|
|
50
|
+
additions: totalAdditions,
|
|
51
|
+
deletions: totalDeletions,
|
|
52
|
+
file_details: fileDetails,
|
|
53
|
+
};
|
|
54
|
+
// Risk summary
|
|
55
|
+
const riskFactors = [];
|
|
56
|
+
if (risk === "high")
|
|
57
|
+
riskFactors.push(`任务风险: ${risk}`);
|
|
58
|
+
if (attemptCount > 1)
|
|
59
|
+
riskFactors.push(`多次尝试: ${attemptCount} 次`);
|
|
60
|
+
if (failureCount > 0)
|
|
61
|
+
riskFactors.push(`历史失败: ${failureCount} 次`);
|
|
62
|
+
if (changedFiles.length > 10)
|
|
63
|
+
riskFactors.push(`变更文件多: ${changedFiles.length} 个`);
|
|
64
|
+
const riskLevel = riskFactors.length === 0 ? "low" : riskFactors.length <= 2 ? "medium" : "high";
|
|
65
|
+
// Evidence chain
|
|
66
|
+
const chain = buildDeliveryEvidenceChain(taskContext);
|
|
67
|
+
const evidenceChain = chain
|
|
68
|
+
? {
|
|
69
|
+
requirements: chain.requirement_points,
|
|
70
|
+
coverage_summary: chain.completeness.advisory,
|
|
71
|
+
uncovered_points: chain.completeness.uncovered_points,
|
|
72
|
+
}
|
|
73
|
+
: null;
|
|
74
|
+
// Rollback command — bound to real commit hash and branch
|
|
75
|
+
let commitHash = "HEAD";
|
|
76
|
+
let branch = "HEAD";
|
|
77
|
+
try {
|
|
78
|
+
commitHash = await gitOps.getHeadCommitHash(projectPath);
|
|
79
|
+
}
|
|
80
|
+
catch { /* use default */ }
|
|
81
|
+
try {
|
|
82
|
+
branch = await gitOps.getCurrentBranch(projectPath);
|
|
83
|
+
}
|
|
84
|
+
catch { /* use default */ }
|
|
85
|
+
const rollbackCommand = `git revert ${commitHash} --no-edit`;
|
|
86
|
+
// can_deliver advisory logic: advisory blockers, not hard block
|
|
87
|
+
const deliveryBlockers = [];
|
|
88
|
+
if (riskLevel === "high") {
|
|
89
|
+
deliveryBlockers.push("advisory: high risk — recommend manual review before delivery");
|
|
90
|
+
}
|
|
91
|
+
if (evidenceChain && evidenceChain.uncovered_points.length > 0) {
|
|
92
|
+
deliveryBlockers.push(`advisory: ${evidenceChain.uncovered_points.length} uncovered requirement point(s)`);
|
|
93
|
+
}
|
|
94
|
+
const hasVerification = taskContext.verification?.summary != null;
|
|
95
|
+
if (!hasVerification && changedFiles.length > 0) {
|
|
96
|
+
deliveryBlockers.push("advisory: no verification results — recommend running tests before delivery");
|
|
97
|
+
}
|
|
98
|
+
// can_deliver is always true (advisory, not hard block), but blockers inform the developer
|
|
99
|
+
const canDeliver = true;
|
|
100
|
+
return {
|
|
101
|
+
task_id: taskContext.task_id,
|
|
102
|
+
diff_summary: diffSummary,
|
|
103
|
+
risk_summary: {
|
|
104
|
+
risk_level: riskLevel,
|
|
105
|
+
factors: riskFactors,
|
|
106
|
+
advisory: riskLevel === "high"
|
|
107
|
+
? "advisory: high risk delivery, recommend manual review before proceeding"
|
|
108
|
+
: riskLevel === "medium"
|
|
109
|
+
? "advisory: moderate risk, review changes before delivery"
|
|
110
|
+
: "low risk, safe to proceed",
|
|
111
|
+
},
|
|
112
|
+
evidence_chain: evidenceChain,
|
|
113
|
+
rollback_command: rollbackCommand,
|
|
114
|
+
can_deliver: canDeliver,
|
|
115
|
+
delivery_blockers: deliveryBlockers,
|
|
116
|
+
advisory: deliveryBlockers.length > 0
|
|
117
|
+
? deliveryBlockers.join("; ")
|
|
118
|
+
: "review the diff and evidence chain before confirming delivery",
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 否决交付 — 开发者行使否决权。
|
|
123
|
+
* 返回 VetoResult 记录否决事件,不修改任何状态。
|
|
124
|
+
*/
|
|
125
|
+
export function vetoDelivery(taskId, reason) {
|
|
126
|
+
return {
|
|
127
|
+
vetoed: true,
|
|
128
|
+
task_id: taskId,
|
|
129
|
+
reason,
|
|
130
|
+
timestamp: new Date().toISOString(),
|
|
131
|
+
advisory: "delivery vetoed by developer — no code changes were committed or pushed",
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=developer_sovereignty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"developer_sovereignty.js","sourceRoot":"","sources":["../../src/engine/developer_sovereignty.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diff Ownership — 追踪文件变更归属,支持写前 CAS 校验。
|
|
3
|
+
* CAP-011 实验性: 只做状态模型和 CAS 校验,不替换现有写入流程,不新增 hard block。
|
|
4
|
+
*
|
|
5
|
+
* Diff 归属分类:
|
|
6
|
+
* - baseline: 任务开始前已存在的工作区变更
|
|
7
|
+
* - task_owned: 本任务通过合法写入产生的变更
|
|
8
|
+
* - human_external: 任务期间人类或其他进程的修改
|
|
9
|
+
* - unknown: 无法归因的变更,保守处理
|
|
10
|
+
*
|
|
11
|
+
* CAS (Compare-And-Swap) 校验:
|
|
12
|
+
* - 写前比较目标文件当前 hash 与上次记录的 hash
|
|
13
|
+
* - 不一致 → 校验失败,返回冲突信息
|
|
14
|
+
* - 一致或文件不存在 → 校验通过
|
|
15
|
+
*/
|
|
16
|
+
export type DiffOwnership = "baseline" | "task_owned" | "human_external" | "unknown";
|
|
17
|
+
export interface FileSnapshot {
|
|
18
|
+
/** 文件绝对路径 */
|
|
19
|
+
file_path: string;
|
|
20
|
+
/** SHA-256 hex of file content at snapshot time; null if file did not exist */
|
|
21
|
+
content_hash: string | null;
|
|
22
|
+
/** 归属分类 */
|
|
23
|
+
ownership: DiffOwnership;
|
|
24
|
+
/** 哪个任务写的(task_owned 时非空) */
|
|
25
|
+
task_id: string | null;
|
|
26
|
+
/** 快照时间 ISO */
|
|
27
|
+
captured_at: string;
|
|
28
|
+
}
|
|
29
|
+
export interface CasCheckResult {
|
|
30
|
+
file_path: string;
|
|
31
|
+
/** true = 文件内容与预期一致,可以写入 */
|
|
32
|
+
cas_ok: boolean;
|
|
33
|
+
/** 当前文件 hash(null 表示文件不存在) */
|
|
34
|
+
current_hash: string | null;
|
|
35
|
+
/** 预期的文件 hash(null 表示预期文件不存在) */
|
|
36
|
+
expected_hash: string | null;
|
|
37
|
+
/** 冲突描述 */
|
|
38
|
+
conflict_reason: string | null;
|
|
39
|
+
/** 根据冲突推断的归属 */
|
|
40
|
+
inferred_ownership: DiffOwnership;
|
|
41
|
+
}
|
|
42
|
+
export interface DiffOwnershipState {
|
|
43
|
+
/** 哪个任务持有这个状态 */
|
|
44
|
+
task_id: string;
|
|
45
|
+
/** 快照录时间 */
|
|
46
|
+
baseline_captured_at: string;
|
|
47
|
+
/** baseline 快照 */
|
|
48
|
+
file_snapshots: FileSnapshot[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 捕获一组文件的 baseline 快照。
|
|
52
|
+
* 文件不存在时 content_hash=null,ownership=baseline。
|
|
53
|
+
*/
|
|
54
|
+
export declare function captureBaseline(filePaths: string[], taskId: string, now?: Date): FileSnapshot[];
|
|
55
|
+
/**
|
|
56
|
+
* 写前 CAS 校验: 比较文件当前 hash 与期望 hash。
|
|
57
|
+
* - expected=null 且文件不存在 → ok(新文件)
|
|
58
|
+
* - expected=hash 且文件当前 hash 一致 → ok
|
|
59
|
+
* - 不一致 → 校验失败,推断归属
|
|
60
|
+
*/
|
|
61
|
+
export declare function casCheck(filePath: string, expectedHash: string | null, taskId: string, snapshots: FileSnapshot[]): CasCheckResult;
|
|
62
|
+
/**
|
|
63
|
+
* 记录一次任务写入,返回新的 snapshot。
|
|
64
|
+
*/
|
|
65
|
+
export declare function recordTaskWrite(filePath: string, taskId: string, now?: Date): FileSnapshot;
|
|
66
|
+
/**
|
|
67
|
+
* 根据文件路径查找最新快照(反向遍历,兼容 ES2022)。
|
|
68
|
+
*/
|
|
69
|
+
export declare function findLatestSnapshot(filePath: string, snapshots: readonly FileSnapshot[]): FileSnapshot | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* 统计各归属的文件数。
|
|
72
|
+
*/
|
|
73
|
+
export declare function summarizeOwnership(snapshots: readonly FileSnapshot[]): Record<DiffOwnership, number>;
|
|
74
|
+
//# sourceMappingURL=diff_ownership.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff_ownership.d.ts","sourceRoot":"","sources":["../../src/engine/diff_ownership.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,YAAY,GACZ,gBAAgB,GAChB,SAAS,CAAC;AAEd,MAAM,WAAW,YAAY;IAC3B,aAAa;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW;IACX,SAAS,EAAE,aAAa,CAAC;IACzB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iCAAiC;IACjC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW;IACX,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB;IAChB,kBAAkB,EAAE,aAAa,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY;IACZ,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB;IAClB,cAAc,EAAE,YAAY,EAAE,CAAC;CAChC;AAeD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,IAAI,GACT,YAAY,EAAE,CAShB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,YAAY,EAAE,GACxB,cAAc,CAwDhB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,IAAI,GACT,YAAY,CAQd;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,YAAY,EAAE,GACjC,YAAY,GAAG,SAAS,CAM1B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,YAAY,EAAE,GACjC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAW/B"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diff Ownership — 追踪文件变更归属,支持写前 CAS 校验。
|
|
3
|
+
* CAP-011 实验性: 只做状态模型和 CAS 校验,不替换现有写入流程,不新增 hard block。
|
|
4
|
+
*
|
|
5
|
+
* Diff 归属分类:
|
|
6
|
+
* - baseline: 任务开始前已存在的工作区变更
|
|
7
|
+
* - task_owned: 本任务通过合法写入产生的变更
|
|
8
|
+
* - human_external: 任务期间人类或其他进程的修改
|
|
9
|
+
* - unknown: 无法归因的变更,保守处理
|
|
10
|
+
*
|
|
11
|
+
* CAS (Compare-And-Swap) 校验:
|
|
12
|
+
* - 写前比较目标文件当前 hash 与上次记录的 hash
|
|
13
|
+
* - 不一致 → 校验失败,返回冲突信息
|
|
14
|
+
* - 一致或文件不存在 → 校验通过
|
|
15
|
+
*/
|
|
16
|
+
import fs from "node:fs";
|
|
17
|
+
import path from "node:path";
|
|
18
|
+
import { createHash } from "node:crypto";
|
|
19
|
+
function sha256Hex(content) {
|
|
20
|
+
return createHash("sha256").update(content).digest("hex");
|
|
21
|
+
}
|
|
22
|
+
function hashFile(filePath) {
|
|
23
|
+
try {
|
|
24
|
+
const content = fs.readFileSync(filePath);
|
|
25
|
+
return sha256Hex(content);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 捕获一组文件的 baseline 快照。
|
|
33
|
+
* 文件不存在时 content_hash=null,ownership=baseline。
|
|
34
|
+
*/
|
|
35
|
+
export function captureBaseline(filePaths, taskId, now) {
|
|
36
|
+
const ts = (now ?? new Date()).toISOString();
|
|
37
|
+
return filePaths.map((fp) => ({
|
|
38
|
+
file_path: path.resolve(fp),
|
|
39
|
+
content_hash: hashFile(fp),
|
|
40
|
+
ownership: "baseline",
|
|
41
|
+
task_id: null,
|
|
42
|
+
captured_at: ts,
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 写前 CAS 校验: 比较文件当前 hash 与期望 hash。
|
|
47
|
+
* - expected=null 且文件不存在 → ok(新文件)
|
|
48
|
+
* - expected=hash 且文件当前 hash 一致 → ok
|
|
49
|
+
* - 不一致 → 校验失败,推断归属
|
|
50
|
+
*/
|
|
51
|
+
export function casCheck(filePath, expectedHash, taskId, snapshots) {
|
|
52
|
+
const resolved = path.resolve(filePath);
|
|
53
|
+
const currentHash = hashFile(resolved);
|
|
54
|
+
// 文件不存在 + 预期不存在 → ok, ownership 取最新 snapshot
|
|
55
|
+
if (expectedHash === null && currentHash === null) {
|
|
56
|
+
const snap = findLatestSnapshot(filePath, snapshots);
|
|
57
|
+
return {
|
|
58
|
+
file_path: resolved,
|
|
59
|
+
cas_ok: true,
|
|
60
|
+
current_hash: null,
|
|
61
|
+
expected_hash: null,
|
|
62
|
+
conflict_reason: null,
|
|
63
|
+
inferred_ownership: snap?.ownership ?? "baseline",
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// hash 一致 → ok, ownership 取最新匹配 snapshot 的归属
|
|
67
|
+
if (expectedHash === currentHash) {
|
|
68
|
+
const snap = findLatestSnapshot(filePath, snapshots);
|
|
69
|
+
return {
|
|
70
|
+
file_path: resolved,
|
|
71
|
+
cas_ok: true,
|
|
72
|
+
current_hash: currentHash,
|
|
73
|
+
expected_hash: expectedHash,
|
|
74
|
+
conflict_reason: null,
|
|
75
|
+
inferred_ownership: snap?.ownership ?? "baseline",
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// 不一致 → 判断归属(取最近一次快照)
|
|
79
|
+
const snap = findLatestSnapshot(filePath, snapshots);
|
|
80
|
+
let ownership = "unknown";
|
|
81
|
+
let reason;
|
|
82
|
+
if (snap && snap.ownership === "baseline" && snap.content_hash !== currentHash) {
|
|
83
|
+
// 文件在 baseline 之后被修改过,但不是本任务改的
|
|
84
|
+
ownership = "human_external";
|
|
85
|
+
reason = `file changed since baseline (expected ${expectedHash?.substring(0, 12) ?? "null"}, got ${currentHash?.substring(0, 12) ?? "null"})`;
|
|
86
|
+
}
|
|
87
|
+
else if (snap && snap.ownership === "task_owned") {
|
|
88
|
+
// 本任务之前改过,但又变了(可能是外部并发修改)
|
|
89
|
+
ownership = "human_external";
|
|
90
|
+
reason = `task-owned file modified externally (expected ${expectedHash?.substring(0, 12) ?? "null"}, got ${currentHash?.substring(0, 12) ?? "null"})`;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
ownership = "unknown";
|
|
94
|
+
reason = `unexpected file state (expected ${expectedHash?.substring(0, 12) ?? "null"}, got ${currentHash?.substring(0, 12) ?? "null"})`;
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
file_path: resolved,
|
|
98
|
+
cas_ok: false,
|
|
99
|
+
current_hash: currentHash,
|
|
100
|
+
expected_hash: expectedHash,
|
|
101
|
+
conflict_reason: reason,
|
|
102
|
+
inferred_ownership: ownership,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 记录一次任务写入,返回新的 snapshot。
|
|
107
|
+
*/
|
|
108
|
+
export function recordTaskWrite(filePath, taskId, now) {
|
|
109
|
+
return {
|
|
110
|
+
file_path: path.resolve(filePath),
|
|
111
|
+
content_hash: hashFile(filePath),
|
|
112
|
+
ownership: "task_owned",
|
|
113
|
+
task_id: taskId,
|
|
114
|
+
captured_at: (now ?? new Date()).toISOString(),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* 根据文件路径查找最新快照(反向遍历,兼容 ES2022)。
|
|
119
|
+
*/
|
|
120
|
+
export function findLatestSnapshot(filePath, snapshots) {
|
|
121
|
+
const resolved = path.resolve(filePath);
|
|
122
|
+
for (let i = snapshots.length - 1; i >= 0; i--) {
|
|
123
|
+
if (snapshots[i].file_path === resolved)
|
|
124
|
+
return snapshots[i];
|
|
125
|
+
}
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 统计各归属的文件数。
|
|
130
|
+
*/
|
|
131
|
+
export function summarizeOwnership(snapshots) {
|
|
132
|
+
const counts = {
|
|
133
|
+
baseline: 0,
|
|
134
|
+
task_owned: 0,
|
|
135
|
+
human_external: 0,
|
|
136
|
+
unknown: 0,
|
|
137
|
+
};
|
|
138
|
+
for (const s of snapshots) {
|
|
139
|
+
counts[s.ownership]++;
|
|
140
|
+
}
|
|
141
|
+
return counts;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=diff_ownership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff_ownership.js","sourceRoot":"","sources":["../../src/engine/diff_ownership.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diff Ownership Store — 持久化文件归属快照,绑定 stateDir。
|
|
3
|
+
* CAP-011 实验性: 只做 advisory 冲突报告,不 hard block。
|
|
4
|
+
*
|
|
5
|
+
* 存储: JSON 文件,原子写入,路径绑定 stateDir。
|
|
6
|
+
* 每个 task_id 下的快照按时间顺序追加。
|
|
7
|
+
*/
|
|
8
|
+
import { type FileSnapshot, type CasCheckResult, type DiffOwnership } from "./diff_ownership.js";
|
|
9
|
+
export interface ConflictReport {
|
|
10
|
+
file_path: string;
|
|
11
|
+
expected_hash: string | null;
|
|
12
|
+
current_hash: string | null;
|
|
13
|
+
inferred_ownership: DiffOwnership;
|
|
14
|
+
severity: "advisory";
|
|
15
|
+
message: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ScopeBaselineResult {
|
|
18
|
+
snapshots: FileSnapshot[];
|
|
19
|
+
advisory_summary: string | null;
|
|
20
|
+
total_files_found: number;
|
|
21
|
+
files_excluded: number;
|
|
22
|
+
files_captured: number;
|
|
23
|
+
exceeded_limit: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface TaskSnapshotState {
|
|
26
|
+
task_id: string;
|
|
27
|
+
baseline_captured_at: string | null;
|
|
28
|
+
snapshots: FileSnapshot[];
|
|
29
|
+
}
|
|
30
|
+
export declare class DiffOwnershipStore {
|
|
31
|
+
private filePath;
|
|
32
|
+
private states;
|
|
33
|
+
private loaded;
|
|
34
|
+
constructor(stateDir: string);
|
|
35
|
+
private ensureLoaded;
|
|
36
|
+
private persist;
|
|
37
|
+
/**
|
|
38
|
+
* Capture baseline for a task. Call once when task starts executing.
|
|
39
|
+
*/
|
|
40
|
+
captureBaseline(taskId: string, filePaths: string[]): FileSnapshot[];
|
|
41
|
+
/**
|
|
42
|
+
* Capture baseline from scope paths, expanding directories into their existing files.
|
|
43
|
+
* Applies exclusion rules and size limits. Returns advisory summary if exceeded.
|
|
44
|
+
* Does NOT hard block — caller receives the summary and decides.
|
|
45
|
+
*/
|
|
46
|
+
captureBaselineFromScope(taskId: string, scopePaths: string[], options?: {
|
|
47
|
+
maxFiles?: number;
|
|
48
|
+
maxTotalBytes?: number;
|
|
49
|
+
}): ScopeBaselineResult;
|
|
50
|
+
/**
|
|
51
|
+
* Record a task-owned write for a file.
|
|
52
|
+
*/
|
|
53
|
+
recordWrite(taskId: string, filePath: string): FileSnapshot;
|
|
54
|
+
/**
|
|
55
|
+
* Run CAS check before writing. Returns advisory conflict report if check fails.
|
|
56
|
+
* Does NOT block the write — caller decides what to do.
|
|
57
|
+
*/
|
|
58
|
+
preWriteCheck(taskId: string, filePath: string): {
|
|
59
|
+
cas: CasCheckResult;
|
|
60
|
+
conflict: ConflictReport | null;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Get all snapshots for a task.
|
|
64
|
+
*/
|
|
65
|
+
getSnapshots(taskId: string): FileSnapshot[];
|
|
66
|
+
/**
|
|
67
|
+
* Get ownership summary for a task.
|
|
68
|
+
*/
|
|
69
|
+
getOwnershipSummary(taskId: string): Record<DiffOwnership, number>;
|
|
70
|
+
/**
|
|
71
|
+
* Clean up state for a completed/failed task.
|
|
72
|
+
*/
|
|
73
|
+
clearTask(taskId: string): void;
|
|
74
|
+
clear(): void;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=diff_ownership_store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff_ownership_store.d.ts","sourceRoot":"","sources":["../../src/engine/diff_ownership_store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAML,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,kBAAkB,EAAE,aAAa,CAAC;IAClC,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B;AAmCD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAA6C;IAC3D,OAAO,CAAC,MAAM,CAAS;gBAEX,QAAQ,EAAE,MAAM;IAO5B,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,OAAO;IAOf;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE;IAcpE;;;;OAIG;IACH,wBAAwB,CACtB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GACtD,mBAAmB;IA8EtB;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY;IAa3D;;;OAGG;IACH,aAAa,CACX,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf;QAAE,GAAG,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAA;KAAE;IA0B3D;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE;IAM5C;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC;IAIlE;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAM/B,KAAK,IAAI,IAAI;CAKd"}
|