Update: 将子项目从 submodule 转为完整内容

- 移除 GovAI, nomifun-tauri, 算力盒子 的 submodule 引用
- 添加所有子项目的完整源代码
- 保留原始 .git 为 .git.bak 备份
This commit is contained in:
freedak
2026-07-04 19:20:46 +08:00
parent 54d6465fa7
commit f7a720204a
3360 changed files with 802660 additions and 3 deletions
@@ -0,0 +1,46 @@
//! 网关并行执行面:`BrowserRegistry::execute_parallel` 异 key 并发、同 key 串行,结果保输入序。
//!
//! **Hermetic(不启动 Chrome**:用**未知动作**——facade 在 dispatch 即返 `Unknown action {name}`
//! 错误,**不调 `engine()`**(不解析/下载 Chrome,但仍走完 `execute` 的 per-key 锁 + 派发路径。
//! 错误消息含动作名,故可据此断言结果**按输入序**返回。
//!
//! 跑:`cargo nextest run -p nomifun-gateway --features browser-use -E 'test(execute_parallel)'`
#![cfg(feature = "browser-use")]
use nomifun_gateway::browser_registry::{tool_result_to_value, BrowserRegistry};
use serde_json::json;
#[tokio::test]
async fn execute_parallel_distinct_keys_results_in_input_order() {
let reg = BrowserRegistry::default_for_browser_use();
// 两个不同 key(异 key 并发)。未知动作 → 各自快速返错,不启动 Chrome。
let batch = vec![
("companion-a".to_string(), json!({"action": "zzz_marker_alpha"})),
("companion-b".to_string(), json!({"action": "zzz_marker_beta"})),
];
let started = std::time::Instant::now();
let results = reg.execute_parallel(batch).await;
assert_eq!(results.len(), 2, "一输入一结果");
// 保序:结果[0] 对应 alpha、结果[1] 对应 beta(错误消息回带动作名)。
let strs: Vec<String> = results
.into_iter()
.map(|r| tool_result_to_value(r).to_string())
.collect();
assert!(strs[0].contains("zzz_marker_alpha"), "结果须按输入序(idx0=alpha): {}", strs[0]);
assert!(strs[1].contains("zzz_marker_beta"), "结果须按输入序(idx1=beta): {}", strs[1]);
// 不得死锁/卡住(未知动作不启动 Chrome,应近乎瞬时)。
assert!(started.elapsed().as_secs() < 20, "execute_parallel 不得死锁/卡住");
}
#[tokio::test]
async fn execute_parallel_same_key_serializes_and_returns_all() {
let reg = BrowserRegistry::default_for_browser_use();
// 同一 key 两次:必须经该 key 的 CompanionBrowser 锁**串行**(不并发撞同一引擎),但两结果都返回。
let batch = vec![
("companion-a".to_string(), json!({"action": "zzz_one"})),
("companion-a".to_string(), json!({"action": "zzz_two"})),
];
let results = reg.execute_parallel(batch).await;
assert_eq!(results.len(), 2, "同 key 两调用都须返回(串行,无丢失)");
}