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
@@ -192,7 +192,7 @@ public sealed class TaskboardTool : IAgentTool
return ToolResult.Ok(
$"Aufgabe angelegt: {created.Id} — {created.Title}\n" +
$"Status: {TaskText.Of(created.Status)} | Assignee: {created.Assignee} | " +
$"Priorität: {created.Priority}{FormatWhen(created.When)}");
$"Priorität: {created.Priority}{FormatWhen(created.When)}" + Hinweis(created));
}
private static async Task<ToolResult> ListAsync(
@@ -244,7 +244,7 @@ public sealed class TaskboardTool : IAgentTool
return ToolResult.Ok(
$"Aufgabe {result.Id} aktualisiert.\n" +
$"Status: {TaskText.Of(result.Status)} | Assignee: {result.Assignee} | Priorität: {result.Priority}");
$"Status: {TaskText.Of(result.Status)} | Assignee: {result.Assignee} | Priorität: {result.Priority}" + Hinweis(result));
}
private static async Task<ToolResult> CommentAsync(
@@ -337,10 +337,23 @@ public sealed class TaskboardTool : IAgentTool
return false;
}
when = new TaskWhen { Kind = kind.Value, Value = value, TimeZone = tz };
var candidate = new TaskWhen { Kind = kind.Value, Value = value, TimeZone = tz };
// #597: Ein Termin, der nie feuern kann, wird gar nicht erst gespeichert.
if (TaskSchedule.ValidateWhen(candidate) is { } problem)
{
error = problem;
return false;
}
when = candidate;
return true;
}
/// <summary>#598: Wiederkehrend mit @agent - einmal beim Anlegen sagen, was das kostet.</summary>
private static string Hinweis(TaskItem task)
=> TaskHinweise.WachsenderKontext(task) is { } hinweis ? "\n" + hinweis : "";
private static TaskItemStatus? ParseStatusFilter(string? value)
=> string.IsNullOrWhiteSpace(value) ? null : TaskText.Status(value);