Einheiten, Stufe 4: API und WebUI-Seite "Organisation" (#683)

- /api/organisation: Baum (Einheiten mit Pfad, Tiefe, eigener und
  wirksamer Obergrenze, Vorgaben; Agenten mit Einheit, Leitung, effektiver
  Leitung, Werkzeugen, Budget), Probleme der Struktur, bekannte Werkzeuge.
  Anlegen, Aendern, Loeschen, Leitung, Umzug von Agent und Einheit,
  Obergrenze, Sammelwerte mit Vorschau. Umzug und Obergrenze kennen
  preview=true; die Entscheidung trifft allein OrgAdministration.
- Neue Agenten koennen ueber die API gleich in eine Einheit gelegt werden.
- WebUI #/organisation: links der Baum (oberste Ebene, Einheiten, Leitungen
  mit Stern, Mitglieder), rechts die Bearbeitung. Eine Begruendung fuer das
  Audit gilt fuer jede Aenderung. Wo etwas verloren gehen kann, zuerst die
  Vorschau: laufende Agenten und Probleme halten an, wegfallende Werkzeuge
  muessen in einem Dialog bestaetigt werden. Sammelwerte als Tabelle mit
  Ausreissern markiert und abgewaehlt. Bei aktivierter Begrenzung ist
  vorausgewaehlt, was von oben ohnehin erlaubt ist. Sprachpakete en/de.

