feat(worker): expose ResetTask hub method

Wire TaskResetService into DI and add WorkerHub.ResetTask with the
same InvalidOperationException/KeyNotFoundException error-translation
pattern as ContinueTask.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Mika Kuns
2026-04-21 17:35:37 +02:00
parent 74eb36d3c0
commit 219a231f32
2 changed files with 21 additions and 1 deletions

View File

@@ -33,19 +33,22 @@ public sealed class WorkerHub : Microsoft.AspNetCore.SignalR.Hub
private readonly HubBroadcaster _broadcaster; private readonly HubBroadcaster _broadcaster;
private readonly IDbContextFactory<ClaudeDoDbContext> _dbFactory; private readonly IDbContextFactory<ClaudeDoDbContext> _dbFactory;
private readonly WorktreeMaintenanceService _wtMaintenance; private readonly WorktreeMaintenanceService _wtMaintenance;
private readonly TaskResetService _resetService;
public WorkerHub( public WorkerHub(
QueueService queue, QueueService queue,
AgentFileService agentService, AgentFileService agentService,
HubBroadcaster broadcaster, HubBroadcaster broadcaster,
IDbContextFactory<ClaudeDoDbContext> dbFactory, IDbContextFactory<ClaudeDoDbContext> dbFactory,
WorktreeMaintenanceService wtMaintenance) WorktreeMaintenanceService wtMaintenance,
TaskResetService resetService)
{ {
_queue = queue; _queue = queue;
_agentService = agentService; _agentService = agentService;
_broadcaster = broadcaster; _broadcaster = broadcaster;
_dbFactory = dbFactory; _dbFactory = dbFactory;
_wtMaintenance = wtMaintenance; _wtMaintenance = wtMaintenance;
_resetService = resetService;
} }
public string Ping() => $"pong v{Version}"; public string Ping() => $"pong v{Version}";
@@ -89,6 +92,22 @@ public sealed class WorkerHub : Microsoft.AspNetCore.SignalR.Hub
} }
} }
public async Task ResetTask(string taskId)
{
try
{
await _resetService.ResetAsync(taskId, CancellationToken.None);
}
catch (InvalidOperationException ex)
{
throw new HubException(ex.Message);
}
catch (KeyNotFoundException)
{
throw new HubException("task not found");
}
}
public bool CancelTask(string taskId) => _queue.CancelTask(taskId); public bool CancelTask(string taskId) => _queue.CancelTask(taskId);
public void WakeQueue() => _queue.WakeQueue(); public void WakeQueue() => _queue.WakeQueue();

View File

@@ -30,6 +30,7 @@ builder.Services.AddSingleton<WorktreeManager>();
builder.Services.AddSingleton<ClaudeArgsBuilder>(); builder.Services.AddSingleton<ClaudeArgsBuilder>();
builder.Services.AddSingleton<TaskRunner>(); builder.Services.AddSingleton<TaskRunner>();
builder.Services.AddSingleton<WorktreeMaintenanceService>(); builder.Services.AddSingleton<WorktreeMaintenanceService>();
builder.Services.AddSingleton<TaskResetService>();
// Agent file management. // Agent file management.
var agentsDir = Path.Combine(ClaudeDo.Data.Paths.AppDataRoot(), "agents"); var agentsDir = Path.Combine(ClaudeDo.Data.Paths.AppDataRoot(), "agents");