feat(templates): nom d'agent par défaut + permissions système et MCP outils sur AgentTemplate — #242
AgentTemplate étendu (defaultAgentName, systemPermissions, mcpToolPermissions), CreateTemplate/UpdateTemplate/CreateAgentFromTemplate projetés vers l'agent créé, DTO/MCP tools et persistance store complétés. Correctif modèle par défaut: UpdateTemplate ne persistait pas defaultProfileId (profil stale à la création d'agent). Backfill best-effort des templates existants depuis les agents du projet au open_project, overrides explicites uniquement.
This commit is contained in:
@ -15,6 +15,7 @@ use application::{
|
||||
use domain::ids::{AgentId, ProfileId, TemplateId};
|
||||
use domain::markdown::MarkdownDoc;
|
||||
use domain::template::{AgentTemplate, TemplateVersion};
|
||||
use domain::{McpToolPolicy, NetworkPolicy, SystemPermissionSet};
|
||||
use serde_json::json;
|
||||
use uuid::Uuid;
|
||||
|
||||
@ -52,6 +53,10 @@ fn template_dto_serialises_camelcase() {
|
||||
v["defaultProfileId"],
|
||||
ProfileId::from_uuid(Uuid::from_u128(2)).to_string()
|
||||
);
|
||||
assert!(v.get("defaultAgentName").is_none());
|
||||
assert!(v.get("defaultSystemPermissions").is_none());
|
||||
assert!(v.get("defaultMcpToolPermissions").is_none());
|
||||
assert!(v.get("defaultMcpToolPolicy").is_none());
|
||||
// no snake_case leak
|
||||
assert!(
|
||||
v.get("content_md").is_none(),
|
||||
@ -220,6 +225,34 @@ fn create_template_request_deserialises_camelcase() {
|
||||
assert_eq!(dto.name, "Backend Template");
|
||||
assert_eq!(dto.content, "# My context");
|
||||
assert_eq!(dto.default_profile_id, profile_id);
|
||||
assert!(dto.default_agent_name.is_none());
|
||||
assert!(dto.default_system_permissions.is_none());
|
||||
assert!(dto.default_mcp_tool_policy.is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn create_template_request_deserialises_template_defaults() {
|
||||
let profile_id = Uuid::from_u128(21).to_string();
|
||||
let raw = json!({
|
||||
"name": "Backend Template",
|
||||
"content": "# My context",
|
||||
"defaultProfileId": profile_id,
|
||||
"defaultAgentName": "Backend",
|
||||
"defaultSystemPermissions": { "network": "allow" },
|
||||
"defaultMcpToolPermissions": { "allowedTools": ["idea_template_read"] }
|
||||
});
|
||||
let dto: CreateTemplateRequestDto = serde_json::from_value(raw).unwrap();
|
||||
assert_eq!(dto.default_agent_name.as_deref(), Some("Backend"));
|
||||
assert_eq!(
|
||||
dto.default_system_permissions,
|
||||
Some(SystemPermissionSet::new(Some(NetworkPolicy::Allow)))
|
||||
);
|
||||
assert_eq!(
|
||||
dto.default_mcp_tool_policy,
|
||||
Some(McpToolPolicy {
|
||||
allowed_tools: vec!["idea_template_read".to_owned()]
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -231,7 +264,31 @@ fn update_template_request_deserialises_camelcase() {
|
||||
});
|
||||
let dto: UpdateTemplateRequestDto = serde_json::from_value(raw).unwrap();
|
||||
assert_eq!(dto.template_id, template_id);
|
||||
assert_eq!(dto.content, "# Updated content");
|
||||
assert_eq!(dto.content.as_deref(), Some("# Updated content"));
|
||||
assert!(dto.default_profile_id.is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn update_template_request_deserialises_metadata_and_nullable_clears() {
|
||||
let template_id = Uuid::from_u128(31).to_string();
|
||||
let profile_id = Uuid::from_u128(32).to_string();
|
||||
let raw = json!({
|
||||
"templateId": template_id,
|
||||
"name": "Renamed",
|
||||
"defaultProfileId": profile_id,
|
||||
"defaultAgentName": null,
|
||||
"defaultSystemPermissions": { "network": "deny" },
|
||||
"defaultMcpToolPermissions": null
|
||||
});
|
||||
let dto: UpdateTemplateRequestDto = serde_json::from_value(raw).unwrap();
|
||||
assert_eq!(dto.name.as_deref(), Some("Renamed"));
|
||||
assert_eq!(dto.default_profile_id.as_deref(), Some(profile_id.as_str()));
|
||||
assert_eq!(dto.default_agent_name, Some(None));
|
||||
assert_eq!(
|
||||
dto.default_system_permissions,
|
||||
Some(Some(SystemPermissionSet::new(Some(NetworkPolicy::Deny))))
|
||||
);
|
||||
assert_eq!(dto.default_mcp_tool_policy, Some(None));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
Reference in New Issue
Block a user