- UnitConfig (Id, Name, ParentId, LeaderAgentId, Goal, ToolCeiling, Defaults) in der Instanzkonfiguration neben den Agenten; AgentConfig.UnitId und UnitSinceUtc. Bewusst Konfiguration statt Datenbank: Die Werkzeugrechte der Agenten stehen schon dort, die Wahrheit ueber einen Agenten bleibt an einem Ort. Strukturaenderungen gehen ins Audit (Stufe 3). - OrgChart: Pfade, Tiefe, Leitung, effektive Leitung (die naechste Leitung darueber, wenn die eigene Einheit keine hat oder man sie selbst leitet), Adressbuch, Delegationstiefe aus dem Baum (Tiefe + 1, der eingestellte Wert bleibt Untergrenze), Rechte-Obergrenze als Schnittmenge entlang des Pfades, und eine Liste der Probleme (unbekannte Verweise, Zyklen, Leitung ist kein Mitglied, Werkzeuge ueber der Obergrenze). - Adressbuch: eigene Einheit und effektive Leitung; als Leitung die Leitungen der Untereinheiten (bei leitungslosen Untereinheiten deren Mitglieder), der Geschwistereinheiten und die eigene Leitung; die oberste Ebene und die Leitungen der obersten Einheiten sehen sich gegenseitig. Jede Linie ist in beide Richtungen begehbar. Ohne Einheiten sieht jeder jeden, wie bisher. Tests: OrgChartTests (20) am Onlinehandel-Beispiel aus dem Konzept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
73 lines
2.7 KiB
C#
73 lines
2.7 KiB
C#
using System.Text.Json.Serialization;
|
|
|
|
namespace ClawdDotNet.Core.Config;
|
|
|
|
/// <summary>
|
|
/// #683: A unit — department, team, group — as a node in the organisation tree.
|
|
///
|
|
/// <para><b>Stored in the instance configuration, next to the agents.</b> An agent's tools
|
|
/// already live there; a unit's rules belong beside them, so the truth about an agent is in
|
|
/// one place. Every structural change is written to the audit log by the administration,
|
|
/// which is what the concept asked the database for.</para>
|
|
///
|
|
/// <para><b>No value here overrides an agent at run time</b> (Organisation-Konzept, section
|
|
/// 3). <see cref="Defaults"/> are only the starting values for agents that join;
|
|
/// <see cref="ToolCeiling"/> is checked when an agent's tools are written, never laid over
|
|
/// them while it runs. What stands at the agent is what applies.</para>
|
|
/// </summary>
|
|
public sealed class UnitConfig
|
|
{
|
|
[JsonPropertyName("id")]
|
|
public string Id { get; set; } = "";
|
|
|
|
[JsonPropertyName("name")]
|
|
public string Name { get; set; } = "";
|
|
|
|
/// <summary>The parent unit; <c>null</c> for a top-level unit.</summary>
|
|
[JsonPropertyName("parentId")]
|
|
public string? ParentId { get; set; }
|
|
|
|
/// <summary>
|
|
/// The agent leading this unit — one of its members. May be empty: then the nearest
|
|
/// unit above that has a lead takes over.
|
|
/// </summary>
|
|
[JsonPropertyName("leaderAgentId")]
|
|
public string? LeaderAgentId { get; set; }
|
|
|
|
/// <summary>What the unit exists for — the top of every task chain in it (#714).</summary>
|
|
[JsonPropertyName("goal")]
|
|
public string Goal { get; set; } = "";
|
|
|
|
/// <summary>
|
|
/// The tools members of this unit may have at most; <c>null</c> means no ceiling. A
|
|
/// ceiling applies to sub-units as well — the effective ceiling is the intersection
|
|
/// along the path to the root.
|
|
/// </summary>
|
|
[JsonPropertyName("toolCeiling")]
|
|
public List<string>? ToolCeiling { get; set; }
|
|
|
|
/// <summary>Starting values for agents that join this unit.</summary>
|
|
[JsonPropertyName("defaults")]
|
|
public UnitDefaults Defaults { get; set; } = new();
|
|
}
|
|
|
|
/// <summary>
|
|
/// #683: What an agent gets when it joins a unit. <c>null</c> leaves the agent's own value.
|
|
/// Changing these does not touch existing members — writing a value into them is a
|
|
/// separate, previewed step.
|
|
/// </summary>
|
|
public sealed class UnitDefaults
|
|
{
|
|
[JsonPropertyName("model")]
|
|
public string? Model { get; set; }
|
|
|
|
[JsonPropertyName("dailyCostUsd")]
|
|
public decimal? DailyCostUsd { get; set; }
|
|
|
|
[JsonPropertyName("dailyTokens")]
|
|
public long? DailyTokens { get; set; }
|
|
|
|
[JsonPropertyName("whenExhausted")]
|
|
public string? WhenExhausted { get; set; }
|
|
}
|