{% extends "base.html" %} {% block title %}Einstellungen · {{ workspace.name }}{% endblock %} {% block content %} {% set wbase = '/workspaces/' ~ workspace.id %}

Einstellungen

{% if saved %}

Gespeichert.

{% endif %} {% set labels = {'allow': 'erlaubt', 'require_approval': 'Freigabe nötig', 'deny': 'gesperrt'} %} {% if tab == 'general' %}

Name und Beschreibung

Erscheint in der Übersicht. Die KI sieht Name und Beschreibung als Kontext.

Team: {{ team.name }} (lässt sich nicht ändern)

Beispielfragen

Erscheinen in der Übersicht und in neuen Chats; ein Klick stellt die Frage. Zeigt neuen Mitgliedern, was hier geht. Höchstens 8.

Antworten

Aktuell {{ tool_rounds }}. Mehr Schritte erlauben größere Aufgaben in einer Antwort (viel lesen, mehrere Commits), kosten aber mehr. Ist das Limit erreicht, fasst die KI den Stand zusammen, und es geht mit „Weiterarbeiten“ weiter. Höchstens {{ rounds_limit }}; leer = Standard.

Freigaben

Entscheiden dürfen Admins und Freigeber dieses Workspace. Lockern lässt sich die zentrale Einstufung hier nicht.

Modell

{% if effective_model %}

Aktuell: {{ effective_model.label }} {{ effective_model.name }} {% if not workspace.model_id %}(Standard der Plattform){% endif %}

{% else %}

Es ist noch kein Modell eingerichtet. Das macht der Plattform-Admin unter „Modelle und Zugänge“.

{% endif %} {% if models %}
{% endif %}

Benachrichtigungen

Wartet ein Antrag auf Freigabe, bekommen die Admins und Freigeber des Workspace eine E-Mail (wenn im Profil eine Adresse steht). Zusätzlich kann eine Nachricht in einen Teams- oder Slack-Kanal gehen: dafür dort einen eingehenden Webhook anlegen und die Adresse hier eintragen. Sie wird verschlüsselt gespeichert.

{% if workspace.webhook %}

Webhook eingerichtet: {{ workspace.webhook_hint }}

{% endif %}
{% if workspace.webhook %}{% endif %}
{% if workspace.webhook %}
{% endif %}

Workspace löschen

Der Workspace kommt in den Papierkorb und ist sofort für alle unsichtbar. Workspace-Admins können ihn dort {{ trash_days }} Tage lang wiederherstellen; danach wird er endgültig gelöscht, mit Quellen, Chats, Freigabeanträgen, Uploads und Tool-Vorgaben.

Repositories und Datenbanken bleiben unberührt, ebenso Branches und Pull Requests, die schon erstellt wurden. Audit-Log und Verbrauch bleiben erhalten.{% if memory_enabled %} Beim endgültigen Löschen wird der Munin-Key entfernt; Projekt und Key müssen danach in Munin gelöscht oder widerrufen werden.{% endif %}

Zur Bestätigung den Namen „{{ workspace.name }}“ eingeben.

{% endif %} {% if tab == 'members' %}

Mitglieder

Mitglieder sehen alle Chats, Quellen und Dateien und können chatten. Admins verwalten Quellen, Mitglieder und Tools und entscheiden Freigaben.

{% for u, role in members %} {% endfor %}
NameNutzernameRolle
{{ u.display_name }}{% if u.id == p.user_id %} (du){% endif %} {{ u.username }}

Mitglied hinzufügen

Nur Mitglieder des Teams {{ team.name }} kommen in Frage. Freigeber entscheiden Freigabeanträge wie Admins, verwalten den Workspace aber nicht.

{% endif %} {% if tab == 'tools' %}

Tools

Was das Modell in diesem Workspace darf. Die Einstufung legt der Plattform-Admin fest; hier lässt sie sich nur verschärfen („wie global“ übernimmt die Einstufung unverändert). Aufrufe von Tools mit „Freigabe nötig“ warten auf die Entscheidung eines Workspace-Admins.

{% if saved_tool %}

Gespeichert: {{ saved_tool.definition.name }} ist jetzt {{ labels[saved_tool.verdict.decision] }} ({{ 'Vorgabe des Workspace' if saved_tool.override else 'wie global' }}).

