Files
ClawdDotNet/src/ClawdDotNet.Core/Tools/IAgentTool.cs
T
RichardandClaude Opus 5 0b6ea73ec1 Entscheidungen aus dem Testbetrieb umgesetzt (#572): #577 #579 #581 #589 #193 #205 #594 #595 #597 #598 #599 #588
- Engine: leere Antworten nachfassen, Aufgaben enden mit Ergebniszeile (EmptyResponse/Incomplete),
  gleiche Fehlschlaege erkennen (RepeatedFailure), Zeitzeile vor Chatnachrichten,
  Werkzeugergebnisse gerahmt, Vorpruefung vor dem Staging, Belegkosten wie RunUsage
- Staging: gescheiterte Freigaben als Failed; AgentEditor-Aenderungen freigabepflichtig,
  Selbstbearbeitung gesperrt (allowSelfEdit)
- Taskboard: Termine beim Anlegen pruefen, naechster/letzter Lauf, pausieren, Sofortlauf,
  Kostenprognose, Hinweis auf wachsenden Kontext; Jobs-Reiter und /api/jobs entfernt
- Release: Instanzmanager samt Weboberflaeche im Paket, setup.json fragt manager.json ab,
  Token nicht mehr ins systemd-Journal
Version 0.1.6.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 11:23:10 +02:00

65 lines
2.9 KiB
C#

using System.Text.Json;
namespace ClawdDotNet.Core.Tools;
public interface IAgentTool
{
string Name { get; }
string Description { get; }
JsonElement InputSchema { get; }
/// <summary>
/// Ob dieses Werkzeug gefahrlos gleichzeitig mit anderen laufen darf.
///
/// Die Vorgabe ist <c>false</c> — nicht aus Vorsicht um ihrer selbst willen,
/// sondern weil die falsche Antwort hier nicht auffällt: Zwei schreibende
/// Aufrufe, die sich um dieselbe Datei oder denselben Datensatz streiten,
/// scheitern nicht zuverlässig, sondern gelegentlich. Ein Werkzeug gibt sich
/// deshalb ausdrücklich frei, und nur dann, wenn es nichts verändert.
///
/// „Nichts verändert" heißt: kein Schreiben in Dateien, Datenbank oder Fremdsystem
/// und keine Abhängigkeit davon, was ein anderer Aufruf desselben Zuges tut.
/// Ein reiner Abruf erfüllt das, eine Ablage nicht.
/// </summary>
bool IsParallelSafe => false;
/// <summary>
/// Ob ein zweiter, gleicher Aufruf schadlos bleibt (#554).
///
/// <para>Gebraucht wird das nach einem harten Absturz: Im Protokoll steht, dass ein
/// Aufruf begann, nicht ob er wirkte. Bei einem wiederholbaren Werkzeug muss man das
/// auch nicht wissen — man ruft es einfach noch einmal. Bei allen anderen bleibt nur,
/// den Fall vorzulegen statt zu raten.</para>
///
/// <para>Nicht zu verwechseln mit <see cref="IsParallelSafe"/>. Das heißt „stört
/// keinen gleichzeitigen Aufruf", dies hier heißt „richtet zweimal keinen Schaden an".
/// Ein Werkzeug kann das eine sein und das andere nicht: Eine Datei zu überschreiben
/// ist wiederholbar — zweimal derselbe Inhalt ergibt denselben Zustand —, verträgt
/// aber keinen zweiten Schreiber zur selben Zeit.</para>
///
/// <para>Vorgabe <c>false</c>, aus demselben Grund wie oben: Wer sich irrt, versendet
/// die Mail zweimal.</para>
/// </summary>
bool IsRepeatable => false;
/// <summary>
/// Prueft vor Staging und Ausfuehrung, ob das Werkzeug diesen Aufruf ueberhaupt zulassen
/// wuerde (#579). Liefert den Ablehnungsgrund oder <c>null</c>.
///
/// <para>Ohne diese Pruefung legte das Staging Aufrufe zur Freigabe vor, die das
/// Werkzeug selbst verbietet - der Mensch gab frei, und erst dann scheiterte der
/// Aufruf. Das gewoehnt an harmlose Freigaben und laesst eine Prompt-Injection die
/// Freigabeliste mit alarmierenden, aber unmoeglichen Vorschlaegen fuellen.</para>
///
/// <para>Nur pruefen, nichts veraendern, nichts abrufen. Kann die Pruefung die
/// Argumente nicht lesen, <c>null</c> liefern - die Ausfuehrung meldet den Fehler dann
/// selbst.</para>
/// </summary>
string? Preflight(JsonElement input, AgentToolContext context) => null;
Task<ToolResult> ExecuteAsync(
JsonElement input,
AgentToolContext context,
CancellationToken ct);
}