@swiss-ai-hub/web 0.320.0 → 0.321.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/components/FormKit/AgentSelector.vue +20 -7
  2. package/components/FormKit/Repeater.vue +1 -4
  3. package/components/FormKit/VectorStoreInput.vue +43 -6
  4. package/components/Knowledge/Database/CreateModal.vue +315 -0
  5. package/components/Knowledge/Database/EmptyCard.vue +34 -0
  6. package/components/Knowledge/DeleteConfirmModal.vue +87 -0
  7. package/components/Knowledge/Namespace/Card.vue +18 -0
  8. package/components/Knowledge/Namespace/CreateModal.vue +11 -3
  9. package/components/Role/AccessCapabilities.vue +4 -4
  10. package/components/Role/AccessCapabilityGroup.vue +22 -6
  11. package/components/Role/AccessRulesEditor.vue +15 -12
  12. package/composables/app/useAppVersion.ts +31 -33
  13. package/composables/auth/useAuth.ts +3 -11
  14. package/composables/document/useCreateDatabase.ts +21 -0
  15. package/composables/document/useDeleteDatabase.ts +29 -0
  16. package/composables/document/useDeleteDocument.ts +1 -1
  17. package/composables/document/useDeleteDocuments.ts +1 -1
  18. package/composables/document/useDeleteNamespace.ts +30 -0
  19. package/composables/document/useIngestors.ts +23 -0
  20. package/composables/form/useCreateInstanceForm.ts +2 -2
  21. package/composables/form/useFormKitTransform.ts +44 -15
  22. package/formkit.config.ts +24 -1
  23. package/i18n/locales/de.yaml +60 -5
  24. package/i18n/locales/en.yaml +57 -3
  25. package/i18n/locales/fr.yaml +58 -3
  26. package/i18n/locales/it.yaml +60 -3
  27. package/middleware/agent-admin.ts +31 -0
  28. package/package.json +1 -1
  29. package/pages/[tenant]/service/agents.vue +3 -0
  30. package/pages/[tenant]/service/knowledge/[db]/[namespace]/[document_id].vue +12 -5
  31. package/pages/[tenant]/service/knowledge.vue +138 -0
  32. package/plugins/0.runtime-config.client.ts +5 -0
  33. package/plugins/oidc-client.ts +1 -1
  34. package/sdk/client/index.ts +29 -2
  35. package/sdk/client/schemas.gen.ts +641 -77
  36. package/sdk/client/sdk.gen.ts +159 -1
  37. package/sdk/client/types.gen.ts +543 -75
  38. package/plugins/keycloak-client.ts +0 -41
@@ -212,6 +212,8 @@ event:
212
212
  no_filters: Keine zusätzlichen Filter
213
213
  rag_stop:
214
214
  failure_reason:
215
+ condensation_empty: Die Frage konnte nicht in eine durchsuchbare Form verdichtet
216
+ werden – dieser Lauf wurde vor dem Retrieval gestoppt.
215
217
  context_insufficient: Der abgerufene Kontext war unzureichend – die Antwort
216
218
  ist eine Notlösung und nicht in Ihren Wissensquellen verankert.
217
219
  expert_declined: Der menschliche Experte konnte keine Antwort liefern – dieser
@@ -220,6 +222,8 @@ event:
220
222
  – dieser Lauf hat keine fundierte Antwort produziert.
221
223
  few_shot_rejected: Die Anfrage entsprach keinem bekannten Muster, daher wurde
222
224
  die Antwort ohne Retrieval erzeugt.
225
+ input_too_large: Die Nachricht oder die angehängte Datei überschritt das Kontextfenster
226
+ des Modells, daher wurde dieser Lauf vor dem Modellaufruf gestoppt.
223
227
  limitChatHistory:
224
228
  summary: Chat-Verlauf auf {count} Nachrichten begrenzt
225
229
  assistant: Assistent
@@ -454,9 +458,8 @@ document:
454
458
  deleting: Wird gelöscht
