Freigaben buendeln statt Weckflut (#643), Freigabemodell ueber Werkzeugrechte (#641)

#643: Entscheidungen wecken den Agenten nur noch bei Ablehnung oder gescheiterter
Ausfuehrung, gesammelt in einer Aufgabe je Agent (5 min Ruhefenster), frisch per
@new:agent statt im fortgefuehrten Chatverlauf. Eine einmalige Aufgabe, deren Lauf
wegen Budget oder Herunterfahren gar nicht stattfand, bleibt faellig (Wiedervorlage
nach 30 min) statt mit gesetztem Marker liegenzubleiben.

#641: Rechte stehen in der Werkzeugkonfiguration des Agenten (erlaubt/verboten).
Erlaubtes laeuft, Nicht-Erlaubtes wird einzeln vorgelegt statt verweigert, Verbotenes
gar nicht erst. "Gleichartiges kuenftig erlauben" erteilt eine widerrufbare
Dauerfreigabe je Agent/Werkzeug/Operation; nach drei gleichartigen Freigaben schlaegt
die Oberflaeche sie vor. Aenderungen an Agenten bleiben ausnahmslos freigabepflichtig.
Database: Operation ist das SQL-Schluesselwort; die eigene Zugriffspruefung greift nur
noch ohne Freigabestelle (AgentToolContext.FreigabeGeprueft). WebUI: Rechte-Tabelle je
Werkzeug, Dauerfreigaben mit Widerruf.

Version 0.1.11.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-09-19 14:37:44 +02:00
co-authored by Claude Opus 5
parent f74e49ba35
commit 2f0361278b
36 changed files with 1687 additions and 137 deletions
+11 -1
View File
@@ -24,4 +24,14 @@ public sealed record AgentToolContext(
/// nicht von einer neuen Delegation unterscheiden. Siehe <see cref="DelegationChain"/>.
/// </summary>
DelegationChain? Delegation = null
);
)
{
/// <summary>
/// Die Freigabestelle hat diesen Aufruf geprueft und zugelassen - als erlaubte Operation,
/// per Dauerfreigabe oder als einzeln freigegebener Vorschlag (#641). Ein Werkzeug darf
/// seine eigene Rechtepruefung dann auslassen; sonst wuerde ein freigegebenes ALTER eines
/// Agenten, der nur schreiben darf, erst nach der Freigabe am Werkzeug scheitern.
/// Ohne Freigabestelle bleibt es <c>false</c>, und das Werkzeug prueft selbst.
/// </summary>
public bool FreigabeGeprueft { get; init; }
}
+13
View File
@@ -65,6 +65,19 @@ public interface IAgentTool
/// </summary>
string? StagingAktion(JsonElement input) => null;
/// <summary>
/// Die Operationen, die sich in der Werkzeugkonfiguration eines Agenten erlauben oder
/// verbieten lassen (#641) - dieselben Schluessel, die <see cref="StagingAktion"/> bzw. das
/// <c>action</c>-Argument liefern. Vorgabe: die Werte von <c>action</c> aus dem Schema.
/// </summary>
IReadOnlyList<string> Operationen => WerkzeugOperationen.AusSchema(InputSchema);
/// <summary>
/// Die Einstufung einer Operation, wenn die Werkzeugkonfiguration des Agenten kein
/// <c>erlaubt</c> setzt (#641). <c>null</c> = die Standardregel gilt.
/// </summary>
Staging.StagingDecision? Vorgabe(string operation, IReadOnlyDictionary<string, object?> config) => null;
Task<ToolResult> ExecuteAsync(
JsonElement input,
AgentToolContext context,
@@ -0,0 +1,27 @@
using System.Text.Json;
namespace ClawdDotNet.Core.Tools;
/// <summary>Hilfen rund um die Operationen eines Werkzeugs (#641).</summary>
public static class WerkzeugOperationen
{
/// <summary>Die Werte der <c>action</c>-Aufzaehlung im Eingabeschema, sonst keine.</summary>
public static IReadOnlyList<string> AusSchema(JsonElement schema)
{
if (schema.ValueKind != JsonValueKind.Object
|| !schema.TryGetProperty("properties", out var props)
|| props.ValueKind != JsonValueKind.Object
|| !props.TryGetProperty("action", out var action)
|| action.ValueKind != JsonValueKind.Object
|| !action.TryGetProperty("enum", out var werte)
|| werte.ValueKind != JsonValueKind.Array)
{
return [];
}
return werte.EnumerateArray()
.Where(w => w.ValueKind == JsonValueKind.String)
.Select(w => w.GetString()!)
.ToList();
}
}