Werkzeugkasten: Zugangsdaten je Einheit (#692)

A unit holds credentials for its members, by tool and setting - needed once,
not once per agent, and other units never get them.

- UnitConfig.credentials, protected by ConfigSecrets like every secret.
- OrgChart.ToolSettingsFor: an agent's own settings, completed by the nearest
  unit up that holds the value; own non-empty values win; no tool is granted.
  Used for runs, tool jobs and preflight probes.
- OrgAdministration.SetUnitCredential, PUT /organisation/units/{id}/credentials;
  the view lists held settings, never values.
- Templates never carry unit credentials; they are named instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-10-01 12:50:27 +02:00
co-authored by Claude Opus 5.5
parent 661807b2d0
commit 9a265888f8
17 changed files with 306 additions and 13 deletions
@@ -74,6 +74,15 @@ public sealed class UnitConfig
/// <summary>#691: The template the unit came from — its texts and rules are someone else's.</summary>
[JsonPropertyName("templateOrigin")]
public string? TemplateOrigin { get; set; }
/// <summary>
/// #692: Credentials the unit holds for its members, by tool and setting — a purchasing
/// department with six agents needs the marketplace key once, not six times, and the
/// accounts department never gets it. Every value is a secret, stored protected; a member's
/// own non-empty value wins, and a credential grants no tool.
/// </summary>
[JsonPropertyName("credentials")]
public Dictionary<string, Dictionary<string, string>>? Credentials { get; set; }
}
/// <summary>