455
459
  button: Löschen
456
460
  button_selected: Ausgewählte löschen
457
- confirmMessage: Möchten Sie dieses Dokument wirklich löschen? Es wird dauerhaft
458
- aus der Wissensdatenbank entfernt. Diese Aktion kann nicht rückgängig gemacht
459
- werden.
461
+ confirmMessage: Möchten Sie "{title}" wirklich löschen? Es wird dauerhaft aus
462
+ der Wissensdatenbank entfernt. Diese Aktion kann nicht rückgängig gemacht werden.
460
463
  confirmMessageBatch: Möchten Sie {count} Dokument(e) wirklich löschen? Sie werden
461
464
  dauerhaft aus der Wissensdatenbank entfernt. Diese Aktion kann nicht rückgängig
462
465
  gemacht werden.
@@ -511,21 +514,67 @@ knowledge:
511
514
  title: Sammlung hinzufügen
512
515
  description: Eine neue Wissenssammlung erstellen
513
516
  cancel: Abbrechen
517
+ add_database:
518
+ title: Wissensdatenbank hinzufügen
519
+ description: Eine neue Self-Service-Wissensdatenbank erstellen
514
520
  auto_sync:
515
521
  title: Automatisch synchronisiert
516
522
  description: Sammlungen werden automatisch verwaltet
517
523
  manual_management:
518
524
  description: Sammlungen können manuell erstellt und verwaltet werden
525
+ pipeline: 'Pipeline: {name}'
519
526
  edit_namespace: Sammlung bearbeiten
520
527
  upload_documents: Dokumente hochladen
528
+ delete_namespace: Sammlung löschen
529
+ delete_database: Datenbank löschen
530
+ delete:
531
+ confirm_label: Geben Sie zur Bestätigung {name} ein
532
+ database:
533
+ title: Wissensdatenbank löschen
534
+ warning: Dadurch werden die Datenbank {name}, alle ihre Sammlungen und ihre
535
+ {count} Dokumente unwiderruflich gelöscht. Dies kann nicht rückgängig gemacht
536
+ werden.
537
+ namespace:
538
+ title: Sammlung löschen
539
+ warning: Dadurch werden die Sammlung {name} und ihre {count} Dokumente unwiderruflich
540
+ gelöscht. Dies kann nicht rückgängig gemacht werden.
541
+ actions:
542
+ delete: Löschen
543
+ scheduled:
544
+ summary: Löschung gestartet
545
+ detail: Die Löschung läuft im Hintergrund und kann einen Moment dauern.
546
+ error:
547
+ summary: Löschung fehlgeschlagen
548
+ detail: Die Löschung konnte nicht gestartet werden. Bitte versuchen Sie es erneut.
521
549
  form:
522
550
  create:
523
551
  title: Sammlung erstellen
552
+ create_error: Die Sammlung konnte nicht erstellt werden. Bitte versuchen Sie es
553
+ erneut.
554
+ create_database:
555
+ title: Wissensdatenbank erstellen
556
+ success: Wissensdatenbank erstellt
557
+ error: Die Wissensdatenbank konnte nicht erstellt werden
558
+ no_ingestors: Keine Ingestion-Pipeline verfügbar. Stellen Sie sicher, dass mindestens
559
+ eine Pipeline läuft.
560
+ steps:
561
+ basic_info: Grundinformationen
524
562
  edit:
525
563
  title: Sammlung bearbeiten
526
564
  database:
527
565
  label: Wissensdatenbank
528
566
  placeholder: Name der Wissensdatenbank
