- CancelAsync now signals the running Claude process of the cancelled task and its cascaded children via the new RunCancellationRegistry (queue + override slots register their CTS there) instead of only flipping DB state. - external MCP review_task 'approve' now mirrors the hub's ApproveReview: unit merge for parents, ApproveAndMergeAsync for childless tasks, optional targetBranch; ReviewTaskResult carries mergeStatus/conflicts.
50 lines
1.6 KiB
C#
50 lines
1.6 KiB
C#
using ClaudeDo.Data;
|
|
using ClaudeDo.Worker.Hub;
|
|
using ClaudeDo.Worker.Planning;
|
|
using ClaudeDo.Worker.Queue;
|
|
using ClaudeDo.Worker.State;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.Extensions.Logging.Abstractions;
|
|
|
|
namespace ClaudeDo.Worker.Tests.Infrastructure;
|
|
|
|
/// Test-only helper that wires TaskStateService and PlanningChainCoordinator
|
|
/// against a shared DB factory, breaking the Func cycle between them.
|
|
public static class TaskStateServiceBuilder
|
|
{
|
|
public sealed record Built(
|
|
TaskStateService State,
|
|
PlanningChainCoordinator Chain,
|
|
CapturingHubContext Hub,
|
|
Func<int> WakeCount,
|
|
CountingQueueWaker Waker,
|
|
RunCancellationRegistry RunCancels);
|
|
|
|
public static Built Build(IDbContextFactory<ClaudeDoDbContext> dbFactory)
|
|
{
|
|
var hub = new CapturingHubContext();
|
|
var broadcaster = new HubBroadcaster(hub);
|
|
var waker = new CountingQueueWaker();
|
|
var runCancels = new RunCancellationRegistry();
|
|
|
|
TaskStateService? state = null;
|
|
var chain = new PlanningChainCoordinator(dbFactory, () => state!);
|
|
state = new TaskStateService(
|
|
dbFactory,
|
|
broadcaster,
|
|
waker,
|
|
chain,
|
|
runCancels,
|
|
NullLogger<TaskStateService>.Instance);
|
|
|
|
return new Built(state, chain, hub, () => waker.Count, waker, runCancels);
|
|
}
|
|
}
|
|
|
|
public sealed class CountingQueueWaker : IQueueWaker
|
|
{
|
|
private int _count;
|
|
public int Count => Volatile.Read(ref _count);
|
|
public void Wake() => Interlocked.Increment(ref _count);
|
|
}
|