{% endif %}
{% for t in tools %} {% endfor %}
ToolWirksamWorkspace-Vorgabe
{{ t.definition.name }}{% if not t.available %} {% if t.definition.kind.startswith('mcp:') %}(MCP-Server im Workspace nicht freigeschaltet){% elif t.definition.kind.startswith('hugin') %}(keine passenden Pakete aus Hugin){% else %}(keine passende Quelle){% endif %}{% endif %} {{ labels[t.verdict.decision] }} {{ t.verdict.reason }} {% if t.verdict.level == 'global_approver' %}

Freigabe durch globalen Approver

{% endif %} {% if t.verdict.four_eyes %}

Vier-Augen-Prinzip

{% endif %}
{% set rule_sources = sources|selectattr('kind', 'in', ['git'])|list %}

Regeln je Quelle

Verschärft ein Tool nur für ein bestimmtes Repository, z. B. commit_change auf dem Produktiv-Repository nur mit Freigabe. Datenbanken und andere MCP-Verbindungen haben eigene Tools (z. B. shop__query); dort gilt die Vorgabe oben unter „Tools“ direkt für diese Verbindung. Auch lesende Tools können so eine Freigabe verlangen; die KI erhält das Ergebnis dann erst nach der Entscheidung.

{% if not rule_sources %}

Es gibt noch keine Quelle, für die Regeln möglich sind.

{% else %} {% set source_names = {} %}{% for s in sources %}{% set _ = source_names.update({s.id: s.name}) %}{% endfor %} {% if source_rules %}
{% for r in source_rules %} {% endfor %}
QuelleToolRegel
{{ source_names.get(r.source_id, r.source_id) }} {{ r.tool_name }} {% if r.decision %}{{ labels[r.decision] }}{% endif %} {% if r.four_eyes %}Vier Augen{% endif %}
{% endif %}
{% endif %}
{% endif %} {% if tab == 'mcp' %}

Zentrale Server

Dienste, die der Plattform-Admin registriert hat. Erst freigeschaltet bieten sie ihre eingestuften Tools in diesem Workspace an. Für Munin das Token des Projekts eintragen; es bestimmt, in welches Gedächtnis geschrieben wird.

{% set waiting = mcp_servers|selectattr('1', 'none')|selectattr('0.active')|list %} {% if waiting %}

{{ waiting|length }} Server {{ 'ist' if waiting|length == 1 else 'sind' }} verfügbar, aber in diesem Workspace noch nicht freigeschaltet.

{% endif %} {% if mcp_servers %}
{% for s, link in mcp_servers %} {% endfor %}
ServerStatus
{{ s.label }} {{ s.name }}{% if s.role == 'memory' %} Gedächtnis{% endif %} {% if link and s.active %}freigeschaltet{% if link.secret_hint %} eigenes Token …{{ link.secret_hint }}{% endif %}{% elif link %}Server inaktiv{% else %}aus{% endif %} {% if link %}
{% elif s.active %}
{% endif %}
{% else %}

Es ist noch kein MCP-Server registriert.

{% endif %}
{% set own = connections|rejectattr('template_id')|list %} {% set dbs = connections|selectattr('template_id')|list %} {% macro connection_rows(items) %}
{% for s in items %} {% endfor %}
VerbindungStatus
{{ s.label }} {{ s.name }}__…

{% if s.template_id %}{{ s.config.user }}@{{ s.config.host }}{% if s.config.port %}:{{ s.config.port }}{% endif %}/{{ s.config.database }}{% else %}{{ s.url }}{% if s.secret_hint %} · Token …{{ s.secret_hint }}{% endif %}{% if s.header_names %} · Header: {{ s.header_names|join(', ') }}{% endif %}{% endif %}

{% if s.approval == 'pending' %}wartet auf Freigabe{% elif s.approval == 'rejected' %}abgelehnt{% elif not s.active %}inaktiv{% elif s.status == 'ok' %}ok{% elif s.status == 'error' %}Fehler{% else %}neu{% endif %} {% if s.status_message %}

{{ s.status_message }}

{% endif %}
{% if s.approval == 'approved' %}
{% endif %} Bearbeiten
{% endmacro %}

Eigene Verbindungen

MCP-Server hinzufügen