567
+ database_name:
568
+ label: Datenbankname
569
+ placeholder: meinewissensdatenbank
570
+ help: Nur Kleinbuchstaben und Ziffern sind erlaubt, beginnend mit einem Buchstaben,
571
+ 3 bis 63 Zeichen. Der Name kann später nicht geändert werden.
572
+ validation_error: Der Datenbankname muss mit einem Kleinbuchstaben beginnen
573
+ und darf nur Kleinbuchstaben und Ziffern enthalten, zwischen 3 und 63 Zeichen
574
+ ingestor:
575
+ label: Ingestion-Pipeline
576
+ placeholder: Ingestion-Pipeline auswählen
577
+ help: Die Pipeline, die in diese Datenbank hochgeladene Dokumente verarbeitet.
529
578
  folder_name:
530
579
  label: Sammlungsname
531
580
  placeholder: meine-sammlung
@@ -665,6 +714,8 @@ role:
665
714
  dies zu ändern.
666
715
  capability_readonly: Keine einzelne Regel gewährt dies allein — nutze eine Vorlage
667
716
  oder eine breitere Regel.
717
+ capability_also_cleared: 'Das Abwählen entfernt zusätzlich: {rules}'
718
+ capability_also_granted: 'Das Auswählen gewährt zusätzlich: {rules}'
668
719
  pattern_help_intro: 'Muster verwenden Platzhalter für Agenten:'
669
720
  pattern_help_all: Alle Agenten
670
721
  pattern_help_wildcard: Alle Instanzen von MyAgent
@@ -826,8 +877,12 @@ lib:
826
877
  label: Datenbank
827
878
  namespaces:
828
879
  label: Namensräume
829
- placeholder: Namensräume auswählen (leer = alle)
830
- help: Leer lassen, um alle Namensräume zu durchsuchen
880
+ placeholder: Mindestens einen Namensraum auswählen
881
+ help: Nur die ausgewählten Namensräume werden durchsucht
882
+ allNamespaces:
883
+ label: Alle Namensräume durchsuchen
884
+ help: Jeder Namensraum dieser Datenbank wird durchsucht, auch später hinzugefügte
885
+ ({count} heute).
831
886
  allowedFilterFields:
832
887
  label: Erlaubte Filterfelder
833
888
  placeholder: Metadatenschlüssel eingeben und Enter drücken
@@ -210,6 +210,8 @@ event:
210
210
  no_filters: No additional filters
211
211
  rag_stop:
212
212
  failure_reason:
213
+ condensation_empty: The question could not be condensed into something searchable
214
+ — this run was stopped before retrieval.
213
215
  context_insufficient: Retrieved context was insufficient — the answer is a fallback,
214
216
  not grounded in your knowledge sources.
215
217
  expert_declined: The human expert could not provide an answer — this run did
@@ -218,6 +220,8 @@ event:
218
220
  produce a grounded response.
219
221
  few_shot_rejected: The query did not match any known pattern, so the answer
220
222
  was produced without retrieval.
223
+ input_too_large: The message or attached file exceeded the model's context window,
224
+ so this run was stopped before calling the model.
221
225
  limitChatHistory:
222
226
  summary: Chat history limited to {count} messages
223
227
  assistant: Assistant
@@ -448,7 +452,7 @@ document:
448
452
  deleting: Deleting
449
453
  button: Delete
450
454
  button_selected: Delete selected
451
- confirmMessage: Are you sure you want to delete this document? It will be permanently
455
+ confirmMessage: Are you sure you want to delete "{title}"? It will be permanently
452
456
  removed from the knowledge base. This action cannot be undone.
453
457
  confirmMessageBatch: Are you sure you want to delete {count} document(s)? They
454
458
  will be permanently removed from the knowledge base. This action cannot be undone.
@@ -504,21 +508,65 @@ knowledge:
504
508
  title: Add Collection
505
509
  description: Create a new knowledge collection
506
510
  cancel: Cancel
511
+ add_database:
512
+ title: Add Knowledge Database
513
+ description: Create a new self-service knowledge database
507
514
  auto_sync:
508
515
  title: Auto-synchronized
509
516
  description: Collections are automatically managed
510
517
  manual_management:
511
518
  description: Collections can be created and managed manually
519
+ pipeline: 'Pipeline: {name}'
512
520
  edit_namespace: Edit collection
