feat(app): the operator's overview of screens, grants to several people at once with one budget each, assistants by provider

Halkyon Learn's ADR 0021, D57 to D63, on halkyon_base's budgets and
effort:

- The operator's screen is an overview (Waiting, Operators, Accounts,
  Assistants, each with its count) whose rows open screens of their own,
  read 50 at a time as they scroll (OperatorListCubit, OperatorPage), so
  hundreds of accounts push nothing else down (D62).
- A handle is picked among the accounts there are (AccountSuggestionField):
  appointing an operator and granting take no other (D61).
- AssistantGrantsScreen replaces AssistantGrantsCard: the assistants set
  up by provider, with their efforts and prices; the people granted, found
  by their handle's start; one sheet granting several assistants, a
  provider's at once, to several people, each with one budget in money and
  tokens a day and a month, or changing one person's (D58, D59).
- Assistants are grouped by provider wherever they are listed, each under
  its name with a dot in its colour (ProviderLabel, D60).
- AssistantsCard shows what is left of the person's budget for all their
  assistants together; the months of the figures run oldest first (D57).
- AssistantChoice says the efforts a question may ask at and the ceiling
  on output each asks for (D63); a person's own key gets none and keeps
  4,096 tokens.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-26 16:05:49 +01:00
commit cc87120bc8
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -314,6 +314,9 @@
"operatorAccounts": "Konten und Admins",
"operatorWaitingCount": "{count, plural, =0{Niemand wartet auf Freigabe} =1{1 Konto wartet auf Freigabe} other{{count} Konten warten auf Freigabe}}",
"operatorWaitingTitle": "Wartend",
"operatorOperatorsCount": "{count, plural, =1{1 Admin} other{{count} Admins}}",
"operatorAccountsTitle": "Konten",
"operatorAccountsCount": "{count, plural, =1{1 Konto} other{{count} Konten}}",
"operatorNobodyWaits": "Niemand wartet.",
"operatorNoHandle": "Noch kein Handle",
"operatorNewSince": "Neu, wartet seit {date}",
@ -331,7 +334,7 @@
"operatorAppointMessage": "Admins geben hier Konten frei, lehnen sie ab, sperren sie und ernennen Admins, so wie du.",
"operatorAppointConfirm": "Ernennen",
"operatorHandle": "Handle",
"operatorFindTitle": "Ein Konto finden",
"operatorHandleSuggested": "Vorgeschlagen werden nur Handles, die es hier gibt.",
"operatorFoundNone": "Kein Handle beginnt so.",
"operatorMadeOn": "Seit {date}",
"operatorIsOperator": "Admin",
@ -350,27 +353,39 @@
"operatorInvalidLimit": "Eine Grenze kann nicht unter null liegen.",
"assistantGrantsTitle": "Assistenten",
"assistantGrantsNone": "Noch hat niemand einen Assistenten.",
"assistantSetCount": "{count, plural, =0{Keiner eingerichtet} =1{1 Assistent} other{{count} Assistenten}}",
"assistantPeopleCount": "{count, plural, =0{niemandem freigegeben} =1{1 Person} other{{count} Personen}}",
"assistantSetUpTitle": "Hier eingerichtet",
"assistantPeopleTitle": "Personen",
"assistantGranteesFoundNone": "Niemand mit Assistenten hat ein Handle, das so beginnt.",
"assistantUnpriced": "Ohne Preise: zählt nur Tokens",
"assistantEffort": "{effort, select, low{niedrig} medium{mittel} high{hoch} xhigh{sehr hoch} max{maximal} other{{effort}}}",
"assistantEffortName": "{effort, select, low{Niedrig} medium{Mittel} high{Hoch} xhigh{Sehr hoch} max{Maximal} other{{effort}}}",
"assistantEffortSetUp": "Denkaufwand {effort}, bis {max}",
"assistantEffortFixed": "Denkaufwand {effort}",
"assistantNameUnset": "{name} (nicht mehr eingerichtet)",
"assistantNotAgreedCount": "{count, plural, =1{1 noch ohne Zustimmung} other{{count} noch ohne Zustimmung}}",
"assistantGrant": "Assistenten freigeben",
"assistantGrantSave": "Freigeben",
"assistantGrantChange": "Grenzen ändern",
"assistantGrantAssistant": "Assistent",
"assistantGrantDaily": "Grenze pro Tag",
"assistantGrantMonthly": "Grenze pro Monat",
"assistantGrantChange": "Assistenten ändern",
"assistantGrantLimitHelper": "Leer für keine. Tage und Monate nach UTC.",
"assistantGrantBudget": "Budget, für alle zusammen",
"assistantGrantMoneyDaily": "Geld pro Tag",
"assistantGrantMoneyMonthly": "Geld pro Monat",
"assistantGrantTokensDaily": "Tokens pro Tag",
"assistantGrantTokensMonthly": "Tokens pro Monat",
"assistantGrantMoneyNote": "Geld zählt die Assistenten mit Preisen, Tokens zählen alle. Was zuerst aufgebraucht ist, hält sie an.",
"assistantGrantReplaces": "{count, plural, =1{Die Freigabe ersetzt das Budget dieser Person:} other{Die Freigabe ersetzt die Budgets dieser Personen:}}",
"assistantGrantUnsetDropped": "Beim Speichern wird zurückgenommen, was nicht mehr eingerichtet ist: {names}.",
"assistantGrantLimitInvalid": "Keine Zahl, die das nimmt",
"assistantGrantNoHandle": "Kein Konto hat dieses Handle.",
"assistantGrantTokens": "Tokens",
"assistantGrantNote": "Vor der ersten Frage stimmen sie zu, was wohin geht. Du siehst, wie viel sie nutzen, nie, was sie fragen.",
"assistantGrantNote": "Vor der ersten Frage stimmen sie zu, was wohin geht. Assistenten, die sie schon haben, bleiben. Du siehst, wie viel sie nutzen, nie, was sie fragen.",
"assistantPerDay": "{amount} pro Tag",
"assistantPerMonth": "{amount} pro Monat",
"assistantNoLimits": "Ohne Grenzen",
"assistantGrantAgreed": "Zugestimmt",
"assistantGrantNotAgreed": "Noch nicht zugestimmt",
"assistantGrantOutdated": "Die Preise haben sich geändert: Grenzen neu setzen",
"assistantGrantUnset": "Nicht mehr eingerichtet",
"assistantRevoke": "Zurücknehmen",
"assistantRevokeTitle": "{assistant} zurücknehmen?",
"assistantRevokeMessage": "Sie können ihn nicht mehr fragen. Was sie genutzt haben, bleibt gezählt.",
"assistantRevokeAllTitle": "Alle Assistenten zurücknehmen?",
"assistantRevokeMessage": "Sie können keinen mehr fragen, und ihr Budget entfällt. Was sie genutzt haben, bleibt gezählt.",
"assistantUseByMonth": "Nutzung nach Monat",
"assistantUseTitle": "Nutzung der Assistenten",
"assistantUseNone": "In diesem Monat nichts genutzt.",
@ -381,8 +396,8 @@
"assistantModelAt": "{model} bei {host}",
"assistantLeftToday": "{left} von {limit} heute übrig",
"assistantLeftThisMonth": "{left} von {limit} diesen Monat übrig",
"assistantYourBudget": "Dein Budget, für alle zusammen",
"assistantAgree": "Lesen und zustimmen",
"assistantWaitsForLimits": "Wartet darauf, dass seine Grenzen neu gesetzt werden",
"assistantYourUse": "Deine Nutzung",
"assistantPrivacyPage": "Was auf {instance} wohin geht",
"assistantOwnTitle": "Mit deinem eigenen Schlüssel",
@ -415,9 +430,9 @@
"assistantConsentAgreedOn": "Du hast am {date} zugestimmt.",
"assistantProblemNotGranted": "Dieser Assistent ist für dich nicht mehr freigegeben.",
"assistantProblemNotAgreed": "Stimm zuerst zu, was wohin geht.",
"assistantProblemInvalidEffort": "Mit diesem Denkaufwand antwortet er nicht.",
"assistantProblemLimitReached": "Seine Grenze ist bis {time} erreicht.",
"assistantProblemLimitReachedNow": "Seine Grenze ist vorerst erreicht.",
"assistantProblemLimitOutdated": "Es wartet darauf, dass seine Grenzen neu gesetzt werden.",
"assistantProblemImagesNotRead": "Es liest keine Bilder.",
"assistantProblemMalformed": "Diese Frage kann nicht gesendet werden.",
"assistantProblemTooLarge": "Diese Frage ist zu lang oder enthält zu viele oder zu große Bilder.",