using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.FileSystemGlobbing;
using Microsoft.Extensions.FileSystemGlobbing.Abstractions;
namespace Gott.Services;
public class ToolDefinitionOptions
{
public bool IncludeFileTools { get; set; }
public bool IncludeMemory { get; set; }
public bool IncludeUserChoice { get; set; } = true;
public bool IncludeRemote { get; set; }
public bool IncludeMemorySearch { get; set; }
public bool IncludeSendToSession { get; set; }
public bool IncludeGitHubSearch { get; set; }
public bool IncludeSerperSearch { get; set; }
}
public class ToolExecutionContext
{
public string Workspace { get; set; }
public MemoryService MemoryService { get; set; }
public string AgentId { get; set; }
public CancellationToken CancellationToken { get; set; }
public RemoteConnectionManager RemoteMgr { get; set; }
public string SessionId { get; set; }
public VectorSearchService VectorSearch { get; set; }
public EmbeddingBackgroundService EmbeddingBg { get; set; }
public DatabaseService Db { get; set; }
public ChatService ChatService { get; set; }
public AnthropicService AnthropicService { get; set; }
public OpenAiService OpenAiService { get; set; }
public string UserId { get; set; }
public TelegramService TelegramService { get; set; }
public string ApiToken { get; set; }
}
public class ToolService
{
private readonly ServerSettingsService _settings;
private IHttpClientFactory _httpFactory;
public ToolService(ServerSettingsService settings)
{
_settings = settings;
}
public void SetHttpClientFactory(IHttpClientFactory httpFactory)
{
_httpFactory = httpFactory;
}
private int ExecuteTimeoutSeconds => _settings.GetInt("ExecuteTimeout", 180);
public bool HasGitHubToken => !string.IsNullOrWhiteSpace(_settings.Get("GitHubToken"));
public bool HasSerperKey => !string.IsNullOrWhiteSpace(_settings.Get("SerperApiKey"));
public const string AskUserChoiceToolName = "ask_user_choice";
///
/// Read-only Tools die im Plan-Modus verfügbar bleiben.
/// Write-Tools (write_file, edit_file, delete_file, execute) werden entfernt.
///
private static readonly HashSet ReadOnlyToolNames = new HashSet
{
"read_file", "list_files", "glob", "grep", "execute", "todo_write",
"memory_read", "memory_write", "memory_list", "memory_search",
"remote_execute", "github_code_search", "serper_web_search", AskUserChoiceToolName
};
public object[] FilterReadOnlyTools(object[] tools)
{
var filtered = new List