soloforge 1.1.52 → 1.1.54
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/cli/adapter_writers.d.ts +2 -6
- package/dist/cli/adapter_writers.d.ts.map +1 -1
- package/dist/cli/adapter_writers.js +2 -18
- package/dist/cli/adapter_writers.js.map +1 -1
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +16 -37
- package/dist/cli/init.js.map +1 -1
- package/dist/context/adapter_prompt_contract.d.ts +0 -14
- package/dist/context/adapter_prompt_contract.d.ts.map +1 -1
- package/dist/context/adapter_prompt_contract.js +0 -46
- package/dist/context/adapter_prompt_contract.js.map +1 -1
- package/dist/context/adapters/shared/integration_guide.d.ts +5 -5
- package/dist/context/adapters/shared/integration_guide.d.ts.map +1 -1
- package/dist/context/adapters/shared/integration_guide.js +29 -14
- package/dist/context/adapters/shared/integration_guide.js.map +1 -1
- package/dist/context/adapters/shared/workflow_template.d.ts +12 -29
- package/dist/context/adapters/shared/workflow_template.d.ts.map +1 -1
- package/dist/context/adapters/shared/workflow_template.js +13 -96
- package/dist/context/adapters/shared/workflow_template.js.map +1 -1
- package/dist/context/config/resolver.d.ts +0 -6
- package/dist/context/config/resolver.d.ts.map +1 -1
- package/dist/context/config/resolver.js +12 -0
- package/dist/context/config/resolver.js.map +1 -1
- package/dist/context/contracts/lifecycle_knowledge_contract.d.ts.map +1 -1
- package/dist/context/contracts/lifecycle_knowledge_contract.js +0 -10
- package/dist/context/contracts/lifecycle_knowledge_contract.js.map +1 -1
- package/dist/context/knowledge/index_manager.d.ts +3 -0
- package/dist/context/knowledge/index_manager.d.ts.map +1 -1
- package/dist/context/knowledge/index_manager.js +16 -0
- package/dist/context/knowledge/index_manager.js.map +1 -1
- package/dist/context/knowledge/knowledge_template_contracts.d.ts +1 -1
- package/dist/context/knowledge/knowledge_template_contracts.d.ts.map +1 -1
- package/dist/context/templates/standard_asset_contract.d.ts +1 -1
- package/dist/context/templates/standard_asset_contract.js +4 -4
- package/dist/context/templates/standard_asset_contract.js.map +1 -1
- package/dist/context/templates/standard_asset_coverage.js +2 -2
- package/dist/context/templates/standard_asset_coverage.js.map +1 -1
- package/dist/context/templates/workflow_rule_generator.d.ts +1 -9
- package/dist/context/templates/workflow_rule_generator.d.ts.map +1 -1
- package/dist/context/templates/workflow_rule_generator.js +2 -12
- package/dist/context/templates/workflow_rule_generator.js.map +1 -1
- package/dist/core/adversarial_review_store.d.ts +6 -0
- package/dist/core/adversarial_review_store.d.ts.map +1 -1
- package/dist/core/adversarial_review_store.js +29 -0
- package/dist/core/adversarial_review_store.js.map +1 -1
- package/dist/core/condition_evaluators.d.ts +42 -0
- package/dist/core/condition_evaluators.d.ts.map +1 -0
- package/dist/core/condition_evaluators.js +31 -0
- package/dist/core/condition_evaluators.js.map +1 -0
- package/dist/core/domain_transition.js +1 -1
- package/dist/core/domain_transition.js.map +1 -1
- package/dist/core/gate_record_store.d.ts +6 -0
- package/dist/core/gate_record_store.d.ts.map +1 -1
- package/dist/core/gate_record_store.js +27 -0
- package/dist/core/gate_record_store.js.map +1 -1
- package/dist/core/git_utils.d.ts +6 -0
- package/dist/core/git_utils.d.ts.map +1 -1
- package/dist/core/git_utils.js +20 -0
- package/dist/core/git_utils.js.map +1 -1
- package/dist/core/intent_router.js +1 -1
- package/dist/core/intent_router.js.map +1 -1
- package/dist/core/observer.d.ts.map +1 -1
- package/dist/core/observer.js +30 -23
- package/dist/core/observer.js.map +1 -1
- package/dist/core/task_context/manager.d.ts +5 -4
- package/dist/core/task_context/manager.d.ts.map +1 -1
- package/dist/core/task_context/manager.js +18 -8
- package/dist/core/task_context/manager.js.map +1 -1
- package/dist/core/task_context/manager_setters.d.ts +2 -2
- package/dist/core/task_context/manager_setters.d.ts.map +1 -1
- package/dist/core/task_context/manager_setters.js +18 -48
- package/dist/core/task_context/manager_setters.js.map +1 -1
- package/dist/core/task_context/status_transitions.js +2 -2
- package/dist/core/task_context/status_transitions.js.map +1 -1
- package/dist/core/types.d.ts +18 -6
- package/dist/core/types.d.ts.map +1 -1
- package/dist/domain/asset_registry/derived_registry.d.ts +0 -1
- package/dist/domain/asset_registry/derived_registry.d.ts.map +1 -1
- package/dist/domain/asset_registry/derived_registry.js.map +1 -1
- package/dist/domain/asset_registry/derived_types.d.ts +5 -2
- package/dist/domain/asset_registry/derived_types.d.ts.map +1 -1
- package/dist/domain/build/contract.d.ts.map +1 -1
- package/dist/domain/build/contract.js +12 -2
- package/dist/domain/build/contract.js.map +1 -1
- package/dist/domain/build/engine.d.ts.map +1 -1
- package/dist/domain/build/engine.js +23 -2
- package/dist/domain/build/engine.js.map +1 -1
- package/dist/domain/contracts/artifact_contract_registry.d.ts +1 -1
- package/dist/domain/contracts/artifact_contract_registry.d.ts.map +1 -1
- package/dist/domain/contracts/artifact_contract_registry.js +20 -26
- package/dist/domain/contracts/artifact_contract_registry.js.map +1 -1
- package/dist/domain/contracts/artifact_schema_registry.d.ts +1 -1
- package/dist/domain/contracts/artifact_schema_registry.d.ts.map +1 -1
- package/dist/domain/contracts/artifact_schema_registry.js +49 -71
- package/dist/domain/contracts/artifact_schema_registry.js.map +1 -1
- package/dist/domain/contracts/design_lifecycle_contract.d.ts +4 -8
- package/dist/domain/contracts/design_lifecycle_contract.d.ts.map +1 -1
- package/dist/domain/contracts/design_lifecycle_contract.js +8 -127
- package/dist/domain/contracts/design_lifecycle_contract.js.map +1 -1
- package/dist/domain/delivery_readiness.d.ts +0 -26
- package/dist/domain/delivery_readiness.d.ts.map +1 -1
- package/dist/domain/delivery_readiness.js +0 -41
- package/dist/domain/delivery_readiness.js.map +1 -1
- package/dist/domain/design/contract.d.ts.map +1 -1
- package/dist/domain/design/contract.js +13 -8
- package/dist/domain/design/contract.js.map +1 -1
- package/dist/domain/design/engine.d.ts.map +1 -1
- package/dist/domain/design/engine.js +31 -10
- package/dist/domain/design/engine.js.map +1 -1
- package/dist/domain/engine_helpers.d.ts +14 -5
- package/dist/domain/engine_helpers.d.ts.map +1 -1
- package/dist/domain/engine_helpers.js +73 -4
- package/dist/domain/engine_helpers.js.map +1 -1
- package/dist/domain/input_material_contract_registry.d.ts +1 -1
- package/dist/domain/input_material_contract_registry.js +1 -1
- package/dist/domain/operate/contract.d.ts.map +1 -1
- package/dist/domain/operate/contract.js +9 -3
- package/dist/domain/operate/contract.js.map +1 -1
- package/dist/domain/verify/contract.d.ts.map +1 -1
- package/dist/domain/verify/contract.js +8 -3
- package/dist/domain/verify/contract.js.map +1 -1
- package/dist/gate/cep_assessment.d.ts +0 -6
- package/dist/gate/cep_assessment.d.ts.map +1 -1
- package/dist/gate/cep_assessment.js +0 -23
- package/dist/gate/cep_assessment.js.map +1 -1
- package/dist/gate/contracts/capability_registry.js +3 -3
- package/dist/gate/contracts/capability_registry.js.map +1 -1
- package/dist/gate/contracts/control_plane_contract.d.ts.map +1 -1
- package/dist/gate/contracts/control_plane_contract.js +1 -2
- package/dist/gate/contracts/control_plane_contract.js.map +1 -1
- package/dist/gate/contracts/tool_invocation_contract_registry.js +3 -3
- package/dist/gate/contracts/tool_invocation_contract_registry.js.map +1 -1
- package/dist/gate/diff_ownership.d.ts +0 -8
- package/dist/gate/diff_ownership.d.ts.map +1 -1
- package/dist/gate/diff_ownership.js.map +1 -1
- package/dist/gate/executors/executors_annotation.d.ts.map +1 -1
- package/dist/gate/executors/executors_annotation.js +26 -5
- package/dist/gate/executors/executors_annotation.js.map +1 -1
- package/dist/gate/executors/executors_artifact.d.ts +5 -0
- package/dist/gate/executors/executors_artifact.d.ts.map +1 -1
- package/dist/gate/executors/executors_artifact.js +174 -60
- package/dist/gate/executors/executors_artifact.js.map +1 -1
- package/dist/gate/executors/executors_prerequisite.d.ts.map +1 -1
- package/dist/gate/executors/executors_prerequisite.js +31 -20
- package/dist/gate/executors/executors_prerequisite.js.map +1 -1
- package/dist/gate/executors/executors_regex_scan.d.ts.map +1 -1
- package/dist/gate/executors/executors_regex_scan.js +12 -2
- package/dist/gate/executors/executors_regex_scan.js.map +1 -1
- package/dist/gate/executors/executors_trace.d.ts.map +1 -1
- package/dist/gate/executors/executors_trace.js +49 -10
- package/dist/gate/executors/executors_trace.js.map +1 -1
- package/dist/gate/gate_engine.d.ts +5 -0
- package/dist/gate/gate_engine.d.ts.map +1 -1
- package/dist/gate/gate_engine.js +7 -3
- package/dist/gate/gate_engine.js.map +1 -1
- package/dist/gate/gate_registry_bridge.d.ts +1 -1
- package/dist/gate/gate_registry_bridge.d.ts.map +1 -1
- package/dist/gate/gate_registry_bridge.js +12 -3
- package/dist/gate/gate_registry_bridge.js.map +1 -1
- package/dist/gate/plan_proposal_gate.d.ts +0 -18
- package/dist/gate/plan_proposal_gate.d.ts.map +1 -1
- package/dist/gate/plan_proposal_gate.js +0 -51
- package/dist/gate/plan_proposal_gate.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/server/tools/middleware.d.ts +1 -1
- package/dist/server/tools/middleware.d.ts.map +1 -1
- package/dist/server/tools/sf_gate.d.ts.map +1 -1
- package/dist/server/tools/sf_gate.js +19 -10
- package/dist/server/tools/sf_gate.js.map +1 -1
- package/dist/server/tools/sf_task.d.ts +2 -1
- package/dist/server/tools/sf_task.d.ts.map +1 -1
- package/dist/server/tools/sf_task.js +27 -15
- package/dist/server/tools/sf_task.js.map +1 -1
- package/dist/server/tools/sf_work.d.ts +86 -0
- package/dist/server/tools/sf_work.d.ts.map +1 -1
- package/dist/server/tools/sf_work.js +119 -56
- package/dist/server/tools/sf_work.js.map +1 -1
- package/dist/shared/diagnostic_registry.d.ts +0 -44
- package/dist/shared/diagnostic_registry.d.ts.map +1 -1
- package/dist/shared/diagnostic_registry.js +1 -254
- package/dist/shared/diagnostic_registry.js.map +1 -1
- package/dist/shared/glob_path.d.ts +3 -3
- package/dist/shared/glob_path.d.ts.map +1 -1
- package/dist/shared/glob_path.js +9 -5
- package/dist/shared/glob_path.js.map +1 -1
- package/dist/shared/helpers.d.ts +5 -3
- package/dist/shared/helpers.d.ts.map +1 -1
- package/dist/shared/helpers.js +11 -9
- package/dist/shared/helpers.js.map +1 -1
- package/dist/shared/knowledge_config_loader.d.ts +0 -12
- package/dist/shared/knowledge_config_loader.d.ts.map +1 -1
- package/dist/shared/knowledge_config_loader.js +0 -28
- package/dist/shared/knowledge_config_loader.js.map +1 -1
- package/dist/shared/write_file_atomic.d.ts +6 -0
- package/dist/shared/write_file_atomic.d.ts.map +1 -1
- package/dist/shared/write_file_atomic.js +8 -2
- package/dist/shared/write_file_atomic.js.map +1 -1
- package/dist/types/pipeline_types.d.ts +18 -19
- package/dist/types/pipeline_types.d.ts.map +1 -1
- package/dist/verify/audit/evolver.d.ts +1 -2
- package/dist/verify/audit/evolver.d.ts.map +1 -1
- package/dist/verify/audit/evolver.js +1 -2
- package/dist/verify/audit/evolver.js.map +1 -1
- package/dist/verify/audit/main_path_integration_contract/constants.d.ts +2 -8
- package/dist/verify/audit/main_path_integration_contract/constants.d.ts.map +1 -1
- package/dist/verify/audit/main_path_integration_contract/constants.js +1 -15
- package/dist/verify/audit/main_path_integration_contract/constants.js.map +1 -1
- package/dist/verify/audit/probe_rule.d.ts +0 -6
- package/dist/verify/audit/probe_rule.d.ts.map +1 -1
- package/dist/verify/audit/probe_rule.js +11 -0
- package/dist/verify/audit/probe_rule.js.map +1 -1
- package/dist/verify/index.d.ts +0 -1
- package/dist/verify/index.d.ts.map +1 -1
- package/dist/verify/index.js +1 -2
- package/dist/verify/index.js.map +1 -1
- package/dist/verify/types.d.ts +1 -1
- package/dist/verify/types.d.ts.map +1 -1
- package/package.json +2 -3
- package/templates/build/enforced.md +4 -1
- package/templates/build//347/274/226/347/240/201/347/272/252/345/276/213.md +2 -2
- package/templates/design/enforced.md +26 -14
- package/templates/design//345/216/237/345/236/213/350/257/264/346/230/216.md +2 -2
- package/templates/design//345/274/200/345/217/221/345/210/207/347/211/207/350/256/241/345/210/222.md +3 -3
- package/templates/design//346/236/266/346/236/204/350/256/276/350/256/{241.md → 241/346/226/207/346/241/243.md} +1 -4
- package/templates/operate/enforced.md +1 -0
- package/templates/shared/deterministic_executors.json +27 -0
- package/templates/shared//345/267/245/344/275/234/346/265/201/347/241/254/350/247/204/345/210/231/345/245/221/347/272/246.md +1 -25
- package/templates/verify/enforced.md +10 -0
- package/templates/verify//346/265/213/350/257/225/346/212/245/345/221/212.md +53 -0
- package/dist/context/adapters/trae/trae_config.d.ts +0 -31
- package/dist/context/adapters/trae/trae_config.d.ts.map +0 -1
- package/dist/context/adapters/trae/trae_config.js +0 -35
- package/dist/context/adapters/trae/trae_config.js.map +0 -1
- package/dist/context/adapters/trae/trae_rules.d.ts +0 -21
- package/dist/context/adapters/trae/trae_rules.d.ts.map +0 -1
- package/dist/context/adapters/trae/trae_rules.js +0 -56
- package/dist/context/adapters/trae/trae_rules.js.map +0 -1
- package/dist/gate/uncertainty_bridge.d.ts +0 -87
- package/dist/gate/uncertainty_bridge.d.ts.map +0 -1
- package/dist/gate/uncertainty_bridge.js +0 -73
- package/dist/gate/uncertainty_bridge.js.map +0 -1
- package/dist/verify/audit/failure_classifier.d.ts +0 -52
- package/dist/verify/audit/failure_classifier.d.ts.map +0 -1
- package/dist/verify/audit/failure_classifier.js +0 -188
- package/dist/verify/audit/failure_classifier.js.map +0 -1
- package/dist/verify/oda/controller.d.ts +0 -38
- package/dist/verify/oda/controller.d.ts.map +0 -1
- package/dist/verify/oda/controller.js +0 -209
- package/dist/verify/oda/controller.js.map +0 -1
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Uncertainty Bridge — 管线层模块。
|
|
3
|
-
*
|
|
4
|
-
* 职责边界:
|
|
5
|
-
* - 负责:BrainstormRequest 等 管线层职责
|
|
6
|
-
* - 不负责:不属于本模块的职责由对应模块承担
|
|
7
|
-
*
|
|
8
|
-
* 被谁调用:MCP 工具(sf_work 等)、middleware
|
|
9
|
-
* 调用谁:workflow_navigation_contract、certainty_gate
|
|
10
|
-
*
|
|
11
|
-
* 数据流:用户指令 → 状态解析 → 阶段推进 → 持久化状态
|
|
12
|
-
* 持久化:无持久化(纯计算/内存态)
|
|
13
|
-
*/
|
|
14
|
-
// ═══════════════════════════════════════════
|
|
15
|
-
// 公共接口
|
|
16
|
-
// ═══════════════════════════════════════════
|
|
17
|
-
/**
|
|
18
|
-
* 构建头脑风暴请求。
|
|
19
|
-
*
|
|
20
|
-
* 将确定性门禁 L2 的 brainstorm_required 信号转换为可执行的请求结构。
|
|
21
|
-
* Phase 1: 仅构建请求,不执行。
|
|
22
|
-
*
|
|
23
|
-
* @param riskPatterns - 命中的风险模式 ID 列表
|
|
24
|
-
* @param stage - 当前阶段
|
|
25
|
-
* @param topic - 讨论主题(可选)
|
|
26
|
-
* @returns 头脑风暴请求
|
|
27
|
-
*/
|
|
28
|
-
export function resolveBrainstormTrigger(riskPatterns, domain, topic) {
|
|
29
|
-
return {
|
|
30
|
-
risk_patterns: riskPatterns,
|
|
31
|
-
domain,
|
|
32
|
-
topic: topic ?? `${domain} 域风险方案讨论`,
|
|
33
|
-
// Phase 2: 填充 legacy_params 调用旧 brainstorm 模块
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* 构建第一性原理请求。
|
|
38
|
-
*
|
|
39
|
-
* 将确定性门禁 L2 的 first_principles_required 信号转换为可执行的请求结构。
|
|
40
|
-
* Phase 1: 仅构建请求,不执行。
|
|
41
|
-
*
|
|
42
|
-
* @param stage - 当前阶段
|
|
43
|
-
* @param riskPatterns - 命中的风险模式 ID 列表
|
|
44
|
-
* @param scopeDescription - 分析范围描述
|
|
45
|
-
* @returns 第一性原理请求
|
|
46
|
-
*/
|
|
47
|
-
export function resolveFirstPrinciplesTrigger(domain, riskPatterns, scopeDescription) {
|
|
48
|
-
return {
|
|
49
|
-
domain,
|
|
50
|
-
risk_patterns: riskPatterns,
|
|
51
|
-
scope_description: scopeDescription ?? `${domain} 域需要从第一性原理重新审视`,
|
|
52
|
-
// Phase 2: 填充 legacy_params 调用旧 first_principles 模块
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* 构建抽象模型触发请求。
|
|
57
|
-
*
|
|
58
|
-
* 将确定性门禁 L2 的 abstract_model_required 信号转换为可执行的请求结构。
|
|
59
|
-
* Phase 1: 仅构建请求,不执行。
|
|
60
|
-
*
|
|
61
|
-
* @param stage - 当前阶段
|
|
62
|
-
* @param riskPatterns - 命中的风险模式 ID 列表
|
|
63
|
-
* @param scopeDescription - 建模范围描述(可选)
|
|
64
|
-
* @returns 抽象模型请求
|
|
65
|
-
*/
|
|
66
|
-
export function resolveAbstractModelTrigger(domain, riskPatterns, scopeDescription) {
|
|
67
|
-
return {
|
|
68
|
-
domain,
|
|
69
|
-
risk_patterns: riskPatterns,
|
|
70
|
-
scope_description: scopeDescription ?? `${domain} 域需要对核心概念进行抽象建模`,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
//# sourceMappingURL=uncertainty_bridge.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"uncertainty_bridge.js","sourceRoot":"","sources":["../../src/gate/uncertainty_bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiCH,8CAA8C;AAC9C,OAAO;AACP,8CAA8C;AAE9C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,wBAAwB,CACtC,YAA6B,EAC7B,MAAkB,EAClB,KAAc;IAEd,OAAO;QACL,aAAa,EAAE,YAAY;QAC3B,MAAM;QACN,KAAK,EAAE,KAAK,IAAI,GAAG,MAAM,UAAU;QACnC,8CAA8C;KAC/C,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,6BAA6B,CAC3C,MAAkB,EAClB,YAA6B,EAC7B,gBAAyB;IAEzB,OAAO;QACL,MAAM;QACN,aAAa,EAAE,YAAY;QAC3B,iBAAiB,EAAE,gBAAgB,IAAI,GAAG,MAAM,gBAAgB;QAChE,oDAAoD;KACrD,CAAC;AACJ,CAAC;AAoBD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAAkB,EAClB,YAA6B,EAC7B,gBAAyB;IAEzB,OAAO;QACL,MAAM;QACN,aAAa,EAAE,YAAY;QAC3B,iBAAiB,EAAE,gBAAgB,IAAI,GAAG,MAAM,iBAAiB;KAClE,CAAC;AACJ,CAAC"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Failure Classifier — 审计层模块。
|
|
3
|
-
*
|
|
4
|
-
* 职责边界:
|
|
5
|
-
* - 负责:FailureClassifier 等 审计层职责
|
|
6
|
-
* - 不负责:不属于本模块的职责由对应模块承担
|
|
7
|
-
*
|
|
8
|
-
* 被谁调用:发布门禁、质量检查
|
|
9
|
-
* 调用谁:index、logger
|
|
10
|
-
*
|
|
11
|
-
* 数据流:审计输入(代码/配置) → 检查 → 评分/报告
|
|
12
|
-
* 持久化:无持久化(纯计算/内存态)
|
|
13
|
-
*/
|
|
14
|
-
import type { FailureClassifyResult } from "../../types/index.js";
|
|
15
|
-
/**
|
|
16
|
-
* 失败分类器。
|
|
17
|
-
* @description 通过分析错误输出内容,结合重试计数和复发历史,给出失败类型和处理建议。
|
|
18
|
-
*/
|
|
19
|
-
export declare class FailureClassifier {
|
|
20
|
-
/** 上一次错误信息(用于判断是否为相同错误) */
|
|
21
|
-
private lastError;
|
|
22
|
-
/** 历史错误列表(用于复发检测) */
|
|
23
|
-
private errorHistory;
|
|
24
|
-
/** 最大重试次数 */
|
|
25
|
-
private maxRetries;
|
|
26
|
-
/** 最大自动修复次数(防无限循环) */
|
|
27
|
-
private maxAutoRepair;
|
|
28
|
-
/**
|
|
29
|
-
* 创建失败分类器实例。
|
|
30
|
-
* @param maxRetries - 最大重试次数,默认 3
|
|
31
|
-
* @param maxAutoRepair - 最大自动修复循环次数,默认 3
|
|
32
|
-
*/
|
|
33
|
-
constructor(maxRetries?: number, maxAutoRepair?: number);
|
|
34
|
-
/**
|
|
35
|
-
* 分类错误输出,返回失败分类结果。
|
|
36
|
-
* @description 分类优先级:上游阶段检测 > 修复循环上限 > 复发检测(>=4次) >
|
|
37
|
-
* 相同错误检测 > 范围不足检测 > 可修复错误 > 默认可重试。
|
|
38
|
-
* @param errorOutput - 错误输出文本
|
|
39
|
-
* @param retryCount - 当前重试次数
|
|
40
|
-
* @param repairLoopCount - 当前修复循环次数
|
|
41
|
-
* @returns 失败分类结果,包含失败类型、处理动作、是否可自动修复等信息
|
|
42
|
-
*/
|
|
43
|
-
classify(errorOutput: string, retryCount?: number, repairLoopCount?: number): FailureClassifyResult;
|
|
44
|
-
/**
|
|
45
|
-
* 统计指定错误输出在历史中的出现次数。
|
|
46
|
-
* @description 用于复发检测,统计同一错误信息的累计出现频次。
|
|
47
|
-
* @param errorOutput - 待统计的错误输出文本
|
|
48
|
-
* @returns 该错误在历史记录中的出现次数
|
|
49
|
-
*/
|
|
50
|
-
private countRecurrence;
|
|
51
|
-
}
|
|
52
|
-
//# sourceMappingURL=failure_classifier.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"failure_classifier.d.ts","sourceRoot":"","sources":["../../../src/verify/audit/failure_classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAsBlE;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,2BAA2B;IAC3B,OAAO,CAAC,SAAS,CAAc;IAC/B,qBAAqB;IACrB,OAAO,CAAC,YAAY,CAAgB;IACpC,aAAa;IACb,OAAO,CAAC,UAAU,CAAS;IAC3B,sBAAsB;IACtB,OAAO,CAAC,aAAa,CAAS;IAE9B;;;;OAIG;gBACS,UAAU,SAAI,EAAE,aAAa,SAAI;IAK7C;;;;;;;;OAQG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,SAAI,EAAE,eAAe,SAAI,GAAG,qBAAqB;IA+GzF;;;;;OAKG;IACH,OAAO,CAAC,eAAe;CAIxB"}
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Failure Classifier — 审计层模块。
|
|
3
|
-
*
|
|
4
|
-
* 职责边界:
|
|
5
|
-
* - 负责:FailureClassifier 等 审计层职责
|
|
6
|
-
* - 不负责:不属于本模块的职责由对应模块承担
|
|
7
|
-
*
|
|
8
|
-
* 被谁调用:发布门禁、质量检查
|
|
9
|
-
* 调用谁:index、logger
|
|
10
|
-
*
|
|
11
|
-
* 数据流:审计输入(代码/配置) → 检查 → 评分/报告
|
|
12
|
-
* 持久化:无持久化(纯计算/内存态)
|
|
13
|
-
*/
|
|
14
|
-
import { debug } from "../../shared/logger.js";
|
|
15
|
-
/**
|
|
16
|
-
* 失败分类模块。
|
|
17
|
-
* @description 对任务执行过程中的失败进行智能分类,判断失败类型(确定性/可修复/范围不足)、
|
|
18
|
-
* 是否可以自动修复、是否需要升级到人工处理。内置复发检测和修复循环上限机制,
|
|
19
|
-
* 防止无限重试。同时检测上游阶段(需求/设计/权限/DDL/契约)问题,禁止自动修复。
|
|
20
|
-
*/
|
|
21
|
-
/**
|
|
22
|
-
* 不可自动修复的上游阶段关键词映射。
|
|
23
|
-
* @description 当错误输出中包含这些关键词时,判定根因在上游阶段,强制升级到人工处理。
|
|
24
|
-
*/
|
|
25
|
-
const UPSTREAM_PHASE_PATTERNS = [
|
|
26
|
-
{ pattern: /requirement|需求|spec/i, phase: "requirement" },
|
|
27
|
-
{ pattern: /design|架构|设计|DDL|表结构|接口定义/i, phase: "design" },
|
|
28
|
-
{ pattern: /permission|权限|角色|授权/i, phase: "permission" },
|
|
29
|
-
{ pattern: /migration|数据库变更|schema/i, phase: "ddl" },
|
|
30
|
-
{ pattern: /api.*contract|接口契约|swagger/i, phase: "api_contract" },
|
|
31
|
-
];
|
|
32
|
-
/**
|
|
33
|
-
* 失败分类器。
|
|
34
|
-
* @description 通过分析错误输出内容,结合重试计数和复发历史,给出失败类型和处理建议。
|
|
35
|
-
*/
|
|
36
|
-
export class FailureClassifier {
|
|
37
|
-
/** 上一次错误信息(用于判断是否为相同错误) */
|
|
38
|
-
lastError = "";
|
|
39
|
-
/** 历史错误列表(用于复发检测) */
|
|
40
|
-
errorHistory = [];
|
|
41
|
-
/** 最大重试次数 */
|
|
42
|
-
maxRetries;
|
|
43
|
-
/** 最大自动修复次数(防无限循环) */
|
|
44
|
-
maxAutoRepair;
|
|
45
|
-
/**
|
|
46
|
-
* 创建失败分类器实例。
|
|
47
|
-
* @param maxRetries - 最大重试次数,默认 3
|
|
48
|
-
* @param maxAutoRepair - 最大自动修复循环次数,默认 3
|
|
49
|
-
*/
|
|
50
|
-
constructor(maxRetries = 3, maxAutoRepair = 3) {
|
|
51
|
-
this.maxRetries = maxRetries;
|
|
52
|
-
this.maxAutoRepair = maxAutoRepair;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* 分类错误输出,返回失败分类结果。
|
|
56
|
-
* @description 分类优先级:上游阶段检测 > 修复循环上限 > 复发检测(>=4次) >
|
|
57
|
-
* 相同错误检测 > 范围不足检测 > 可修复错误 > 默认可重试。
|
|
58
|
-
* @param errorOutput - 错误输出文本
|
|
59
|
-
* @param retryCount - 当前重试次数
|
|
60
|
-
* @param repairLoopCount - 当前修复循环次数
|
|
61
|
-
* @returns 失败分类结果,包含失败类型、处理动作、是否可自动修复等信息
|
|
62
|
-
*/
|
|
63
|
-
classify(errorOutput, retryCount = 0, repairLoopCount = 0) {
|
|
64
|
-
debug("FailureClassifier", "开始分类错误输出", { retryCount, repairLoopCount });
|
|
65
|
-
const isSameError = errorOutput.trim() === this.lastError.trim();
|
|
66
|
-
this.lastError = errorOutput.trim();
|
|
67
|
-
this.errorHistory.push(errorOutput.trim());
|
|
68
|
-
const retryRemaining = Math.max(0, this.maxRetries - retryCount);
|
|
69
|
-
const recurrenceCount = this.countRecurrence(errorOutput);
|
|
70
|
-
// 检测根因是否在上游阶段
|
|
71
|
-
const upstreamPhase = detectUpstreamPhase(errorOutput);
|
|
72
|
-
// 上游阶段问题不可自动修复,强制升级到人工处理
|
|
73
|
-
if (upstreamPhase) {
|
|
74
|
-
debug("FailureClassifier", "根因在上游阶段,强制升级", { phase: upstreamPhase });
|
|
75
|
-
return {
|
|
76
|
-
failure_type: "deterministic",
|
|
77
|
-
is_same_error: isSameError,
|
|
78
|
-
retry_remaining: retryRemaining,
|
|
79
|
-
action: "escalate",
|
|
80
|
-
phase_origin: upstreamPhase,
|
|
81
|
-
auto_repairable: false,
|
|
82
|
-
escalation_reason: `根因在 ${upstreamPhase} 阶段,禁止自动修复`,
|
|
83
|
-
recurrence_count: recurrenceCount,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
// 修复循环已达上限,停止自动修复并升级
|
|
87
|
-
if (repairLoopCount >= this.maxAutoRepair) {
|
|
88
|
-
debug("FailureClassifier", "修复循环已达上限,停止自动修复", { repairLoopCount, maxAutoRepair: this.maxAutoRepair });
|
|
89
|
-
return {
|
|
90
|
-
failure_type: "deterministic",
|
|
91
|
-
is_same_error: isSameError,
|
|
92
|
-
retry_remaining: retryRemaining,
|
|
93
|
-
action: "escalate",
|
|
94
|
-
phase_origin: "implementation",
|
|
95
|
-
auto_repairable: false,
|
|
96
|
-
escalation_reason: `自动修复循环已达 ${repairLoopCount}/${this.maxAutoRepair} 上限`,
|
|
97
|
-
recurrence_count: recurrenceCount,
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
// 复发检测:同一错误出现 4 次及以上,判定为复发缺陷
|
|
101
|
-
if (recurrenceCount >= 4) {
|
|
102
|
-
debug("FailureClassifier", "同一错误复发次数达到上限", { recurrenceCount });
|
|
103
|
-
return {
|
|
104
|
-
failure_type: "deterministic",
|
|
105
|
-
is_same_error: true,
|
|
106
|
-
retry_remaining: retryRemaining,
|
|
107
|
-
action: "escalate",
|
|
108
|
-
phase_origin: "implementation",
|
|
109
|
-
auto_repairable: false,
|
|
110
|
-
escalation_reason: `同一错误复发 ${recurrenceCount} 次,记录为复发缺陷`,
|
|
111
|
-
recurrence_count: recurrenceCount,
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
if (isSameError) {
|
|
115
|
-
debug("FailureClassifier", "检测到相同错误,升级处理");
|
|
116
|
-
return {
|
|
117
|
-
failure_type: "deterministic",
|
|
118
|
-
is_same_error: true,
|
|
119
|
-
retry_remaining: retryRemaining,
|
|
120
|
-
action: "escalate",
|
|
121
|
-
phase_origin: "implementation",
|
|
122
|
-
auto_repairable: recurrenceCount < 2,
|
|
123
|
-
recurrence_count: recurrenceCount,
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
// 文件/模块找不到 → 范围不足,需要扩大作用域
|
|
127
|
-
if (/cannot find|not found|no such file|import.*not resolved/i.test(errorOutput)) {
|
|
128
|
-
debug("FailureClassifier", "文件/模块未找到,判定为范围不足");
|
|
129
|
-
return {
|
|
130
|
-
failure_type: "scope_insufficient",
|
|
131
|
-
is_same_error: false,
|
|
132
|
-
retry_remaining: retryRemaining,
|
|
133
|
-
action: "expand_scope",
|
|
134
|
-
phase_origin: "implementation",
|
|
135
|
-
auto_repairable: true,
|
|
136
|
-
recurrence_count: recurrenceCount,
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
// 编译/语法错误 → 可自动修复
|
|
140
|
-
if (/error TS|compilation error|syntax error/i.test(errorOutput)) {
|
|
141
|
-
debug("FailureClassifier", "检测到编译/语法错误,判定为可自动修复");
|
|
142
|
-
return {
|
|
143
|
-
failure_type: "fixable",
|
|
144
|
-
is_same_error: false,
|
|
145
|
-
retry_remaining: retryRemaining,
|
|
146
|
-
action: "retry",
|
|
147
|
-
phase_origin: "implementation",
|
|
148
|
-
auto_repairable: true,
|
|
149
|
-
recurrence_count: recurrenceCount,
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
// 默认情况:视为可修复的可重试错误
|
|
153
|
-
debug("FailureClassifier", "默认判定为可修复可重试错误");
|
|
154
|
-
return {
|
|
155
|
-
failure_type: "fixable",
|
|
156
|
-
is_same_error: false,
|
|
157
|
-
retry_remaining: retryRemaining,
|
|
158
|
-
action: "retry",
|
|
159
|
-
phase_origin: "implementation",
|
|
160
|
-
auto_repairable: true,
|
|
161
|
-
recurrence_count: recurrenceCount,
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* 统计指定错误输出在历史中的出现次数。
|
|
166
|
-
* @description 用于复发检测,统计同一错误信息的累计出现频次。
|
|
167
|
-
* @param errorOutput - 待统计的错误输出文本
|
|
168
|
-
* @returns 该错误在历史记录中的出现次数
|
|
169
|
-
*/
|
|
170
|
-
countRecurrence(errorOutput) {
|
|
171
|
-
const normalized = errorOutput.trim();
|
|
172
|
-
return this.errorHistory.filter((e) => e === normalized).length;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* 检测错误输出是否涉及不可自动修复的上游阶段。
|
|
177
|
-
* @description 遍历上游阶段关键词模式,匹配成功则返回对应的阶段名称。
|
|
178
|
-
* @param errorOutput - 错误输出文本
|
|
179
|
-
* @returns 匹配到的上游阶段名称,若未匹配到则返回 undefined
|
|
180
|
-
*/
|
|
181
|
-
function detectUpstreamPhase(errorOutput) {
|
|
182
|
-
for (const { pattern, phase } of UPSTREAM_PHASE_PATTERNS) {
|
|
183
|
-
if (pattern.test(errorOutput))
|
|
184
|
-
return phase;
|
|
185
|
-
}
|
|
186
|
-
return undefined;
|
|
187
|
-
}
|
|
188
|
-
//# sourceMappingURL=failure_classifier.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"failure_classifier.js","sourceRoot":"","sources":["../../../src/verify/audit/failure_classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Controller — ODA 观察-决策-行动循环控制器。
|
|
3
|
-
*
|
|
4
|
-
* 职责边界:
|
|
5
|
-
* - 负责:运行 ODA 循环、决策(fix/next/escalate)、retry 持久化适配
|
|
6
|
-
* - 不负责:探针实现、状态构建、文件读写
|
|
7
|
-
*
|
|
8
|
-
* 被谁调用:sf_work (verify)、ODA 工具层
|
|
9
|
-
* 调用谁:probe_registry、types
|
|
10
|
-
*
|
|
11
|
-
* 数据流:ProbeContext → 探针执行 → 决策 → ODADecision
|
|
12
|
-
* 持久化:通过 RetryCountSource 可选从 GateRecordStore 读取 retry count
|
|
13
|
-
*/
|
|
14
|
-
import type { ProbeContext, ProbeResult, ODADecision } from "./types.js";
|
|
15
|
-
/** retry count 来源抽象(可从内存、GateRecordStore、或其他存储读取) */
|
|
16
|
-
export interface RetryCountSource {
|
|
17
|
-
/** 读取当前 retry count */
|
|
18
|
-
getRetryCount(domain: string, gateName: string): Promise<number>;
|
|
19
|
-
/** 写入 retry count */
|
|
20
|
-
setRetryCount(domain: string, gateName: string, count: number): Promise<void>;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* 运行 ODA 观察-决策循环。
|
|
24
|
-
*
|
|
25
|
-
* @param ctx 探针上下文
|
|
26
|
-
* @param maxRetries 最大修复重试次数(默认 5)
|
|
27
|
-
* @param currentRetry 当前重试次数(内部使用,外部调用不传)
|
|
28
|
-
* @param retrySource 可选的 retry count 持久化源(传入则从存储读取/写入 retry count)
|
|
29
|
-
* @returns ODA 决策结果(包含指令)
|
|
30
|
-
*/
|
|
31
|
-
export declare function runODALoop(ctx: ProbeContext, maxRetries?: number, currentRetry?: number, retrySource?: RetryCountSource): Promise<ODADecision>;
|
|
32
|
-
/**
|
|
33
|
-
* 只运行观察阶段(不决策)— 用于需要检查但不自动修复的场景。
|
|
34
|
-
*
|
|
35
|
-
* @returns 所有探针结果
|
|
36
|
-
*/
|
|
37
|
-
export declare function observeOnly(ctx: ProbeContext): Promise<ProbeResult[]>;
|
|
38
|
-
//# sourceMappingURL=controller.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/verify/oda/controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAOzE,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB;IACvB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,qBAAqB;IACrB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E;AAaD;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,YAAY,EACjB,UAAU,GAAE,MAA4B,EACxC,YAAY,GAAE,MAAU,EACxB,WAAW,CAAC,EAAE,gBAAgB,GAC7B,OAAO,CAAC,WAAW,CAAC,CAsEtB;AA0GD;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAwB3E"}
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Controller — ODA 观察-决策-行动循环控制器。
|
|
3
|
-
*
|
|
4
|
-
* 职责边界:
|
|
5
|
-
* - 负责:运行 ODA 循环、决策(fix/next/escalate)、retry 持久化适配
|
|
6
|
-
* - 不负责:探针实现、状态构建、文件读写
|
|
7
|
-
*
|
|
8
|
-
* 被谁调用:sf_work (verify)、ODA 工具层
|
|
9
|
-
* 调用谁:probe_registry、types
|
|
10
|
-
*
|
|
11
|
-
* 数据流:ProbeContext → 探针执行 → 决策 → ODADecision
|
|
12
|
-
* 持久化:通过 RetryCountSource 可选从 GateRecordStore 读取 retry count
|
|
13
|
-
*/
|
|
14
|
-
import { debug } from "../../shared/logger.js";
|
|
15
|
-
import { probeRegistry } from "./probe_registry.js";
|
|
16
|
-
// ═══════════════════════════════════════════
|
|
17
|
-
// 常量
|
|
18
|
-
// ═══════════════════════════════════════════
|
|
19
|
-
/** 默认最大修复重试次数 */
|
|
20
|
-
const DEFAULT_MAX_RETRIES = 5;
|
|
21
|
-
// ═══════════════════════════════════════════
|
|
22
|
-
// 核心函数
|
|
23
|
-
// ═══════════════════════════════════════════
|
|
24
|
-
/**
|
|
25
|
-
* 运行 ODA 观察-决策循环。
|
|
26
|
-
*
|
|
27
|
-
* @param ctx 探针上下文
|
|
28
|
-
* @param maxRetries 最大修复重试次数(默认 5)
|
|
29
|
-
* @param currentRetry 当前重试次数(内部使用,外部调用不传)
|
|
30
|
-
* @param retrySource 可选的 retry count 持久化源(传入则从存储读取/写入 retry count)
|
|
31
|
-
* @returns ODA 决策结果(包含指令)
|
|
32
|
-
*/
|
|
33
|
-
export async function runODALoop(ctx, maxRetries = DEFAULT_MAX_RETRIES, currentRetry = 0, retrySource) {
|
|
34
|
-
// 从持久化源恢复 retry count(如果提供了 retrySource)
|
|
35
|
-
let effectiveRetry = currentRetry;
|
|
36
|
-
if (retrySource && currentRetry === 0) {
|
|
37
|
-
try {
|
|
38
|
-
const persisted = await retrySource.getRetryCount(ctx.currentStage, "oda-loop");
|
|
39
|
-
if (persisted > 0) {
|
|
40
|
-
effectiveRetry = persisted;
|
|
41
|
-
debug("ODA Controller", `从持久化源恢复 retry count: ${persisted}`);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
// 读取失败 → 用参数值,不阻断
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
// 1. Observe:收集所有适用探针
|
|
49
|
-
const langs = [ctx.techStack.backend.lang, ctx.techStack.frontend.lang];
|
|
50
|
-
const applicableProbes = probeRegistry.getApplicable(langs);
|
|
51
|
-
debug("ODA Controller", `运行 ${applicableProbes.length} 个探针`, {
|
|
52
|
-
langs,
|
|
53
|
-
slice: ctx.currentSlice,
|
|
54
|
-
retry: currentRetry,
|
|
55
|
-
});
|
|
56
|
-
const results = [];
|
|
57
|
-
const failedResults = [];
|
|
58
|
-
for (const { def, fn } of applicableProbes) {
|
|
59
|
-
try {
|
|
60
|
-
const result = await fn(ctx);
|
|
61
|
-
results.push(result);
|
|
62
|
-
if (!result.passed) {
|
|
63
|
-
failedResults.push(result);
|
|
64
|
-
debug("ODA Controller", `探针 ${def.id} 未通过`, {
|
|
65
|
-
findings: result.findings.length,
|
|
66
|
-
evidence: result.evidence,
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
catch (err) {
|
|
71
|
-
// 探针执行异常 → 视为 fail-closed
|
|
72
|
-
const errorResult = {
|
|
73
|
-
probe_id: def.id,
|
|
74
|
-
passed: false,
|
|
75
|
-
severity: def.severity,
|
|
76
|
-
findings: [{
|
|
77
|
-
message: `探针执行异常: ${err instanceof Error ? err.message : String(err)}`,
|
|
78
|
-
}],
|
|
79
|
-
evidence: `探针 ${def.id} 执行时抛出异常`,
|
|
80
|
-
};
|
|
81
|
-
results.push(errorResult);
|
|
82
|
-
failedResults.push(errorResult);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
// 2. Decide:根据结果决策
|
|
86
|
-
const decision = decide(results, failedResults, ctx, maxRetries, effectiveRetry);
|
|
87
|
-
// 持久化 retry count(如果失败且有持久化源)
|
|
88
|
-
if (retrySource && !results.every(r => r.passed)) {
|
|
89
|
-
try {
|
|
90
|
-
await retrySource.setRetryCount(ctx.currentStage, "oda-loop", effectiveRetry + 1);
|
|
91
|
-
}
|
|
92
|
-
catch {
|
|
93
|
-
// 持久化失败 → 不阻断,只记日志
|
|
94
|
-
debug("ODA Controller", "retry count 持久化失败");
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return decision;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* 决策函数 — 纯逻辑,无副作用。
|
|
101
|
-
*
|
|
102
|
-
* 决策规则:
|
|
103
|
-
* - 有 hard_fail 且未超重试限制 → fix
|
|
104
|
-
* - 连续重试超限 → escalate
|
|
105
|
-
* - 全通过 → next
|
|
106
|
-
*/
|
|
107
|
-
function decide(results, failedResults, ctx, maxRetries, currentRetry) {
|
|
108
|
-
const totalProbesRun = results.length;
|
|
109
|
-
const passedCount = results.filter(r => r.passed).length;
|
|
110
|
-
const failedCount = failedResults.length;
|
|
111
|
-
// 全通过 → next
|
|
112
|
-
if (failedCount === 0) {
|
|
113
|
-
return {
|
|
114
|
-
directive: {
|
|
115
|
-
type: "next",
|
|
116
|
-
target: buildNextTarget(ctx),
|
|
117
|
-
},
|
|
118
|
-
findings_summary: `全部 ${totalProbesRun} 个探针通过`,
|
|
119
|
-
total_probes_run: totalProbesRun,
|
|
120
|
-
passed_count: passedCount,
|
|
121
|
-
failed_count: 0,
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
// 检查是否超过重试限制
|
|
125
|
-
if (currentRetry >= maxRetries) {
|
|
126
|
-
const allFindings = failedResults.flatMap(r => r.findings);
|
|
127
|
-
return {
|
|
128
|
-
directive: {
|
|
129
|
-
type: "escalate",
|
|
130
|
-
reason: `连续 ${maxRetries} 轮修复仍未通过所有探针(${failedCount} 个探针未通过)`,
|
|
131
|
-
human_action: `请人工检查以下探针发现的问题:\n${allFindings.map(f => `- ${f.message}`).join("\n")}`,
|
|
132
|
-
},
|
|
133
|
-
findings_summary: `${failedCount}/${totalProbesRun} 个探针未通过,已达到最大重试次数 ${maxRetries}`,
|
|
134
|
-
total_probes_run: totalProbesRun,
|
|
135
|
-
passed_count: passedCount,
|
|
136
|
-
failed_count: failedCount,
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
// 有失败且未超限 → fix
|
|
140
|
-
const hardFailFindings = failedResults
|
|
141
|
-
.filter(r => r.severity === "hard_fail")
|
|
142
|
-
.flatMap(r => r.findings);
|
|
143
|
-
const warningFindings = failedResults
|
|
144
|
-
.filter(r => r.severity === "warning")
|
|
145
|
-
.flatMap(r => r.findings);
|
|
146
|
-
// fix 指令中的 items 包含所有 hard_fail 的 findings
|
|
147
|
-
const items = hardFailFindings.length > 0 ? hardFailFindings : warningFindings;
|
|
148
|
-
return {
|
|
149
|
-
directive: {
|
|
150
|
-
type: "fix",
|
|
151
|
-
items,
|
|
152
|
-
recovery_command: `sf_task review --slice ${ctx.currentSlice}`,
|
|
153
|
-
remaining_retries: maxRetries - currentRetry,
|
|
154
|
-
},
|
|
155
|
-
findings_summary: formatFindingsSummary(results, failedResults),
|
|
156
|
-
total_probes_run: totalProbesRun,
|
|
157
|
-
passed_count: passedCount,
|
|
158
|
-
failed_count: failedCount,
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
// ═══════════════════════════════════════════
|
|
162
|
-
// 辅助函数
|
|
163
|
-
// ═══════════════════════════════════════════
|
|
164
|
-
/** 构建下一个任务目标描述 */
|
|
165
|
-
function buildNextTarget(ctx) {
|
|
166
|
-
return `切片 ${ctx.currentSlice} 所有探针通过,可执行下一步操作`;
|
|
167
|
-
}
|
|
168
|
-
/** 格式化发现项摘要 */
|
|
169
|
-
function formatFindingsSummary(allResults, failedResults) {
|
|
170
|
-
const parts = [];
|
|
171
|
-
for (const result of failedResults) {
|
|
172
|
-
const count = result.findings.length;
|
|
173
|
-
parts.push(`${result.probe_id}: ${count} 项不通过`);
|
|
174
|
-
}
|
|
175
|
-
const passedCount = allResults.length - failedResults.length;
|
|
176
|
-
if (passedCount > 0) {
|
|
177
|
-
parts.push(`${passedCount} 个探针通过`);
|
|
178
|
-
}
|
|
179
|
-
return parts.join(";");
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* 只运行观察阶段(不决策)— 用于需要检查但不自动修复的场景。
|
|
183
|
-
*
|
|
184
|
-
* @returns 所有探针结果
|
|
185
|
-
*/
|
|
186
|
-
export async function observeOnly(ctx) {
|
|
187
|
-
const langs = [ctx.techStack.backend.lang, ctx.techStack.frontend.lang];
|
|
188
|
-
const applicableProbes = probeRegistry.getApplicable(langs);
|
|
189
|
-
const results = [];
|
|
190
|
-
for (const { fn } of applicableProbes) {
|
|
191
|
-
try {
|
|
192
|
-
const result = await fn(ctx);
|
|
193
|
-
results.push(result);
|
|
194
|
-
}
|
|
195
|
-
catch (err) {
|
|
196
|
-
results.push({
|
|
197
|
-
probe_id: "unknown",
|
|
198
|
-
passed: false,
|
|
199
|
-
severity: "hard_fail",
|
|
200
|
-
findings: [{
|
|
201
|
-
message: `探针执行异常: ${err instanceof Error ? err.message : String(err)}`,
|
|
202
|
-
}],
|
|
203
|
-
evidence: "探针执行时抛出异常",
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
return results;
|
|
208
|
-
}
|
|
209
|
-
//# sourceMappingURL=controller.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../src/verify/oda/controller.ts"],"names":[],"mappings":"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"}
|