using System.Text.Json; namespace Agent.Core.Tools; public sealed record ToolPolicyDecision(bool Allowed, string Reason) { public static ToolPolicyDecision Allow() => new(true, "allowed"); public static ToolPolicyDecision Deny(string reason) => new(false, reason); } public interface IToolPolicyEngine { ToolPolicyDecision Evaluate(string toolName, JsonElement arguments); } public interface IInternalToolBackend { Task BeginTaskAsync(Guid taskId, CancellationToken cancellationToken) => Task.CompletedTask; Task ExecuteAsync(Guid taskId, string toolName, JsonElement arguments, CancellationToken cancellationToken); Task EndTaskAsync(Guid taskId, bool success, CancellationToken cancellationToken) => Task.CompletedTask; } public sealed record ToolExecutionResult(bool Success, string Output, bool ExternalEffect, string? FailureFingerprint = null); public sealed class DenyByDefaultPolicy(IReadOnlySet? allowedTools = null) : IToolPolicyEngine { private readonly IReadOnlySet _allowedTools = allowedTools ?? new HashSet(StringComparer.Ordinal); public ToolPolicyDecision Evaluate(string toolName, JsonElement arguments) => _allowedTools.Contains(toolName) ? ToolPolicyDecision.Allow() : ToolPolicyDecision.Deny("Capability is not allowed by policy."); }