fix(#108): expose les tools MCP autorisées dès le démarrage de session Codex

This commit is contained in:
2026-07-29 18:19:38 +02:00
parent 2c3a46e690
commit af6b76935c
9 changed files with 251 additions and 89 deletions

View File

@ -185,8 +185,8 @@ impl ProjectMcpToolPermissions {
/// Resolves the effective policy for `agent_id`.
///
/// Resolution order: agent override > project default > canonical read-only
/// fallback.
/// Resolution order: project default enriched by agent override > agent
/// override > project default > canonical read-only fallback.
///
/// # Errors
/// [`McpToolPermissionError`] if the document or fallback set is invalid.
@ -197,12 +197,24 @@ impl ProjectMcpToolPermissions {
known_tools: &[&str],
) -> Result<McpToolPolicy, McpToolPermissionError> {
self.validate(known_tools)?;
if let Some(override_) = self
let override_policy = self
.agents
.iter()
.find(|override_| override_.agent_id == agent_id)
.map(|override_| &override_.policy);
if let (Some(project_default), Some(override_policy)) =
(&self.project_default, override_policy)
{
return Ok(override_.policy.clone());
let mut allowed_tools = project_default.allowed_tools.clone();
for tool in &override_policy.allowed_tools {
if !allowed_tools.iter().any(|allowed| allowed == tool) {
allowed_tools.push(tool.clone());
}
}
return McpToolPolicy::new(allowed_tools, known_tools);
}
if let Some(override_policy) = override_policy {
return Ok(override_policy.clone());
}
if let Some(policy) = &self.project_default {
return Ok(policy.clone());
@ -236,7 +248,7 @@ mod tests {
}
#[test]
fn agent_override_replaces_project_default() {
fn agent_override_extends_project_default() {
let project_default =
McpToolPolicy::new(vec!["idea_memory_read".to_owned()], KNOWN).unwrap();
let override_policy =
@ -250,8 +262,8 @@ mod tests {
let effective = doc.effective_policy(agent(7), READ_ONLY, KNOWN).unwrap();
assert!(effective.permits("idea_memory_read"));
assert!(effective.permits("idea_memory_write"));
assert!(!effective.permits("idea_memory_read"));
}
#[test]