Reiner Umzug, keine Verhaltensaenderung. Der Instanzmanager braucht die Verzeichnisstruktur einer Instanz - anlegen, auflisten, Konfiguration lesen -, aber er darf ClawdDotNet.App nicht referenzieren: Dort haengen sechzehn Werkzeugprojekte dran (Telegram, Mail, FTP, Rocket.Chat, ...), und der Manager soll ausdruecklich keines davon kennen. Ein Projektverweis wuerde sie nicht ausfuehren, aber laden - und die Zusage "keine Werkzeuge im Manager" waere nur noch eine Absichtserklaerung statt einer Eigenschaft des Bauplans. Das Wissen selbst gehoert ohnehin nach Core: Es beschreibt, wie eine Instanz auf der Platte liegt, und InstanceConfig und AgentConfig liegen dort schon. Verschoben nach Core/Instances: InstanceDirectoryManager, InstanceInfo, TokenUsageRecord/TokenUsageFile, AgentListItem/AgentListFile. In ClawdDotNet.App/Models bleiben JobHistoryEntry und die Werkzeug-Ansichtsmodelle, die dort richtig liegen. Build ohne Warnungen, 717 Tests gruen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
69 lines
2.3 KiB
C#
69 lines
2.3 KiB
C#
using ClawdDotNet.App.Services;
|
|
using ClawdDotNet.App.Settings;
|
|
using ClawdDotNet.Core.Config;
|
|
using ClawdDotNet.Core.Tools;
|
|
using Microsoft.Extensions.Logging.Abstractions;
|
|
using ClawdDotNet.Core.Instances;
|
|
|
|
namespace ClawdDotNet.App.Tests.Services;
|
|
|
|
/// <summary>
|
|
/// Ein <see cref="AppHost"/> ohne Engine, Scanner und Netz — genug für die
|
|
/// Verwaltungsdienste.
|
|
///
|
|
/// <para>Möglich ist das, weil <c>AppHost.StartAsync</c> nur <em>ein</em> Weg ist, einen
|
|
/// aufzubauen: Die Eigenschaften sind <c>required init</c>, mehr braucht es nicht. Was
|
|
/// hier fehlt — <c>Engine</c>, <c>Scanner</c>, <c>Staging</c> — ist auch im Betrieb
|
|
/// regelmäßig null, und genau dieses Verhalten soll geprüft werden.</para>
|
|
/// </summary>
|
|
internal sealed class TestHost : IDisposable
|
|
{
|
|
private readonly string _root;
|
|
|
|
public AppHost Host { get; }
|
|
|
|
/// <summary>Jede Änderung, die über <c>SaveInstance</c> gelaufen ist.</summary>
|
|
public List<InstanceChange> Changes { get; } = [];
|
|
|
|
public TestHost(params AgentConfig[] agents)
|
|
{
|
|
_root = Path.Combine(
|
|
Path.GetTempPath(), "clawd-tests", "host-" + Guid.NewGuid().ToString("N")[..8]);
|
|
|
|
var instancesDir = Path.Combine(_root, "Instances");
|
|
var instancePath = Path.Combine(instancesDir, "Test");
|
|
|
|
Directory.CreateDirectory(instancePath);
|
|
|
|
var instance = new InstanceConfig { InstanceName = "Test" };
|
|
instance.Agents.AddRange(agents);
|
|
|
|
Host = new AppHost
|
|
{
|
|
Settings = new SettingsManager(_root),
|
|
Directories = new InstanceDirectoryManager(instancesDir),
|
|
Instance = instance,
|
|
InstancePath = instancePath,
|
|
LogDirectory = Path.Combine(_root, "Logs"),
|
|
LoggerFactory = NullLoggerFactory.Instance,
|
|
Tools = new ToolRegistry()
|
|
};
|
|
|
|
Host.InstanceChanged += Changes.Add;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
try { Directory.Delete(_root, recursive: true); }
|
|
catch { /* Ein liegengebliebener Testordner ist kein Grund, einen Lauf rot zu färben. */ }
|
|
}
|
|
|
|
public static AgentConfig Agent(string agentId, string displayName = "")
|
|
=> new()
|
|
{
|
|
AgentId = agentId,
|
|
DisplayName = displayName.Length == 0 ? agentId : displayName,
|
|
Model = "anthropic/claude-sonnet-4-5"
|
|
};
|
|
}
|