feat(worker): MCP tools update_planning_task and finalize

This commit is contained in:
mika kuns
2026-04-23 23:03:42 +02:00
parent 0088d6e0e0
commit 99c6a71e4c
3 changed files with 59 additions and 0 deletions

View File

@@ -267,6 +267,23 @@ public sealed class TaskRepository
return child;
}
public async Task UpdatePlanningTaskAsync(
string taskId,
string? title,
string? description,
CancellationToken ct = default)
{
var entity = await _context.Tasks.AsNoTracking().FirstOrDefaultAsync(t => t.Id == taskId, ct)
?? throw new InvalidOperationException("Planning task not found.");
if (title is not null) entity.Title = title;
if (description is not null) entity.Description = description;
await _context.Tasks
.Where(t => t.Id == taskId)
.ExecuteUpdateAsync(s => s
.SetProperty(t => t.Title, entity.Title)
.SetProperty(t => t.Description, entity.Description), ct);
}
public async Task<TaskEntity?> SetPlanningStartedAsync(
string taskId,
string sessionToken,

View File

@@ -82,4 +82,19 @@ public sealed class PlanningMcpService
await _tasks.DeleteAsync(taskId, cancellationToken);
}
public async Task UpdatePlanningTask(
PlanningMcpContext ctx,
string? title,
string? description,
CancellationToken cancellationToken)
{
await _tasks.UpdatePlanningTaskAsync(ctx.ParentTaskId, title, description, cancellationToken);
}
public Task<int> Finalize(
PlanningMcpContext ctx,
bool queueAgentTasks,
CancellationToken cancellationToken)
=> _tasks.FinalizePlanningAsync(ctx.ParentTaskId, queueAgentTasks, cancellationToken);
}

View File

@@ -104,4 +104,31 @@ public sealed class PlanningMcpServiceTests : IDisposable
Assert.Null(await _tasks.GetByIdAsync(c.Id));
}
[Fact]
public async Task UpdatePlanningTask_SetsTitleAndDescription()
{
var parent = await SeedPlanningParentAsync();
await _sut.UpdatePlanningTask(Ctx(parent.Id), "new title", "new desc", CancellationToken.None);
var loaded = await _tasks.GetByIdAsync(parent.Id);
Assert.Equal("new title", loaded!.Title);
Assert.Equal("new desc", loaded.Description);
}
[Fact]
public async Task Finalize_PromotesDraftsAndInvalidatesToken()
{
var parent = await SeedPlanningParentAsync();
await _tasks.CreateChildAsync(parent.Id, "c1", null, null, null);
await _tasks.CreateChildAsync(parent.Id, "c2", null, null, null);
var count = await _sut.Finalize(Ctx(parent.Id), true, CancellationToken.None);
Assert.Equal(2, count);
var loaded = await _tasks.GetByIdAsync(parent.Id);
Assert.Equal(TaskStatus.Planned, loaded!.Status);
Assert.Null(loaded.PlanningSessionToken);
}
}