worker: separate subworkers from workspace workers

This commit is contained in:
2026-08-05 03:36:59 +09:00
parent 50726e4cf3
commit ba009c0a20
35 changed files with 747 additions and 261 deletions
+18 -18
View File
@@ -342,7 +342,7 @@ async fn feature_flags_default_to_core_tool_surface_only() {
assert_eq!(names, vec!["Bash", "Edit", "Glob", "Grep", "Read", "Write"]);
assert!(!names.iter().any(|name| name == "TaskCreate"));
assert!(!names.iter().any(|name| name == "WebSearch"));
assert!(!names.iter().any(|name| name == "SpawnWorker"));
assert!(!names.iter().any(|name| name == "SubWorkerSpawn"));
}
#[tokio::test]
@@ -386,7 +386,7 @@ permission = "write"
assert!(names.iter().any(|name| name == "TaskUpdate"));
assert!(names.iter().any(|name| name == "WebSearch"));
assert!(names.iter().any(|name| name == "WebFetch"));
assert!(!names.iter().any(|name| name == "SpawnWorker"));
assert!(!names.iter().any(|name| name == "SubWorkerSpawn"));
assert!(!names.iter().any(|name| name == "MemoryRead"));
}
@@ -394,34 +394,34 @@ permission = "write"
async fn project_role_tool_surfaces_keep_task_disabled_and_workers_role_scoped() {
struct Case {
role: &'static str,
workers_enabled: bool,
sub_worker_enabled: bool,
}
let cases = [
Case {
role: "orchestrator",
workers_enabled: true,
sub_worker_enabled: true,
},
Case {
role: "coder",
workers_enabled: false,
sub_worker_enabled: false,
},
Case {
role: "intake",
workers_enabled: false,
sub_worker_enabled: false,
},
Case {
role: "reviewer",
workers_enabled: false,
sub_worker_enabled: false,
},
Case {
role: "companion",
workers_enabled: false,
sub_worker_enabled: false,
},
];
for case in cases {
let delegation = if case.workers_enabled {
let delegation = if case.sub_worker_enabled {
r#"
[[delegation_scope.allow]]
target = "/tmp"
@@ -446,8 +446,8 @@ max_tokens = 100
[feature.task]
enabled = false
[feature.workers]
enabled = {workers_enabled}
[feature.sub_worker]
enabled = {sub_worker_enabled}
[[scope.allow]]
target = "./"
@@ -455,7 +455,7 @@ permission = "write"
{delegation}
"#,
role = case.role,
workers_enabled = case.workers_enabled,
sub_worker_enabled = case.sub_worker_enabled,
delegation = delegation,
);
let client = MockClient::new(simple_text_events());
@@ -474,16 +474,16 @@ permission = "write"
case.role
);
assert_eq!(
names.iter().any(|name| name == "SpawnWorker"),
case.workers_enabled,
"{} role Worker tool exposure mismatch: {names:?}",
names.iter().any(|name| name == "SubWorkerSpawn"),
case.sub_worker_enabled,
"{} role SubWorker tool exposure mismatch: {names:?}",
case.role
);
}
}
#[tokio::test]
async fn workers_feature_requires_delegation_scope() {
async fn sub_worker_feature_requires_delegation_scope() {
let manifest = r#"
[worker]
name = "worker-management-feature-test"
@@ -496,7 +496,7 @@ model_id = "test-model"
[engine]
max_tokens = 100
[feature.workers]
[feature.sub_worker]
enabled = true
[[scope.allow]]
@@ -510,7 +510,7 @@ permission = "write"
assert!(result.is_err());
let message = result.err().unwrap().to_string();
assert!(
message.contains("[feature.workers].enabled = true requires non-empty"),
message.contains("[feature.sub_worker].enabled = true requires non-empty"),
"unexpected error: {message}"
);
}