513
521
  upload_documents: Upload documents
522
+ delete_namespace: Delete collection
523
+ delete_database: Delete database
524
+ delete:
525
+ confirm_label: Type {name} to confirm
526
+ database:
527
+ title: Delete knowledge database
528
+ warning: This permanently deletes the database {name}, all its collections,
529
+ and its {count} documents. This cannot be undone.
530
+ namespace:
531
+ title: Delete collection
532
+ warning: This permanently deletes the collection {name} and its {count} documents.
533
+ This cannot be undone.
534
+ actions:
535
+ delete: Delete
536
+ scheduled:
537
+ summary: Deletion started
538
+ detail: The deletion runs in the background and may take a moment.
539
+ error:
540
+ summary: Deletion failed
541
+ detail: The deletion could not be started. Please try again.
514
542
  form:
515
543
  create:
516
544
  title: Create Collection
545
+ create_error: Failed to create the collection. Please try again.
546
+ create_database:
547
+ title: Create Knowledge Database
548
+ success: Knowledge database created
549
+ error: Failed to create the knowledge database
550
+ no_ingestors: No ingestion pipeline is available. Make sure at least one pipeline
551
+ is running.
552
+ steps:
553
+ basic_info: Basic Info
517
554
  edit:
518
555
  title: Edit Collection
519
556
  database:
520
557
  label: Knowledge Database
521
558
  placeholder: Knowledge Database Name
559
+ database_name:
560
+ label: Database Name
561
+ placeholder: myknowledgebase
562
+ help: Only lowercase letters and digits are allowed, starting with a letter,
563
+ 3 to 63 characters. The name cannot be changed later.
564
+ validation_error: The database name must start with a lowercase letter and contain
565
+ only lowercase letters and digits, between 3 and 63 characters
566
+ ingestor:
567
+ label: Ingestion Pipeline
568
+ placeholder: Select an ingestion pipeline
569
+ help: The pipeline that processes documents uploaded to this database.
522
570
  folder_name:
523
571
  label: Collection Name
524
572
  placeholder: my-collection
@@ -654,6 +702,8 @@ role:
654
702
  capability_locked: Granted by a broader rule — remove that rule to change this.
655
703
  capability_readonly: No single rule grants this on its own — use a preset or a broader
656
704
  rule.
705
+ capability_also_cleared: 'Unticking also clears: {rules}'
706
+ capability_also_granted: 'Ticking also grants: {rules}'
657
707
  pattern_help_intro: 'Patterns use wildcards to match agents:'
658
708
  pattern_help_all: All agents
659
709
  pattern_help_wildcard: All instances of MyAgent
@@ -812,8 +862,12 @@ lib:
812
862
  label: Database
813
863
  namespaces:
814
864
  label: Namespaces
815
- placeholder: Select namespaces (empty = all)
816
- help: Leave empty to search all namespaces
865
+ placeholder: Select at least one namespace
866
+ help: Only the selected namespaces are searched
867
+ allNamespaces:
868
+ label: Search all namespaces
869
+ help: Every namespace of this database is searched, including ones added later
870
+ ({count} today).
817
871
  allowedFilterFields:
818
872
  label: Allowed Filter Fields
819
873
  placeholder: Add a metadata key and press Enter
@@ -210,6 +210,8 @@ event:
210
210
  no_filters: Aucun filtre supplémentaire
211
211
  rag_stop:
212
212
  failure_reason:
213
+ condensation_empty: La question n'a pas pu être condensée en une formulation
214
+ exploitable — cette exécution a été arrêtée avant la récupération.
213
215
  context_insufficient: Le contexte récupéré était insuffisant — la réponse est
214
216
  une solution de repli et n'est pas ancrée dans vos sources de connaissances.
215
217
  expert_declined: L'expert humain n'a pas pu fournir de réponse — cette exécution
@@ -218,6 +220,8 @@ event:
218
220
  produit de réponse fondée.
