fix(agents): bound how many subagents one session runs at once
Port of upstream grok-build 1.0.1 (landed upstream 2026-08-06). The coordinator fire-and-forgot every spawn, so a wide fan-out (graph waves, swarm bursts, model-driven Task storms) could exhaust file descriptors. - kigi-tools task/admission: SubagentLimits — 32 concurrent per session by default (KIGI_MAX_CONCURRENT_SUBAGENTS), queue|fail behavior (KIGI_SUBAGENT_LIMIT_BEHAVIOR), zero clamped to 1, read once at the composition root; parse_positive_env helper. - Each parent session gets one spawn semaphore (map entries live for the process so a resumed session shares its predecessor's limit); handle_subagent_request holds an owned permit for the whole child run — queue awaits FIFO with a unified-log notice at saturation, fail routes through send_pre_spawn_failure. After a queued wait, a closed parent command channel (teardown) fails the spawn instead of running against a dead parent. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KSy9S31pZNWXtRZNVJ1sDf
This commit is contained in:
1 parent
26d26e15c9
commit
bf93091416
9 files changed
+240
No files matched your search
@@ -6,6 +6,27 @@
|
||||
|
||||
pub use kigi_tty_utils::{detach_from_tty, pager_env};
|
||||
|
||||
/// Parse a positive whole number in plain digits (no sign, no separators,
|
||||
/// no scientific notation). `None` for zero or anything non-canonical.
|
||||
pub fn parse_positive(value: &str) -> Option<u64> {
|
||||
value.parse::<u64>().ok().filter(|&parsed| parsed > 0)
|
||||
}
|
||||
|
||||
/// Parse a positive whole-number env value into a count. A set-but-invalid
|
||||
/// value warns and reads as unset, so the caller's default applies.
|
||||
pub fn parse_positive_env(var: &str, value: Option<String>) -> Option<usize> {
|
||||
let value = value?;
|
||||
let parsed = parse_positive(&value).and_then(|parsed| usize::try_from(parsed).ok());
|
||||
if parsed.is_none() {
|
||||
tracing::warn!(
|
||||
var,
|
||||
%value,
|
||||
"env value is not a positive whole number in plain digits; using the default"
|
||||
);
|
||||
}
|
||||
parsed
|
||||
}
|
||||
|
||||
/// Env var set on agent-spawned terminal processes so host tools (e.g. `x ban`)
|
||||
/// can distinguish agent invocations from human interactive shells.
|
||||
/// Note: the CLI also uses `KIGI_AGENT` as an
|
||||
|
||||
Reference in new issue
Block a user