using System.IO; using System.Linq; using System.Text; using System.Text.Json; namespace AxCopilot.Services.Agent; public sealed class TaskListTool : IAgentTool { public string Name => "task_list"; public string Description => "List tasks from the workspace task board."; public ToolParameterSchema Parameters => new() { Properties = new() { ["status"] = new() { Type = "string", Description = "Filter by status (optional)." } }, Required = [] }; public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) { if (string.IsNullOrWhiteSpace(context.WorkFolder) || !Directory.Exists(context.WorkFolder)) return Task.FromResult(ToolResult.Fail("valid WorkFolder is required.")); var status = args.SafeTryGetProperty("status", out var statusEl) ? (statusEl.SafeGetString() ?? "").Trim().ToLowerInvariant() : ""; var tasks = TaskBoardStore.Load(context.WorkFolder); if (!string.IsNullOrWhiteSpace(status)) tasks = tasks.Where(t => string.Equals(t.Status, status, StringComparison.OrdinalIgnoreCase)).ToList(); if (tasks.Count == 0) return Task.FromResult(ToolResult.Ok("No tasks.")); var ordered = tasks .OrderBy(t => t.Status == "done" || t.Status == "stopped" ? 1 : 0) .ThenByDescending(t => t.Priority == "high" ? 3 : t.Priority == "medium" ? 2 : 1) .ThenByDescending(t => t.UpdatedAt) .ToList(); var sb = new StringBuilder(); sb.AppendLine($"tasks: {ordered.Count}"); foreach (var t in ordered) sb.AppendLine($"#{t.Id} [{t.Status}] [{t.Priority}] {t.Title}"); return Task.FromResult(ToolResult.Ok(sb.ToString())); } }