soloforge 1.1.53 → 1.1.55
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/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 +3 -3
- 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 +37 -10
- package/dist/core/condition_evaluators.d.ts.map +1 -1
- package/dist/core/condition_evaluators.js +27 -70
- package/dist/core/condition_evaluators.js.map +1 -1
- 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 +1 -1
- package/dist/core/git_utils.js +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 +24 -18
- 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 +16 -7
- 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 +11 -1
- 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 +19 -4
- 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 +56 -31
- package/dist/domain/contracts/artifact_schema_registry.js.map +1 -1
- package/dist/domain/contracts/design_lifecycle_contract.js +2 -2
- 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 +9 -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 +8 -2
- 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 +6 -1
- 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 +10 -5
- 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 +37 -29
- 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 +8 -0
- 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 +115 -53
- 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 +2 -0
- package/templates/build//347/274/226/347/240/201/347/272/252/345/276/213.md +2 -2
- package/templates/design/enforced.md +19 -6
- 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 +2 -1
- 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 +1 -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
|
@@ -11,258 +11,5 @@
|
|
|
11
11
|
* 数据流:审计输入(代码/配置) → 检查 → 评分/报告
|
|
12
12
|
* 持久化:无持久化(纯计算/内存态)
|
|
13
13
|
*/
|
|
14
|
-
export
|
|
15
|
-
planGate: "SF-PLAN-5001",
|
|
16
|
-
instructionContract: "SF-INSTR-5801",
|
|
17
|
-
oodMissingSummary: "SF-OOD-6601",
|
|
18
|
-
oodDeliveryBlock: "SF-OOD-6602",
|
|
19
|
-
backendMissingSummary: "SF-BACKEND-6701",
|
|
20
|
-
backendDeliveryBlock: "SF-BACKEND-6702",
|
|
21
|
-
codeObservabilityWorkPackage: "SF-OBS-6801",
|
|
22
|
-
codeObservabilityFinding: "SF-OBS-6802",
|
|
23
|
-
projectKnowledgeBlocked: "SF-PK-6901",
|
|
24
|
-
contractDraft: "SF-CONTRACT-0003",
|
|
25
|
-
verifyPlanMismatch: "SF-VERIFY-5002",
|
|
26
|
-
};
|
|
27
|
-
const BUILTIN_DIAGNOSTICS = [
|
|
28
|
-
// STATE 领域
|
|
29
|
-
{ code: "SF-STATE-0001", area: "STATE", severity: "blocking", status: "active",
|
|
30
|
-
title_zh: "非法状态转移: failed → completed",
|
|
31
|
-
user_message_zh: "任务已失败,不能直接标记完成。需要人工确认恢复后重新验证。",
|
|
32
|
-
recovery_hint_zh: "检查失败原因,修复后重新执行验证流程。",
|
|
33
|
-
owner_component: "engine/task_context", evidence_refs: ["task_context状态机"] },
|
|
34
|
-
{ code: "SF-STATE-0002", area: "STATE", severity: "blocking", status: "active",
|
|
35
|
-
title_zh: "非法状态转移: blocked → completed",
|
|
36
|
-
user_message_zh: "任务被阻断,不能直接标记完成。需要解除阻断条件。",
|
|
37
|
-
recovery_hint_zh: "检查阻断原因,解决阻断条件后重试。",
|
|
38
|
-
owner_component: "engine/task_context", evidence_refs: ["task_context状态机"] },
|
|
39
|
-
{ code: "SF-STATE-0003", area: "STATE", severity: "blocking", status: "active",
|
|
40
|
-
title_zh: "非法状态转移: requires_human → completed",
|
|
41
|
-
user_message_zh: "任务需要人工确认,不能自动标记完成。",
|
|
42
|
-
recovery_hint_zh: "等待人工确认后继续。",
|
|
43
|
-
owner_component: "engine/task_context", evidence_refs: ["task_context状态机"] },
|
|
44
|
-
// GUARD 领域
|
|
45
|
-
{ code: "SF-GUARD-0001", area: "GUARD", severity: "blocking", status: "active",
|
|
46
|
-
title_zh: "只读工作流写入业务源码",
|
|
47
|
-
user_message_zh: "当前工作流不允许写入业务源码,操作已阻断。",
|
|
48
|
-
recovery_hint_zh: "检查路由是否正确,或切换到允许写入的工作流。",
|
|
49
|
-
owner_component: "engine/enforcement_guard", evidence_refs: ["enforcement_guard写入护栏"] },
|
|
50
|
-
{ code: "SF-GUARD-0002", area: "GUARD", severity: "blocking", status: "active",
|
|
51
|
-
title_zh: "超出 output artifact 范围写入",
|
|
52
|
-
user_message_zh: "source_extraction 工作流只能写入指定的 output artifact 路径。",
|
|
53
|
-
recovery_hint_zh: "确认输出路径是否在允许范围内。",
|
|
54
|
-
owner_component: "engine/enforcement_guard", evidence_refs: ["enforcement_guard范围护栏"] },
|
|
55
|
-
{ code: "SF-GUARD-0003", area: "GUARD", severity: "blocking", status: "active",
|
|
56
|
-
title_zh: "破坏性命令未经人工确认",
|
|
57
|
-
user_message_zh: "检测到破坏性命令(如删除、覆盖)但缺少人工确认。操作已阻止。",
|
|
58
|
-
recovery_hint_zh: "请通过 sf_task confirm 确认执行,或调整命令为非破坏性操作。",
|
|
59
|
-
owner_component: "engine/enforcement_guard", evidence_refs: ["enforcement_guard执行护栏"] },
|
|
60
|
-
{ code: "SF-GUARD-0004", area: "GUARD", severity: "blocking", status: "active",
|
|
61
|
-
title_zh: "不可注入知识条目被注入到 prompt",
|
|
62
|
-
user_message_zh: "知识条目的 status 或 scope 不允许注入,但被尝试注入。操作已阻止。",
|
|
63
|
-
recovery_hint_zh: "检查知识条目的 lifecycle status 和 injection 权限。",
|
|
64
|
-
owner_component: "engine/enforcement_guard", evidence_refs: ["enforcement_guard知识护栏"] },
|
|
65
|
-
{ code: "SF-GUARD-0005", area: "GUARD", severity: "blocking", status: "active",
|
|
66
|
-
title_zh: "prompt 超出工作流契约权限",
|
|
67
|
-
user_message_zh: "当前工作流不允许此 prompt 内容或权限级别。操作已阻止。",
|
|
68
|
-
recovery_hint_zh: "检查工作流契约的 prompt 权限配置。",
|
|
69
|
-
owner_component: "engine/enforcement_guard", evidence_refs: ["enforcement_guard prompt护栏"] },
|
|
70
|
-
{ code: "SF-GUARD-0006", area: "GUARD", severity: "blocking", status: "active",
|
|
71
|
-
title_zh: "外部副作用无 evidence 记录",
|
|
72
|
-
user_message_zh: "检测到外部副作用操作(push/PR/deploy)但缺少 evidence 记录。",
|
|
73
|
-
recovery_hint_zh: "确保所有外部副作用操作有完整的 evidence chain。",
|
|
74
|
-
owner_component: "engine/enforcement_guard", evidence_refs: ["enforcement_guard副作用护栏"] },
|
|
75
|
-
// VERIFY 领域
|
|
76
|
-
{ code: "SF-VERIFY-0001", area: "VERIFY", severity: "critical", status: "active",
|
|
77
|
-
title_zh: "验证计划被当作验证证据",
|
|
78
|
-
user_message_zh: "检测到只有验证计划没有验证结果。计划不得替代真实执行。",
|
|
79
|
-
recovery_hint_zh: "执行验证命令获取真实结果。",
|
|
80
|
-
owner_component: "engine/verification_contract", evidence_refs: ["verification_contract分离"] },
|
|
81
|
-
{ code: "SF-VERIFY-0002", area: "VERIFY", severity: "blocking", status: "active",
|
|
82
|
-
title_zh: "未验证但尝试交付",
|
|
83
|
-
user_message_zh: "任务未通过验证,不允许交付。",
|
|
84
|
-
recovery_hint_zh: "先完成验证流程,确保所有检查通过。",
|
|
85
|
-
owner_component: "engine/delivery_readiness", evidence_refs: ["delivery_readiness门控"] },
|
|
86
|
-
// FAILURE 领域
|
|
87
|
-
{ code: "SF-FAILURE-0001", area: "FAILURE", severity: "critical", status: "active",
|
|
88
|
-
title_zh: "重试预算耗尽",
|
|
89
|
-
user_message_zh: "失败重试次数已达上限,需要人工介入。",
|
|
90
|
-
recovery_hint_zh: "检查错误根因,手动修复后重新执行。",
|
|
91
|
-
owner_component: "engine/recovery_policy", evidence_refs: ["recovery_policy预算"] },
|
|
92
|
-
{ code: "SF-FAILURE-0002", area: "FAILURE", severity: "warning", status: "active",
|
|
93
|
-
title_zh: "外部副作用部分执行",
|
|
94
|
-
user_message_zh: "检测到外部副作用部分执行,已记录已发生动作。",
|
|
95
|
-
recovery_hint_zh: "检查已执行副作用,确认是否需要回滚。",
|
|
96
|
-
owner_component: "engine/recovery_policy", evidence_refs: ["recovery_policy副作用"] },
|
|
97
|
-
// DEGRADE 领域
|
|
98
|
-
{ code: "SF-DEGRADE-0001", area: "DEGRADE", severity: "warning", status: "active",
|
|
99
|
-
title_zh: "验证器不可用,降级运行",
|
|
100
|
-
user_message_zh: "验证器不可用,当前为降级模式。结果未经验证。",
|
|
101
|
-
recovery_hint_zh: "等待验证器恢复后重新验证,或人工确认。",
|
|
102
|
-
owner_component: "engine/degradation", evidence_refs: ["degradation降级"] },
|
|
103
|
-
// WORKSPACE 领域
|
|
104
|
-
{ code: "SF-WORKSPACE-0001", area: "WORKSPACE", severity: "blocking", status: "active",
|
|
105
|
-
title_zh: "并发写入冲突",
|
|
106
|
-
user_message_zh: "检测到其他任务正在写入相同文件范围,操作已阻断。",
|
|
107
|
-
recovery_hint_zh: "等待其他任务完成或人工协调写入顺序。",
|
|
108
|
-
owner_component: "engine/workspace_lease", evidence_refs: ["workspace_lease冲突"] },
|
|
109
|
-
// OBSERVE 领域
|
|
110
|
-
{ code: "SF-OBSERVE-0001", area: "OBSERVE", severity: "warning", status: "active",
|
|
111
|
-
title_zh: "TaskContext 尝试存储敏感原文",
|
|
112
|
-
user_message_zh: "检测到尝试将敏感信息存入 TaskContext,已自动脱敏。",
|
|
113
|
-
recovery_hint_zh: "确认脱敏后的内容是否满足需求。",
|
|
114
|
-
owner_component: "engine/task_context", evidence_refs: ["task_context边界"] },
|
|
115
|
-
// CONTRACT 领域
|
|
116
|
-
{ code: "SF-CONTRACT-0001", area: "CONTRACT", severity: "blocking", status: "active",
|
|
117
|
-
title_zh: "引用已废弃/已移除的契约",
|
|
118
|
-
user_message_zh: "工作流引用了已废弃或已移除的契约,操作已阻断。",
|
|
119
|
-
recovery_hint_zh: "迁移到替代契约或更新工作流配置。",
|
|
120
|
-
owner_component: "engine/contract_registry", evidence_refs: ["contract_registry门控"] },
|
|
121
|
-
// PRIVACY 领域
|
|
122
|
-
{ code: "SF-PRIVACY-0001", area: "PRIVACY", severity: "blocking", status: "active",
|
|
123
|
-
title_zh: "命令输出包含敏感信息",
|
|
124
|
-
user_message_zh: "命令执行输出检测到敏感信息,已自动脱敏存储。",
|
|
125
|
-
recovery_hint_zh: "检查脱敏后内容,确认是否需要重新执行。",
|
|
126
|
-
owner_component: "engine/privacy_secret_contract", evidence_refs: ["privacy脱敏"] },
|
|
127
|
-
{ code: TOOL_DIAGNOSTIC_CODES.planGate, area: "GUARD", severity: "blocking", status: "active",
|
|
128
|
-
title_zh: "写工具缺少计划前置门",
|
|
129
|
-
user_message_zh: "写入类工具执行前缺少已确认的计划。",
|
|
130
|
-
recovery_hint_zh: "先完成 sf_task → sf_work,并确认执行计划。",
|
|
131
|
-
owner_component: "server/tools", evidence_refs: ["PlanProposalFirstGate"] },
|
|
132
|
-
{ code: TOOL_DIAGNOSTIC_CODES.instructionContract, area: "CONTRACT", severity: "blocking", status: "active",
|
|
133
|
-
title_zh: "施工指令契约未就绪",
|
|
134
|
-
user_message_zh: "施工指令缺少目标、范围、验收或禁止绕过项。",
|
|
135
|
-
recovery_hint_zh: "补齐施工指令后再执行写入。",
|
|
136
|
-
owner_component: "engine/instruction_contract", evidence_refs: ["InstructionContract"] },
|
|
137
|
-
{ code: TOOL_DIAGNOSTIC_CODES.oodMissingSummary, area: "CONTRACT", severity: "blocking", status: "active",
|
|
138
|
-
title_zh: "OOD/SOLID 摘要缺失",
|
|
139
|
-
user_message_zh: "复杂实现任务缺少面向对象与 SOLID 设计摘要。",
|
|
140
|
-
recovery_hint_zh: "先补齐职责、依赖方向、扩展点和边界说明。",
|
|
141
|
-
owner_component: "engine/ood_solid_contract", evidence_refs: ["OOD/SOLID契约"] },
|
|
142
|
-
{ code: TOOL_DIAGNOSTIC_CODES.oodDeliveryBlock, area: "DELIVER", severity: "blocking", status: "active",
|
|
143
|
-
title_zh: "OOD/SOLID 问题未闭合",
|
|
144
|
-
user_message_zh: "实现仍存在职责、依赖或扩展性硬失败,不能交付。",
|
|
145
|
-
recovery_hint_zh: "修复 OOD/SOLID finding 后重新验证。",
|
|
146
|
-
owner_component: "engine/ood_solid_contract", evidence_refs: ["OOD/SOLID交付门"] },
|
|
147
|
-
{ code: TOOL_DIAGNOSTIC_CODES.backendMissingSummary, area: "CONTRACT", severity: "blocking", status: "active",
|
|
148
|
-
title_zh: "后端工程契约摘要缺失",
|
|
149
|
-
user_message_zh: "后端实现缺少参数、事务、权限、幂等或审计等工程契约。",
|
|
150
|
-
recovery_hint_zh: "补齐后端实现工作包后再编码。",
|
|
151
|
-
owner_component: "engine/backend_implementation_contract", evidence_refs: ["后端工程契约"] },
|
|
152
|
-
{ code: TOOL_DIAGNOSTIC_CODES.backendDeliveryBlock, area: "DELIVER", severity: "blocking", status: "active",
|
|
153
|
-
title_zh: "后端工程契约未闭合",
|
|
154
|
-
user_message_zh: "后端实现仍存在参数校验、事务、安全或审计硬失败,不能交付。",
|
|
155
|
-
recovery_hint_zh: "修复后端工程 finding 后重新验证。",
|
|
156
|
-
owner_component: "engine/backend_implementation_contract", evidence_refs: ["后端工程交付门"] },
|
|
157
|
-
{ code: TOOL_DIAGNOSTIC_CODES.codeObservabilityWorkPackage, area: "OBSERVE", severity: "blocking", status: "active",
|
|
158
|
-
title_zh: "代码可维护性与可观测性工作包缺失",
|
|
159
|
-
user_message_zh: "业务编码前缺少必要注释、日志和脱敏约束。",
|
|
160
|
-
recovery_hint_zh: "先生成并确认代码可维护性与可观测性工作包。",
|
|
161
|
-
owner_component: "engine/code_maintainability_observability_contract", evidence_refs: ["问题六十八"] },
|
|
162
|
-
{ code: TOOL_DIAGNOSTIC_CODES.codeObservabilityFinding, area: "OBSERVE", severity: "blocking", status: "active",
|
|
163
|
-
title_zh: "代码可维护性与可观测性 finding 未闭合",
|
|
164
|
-
user_message_zh: "代码存在敏感日志、不可定位日志、吞异常或关键操作缺日志,不能交付。",
|
|
165
|
-
recovery_hint_zh: "修复注释/日志 finding 后重新验证。",
|
|
166
|
-
owner_component: "engine/code_maintainability_observability_contract", evidence_refs: ["问题六十八"] },
|
|
167
|
-
{ code: TOOL_DIAGNOSTIC_CODES.projectKnowledgeBlocked, area: "CONTRACT", severity: "blocking", status: "active",
|
|
168
|
-
title_zh: "用户项目知识规则不可消费",
|
|
169
|
-
user_message_zh: "项目 .soloforge/knowledge 中存在 hard rule 路由、触发条件或身份冲突,不能进入执行、审查、验证或交付。",
|
|
170
|
-
recovery_hint_zh: "运行 sf_knowledge action=audit,修复规则 frontmatter、routes、triggers 或冲突后重试。",
|
|
171
|
-
owner_component: "context/contracts/project_knowledge_contract", evidence_refs: ["用户项目知识消费体系"] },
|
|
172
|
-
{ code: TOOL_DIAGNOSTIC_CODES.contractDraft, area: "CONTRACT", severity: "blocking", status: "active",
|
|
173
|
-
title_zh: "设计产物仍为草稿",
|
|
174
|
-
user_message_zh: "设计产物未通过契约验证或仍是草稿,不能交付。",
|
|
175
|
-
recovery_hint_zh: "修复设计产物后重新执行阶段工具,确定性门禁自动复验。",
|
|
176
|
-
owner_component: "engine/standard_asset_contract", evidence_refs: ["标准资产契约"] },
|
|
177
|
-
{ code: TOOL_DIAGNOSTIC_CODES.verifyPlanMismatch, area: "VERIFY", severity: "blocking", status: "active",
|
|
178
|
-
title_zh: "验证计划不匹配",
|
|
179
|
-
user_message_zh: "请求的验证计划与当前任务计划不一致。",
|
|
180
|
-
recovery_hint_zh: "使用当前任务的 plan_id 重新执行验证。",
|
|
181
|
-
owner_component: "server/tools", evidence_refs: ["VerificationPlan"] },
|
|
182
|
-
];
|
|
183
|
-
let runtimeDiagnostics = null;
|
|
184
|
-
function getRegistry() {
|
|
185
|
-
if (!runtimeDiagnostics) {
|
|
186
|
-
runtimeDiagnostics = new Map();
|
|
187
|
-
for (const entry of BUILTIN_DIAGNOSTICS) {
|
|
188
|
-
runtimeDiagnostics.set(entry.code, { ...entry });
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
return runtimeDiagnostics;
|
|
192
|
-
}
|
|
193
|
-
/** 按 code 获取诊断码 */
|
|
194
|
-
export function getDiagnosticByCode(code) {
|
|
195
|
-
return getRegistry().get(code);
|
|
196
|
-
}
|
|
197
|
-
/** 列出所有诊断码 */
|
|
198
|
-
export function listAllDiagnostics() {
|
|
199
|
-
return [...getRegistry().values()];
|
|
200
|
-
}
|
|
201
|
-
/** 按领域列出诊断码 */
|
|
202
|
-
export function listDiagnosticsByArea(area) {
|
|
203
|
-
return [...getRegistry().values()].filter((d) => d.area === area);
|
|
204
|
-
}
|
|
205
|
-
/** 按 severity 列出诊断码 */
|
|
206
|
-
export function listDiagnosticsBySeverity(severity) {
|
|
207
|
-
return [...getRegistry().values()].filter((d) => d.severity === severity);
|
|
208
|
-
}
|
|
209
|
-
/** 注册新诊断码(运行时) */
|
|
210
|
-
export function registerDiagnostic(entry) {
|
|
211
|
-
const registry = getRegistry();
|
|
212
|
-
if (registry.has(entry.code)) {
|
|
213
|
-
return { success: false, error: `诊断码 ${entry.code} 已存在` };
|
|
214
|
-
}
|
|
215
|
-
if (!/^SF-[A-Z]+-\d{4}$/.test(entry.code)) {
|
|
216
|
-
return { success: false, error: `诊断码格式错误: ${entry.code},必须为 SF-{AREA}-{NNNN}` };
|
|
217
|
-
}
|
|
218
|
-
if (!entry.title_zh || !entry.user_message_zh || !entry.recovery_hint_zh) {
|
|
219
|
-
return { success: false, error: "诊断码必须有 title_zh、user_message_zh、recovery_hint_zh" };
|
|
220
|
-
}
|
|
221
|
-
registry.set(entry.code, { ...entry });
|
|
222
|
-
return { success: true };
|
|
223
|
-
}
|
|
224
|
-
/** 创建诊断事件 */
|
|
225
|
-
export function createDiagnosticEvent(code, context, contractId, taskId) {
|
|
226
|
-
const entry = getRegistry().get(code);
|
|
227
|
-
if (!entry)
|
|
228
|
-
return null;
|
|
229
|
-
if (entry.status === "deprecated" || entry.status === "removed")
|
|
230
|
-
return null;
|
|
231
|
-
return {
|
|
232
|
-
code,
|
|
233
|
-
occurred_at: new Date().toISOString(),
|
|
234
|
-
context: context ?? {},
|
|
235
|
-
user_visible_message: entry.user_message_zh,
|
|
236
|
-
contract_id: contractId,
|
|
237
|
-
task_id: taskId,
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
/** 验证所有 blocking/critical 事件必须有诊断码 */
|
|
241
|
-
export function validateDiagnosticCoverage(eventSeverities) {
|
|
242
|
-
const errors = [];
|
|
243
|
-
for (const event of eventSeverities) {
|
|
244
|
-
if ((event.severity === "blocking" || event.severity === "critical") && !event.has_code) {
|
|
245
|
-
errors.push({
|
|
246
|
-
severity: event.severity,
|
|
247
|
-
error: `${event.severity} 事件缺少诊断码`,
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
return errors;
|
|
252
|
-
}
|
|
253
|
-
/** 重置注册表(测试用) */
|
|
254
|
-
export function resetDiagnosticRegistry() {
|
|
255
|
-
runtimeDiagnostics = null;
|
|
256
|
-
}
|
|
257
|
-
/** 获取诊断码统计 */
|
|
258
|
-
export function getDiagnosticStats() {
|
|
259
|
-
const entries = [...getRegistry().values()];
|
|
260
|
-
const by_area = {};
|
|
261
|
-
const by_severity = {};
|
|
262
|
-
for (const e of entries) {
|
|
263
|
-
by_area[e.area] = (by_area[e.area] ?? 0) + 1;
|
|
264
|
-
by_severity[e.severity] = (by_severity[e.severity] ?? 0) + 1;
|
|
265
|
-
}
|
|
266
|
-
return { total: entries.length, by_area, by_severity };
|
|
267
|
-
}
|
|
14
|
+
export {};
|
|
268
15
|
//# sourceMappingURL=diagnostic_registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostic_registry.js","sourceRoot":"","sources":["../../src/shared/diagnostic_registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG
|
|
1
|
+
{"version":3,"file":"diagnostic_registry.js","sourceRoot":"","sources":["../../src/shared/diagnostic_registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
* glob_path — 核心基础层模块。
|
|
3
3
|
*
|
|
4
4
|
* 职责边界:
|
|
5
|
-
* - 负责:轻量 glob
|
|
5
|
+
* - 负责:轻量 glob 路径匹配(支持多段 `*`,每段不跨目录)与产物路径存在性判定
|
|
6
6
|
* - 不负责:完整 glob 引擎(`**` / `?` / `[]` 不支持),那些场景应引入专用库
|
|
7
7
|
*
|
|
8
|
-
* 被谁调用:原型说明多端路径(`docs/analyze/{端}/
|
|
8
|
+
* 被谁调用:原型说明多端路径(`docs/analyze/{端}/pages/{页}-原型说明.md`)等带通配符的产物路径检查
|
|
9
9
|
* 调用谁:node:fs、node:path
|
|
10
10
|
*
|
|
11
11
|
* 数据流:glob 模式 → 字符串匹配 / 文件系统遍历 → 命中结果
|
|
12
12
|
* 持久化:无持久化(纯计算 / 只读文件系统)
|
|
13
13
|
*
|
|
14
|
-
* 设计说明:原型说明等多端产物的 glob
|
|
14
|
+
* 设计说明:原型说明等多端产物的 glob 模式可含多段 `*`(每段不跨目录,如 docs/analyze/{端}/pages/{页}-原型说明.md),
|
|
15
15
|
* 不需要完整 glob 引擎。本模块采用自研的递归遍历思路,
|
|
16
16
|
* 零第三方依赖、保持 engines.node >=18 兼容。
|
|
17
17
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glob_path.d.ts","sourceRoot":"","sources":["../../src/shared/glob_path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAWH;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAE/C;AAwBD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAIpE;AA2CD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"glob_path.d.ts","sourceRoot":"","sources":["../../src/shared/glob_path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAWH;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAE/C;AAwBD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAIpE;AA2CD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAW5E;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAWjF"}
|
package/dist/shared/glob_path.js
CHANGED
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
* glob_path — 核心基础层模块。
|
|
3
3
|
*
|
|
4
4
|
* 职责边界:
|
|
5
|
-
* - 负责:轻量 glob
|
|
5
|
+
* - 负责:轻量 glob 路径匹配(支持多段 `*`,每段不跨目录)与产物路径存在性判定
|
|
6
6
|
* - 不负责:完整 glob 引擎(`**` / `?` / `[]` 不支持),那些场景应引入专用库
|
|
7
7
|
*
|
|
8
|
-
* 被谁调用:原型说明多端路径(`docs/analyze/{端}/
|
|
8
|
+
* 被谁调用:原型说明多端路径(`docs/analyze/{端}/pages/{页}-原型说明.md`)等带通配符的产物路径检查
|
|
9
9
|
* 调用谁:node:fs、node:path
|
|
10
10
|
*
|
|
11
11
|
* 数据流:glob 模式 → 字符串匹配 / 文件系统遍历 → 命中结果
|
|
12
12
|
* 持久化:无持久化(纯计算 / 只读文件系统)
|
|
13
13
|
*
|
|
14
|
-
* 设计说明:原型说明等多端产物的 glob
|
|
14
|
+
* 设计说明:原型说明等多端产物的 glob 模式可含多段 `*`(每段不跨目录,如 docs/analyze/{端}/pages/{页}-原型说明.md),
|
|
15
15
|
* 不需要完整 glob 引擎。本模块采用自研的递归遍历思路,
|
|
16
16
|
* 零第三方依赖、保持 engines.node >=18 兼容。
|
|
17
17
|
*/
|
|
@@ -44,7 +44,7 @@ function globToRegExpSource(pattern) {
|
|
|
44
44
|
if (ch === "*") {
|
|
45
45
|
src += "[^/]*";
|
|
46
46
|
}
|
|
47
|
-
else if (/[$^()+.\\|{}]/.test(ch)) {
|
|
47
|
+
else if (/[$^()+.\\|{}[\]]/.test(ch)) {
|
|
48
48
|
src += "\\" + ch;
|
|
49
49
|
}
|
|
50
50
|
else {
|
|
@@ -66,7 +66,7 @@ export function matchGlob(filePath, pattern) {
|
|
|
66
66
|
}
|
|
67
67
|
/**
|
|
68
68
|
* 从 glob 模式提取首个 `*` 之前的固定目录前缀(相对 rootDir)。
|
|
69
|
-
* 例:`docs/analyze/{端}/
|
|
69
|
+
* 例:`docs/analyze/{端}/pages/{页}-原型说明.md` → `docs/analyze`(只遍历该子树,避免扫全项目)。
|
|
70
70
|
*/
|
|
71
71
|
function globSearchSubdir(pattern) {
|
|
72
72
|
const starIdx = pattern.indexOf("*");
|
|
@@ -114,6 +114,8 @@ function collectFilesFrom(rootDir, searchSubdir) {
|
|
|
114
114
|
* - pattern 含 `?` / `[`:保守按字面 existsSync(不误判)
|
|
115
115
|
*/
|
|
116
116
|
export function artifactPathExists(rootDir, pattern) {
|
|
117
|
+
if (!pattern || pattern.trim() === "")
|
|
118
|
+
return false; // 空 pattern 防护:path.join(root,"")=root → existsSync 恒 true(假存在,绕过产物门禁)
|
|
117
119
|
if (!containsGlob(pattern)) {
|
|
118
120
|
return fs.existsSync(path.join(rootDir, pattern));
|
|
119
121
|
}
|
|
@@ -132,6 +134,8 @@ export function artifactPathExists(rootDir, pattern) {
|
|
|
132
134
|
* - pattern 含 `?` / `[`:保守按字面
|
|
133
135
|
*/
|
|
134
136
|
export function resolveArtifactsByGlob(rootDir, pattern) {
|
|
137
|
+
if (!pattern || pattern.trim() === "")
|
|
138
|
+
return []; // 空 pattern 防护:避免返回 [""] 伪命中(loadUpstreamContent/loadArtifactAggregate 据此读文件)
|
|
135
139
|
if (!containsGlob(pattern)) {
|
|
136
140
|
return fs.existsSync(path.join(rootDir, pattern)) ? [pattern] : [];
|
|
137
141
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glob_path.js","sourceRoot":"","sources":["../../src/shared/glob_path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,8CAA8C;AAC9C,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEnC,iDAAiD;AACjD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AAEnF;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,OAAe;IACzC,4CAA4C;IAC5C,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAChE,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACzB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,GAAG,IAAI,OAAO,CAAC;QACjB,CAAC;aAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"glob_path.js","sourceRoot":"","sources":["../../src/shared/glob_path.ts"],"names":[],"mappings":"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"}
|
package/dist/shared/helpers.d.ts
CHANGED
|
@@ -38,8 +38,10 @@ export declare function errorMessage(e: unknown): string;
|
|
|
38
38
|
export declare function safeJsonParse<T>(text: string): T | undefined;
|
|
39
39
|
export declare function safeJsonParse<T>(text: string, fallback: T): T;
|
|
40
40
|
/**
|
|
41
|
-
*
|
|
42
|
-
*
|
|
41
|
+
* 安全截断字符串 — 避免在 UTF-16 代理对中间截断导致乱码/损坏。
|
|
42
|
+
* JS 字符串是 UTF-16:emoji/扩展 CJK 等占两个码元(高位 0xD800-0xDBFF + 低位 0xDC00-0xDFFF)。
|
|
43
|
+
* str.slice(0,N) 按码元切,若 N 落在代理对中间会把高位孤悬 → 下游 JSON.stringify 抛错 / LLM 乱码。
|
|
44
|
+
* 截断处码元若在高代理位(下一码元是低代理却没配对)→ 退一位再拼 suffix。短于 max 原样返回。
|
|
43
45
|
*/
|
|
44
|
-
export declare function
|
|
46
|
+
export declare function safeTruncate(str: string, max: number, suffix?: string): string;
|
|
45
47
|
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/shared/helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,wBAAgB,cAAc,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAW/C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;AAC9D,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;AAS/D
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/shared/helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,wBAAgB,cAAc,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAW/C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;AAC9D,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;AAS/D;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,MAAM,CAK1E"}
|
package/dist/shared/helpers.js
CHANGED
|
@@ -46,15 +46,17 @@ export function safeJsonParse(text, fallback) {
|
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
/**
|
|
49
|
-
*
|
|
50
|
-
*
|
|
49
|
+
* 安全截断字符串 — 避免在 UTF-16 代理对中间截断导致乱码/损坏。
|
|
50
|
+
* JS 字符串是 UTF-16:emoji/扩展 CJK 等占两个码元(高位 0xD800-0xDBFF + 低位 0xDC00-0xDFFF)。
|
|
51
|
+
* str.slice(0,N) 按码元切,若 N 落在代理对中间会把高位孤悬 → 下游 JSON.stringify 抛错 / LLM 乱码。
|
|
52
|
+
* 截断处码元若在高代理位(下一码元是低代理却没配对)→ 退一位再拼 suffix。短于 max 原样返回。
|
|
51
53
|
*/
|
|
52
|
-
export function
|
|
53
|
-
|
|
54
|
-
return
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
54
|
+
export function safeTruncate(str, max, suffix = "") {
|
|
55
|
+
if (str.length <= max)
|
|
56
|
+
return str;
|
|
57
|
+
let cut = max;
|
|
58
|
+
if (str.charCodeAt(max - 1) >= 0xd800 && str.charCodeAt(max - 1) <= 0xdbff)
|
|
59
|
+
cut = max - 1;
|
|
60
|
+
return str.slice(0, cut) + suffix;
|
|
59
61
|
}
|
|
60
62
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/shared/helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,UAAU,cAAc,CAAC,CAAmB;IAChD,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,CAAmB;IACjD,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAA2B,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;QACvB,+CAA+C;QAC/C,8DAA8D;QAC9D,MAAM,GAAG,GAAG,CAAQ,CAAC;QACrB,IAAI,GAAG,CAAC,QAAQ,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACrD,OAAO,GAAG,CAAC,CAAC,OAAO,WAAW,GAAG,CAAC,QAAQ,GAAG,CAAC;QAChD,CAAC;QACD,OAAO,CAAC,CAAC,OAAO,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;AAiBD,MAAM,UAAU,aAAa,CAAI,IAAY,EAAE,QAAY;IACzD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/shared/helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,UAAU,cAAc,CAAC,CAAmB;IAChD,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,CAAmB;IACjD,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAA2B,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;QACvB,+CAA+C;QAC/C,8DAA8D;QAC9D,MAAM,GAAG,GAAG,CAAQ,CAAC;QACrB,IAAI,GAAG,CAAC,QAAQ,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACrD,OAAO,GAAG,CAAC,CAAC,OAAO,WAAW,GAAG,CAAC,QAAQ,GAAG,CAAC;QAChD,CAAC;QACD,OAAO,CAAC,CAAC,OAAO,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;AAiBD,MAAM,UAAU,aAAa,CAAI,IAAY,EAAE,QAAY;IACzD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,GAAW,EAAE,MAAM,GAAG,EAAE;IAChE,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAClC,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,MAAM;QAAE,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IAC1F,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC;AACpC,CAAC"}
|
|
@@ -21,16 +21,4 @@ export declare function loadKnowledgeConfig(relativePath: string, projectPath?:
|
|
|
21
21
|
data: Record<string, unknown>;
|
|
22
22
|
body: string;
|
|
23
23
|
} | null;
|
|
24
|
-
/**
|
|
25
|
-
* 从知识文件的决策规则中提取指定键的数值。
|
|
26
|
-
*/
|
|
27
|
-
export declare function extractNumberRule(body: string, key: string): number | undefined;
|
|
28
|
-
/** 从知识文件的决策规则中提取字符串值。 */
|
|
29
|
-
export declare function extractStringRule(body: string, key: string): string | undefined;
|
|
30
|
-
/** 从知识文件的决策规则中提取列表值(格式:键 = 值1 / 值2 / 值3)。 */
|
|
31
|
-
export declare function extractListRule(body: string, key: string): string[];
|
|
32
|
-
/**
|
|
33
|
-
* 清除知识配置缓存(测试用)。
|
|
34
|
-
*/
|
|
35
|
-
export declare function clearConfigCache(): void;
|
|
36
24
|
//# sourceMappingURL=knowledge_config_loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge_config_loader.d.ts","sourceRoot":"","sources":["../../src/shared/knowledge_config_loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAwBH;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAoCxD
|
|
1
|
+
{"version":3,"file":"knowledge_config_loader.d.ts","sourceRoot":"","sources":["../../src/shared/knowledge_config_loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAwBH;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAoCxD"}
|
|
@@ -72,32 +72,4 @@ export function loadKnowledgeConfig(relativePath, projectPath) {
|
|
|
72
72
|
return null;
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
|
-
/**
|
|
76
|
-
* 从知识文件的决策规则中提取指定键的数值。
|
|
77
|
-
*/
|
|
78
|
-
export function extractNumberRule(body, key) {
|
|
79
|
-
const regex = new RegExp(`${key.replace(/_/g, "[_ ]")}\\s*=\\s*([\\d.]+)`, "i");
|
|
80
|
-
const match = body.match(regex);
|
|
81
|
-
return match ? parseFloat(match[1]) : undefined;
|
|
82
|
-
}
|
|
83
|
-
/** 从知识文件的决策规则中提取字符串值。 */
|
|
84
|
-
export function extractStringRule(body, key) {
|
|
85
|
-
const regex = new RegExp(`${key.replace(/_/g, "[_ ]")}\\s*=\\s*([^\\n,]+)`, "i");
|
|
86
|
-
const match = body.match(regex);
|
|
87
|
-
return match ? match[1].trim() : undefined;
|
|
88
|
-
}
|
|
89
|
-
/** 从知识文件的决策规则中提取列表值(格式:键 = 值1 / 值2 / 值3)。 */
|
|
90
|
-
export function extractListRule(body, key) {
|
|
91
|
-
const value = extractStringRule(body, key);
|
|
92
|
-
if (!value)
|
|
93
|
-
return [];
|
|
94
|
-
return value.split(/[/,,、]/).map((v) => v.trim()).filter(Boolean);
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* 清除知识配置缓存(测试用)。
|
|
98
|
-
*/
|
|
99
|
-
export function clearConfigCache() {
|
|
100
|
-
debug("CoreKnowledgeConfigLoader", "清除配置缓存");
|
|
101
|
-
configCache.clear();
|
|
102
|
-
}
|
|
103
75
|
//# sourceMappingURL=knowledge_config_loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge_config_loader.js","sourceRoot":"","sources":["../../src/shared/knowledge_config_loader.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"knowledge_config_loader.js","sourceRoot":"","sources":["../../src/shared/knowledge_config_loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,12 @@
|
|
|
14
14
|
/**
|
|
15
15
|
* 同步原子写入:先写 .tmp 再 rename。
|
|
16
16
|
*
|
|
17
|
+
* **并发安全范围**(适用所有 atomicWriteFile* 调用方,含 *_store.ts):
|
|
18
|
+
* - 进程内原子(read 看不到半写文件,单线程运行时串行)
|
|
19
|
+
* - **跨进程不安全**:两进程 read-modify-rename 同文件,后者覆盖前者且无异常([[init_must_not_parallel]] 根害)
|
|
20
|
+
* - 随机 tmp 后缀只防 tmp 碰撞,不序列化最终 rename
|
|
21
|
+
* 跨进程共享文件(init 全局 patterns / 2 个 MCP 服务器同项目)须外部串行。
|
|
22
|
+
*
|
|
17
23
|
* @param filePath - 目标文件路径
|
|
18
24
|
* @param content - 要写入的内容
|
|
19
25
|
* @param encoding - 编码,默认 "utf-8"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write_file_atomic.d.ts","sourceRoot":"","sources":["../../src/shared/write_file_atomic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiCH
|
|
1
|
+
{"version":3,"file":"write_file_atomic.d.ts","sourceRoot":"","sources":["../../src/shared/write_file_atomic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiCH;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,cAAwB,GACjC,IAAI,CAiBN;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,cAAwB,GACjC,OAAO,CAAC,IAAI,CAAC,CAiBf"}
|
|
@@ -45,6 +45,12 @@ function assertPathNotDenied(filePath, projectPath) {
|
|
|
45
45
|
/**
|
|
46
46
|
* 同步原子写入:先写 .tmp 再 rename。
|
|
47
47
|
*
|
|
48
|
+
* **并发安全范围**(适用所有 atomicWriteFile* 调用方,含 *_store.ts):
|
|
49
|
+
* - 进程内原子(read 看不到半写文件,单线程运行时串行)
|
|
50
|
+
* - **跨进程不安全**:两进程 read-modify-rename 同文件,后者覆盖前者且无异常([[init_must_not_parallel]] 根害)
|
|
51
|
+
* - 随机 tmp 后缀只防 tmp 碰撞,不序列化最终 rename
|
|
52
|
+
* 跨进程共享文件(init 全局 patterns / 2 个 MCP 服务器同项目)须外部串行。
|
|
53
|
+
*
|
|
48
54
|
* @param filePath - 目标文件路径
|
|
49
55
|
* @param content - 要写入的内容
|
|
50
56
|
* @param encoding - 编码,默认 "utf-8"
|
|
@@ -55,7 +61,7 @@ export function atomicWriteFileSync(filePath, content, encoding = "utf-8") {
|
|
|
55
61
|
// 确保父目录存在
|
|
56
62
|
const dir = path.dirname(filePath);
|
|
57
63
|
fs.mkdirSync(dir, { recursive: true });
|
|
58
|
-
//
|
|
64
|
+
// 随机 tmp 后缀只防 tmp 碰撞(两进程同时写不互踩 tmp);最终 rename 不序列化——跨进程 read-modify-rename 同文件仍会后者覆盖前者(见 JSDoc,[init_must_not_parallel] 根害)
|
|
59
65
|
const tmpPath = `${filePath}.${crypto.randomUUID().slice(0, 8)}.tmp`;
|
|
60
66
|
try {
|
|
61
67
|
fs.writeFileSync(tmpPath, content, encoding);
|
|
@@ -83,7 +89,7 @@ export async function atomicWriteFile(filePath, content, encoding = "utf-8") {
|
|
|
83
89
|
// 确保父目录存在
|
|
84
90
|
const dir = path.dirname(filePath);
|
|
85
91
|
await fsp.mkdir(dir, { recursive: true });
|
|
86
|
-
//
|
|
92
|
+
// 随机 tmp 后缀只防 tmp 碰撞(两进程同时写不互踩 tmp);最终 rename 不序列化——跨进程 read-modify-rename 同文件仍会后者覆盖前者(见 JSDoc,[init_must_not_parallel] 根害)
|
|
87
93
|
const tmpPath = `${filePath}.${crypto.randomUUID().slice(0, 8)}.tmp`;
|
|
88
94
|
try {
|
|
89
95
|
await fsp.writeFile(tmpPath, content, encoding);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write_file_atomic.js","sourceRoot":"","sources":["../../src/shared/write_file_atomic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,QAAgB,EAAE,WAAoB;IACjE,MAAM,IAAI,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1C,IAAI,YAAoB,CAAC;IACzB,IAAI,CAAC;QACH,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,wBAAwB;IAClC,CAAC;IACD,mCAAmC;IACnC,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO;IAC1C,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAC7C,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,UAAU,MAAM,KAAK,QAAQ,GAAG,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"write_file_atomic.js","sourceRoot":"","sources":["../../src/shared/write_file_atomic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,QAAgB,EAAE,WAAoB;IACjE,MAAM,IAAI,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1C,IAAI,YAAoB,CAAC;IACzB,IAAI,CAAC;QACH,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,wBAAwB;IAClC,CAAC;IACD,mCAAmC;IACnC,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO;IAC1C,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAC7C,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,UAAU,MAAM,KAAK,QAAQ,GAAG,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAgB,EAChB,OAAe,EACf,WAA2B,OAAO;IAElC,yBAAyB;IACzB,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC9B,UAAU;IACV,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEvC,4HAA4H;IAC5H,MAAM,OAAO,GAAG,GAAG,QAAQ,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IACrE,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC7C,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,qBAAqB;QACrB,IAAI,CAAC;YAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACxC,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,OAAe,EACf,WAA2B,OAAO;IAElC,yBAAyB;IACzB,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC9B,UAAU;IACV,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,4HAA4H;IAC5H,MAAM,OAAO,GAAG,GAAG,QAAQ,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAChD,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,qBAAqB;QACrB,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC"}
|