219
221
  few_shot_rejected: La requête ne correspondait à aucun motif connu, la réponse
220
222
  a donc été produite sans récupération.
223
+ input_too_large: Le message ou le fichier joint dépassait la fenêtre de contexte
224
+ du modèle, cette exécution a donc été arrêtée avant l'appel au modèle.
221
225
  limitChatHistory:
222
226
  summary: Historique de chat limité à {count} messages
223
227
  assistant: Assistant
@@ -453,7 +457,7 @@ document:
453
457
  deleting: Suppression en cours
454
458
  button: Supprimer
455
459
  button_selected: Supprimer la sélection
456
- confirmMessage: Voulez-vous vraiment supprimer ce document ? Il sera définitivement
460
+ confirmMessage: Voulez-vous vraiment supprimer « {title} » ? Il sera définitivement
457
461
  retiré de la base de connaissances. Cette action est irréversible.
458
462
  confirmMessageBatch: Voulez-vous vraiment supprimer {count} document(s) ? Ils
459
463
  seront définitivement retirés de la base de connaissances. Cette action est
@@ -511,21 +515,66 @@ knowledge:
511
515
  title: Ajouter une collection
512
516
  description: Créer une nouvelle collection de connaissances
513
517
  cancel: Annuler
518
+ add_database:
519
+ title: Ajouter une base de connaissances
520
+ description: Créer une nouvelle base de connaissances en libre-service
514
521
  auto_sync:
515
522
  title: Synchronisé automatiquement
516
523
  description: Les collections sont gérées automatiquement
517
524
  manual_management:
518
525
  description: Les collections peuvent être créées et gérées manuellement
526
+ pipeline: 'Pipeline : {name}'
519
527
  edit_namespace: Modifier la collection
520
528
  upload_documents: Télécharger des documents
529
+ delete_namespace: Supprimer la collection
530
+ delete_database: Supprimer la base de données
531
+ delete:
532
+ confirm_label: Saisissez {name} pour confirmer
533
+ database:
534
+ title: Supprimer la base de connaissances
535
+ warning: Cette action supprime définitivement la base de données {name}, toutes
536
+ ses collections et ses {count} documents. Cette action est irréversible.
537
+ namespace:
538
+ title: Supprimer la collection
539
+ warning: Cette action supprime définitivement la collection {name} et ses {count}
540
+ documents. Cette action est irréversible.
541
+ actions:
542
+ delete: Supprimer
543
+ scheduled:
544
+ summary: Suppression lancée
545
+ detail: La suppression s’exécute en arrière-plan et peut prendre un moment.
546
+ error:
547
+ summary: Échec de la suppression
548
+ detail: La suppression n’a pas pu être lancée. Veuillez réessayer.
521
549
  form:
522
550
  create:
523
551
  title: Créer une collection
552
+ create_error: Échec de la création de la collection. Veuillez réessayer.
553
+ create_database:
554
+ title: Créer une base de connaissances
555
+ success: Base de connaissances créée
556
+ error: La base de connaissances n'a pas pu être créée
557
+ no_ingestors: Aucun pipeline d'ingestion disponible. Assurez-vous qu'au moins
558
+ un pipeline est en cours d'exécution.
559
+ steps:
560
+ basic_info: Informations de base
524
561
  edit:
525
562
  title: Modifier la collection
526
563
  database:
527
564
  label: Base de connaissances
528
565
  placeholder: Nom de la base de connaissances
566
+ database_name:
567
+ label: Nom de la base de données
568
+ placeholder: mabasedeconnaissances
569
+ help: Seules les lettres minuscules et les chiffres sont autorisés, en commençant
570
+ par une lettre, de 3 à 63 caractères. Le nom ne peut pas être modifié ultérieurement.
571
+ validation_error: Le nom de la base de données doit commencer par une lettre
572
+ minuscule et ne contenir que des lettres minuscules et des chiffres, entre
573
+ 3 et 63 caractères
574
+ ingestor:
575
+ label: Pipeline d'ingestion
576
+ placeholder: Sélectionner un pipeline d'ingestion
577
+ help: Le pipeline qui traite les documents téléversés dans cette base de données.
529
578
  folder_name:
