using ClawdDotNet.Core.Config; namespace ClawdDotNet.Core.Tools; public sealed class ToolRegistry { private readonly Dictionary _tools = new(); /// /// #689: Tools every agent has, without being granted them. Escalation is one: a case /// nobody can raise is a case nobody solves — being able to say "I cannot get on" is not a /// permission, it is part of working in an organisation. /// public static readonly IReadOnlySet ImplicitTools = new HashSet(StringComparer.OrdinalIgnoreCase) { Cases.CaseDesk.ToolName }; private readonly Lock _lock = new(); public void Register(IAgentTool tool) { lock (_lock) _tools[tool.Name] = tool; } public IAgentTool? Get(string name) { lock (_lock) return _tools.GetValueOrDefault(name); } public IReadOnlyList GetForAgent(AgentConfig agent) { lock (_lock) return _tools.Values .Where(t => agent.Tools.ContainsKey(t.Name) || ImplicitTools.Contains(t.Name)) .ToList(); } public IReadOnlyList GetAll() { lock (_lock) return _tools.Values.ToList(); } public IReadOnlyList<(IAgentTool Tool, IToolJobProvider Provider)> GetJobProviders() { lock (_lock) return _tools.Values .OfType() .Select(p => ((IAgentTool)p, p)) .ToList(); } }