Geprueft im Browser mit einem Pruefgestell (API durch Attrappe ersetzt):
Baum, Auswahl, Obergrenze mit Bestaetigungsdialog, Sammelwert-Vorschau
mit Ausreisser und das Schreiben nur der gewaehlten Agenten.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-09-24 12:54:16 +02:00
co-authored by Claude Opus 5.5
parent 68a432fec6
commit e4ecf2d5ca
10 changed files with 866 additions and 2 deletions
@@ -68,6 +68,65 @@
"nav.agents": "Agenten",
"nav.tasks": "Aufgaben",
"nav.team": "Teamübersicht",
"common.saved": "Gespeichert.",
"common.create": "Anlegen",
"nav.organisation": "Organisation",
"org.title": "Organisation",
"org.subtitle": "Einheiten, Leitungen und Mitglieder. Jeder Agent erreicht nur seine Einheit und seine Leitung — die Struktur ist das Adressbuch.",
"org.problems": "Probleme in der Struktur",
"org.structure": "Struktur",
"org.newUnit": "Neue Einheit",
"org.newSubUnit": "Neue Untereinheit",
"org.topLevel": "Oberste Ebene",
"org.leadShort": "Leitung",
"org.unitId": "Kennung (Buchstaben, Ziffern, - und _)",
"org.unitName": "Name",
"org.parent": "Übergeordnete Einheit",
"org.goal": "Ziel der Einheit",
"org.reason": "Begründung der Änderung (geht ins Audit)",
"org.reasonPlaceholder": "z. B. Marktplätze bekommen ein eigenes Team",
"org.selectHint": "Links eine Einheit oder einen Agenten wählen.",
"org.lead": "Leitung",
"org.noLead": "— keine Leitung (die Leitung darüber übernimmt) —",
"org.leadHint": "Die Leitung muss Mitglied der Einheit sein.",
"org.position": "Platz im Baum",
"org.move": "Verschieben",
"org.moveUnitHint": "Die Mitglieder bleiben in der Einheit; es ändert sich, was darüber liegt. Nicht möglich, solange ein betroffener Agent läuft.",
"org.ceiling": "Rechte-Obergrenze",
"org.ceilingHint": "Was die Einheit nicht darf, kann ein Mitglied nicht bekommen. Senken entzieht den Mitgliedern Werkzeuge — nach einer Bestätigung.",
"org.ceilingLimit": "Werkzeuge dieser Einheit begrenzen",
"org.ceilingInherited": "Von oben begrenzt auf: {tools}",
"org.settings": "Sammelwerte",
"org.settingsHint": "Werden nach einer Vorschau in die Agenten geschrieben. Die Einheit merkt sich den Wert nur als Vorgabe für neue Mitglieder — zur Laufzeit übertrumpft nichts einen Agenten.",
"org.setting.DailyCostUsd": "Tagesbudget (USD)",
"org.setting.DailyTokens": "Tagesbudget (Tokens)",
"org.setting.Model": "Modell",
"org.setting.WhenExhausted": "Wenn das Budget erschöpft ist",
"org.modePerAgent": "jeder Agent bekommt den Wert",
"org.modeDistribute": "Wert ist ein Gesamtbetrag, verteilt",
"org.preview": "Vorschau",
"org.apply": "Gewählte Werte schreiben",
"org.agent": "Agent",
"org.current": "Bisher",
"org.proposed": "Neu",
"org.outlier": "Ausreißer",
"org.outlierHint": "Ausreißer weichen stark von ihren Kollegen ab — oft ein Spezialist mit bewusst anderem Wert. Sie sind standardmäßig nicht gewählt.",
"org.rememberDefault": "Als Vorgabe für neue Mitglieder merken",
"org.settingInvalid": "Dieser Wert ist für diese Einstellung nicht gültig.",
"org.members": "Mitglieder",
"org.noMembers": "Noch keine Mitglieder.",
"org.deleteUnit": "Einheit löschen",
"org.unit": "Einheit",
"org.answersTo": "Berichtet an",
"org.human": "einen Menschen",
"org.since": "In dieser Einheit seit {time}",
"org.tools": "Werkzeuge",
"org.moveAgent": "Agent verschieben",
"org.moveAgentHint": "Adressbuch, Leitung und womöglich Werkzeuge ändern sich. Der Agent und beide Leitungen erfahren es in ihrem nächsten Lauf.",
"org.toolsLostTitle": "Werkzeuge würden entfernt",
"org.toolsLostIntro": "Der neue Platz hat eine Rechte-Obergrenze. Diese Agenten verlören Werkzeuge:",
"org.toolsLostConfirm": "Werkzeuge entfernen und übernehmen",
"org.runningRefusal": "Nicht, solange {agents} läuft — ein Agent darf nicht mitten im Lauf andere Rechte bekommen.",
"team.title": "Teamübersicht",
"team.subtitle": "Wer arbeitet, wer hat in den letzten Sekunden wen erreicht, und wo klemmt es. Ein Klick auf einen Agenten zeigt Einzelheiten.",
"team.noInstance": "Keine Instanz ausgewählt. Oben eine aktive Instanz wählen.",
@@ -68,6 +68,65 @@
"nav.agents": "Agents",
"nav.tasks": "Tasks",
"nav.team": "Team overview",
"common.saved": "Saved.",
"common.create": "Create",
"nav.organisation": "Organisation",
"org.title": "Organisation",
"org.subtitle": "Units, leads and members. Every agent only reaches its unit and its lead — the structure is the address book.",
"org.problems": "Problems in the structure",
"org.structure": "Structure",
"org.newUnit": "New unit",
"org.newSubUnit": "New sub-unit",
"org.topLevel": "Top level",
"org.leadShort": "lead",
"org.unitId": "Id (letters, digits, - and _)",
"org.unitName": "Name",
"org.parent": "Parent unit",
"org.goal": "Goal of the unit",
"org.reason": "Reason for the change (goes into the audit log)",
"org.reasonPlaceholder": "e.g. marketplaces get their own team",
"org.selectHint": "Select a unit or an agent on the left.",
"org.lead": "Lead",
"org.noLead": "— no lead (the lead above takes over) —",
"org.leadHint": "The lead must be a member of the unit.",
"org.position": "Position in the tree",
"org.move": "Move",
"org.moveUnitHint": "The members stay in the unit; what changes is what lies above it. Not possible while an affected agent is running.",
"org.ceiling": "Tool ceiling",
"org.ceilingHint": "What the unit may not have, a member cannot be granted. Lowering it removes tools from the members — after a confirmation.",
"org.ceilingLimit": "Limit the tools of this unit",
"org.ceilingInherited": "Limited from above to: {tools}",
"org.settings": "Unit-wide values",
"org.settingsHint": "Written into the agents after a preview. The unit keeps the value only as a default for new members — nothing overrides an agent at run time.",
"org.setting.DailyCostUsd": "Daily budget (USD)",
"org.setting.DailyTokens": "Daily budget (tokens)",
"org.setting.Model": "Model",
"org.setting.WhenExhausted": "When the budget is exhausted",
"org.modePerAgent": "each agent gets the value",
"org.modeDistribute": "value is a total, distributed",
"org.preview": "Preview",
"org.apply": "Write the selected values",
"org.agent": "Agent",
"org.current": "Current",
"org.proposed": "New",
"org.outlier": "outlier",
"org.outlierHint": "Outliers differ strongly from their colleagues — often a specialist with a deliberately different value. They are not selected by default.",
"org.rememberDefault": "Remember as default for new members",
"org.settingInvalid": "That value is not valid for this setting.",
"org.members": "Members",
"org.noMembers": "No members yet.",
"org.deleteUnit": "Delete unit",
"org.unit": "Unit",
"org.answersTo": "Answers to",
"org.human": "a human",
"org.since": "In this unit since {time}",
"org.tools": "Tools",
"org.moveAgent": "Move agent",
"org.moveAgentHint": "Its address book, its lead and possibly its tools change. The agent and both leads are told in their next run.",
"org.toolsLostTitle": "Tools would be removed",
"org.toolsLostIntro": "The new position has a tool ceiling. These agents would lose tools:",
"org.toolsLostConfirm": "Remove the tools and apply",
"org.runningRefusal": "Not while {agents} is running — an agent must not get different rights in the middle of a run.",
"team.title": "Team overview",
"team.subtitle": "Who is working, who reached whom in the last seconds, and where something is stuck. Click an agent for details.",
"team.noInstance": "No instance selected. Choose an active instance in the header.",