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:
Richard
2026-09-15 11:23:10 +02:00
co-authored by Claude Opus 5
parent 8ab9d99abe
commit 0b6ea73ec1
42 changed files with 2646 additions and 512 deletions
@@ -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.");