fix(growth): Evolution Engine 审计修复 — 7项全部完成
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
HIGH-1: 提取共享 json_utils.rs,skill_generator/workflow_composer 去重
HIGH-2: FeedbackCollector Vec→HashMap,消除 unwrap() panic 风险
HIGH-3: ProfileUpdater 改为 collect_updates() 返回字段列表,
growth.rs 直接 async 调用 update_field(),不再用 no-op 闭包
MEDIUM-1: EvolutionMiddleware 注入后自动 drain,防止重复注入
MEDIUM-2: PatternAggregator tools 提取改为直接收集 context 值
MEDIUM-3: evolution_engine.rs 移除 4 个未使用 imports
MEDIUM-4: workflow_composer parse_response pattern 参数加下划线
MEDIUM-7: SkillCandidate 添加 version 字段(默认=1)
测试: zclaw-growth 128 tests, zclaw-runtime 86 tests, workspace 0 failures
This commit is contained in:
63
crates/zclaw-growth/src/json_utils.rs
Normal file
63
crates/zclaw-growth/src/json_utils.rs
Normal file
@@ -0,0 +1,63 @@
|
||||
//! 共享 JSON 工具函数
|
||||
//! 从 LLM 返回的文本中提取 JSON 块
|
||||
|
||||
/// 从 LLM 返回文本中提取 JSON 块
|
||||
/// 支持三种格式:```json...``` 围栏、```...``` 围栏、裸 {...}
|
||||
pub fn extract_json_block(text: &str) -> &str {
|
||||
// 尝试匹配 ```json ... ```
|
||||
if let Some(start) = text.find("```json") {
|
||||
let json_start = start + 7;
|
||||
if let Some(end) = text[json_start..].find("```") {
|
||||
return text[json_start..json_start + end].trim();
|
||||
}
|
||||
}
|
||||
// 尝试匹配 ``` ... ```
|
||||
if let Some(start) = text.find("```") {
|
||||
let json_start = start + 3;
|
||||
if let Some(end) = text[json_start..].find("```") {
|
||||
return text[json_start..json_start + end].trim();
|
||||
}
|
||||
}
|
||||
// 尝试找 { ... } 块
|
||||
if let Some(start) = text.find('{') {
|
||||
if let Some(end) = text.rfind('}') {
|
||||
return &text[start..=end];
|
||||
}
|
||||
}
|
||||
text.trim()
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_json_block_with_markdown() {
|
||||
let text = "Here is the result:\n```json\n{\"key\": \"value\"}\n```\nDone.";
|
||||
assert_eq!(extract_json_block(text), "{\"key\": \"value\"}");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_json_block_bare() {
|
||||
let text = "{\"key\": \"value\"}";
|
||||
assert_eq!(extract_json_block(text), "{\"key\": \"value\"}");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_json_block_plain_fences() {
|
||||
let text = "Result:\n```\n{\"a\": 1}\n```";
|
||||
assert_eq!(extract_json_block(text), "{\"a\": 1}");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_json_block_nested_braces() {
|
||||
let text = r#"{"outer": {"inner": "val"}}"#;
|
||||
assert_eq!(extract_json_block(text), r#"{"outer": {"inner": "val"}}"#);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_json_block_no_json() {
|
||||
let text = "no json here";
|
||||
assert_eq!(extract_json_block(text), "no json here");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user