using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; namespace AxCopilot.Services.Agent; public static class TaskDecomposer { private static readonly Regex StepPattern = new Regex("(?:^|\\n)\\s*(?:(?:Step\\s*)?(\\d+)[.):\\-]\\s*)(.+?)(?=\\n|$)", RegexOptions.IgnoreCase | RegexOptions.Compiled); public static List ExtractSteps(string text) { if (string.IsNullOrWhiteSpace(text)) { return new List(); } MatchCollection matchCollection = StepPattern.Matches(text); if (matchCollection.Count < 2) { return new List(); } List list = new List(); int num = 0; foreach (Match item in matchCollection) { if (int.TryParse(item.Groups[1].Value, out var result) && (result == num + 1 || num == 0)) { string input = item.Groups[2].Value.Trim(); input = Regex.Replace(input, "\\*\\*(.+?)\\*\\*", "$1"); input = Regex.Replace(input, "\\*(.+?)\\*", "$1"); input = Regex.Replace(input, "`(.+?)`", "$1"); input = Regex.Replace(input, "\\[(.+?)\\]\\(.+?\\)", "$1"); input = input.TrimEnd(':', ' '); if (input.Length >= 3 && input.Length <= 300) { list.Add(input); num = result; } } } return (list.Count >= 2) ? list.Take(20).ToList() : new List(); } public static int EstimateCurrentStep(List steps, string toolName, string toolSummary, int lastStep) { if (steps.Count == 0) { return 0; } for (int i = lastStep; i < steps.Count; i++) { string text = steps[i].ToLowerInvariant(); string value = toolName.ToLowerInvariant(); string summary = toolSummary.ToLowerInvariant(); if (text.Contains(value) || ContainsKeywordOverlap(text, summary)) { return i; } } return Math.Min(lastStep + 1, steps.Count - 1); } private static bool ContainsKeywordOverlap(string stepText, string summary) { if (string.IsNullOrEmpty(summary)) { return false; } IEnumerable source = (from w in summary.Split(' ', '/', '\\', '.', ',', ':', ';', '(', ')') where w.Length >= 3 select w).Take(5); return source.Any((string w) => stepText.Contains(w)); } }