use super::*;
pub(super) struct ToolStateParts<'a> {
pub(super) builtins: Arc<leviath_tools::BuiltinTools>,
pub(super) builtin_names: HashSet<String>,
pub(super) mcp: Arc<Mutex<leviath_mcp::ToolExecutor>>,
pub(super) config: &'a Config,
pub(super) hub: &'a InteractionHub,
pub(super) run_id: &'a str,
pub(super) entry_stage: &'a str,
pub(super) entry_index: usize,
pub(super) stage_perms_by_index: Vec<HashMap<String, String>>,
pub(super) stage_required_by_index: Vec<HashSet<String>>,
pub(super) agent_perms: HashMap<String, String>,
pub(super) agent_name: &'a str,
pub(super) launch_overrides: HashMap<String, crate::config::ToolPolicy>,
pub(super) subagent: Option<SubAgentHandle>,
pub(super) sandbox: Option<Arc<crate::daemon::sandbox_manager::SandboxManager>>,
pub(super) script_tools: leviath_scripting::ScriptToolSet,
pub(super) script_tool_names: HashSet<String>,
pub(super) script_host: Arc<dyn leviath_scripting::ScriptHost>,
pub(super) dynamic: Option<Arc<crate::daemon::tool_service::DynamicToolCtx>>,
pub(super) unattended: bool,
pub(super) blueprint_safe: Option<&'a leviath_core::blueprint::SafeCommandsConfig>,
}
pub(super) fn build_tool_state(parts: ToolStateParts<'_>) -> Arc<AgentToolState> {
let entry_perms = parts
.stage_perms_by_index
.get(parts.entry_index)
.cloned()
.unwrap_or_default();
let entry_required = parts
.stage_required_by_index
.get(parts.entry_index)
.cloned()
.unwrap_or_default();
Arc::new(AgentToolState {
writes: Arc::new(crate::daemon::tool_service::WriteBudget::new(
parts.config.limits.write_limits(),
)),
builtins: parts.builtins,
mcp: parts.mcp,
builtin_names: parts.builtin_names,
launch_overrides: Arc::new(parts.launch_overrides),
safe_keys: Arc::new(
parts
.config
.safe_keys_for_agent(parts.agent_name, parts.blueprint_safe)
.into_keys()
.collect(),
),
run_allows: Arc::new(Mutex::new(HashSet::new())),
stage_allows: Arc::new(StdMutex::new(HashSet::new())),
stage_allows_index: Arc::new(StdMutex::new(None)),
stage_perms: Arc::new(StdMutex::new(entry_perms)),
stage_perms_by_index: Arc::new(parts.stage_perms_by_index),
stage_required: Arc::new(StdMutex::new(entry_required)),
stage_required_by_index: Arc::new(parts.stage_required_by_index),
agent_perms: Arc::new(parts.agent_perms),
blueprint_may_loosen: parts.config.security.allow_blueprint_permissions,
global_perms: Arc::new(parts.config.permissions_for_agent(parts.agent_name)),
interaction: parts.hub.backend_for(parts.run_id),
unattended: parts.unattended,
stage_name: Arc::new(StdMutex::new(parts.entry_stage.to_string())),
subagent: parts.subagent,
sandbox: parts.sandbox,
script_tools: Arc::new(StdMutex::new(parts.script_tools)),
script_tool_names: Arc::new(StdMutex::new(parts.script_tool_names)),
script_host: parts.script_host,
dynamic: parts.dynamic,
})
}