From 2fed388c99866464fac8cac770e8cff728cd7d74 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 26 Jul 2026 18:21:46 +0200 Subject: [PATCH] Initial commit: ClawdDotNet Import des bestehenden Projektstands in Git. - .NET 10 WinForms Anwendung (Multi-Agent / Tool-System) - .gitignore fuer Build-Artefakte, Secrets und Runtime-Daten ergaenzt Co-Authored-By: Claude Opus 4.8 --- .agents/rules/tool-entwickler-anweisungen.md | 10 + .gitignore | 46 + ClawdDotNet.csproj | 105 + ClawdDotNet.slnx | 15 + ClawdDotNet_Prompt_InternetTools.md | 695 ++++ ClawdDotNet_Prompt_TelegramClient.md | 718 ++++ ClawdDotNet_Prompt_WebviewChatWinForms.md | 792 +++++ ClawdDotNet_StartPrompt.md | 470 +++ Deploy-Build.ps1 | 256 ++ Directory.Build.targets | 16 + EmbeddedUI/bridge.js | 9 + EmbeddedUI/chat.css | 72 + EmbeddedUI/chat.html | 27 + EmbeddedUI/chat.js | 135 + EmbeddedUI/overview.css | 117 + EmbeddedUI/overview.html | 39 + EmbeddedUI/overview.js | 191 + Ideensamlung Systemprompt.txt | 8 + Ideensamlung Systemprompt.txt.bak | 0 Martin-Berube-Flat-Animal-Crab.ico | Bin 0 -> 177470 bytes Models/AgentListEntry.cs | 28 + Models/AgentSettingsViewModel.cs | 129 + Models/AgentToolDisplayEntry.cs | 8 + Models/AppSettings.cs | 58 + Models/InstanceInfo.cs | 13 + Models/InstanceSettingsViewModel.cs | 85 + Models/JobDisplayEntry.cs | 17 + Models/JobHistoryEntry.cs | 24 + Models/ModelTypeConverter.cs | 94 + Models/ServiceDisplayEntry.cs | 13 + Models/TokenUsageRecord.cs | 51 + Models/ToolSettingsViewModels.cs | 566 +++ NuGet.Config | 31 + Program.cs | 247 ++ Properties/Resources.Designer.cs | 123 + Properties/Resources.resx | 139 + Resources/add.png | Bin 0 -> 1815 bytes Resources/cog.png | Bin 0 -> 2104 bytes Resources/messenger.png | Bin 0 -> 1109 bytes Resources/plus.png | Bin 0 -> 1608 bytes Resources/server_add.png | Bin 0 -> 1480 bytes Resources/server_go.png | Bin 0 -> 1339 bytes Services/InstanceDirectoryManager.cs | 432 +++ Services/JobHistoryService.cs | 95 + Services/LiveLogViewerService.cs | 255 ++ Services/OpenRouterStatusService.cs | 212 ++ Services/SettingsManager.cs | 68 + UI/BridgeMessage.cs | 33 + UI/EmbeddedUiManager.cs | 40 + UI/WebViewBridge.cs | 75 + configs/crypto-team.json | 46 + configs/stock-team.json | 55 + docs/InstanceSetupGuide.md | 503 +++ docs/ToolDevelopmentGuide.md | 465 +++ frm_AddJob.Designer.cs | 246 ++ frm_AddJob.cs | 258 ++ frm_AddJob.resx | 120 + frm_AddService.Designer.cs | 157 + frm_AddService.cs | 50 + frm_AddService.resx | 120 + frm_CreateInstance.Designer.cs | 111 + frm_CreateInstance.cs | 21 + frm_CreateInstance.resx | 120 + frm_InstanceManager.Designer.cs | 117 + frm_InstanceManager.cs | 165 + frm_InstanceManager.resx | 3089 ++++++++++++++++ frm_chat.Designer.cs | 65 + frm_chat.cs | 165 + frm_chat.resx | 3083 ++++++++++++++++ frm_main.Designer.cs | 1451 ++++++++ frm_main.cs | 1570 +++++++++ frm_main.en.resx | 306 ++ frm_main.resx | 3104 +++++++++++++++++ .../Api/Models/ChatMessage.cs | 38 + .../Api/Models/ChatRequest.cs | 32 + .../Api/Models/ChatResponse.cs | 54 + src/ClawdDotNet.Core/Api/Models/ModelInfo.cs | 15 + src/ClawdDotNet.Core/Api/Models/ToolCall.cs | 24 + .../Api/Models/ToolDefinition.cs | 25 + src/ClawdDotNet.Core/Api/OpenRouterClient.cs | 120 + src/ClawdDotNet.Core/BuildInfo.cs | 7 + src/ClawdDotNet.Core/ClawdDotNet.Core.csproj | 16 + src/ClawdDotNet.Core/Config/AgentConfig.cs | 124 + src/ClawdDotNet.Core/Config/ConfigLoader.cs | 42 + src/ClawdDotNet.Core/Config/InstanceConfig.cs | 48 + src/ClawdDotNet.Core/Config/ServiceConfig.cs | 74 + src/ClawdDotNet.Core/Config/ToolJobConfig.cs | 24 + src/ClawdDotNet.Core/Engine/AgentEngine.cs | 700 ++++ src/ClawdDotNet.Core/Engine/AgentRunResult.cs | 19 + src/ClawdDotNet.Core/Engine/ChatEntry.cs | 21 + .../Engine/ContextCompactor.cs | 189 + src/ClawdDotNet.Core/Engine/LoopGuard.cs | 29 + src/ClawdDotNet.Core/Logging/FileLogWriter.cs | 118 + .../Logging/FileLoggerOptions.cs | 18 + .../Logging/FileLoggerProvider.cs | 66 + src/ClawdDotNet.Core/Logging/LogEntry.cs | 29 + .../Logging/LoggingExtensions.cs | 42 + src/ClawdDotNet.Core/Logging/ModuleLogger.cs | 62 + .../Scheduling/AgentScheduler.cs | 143 + .../Scheduling/CronExpression.cs | 119 + .../Scheduling/ToolJobScheduler.cs | 213 ++ .../Security/PermissionGate.cs | 18 + src/ClawdDotNet.Core/State/IStateStore.cs | 8 + .../State/SqliteStateStore.cs | 63 + .../Tools/AgentToolContext.cs | 16 + .../Tools/IAgentMessageRouter.cs | 24 + src/ClawdDotNet.Core/Tools/IAgentTool.cs | 15 + .../Tools/IToolJobProvider.cs | 18 + .../Tools/ToolJobDefinition.cs | 7 + src/ClawdDotNet.Core/Tools/ToolJobResult.cs | 26 + src/ClawdDotNet.Core/Tools/ToolRegistry.cs | 44 + src/ClawdDotNet.Core/Tools/ToolResult.cs | 12 + .../AgentCommTool.cs | 116 + src/ClawdDotNet.Tools.AgentComm/BuildInfo.cs | 7 + .../ClawdDotNet.Tools.AgentComm.csproj | 12 + .../AgentEditorTool.cs | 463 +++ .../BuildInfo.cs | 7 + .../ClawdDotNet.Tools.AgentEditor.csproj | 12 + .../AgentSpawnTool.cs | 118 + src/ClawdDotNet.Tools.AgentSpawn/BuildInfo.cs | 7 + .../ClawdDotNet.Tools.AgentSpawn.csproj | 12 + src/ClawdDotNet.Tools.Database/BuildInfo.cs | 7 + .../ClawdDotNet.Tools.Database.csproj | 21 + .../DatabaseTool.cs | 230 ++ src/ClawdDotNet.Tools.DirectAPI/BuildInfo.cs | 7 + src/ClawdDotNet.Tools.DirectAPI/Class1.cs | 6 + .../ClawdDotNet.Tools.DirectAPI.csproj | 13 + .../DirectAPITool.cs | 356 ++ src/ClawdDotNet.Tools.FTP/BuildInfo.cs | 7 + .../ClawdDotNet.Tools.FTP.csproj | 16 + src/ClawdDotNet.Tools.FTP/FtpTool.cs | 346 ++ src/ClawdDotNet.Tools.FileRW/BuildInfo.cs | 7 + .../ClawdDotNet.Tools.FileRW.csproj | 12 + src/ClawdDotNet.Tools.FileRW/FileRWTool.cs | 601 ++++ src/ClawdDotNet.Tools.Mail/BuildInfo.cs | 7 + .../ClawdDotNet.Tools.Mail.csproj | 16 + src/ClawdDotNet.Tools.Mail/MailTool.cs | 278 ++ .../BuildInfo.cs | 7 + ...lawdDotNet.Tools.SocialMediaManager.csproj | 12 + .../SocialMediaManagerTool.cs | 1225 +++++++ src/ClawdDotNet.Tools.Telegram/BuildInfo.cs | 7 + .../ClawdDotNet.Tools.Telegram.csproj | 16 + .../TelegramTool.cs | 216 ++ .../ClawdDotNet.Tools.TelegramClient.csproj | 16 + .../TelegramClientManager.cs | 146 + .../TelegramClientTool.cs | 315 ++ src/ClawdDotNet.Tools.WebFetch/BuildInfo.cs | 7 + src/ClawdDotNet.Tools.WebFetch/Class1.cs | 6 + .../ClawdDotNet.Tools.WebFetch.csproj | 13 + .../WebFetchTool.cs | 230 ++ src/ClawdDotNet.Tools.WebMonitor/BuildInfo.cs | 7 + src/ClawdDotNet.Tools.WebMonitor/Class1.cs | 6 + .../ClawdDotNet.Tools.WebMonitor.csproj | 13 + .../WebMonitorTool.cs | 204 ++ 154 files changed, 29736 insertions(+) create mode 100644 .agents/rules/tool-entwickler-anweisungen.md create mode 100644 .gitignore create mode 100644 ClawdDotNet.csproj create mode 100644 ClawdDotNet.slnx create mode 100644 ClawdDotNet_Prompt_InternetTools.md create mode 100644 ClawdDotNet_Prompt_TelegramClient.md create mode 100644 ClawdDotNet_Prompt_WebviewChatWinForms.md create mode 100644 ClawdDotNet_StartPrompt.md create mode 100644 Deploy-Build.ps1 create mode 100644 Directory.Build.targets create mode 100644 EmbeddedUI/bridge.js create mode 100644 EmbeddedUI/chat.css create mode 100644 EmbeddedUI/chat.html create mode 100644 EmbeddedUI/chat.js create mode 100644 EmbeddedUI/overview.css create mode 100644 EmbeddedUI/overview.html create mode 100644 EmbeddedUI/overview.js create mode 100644 Ideensamlung Systemprompt.txt create mode 100644 Ideensamlung Systemprompt.txt.bak create mode 100644 Martin-Berube-Flat-Animal-Crab.ico create mode 100644 Models/AgentListEntry.cs create mode 100644 Models/AgentSettingsViewModel.cs create mode 100644 Models/AgentToolDisplayEntry.cs create mode 100644 Models/AppSettings.cs create mode 100644 Models/InstanceInfo.cs create mode 100644 Models/InstanceSettingsViewModel.cs create mode 100644 Models/JobDisplayEntry.cs create mode 100644 Models/JobHistoryEntry.cs create mode 100644 Models/ModelTypeConverter.cs create mode 100644 Models/ServiceDisplayEntry.cs create mode 100644 Models/TokenUsageRecord.cs create mode 100644 Models/ToolSettingsViewModels.cs create mode 100644 NuGet.Config create mode 100644 Program.cs create mode 100644 Properties/Resources.Designer.cs create mode 100644 Properties/Resources.resx create mode 100644 Resources/add.png create mode 100644 Resources/cog.png create mode 100644 Resources/messenger.png create mode 100644 Resources/plus.png create mode 100644 Resources/server_add.png create mode 100644 Resources/server_go.png create mode 100644 Services/InstanceDirectoryManager.cs create mode 100644 Services/JobHistoryService.cs create mode 100644 Services/LiveLogViewerService.cs create mode 100644 Services/OpenRouterStatusService.cs create mode 100644 Services/SettingsManager.cs create mode 100644 UI/BridgeMessage.cs create mode 100644 UI/EmbeddedUiManager.cs create mode 100644 UI/WebViewBridge.cs create mode 100644 configs/crypto-team.json create mode 100644 configs/stock-team.json create mode 100644 docs/InstanceSetupGuide.md create mode 100644 docs/ToolDevelopmentGuide.md create mode 100644 frm_AddJob.Designer.cs create mode 100644 frm_AddJob.cs create mode 100644 frm_AddJob.resx create mode 100644 frm_AddService.Designer.cs create mode 100644 frm_AddService.cs create mode 100644 frm_AddService.resx create mode 100644 frm_CreateInstance.Designer.cs create mode 100644 frm_CreateInstance.cs create mode 100644 frm_CreateInstance.resx create mode 100644 frm_InstanceManager.Designer.cs create mode 100644 frm_InstanceManager.cs create mode 100644 frm_InstanceManager.resx create mode 100644 frm_chat.Designer.cs create mode 100644 frm_chat.cs create mode 100644 frm_chat.resx create mode 100644 frm_main.Designer.cs create mode 100644 frm_main.cs create mode 100644 frm_main.en.resx create mode 100644 frm_main.resx create mode 100644 src/ClawdDotNet.Core/Api/Models/ChatMessage.cs create mode 100644 src/ClawdDotNet.Core/Api/Models/ChatRequest.cs create mode 100644 src/ClawdDotNet.Core/Api/Models/ChatResponse.cs create mode 100644 src/ClawdDotNet.Core/Api/Models/ModelInfo.cs create mode 100644 src/ClawdDotNet.Core/Api/Models/ToolCall.cs create mode 100644 src/ClawdDotNet.Core/Api/Models/ToolDefinition.cs create mode 100644 src/ClawdDotNet.Core/Api/OpenRouterClient.cs create mode 100644 src/ClawdDotNet.Core/BuildInfo.cs create mode 100644 src/ClawdDotNet.Core/ClawdDotNet.Core.csproj create mode 100644 src/ClawdDotNet.Core/Config/AgentConfig.cs create mode 100644 src/ClawdDotNet.Core/Config/ConfigLoader.cs create mode 100644 src/ClawdDotNet.Core/Config/InstanceConfig.cs create mode 100644 src/ClawdDotNet.Core/Config/ServiceConfig.cs create mode 100644 src/ClawdDotNet.Core/Config/ToolJobConfig.cs create mode 100644 src/ClawdDotNet.Core/Engine/AgentEngine.cs create mode 100644 src/ClawdDotNet.Core/Engine/AgentRunResult.cs create mode 100644 src/ClawdDotNet.Core/Engine/ChatEntry.cs create mode 100644 src/ClawdDotNet.Core/Engine/ContextCompactor.cs create mode 100644 src/ClawdDotNet.Core/Engine/LoopGuard.cs create mode 100644 src/ClawdDotNet.Core/Logging/FileLogWriter.cs create mode 100644 src/ClawdDotNet.Core/Logging/FileLoggerOptions.cs create mode 100644 src/ClawdDotNet.Core/Logging/FileLoggerProvider.cs create mode 100644 src/ClawdDotNet.Core/Logging/LogEntry.cs create mode 100644 src/ClawdDotNet.Core/Logging/LoggingExtensions.cs create mode 100644 src/ClawdDotNet.Core/Logging/ModuleLogger.cs create mode 100644 src/ClawdDotNet.Core/Scheduling/AgentScheduler.cs create mode 100644 src/ClawdDotNet.Core/Scheduling/CronExpression.cs create mode 100644 src/ClawdDotNet.Core/Scheduling/ToolJobScheduler.cs create mode 100644 src/ClawdDotNet.Core/Security/PermissionGate.cs create mode 100644 src/ClawdDotNet.Core/State/IStateStore.cs create mode 100644 src/ClawdDotNet.Core/State/SqliteStateStore.cs create mode 100644 src/ClawdDotNet.Core/Tools/AgentToolContext.cs create mode 100644 src/ClawdDotNet.Core/Tools/IAgentMessageRouter.cs create mode 100644 src/ClawdDotNet.Core/Tools/IAgentTool.cs create mode 100644 src/ClawdDotNet.Core/Tools/IToolJobProvider.cs create mode 100644 src/ClawdDotNet.Core/Tools/ToolJobDefinition.cs create mode 100644 src/ClawdDotNet.Core/Tools/ToolJobResult.cs create mode 100644 src/ClawdDotNet.Core/Tools/ToolRegistry.cs create mode 100644 src/ClawdDotNet.Core/Tools/ToolResult.cs create mode 100644 src/ClawdDotNet.Tools.AgentComm/AgentCommTool.cs create mode 100644 src/ClawdDotNet.Tools.AgentComm/BuildInfo.cs create mode 100644 src/ClawdDotNet.Tools.AgentComm/ClawdDotNet.Tools.AgentComm.csproj create mode 100644 src/ClawdDotNet.Tools.AgentEditor/AgentEditorTool.cs create mode 100644 src/ClawdDotNet.Tools.AgentEditor/BuildInfo.cs create mode 100644 src/ClawdDotNet.Tools.AgentEditor/ClawdDotNet.Tools.AgentEditor.csproj create mode 100644 src/ClawdDotNet.Tools.AgentSpawn/AgentSpawnTool.cs create mode 100644 src/ClawdDotNet.Tools.AgentSpawn/BuildInfo.cs create mode 100644 src/ClawdDotNet.Tools.AgentSpawn/ClawdDotNet.Tools.AgentSpawn.csproj create mode 100644 src/ClawdDotNet.Tools.Database/BuildInfo.cs create mode 100644 src/ClawdDotNet.Tools.Database/ClawdDotNet.Tools.Database.csproj create mode 100644 src/ClawdDotNet.Tools.Database/DatabaseTool.cs create mode 100644 src/ClawdDotNet.Tools.DirectAPI/BuildInfo.cs create mode 100644 src/ClawdDotNet.Tools.DirectAPI/Class1.cs create mode 100644 src/ClawdDotNet.Tools.DirectAPI/ClawdDotNet.Tools.DirectAPI.csproj create mode 100644 src/ClawdDotNet.Tools.DirectAPI/DirectAPITool.cs create mode 100644 src/ClawdDotNet.Tools.FTP/BuildInfo.cs create mode 100644 src/ClawdDotNet.Tools.FTP/ClawdDotNet.Tools.FTP.csproj create mode 100644 src/ClawdDotNet.Tools.FTP/FtpTool.cs create mode 100644 src/ClawdDotNet.Tools.FileRW/BuildInfo.cs create mode 100644 src/ClawdDotNet.Tools.FileRW/ClawdDotNet.Tools.FileRW.csproj create mode 100644 src/ClawdDotNet.Tools.FileRW/FileRWTool.cs create mode 100644 src/ClawdDotNet.Tools.Mail/BuildInfo.cs create mode 100644 src/ClawdDotNet.Tools.Mail/ClawdDotNet.Tools.Mail.csproj create mode 100644 src/ClawdDotNet.Tools.Mail/MailTool.cs create mode 100644 src/ClawdDotNet.Tools.SocialMediaManager/BuildInfo.cs create mode 100644 src/ClawdDotNet.Tools.SocialMediaManager/ClawdDotNet.Tools.SocialMediaManager.csproj create mode 100644 src/ClawdDotNet.Tools.SocialMediaManager/SocialMediaManagerTool.cs create mode 100644 src/ClawdDotNet.Tools.Telegram/BuildInfo.cs create mode 100644 src/ClawdDotNet.Tools.Telegram/ClawdDotNet.Tools.Telegram.csproj create mode 100644 src/ClawdDotNet.Tools.Telegram/TelegramTool.cs create mode 100644 src/ClawdDotNet.Tools.TelegramClient/ClawdDotNet.Tools.TelegramClient.csproj create mode 100644 src/ClawdDotNet.Tools.TelegramClient/TelegramClientManager.cs create mode 100644 src/ClawdDotNet.Tools.TelegramClient/TelegramClientTool.cs create mode 100644 src/ClawdDotNet.Tools.WebFetch/BuildInfo.cs create mode 100644 src/ClawdDotNet.Tools.WebFetch/Class1.cs create mode 100644 src/ClawdDotNet.Tools.WebFetch/ClawdDotNet.Tools.WebFetch.csproj create mode 100644 src/ClawdDotNet.Tools.WebFetch/WebFetchTool.cs create mode 100644 src/ClawdDotNet.Tools.WebMonitor/BuildInfo.cs create mode 100644 src/ClawdDotNet.Tools.WebMonitor/Class1.cs create mode 100644 src/ClawdDotNet.Tools.WebMonitor/ClawdDotNet.Tools.WebMonitor.csproj create mode 100644 src/ClawdDotNet.Tools.WebMonitor/WebMonitorTool.cs diff --git a/.agents/rules/tool-entwickler-anweisungen.md b/.agents/rules/tool-entwickler-anweisungen.md new file mode 100644 index 0000000..d320928 --- /dev/null +++ b/.agents/rules/tool-entwickler-anweisungen.md @@ -0,0 +1,10 @@ +--- +trigger: always_on +--- + +Achtung: Die Entwicklung dieses Projekts ist strikt in "Core" und "Tools" getrennt! +Die Entwicklung des Cores übernimmt ein anderer Agent. Du nimmst unter keinen Umständen änderungen am Core vor! +Du bist nur dafür zuständig neue Tools für dieses Projekt zu entwickeln. +Informationen wie das Tool aufgebaut sein mus findest du im /docs/ToolDevelopmentGuide.md +Falls du ein Tool aufgrund fehlender schnittstellen nicht realisieren kannst gibst du mir eine entsprechende Rückmeldung! +Du wirst auf keinen Fall selbstständig das Core-Tool Interface verändern oder bearbeiten. \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..83752b3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# ---- Build results ---- +[Bb]in/ +[Oo]bj/ +[Oo]ut/ +[Ll]og/ +[Ll]ogs/ + +# ---- Visual Studio / Rider ---- +.vs/ +.idea/ +*.user +*.suo +*.userosscache +*.sln.docstates +*.userprefs + +# ---- Build / restore artifacts ---- +project.lock.json +project.fragment.lock.json +artifacts/ +*.nupkg +*.snupkg +msbuild.log +msbuild.err +msbuild.wrn + +# ---- Deploy / packaging output ---- +deploy/*.zip + +# ---- Runtime instance/agent data (created next to the binary) ---- +Instances/ +data/ + +# ---- OS files ---- +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ +.DS_Store + +# ---- Secrets / local-only settings ---- +# Local Claude Code settings contain machine-specific permissions and API keys +.claude/settings.local.json +# Real credential configs (commit *.template / placeholder configs only) +*.secrets.json +appsettings.*.local.json diff --git a/ClawdDotNet.csproj b/ClawdDotNet.csproj new file mode 100644 index 0000000..6e1f679 --- /dev/null +++ b/ClawdDotNet.csproj @@ -0,0 +1,105 @@ + + + + WinExe + net10.0-windows + enable + true + enable + ClawdDotNet + Martin-Berube-Flat-Animal-Crab.ico + + + + de;en + + false + + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ClawdDotNet.slnx b/ClawdDotNet.slnx new file mode 100644 index 0000000..9025660 --- /dev/null +++ b/ClawdDotNet.slnx @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ClawdDotNet_Prompt_InternetTools.md b/ClawdDotNet_Prompt_InternetTools.md new file mode 100644 index 0000000..720f70f --- /dev/null +++ b/ClawdDotNet_Prompt_InternetTools.md @@ -0,0 +1,695 @@ +# ClawdDotNet – Prompt-Anhang: Internet-Tools + +Dieser Abschnitt ergänzt die bestehenden Prompt-Anhänge und definiert drei +unabhängige Internet-Tools sowie ein spezialisiertes Monitoring-Tool für +strukturierte Webseiten (z.B. Capitol Trades). + +Alle Tools folgen den bekannten Prinzipien: IAgentTool implementiert, +Konfiguration ausschließlich aus AgentToolContext, keine Tool-zu-Tool-Abhängigkeiten. + +--- + +## Pflicht-Regel: Timestamp in jedem ToolResult + +**Diese Regel gilt für ALLE Internet-Tools ohne Ausnahme.** + +Jedes `ToolResult.Content` das Finanzdaten, Nachrichten oder externe Daten enthält, +muss ein JSON-Objekt zurückgeben das mindestens enthält: + +```json +{ + "fetchedAt": "2026-05-13T07:42:00Z", + "dataAsOf": "2026-05-13T07:40:00Z", + "source": "https://...", + "data": { ... } +} +``` + +- `fetchedAt` = Zeitpunkt des HTTP-Requests (UTC, immer `DateTime.UtcNow`) +- `dataAsOf` = Zeitpunkt der Daten laut Quelle (aus Response-Header, HTML oder API-Feld) + Falls nicht ermittelbar: `null` — NIEMALS schätzen oder weglassen +- `source` = exakte URL die abgerufen wurde + +Der System-Prompt jedes Agenten der Internet-Tools nutzt MUSS enthalten: +> "Verwende niemals Daten ohne `fetchedAt`-Feld. Wenn `dataAsOf` null ist, +> teile dem Nutzer mit dass der Datenzeitpunkt unbekannt ist. +> Erfinde niemals Kurse, Preise oder Daten aus dem Gedächtnis." + +--- + +## Tool 1: DirectAPI — Echtzeit-Finanzdaten + +**Datei: `ClawdDotNet.Tools.DirectAPI/DirectApiTool.cs`** + +Direkter HTTP-Zugriff auf Finanz-APIs. Kein HTML-Parsing. +Strukturiertes JSON mit verifizierbaren Timestamps. + +### AgentConfig-Beispiel + +```json +"DirectAPI": { + "providers": { + "twelvedata": { + "apiKey": "your-key-here", + "baseUrl": "https://api.twelvedata.com" + }, + "alphavantage": { + "apiKey": "your-key-here", + "baseUrl": "https://www.alphavantage.co" + }, + "coingecko": { + "baseUrl": "https://api.coingecko.com/api/v3" + }, + "yahoo": { + "baseUrl": "https://query1.finance.yahoo.com" + } + }, + "defaultProvider": "twelvedata", + "cacheTtlSeconds": 60 +} +``` + +### Tool-Implementierung + +```csharp +namespace ClawdDotNet.Tools.DirectAPI; + +public sealed class DirectApiTool : IAgentTool +{ + public string Name => "DirectAPI"; + public string Description => """ + Ruft Echtzeit-Finanzdaten von verifizierten APIs ab. + Alle Antworten enthalten fetchedAt und dataAsOf Timestamps. + Aktionen: quote, history, crypto, forex, search + """; + + public JsonElement InputSchema => JsonDocument.Parse(""" + { + "type": "object", + "required": ["action", "symbol"], + "properties": { + "action": { + "type": "string", + "enum": ["quote", "history", "crypto", "forex", "search"], + "description": "quote=aktueller Kurs, history=Kursverlauf, crypto=Krypto, forex=Wechselkurs, search=Symbol suchen" + }, + "symbol": { "type": "string", "description": "z.B. NVDA, BTC, EUR/USD" }, + "provider": { "type": "string", "description": "optional: twelvedata|alphavantage|coingecko|yahoo" }, + "interval": { "type": "string", "description": "für history: 1min|5min|1h|1day" }, + "outputsize":{ "type": "integer","description": "für history: Anzahl Datenpunkte, max 500" } + } + } + """).RootElement; + + public async Task ExecuteAsync( + JsonElement input, AgentToolContext ctx, CancellationToken ct) + { + // Config aus Context lesen — nie aus statischen Feldern + var config = ctx.ToolConfig["DirectAPI"] as Dictionary + ?? throw new InvalidOperationException("DirectAPI config missing"); + + var providers = config["providers"] as Dictionary ?? new(); + var cacheTtl = Convert.ToInt32(config.GetValueOrDefault("cacheTtlSeconds") ?? 60); + + var action = input.GetProperty("action").GetString()!; + var symbol = input.GetProperty("symbol").GetString()!; + var provider = input.TryGetProperty("provider", out var p) + ? p.GetString() + : config.GetValueOrDefault("defaultProvider")?.ToString() + ?? "twelvedata"; + + // Cache-Check: agentId + symbol + action als Key + var cacheKey = $"directapi:{ctx.AgentId}:{provider}:{action}:{symbol}"; + // (Cache-Implementierung über IMemoryCache oder Redis aus Core) + + return action switch + { + "quote" => await FetchQuoteAsync(symbol, provider, providers, ct), + "history" => await FetchHistoryAsync(input, symbol, provider, providers, ct), + "crypto" => await FetchCryptoAsync(symbol, providers, ct), + "forex" => await FetchForexAsync(symbol, provider, providers, ct), + "search" => await SearchSymbolAsync(symbol, provider, providers, ct), + _ => new ToolResult(false, "", $"Unknown action: {action}") + }; + } + + private async Task FetchQuoteAsync( + string symbol, string provider, + Dictionary providers, CancellationToken ct) + { + // Jeder Provider hat eigene URL-Struktur + // Gemeinsam: immer Cache-Control: no-cache Header setzen + // Gemeinsam: dataAsOf aus Response extrahieren (nicht schätzen) + + // Twelve Data Quote: + // GET https://api.twelvedata.com/quote?symbol={symbol}&apikey={key} + // Response enthält: "datetime" → das ist dataAsOf + // Response enthält: "timestamp" (Unix) → ebenfalls verwertbar + + // Yahoo Finance Quote (kein Key nötig): + // GET https://query1.finance.yahoo.com/v8/finance/chart/{symbol}?interval=1m&range=1d + // Response: result[0].meta.regularMarketTime (Unix timestamp) → dataAsOf + + // Alpha Vantage Quote: + // GET https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol={symbol}&apikey={key} + // Response: "Global Quote"."07. latest trading day" → dataAsOf (nur Datum, keine Zeit) + + // IMPLEMENTIERUNGSREGEL: dataAsOf IMMER aus der API-Antwort lesen. + // Wenn das Feld fehlt oder leer ist → dataAsOf = null, NICHT DateTime.UtcNow. + + throw new NotImplementedException("Implement per provider"); + } + + // history, crypto, forex, search analog implementieren +} +``` + +### NuGet + +Keine externen HTTP-Bibliotheken. Nur `System.Net.Http.HttpClient` via `IHttpClientFactory`. + +--- + +## Tool 2: WebFetch — Nachrichten & strukturiertes HTML + +**Datei: `ClawdDotNet.Tools.WebFetch/WebFetchTool.cs`** + +HTTP-Abruf mit Whitelist, Timestamp-Extraktion und HTML-zu-Text-Konvertierung. +Kein JavaScript-Rendering (statisches HTML only). + +### AgentConfig-Beispiel + +```json +"WebFetch": { + "allowedDomains": [ + "reuters.com", + "bloomberg.com", + "sec.gov", + "feeds.finance.yahoo.com", + "reddit.com", + "capitoltrades.com" + ], + "maxResponseKb": 512, + "timeoutSeconds": 15, + "userAgent": "ClawdDotNet-Agent/1.0 (Research Bot)" +} +``` + +### Tool-Implementierung + +```csharp +namespace ClawdDotNet.Tools.WebFetch; + +public sealed class WebFetchTool : IAgentTool +{ + public string Name => "WebFetch"; + public string Description => """ + Ruft statische Webseiten oder RSS-Feeds ab und extrahiert Text + Timestamps. + Nur Domains aus der Whitelist erlaubt. Kein JavaScript-Rendering. + Aktionen: fetch, rss + """; + + public JsonElement InputSchema => JsonDocument.Parse(""" + { + "type": "object", + "required": ["action", "url"], + "properties": { + "action": { + "type": "string", + "enum": ["fetch", "rss"], + "description": "fetch=HTML-Seite abrufen und zu Text konvertieren, rss=RSS/Atom-Feed parsen" + }, + "url": { "type": "string" }, + "selector":{ "type": "string", + "description": "optional: CSS-ähnlicher Hint welcher Teil relevant ist, z.B. 'table', 'article'" } + } + } + """).RootElement; + + public async Task ExecuteAsync( + JsonElement input, AgentToolContext ctx, CancellationToken ct) + { + var config = ctx.ToolConfig["WebFetch"] as Dictionary ?? new(); + var allowedDomains = (config.GetValueOrDefault("allowedDomains") + as List) ?? new List(); + + var url = input.GetProperty("url").GetString()!; + var action = input.GetProperty("action").GetString()!; + + // Domain-Whitelist prüfen + var host = new Uri(url).Host.Replace("www.", ""); + if (!allowedDomains.Any(d => host == d || host.EndsWith("." + d))) + return new ToolResult(false, "", + $"Domain '{host}' nicht in der Whitelist dieses Agenten."); + + return action switch + { + "fetch" => await FetchPageAsync(url, input, config, ct), + "rss" => await FetchRssAsync(url, ct), + _ => new ToolResult(false, "", $"Unknown action: {action}") + }; + } + + private async Task FetchPageAsync( + string url, JsonElement input, + Dictionary config, CancellationToken ct) + { + using var http = CreateHttpClient(config); + using var request = new HttpRequestMessage(HttpMethod.Get, url); + + // Kein Cache — immer frische Daten anfordern + request.Headers.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue + { NoCache = true, NoStore = true }; + + using var response = await http.SendAsync(request, ct); + response.EnsureSuccessStatusCode(); + + // dataAsOf aus HTTP-Headern extrahieren (Reihenfolge: Last-Modified > Date) + DateTimeOffset? dataAsOf = response.Content.Headers.LastModified + ?? response.Headers.Date; + + var html = await response.Content.ReadAsStringAsync(ct); + var maxKb = Convert.ToInt32(config.GetValueOrDefault("maxResponseKb") ?? 512); + + if (html.Length > maxKb * 1024) + html = html[..(maxKb * 1024)]; + + // HTML → lesbarer Text (einfache Implementierung ohne externe Libs) + var text = StripHtml(html); + + // Versuche dataAsOf aus HTML-Meta-Tags zu verfeinern falls Header fehlt + if (dataAsOf == null) + dataAsOf = ExtractDateFromHtml(html); + + var result = new + { + fetchedAt = DateTime.UtcNow, + dataAsOf = dataAsOf?.UtcDateTime, + source = url, + data = new { text } + }; + + return new ToolResult(true, JsonSerializer.Serialize(result)); + } + + private async Task FetchRssAsync(string url, CancellationToken ct) + { + // XML parsen mit System.Xml.Linq + // Einträge: title, link, pubDate (→ dataAsOf), description + // Neueste Einträge zuerst, max 20 + throw new NotImplementedException(); + } + + private static string StripHtml(string html) + { + // Einfaches Regex-basiertes Stripping + // Script- und Style-Tags zuerst entfernen, dann alle anderen Tags + // Anschließend HTML-Entities dekodieren (System.Net.WebUtility.HtmlDecode) + // Mehrfache Leerzeilen auf max. 2 reduzieren + throw new NotImplementedException(); + } + + private static DateTime? ExtractDateFromHtml(string html) + { + // Suche nach: