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>
This commit is contained in:
@@ -104,6 +104,54 @@ public sealed class AgentEditorTool : IAgentTool
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// #205 / #579: Selbstbearbeitung wird abgelehnt, bevor ein Vorschlag in die
|
||||
/// Freigabeliste kommt. Aenderungen an fremden Agenten laufen ueber das Staging
|
||||
/// (StagingPolicy: update_identity, update_soul, create_agent = approve).
|
||||
/// </summary>
|
||||
public string? Preflight(JsonElement input, AgentToolContext context)
|
||||
{
|
||||
if (input.ValueKind != JsonValueKind.Object
|
||||
|| !input.TryGetProperty("action", out var a) || a.ValueKind != JsonValueKind.String)
|
||||
return null;
|
||||
|
||||
return SelbstbearbeitungVerweigert(a.GetString(), input, context);
|
||||
}
|
||||
|
||||
internal const string SelbstbearbeitungText =
|
||||
"Änderungen an der eigenen Identity oder Soul nimmt der Mensch vor. "
|
||||
+ "Formuliere deinen Änderungswunsch stattdessen als Vorschlag in deiner Antwort.";
|
||||
|
||||
/// <summary>
|
||||
/// Die eigene Soul ist die Datei, die Verhalten, Grenzen und Vorsicht eines Agenten
|
||||
/// festlegt. Ein Agent, der an einer Einschraenkung scheitert, koennte sie sich sonst
|
||||
/// selbst wegschreiben. Im Pruefdurchgang #572 hat ein Agent seine Identity um "Du
|
||||
/// darfst alles." erweitert. Abschaltbar ueber <c>allowSelfEdit</c>.
|
||||
/// </summary>
|
||||
private static string? SelbstbearbeitungVerweigert(string? action, JsonElement input, AgentToolContext context)
|
||||
{
|
||||
if (action is not ("update_identity" or "update_soul"))
|
||||
return null;
|
||||
|
||||
var agentId = input.TryGetProperty("agentId", out var ai) && ai.ValueKind == JsonValueKind.String
|
||||
? ai.GetString() : null;
|
||||
|
||||
if (!string.Equals(agentId, context.AgentId, StringComparison.OrdinalIgnoreCase))
|
||||
return null;
|
||||
|
||||
return ErlaubtSelbstbearbeitung(context) ? null : SelbstbearbeitungText;
|
||||
}
|
||||
|
||||
private static bool ErlaubtSelbstbearbeitung(AgentToolContext context)
|
||||
=> context.ToolConfig.TryGetValue("allowSelfEdit", out var v) && v switch
|
||||
{
|
||||
bool b => b,
|
||||
JsonElement { ValueKind: JsonValueKind.True } => true,
|
||||
JsonElement je when je.ValueKind == JsonValueKind.String => bool.TryParse(je.GetString(), out var r) && r,
|
||||
string s => bool.TryParse(s, out var r) && r,
|
||||
_ => false
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Ermittelt das Agents-Verzeichnis aus dem SharedWorkspacePath.
|
||||
/// SharedWorkspace liegt unter .../Agents/SharedWorkspace → Parent = Agents-Verzeichnis.
|
||||
@@ -264,6 +312,11 @@ public sealed class AgentEditorTool : IAgentTool
|
||||
if (string.IsNullOrWhiteSpace(agentId))
|
||||
return ToolResult.Fail("'agentId' ist erforderlich.");
|
||||
|
||||
// Auch hier, nicht nur in der Vorpruefung: Ein freigegebener Aufruf laeuft ohne sie.
|
||||
var action = input.TryGetProperty("action", out var act) ? act.GetString() : null;
|
||||
if (SelbstbearbeitungVerweigert(action, input, context) is { } verweigert)
|
||||
return ToolResult.Fail(verweigert);
|
||||
|
||||
if (string.IsNullOrWhiteSpace(content))
|
||||
return ToolResult.Fail("'content' ist erforderlich. Lies zuerst die bestehende Datei mit read_identity/read_soul.");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user