530
579
  label: Nom de la collection
531
580
  placeholder: ma-collection
@@ -665,6 +714,8 @@ role:
665
714
  changer ceci.
666
715
  capability_readonly: Aucune règle unique ne l'accorde — utilisez un modèle ou une
667
716
  règle plus large.
717
+ capability_also_cleared: 'Décocher supprime également : {rules}'
718
+ capability_also_granted: 'Cocher accorde également : {rules}'
668
719
  pattern_help_intro: 'Les modèles utilisent des jokers pour les agents :'
669
720
  pattern_help_all: Tous les agents
670
721
  pattern_help_wildcard: Toutes les instances de MyAgent
@@ -826,8 +877,12 @@ lib:
826
877
  label: Base de données
827
878
  namespaces:
828
879
  label: Espaces de noms
829
- placeholder: Sélectionner les espaces de noms (vide = tous)
830
- help: Laisser vide pour rechercher tous les espaces de noms
880
+ placeholder: Sélectionner au moins un espace de noms
881
+ help: Seuls les espaces de noms sélectionnés sont recherchés
882
+ allNamespaces:
883
+ label: Rechercher dans tous les espaces de noms
884
+ help: Chaque espace de noms de cette base est recherché, y compris ceux ajoutés
885
+ plus tard ({count} aujourd'hui).
831
886
  allowedFilterFields:
832
887
  label: Champs de filtre autorisés
833
888
  placeholder: Saisir une clé de métadonnées puis appuyer sur Entrée
@@ -210,6 +210,8 @@ event:
210
210
  no_filters: Nessun filtro aggiuntivo
211
211
  rag_stop:
212
212
  failure_reason:
213
+ condensation_empty: Non è stato possibile condensare la domanda in una forma
214
+ ricercabile — questa esecuzione è stata interrotta prima del recupero.
213
215
  context_insufficient: Il contesto recuperato era insufficiente — la risposta
214
216
  è un ripiego e non è ancorata alle vostre fonti di conoscenza.
215
217
  expert_declined: L'esperto umano non ha potuto fornire una risposta — questa
@@ -218,6 +220,9 @@ event:
218
220
  non ha prodotto una risposta fondata.
219
221
  few_shot_rejected: La richiesta non corrispondeva a nessun pattern noto, quindi
220
222
  la risposta è stata prodotta senza recupero.
223
+ input_too_large: Il messaggio o il file allegato superava la finestra di contesto
224
+ del modello, quindi questa esecuzione è stata interrotta prima di chiamare
225
+ il modello.
221
226
  limitChatHistory:
222
227
  summary: Cronologia chat limitata a {count} messaggi
223
228
  assistant: Assistente
@@ -452,7 +457,7 @@ document:
452
457
  deleting: Eliminazione in corso
453
458
  button: Elimina
454
459
  button_selected: Elimina selezionati
455
- confirmMessage: Vuoi davvero eliminare questo documento? Verrà rimosso definitivamente
460
+ confirmMessage: Vuoi davvero eliminare "{title}"? Verrà rimosso definitivamente
456
461
  dalla base di conoscenza. Questa azione non può essere annullata.
457
462
  confirmMessageBatch: Vuoi davvero eliminare {count} documento/i? Verranno rimossi
458
463
  definitivamente dalla base di conoscenza. Questa azione non può essere annullata.
@@ -509,21 +514,67 @@ knowledge:
509
514
  title: Aggiungi collezione
510
515
  description: Crea una nuova collezione di conoscenza
511
516
  cancel: Annulla
517
+ add_database:
518
+ title: Aggiungi database di conoscenza
519
+ description: Crea un nuovo database di conoscenza self-service
512
520
  auto_sync:
513
521
  title: Sincronizzato automaticamente
514
522
  description: Le collezioni sono gestite automaticamente
515
523
  manual_management:
516
524
  description: Le collezioni possono essere create e gestite manualmente
525
+ pipeline: 'Pipeline: {name}'
517
526
  edit_namespace: Modifica collezione
518
527
  upload_documents: Carica documenti
528
+ delete_namespace: Elimina collezione
529
+ delete_database: Elimina database
530
+ delete:
531
+ confirm_label: Digita {name} per confermare
532
+ database:
533
+ title: Elimina database di conoscenza
534
+ warning: Questa operazione elimina definitivamente il database {name}, tutte
535
+ le sue collezioni e i suoi {count} documenti. L’operazione non può essere
536
+ annullata.
537
+ namespace:
538
+ title: Elimina collezione
539
+ warning: Questa operazione elimina definitivamente la collezione {name} e i
540
+ suoi {count} documenti. L’operazione non può essere annullata.
541
+ actions:
542
+ delete: Elimina
543
+ scheduled:
544
+ summary: Eliminazione avviata
545
+ detail: L’eliminazione viene eseguita in background e potrebbe richiedere un
546
+ momento.
547
+ error:
548
+ summary: Eliminazione non riuscita
549
+ detail: Impossibile avviare l’eliminazione. Riprova.
519
550
  form:
520
551
  create:
521
552
  title: Crea collezione
553
+ create_error: Creazione della collezione non riuscita. Riprova.
554
+ create_database:
555
+ title: Crea database di conoscenza
556
+ success: Base di conoscenza creata
557
+ error: Impossibile creare la base di conoscenza
558
+ no_ingestors: Nessuna pipeline di ingestione disponibile. Assicurati che almeno
559
+ una pipeline sia in esecuzione.
560
+ steps:
561
+ basic_info: Informazioni di base
522
562
  edit:
523
563
  title: Modifica collezione
524
564
  database:
525
565
  label: Database di conoscenza
526
566
  placeholder: Nome del database di conoscenza
567
+ database_name:
568
+ label: Nome del database
569
+ placeholder: ilmiodatabase
570
+ help: Sono consentite solo lettere minuscole e cifre, iniziando con una lettera,
571
+ da 3 a 63 caratteri. Il nome non può essere modificato in seguito.
572
+ validation_error: Il nome del database deve iniziare con una lettera minuscola
573
+ e può contenere solo lettere minuscole e cifre, tra 3 e 63 caratteri
574
+ ingestor:
575
+ label: Pipeline di ingestione
576
+ placeholder: Seleziona una pipeline di ingestione
577
+ help: La pipeline che elabora i documenti caricati in questo database.
527
578
  folder_name:
528
579
  label: Nome collezione
529
580
  placeholder: mia-collezione
@@ -662,6 +713,8 @@ role:
662
713
  cambiare questo.
663
714
  capability_readonly: Nessuna singola regola lo concede — usa un modello o una regola
664
715
  più ampia.
716
+ capability_also_cleared: 'Deselezionando si rimuove anche: {rules}'
717
+ capability_also_granted: 'Selezionando si concede anche: {rules}'
665
718
  pattern_help_intro: 'I modelli usano caratteri jolly per gli agenti:'
666
719
  pattern_help_all: Tutti gli agenti
667
720
  pattern_help_wildcard: Tutte le istanze di MyAgent
@@ -822,8 +875,12 @@ lib:
822
875
  label: Database
823
876
  namespaces:
824
877
  label: Spazi dei nomi
825
- placeholder: Seleziona gli spazi dei nomi (vuoto = tutti)
826
- help: Lascia vuoto per cercare tutti gli spazi dei nomi
878
+ placeholder: Seleziona almeno uno spazio dei nomi
879
+ help: Vengono cercati solo gli spazi dei nomi selezionati
880
+ allNamespaces:
881
+ label: Cerca in tutti gli spazi dei nomi
882
+ help: Viene cercato ogni spazio dei nomi di questo database, inclusi quelli
883
+ aggiunti in seguito ({count} oggi).
827
884
  allowedFilterFields:
828
885
  label: Campi filtro consentiti
829
886
  placeholder: Inserisci una chiave di metadati e premi Invio
@@ -0,0 +1,31 @@
1
+ import { getSuite } from '@core/sdk/client'
2
+
3
+ const AGENT_SERVICE_PATH = '/service/agents'
4
+
5
+ // Hiding the app from the navigation is not access control: the management pages stay reachable by URL.
6
+ // Admission is decided by the same /suites answer the navigation is built from, so the page and the app
7
+ // list can never disagree about who is an agent admin.
8
+ export default defineNuxtRouteMiddleware(async (to) => {
9
+ const tenantId = to.params.tenant as string | undefined
10
+ if (!tenantId) return
11
+
12
+ const { $i18n } = useNuxtApp()
13
+
14
+ let isAgentAdmin = false
15
+ try {
16
+ const suite = await getSuite({ composable: '$fetch', path: { tenant_id: tenantId } })
17
+ isAgentAdmin = suite.services.some(service => service.path === AGENT_SERVICE_PATH)
18
+ }
19
+ catch (error) {
20
+ // Fail closed — an unreadable suite is not a licence to open the management surface.
21
+ console.error('agent-admin middleware: failed to read the suite', error)
22
+ }
23
+
24
+ if (!isAgentAdmin) {
25
+ return abortNavigation(createError({
26
+ statusCode: 403,
27
+ statusMessage: $i18n.t('http_error.code.403'),
28
+ fatal: true,
29
+ }))
30
+ }
31
+ })
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "license": "AGPL-3.0-or-later",
4
4
  "author": "bbv Software Services AG (https://www.bbv.ch)",
5
5
  "type": "module",
6
- "version": "0.320.0",
6
+ "version": "0.321.0",
7
7
  "description": "Swiss AI Hub - Admin & Management UI (Nuxt 3 layer)",
8
8
  "main": "./nuxt.config.ts",
9
9
  "repository": {
@@ -138,6 +138,9 @@ import { AgentConfigImportError } from '@core/composables/agent/useImportAgentIn
138
138
 
139
139
  import type { FullAgentInstanceDto, WorkflowGraph } from '@core/sdk/client'
140
140
 
141
+ // Nuxt collects middleware from every matched record, so this guards the whole /service/agents subtree.
142
+ definePageMeta({ middleware: 'agent-admin' })
143
+
141
144
  type AgentGroup = {
142
145
  agentClass: string
143
146
  name: string
@@ -82,20 +82,27 @@ const confirmDelete = () => {
82
82
  }
83
83
 
84
84
  const handleDelete = async () => {
85
+ const database = route.params.db as string
86
+ const namespace = route.params.namespace as string
87
+ const documentId = route.params.document_id as string
88
+
85
89
  try {
90
+ // Leave before deleting: the delete invalidates a key that is a prefix of this document's own query, so a
91
+ // still-mounted page refetches the document it just removed.
92
+ await router.push(tenantPath(`/service/knowledge/${database}/${namespace}`))
93
+
86
94
  await deleteDocument({
87
95
  tenantId: tenantId.value!,
88
- database: route.params.db as string,
89
- namespace: route.params.namespace as string,
90
- documentId: route.params.document_id as string,
96
+ database,
97
+ namespace,
98
+ documentId,
91
99
  })
92
- schedule([route.params.document_id as string])
100
+ schedule([documentId])
93
101
  toast.add({
94
102
  severity: 'success',
95
103
  summary: t('document.delete.success'),
96
104
  life: 3000,
97
105
  })
98
- router.push(tenantPath(`/service/knowledge/${route.params.db}/${route.params.namespace}`))
99
106
  }
100
107
  catch (error) {
101
108
  toast.add({