using System.IO; using System.Linq; using System.Text.Json; namespace AxCopilot.Services.Agent; public sealed class TaskUpdateTool : IAgentTool { public string Name => "task_update"; public string Description => "Update task fields (status/title/description/priority) in the workspace task board."; public ToolParameterSchema Parameters => new() { Properties = new() { ["id"] = new() { Type = "integer", Description = "Task id" }, ["status"] = new() { Type = "string", Description = "open | in_progress | blocked | done | stopped" }, ["title"] = new() { Type = "string", Description = "New title (optional)" }, ["description"] = new() { Type = "string", Description = "New description (optional)" }, ["priority"] = new() { Type = "string", Description = "high | medium | low" }, }, Required = ["id"] }; public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) { if (!args.TryGetProperty("id", out var idEl)) return Task.FromResult(ToolResult.Fail("id is required.")); if (string.IsNullOrWhiteSpace(context.WorkFolder) || !Directory.Exists(context.WorkFolder)) return Task.FromResult(ToolResult.Fail("valid WorkFolder is required.")); var id = idEl.GetInt32(); var tasks = TaskBoardStore.Load(context.WorkFolder); var task = tasks.FirstOrDefault(t => t.Id == id); if (task == null) return Task.FromResult(ToolResult.Fail($"Task #{id} not found.")); if (args.TryGetProperty("status", out var statusEl)) { var status = (statusEl.GetString() ?? "").Trim().ToLowerInvariant(); if (!TaskBoardStore.IsValidStatus(status)) return Task.FromResult(ToolResult.Fail("Invalid status.")); task.Status = status; } if (args.TryGetProperty("title", out var titleEl)) { var title = (titleEl.GetString() ?? "").Trim(); if (!string.IsNullOrWhiteSpace(title)) task.Title = title; } if (args.TryGetProperty("description", out var descEl)) task.Description = (descEl.GetString() ?? "").Trim(); if (args.TryGetProperty("priority", out var priEl)) { var priority = (priEl.GetString() ?? "").Trim().ToLowerInvariant(); if (!TaskBoardStore.IsValidPriority(priority)) return Task.FromResult(ToolResult.Fail("Invalid priority.")); task.Priority = priority; } task.UpdatedAt = DateTime.Now; TaskBoardStore.Save(context.WorkFolder, tasks); return Task.FromResult(ToolResult.Ok($"Updated task #{task.Id}: [{task.Status}] {task.Title}")); } }