Automatisierungsvorschlaege: Agenten schlagen n8n-Workflows vor, der Mensch importiert von Hand (#726)

- Core/Automation/WorkflowReview: free check of an n8n export - every node
  with its effect and target, code/command/SSH nodes only with a stated
  reason, embedded secrets refused (by name or by look), a short summary of
  what the workflow does.
- AutomationProposals: measured saving from the replaced tasks' receipts
  (28 days), at most 3 open per agent, the same purpose not twice, a
  rejected proposal must be answered; the human gets a task and decides in
  the approvals view. Accepting records it - importing stays a human's step.
- Candidates: recurring tasks whose runs repeat the same calls (>= 75 % of
  >= 8 runs in 14 days) are put to their agent once a month.
- Escalation tool: automation_find, automation_propose.
- Approvals view: proposals with nodes, targets, warnings, saving, JSON
  download, accept/reject.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-10-01 18:58:36 +02:00
co-authored by Claude Opus 5.5
parent 64e09b82d5
commit 067ff62317
13 changed files with 992 additions and 4 deletions
+11
View File
@@ -144,6 +144,9 @@ public sealed class AppHost : IAsyncDisposable
/// <summary>#197: The external MCP servers, each registered as a tool.</summary>
public Core.Mcp.McpConnections? McpServers { get; private set; }
/// <summary>#726: Workflows agents propose; a human decides and imports by hand.</summary>
public Core.Automation.AutomationProposals? Automations { get; private set; }
/// <summary>Modellpreise von OpenRouter - fuer Budget und Kostenprognose (#595). Laedt im Hintergrund.</summary>
public ModelPricingCatalog? Pricing { get; private init; }
@@ -745,6 +748,14 @@ public sealed class AppHost : IAsyncDisposable
mcpServers.Start();
host._shutdown.Add(mcpServers.DisposeAsync);
// #726: agents propose workflows; recurring tasks that do the same each time are put to them.
var automations = new Core.Automation.AutomationProposals(storage, audit, taskRepository, board,
loggerFactory.CreateLogger("ClawdDotNet.Core.Automation"));
engine.Automations = automations;
host.Automations = automations;
automations.Start();
host._shutdown.Add(automations.DisposeAsync);
// #725: what comes in from outside through a trigger becomes a task.
host.Triggers = new Core.Triggers.InboundTriggers(storage, board, audit, () => instance.Agents);