From 1a10e6fa09dcf193e2e1579353932a338237b82f Mon Sep 17 00:00:00 2001 From: mika kuns Date: Thu, 23 Apr 2026 12:18:49 +0200 Subject: [PATCH] feat(worker): expose RestoreDefaultAgents hub method --- src/ClaudeDo.Worker/Hub/WorkerHub.cs | 10 ++++++++ .../Hub/AgentSettingsHubTests.cs | 25 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/src/ClaudeDo.Worker/Hub/WorkerHub.cs b/src/ClaudeDo.Worker/Hub/WorkerHub.cs index 02c2e73..57ba89c 100644 --- a/src/ClaudeDo.Worker/Hub/WorkerHub.cs +++ b/src/ClaudeDo.Worker/Hub/WorkerHub.cs @@ -28,6 +28,7 @@ public record UpdateListDto(string Id, string Name, string? WorkingDir, string D public record UpdateListConfigDto(string ListId, string? Model, string? SystemPrompt, string? AgentPath); public record UpdateTaskAgentSettingsDto(string TaskId, string? Model, string? SystemPrompt, string? AgentPath); public record ListConfigDto(string? Model, string? SystemPrompt, string? AgentPath); +public record SeedResultDto(int Copied, int Skipped); public sealed class WorkerHub : Microsoft.AspNetCore.SignalR.Hub { @@ -36,6 +37,7 @@ public sealed class WorkerHub : Microsoft.AspNetCore.SignalR.Hub private readonly QueueService _queue; private readonly AgentFileService _agentService; + private readonly DefaultAgentSeeder _seeder; private readonly HubBroadcaster _broadcaster; private readonly IDbContextFactory _dbFactory; private readonly WorktreeMaintenanceService _wtMaintenance; @@ -45,6 +47,7 @@ public sealed class WorkerHub : Microsoft.AspNetCore.SignalR.Hub public WorkerHub( QueueService queue, AgentFileService agentService, + DefaultAgentSeeder seeder, HubBroadcaster broadcaster, IDbContextFactory dbFactory, WorktreeMaintenanceService wtMaintenance, @@ -53,6 +56,7 @@ public sealed class WorkerHub : Microsoft.AspNetCore.SignalR.Hub { _queue = queue; _agentService = agentService; + _seeder = seeder; _broadcaster = broadcaster; _dbFactory = dbFactory; _wtMaintenance = wtMaintenance; @@ -125,6 +129,12 @@ public sealed class WorkerHub : Microsoft.AspNetCore.SignalR.Hub public async Task RefreshAgents() => await _agentService.ScanAsync(); + public async Task RestoreDefaultAgents() + { + var result = await _seeder.SeedMissingAsync(); + return new SeedResultDto(result.Copied, result.Skipped); + } + public async Task GetAppSettings() { using var ctx = _dbFactory.CreateDbContext(); diff --git a/tests/ClaudeDo.Worker.Tests/Hub/AgentSettingsHubTests.cs b/tests/ClaudeDo.Worker.Tests/Hub/AgentSettingsHubTests.cs index 60cb54e..d7e4e20 100644 --- a/tests/ClaudeDo.Worker.Tests/Hub/AgentSettingsHubTests.cs +++ b/tests/ClaudeDo.Worker.Tests/Hub/AgentSettingsHubTests.cs @@ -44,4 +44,29 @@ public sealed class AgentSettingsHubTests : IDisposable Assert.Null(await _repo.GetConfigAsync(listId)); } + + [Fact] + public async Task RestoreDefaultAgents_CopiesMissingBundledFiles() + { + var root = Path.Combine(Path.GetTempPath(), $"claudedo_hub_restore_{Guid.NewGuid():N}"); + var bundleDir = Path.Combine(root, "bundle"); + var targetDir = Path.Combine(root, "target"); + try + { + Directory.CreateDirectory(bundleDir); + Directory.CreateDirectory(targetDir); + await File.WriteAllTextAsync(Path.Combine(bundleDir, "code-reviewer.md"), "body"); + + var seeder = new ClaudeDo.Worker.Services.DefaultAgentSeeder(bundleDir, targetDir); + var result = await seeder.SeedMissingAsync(); + + Assert.Equal(1, result.Copied); + Assert.Equal(0, result.Skipped); + Assert.True(File.Exists(Path.Combine(targetDir, "code-reviewer.md"))); + } + finally + { + try { Directory.Delete(root, true); } catch { } + } + } }