using System; using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; using System.Security.Cryptography; using System.Text; using System.Text.Json; using System.Threading; using System.Threading.Tasks; namespace AxCopilot.Services.Agent; public class HashTool : IAgentTool { public string Name => "hash_tool"; public string Description => "Compute hash digests for text or files. Supports MD5, SHA1, SHA256, SHA512. Use 'text' mode for inline text or 'file' mode for file path."; public ToolParameterSchema Parameters { get { ToolParameterSchema toolParameterSchema = new ToolParameterSchema(); Dictionary dictionary = new Dictionary(); ToolProperty obj = new ToolProperty { Type = "string", Description = "Input mode" }; int num = 2; List list = new List(num); CollectionsMarshal.SetCount(list, num); Span span = CollectionsMarshal.AsSpan(list); span[0] = "text"; span[1] = "file"; obj.Enum = list; dictionary["mode"] = obj; dictionary["input"] = new ToolProperty { Type = "string", Description = "Text to hash or file path" }; ToolProperty obj2 = new ToolProperty { Type = "string", Description = "Hash algorithm (default: sha256)" }; num = 4; List list2 = new List(num); CollectionsMarshal.SetCount(list2, num); Span span2 = CollectionsMarshal.AsSpan(list2); span2[0] = "md5"; span2[1] = "sha1"; span2[2] = "sha256"; span2[3] = "sha512"; obj2.Enum = list2; dictionary["algorithm"] = obj2; toolParameterSchema.Properties = dictionary; num = 2; List list3 = new List(num); CollectionsMarshal.SetCount(list3, num); Span span3 = CollectionsMarshal.AsSpan(list3); span3[0] = "mode"; span3[1] = "input"; toolParameterSchema.Required = list3; return toolParameterSchema; } } public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default(CancellationToken)) { string text = args.GetProperty("mode").GetString() ?? "text"; string text2 = args.GetProperty("input").GetString() ?? ""; JsonElement value; string text3 = (args.TryGetProperty("algorithm", out value) ? (value.GetString() ?? "sha256") : "sha256"); try { byte[] array; string value2; if (text == "file") { string text4 = (Path.IsPathRooted(text2) ? text2 : Path.Combine(context.WorkFolder, text2)); if (!File.Exists(text4)) { return Task.FromResult(ToolResult.Fail("File not found: " + text4)); } array = File.ReadAllBytes(text4); value2 = Path.GetFileName(text4); } else { array = Encoding.UTF8.GetBytes(text2); value2 = $"text ({array.Length} bytes)"; } if (1 == 0) { } HashAlgorithm hashAlgorithm = text3 switch { "md5" => MD5.Create(), "sha1" => SHA1.Create(), "sha256" => SHA256.Create(), "sha512" => SHA512.Create(), _ => SHA256.Create(), }; if (1 == 0) { } using HashAlgorithm hashAlgorithm2 = hashAlgorithm; byte[] array2 = hashAlgorithm2.ComputeHash(array); string value3 = BitConverter.ToString(array2).Replace("-", "").ToLowerInvariant(); return Task.FromResult(ToolResult.Ok($"{text3.ToUpperInvariant()}({value2}):\n{value3}")); } catch (Exception ex) { return Task.FromResult(ToolResult.Fail("해시 오류: " + ex.Message)); } } }