using ClawdDotNet.Core.Accounting; using ClawdDotNet.Core.Audit; using ClawdDotNet.Core.Config; using ClawdDotNet.Core.Engine; using ClawdDotNet.Core.Security; using ClawdDotNet.Core.Staging; using ClawdDotNet.Core.Tools; namespace ClawdDotNet.Core.Tests.Infrastructure; /// /// Assembles a ready-to-use AgentEngine with fake client, fake tools and /// in-memory state. /// internal sealed class EngineFixture { public FakeChatClient Client { get; } = new(); public ToolRegistry Registry { get; } = new(); public InMemoryStateStore StateStore { get; } = new(); public AgentEngine Engine { get; } private readonly List _agents = new(); /// The registered agents — for tests that build a dispatcher themselves. public IReadOnlyList Agents => _agents; public EngineFixture( IAuditRepository? audit = null, StagingGate? staging = null, TimeProvider? clock = null, IUsageRepository? usage = null, Core.Transcripts.IRunTranscriptStore? transcripts = null, Core.Tasks.ITaskRepository? tasks = null) { Engine = new AgentEngine( Client, Registry, new PermissionGate(), StateStore, TestLogging.Factory, usageRepository: usage, taskRepository: tasks, auditRepository: audit, stagingGate: staging, clock: clock) { TranscriptStore = transcripts }; // No agent directory → no persistence to disk during the tests. Engine.SetAgentConfigProvider(() => _agents, "test-instance", _ => null); } public EngineFixture WithTool(IAgentTool tool) { Registry.Register(tool); return this; } public AgentConfig AddAgent(string agentId, params string[] toolNames) { var config = new AgentConfig { AgentId = agentId, DisplayName = agentId, Model = "test/model", SystemPrompt = $"Du bist {agentId}.", LoopGuard = new LoopGuardConfig { MaxSteps = 50, MaxCumulativeTokens = 10_000_000, TimeoutSeconds = 60, MaxContextTokens = 10_000_000 // switch off compaction in engine tests } }; foreach (var name in toolNames) config.Tools[name] = new Dictionary(); _agents.Add(config); return config; } }