MCP-Server nur für diesen Workspace, mit eigenem Token und eigenen Headern. Nutzt die Plattform die Adresse schon, ist die Verbindung sofort aktiv; sonst wartet sie auf die Freigabe eines Plattform-Admins. Neue Tools sind gesperrt, bis sie eingestuft sind; gleiche Tools desselben Dienstes übernehmen die Einstufung.

{% if own %}{{ connection_rows(own) }}{% else %}

Noch keine eigene Verbindung.

{% endif %}

Datenbanken

{% if db_drivers %}Datenbank hinzufügen{% endif %}

Lesender Zugriff auf eine Datenbank. Den Treiber je Datenbanktyp stellt die Plattform; Host, Nutzer und Passwort trägst du hier ein. Die Zugangsdaten liegen verschlüsselt in Bifröst; das Modell sieht sie nie. Die Tools heißen nach dem Kurznamen, z. B. shop__query; Vorgaben dafür unter „Tools“ gelten nur für diese Datenbank.

{% if not db_drivers %}

Es gibt noch keinen Datenbank-Treiber; den richtet ein Plattform-Admin unter Administration → Datenbank-Treiber ein.

{% endif %} {% if dbs %}{{ connection_rows(dbs) }}{% elif db_drivers %}

Noch keine Datenbank.

{% endif %}
{% endif %} {% if tab == 'hugin' %}{% set h = hugin %}

Pakete aus Hugin

{% if h.host and h.access %}Aus .hugin.yaml Katalog durchsuchen{% endif %}

Hugin ist das Register für geprüfte KI-Erweiterungen. Regeln gelten in jedem Chat dieses Workspace, Skills lädt die KI bei Bedarf, Befehle ruft man im Chat mit /name auf. Neue Versionen kommen erst, wenn du abgleichst und übernimmst; Pflichtpakete eures Tenants kommen immer mit. Inhalte aus Hugin verleihen keine Rechte.

{% if not h.host %}

Hugin ist auf dieser Plattform noch nicht eingerichtet; den Host trägt ein Plattform-Admin unter Administration → Hugin ein.

{% else %}

Zugang

Integrations-Key (hi_…) eures Tenants in Hugin unter {{ h.host.url }}, dort unter Integrationen mit den Rollen Lesen und Ausliefern. Der Tenant bestimmt, welche Pakete und Pflichtpakete hier gelten. Der Key liegt verschlüsselt in Bifröst.

{% set a = h.access %} {% if a %}

Key …{{ a.hint }} {% if a.status == 'ok' %}ok{% elif a.status == 'error' %}Fehler{% else %}ungeprüft{% endif %} {% if a.tenant %}Tenant {{ a.tenant }}{% if a.key_name %}, Key „{{ a.key_name }}“{% endif %}{% endif %} {% if a.status_message %}{{ a.status_message }}{% endif %}

{% endif %}
{% endif %} {% if h.host and h.access %} {% if h.findings %}

Abgleich vom {{ h.access.synced.strftime('%d.%m.%Y %H:%M') }}:

    {% for line in h.findings %}
  • {{ line }}
  • {% endfor %}

Mit Abgleichen ansehen und übernehmen; automatisch übernommen wird nichts.

{% elif h.access.synced %}

Zuletzt abgeglichen {{ h.access.synced.strftime('%d.%m.%Y %H:%M') }}: alles aktuell.

{% endif %}

Gewählt

{% if h.subscriptions %}
{% for s in h.subscriptions %} {% endfor %}
PaketVersion
{{ s.package_id }}{{ s.spec }}
{% else %}

Noch kein Paket gewählt.

{% endif %}
{% endif %}

Festgeschrieben

{% if h.locks %}
{% for l in h.locks %} {% endfor %}
PaketArtVersionStand
{% if l.kind == 'command' %}/{% endif %}{{ l.package_id }}{% if l.mandatory %} Pflicht{% endif %}{% if l.deprecated %} veraltet{% endif %} {% if l.description %}

{{ l.description }}

{% endif %}
{{ h.kind_names.get(l.kind, l.kind) }} {{ l.version }} {% if l.unsupported %}nicht angeboten

{{ l.unsupported }}

{% else %}aktiv{% endif %}

{{ l.locked.strftime('%d.%m.%Y %H:%M') }}

{% else %}

Noch nichts übernommen.

{% endif %}
{% endif %} {% endblock %}