Split spawn_csv from multi_agent (#14282)

- make `spawn_csv` a standalone feature for CSV agent jobs
- keep `spawn_csv -> multi_agent` one-way and preserve restricted
subagent disable paths
This commit is contained in:
Ahmed Ibrahim
2026-03-10 18:42:50 -07:00
committed by Michael Bolin
parent 39c1bc1c68
commit a4d884c767
9 changed files with 72 additions and 6 deletions

View File

@@ -138,6 +138,8 @@ pub enum Feature {
EnableRequestCompression,
/// Enable collab tools.
Collab,
/// Enable CSV-backed agent job tools.
SpawnCsv,
/// Enable apps.
Apps,
/// Enable plugins.
@@ -414,6 +416,9 @@ impl Features {
}
pub(crate) fn normalize_dependencies(&mut self) {
if self.enabled(Feature::SpawnCsv) && !self.enabled(Feature::Collab) {
self.enable(Feature::Collab);
}
if self.enabled(Feature::JsReplToolsOnly) && !self.enabled(Feature::JsRepl) {
tracing::warn!("js_repl_tools_only requires js_repl; disabling js_repl_tools_only");
self.disable(Feature::JsReplToolsOnly);
@@ -693,6 +698,12 @@ pub const FEATURES: &[FeatureSpec] = &[
},
default_enabled: false,
},
FeatureSpec {
id: Feature::SpawnCsv,
key: "spawn_csv",
stage: Stage::UnderDevelopment,
default_enabled: false,
},
FeatureSpec {
id: Feature::Apps,
key: "apps",
@@ -997,6 +1008,27 @@ mod tests {
assert_eq!(feature_for_key("collab"), Some(Feature::Collab));
}
#[test]
fn spawn_csv_is_under_development() {
assert_eq!(Feature::SpawnCsv.stage(), Stage::UnderDevelopment);
assert_eq!(Feature::SpawnCsv.default_enabled(), false);
}
#[test]
fn spawn_csv_normalization_enables_multi_agent_one_way() {
let mut spawn_csv_features = Features::with_defaults();
spawn_csv_features.enable(Feature::SpawnCsv);
spawn_csv_features.normalize_dependencies();
assert_eq!(spawn_csv_features.enabled(Feature::SpawnCsv), true);
assert_eq!(spawn_csv_features.enabled(Feature::Collab), true);
let mut collab_features = Features::with_defaults();
collab_features.enable(Feature::Collab);
collab_features.normalize_dependencies();
assert_eq!(collab_features.enabled(Feature::Collab), true);
assert_eq!(collab_features.enabled(Feature::SpawnCsv), false);
}
#[test]
fn apps_require_feature_flag_and_chatgpt_auth() {
let mut features = Features::with_defaults();